| Index: runtime/vm/os_linux.cc
|
| ===================================================================
|
| --- runtime/vm/os_linux.cc (revision 38188)
|
| +++ runtime/vm/os_linux.cc (working copy)
|
| @@ -37,105 +37,13 @@
|
| "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");
|
| -DEFINE_FLAG(bool, ll_prof, false,
|
| - "Generate compiled code log file for processing with ll_prof.py.");
|
| -DEFINE_FLAG(charp, generate_pprof_symbols, NULL,
|
| - "Writes pprof events symbols to the provided file");
|
| DEFINE_FLAG(bool, generate_perf_jitdump, false,
|
| "Writes jitdump data for profiling with perf annotate");
|
|
|
| -class LowLevelProfileCodeObserver : public CodeObserver {
|
| - public:
|
| - LowLevelProfileCodeObserver() {
|
| - Dart_FileOpenCallback file_open = Isolate::file_open_callback();
|
| - if (file_open == NULL) {
|
| - return;
|
| - }
|
| - const char* filename = "v8.log.ll";
|
| - log_file_ = (*file_open)(filename, true);
|
| -#if defined(TARGET_ARCH_IA32)
|
| - const char arch[] = "ia32";
|
| -#elif defined(TARGET_ARCH_X64)
|
| - const char arch[] = "x64";
|
| -#elif defined(TARGET_ARCH_ARM)
|
| - const char arch[] = "arm";
|
| -#elif defined(TARGET_ARCH_ARM64)
|
| - const char arch[] = "arm64";
|
| -#elif defined(TARGET_ARCH_MIPS)
|
| - const char arch[] = "mips";
|
| -#else
|
| -#error Unknown architecture.
|
| -#endif
|
| - LowLevelLogWriteBytes(arch, sizeof(arch));
|
| - }
|
|
|
| - ~LowLevelProfileCodeObserver() {
|
| - Dart_FileCloseCallback file_close = Isolate::file_close_callback();
|
| - if (file_close == NULL) {
|
| - return;
|
| - }
|
| - ASSERT(log_file_ != NULL);
|
| - (*file_close)(log_file_);
|
| - }
|
| -
|
| - virtual bool IsActive() const {
|
| - return FLAG_ll_prof;
|
| - }
|
| -
|
| - struct LowLevelCodeCreateStruct {
|
| - static const char kTag = 'C';
|
| -
|
| - int32_t name_size;
|
| - uword code_address;
|
| - int32_t code_size;
|
| - };
|
| -
|
| - template <typename T>
|
| - void LowLevelLogWriteStruct(const T& s) {
|
| - char tag = T::kTag;
|
| - LowLevelLogWriteBytes(reinterpret_cast<const char*>(&tag), sizeof(tag));
|
| - LowLevelLogWriteBytes(reinterpret_cast<const char*>(&s), sizeof(s));
|
| - }
|
| -
|
| - void LowLevelLogWriteBytes(const char* bytes, int size) {
|
| - Dart_FileWriteCallback file_write = Isolate::file_write_callback();
|
| - ASSERT(file_write != NULL);
|
| - (file_write)(bytes, size, log_file_);
|
| - }
|
| -
|
| - virtual void Notify(const char* name,
|
| - uword base,
|
| - uword prologue_offset,
|
| - uword size,
|
| - bool optimized) {
|
| - const char* marker = optimized ? "*" : "";
|
| - char* name_buffer =
|
| - Isolate::Current()->current_zone()->PrintToString("%s%s", marker, name);
|
| - intptr_t len = strlen(name_buffer);
|
| -
|
| - LowLevelCodeCreateStruct event;
|
| - event.name_size = len;
|
| - event.code_address = base;
|
| - event.code_size = size;
|
| -
|
| - {
|
| - MutexLocker ml(CodeObservers::mutex());
|
| - LowLevelLogWriteStruct(event);
|
| - LowLevelLogWriteBytes(name_buffer, len);
|
| - LowLevelLogWriteBytes(reinterpret_cast<char*>(base), size);
|
| - }
|
| - }
|
| -
|
| - private:
|
| - void* log_file_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(LowLevelProfileCodeObserver);
|
| -};
|
| -
|
| -
|
| class PerfCodeObserver : public CodeObserver {
|
| public:
|
| - PerfCodeObserver() {
|
| + PerfCodeObserver() : out_file_(NULL) {
|
| Dart_FileOpenCallback file_open = Isolate::file_open_callback();
|
| if (file_open == NULL) {
|
| return;
|
| @@ -151,15 +59,14 @@
|
|
|
| ~PerfCodeObserver() {
|
| Dart_FileCloseCallback file_close = Isolate::file_close_callback();
|
| - if (file_close == NULL) {
|
| + if ((file_close == NULL) || (out_file_ == NULL)) {
|
| return;
|
| }
|
| - ASSERT(out_file_ != NULL);
|
| (*file_close)(out_file_);
|
| }
|
|
|
| virtual bool IsActive() const {
|
| - return FLAG_generate_perf_events_symbols;
|
| + return FLAG_generate_perf_events_symbols && (out_file_ != NULL);
|
| }
|
|
|
| virtual void Notify(const char* name,
|
| @@ -168,13 +75,14 @@
|
| uword size,
|
| bool optimized) {
|
| Dart_FileWriteCallback file_write = Isolate::file_write_callback();
|
| - ASSERT(file_write != NULL);
|
| + if ((file_write == NULL) || (out_file_ == NULL)) {
|
| + return;
|
| + }
|
| 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);
|
| {
|
| MutexLocker ml(CodeObservers::mutex());
|
| (*file_write)(buffer, len, out_file_);
|
| @@ -187,66 +95,7 @@
|
| DISALLOW_COPY_AND_ASSIGN(PerfCodeObserver);
|
| };
|
|
|
| -class PprofCodeObserver : public CodeObserver {
|
| - public:
|
| - PprofCodeObserver() {
|
| - pprof_symbol_generator_ = DebugInfo::NewGenerator();
|
| - }
|
|
|
| - ~PprofCodeObserver() {
|
| - Dart_FileOpenCallback file_open = Isolate::file_open_callback();
|
| - if (file_open == NULL) {
|
| - return;
|
| - }
|
| - Dart_FileCloseCallback file_close = Isolate::file_close_callback();
|
| - if (file_close == NULL) {
|
| - return;
|
| - }
|
| - Dart_FileWriteCallback file_write = Isolate::file_write_callback();
|
| - if (file_write == NULL) {
|
| - return;
|
| - }
|
| - if (FLAG_generate_pprof_symbols == NULL) {
|
| - return;
|
| - }
|
| - const char* filename = FLAG_generate_pprof_symbols;
|
| - void* out_file = (*file_open)(filename, true);
|
| - ASSERT(out_file != NULL);
|
| - DebugInfo::ByteBuffer* debug_region = new DebugInfo::ByteBuffer();
|
| - ASSERT(debug_region != NULL);
|
| - pprof_symbol_generator_->WriteToMemory(debug_region);
|
| - int buffer_size = debug_region->size();
|
| - void* buffer = debug_region->data();
|
| - if (buffer_size > 0) {
|
| - MutexLocker ml(CodeObservers::mutex());
|
| - ASSERT(buffer != NULL);
|
| - (*file_write)(buffer, buffer_size, out_file);
|
| - }
|
| - delete debug_region;
|
| - (*file_close)(out_file);
|
| - DebugInfo::UnregisterAllSections();
|
| - }
|
| -
|
| - virtual bool IsActive() const {
|
| - return FLAG_generate_pprof_symbols != NULL;
|
| - }
|
| -
|
| - virtual void Notify(const char* name,
|
| - uword base,
|
| - uword prologue_offset,
|
| - uword size,
|
| - bool optimized) {
|
| - ASSERT(pprof_symbol_generator_ != NULL);
|
| - pprof_symbol_generator_->AddCode(base, size);
|
| - pprof_symbol_generator_->AddCodeRegion(name, base, size);
|
| - }
|
| -
|
| - private:
|
| - DebugInfo* pprof_symbol_generator_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(PprofCodeObserver);
|
| -};
|
| -
|
| class GdbCodeObserver : public CodeObserver {
|
| public:
|
| GdbCodeObserver() { }
|
| @@ -736,18 +585,12 @@
|
|
|
|
|
| void OS::RegisterCodeObservers() {
|
| - if (FLAG_ll_prof) {
|
| - CodeObservers::Register(new LowLevelProfileCodeObserver);
|
| - }
|
| if (FLAG_generate_perf_events_symbols) {
|
| CodeObservers::Register(new PerfCodeObserver);
|
| }
|
| if (FLAG_generate_gdb_symbols) {
|
| CodeObservers::Register(new GdbCodeObserver);
|
| }
|
| - if (FLAG_generate_pprof_symbols != NULL) {
|
| - CodeObservers::Register(new PprofCodeObserver);
|
| - }
|
| if (FLAG_generate_perf_jitdump) {
|
| CodeObservers::Register(new JitdumpCodeObserver);
|
| }
|
|
|