OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_GDB_JIT_H_ | 5 #ifndef V8_GDB_JIT_H_ |
6 #define V8_GDB_JIT_H_ | 6 #define V8_GDB_JIT_H_ |
7 | 7 |
| 8 #include "src/allocation.h" |
| 9 |
| 10 // |
| 11 // Basic implementation of GDB JIT Interface client. |
| 12 // GBD JIT Interface is supported in GDB 7.0 and above. |
| 13 // Currently on x64 and ia32 architectures and Linux OS are supported. |
| 14 // |
| 15 |
| 16 #ifdef ENABLE_GDB_JIT_INTERFACE |
8 #include "src/v8.h" | 17 #include "src/v8.h" |
9 | 18 |
10 // | 19 #include "src/factory.h" |
11 // GDB has two ways of interacting with JIT code. With the "JIT compilation | |
12 // interface", V8 can tell GDB when it emits JIT code. Unfortunately to do so, | |
13 // it has to create platform-native object files, possibly with platform-native | |
14 // debugging information. Currently only ELF and Mach-O are supported, which | |
15 // limits this interface to Linux and Mac OS. This JIT compilation interface | |
16 // was introduced in GDB 7.0. V8 support can be enabled with the --gdbjit flag. | |
17 // | |
18 // The other way that GDB can know about V8 code is via the "custom JIT reader" | |
19 // interface, in which a GDB extension parses V8's private data to determine the | |
20 // function, file, and line of a JIT frame, and how to unwind those frames. | |
21 // This interface was introduced in GDB 7.6. This interface still relies on V8 | |
22 // to register its code via the JIT compilation interface, but doesn't require | |
23 // that V8 create ELF images. Support will be added for this interface in the | |
24 // future. | |
25 // | |
26 | 20 |
27 namespace v8 { | 21 namespace v8 { |
28 namespace internal { | 22 namespace internal { |
29 namespace GDBJITInterface { | 23 |
30 #ifdef ENABLE_GDB_JIT_INTERFACE | 24 class CompilationInfo; |
31 // JitCodeEventHandler that creates ELF/Mach-O objects and registers them with | 25 |
32 // GDB. | 26 class GDBJITInterface: public AllStatic { |
33 void EventHandler(const v8::JitCodeEvent* event); | 27 public: |
| 28 enum CodeTag { NON_FUNCTION, FUNCTION }; |
| 29 |
| 30 // Main entry point into GDB JIT realized as a JitCodeEventHandler. |
| 31 static void EventHandler(const v8::JitCodeEvent* event); |
| 32 |
| 33 static void AddCode(Handle<Name> name, |
| 34 Handle<Script> script, |
| 35 Handle<Code> code, |
| 36 CompilationInfo* info); |
| 37 |
| 38 static void RemoveCodeRange(Address start, Address end); |
| 39 |
| 40 private: |
| 41 static void AddCode(const char* name, Code* code, CodeTag tag, Script* script, |
| 42 CompilationInfo* info); |
| 43 |
| 44 static void RemoveCode(Code* code); |
| 45 }; |
| 46 |
| 47 #define GDBJIT(action) GDBJITInterface::action |
| 48 |
| 49 } } // namespace v8::internal |
| 50 #else |
| 51 #define GDBJIT(action) ((void) 0) |
34 #endif | 52 #endif |
35 } // namespace GDBJITInterface | |
36 } // namespace internal | |
37 } // namespace v8 | |
38 | 53 |
39 #endif | 54 #endif |
OLD | NEW |