| 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());
|
|
|