| Index: runtime/vm/code_observers.cc
 | 
| diff --git a/runtime/vm/code_observers.cc b/runtime/vm/code_observers.cc
 | 
| index f8bac19603bfad5ae901f958692b49e2b17b662d..ef84ceb779bc2f1c6410b7965f0f45603cd0d37e 100644
 | 
| --- a/runtime/vm/code_observers.cc
 | 
| +++ b/runtime/vm/code_observers.cc
 | 
| @@ -4,21 +4,10 @@
 | 
|  
 | 
|  #include "vm/code_observers.h"
 | 
|  
 | 
| -#include "vm/dart.h"
 | 
| -#include "vm/debuginfo.h"
 | 
| -#include "vm/flags.h"
 | 
| -#include "vm/isolate.h"
 | 
|  #include "vm/os.h"
 | 
| -#include "vm/vtune.h"
 | 
| -#include "vm/zone.h"
 | 
|  
 | 
|  namespace dart {
 | 
|  
 | 
| -DEFINE_FLAG(bool, generate_gdb_symbols, false,
 | 
| -    "Generate symbols of generated dart functions for debugging with GDB");
 | 
| -DEFINE_FLAG(bool, generate_perf_events_symbols, false,
 | 
| -    "Generate events symbols for profiling with perf");
 | 
| -
 | 
|  intptr_t CodeObservers::observers_length_ = 0;
 | 
|  CodeObserver** CodeObservers::observers_ = NULL;
 | 
|  
 | 
| @@ -56,120 +45,16 @@ bool CodeObservers::AreActive() {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -class PerfCodeObserver : public CodeObserver {
 | 
| - public:
 | 
| -  PerfCodeObserver() {
 | 
| -    Dart_FileOpenCallback file_open = Isolate::file_open_callback();
 | 
| -    if (file_open == NULL) {
 | 
| -      return;
 | 
| -    }
 | 
| -// TODO(7321): Move OS-specific code for perf profiling to the OS abstraction
 | 
| -#if defined(TARGET_OS_LINUX)
 | 
| -    const char* format = "/tmp/perf-%ld.map";
 | 
| -    intptr_t pid = getpid();
 | 
| -    intptr_t len = OS::SNPrint(NULL, 0, format, pid);
 | 
| -    char* filename = new char[len + 1];
 | 
| -    OS::SNPrint(filename, len + 1, format, pid);
 | 
| -    out_file_ = (*file_open)(filename);
 | 
| -#endif
 | 
| -  }
 | 
| -
 | 
| -  // Not currently being called
 | 
| -  ~PerfCodeObserver() {
 | 
| -    Dart_FileCloseCallback file_close = Isolate::file_close_callback();
 | 
| -    if (file_close == NULL) {
 | 
| -      return;
 | 
| -    }
 | 
| -    ASSERT(out_file_ != NULL);
 | 
| -    (*file_close)(out_file_);
 | 
| -  }
 | 
| -
 | 
| -  virtual bool IsActive() const {
 | 
| -    return FLAG_generate_perf_events_symbols;
 | 
| -  }
 | 
| -
 | 
| -  virtual void Notify(const char* name,
 | 
| -                      uword base,
 | 
| -                      uword prologue_offset,
 | 
| -                      uword size,
 | 
| -                      bool optimized) {
 | 
| -    Dart_FileWriteCallback file_write = Isolate::file_write_callback();
 | 
| -    ASSERT(file_write != NULL);
 | 
| -    const char* format = "%"Px" %"Px" %s%s\n";
 | 
| -    const char* marker = optimized ? "*" : "";
 | 
| -    intptr_t len = OS::SNPrint(NULL, 0, format, base, size, marker, name);
 | 
| -    char* buffer = Isolate::Current()->current_zone()->Alloc<char>(len + 1);
 | 
| -    OS::SNPrint(buffer, len + 1, format, base, size, marker, name);
 | 
| -    ASSERT(out_file_ != NULL);
 | 
| -    (*file_write)(buffer, len, out_file_);
 | 
| -  }
 | 
| -
 | 
| - private:
 | 
| -  void* out_file_;
 | 
| -};
 | 
| -
 | 
| -
 | 
| -class PprofCodeObserver : public CodeObserver {
 | 
| - public:
 | 
| -  virtual bool IsActive() const {
 | 
| -    return Dart::pprof_symbol_generator() != NULL;
 | 
| -  }
 | 
| -
 | 
| -  virtual void Notify(const char* name,
 | 
| -                      uword base,
 | 
| -                      uword prologue_offset,
 | 
| -                      uword size,
 | 
| -                      bool optimized) {
 | 
| -    DebugInfo* pprof_symbol_generator = Dart::pprof_symbol_generator();
 | 
| -    ASSERT(pprof_symbol_generator != NULL);
 | 
| -    pprof_symbol_generator->AddCode(base, size);
 | 
| -    pprof_symbol_generator->AddCodeRegion(name, base, size);
 | 
| -  }
 | 
| -};
 | 
| -
 | 
| -
 | 
| -class GdbCodeObserver : public CodeObserver {
 | 
| - public:
 | 
| -  virtual bool IsActive() const {
 | 
| -    return FLAG_generate_gdb_symbols;
 | 
| -  }
 | 
| -
 | 
| -  virtual void Notify(const char* name,
 | 
| -                      uword base,
 | 
| -                      uword prologue_offset,
 | 
| -                      uword size,
 | 
| -                      bool optimized) {
 | 
| -    if (prologue_offset > 0) {
 | 
| -      // In order to ensure that gdb sees the first instruction of a function
 | 
| -      // as the prologue sequence we register two symbols for the cases when
 | 
| -      // the prologue sequence is not the first instruction:
 | 
| -      // <name>_entry is used for code preceding the prologue sequence.
 | 
| -      // <name> for rest of the code (first instruction is prologue sequence).
 | 
| -      const char* kFormat = "%s_%s";
 | 
| -      intptr_t len = OS::SNPrint(NULL, 0, kFormat, name, "entry");
 | 
| -      char* pname = Isolate::Current()->current_zone()->Alloc<char>(len + 1);
 | 
| -      OS::SNPrint(pname, (len + 1), kFormat, name, "entry");
 | 
| -      DebugInfo::RegisterSection(pname, base, size);
 | 
| -      DebugInfo::RegisterSection(name,
 | 
| -                                 (base + prologue_offset),
 | 
| -                                 (size - prologue_offset));
 | 
| -    } else {
 | 
| -      DebugInfo::RegisterSection(name, base, size);
 | 
| -    }
 | 
| +void CodeObservers::DeleteAll() {
 | 
| +  for (intptr_t i = 0; i < observers_length_; i++) {
 | 
| +    delete observers_[i];
 | 
|    }
 | 
| -};
 | 
| +  delete[] observers_;
 | 
| +}
 | 
|  
 | 
|  
 | 
|  void CodeObservers::InitOnce() {
 | 
| -// TODO(7321): Move flag registration to the OS abstraction
 | 
| -  if (FLAG_generate_perf_events_symbols) {
 | 
| -    Register(new PerfCodeObserver);
 | 
| -  }
 | 
| -  Register(new PprofCodeObserver);
 | 
| -  Register(new GdbCodeObserver);
 | 
| -#if defined(DART_VTUNE_SUPPORT)
 | 
| -  Register(new VTuneCodeObserver);
 | 
| -#endif
 | 
| +  OS::RegisterCodeObservers();
 | 
|  }
 | 
|  
 | 
|  
 | 
| 
 |