Index: src/gdb-jit.cc |
diff --git a/src/gdb-jit.cc b/src/gdb-jit.cc |
index d3cd44707c59150aaf261e519abb792b43d64f54..74845b4822c659b1c4b810fc7862df1283f1fe7b 100644 |
--- a/src/gdb-jit.cc |
+++ b/src/gdb-jit.cc |
@@ -31,11 +31,13 @@ |
#include "bootstrapper.h" |
#include "compiler.h" |
+#include "frames.h" |
+#include "frames-inl.h" |
#include "global-handles.h" |
#include "messages.h" |
-#include "platform.h" |
#include "natives.h" |
-#include "scopeinfo.h" |
+#include "platform.h" |
+#include "scopes.h" |
namespace v8 { |
namespace internal { |
@@ -194,7 +196,7 @@ class DebugSectionBase : public ZoneObject { |
virtual void WriteBody(Writer::Slot<THeader> header, Writer* writer) { |
uintptr_t start = writer->position(); |
- if (WriteBody(writer)) { |
+ if (WriteBodyInternal(writer)) { |
uintptr_t end = writer->position(); |
header->offset = start; |
#if defined(__MACH_O) |
@@ -204,7 +206,7 @@ class DebugSectionBase : public ZoneObject { |
} |
} |
- virtual bool WriteBody(Writer* writer) { |
+ virtual bool WriteBodyInternal(Writer* writer) { |
return false; |
} |
@@ -340,14 +342,14 @@ class ELFSection : public DebugSectionBase<ELFSectionHeader> { |
virtual void WriteBody(Writer::Slot<Header> header, Writer* w) { |
uintptr_t start = w->position(); |
- if (WriteBody(w)) { |
+ if (WriteBodyInternal(w)) { |
uintptr_t end = w->position(); |
header->offset = start; |
header->size = end - start; |
} |
} |
- virtual bool WriteBody(Writer* w) { |
+ virtual bool WriteBodyInternal(Writer* w) { |
return false; |
} |
@@ -627,9 +629,9 @@ class MachO BASE_EMBEDDED { |
#if defined(__ELF) |
class ELF BASE_EMBEDDED { |
public: |
- ELF() : sections_(6) { |
- sections_.Add(new ELFSection("", ELFSection::TYPE_NULL, 0)); |
- sections_.Add(new StringTable(".shstrtab")); |
+ ELF(Zone* zone) : sections_(6, zone) { |
+ sections_.Add(new(zone) ELFSection("", ELFSection::TYPE_NULL, 0), zone); |
+ sections_.Add(new(zone) StringTable(".shstrtab"), zone); |
} |
void Write(Writer* w) { |
@@ -642,8 +644,8 @@ class ELF BASE_EMBEDDED { |
return sections_[index]; |
} |
- uint32_t AddSection(ELFSection* section) { |
- sections_.Add(section); |
+ uint32_t AddSection(ELFSection* section, Zone* zone) { |
+ sections_.Add(section, zone); |
section->set_index(sections_.length() - 1); |
return sections_.length() - 1; |
} |
@@ -852,10 +854,10 @@ class ELFSymbol BASE_EMBEDDED { |
class ELFSymbolTable : public ELFSection { |
public: |
- explicit ELFSymbolTable(const char* name) |
+ ELFSymbolTable(const char* name, Zone* zone) |
: ELFSection(name, TYPE_SYMTAB, sizeof(uintptr_t)), |
- locals_(1), |
- globals_(1) { |
+ locals_(1, zone), |
+ globals_(1, zone) { |
} |
virtual void WriteBody(Writer::Slot<Header> header, Writer* w) { |
@@ -883,11 +885,11 @@ class ELFSymbolTable : public ELFSection { |
strtab->DetachWriter(); |
} |
- void Add(const ELFSymbol& symbol) { |
+ void Add(const ELFSymbol& symbol, Zone* zone) { |
if (symbol.binding() == ELFSymbol::BIND_LOCAL) { |
- locals_.Add(symbol); |
+ locals_.Add(symbol, zone); |
} else { |
- globals_.Add(symbol); |
+ globals_.Add(symbol, zone); |
} |
} |
@@ -1019,26 +1021,29 @@ class CodeDescription BASE_EMBEDDED { |
static void CreateSymbolsTable(CodeDescription* desc, |
ELF* elf, |
int text_section_index) { |
- ELFSymbolTable* symtab = new ELFSymbolTable(".symtab"); |
- StringTable* strtab = new StringTable(".strtab"); |
+ Zone* zone = desc->info()->zone(); |
+ ELFSymbolTable* symtab = new(zone) ELFSymbolTable(".symtab", zone); |
+ StringTable* strtab = new(zone) StringTable(".strtab"); |
// Symbol table should be followed by the linked string table. |
- elf->AddSection(symtab); |
- elf->AddSection(strtab); |
+ elf->AddSection(symtab, zone); |
+ elf->AddSection(strtab, zone); |
symtab->Add(ELFSymbol("V8 Code", |
0, |
0, |
ELFSymbol::BIND_LOCAL, |
ELFSymbol::TYPE_FILE, |
- ELFSection::INDEX_ABSOLUTE)); |
+ ELFSection::INDEX_ABSOLUTE), |
+ zone); |
symtab->Add(ELFSymbol(desc->name(), |
0, |
desc->CodeSize(), |
ELFSymbol::BIND_GLOBAL, |
ELFSymbol::TYPE_FUNC, |
- text_section_index)); |
+ text_section_index), |
+ zone); |
} |
#endif // defined(__ELF) |
@@ -1074,7 +1079,7 @@ class DebugInfoSection : public DebugSection { |
DW_ATE_SIGNED = 0x5 |
}; |
- bool WriteBody(Writer* w) { |
+ bool WriteBodyInternal(Writer* w) { |
uintptr_t cu_start = w->position(); |
Writer::Slot<uint32_t> size = w->CreateSlotHere<uint32_t>(); |
uintptr_t start = w->position(); |
@@ -1094,8 +1099,7 @@ class DebugInfoSection : public DebugSection { |
w->WriteString("v8value"); |
if (desc_->IsInfoAvailable()) { |
- CompilationInfo* info = desc_->info(); |
- ScopeInfo<FreeStoreAllocationPolicy> scope_info(info->scope()); |
+ Scope* scope = desc_->info()->scope(); |
w->WriteULEB128(2); |
w->WriteString(desc_->name()); |
w->Write<intptr_t>(desc_->CodeStart()); |
@@ -1111,18 +1115,18 @@ class DebugInfoSection : public DebugSection { |
#endif |
fb_block_size.set(static_cast<uint32_t>(w->position() - fb_block_start)); |
- int params = scope_info.number_of_parameters(); |
- int slots = scope_info.number_of_stack_slots(); |
- int context_slots = scope_info.number_of_context_slots(); |
+ int params = scope->num_parameters(); |
+ int slots = scope->num_stack_slots(); |
+ int context_slots = scope->ContextLocalCount(); |
// The real slot ID is internal_slots + context_slot_id. |
int internal_slots = Context::MIN_CONTEXT_SLOTS; |
- int locals = scope_info.LocalCount(); |
+ int locals = scope->StackLocalCount(); |
int current_abbreviation = 4; |
for (int param = 0; param < params; ++param) { |
w->WriteULEB128(current_abbreviation++); |
w->WriteString( |
- *scope_info.ParameterName(param)->ToCString(DISALLOW_NULLS)); |
+ *scope->parameter(param)->name()->ToCString(DISALLOW_NULLS)); |
w->Write<uint32_t>(ty_offset); |
Writer::Slot<uint32_t> block_size = w->CreateSlotHere<uint32_t>(); |
uintptr_t block_start = w->position(); |
@@ -1148,7 +1152,7 @@ class DebugInfoSection : public DebugSection { |
ASSERT(Context::CLOSURE_INDEX == 0); |
ASSERT(Context::PREVIOUS_INDEX == 1); |
ASSERT(Context::EXTENSION_INDEX == 2); |
- ASSERT(Context::GLOBAL_INDEX == 3); |
+ ASSERT(Context::GLOBAL_OBJECT_INDEX == 3); |
w->WriteULEB128(current_abbreviation++); |
w->WriteString(".closure"); |
w->WriteULEB128(current_abbreviation++); |
@@ -1167,10 +1171,13 @@ class DebugInfoSection : public DebugSection { |
w->WriteString(builder.Finalize()); |
} |
+ ZoneList<Variable*> stack_locals(locals, scope->zone()); |
+ ZoneList<Variable*> context_locals(context_slots, scope->zone()); |
+ scope->CollectStackAndContextLocals(&stack_locals, &context_locals); |
for (int local = 0; local < locals; ++local) { |
w->WriteULEB128(current_abbreviation++); |
w->WriteString( |
- *scope_info.LocalName(local)->ToCString(DISALLOW_NULLS)); |
+ *stack_locals[local]->name()->ToCString(DISALLOW_NULLS)); |
w->Write<uint32_t>(ty_offset); |
Writer::Slot<uint32_t> block_size = w->CreateSlotHere<uint32_t>(); |
uintptr_t block_start = w->position(); |
@@ -1287,7 +1294,7 @@ class DebugAbbrevSection : public DebugSection { |
w->WriteULEB128(0); |
} |
- bool WriteBody(Writer* w) { |
+ bool WriteBodyInternal(Writer* w) { |
int current_abbreviation = 1; |
bool extra_info = desc_->IsInfoAvailable(); |
ASSERT(desc_->IsLineInfoAvailable()); |
@@ -1306,14 +1313,13 @@ class DebugAbbrevSection : public DebugSection { |
w->WriteULEB128(0); |
if (extra_info) { |
- CompilationInfo* info = desc_->info(); |
- ScopeInfo<FreeStoreAllocationPolicy> scope_info(info->scope()); |
- int params = scope_info.number_of_parameters(); |
- int slots = scope_info.number_of_stack_slots(); |
- int context_slots = scope_info.number_of_context_slots(); |
+ Scope* scope = desc_->info()->scope(); |
+ int params = scope->num_parameters(); |
+ int slots = scope->num_stack_slots(); |
+ int context_slots = scope->ContextLocalCount(); |
// The real slot ID is internal_slots + context_slot_id. |
int internal_slots = Context::MIN_CONTEXT_SLOTS; |
- int locals = scope_info.LocalCount(); |
+ int locals = scope->StackLocalCount(); |
int total_children = |
params + slots + context_slots + internal_slots + locals + 2; |
@@ -1418,7 +1424,7 @@ class DebugLineSection : public DebugSection { |
DW_LNE_DEFINE_FILE = 3 |
}; |
- bool WriteBody(Writer* w) { |
+ bool WriteBodyInternal(Writer* w) { |
// Write prologue. |
Writer::Slot<uint32_t> total_length = w->CreateSlotHere<uint32_t>(); |
uintptr_t start = w->position(); |
@@ -1558,7 +1564,7 @@ class DebugLineSection : public DebugSection { |
class UnwindInfoSection : public DebugSection { |
public: |
explicit UnwindInfoSection(CodeDescription* desc); |
- virtual bool WriteBody(Writer* w); |
+ virtual bool WriteBodyInternal(Writer* w); |
int WriteCIE(Writer* w); |
void WriteFDE(Writer* w, int); |
@@ -1770,7 +1776,7 @@ void UnwindInfoSection::WriteFDEStateAfterRBPPop(Writer* w) { |
} |
-bool UnwindInfoSection::WriteBody(Writer* w) { |
+bool UnwindInfoSection::WriteBodyInternal(Writer* w) { |
uint32_t cie_position = WriteCIE(w); |
WriteFDE(w, cie_position); |
return true; |
@@ -1780,13 +1786,14 @@ bool UnwindInfoSection::WriteBody(Writer* w) { |
#endif // V8_TARGET_ARCH_X64 |
static void CreateDWARFSections(CodeDescription* desc, DebugObject* obj) { |
+ Zone* zone = desc->info()->zone(); |
if (desc->IsLineInfoAvailable()) { |
- obj->AddSection(new DebugInfoSection(desc)); |
- obj->AddSection(new DebugAbbrevSection(desc)); |
- obj->AddSection(new DebugLineSection(desc)); |
+ obj->AddSection(new(zone) DebugInfoSection(desc), zone); |
+ obj->AddSection(new(zone) DebugAbbrevSection(desc), zone); |
+ obj->AddSection(new(zone) DebugLineSection(desc), zone); |
} |
#ifdef V8_TARGET_ARCH_X64 |
- obj->AddSection(new UnwindInfoSection(desc)); |
+ obj->AddSection(new(zone) UnwindInfoSection(desc), zone); |
#endif |
} |
@@ -1905,7 +1912,8 @@ static void UnregisterCodeEntry(JITCodeEntry* entry) { |
static JITCodeEntry* CreateELFObject(CodeDescription* desc) { |
- ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); |
+ Zone* zone = desc->info()->zone(); |
+ ZoneScope zone_scope(zone, DELETE_ON_EXIT); |
#ifdef __MACH_O |
MachO mach_o; |
Writer w(&mach_o); |
@@ -1918,17 +1926,19 @@ static JITCodeEntry* CreateELFObject(CodeDescription* desc) { |
mach_o.Write(&w, desc->CodeStart(), desc->CodeSize()); |
#else |
- ELF elf; |
+ ELF elf(zone); |
Writer w(&elf); |
int text_section_index = elf.AddSection( |
- new FullHeaderELFSection(".text", |
- ELFSection::TYPE_NOBITS, |
- kCodeAlignment, |
- desc->CodeStart(), |
- 0, |
- desc->CodeSize(), |
- ELFSection::FLAG_ALLOC | ELFSection::FLAG_EXEC)); |
+ new(zone) FullHeaderELFSection( |
+ ".text", |
+ ELFSection::TYPE_NOBITS, |
+ kCodeAlignment, |
+ desc->CodeStart(), |
+ 0, |
+ desc->CodeSize(), |
+ ELFSection::FLAG_ALLOC | ELFSection::FLAG_EXEC), |
+ zone); |
CreateSymbolsTable(desc, &elf, text_section_index); |