Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(40)

Side by Side Diff: src/gdb-jit.cc

Issue 11022007: Make GDBJIT interface compile again. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/mark-compact.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 13 matching lines...) Expand all
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 27
28 #ifdef ENABLE_GDB_JIT_INTERFACE 28 #ifdef ENABLE_GDB_JIT_INTERFACE
29 #include "v8.h" 29 #include "v8.h"
30 #include "gdb-jit.h" 30 #include "gdb-jit.h"
31 31
32 #include "bootstrapper.h" 32 #include "bootstrapper.h"
33 #include "compiler.h" 33 #include "compiler.h"
34 #include "frames.h"
35 #include "frames-inl.h"
34 #include "global-handles.h" 36 #include "global-handles.h"
35 #include "messages.h" 37 #include "messages.h"
38 #include "natives.h"
36 #include "platform.h" 39 #include "platform.h"
37 #include "natives.h" 40 #include "scopes.h"
38 #include "scopeinfo.h"
39 41
40 namespace v8 { 42 namespace v8 {
41 namespace internal { 43 namespace internal {
42 44
43 #ifdef __APPLE__ 45 #ifdef __APPLE__
44 #define __MACH_O 46 #define __MACH_O
45 class MachO; 47 class MachO;
46 class MachOSection; 48 class MachOSection;
47 typedef MachO DebugObject; 49 typedef MachO DebugObject;
48 typedef MachOSection DebugSection; 50 typedef MachOSection DebugSection;
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 189
188 class StringTable; 190 class StringTable;
189 191
190 template<typename THeader> 192 template<typename THeader>
191 class DebugSectionBase : public ZoneObject { 193 class DebugSectionBase : public ZoneObject {
192 public: 194 public:
193 virtual ~DebugSectionBase() { } 195 virtual ~DebugSectionBase() { }
194 196
195 virtual void WriteBody(Writer::Slot<THeader> header, Writer* writer) { 197 virtual void WriteBody(Writer::Slot<THeader> header, Writer* writer) {
196 uintptr_t start = writer->position(); 198 uintptr_t start = writer->position();
197 if (WriteBody(writer)) { 199 if (WriteBodyInternal(writer)) {
198 uintptr_t end = writer->position(); 200 uintptr_t end = writer->position();
199 header->offset = start; 201 header->offset = start;
200 #if defined(__MACH_O) 202 #if defined(__MACH_O)
201 header->addr = 0; 203 header->addr = 0;
202 #endif 204 #endif
203 header->size = end - start; 205 header->size = end - start;
204 } 206 }
205 } 207 }
206 208
207 virtual bool WriteBody(Writer* writer) { 209 virtual bool WriteBodyInternal(Writer* writer) {
208 return false; 210 return false;
209 } 211 }
210 212
211 typedef THeader Header; 213 typedef THeader Header;
212 }; 214 };
213 215
214 216
215 struct MachOSectionHeader { 217 struct MachOSectionHeader {
216 char sectname[16]; 218 char sectname[16];
217 char segname[16]; 219 char segname[16];
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 335
334 ELFSection(const char* name, Type type, uintptr_t align) 336 ELFSection(const char* name, Type type, uintptr_t align)
335 : name_(name), type_(type), align_(align) { } 337 : name_(name), type_(type), align_(align) { }
336 338
337 virtual ~ELFSection() { } 339 virtual ~ELFSection() { }
338 340
339 void PopulateHeader(Writer::Slot<Header> header, StringTable* strtab); 341 void PopulateHeader(Writer::Slot<Header> header, StringTable* strtab);
340 342
341 virtual void WriteBody(Writer::Slot<Header> header, Writer* w) { 343 virtual void WriteBody(Writer::Slot<Header> header, Writer* w) {
342 uintptr_t start = w->position(); 344 uintptr_t start = w->position();
343 if (WriteBody(w)) { 345 if (WriteBodyInternal(w)) {
344 uintptr_t end = w->position(); 346 uintptr_t end = w->position();
345 header->offset = start; 347 header->offset = start;
346 header->size = end - start; 348 header->size = end - start;
347 } 349 }
348 } 350 }
349 351
350 virtual bool WriteBody(Writer* w) { 352 virtual bool WriteBodyInternal(Writer* w) {
351 return false; 353 return false;
352 } 354 }
353 355
354 uint16_t index() const { return index_; } 356 uint16_t index() const { return index_; }
355 void set_index(uint16_t index) { index_ = index; } 357 void set_index(uint16_t index) { index_ = index; }
356 358
357 protected: 359 protected:
358 virtual void PopulateHeader(Writer::Slot<Header> header) { 360 virtual void PopulateHeader(Writer::Slot<Header> header) {
359 header->flags = 0; 361 header->flags = 0;
360 header->address = 0; 362 header->address = 0;
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
620 622
621 623
622 ZoneList<MachOSection*> sections_; 624 ZoneList<MachOSection*> sections_;
623 }; 625 };
624 #endif // defined(__MACH_O) 626 #endif // defined(__MACH_O)
625 627
626 628
627 #if defined(__ELF) 629 #if defined(__ELF)
628 class ELF BASE_EMBEDDED { 630 class ELF BASE_EMBEDDED {
629 public: 631 public:
630 ELF() : sections_(6) { 632 ELF(Zone* zone) : sections_(6, zone) {
631 sections_.Add(new ELFSection("", ELFSection::TYPE_NULL, 0)); 633 sections_.Add(new(zone) ELFSection("", ELFSection::TYPE_NULL, 0), zone);
632 sections_.Add(new StringTable(".shstrtab")); 634 sections_.Add(new(zone) StringTable(".shstrtab"), zone);
633 } 635 }
634 636
635 void Write(Writer* w) { 637 void Write(Writer* w) {
636 WriteHeader(w); 638 WriteHeader(w);
637 WriteSectionTable(w); 639 WriteSectionTable(w);
638 WriteSections(w); 640 WriteSections(w);
639 } 641 }
640 642
641 ELFSection* SectionAt(uint32_t index) { 643 ELFSection* SectionAt(uint32_t index) {
642 return sections_[index]; 644 return sections_[index];
643 } 645 }
644 646
645 uint32_t AddSection(ELFSection* section) { 647 uint32_t AddSection(ELFSection* section, Zone* zone) {
646 sections_.Add(section); 648 sections_.Add(section, zone);
647 section->set_index(sections_.length() - 1); 649 section->set_index(sections_.length() - 1);
648 return sections_.length() - 1; 650 return sections_.length() - 1;
649 } 651 }
650 652
651 private: 653 private:
652 struct ELFHeader { 654 struct ELFHeader {
653 uint8_t ident[16]; 655 uint8_t ident[16];
654 uint16_t type; 656 uint16_t type;
655 uint16_t machine; 657 uint16_t machine;
656 uint32_t version; 658 uint32_t version;
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
845 uintptr_t value; 847 uintptr_t value;
846 uintptr_t size; 848 uintptr_t size;
847 uint8_t info; 849 uint8_t info;
848 uint8_t other; 850 uint8_t other;
849 uint16_t section; 851 uint16_t section;
850 }; 852 };
851 853
852 854
853 class ELFSymbolTable : public ELFSection { 855 class ELFSymbolTable : public ELFSection {
854 public: 856 public:
855 explicit ELFSymbolTable(const char* name) 857 ELFSymbolTable(const char* name, Zone* zone)
856 : ELFSection(name, TYPE_SYMTAB, sizeof(uintptr_t)), 858 : ELFSection(name, TYPE_SYMTAB, sizeof(uintptr_t)),
857 locals_(1), 859 locals_(1, zone),
858 globals_(1) { 860 globals_(1, zone) {
859 } 861 }
860 862
861 virtual void WriteBody(Writer::Slot<Header> header, Writer* w) { 863 virtual void WriteBody(Writer::Slot<Header> header, Writer* w) {
862 w->Align(header->alignment); 864 w->Align(header->alignment);
863 int total_symbols = locals_.length() + globals_.length() + 1; 865 int total_symbols = locals_.length() + globals_.length() + 1;
864 header->offset = w->position(); 866 header->offset = w->position();
865 867
866 Writer::Slot<ELFSymbol::SerializedLayout> symbols = 868 Writer::Slot<ELFSymbol::SerializedLayout> symbols =
867 w->CreateSlotsHere<ELFSymbol::SerializedLayout>(total_symbols); 869 w->CreateSlotsHere<ELFSymbol::SerializedLayout>(total_symbols);
868 870
869 header->size = w->position() - header->offset; 871 header->size = w->position() - header->offset;
870 872
871 // String table for this symbol table should follow it in the section table. 873 // String table for this symbol table should follow it in the section table.
872 StringTable* strtab = 874 StringTable* strtab =
873 static_cast<StringTable*>(w->debug_object()->SectionAt(index() + 1)); 875 static_cast<StringTable*>(w->debug_object()->SectionAt(index() + 1));
874 strtab->AttachWriter(w); 876 strtab->AttachWriter(w);
875 symbols.at(0).set(ELFSymbol::SerializedLayout(0, 877 symbols.at(0).set(ELFSymbol::SerializedLayout(0,
876 0, 878 0,
877 0, 879 0,
878 ELFSymbol::BIND_LOCAL, 880 ELFSymbol::BIND_LOCAL,
879 ELFSymbol::TYPE_NOTYPE, 881 ELFSymbol::TYPE_NOTYPE,
880 0)); 882 0));
881 WriteSymbolsList(&locals_, symbols.at(1), strtab); 883 WriteSymbolsList(&locals_, symbols.at(1), strtab);
882 WriteSymbolsList(&globals_, symbols.at(locals_.length() + 1), strtab); 884 WriteSymbolsList(&globals_, symbols.at(locals_.length() + 1), strtab);
883 strtab->DetachWriter(); 885 strtab->DetachWriter();
884 } 886 }
885 887
886 void Add(const ELFSymbol& symbol) { 888 void Add(const ELFSymbol& symbol, Zone* zone) {
887 if (symbol.binding() == ELFSymbol::BIND_LOCAL) { 889 if (symbol.binding() == ELFSymbol::BIND_LOCAL) {
888 locals_.Add(symbol); 890 locals_.Add(symbol, zone);
889 } else { 891 } else {
890 globals_.Add(symbol); 892 globals_.Add(symbol, zone);
891 } 893 }
892 } 894 }
893 895
894 protected: 896 protected:
895 virtual void PopulateHeader(Writer::Slot<Header> header) { 897 virtual void PopulateHeader(Writer::Slot<Header> header) {
896 ELFSection::PopulateHeader(header); 898 ELFSection::PopulateHeader(header);
897 // We are assuming that string table will follow symbol table. 899 // We are assuming that string table will follow symbol table.
898 header->link = index() + 1; 900 header->link = index() + 1;
899 header->info = locals_.length() + 1; 901 header->info = locals_.length() + 1;
900 header->entry_size = sizeof(ELFSymbol::SerializedLayout); 902 header->entry_size = sizeof(ELFSymbol::SerializedLayout);
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
1012 CompilationInfo* info_; 1014 CompilationInfo* info_;
1013 #ifdef V8_TARGET_ARCH_X64 1015 #ifdef V8_TARGET_ARCH_X64
1014 uintptr_t stack_state_start_addresses_[STACK_STATE_MAX]; 1016 uintptr_t stack_state_start_addresses_[STACK_STATE_MAX];
1015 #endif 1017 #endif
1016 }; 1018 };
1017 1019
1018 #if defined(__ELF) 1020 #if defined(__ELF)
1019 static void CreateSymbolsTable(CodeDescription* desc, 1021 static void CreateSymbolsTable(CodeDescription* desc,
1020 ELF* elf, 1022 ELF* elf,
1021 int text_section_index) { 1023 int text_section_index) {
1022 ELFSymbolTable* symtab = new ELFSymbolTable(".symtab"); 1024 Zone* zone = desc->info()->zone();
1023 StringTable* strtab = new StringTable(".strtab"); 1025 ELFSymbolTable* symtab = new(zone) ELFSymbolTable(".symtab", zone);
1026 StringTable* strtab = new(zone) StringTable(".strtab");
1024 1027
1025 // Symbol table should be followed by the linked string table. 1028 // Symbol table should be followed by the linked string table.
1026 elf->AddSection(symtab); 1029 elf->AddSection(symtab, zone);
1027 elf->AddSection(strtab); 1030 elf->AddSection(strtab, zone);
1028 1031
1029 symtab->Add(ELFSymbol("V8 Code", 1032 symtab->Add(ELFSymbol("V8 Code",
1030 0, 1033 0,
1031 0, 1034 0,
1032 ELFSymbol::BIND_LOCAL, 1035 ELFSymbol::BIND_LOCAL,
1033 ELFSymbol::TYPE_FILE, 1036 ELFSymbol::TYPE_FILE,
1034 ELFSection::INDEX_ABSOLUTE)); 1037 ELFSection::INDEX_ABSOLUTE),
1038 zone);
1035 1039
1036 symtab->Add(ELFSymbol(desc->name(), 1040 symtab->Add(ELFSymbol(desc->name(),
1037 0, 1041 0,
1038 desc->CodeSize(), 1042 desc->CodeSize(),
1039 ELFSymbol::BIND_GLOBAL, 1043 ELFSymbol::BIND_GLOBAL,
1040 ELFSymbol::TYPE_FUNC, 1044 ELFSymbol::TYPE_FUNC,
1041 text_section_index)); 1045 text_section_index),
1046 zone);
1042 } 1047 }
1043 #endif // defined(__ELF) 1048 #endif // defined(__ELF)
1044 1049
1045 1050
1046 class DebugInfoSection : public DebugSection { 1051 class DebugInfoSection : public DebugSection {
1047 public: 1052 public:
1048 explicit DebugInfoSection(CodeDescription* desc) 1053 explicit DebugInfoSection(CodeDescription* desc)
1049 #if defined(__ELF) 1054 #if defined(__ELF)
1050 : ELFSection(".debug_info", TYPE_PROGBITS, 1), 1055 : ELFSection(".debug_info", TYPE_PROGBITS, 1),
1051 #else 1056 #else
(...skipping 15 matching lines...) Expand all
1067 DW_OP_reg6 = 0x56, 1072 DW_OP_reg6 = 0x56,
1068 DW_OP_reg7 = 0x57, 1073 DW_OP_reg7 = 0x57,
1069 DW_OP_fbreg = 0x91 // 1 param: SLEB128 offset 1074 DW_OP_fbreg = 0x91 // 1 param: SLEB128 offset
1070 }; 1075 };
1071 1076
1072 enum DWARF2Encoding { 1077 enum DWARF2Encoding {
1073 DW_ATE_ADDRESS = 0x1, 1078 DW_ATE_ADDRESS = 0x1,
1074 DW_ATE_SIGNED = 0x5 1079 DW_ATE_SIGNED = 0x5
1075 }; 1080 };
1076 1081
1077 bool WriteBody(Writer* w) { 1082 bool WriteBodyInternal(Writer* w) {
1078 uintptr_t cu_start = w->position(); 1083 uintptr_t cu_start = w->position();
1079 Writer::Slot<uint32_t> size = w->CreateSlotHere<uint32_t>(); 1084 Writer::Slot<uint32_t> size = w->CreateSlotHere<uint32_t>();
1080 uintptr_t start = w->position(); 1085 uintptr_t start = w->position();
1081 w->Write<uint16_t>(2); // DWARF version. 1086 w->Write<uint16_t>(2); // DWARF version.
1082 w->Write<uint32_t>(0); // Abbreviation table offset. 1087 w->Write<uint32_t>(0); // Abbreviation table offset.
1083 w->Write<uint8_t>(sizeof(intptr_t)); 1088 w->Write<uint8_t>(sizeof(intptr_t));
1084 1089
1085 w->WriteULEB128(1); // Abbreviation code. 1090 w->WriteULEB128(1); // Abbreviation code.
1086 w->WriteString(*desc_->GetFilename()); 1091 w->WriteString(*desc_->GetFilename());
1087 w->Write<intptr_t>(desc_->CodeStart()); 1092 w->Write<intptr_t>(desc_->CodeStart());
1088 w->Write<intptr_t>(desc_->CodeStart() + desc_->CodeSize()); 1093 w->Write<intptr_t>(desc_->CodeStart() + desc_->CodeSize());
1089 w->Write<uint32_t>(0); 1094 w->Write<uint32_t>(0);
1090 1095
1091 uint32_t ty_offset = static_cast<uint32_t>(w->position() - cu_start); 1096 uint32_t ty_offset = static_cast<uint32_t>(w->position() - cu_start);
1092 w->WriteULEB128(3); 1097 w->WriteULEB128(3);
1093 w->Write<uint8_t>(kPointerSize); 1098 w->Write<uint8_t>(kPointerSize);
1094 w->WriteString("v8value"); 1099 w->WriteString("v8value");
1095 1100
1096 if (desc_->IsInfoAvailable()) { 1101 if (desc_->IsInfoAvailable()) {
1097 CompilationInfo* info = desc_->info(); 1102 Scope* scope = desc_->info()->scope();
1098 ScopeInfo<FreeStoreAllocationPolicy> scope_info(info->scope());
1099 w->WriteULEB128(2); 1103 w->WriteULEB128(2);
1100 w->WriteString(desc_->name()); 1104 w->WriteString(desc_->name());
1101 w->Write<intptr_t>(desc_->CodeStart()); 1105 w->Write<intptr_t>(desc_->CodeStart());
1102 w->Write<intptr_t>(desc_->CodeStart() + desc_->CodeSize()); 1106 w->Write<intptr_t>(desc_->CodeStart() + desc_->CodeSize());
1103 Writer::Slot<uint32_t> fb_block_size = w->CreateSlotHere<uint32_t>(); 1107 Writer::Slot<uint32_t> fb_block_size = w->CreateSlotHere<uint32_t>();
1104 uintptr_t fb_block_start = w->position(); 1108 uintptr_t fb_block_start = w->position();
1105 #if defined(V8_TARGET_ARCH_IA32) 1109 #if defined(V8_TARGET_ARCH_IA32)
1106 w->Write<uint8_t>(DW_OP_reg5); // The frame pointer's here on ia32 1110 w->Write<uint8_t>(DW_OP_reg5); // The frame pointer's here on ia32
1107 #elif defined(V8_TARGET_ARCH_X64) 1111 #elif defined(V8_TARGET_ARCH_X64)
1108 w->Write<uint8_t>(DW_OP_reg6); // and here on x64. 1112 w->Write<uint8_t>(DW_OP_reg6); // and here on x64.
1109 #else 1113 #else
1110 #error Unsupported target architecture. 1114 #error Unsupported target architecture.
1111 #endif 1115 #endif
1112 fb_block_size.set(static_cast<uint32_t>(w->position() - fb_block_start)); 1116 fb_block_size.set(static_cast<uint32_t>(w->position() - fb_block_start));
1113 1117
1114 int params = scope_info.number_of_parameters(); 1118 int params = scope->num_parameters();
1115 int slots = scope_info.number_of_stack_slots(); 1119 int slots = scope->num_stack_slots();
1116 int context_slots = scope_info.number_of_context_slots(); 1120 int context_slots = scope->ContextLocalCount();
1117 // The real slot ID is internal_slots + context_slot_id. 1121 // The real slot ID is internal_slots + context_slot_id.
1118 int internal_slots = Context::MIN_CONTEXT_SLOTS; 1122 int internal_slots = Context::MIN_CONTEXT_SLOTS;
1119 int locals = scope_info.LocalCount(); 1123 int locals = scope->StackLocalCount();
1120 int current_abbreviation = 4; 1124 int current_abbreviation = 4;
1121 1125
1122 for (int param = 0; param < params; ++param) { 1126 for (int param = 0; param < params; ++param) {
1123 w->WriteULEB128(current_abbreviation++); 1127 w->WriteULEB128(current_abbreviation++);
1124 w->WriteString( 1128 w->WriteString(
1125 *scope_info.ParameterName(param)->ToCString(DISALLOW_NULLS)); 1129 *scope->parameter(param)->name()->ToCString(DISALLOW_NULLS));
1126 w->Write<uint32_t>(ty_offset); 1130 w->Write<uint32_t>(ty_offset);
1127 Writer::Slot<uint32_t> block_size = w->CreateSlotHere<uint32_t>(); 1131 Writer::Slot<uint32_t> block_size = w->CreateSlotHere<uint32_t>();
1128 uintptr_t block_start = w->position(); 1132 uintptr_t block_start = w->position();
1129 w->Write<uint8_t>(DW_OP_fbreg); 1133 w->Write<uint8_t>(DW_OP_fbreg);
1130 w->WriteSLEB128( 1134 w->WriteSLEB128(
1131 JavaScriptFrameConstants::kLastParameterOffset + 1135 JavaScriptFrameConstants::kLastParameterOffset +
1132 kPointerSize * (params - param - 1)); 1136 kPointerSize * (params - param - 1));
1133 block_size.set(static_cast<uint32_t>(w->position() - block_start)); 1137 block_size.set(static_cast<uint32_t>(w->position() - block_start));
1134 } 1138 }
1135 1139
1136 EmbeddedVector<char, 256> buffer; 1140 EmbeddedVector<char, 256> buffer;
1137 StringBuilder builder(buffer.start(), buffer.length()); 1141 StringBuilder builder(buffer.start(), buffer.length());
1138 1142
1139 for (int slot = 0; slot < slots; ++slot) { 1143 for (int slot = 0; slot < slots; ++slot) {
1140 w->WriteULEB128(current_abbreviation++); 1144 w->WriteULEB128(current_abbreviation++);
1141 builder.Reset(); 1145 builder.Reset();
1142 builder.AddFormatted("slot%d", slot); 1146 builder.AddFormatted("slot%d", slot);
1143 w->WriteString(builder.Finalize()); 1147 w->WriteString(builder.Finalize());
1144 } 1148 }
1145 1149
1146 // See contexts.h for more information. 1150 // See contexts.h for more information.
1147 ASSERT(Context::MIN_CONTEXT_SLOTS == 4); 1151 ASSERT(Context::MIN_CONTEXT_SLOTS == 4);
1148 ASSERT(Context::CLOSURE_INDEX == 0); 1152 ASSERT(Context::CLOSURE_INDEX == 0);
1149 ASSERT(Context::PREVIOUS_INDEX == 1); 1153 ASSERT(Context::PREVIOUS_INDEX == 1);
1150 ASSERT(Context::EXTENSION_INDEX == 2); 1154 ASSERT(Context::EXTENSION_INDEX == 2);
1151 ASSERT(Context::GLOBAL_INDEX == 3); 1155 ASSERT(Context::GLOBAL_OBJECT_INDEX == 3);
1152 w->WriteULEB128(current_abbreviation++); 1156 w->WriteULEB128(current_abbreviation++);
1153 w->WriteString(".closure"); 1157 w->WriteString(".closure");
1154 w->WriteULEB128(current_abbreviation++); 1158 w->WriteULEB128(current_abbreviation++);
1155 w->WriteString(".previous"); 1159 w->WriteString(".previous");
1156 w->WriteULEB128(current_abbreviation++); 1160 w->WriteULEB128(current_abbreviation++);
1157 w->WriteString(".extension"); 1161 w->WriteString(".extension");
1158 w->WriteULEB128(current_abbreviation++); 1162 w->WriteULEB128(current_abbreviation++);
1159 w->WriteString(".global"); 1163 w->WriteString(".global");
1160 1164
1161 for (int context_slot = 0; 1165 for (int context_slot = 0;
1162 context_slot < context_slots; 1166 context_slot < context_slots;
1163 ++context_slot) { 1167 ++context_slot) {
1164 w->WriteULEB128(current_abbreviation++); 1168 w->WriteULEB128(current_abbreviation++);
1165 builder.Reset(); 1169 builder.Reset();
1166 builder.AddFormatted("context_slot%d", context_slot + internal_slots); 1170 builder.AddFormatted("context_slot%d", context_slot + internal_slots);
1167 w->WriteString(builder.Finalize()); 1171 w->WriteString(builder.Finalize());
1168 } 1172 }
1169 1173
1174 ZoneList<Variable*> stack_locals(locals, scope->zone());
1175 ZoneList<Variable*> context_locals(context_slots, scope->zone());
1176 scope->CollectStackAndContextLocals(&stack_locals, &context_locals);
1170 for (int local = 0; local < locals; ++local) { 1177 for (int local = 0; local < locals; ++local) {
1171 w->WriteULEB128(current_abbreviation++); 1178 w->WriteULEB128(current_abbreviation++);
1172 w->WriteString( 1179 w->WriteString(
1173 *scope_info.LocalName(local)->ToCString(DISALLOW_NULLS)); 1180 *stack_locals[local]->name()->ToCString(DISALLOW_NULLS));
1174 w->Write<uint32_t>(ty_offset); 1181 w->Write<uint32_t>(ty_offset);
1175 Writer::Slot<uint32_t> block_size = w->CreateSlotHere<uint32_t>(); 1182 Writer::Slot<uint32_t> block_size = w->CreateSlotHere<uint32_t>();
1176 uintptr_t block_start = w->position(); 1183 uintptr_t block_start = w->position();
1177 w->Write<uint8_t>(DW_OP_fbreg); 1184 w->Write<uint8_t>(DW_OP_fbreg);
1178 w->WriteSLEB128( 1185 w->WriteSLEB128(
1179 JavaScriptFrameConstants::kLocal0Offset - 1186 JavaScriptFrameConstants::kLocal0Offset -
1180 kPointerSize * local); 1187 kPointerSize * local);
1181 block_size.set(static_cast<uint32_t>(w->position() - block_start)); 1188 block_size.set(static_cast<uint32_t>(w->position() - block_start));
1182 } 1189 }
1183 1190
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
1280 if (has_value) { 1287 if (has_value) {
1281 w->WriteULEB128(DW_AT_TYPE); 1288 w->WriteULEB128(DW_AT_TYPE);
1282 w->WriteULEB128(DW_FORM_REF4); 1289 w->WriteULEB128(DW_FORM_REF4);
1283 w->WriteULEB128(DW_AT_LOCATION); 1290 w->WriteULEB128(DW_AT_LOCATION);
1284 w->WriteULEB128(DW_FORM_BLOCK4); 1291 w->WriteULEB128(DW_FORM_BLOCK4);
1285 } 1292 }
1286 w->WriteULEB128(0); 1293 w->WriteULEB128(0);
1287 w->WriteULEB128(0); 1294 w->WriteULEB128(0);
1288 } 1295 }
1289 1296
1290 bool WriteBody(Writer* w) { 1297 bool WriteBodyInternal(Writer* w) {
1291 int current_abbreviation = 1; 1298 int current_abbreviation = 1;
1292 bool extra_info = desc_->IsInfoAvailable(); 1299 bool extra_info = desc_->IsInfoAvailable();
1293 ASSERT(desc_->IsLineInfoAvailable()); 1300 ASSERT(desc_->IsLineInfoAvailable());
1294 w->WriteULEB128(current_abbreviation++); 1301 w->WriteULEB128(current_abbreviation++);
1295 w->WriteULEB128(DW_TAG_COMPILE_UNIT); 1302 w->WriteULEB128(DW_TAG_COMPILE_UNIT);
1296 w->Write<uint8_t>(extra_info ? DW_CHILDREN_YES : DW_CHILDREN_NO); 1303 w->Write<uint8_t>(extra_info ? DW_CHILDREN_YES : DW_CHILDREN_NO);
1297 w->WriteULEB128(DW_AT_NAME); 1304 w->WriteULEB128(DW_AT_NAME);
1298 w->WriteULEB128(DW_FORM_STRING); 1305 w->WriteULEB128(DW_FORM_STRING);
1299 w->WriteULEB128(DW_AT_LOW_PC); 1306 w->WriteULEB128(DW_AT_LOW_PC);
1300 w->WriteULEB128(DW_FORM_ADDR); 1307 w->WriteULEB128(DW_FORM_ADDR);
1301 w->WriteULEB128(DW_AT_HIGH_PC); 1308 w->WriteULEB128(DW_AT_HIGH_PC);
1302 w->WriteULEB128(DW_FORM_ADDR); 1309 w->WriteULEB128(DW_FORM_ADDR);
1303 w->WriteULEB128(DW_AT_STMT_LIST); 1310 w->WriteULEB128(DW_AT_STMT_LIST);
1304 w->WriteULEB128(DW_FORM_DATA4); 1311 w->WriteULEB128(DW_FORM_DATA4);
1305 w->WriteULEB128(0); 1312 w->WriteULEB128(0);
1306 w->WriteULEB128(0); 1313 w->WriteULEB128(0);
1307 1314
1308 if (extra_info) { 1315 if (extra_info) {
1309 CompilationInfo* info = desc_->info(); 1316 Scope* scope = desc_->info()->scope();
1310 ScopeInfo<FreeStoreAllocationPolicy> scope_info(info->scope()); 1317 int params = scope->num_parameters();
1311 int params = scope_info.number_of_parameters(); 1318 int slots = scope->num_stack_slots();
1312 int slots = scope_info.number_of_stack_slots(); 1319 int context_slots = scope->ContextLocalCount();
1313 int context_slots = scope_info.number_of_context_slots();
1314 // The real slot ID is internal_slots + context_slot_id. 1320 // The real slot ID is internal_slots + context_slot_id.
1315 int internal_slots = Context::MIN_CONTEXT_SLOTS; 1321 int internal_slots = Context::MIN_CONTEXT_SLOTS;
1316 int locals = scope_info.LocalCount(); 1322 int locals = scope->StackLocalCount();
1317 int total_children = 1323 int total_children =
1318 params + slots + context_slots + internal_slots + locals + 2; 1324 params + slots + context_slots + internal_slots + locals + 2;
1319 1325
1320 // The extra duplication below seems to be necessary to keep 1326 // The extra duplication below seems to be necessary to keep
1321 // gdb from getting upset on OSX. 1327 // gdb from getting upset on OSX.
1322 w->WriteULEB128(current_abbreviation++); // Abbreviation code. 1328 w->WriteULEB128(current_abbreviation++); // Abbreviation code.
1323 w->WriteULEB128(DW_TAG_SUBPROGRAM); 1329 w->WriteULEB128(DW_TAG_SUBPROGRAM);
1324 w->Write<uint8_t>( 1330 w->Write<uint8_t>(
1325 total_children != 0 ? DW_CHILDREN_YES : DW_CHILDREN_NO); 1331 total_children != 0 ? DW_CHILDREN_YES : DW_CHILDREN_NO);
1326 w->WriteULEB128(DW_AT_NAME); 1332 w->WriteULEB128(DW_AT_NAME);
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
1411 DW_LNS_NEGATE_STMT = 6 1417 DW_LNS_NEGATE_STMT = 6
1412 }; 1418 };
1413 1419
1414 // DWARF2 standard, figure 35. 1420 // DWARF2 standard, figure 35.
1415 enum DWARF2ExtendedOpcode { 1421 enum DWARF2ExtendedOpcode {
1416 DW_LNE_END_SEQUENCE = 1, 1422 DW_LNE_END_SEQUENCE = 1,
1417 DW_LNE_SET_ADDRESS = 2, 1423 DW_LNE_SET_ADDRESS = 2,
1418 DW_LNE_DEFINE_FILE = 3 1424 DW_LNE_DEFINE_FILE = 3
1419 }; 1425 };
1420 1426
1421 bool WriteBody(Writer* w) { 1427 bool WriteBodyInternal(Writer* w) {
1422 // Write prologue. 1428 // Write prologue.
1423 Writer::Slot<uint32_t> total_length = w->CreateSlotHere<uint32_t>(); 1429 Writer::Slot<uint32_t> total_length = w->CreateSlotHere<uint32_t>();
1424 uintptr_t start = w->position(); 1430 uintptr_t start = w->position();
1425 1431
1426 // Used for special opcodes 1432 // Used for special opcodes
1427 const int8_t line_base = 1; 1433 const int8_t line_base = 1;
1428 const uint8_t line_range = 7; 1434 const uint8_t line_range = 7;
1429 const int8_t max_line_incr = (line_base + line_range - 1); 1435 const int8_t max_line_incr = (line_base + line_range - 1);
1430 const uint8_t opcode_base = DW_LNS_NEGATE_STMT + 1; 1436 const uint8_t opcode_base = DW_LNS_NEGATE_STMT + 1;
1431 1437
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
1551 1557
1552 CodeDescription* desc_; 1558 CodeDescription* desc_;
1553 }; 1559 };
1554 1560
1555 1561
1556 #ifdef V8_TARGET_ARCH_X64 1562 #ifdef V8_TARGET_ARCH_X64
1557 1563
1558 class UnwindInfoSection : public DebugSection { 1564 class UnwindInfoSection : public DebugSection {
1559 public: 1565 public:
1560 explicit UnwindInfoSection(CodeDescription* desc); 1566 explicit UnwindInfoSection(CodeDescription* desc);
1561 virtual bool WriteBody(Writer* w); 1567 virtual bool WriteBodyInternal(Writer* w);
1562 1568
1563 int WriteCIE(Writer* w); 1569 int WriteCIE(Writer* w);
1564 void WriteFDE(Writer* w, int); 1570 void WriteFDE(Writer* w, int);
1565 1571
1566 void WriteFDEStateOnEntry(Writer* w); 1572 void WriteFDEStateOnEntry(Writer* w);
1567 void WriteFDEStateAfterRBPPush(Writer* w); 1573 void WriteFDEStateAfterRBPPush(Writer* w);
1568 void WriteFDEStateAfterRBPSet(Writer* w); 1574 void WriteFDEStateAfterRBPSet(Writer* w);
1569 void WriteFDEStateAfterRBPPop(Writer* w); 1575 void WriteFDEStateAfterRBPPop(Writer* w);
1570 1576
1571 void WriteLength(Writer* w, 1577 void WriteLength(Writer* w,
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
1763 w->Write<uint8_t>(DW_CFA_OFFSET_EXTENDED); 1769 w->Write<uint8_t>(DW_CFA_OFFSET_EXTENDED);
1764 w->WriteULEB128(AMD64_RBP); 1770 w->WriteULEB128(AMD64_RBP);
1765 w->WriteSLEB128(StandardFrameConstants::kCallerFPOffset); 1771 w->WriteSLEB128(StandardFrameConstants::kCallerFPOffset);
1766 1772
1767 // Last location described by this entry. 1773 // Last location described by this entry.
1768 w->Write<uint8_t>(DW_CFA_SET_LOC); 1774 w->Write<uint8_t>(DW_CFA_SET_LOC);
1769 w->Write<uint64_t>(desc_->CodeEnd()); 1775 w->Write<uint64_t>(desc_->CodeEnd());
1770 } 1776 }
1771 1777
1772 1778
1773 bool UnwindInfoSection::WriteBody(Writer* w) { 1779 bool UnwindInfoSection::WriteBodyInternal(Writer* w) {
1774 uint32_t cie_position = WriteCIE(w); 1780 uint32_t cie_position = WriteCIE(w);
1775 WriteFDE(w, cie_position); 1781 WriteFDE(w, cie_position);
1776 return true; 1782 return true;
1777 } 1783 }
1778 1784
1779 1785
1780 #endif // V8_TARGET_ARCH_X64 1786 #endif // V8_TARGET_ARCH_X64
1781 1787
1782 static void CreateDWARFSections(CodeDescription* desc, DebugObject* obj) { 1788 static void CreateDWARFSections(CodeDescription* desc, DebugObject* obj) {
1789 Zone* zone = desc->info()->zone();
1783 if (desc->IsLineInfoAvailable()) { 1790 if (desc->IsLineInfoAvailable()) {
1784 obj->AddSection(new DebugInfoSection(desc)); 1791 obj->AddSection(new(zone) DebugInfoSection(desc), zone);
1785 obj->AddSection(new DebugAbbrevSection(desc)); 1792 obj->AddSection(new(zone) DebugAbbrevSection(desc), zone);
1786 obj->AddSection(new DebugLineSection(desc)); 1793 obj->AddSection(new(zone) DebugLineSection(desc), zone);
1787 } 1794 }
1788 #ifdef V8_TARGET_ARCH_X64 1795 #ifdef V8_TARGET_ARCH_X64
1789 obj->AddSection(new UnwindInfoSection(desc)); 1796 obj->AddSection(new(zone) UnwindInfoSection(desc), zone);
1790 #endif 1797 #endif
1791 } 1798 }
1792 1799
1793 1800
1794 // ------------------------------------------------------------------- 1801 // -------------------------------------------------------------------
1795 // Binary GDB JIT Interface as described in 1802 // Binary GDB JIT Interface as described in
1796 // http://sourceware.org/gdb/onlinedocs/gdb/Declarations.html 1803 // http://sourceware.org/gdb/onlinedocs/gdb/Declarations.html
1797 extern "C" { 1804 extern "C" {
1798 typedef enum { 1805 typedef enum {
1799 JIT_NOACTION = 0, 1806 JIT_NOACTION = 0,
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1898 entry->next_->prev_ = entry->prev_; 1905 entry->next_->prev_ = entry->prev_;
1899 } 1906 }
1900 1907
1901 __jit_debug_descriptor.relevant_entry_ = entry; 1908 __jit_debug_descriptor.relevant_entry_ = entry;
1902 __jit_debug_descriptor.action_flag_ = JIT_UNREGISTER_FN; 1909 __jit_debug_descriptor.action_flag_ = JIT_UNREGISTER_FN;
1903 __jit_debug_register_code(); 1910 __jit_debug_register_code();
1904 } 1911 }
1905 1912
1906 1913
1907 static JITCodeEntry* CreateELFObject(CodeDescription* desc) { 1914 static JITCodeEntry* CreateELFObject(CodeDescription* desc) {
1908 ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); 1915 Zone* zone = desc->info()->zone();
1916 ZoneScope zone_scope(zone, DELETE_ON_EXIT);
1909 #ifdef __MACH_O 1917 #ifdef __MACH_O
1910 MachO mach_o; 1918 MachO mach_o;
1911 Writer w(&mach_o); 1919 Writer w(&mach_o);
1912 1920
1913 mach_o.AddSection(new MachOTextSection(kCodeAlignment, 1921 mach_o.AddSection(new MachOTextSection(kCodeAlignment,
1914 desc->CodeStart(), 1922 desc->CodeStart(),
1915 desc->CodeSize())); 1923 desc->CodeSize()));
1916 1924
1917 CreateDWARFSections(desc, &mach_o); 1925 CreateDWARFSections(desc, &mach_o);
1918 1926
1919 mach_o.Write(&w, desc->CodeStart(), desc->CodeSize()); 1927 mach_o.Write(&w, desc->CodeStart(), desc->CodeSize());
1920 #else 1928 #else
1921 ELF elf; 1929 ELF elf(zone);
1922 Writer w(&elf); 1930 Writer w(&elf);
1923 1931
1924 int text_section_index = elf.AddSection( 1932 int text_section_index = elf.AddSection(
1925 new FullHeaderELFSection(".text", 1933 new(zone) FullHeaderELFSection(
1926 ELFSection::TYPE_NOBITS, 1934 ".text",
1927 kCodeAlignment, 1935 ELFSection::TYPE_NOBITS,
1928 desc->CodeStart(), 1936 kCodeAlignment,
1929 0, 1937 desc->CodeStart(),
1930 desc->CodeSize(), 1938 0,
1931 ELFSection::FLAG_ALLOC | ELFSection::FLAG_EXEC)); 1939 desc->CodeSize(),
1940 ELFSection::FLAG_ALLOC | ELFSection::FLAG_EXEC),
1941 zone);
1932 1942
1933 CreateSymbolsTable(desc, &elf, text_section_index); 1943 CreateSymbolsTable(desc, &elf, text_section_index);
1934 1944
1935 CreateDWARFSections(desc, &elf); 1945 CreateDWARFSections(desc, &elf);
1936 1946
1937 elf.Write(&w); 1947 elf.Write(&w);
1938 #endif 1948 #endif
1939 1949
1940 return CreateCodeEntry(w.buffer(), w.position()); 1950 return CreateCodeEntry(w.buffer(), w.position());
1941 } 1951 }
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
2150 ScopedLock lock(mutex.Pointer()); 2160 ScopedLock lock(mutex.Pointer());
2151 ASSERT(!IsLineInfoTagged(line_info)); 2161 ASSERT(!IsLineInfoTagged(line_info));
2152 HashMap::Entry* e = GetEntries()->Lookup(code, HashForCodeObject(code), true); 2162 HashMap::Entry* e = GetEntries()->Lookup(code, HashForCodeObject(code), true);
2153 ASSERT(e->value == NULL); 2163 ASSERT(e->value == NULL);
2154 e->value = TagLineInfo(line_info); 2164 e->value = TagLineInfo(line_info);
2155 } 2165 }
2156 2166
2157 2167
2158 } } // namespace v8::internal 2168 } } // namespace v8::internal
2159 #endif 2169 #endif
OLDNEW
« no previous file with comments | « no previous file | src/mark-compact.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698