diff options
Diffstat (limited to 'deps/v8/src/gdb-jit.cc')
-rw-r--r-- | deps/v8/src/gdb-jit.cc | 119 |
1 files changed, 69 insertions, 50 deletions
diff --git a/deps/v8/src/gdb-jit.cc b/deps/v8/src/gdb-jit.cc index 5717a96079..825d1e7c1c 100644 --- a/deps/v8/src/gdb-jit.cc +++ b/deps/v8/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 } @@ -1916,37 +1917,37 @@ static void UnregisterCodeEntry(JITCodeEntry* entry) { } -static JITCodeEntry* CreateELFObject(CodeDescription* desc, Zone* zone) { - ZoneScope zone_scope(zone, DELETE_ON_EXIT); +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 - ELF elf(zone); + Zone zone(isolate); + ELF elf(&zone); Writer w(&elf); int text_section_index = elf.AddSection( - new(zone) FullHeaderELFSection( + new(&zone) FullHeaderELFSection( ".text", ELFSection::TYPE_NOBITS, kCodeAlignment, 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); + CreateSymbolsTable(desc, &zone, &elf, text_section_index); - CreateDWARFSections(desc, zone, &elf); + CreateDWARFSections(desc, &zone, &elf); elf.Write(&w); #endif @@ -2015,7 +2016,7 @@ 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. @@ -2083,8 +2084,8 @@ void GDBJITInterface::AddCode(const char* name, } AddUnwindInfo(&code_desc); - Zone* zone = code->GetIsolate()->runtime_zone(); - JITCodeEntry* entry = CreateELFObject(&code_desc, zone); + Isolate* isolate = code->GetIsolate(); + JITCodeEntry* entry = CreateELFObject(&code_desc, isolate); ASSERT(!IsLineInfoTagged(entry)); delete lineinfo; @@ -2165,6 +2166,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()); |