Index: src/gdb-jit.cc |
diff --git a/src/gdb-jit.cc b/src/gdb-jit.cc |
index dee115cce1b2109a565007de2bb7c16402d8ccec..74db807fb35b1072fc2363ecfb5147e1869f547b 100644 |
--- a/src/gdb-jit.cc |
+++ b/src/gdb-jit.cc |
@@ -217,7 +217,7 @@ class DebugSectionBase : public ZoneObject { |
struct MachOSectionHeader { |
char sectname[16]; |
char segname[16]; |
-#if defined(V8_TARGET_ARCH_IA32) |
+#if V8_TARGET_ARCH_IA32 |
uint32_t addr; |
uint32_t size; |
#else |
@@ -500,10 +500,10 @@ void ELFSection::PopulateHeader(Writer::Slot<ELFSection::Header> header, |
#if defined(__MACH_O) |
class MachO BASE_EMBEDDED { |
public: |
- MachO() : sections_(6) { } |
+ explicit MachO(Zone* zone) : zone_(zone), sections_(6, zone) { } |
uint32_t AddSection(MachOSection* section) { |
- sections_.Add(section); |
+ sections_.Add(section, zone_); |
return sections_.length() - 1; |
} |
@@ -525,7 +525,7 @@ class MachO BASE_EMBEDDED { |
uint32_t ncmds; |
uint32_t sizeofcmds; |
uint32_t flags; |
-#if defined(V8_TARGET_ARCH_X64) |
+#if V8_TARGET_ARCH_X64 |
uint32_t reserved; |
#endif |
}; |
@@ -534,7 +534,7 @@ class MachO BASE_EMBEDDED { |
uint32_t cmd; |
uint32_t cmdsize; |
char segname[16]; |
-#if defined(V8_TARGET_ARCH_IA32) |
+#if V8_TARGET_ARCH_IA32 |
uint32_t vmaddr; |
uint32_t vmsize; |
uint32_t fileoff; |
@@ -560,11 +560,11 @@ class MachO BASE_EMBEDDED { |
Writer::Slot<MachOHeader> WriteHeader(Writer* w) { |
ASSERT(w->position() == 0); |
Writer::Slot<MachOHeader> header = w->CreateSlotHere<MachOHeader>(); |
-#if defined(V8_TARGET_ARCH_IA32) |
+#if V8_TARGET_ARCH_IA32 |
header->magic = 0xFEEDFACEu; |
header->cputype = 7; // i386 |
header->cpusubtype = 3; // CPU_SUBTYPE_I386_ALL |
-#elif defined(V8_TARGET_ARCH_X64) |
+#elif V8_TARGET_ARCH_X64 |
header->magic = 0xFEEDFACFu; |
header->cputype = 7 | 0x01000000; // i386 | 64-bit ABI |
header->cpusubtype = 3; // CPU_SUBTYPE_I386_ALL |
@@ -585,7 +585,7 @@ class MachO BASE_EMBEDDED { |
uintptr_t code_size) { |
Writer::Slot<MachOSegmentCommand> cmd = |
w->CreateSlotHere<MachOSegmentCommand>(); |
-#if defined(V8_TARGET_ARCH_IA32) |
+#if V8_TARGET_ARCH_IA32 |
cmd->cmd = LC_SEGMENT_32; |
#else |
cmd->cmd = LC_SEGMENT_64; |
@@ -620,7 +620,7 @@ class MachO BASE_EMBEDDED { |
cmd->filesize = w->position() - (uintptr_t)cmd->fileoff; |
} |
- |
+ Zone* zone_; |
ZoneList<MachOSection*> sections_; |
}; |
#endif // defined(__MACH_O) |
@@ -629,7 +629,7 @@ class MachO BASE_EMBEDDED { |
#if defined(__ELF) |
class ELF BASE_EMBEDDED { |
public: |
- explicit ELF(Zone* zone) : sections_(6, zone) { |
+ explicit ELF(Zone* zone) : zone_(zone), sections_(6, zone) { |
sections_.Add(new(zone) ELFSection("", ELFSection::TYPE_NULL, 0), zone); |
sections_.Add(new(zone) ELFStringTable(".shstrtab"), zone); |
} |
@@ -644,8 +644,8 @@ class ELF BASE_EMBEDDED { |
return sections_[index]; |
} |
- uint32_t AddSection(ELFSection* section, Zone* zone) { |
- sections_.Add(section, zone); |
+ uint32_t AddSection(ELFSection* section) { |
+ sections_.Add(section, zone_); |
section->set_index(sections_.length() - 1); |
return sections_.length() - 1; |
} |
@@ -672,10 +672,10 @@ class ELF BASE_EMBEDDED { |
void WriteHeader(Writer* w) { |
ASSERT(w->position() == 0); |
Writer::Slot<ELFHeader> header = w->CreateSlotHere<ELFHeader>(); |
-#if defined(V8_TARGET_ARCH_IA32) || defined(V8_TARGET_ARCH_ARM) |
+#if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM |
const uint8_t ident[16] = |
{ 0x7f, 'E', 'L', 'F', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; |
-#elif defined(V8_TARGET_ARCH_X64) |
+#elif V8_TARGET_ARCH_X64 |
const uint8_t ident[16] = |
{ 0x7f, 'E', 'L', 'F', 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; |
#else |
@@ -683,14 +683,14 @@ class ELF BASE_EMBEDDED { |
#endif |
OS::MemCopy(header->ident, ident, 16); |
header->type = 1; |
-#if defined(V8_TARGET_ARCH_IA32) |
+#if V8_TARGET_ARCH_IA32 |
header->machine = 3; |
-#elif defined(V8_TARGET_ARCH_X64) |
+#elif V8_TARGET_ARCH_X64 |
// Processor identification value for x64 is 62 as defined in |
// System V ABI, AMD64 Supplement |
// http://www.x86-64.org/documentation/abi.pdf |
header->machine = 62; |
-#elif defined(V8_TARGET_ARCH_ARM) |
+#elif V8_TARGET_ARCH_ARM |
// Set to EM_ARM, defined as 40, in "ARM ELF File Format" at |
// infocenter.arm.com/help/topic/com.arm.doc.dui0101a/DUI0101A_Elf.pdf |
header->machine = 40; |
@@ -743,6 +743,7 @@ class ELF BASE_EMBEDDED { |
} |
} |
+ Zone* zone_; |
ZoneList<ELFSection*> sections_; |
}; |
@@ -784,7 +785,7 @@ class ELFSymbol BASE_EMBEDDED { |
Binding binding() const { |
return static_cast<Binding>(info >> 4); |
} |
-#if defined(V8_TARGET_ARCH_IA32) || defined(V8_TARGET_ARCH_ARM) |
+#if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM |
struct SerializedLayout { |
SerializedLayout(uint32_t name, |
uintptr_t value, |
@@ -807,7 +808,7 @@ class ELFSymbol BASE_EMBEDDED { |
uint8_t other; |
uint16_t section; |
}; |
-#elif defined(V8_TARGET_ARCH_X64) |
+#elif V8_TARGET_ARCH_X64 |
struct SerializedLayout { |
SerializedLayout(uint32_t name, |
uintptr_t value, |
@@ -921,7 +922,7 @@ class ELFSymbolTable : public ELFSection { |
class CodeDescription BASE_EMBEDDED { |
public: |
-#ifdef V8_TARGET_ARCH_X64 |
+#if V8_TARGET_ARCH_X64 |
enum StackState { |
POST_RBP_PUSH, |
POST_RBP_SET, |
@@ -984,7 +985,7 @@ class CodeDescription BASE_EMBEDDED { |
lineinfo_ != NULL; |
} |
-#ifdef V8_TARGET_ARCH_X64 |
+#if V8_TARGET_ARCH_X64 |
uintptr_t GetStackStateStartAddress(StackState state) const { |
ASSERT(state < STACK_STATE_MAX); |
return stack_state_start_addresses_[state]; |
@@ -1012,7 +1013,7 @@ class CodeDescription BASE_EMBEDDED { |
GDBJITLineInfo* lineinfo_; |
GDBJITInterface::CodeTag tag_; |
CompilationInfo* info_; |
-#ifdef V8_TARGET_ARCH_X64 |
+#if V8_TARGET_ARCH_X64 |
uintptr_t stack_state_start_addresses_[STACK_STATE_MAX]; |
#endif |
}; |
@@ -1026,8 +1027,8 @@ static void CreateSymbolsTable(CodeDescription* desc, |
ELFStringTable* strtab = new(zone) ELFStringTable(".strtab"); |
// Symbol table should be followed by the linked string table. |
- elf->AddSection(symtab, zone); |
- elf->AddSection(strtab, zone); |
+ elf->AddSection(symtab); |
+ elf->AddSection(strtab); |
symtab->Add(ELFSymbol("V8 Code", |
0, |
@@ -1106,13 +1107,13 @@ class DebugInfoSection : public DebugSection { |
w->Write<intptr_t>(desc_->CodeStart() + desc_->CodeSize()); |
Writer::Slot<uint32_t> fb_block_size = w->CreateSlotHere<uint32_t>(); |
uintptr_t fb_block_start = w->position(); |
-#if defined(V8_TARGET_ARCH_IA32) |
+#if V8_TARGET_ARCH_IA32 |
w->Write<uint8_t>(DW_OP_reg5); // The frame pointer's here on ia32 |
-#elif defined(V8_TARGET_ARCH_X64) |
+#elif V8_TARGET_ARCH_X64 |
w->Write<uint8_t>(DW_OP_reg6); // and here on x64. |
-#elif defined(V8_TARGET_ARCH_ARM) |
+#elif V8_TARGET_ARCH_ARM |
UNIMPLEMENTED(); |
-#elif defined(V8_TARGET_ARCH_MIPS) |
+#elif V8_TARGET_ARCH_MIPS |
UNIMPLEMENTED(); |
#else |
#error Unsupported target architecture. |
@@ -1563,7 +1564,7 @@ class DebugLineSection : public DebugSection { |
}; |
-#ifdef V8_TARGET_ARCH_X64 |
+#if V8_TARGET_ARCH_X64 |
class UnwindInfoSection : public DebugSection { |
public: |
@@ -1793,12 +1794,12 @@ static void CreateDWARFSections(CodeDescription* desc, |
Zone* zone, |
DebugObject* obj) { |
if (desc->IsLineInfoAvailable()) { |
- obj->AddSection(new(zone) DebugInfoSection(desc), zone); |
- obj->AddSection(new(zone) DebugAbbrevSection(desc), zone); |
- obj->AddSection(new(zone) DebugLineSection(desc), zone); |
+ obj->AddSection(new(zone) DebugInfoSection(desc)); |
+ obj->AddSection(new(zone) DebugAbbrevSection(desc)); |
+ obj->AddSection(new(zone) DebugLineSection(desc)); |
} |
-#ifdef V8_TARGET_ARCH_X64 |
- obj->AddSection(new(zone) UnwindInfoSection(desc), zone); |
+#if V8_TARGET_ARCH_X64 |
+ obj->AddSection(new(zone) UnwindInfoSection(desc)); |
#endif |
} |
@@ -1918,14 +1919,15 @@ static void UnregisterCodeEntry(JITCodeEntry* entry) { |
static JITCodeEntry* CreateELFObject(CodeDescription* desc, Isolate* isolate) { |
#ifdef __MACH_O |
- MachO mach_o; |
+ Zone zone(isolate); |
+ MachO mach_o(&zone); |
Writer w(&mach_o); |
- mach_o.AddSection(new MachOTextSection(kCodeAlignment, |
- desc->CodeStart(), |
- desc->CodeSize())); |
+ mach_o.AddSection(new(&zone) MachOTextSection(kCodeAlignment, |
+ desc->CodeStart(), |
+ desc->CodeSize())); |
- CreateDWARFSections(desc, &mach_o); |
+ CreateDWARFSections(desc, &zone, &mach_o); |
mach_o.Write(&w, desc->CodeStart(), desc->CodeSize()); |
#else |
@@ -1941,8 +1943,7 @@ static JITCodeEntry* CreateELFObject(CodeDescription* desc, Isolate* isolate) { |
desc->CodeStart(), |
0, |
desc->CodeSize(), |
- ELFSection::FLAG_ALLOC | ELFSection::FLAG_EXEC), |
- &zone); |
+ ELFSection::FLAG_ALLOC | ELFSection::FLAG_EXEC)); |
CreateSymbolsTable(desc, &zone, &elf, text_section_index); |
@@ -2014,8 +2015,9 @@ void GDBJITInterface::AddCode(Handle<Name> name, |
} |
} |
+ |
static void AddUnwindInfo(CodeDescription* desc) { |
-#ifdef V8_TARGET_ARCH_X64 |
+#if V8_TARGET_ARCH_X64 |
if (desc->tag() == GDBJITInterface::FUNCTION) { |
// To avoid propagating unwinding information through |
// compilation pipeline we use an approximation. |
@@ -2165,6 +2167,24 @@ void GDBJITInterface::RemoveCode(Code* code) { |
} |
+void GDBJITInterface::RemoveCodeRange(Address start, Address end) { |
+ HashMap* entries = GetEntries(); |
+ Zone zone(Isolate::Current()); |
+ ZoneList<Code*> dead_codes(1, &zone); |
+ |
+ for (HashMap::Entry* e = entries->Start(); e != NULL; e = entries->Next(e)) { |
+ Code* code = reinterpret_cast<Code*>(e->key); |
+ if (code->address() >= start && code->address() < end) { |
+ dead_codes.Add(code, &zone); |
+ } |
+ } |
+ |
+ for (int i = 0; i < dead_codes.length(); i++) { |
+ RemoveCode(dead_codes.at(i)); |
+ } |
+} |
+ |
+ |
void GDBJITInterface::RegisterDetailedLineInfo(Code* code, |
GDBJITLineInfo* line_info) { |
ScopedLock lock(mutex.Pointer()); |