OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" | 5 #include "vm/globals.h" |
6 #if defined(TARGET_OS_ANDROID) | 6 #if defined(TARGET_OS_ANDROID) |
7 | 7 |
8 #include "vm/os.h" | 8 #include "vm/os.h" |
9 | 9 |
10 #include <android/log.h> // NOLINT | 10 #include <android/log.h> // NOLINT |
(...skipping 17 matching lines...) Expand all Loading... |
28 | 28 |
29 | 29 |
30 namespace dart { | 30 namespace dart { |
31 | 31 |
32 // Android CodeObservers. | 32 // Android CodeObservers. |
33 | 33 |
34 DEFINE_FLAG(bool, generate_gdb_symbols, false, | 34 DEFINE_FLAG(bool, generate_gdb_symbols, false, |
35 "Generate symbols of generated dart functions for debugging with GDB"); | 35 "Generate symbols of generated dart functions for debugging with GDB"); |
36 DEFINE_FLAG(bool, generate_perf_events_symbols, false, | 36 DEFINE_FLAG(bool, generate_perf_events_symbols, false, |
37 "Generate events symbols for profiling with perf"); | 37 "Generate events symbols for profiling with perf"); |
38 DEFINE_FLAG(charp, generate_pprof_symbols, NULL, | 38 |
39 "Generate events symbols for profiling with pprof"); | |
40 | 39 |
41 class PerfCodeObserver : public CodeObserver { | 40 class PerfCodeObserver : public CodeObserver { |
42 public: | 41 public: |
43 PerfCodeObserver() { | 42 PerfCodeObserver() : out_file_(NULL) { |
44 Dart_FileOpenCallback file_open = Isolate::file_open_callback(); | 43 Dart_FileOpenCallback file_open = Isolate::file_open_callback(); |
45 if (file_open == NULL) { | 44 if (file_open == NULL) { |
46 return; | 45 return; |
47 } | 46 } |
48 const char* format = "/tmp/perf-%ld.map"; | 47 const char* format = "/tmp/perf-%ld.map"; |
49 intptr_t pid = getpid(); | 48 intptr_t pid = getpid(); |
50 intptr_t len = OS::SNPrint(NULL, 0, format, pid); | 49 intptr_t len = OS::SNPrint(NULL, 0, format, pid); |
51 char* filename = new char[len + 1]; | 50 char* filename = new char[len + 1]; |
52 OS::SNPrint(filename, len + 1, format, pid); | 51 OS::SNPrint(filename, len + 1, format, pid); |
53 out_file_ = (*file_open)(filename, true); | 52 out_file_ = (*file_open)(filename, true); |
54 } | 53 } |
55 | 54 |
56 ~PerfCodeObserver() { | 55 ~PerfCodeObserver() { |
57 Dart_FileCloseCallback file_close = Isolate::file_close_callback(); | 56 Dart_FileCloseCallback file_close = Isolate::file_close_callback(); |
58 if (file_close == NULL) { | 57 if ((file_close == NULL) || (out_file_ == NULL)) { |
59 return; | 58 return; |
60 } | 59 } |
61 ASSERT(out_file_ != NULL); | |
62 (*file_close)(out_file_); | 60 (*file_close)(out_file_); |
63 } | 61 } |
64 | 62 |
65 virtual bool IsActive() const { | 63 virtual bool IsActive() const { |
66 return FLAG_generate_perf_events_symbols; | 64 return FLAG_generate_perf_events_symbols && (out_file_ != NULL); |
67 } | 65 } |
68 | 66 |
69 virtual void Notify(const char* name, | 67 virtual void Notify(const char* name, |
70 uword base, | 68 uword base, |
71 uword prologue_offset, | 69 uword prologue_offset, |
72 uword size, | 70 uword size, |
73 bool optimized) { | 71 bool optimized) { |
74 Dart_FileWriteCallback file_write = Isolate::file_write_callback(); | 72 Dart_FileWriteCallback file_write = Isolate::file_write_callback(); |
75 ASSERT(file_write != NULL); | 73 if ((file_write == NULL) || (out_file_ == NULL)) { |
| 74 return; |
| 75 } |
76 const char* format = "%" Px " %" Px " %s%s\n"; | 76 const char* format = "%" Px " %" Px " %s%s\n"; |
77 const char* marker = optimized ? "*" : ""; | 77 const char* marker = optimized ? "*" : ""; |
78 intptr_t len = OS::SNPrint(NULL, 0, format, base, size, marker, name); | 78 intptr_t len = OS::SNPrint(NULL, 0, format, base, size, marker, name); |
79 char* buffer = Isolate::Current()->current_zone()->Alloc<char>(len + 1); | 79 char* buffer = Isolate::Current()->current_zone()->Alloc<char>(len + 1); |
80 OS::SNPrint(buffer, len + 1, format, base, size, marker, name); | 80 OS::SNPrint(buffer, len + 1, format, base, size, marker, name); |
81 ASSERT(out_file_ != NULL); | |
82 (*file_write)(buffer, len, out_file_); | 81 (*file_write)(buffer, len, out_file_); |
83 } | 82 } |
84 | 83 |
85 private: | 84 private: |
86 void* out_file_; | 85 void* out_file_; |
87 | 86 |
88 DISALLOW_COPY_AND_ASSIGN(PerfCodeObserver); | 87 DISALLOW_COPY_AND_ASSIGN(PerfCodeObserver); |
89 }; | 88 }; |
90 | 89 |
91 class PprofCodeObserver : public CodeObserver { | |
92 public: | |
93 PprofCodeObserver() { | |
94 pprof_symbol_generator_ = DebugInfo::NewGenerator(); | |
95 } | |
96 | |
97 ~PprofCodeObserver() { | |
98 Dart_FileOpenCallback file_open = Isolate::file_open_callback(); | |
99 if (file_open == NULL) { | |
100 return; | |
101 } | |
102 Dart_FileCloseCallback file_close = Isolate::file_close_callback(); | |
103 if (file_close == NULL) { | |
104 return; | |
105 } | |
106 Dart_FileWriteCallback file_write = Isolate::file_write_callback(); | |
107 if (file_write == NULL) { | |
108 return; | |
109 } | |
110 if (FLAG_generate_pprof_symbols == NULL) { | |
111 return; | |
112 } | |
113 const char* filename = FLAG_generate_pprof_symbols; | |
114 void* out_file = (*file_open)(filename, true); | |
115 ASSERT(out_file != NULL); | |
116 DebugInfo::ByteBuffer* debug_region = new DebugInfo::ByteBuffer(); | |
117 ASSERT(debug_region != NULL); | |
118 pprof_symbol_generator_->WriteToMemory(debug_region); | |
119 int buffer_size = debug_region->size(); | |
120 void* buffer = debug_region->data(); | |
121 delete debug_region; | |
122 if (buffer_size > 0) { | |
123 ASSERT(buffer != NULL); | |
124 (*file_write)(buffer, buffer_size, out_file); | |
125 } | |
126 (*file_close)(out_file); | |
127 DebugInfo::UnregisterAllSections(); | |
128 } | |
129 | |
130 virtual bool IsActive() const { | |
131 return FLAG_generate_pprof_symbols != NULL; | |
132 } | |
133 | |
134 virtual void Notify(const char* name, | |
135 uword base, | |
136 uword prologue_offset, | |
137 uword size, | |
138 bool optimized) { | |
139 ASSERT(pprof_symbol_generator_ != NULL); | |
140 pprof_symbol_generator_->AddCode(base, size); | |
141 pprof_symbol_generator_->AddCodeRegion(name, base, size); | |
142 } | |
143 | |
144 private: | |
145 DebugInfo* pprof_symbol_generator_; | |
146 | |
147 DISALLOW_COPY_AND_ASSIGN(PprofCodeObserver); | |
148 }; | |
149 | 90 |
150 class GdbCodeObserver : public CodeObserver { | 91 class GdbCodeObserver : public CodeObserver { |
151 public: | 92 public: |
152 GdbCodeObserver() { } | 93 GdbCodeObserver() { } |
153 | 94 |
154 virtual bool IsActive() const { | 95 virtual bool IsActive() const { |
155 return FLAG_generate_gdb_symbols; | 96 return FLAG_generate_gdb_symbols; |
156 } | 97 } |
157 | 98 |
158 virtual void Notify(const char* name, | 99 virtual void Notify(const char* name, |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 } | 384 } |
444 | 385 |
445 | 386 |
446 void OS::RegisterCodeObservers() { | 387 void OS::RegisterCodeObservers() { |
447 if (FLAG_generate_perf_events_symbols) { | 388 if (FLAG_generate_perf_events_symbols) { |
448 CodeObservers::Register(new PerfCodeObserver); | 389 CodeObservers::Register(new PerfCodeObserver); |
449 } | 390 } |
450 if (FLAG_generate_gdb_symbols) { | 391 if (FLAG_generate_gdb_symbols) { |
451 CodeObservers::Register(new GdbCodeObserver); | 392 CodeObservers::Register(new GdbCodeObserver); |
452 } | 393 } |
453 if (FLAG_generate_pprof_symbols != NULL) { | |
454 CodeObservers::Register(new PprofCodeObserver); | |
455 } | |
456 #if defined(DART_VTUNE_SUPPORT) | 394 #if defined(DART_VTUNE_SUPPORT) |
457 CodeObservers::Register(new VTuneCodeObserver); | 395 CodeObservers::Register(new VTuneCodeObserver); |
458 #endif | 396 #endif |
459 } | 397 } |
460 | 398 |
461 | 399 |
462 void OS::PrintErr(const char* format, ...) { | 400 void OS::PrintErr(const char* format, ...) { |
463 va_list args; | 401 va_list args; |
464 va_start(args, format); | 402 va_start(args, format); |
465 VFPrint(stderr, format, args); | 403 VFPrint(stderr, format, args); |
(...skipping 22 matching lines...) Expand all Loading... |
488 } | 426 } |
489 | 427 |
490 | 428 |
491 void OS::Exit(int code) { | 429 void OS::Exit(int code) { |
492 exit(code); | 430 exit(code); |
493 } | 431 } |
494 | 432 |
495 } // namespace dart | 433 } // namespace dart |
496 | 434 |
497 #endif // defined(TARGET_OS_ANDROID) | 435 #endif // defined(TARGET_OS_ANDROID) |
OLD | NEW |