OLD | NEW |
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 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 ASSERT(offset < capacity_ && offset + sizeof(T) <= capacity_); | 180 ASSERT(offset < capacity_ && offset + sizeof(T) <= capacity_); |
181 return reinterpret_cast<T*>(&buffer_[offset]); | 181 return reinterpret_cast<T*>(&buffer_[offset]); |
182 } | 182 } |
183 | 183 |
184 DebugObject* debug_object_; | 184 DebugObject* debug_object_; |
185 uintptr_t position_; | 185 uintptr_t position_; |
186 uintptr_t capacity_; | 186 uintptr_t capacity_; |
187 byte* buffer_; | 187 byte* buffer_; |
188 }; | 188 }; |
189 | 189 |
190 class StringTable; | 190 class ELFStringTable; |
191 | 191 |
192 template<typename THeader> | 192 template<typename THeader> |
193 class DebugSectionBase : public ZoneObject { | 193 class DebugSectionBase : public ZoneObject { |
194 public: | 194 public: |
195 virtual ~DebugSectionBase() { } | 195 virtual ~DebugSectionBase() { } |
196 | 196 |
197 virtual void WriteBody(Writer::Slot<THeader> header, Writer* writer) { | 197 virtual void WriteBody(Writer::Slot<THeader> header, Writer* writer) { |
198 uintptr_t start = writer->position(); | 198 uintptr_t start = writer->position(); |
199 if (WriteBodyInternal(writer)) { | 199 if (WriteBodyInternal(writer)) { |
200 uintptr_t end = writer->position(); | 200 uintptr_t end = writer->position(); |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 | 331 |
332 enum SpecialIndexes { | 332 enum SpecialIndexes { |
333 INDEX_ABSOLUTE = 0xfff1 | 333 INDEX_ABSOLUTE = 0xfff1 |
334 }; | 334 }; |
335 | 335 |
336 ELFSection(const char* name, Type type, uintptr_t align) | 336 ELFSection(const char* name, Type type, uintptr_t align) |
337 : name_(name), type_(type), align_(align) { } | 337 : name_(name), type_(type), align_(align) { } |
338 | 338 |
339 virtual ~ELFSection() { } | 339 virtual ~ELFSection() { } |
340 | 340 |
341 void PopulateHeader(Writer::Slot<Header> header, StringTable* strtab); | 341 void PopulateHeader(Writer::Slot<Header> header, ELFStringTable* strtab); |
342 | 342 |
343 virtual void WriteBody(Writer::Slot<Header> header, Writer* w) { | 343 virtual void WriteBody(Writer::Slot<Header> header, Writer* w) { |
344 uintptr_t start = w->position(); | 344 uintptr_t start = w->position(); |
345 if (WriteBodyInternal(w)) { | 345 if (WriteBodyInternal(w)) { |
346 uintptr_t end = w->position(); | 346 uintptr_t end = w->position(); |
347 header->offset = start; | 347 header->offset = start; |
348 header->size = end - start; | 348 header->size = end - start; |
349 } | 349 } |
350 } | 350 } |
351 | 351 |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
431 } | 431 } |
432 | 432 |
433 private: | 433 private: |
434 uintptr_t addr_; | 434 uintptr_t addr_; |
435 uintptr_t offset_; | 435 uintptr_t offset_; |
436 uintptr_t size_; | 436 uintptr_t size_; |
437 uintptr_t flags_; | 437 uintptr_t flags_; |
438 }; | 438 }; |
439 | 439 |
440 | 440 |
441 class StringTable : public ELFSection { | 441 class ELFStringTable : public ELFSection { |
442 public: | 442 public: |
443 explicit StringTable(const char* name) | 443 explicit ELFStringTable(const char* name) |
444 : ELFSection(name, TYPE_STRTAB, 1), writer_(NULL), offset_(0), size_(0) { | 444 : ELFSection(name, TYPE_STRTAB, 1), writer_(NULL), offset_(0), size_(0) { |
445 } | 445 } |
446 | 446 |
447 uintptr_t Add(const char* str) { | 447 uintptr_t Add(const char* str) { |
448 if (*str == '\0') return 0; | 448 if (*str == '\0') return 0; |
449 | 449 |
450 uintptr_t offset = size_; | 450 uintptr_t offset = size_; |
451 WriteString(str); | 451 WriteString(str); |
452 return offset; | 452 return offset; |
453 } | 453 } |
(...skipping 27 matching lines...) Expand all Loading... |
481 } | 481 } |
482 | 482 |
483 Writer* writer_; | 483 Writer* writer_; |
484 | 484 |
485 uintptr_t offset_; | 485 uintptr_t offset_; |
486 uintptr_t size_; | 486 uintptr_t size_; |
487 }; | 487 }; |
488 | 488 |
489 | 489 |
490 void ELFSection::PopulateHeader(Writer::Slot<ELFSection::Header> header, | 490 void ELFSection::PopulateHeader(Writer::Slot<ELFSection::Header> header, |
491 StringTable* strtab) { | 491 ELFStringTable* strtab) { |
492 header->name = strtab->Add(name_); | 492 header->name = strtab->Add(name_); |
493 header->type = type_; | 493 header->type = type_; |
494 header->alignment = align_; | 494 header->alignment = align_; |
495 PopulateHeader(header); | 495 PopulateHeader(header); |
496 } | 496 } |
497 #endif // defined(__ELF) | 497 #endif // defined(__ELF) |
498 | 498 |
499 | 499 |
500 #if defined(__MACH_O) | 500 #if defined(__MACH_O) |
501 class MachO BASE_EMBEDDED { | 501 class MachO BASE_EMBEDDED { |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
624 ZoneList<MachOSection*> sections_; | 624 ZoneList<MachOSection*> sections_; |
625 }; | 625 }; |
626 #endif // defined(__MACH_O) | 626 #endif // defined(__MACH_O) |
627 | 627 |
628 | 628 |
629 #if defined(__ELF) | 629 #if defined(__ELF) |
630 class ELF BASE_EMBEDDED { | 630 class ELF BASE_EMBEDDED { |
631 public: | 631 public: |
632 ELF(Zone* zone) : sections_(6, zone) { | 632 ELF(Zone* zone) : sections_(6, zone) { |
633 sections_.Add(new(zone) ELFSection("", ELFSection::TYPE_NULL, 0), zone); | 633 sections_.Add(new(zone) ELFSection("", ELFSection::TYPE_NULL, 0), zone); |
634 sections_.Add(new(zone) StringTable(".shstrtab"), zone); | 634 sections_.Add(new(zone) ELFStringTable(".shstrtab"), zone); |
635 } | 635 } |
636 | 636 |
637 void Write(Writer* w) { | 637 void Write(Writer* w) { |
638 WriteHeader(w); | 638 WriteHeader(w); |
639 WriteSectionTable(w); | 639 WriteSectionTable(w); |
640 WriteSections(w); | 640 WriteSections(w); |
641 } | 641 } |
642 | 642 |
643 ELFSection* SectionAt(uint32_t index) { | 643 ELFSection* SectionAt(uint32_t index) { |
644 return sections_[index]; | 644 return sections_[index]; |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
711 } | 711 } |
712 | 712 |
713 void WriteSectionTable(Writer* w) { | 713 void WriteSectionTable(Writer* w) { |
714 // Section headers table immediately follows file header. | 714 // Section headers table immediately follows file header. |
715 ASSERT(w->position() == sizeof(ELFHeader)); | 715 ASSERT(w->position() == sizeof(ELFHeader)); |
716 | 716 |
717 Writer::Slot<ELFSection::Header> headers = | 717 Writer::Slot<ELFSection::Header> headers = |
718 w->CreateSlotsHere<ELFSection::Header>(sections_.length()); | 718 w->CreateSlotsHere<ELFSection::Header>(sections_.length()); |
719 | 719 |
720 // String table for section table is the first section. | 720 // String table for section table is the first section. |
721 StringTable* strtab = static_cast<StringTable*>(SectionAt(1)); | 721 ELFStringTable* strtab = static_cast<ELFStringTable*>(SectionAt(1)); |
722 strtab->AttachWriter(w); | 722 strtab->AttachWriter(w); |
723 for (int i = 0, length = sections_.length(); | 723 for (int i = 0, length = sections_.length(); |
724 i < length; | 724 i < length; |
725 i++) { | 725 i++) { |
726 sections_[i]->PopulateHeader(headers.at(i), strtab); | 726 sections_[i]->PopulateHeader(headers.at(i), strtab); |
727 } | 727 } |
728 strtab->DetachWriter(); | 728 strtab->DetachWriter(); |
729 } | 729 } |
730 | 730 |
731 int SectionHeaderPosition(uint32_t section_index) { | 731 int SectionHeaderPosition(uint32_t section_index) { |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
825 | 825 |
826 uint32_t name; | 826 uint32_t name; |
827 uint8_t info; | 827 uint8_t info; |
828 uint8_t other; | 828 uint8_t other; |
829 uint16_t section; | 829 uint16_t section; |
830 uintptr_t value; | 830 uintptr_t value; |
831 uintptr_t size; | 831 uintptr_t size; |
832 }; | 832 }; |
833 #endif | 833 #endif |
834 | 834 |
835 void Write(Writer::Slot<SerializedLayout> s, StringTable* t) { | 835 void Write(Writer::Slot<SerializedLayout> s, ELFStringTable* t) { |
836 // Convert symbol names from strings to indexes in the string table. | 836 // Convert symbol names from strings to indexes in the string table. |
837 s->name = t->Add(name); | 837 s->name = t->Add(name); |
838 s->value = value; | 838 s->value = value; |
839 s->size = size; | 839 s->size = size; |
840 s->info = info; | 840 s->info = info; |
841 s->other = other; | 841 s->other = other; |
842 s->section = section; | 842 s->section = section; |
843 } | 843 } |
844 | 844 |
845 private: | 845 private: |
(...skipping 18 matching lines...) Expand all Loading... |
864 w->Align(header->alignment); | 864 w->Align(header->alignment); |
865 int total_symbols = locals_.length() + globals_.length() + 1; | 865 int total_symbols = locals_.length() + globals_.length() + 1; |
866 header->offset = w->position(); | 866 header->offset = w->position(); |
867 | 867 |
868 Writer::Slot<ELFSymbol::SerializedLayout> symbols = | 868 Writer::Slot<ELFSymbol::SerializedLayout> symbols = |
869 w->CreateSlotsHere<ELFSymbol::SerializedLayout>(total_symbols); | 869 w->CreateSlotsHere<ELFSymbol::SerializedLayout>(total_symbols); |
870 | 870 |
871 header->size = w->position() - header->offset; | 871 header->size = w->position() - header->offset; |
872 | 872 |
873 // 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. |
874 StringTable* strtab = | 874 ELFStringTable* strtab = |
875 static_cast<StringTable*>(w->debug_object()->SectionAt(index() + 1)); | 875 static_cast<ELFStringTable*>(w->debug_object()->SectionAt(index() + 1)); |
876 strtab->AttachWriter(w); | 876 strtab->AttachWriter(w); |
877 symbols.at(0).set(ELFSymbol::SerializedLayout(0, | 877 symbols.at(0).set(ELFSymbol::SerializedLayout(0, |
878 0, | 878 0, |
879 0, | 879 0, |
880 ELFSymbol::BIND_LOCAL, | 880 ELFSymbol::BIND_LOCAL, |
881 ELFSymbol::TYPE_NOTYPE, | 881 ELFSymbol::TYPE_NOTYPE, |
882 0)); | 882 0)); |
883 WriteSymbolsList(&locals_, symbols.at(1), strtab); | 883 WriteSymbolsList(&locals_, symbols.at(1), strtab); |
884 WriteSymbolsList(&globals_, symbols.at(locals_.length() + 1), strtab); | 884 WriteSymbolsList(&globals_, symbols.at(locals_.length() + 1), strtab); |
885 strtab->DetachWriter(); | 885 strtab->DetachWriter(); |
(...skipping 12 matching lines...) Expand all Loading... |
898 ELFSection::PopulateHeader(header); | 898 ELFSection::PopulateHeader(header); |
899 // We are assuming that string table will follow symbol table. | 899 // We are assuming that string table will follow symbol table. |
900 header->link = index() + 1; | 900 header->link = index() + 1; |
901 header->info = locals_.length() + 1; | 901 header->info = locals_.length() + 1; |
902 header->entry_size = sizeof(ELFSymbol::SerializedLayout); | 902 header->entry_size = sizeof(ELFSymbol::SerializedLayout); |
903 } | 903 } |
904 | 904 |
905 private: | 905 private: |
906 void WriteSymbolsList(const ZoneList<ELFSymbol>* src, | 906 void WriteSymbolsList(const ZoneList<ELFSymbol>* src, |
907 Writer::Slot<ELFSymbol::SerializedLayout> dst, | 907 Writer::Slot<ELFSymbol::SerializedLayout> dst, |
908 StringTable* strtab) { | 908 ELFStringTable* strtab) { |
909 for (int i = 0, len = src->length(); | 909 for (int i = 0, len = src->length(); |
910 i < len; | 910 i < len; |
911 i++) { | 911 i++) { |
912 src->at(i).Write(dst.at(i), strtab); | 912 src->at(i).Write(dst.at(i), strtab); |
913 } | 913 } |
914 } | 914 } |
915 | 915 |
916 ZoneList<ELFSymbol> locals_; | 916 ZoneList<ELFSymbol> locals_; |
917 ZoneList<ELFSymbol> globals_; | 917 ZoneList<ELFSymbol> globals_; |
918 }; | 918 }; |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1016 uintptr_t stack_state_start_addresses_[STACK_STATE_MAX]; | 1016 uintptr_t stack_state_start_addresses_[STACK_STATE_MAX]; |
1017 #endif | 1017 #endif |
1018 }; | 1018 }; |
1019 | 1019 |
1020 #if defined(__ELF) | 1020 #if defined(__ELF) |
1021 static void CreateSymbolsTable(CodeDescription* desc, | 1021 static void CreateSymbolsTable(CodeDescription* desc, |
1022 ELF* elf, | 1022 ELF* elf, |
1023 int text_section_index) { | 1023 int text_section_index) { |
1024 Zone* zone = desc->info()->zone(); | 1024 Zone* zone = desc->info()->zone(); |
1025 ELFSymbolTable* symtab = new(zone) ELFSymbolTable(".symtab", zone); | 1025 ELFSymbolTable* symtab = new(zone) ELFSymbolTable(".symtab", zone); |
1026 StringTable* strtab = new(zone) StringTable(".strtab"); | 1026 ELFStringTable* strtab = new(zone) ELFStringTable(".strtab"); |
1027 | 1027 |
1028 // Symbol table should be followed by the linked string table. | 1028 // Symbol table should be followed by the linked string table. |
1029 elf->AddSection(symtab, zone); | 1029 elf->AddSection(symtab, zone); |
1030 elf->AddSection(strtab, zone); | 1030 elf->AddSection(strtab, zone); |
1031 | 1031 |
1032 symtab->Add(ELFSymbol("V8 Code", | 1032 symtab->Add(ELFSymbol("V8 Code", |
1033 0, | 1033 0, |
1034 0, | 1034 0, |
1035 ELFSymbol::BIND_LOCAL, | 1035 ELFSymbol::BIND_LOCAL, |
1036 ELFSymbol::TYPE_FILE, | 1036 ELFSymbol::TYPE_FILE, |
(...skipping 952 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1989 reinterpret_cast<intptr_t>(ptr) | kLineInfoTag); | 1989 reinterpret_cast<intptr_t>(ptr) | kLineInfoTag); |
1990 } | 1990 } |
1991 | 1991 |
1992 | 1992 |
1993 static GDBJITLineInfo* UntagLineInfo(void* ptr) { | 1993 static GDBJITLineInfo* UntagLineInfo(void* ptr) { |
1994 return reinterpret_cast<GDBJITLineInfo*>( | 1994 return reinterpret_cast<GDBJITLineInfo*>( |
1995 reinterpret_cast<intptr_t>(ptr) & ~kLineInfoTag); | 1995 reinterpret_cast<intptr_t>(ptr) & ~kLineInfoTag); |
1996 } | 1996 } |
1997 | 1997 |
1998 | 1998 |
1999 void GDBJITInterface::AddCode(Handle<String> name, | 1999 void GDBJITInterface::AddCode(Handle<Name> name, |
2000 Handle<Script> script, | 2000 Handle<Script> script, |
2001 Handle<Code> code, | 2001 Handle<Code> code, |
2002 CompilationInfo* info) { | 2002 CompilationInfo* info) { |
2003 if (!FLAG_gdbjit) return; | 2003 if (!FLAG_gdbjit) return; |
2004 | 2004 |
2005 // Force initialization of line_ends array. | 2005 // Force initialization of line_ends array. |
2006 GetScriptLineNumber(script, 0); | 2006 GetScriptLineNumber(script, 0); |
2007 | 2007 |
2008 if (!name.is_null()) { | 2008 if (!name.is_null() && name->IsString()) { |
2009 SmartArrayPointer<char> name_cstring = name->ToCString(DISALLOW_NULLS); | 2009 SmartArrayPointer<char> name_cstring = |
| 2010 Handle<String>::cast(name)->ToCString(DISALLOW_NULLS); |
2010 AddCode(*name_cstring, *code, GDBJITInterface::FUNCTION, *script, info); | 2011 AddCode(*name_cstring, *code, GDBJITInterface::FUNCTION, *script, info); |
2011 } else { | 2012 } else { |
2012 AddCode("", *code, GDBJITInterface::FUNCTION, *script, info); | 2013 AddCode("", *code, GDBJITInterface::FUNCTION, *script, info); |
2013 } | 2014 } |
2014 } | 2015 } |
2015 | 2016 |
2016 static void AddUnwindInfo(CodeDescription* desc) { | 2017 static void AddUnwindInfo(CodeDescription* desc) { |
2017 #ifdef V8_TARGET_ARCH_X64 | 2018 #ifdef V8_TARGET_ARCH_X64 |
2018 if (desc->tag() == GDBJITInterface::FUNCTION) { | 2019 if (desc->tag() == GDBJITInterface::FUNCTION) { |
2019 // To avoid propagating unwinding information through | 2020 // To avoid propagating unwinding information through |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2117 builder.AddString(name); | 2118 builder.AddString(name); |
2118 } else { | 2119 } else { |
2119 builder.AddFormatted(": code object %p", static_cast<void*>(code)); | 2120 builder.AddFormatted(": code object %p", static_cast<void*>(code)); |
2120 } | 2121 } |
2121 | 2122 |
2122 AddCode(builder.Finalize(), code, tag, NULL, NULL); | 2123 AddCode(builder.Finalize(), code, tag, NULL, NULL); |
2123 } | 2124 } |
2124 | 2125 |
2125 | 2126 |
2126 void GDBJITInterface::AddCode(GDBJITInterface::CodeTag tag, | 2127 void GDBJITInterface::AddCode(GDBJITInterface::CodeTag tag, |
2127 String* name, | 2128 Name* name, |
2128 Code* code) { | 2129 Code* code) { |
2129 if (!FLAG_gdbjit) return; | 2130 if (!FLAG_gdbjit) return; |
2130 AddCode(tag, name != NULL ? *name->ToCString(DISALLOW_NULLS) : NULL, code); | 2131 if (name != NULL && name->IsString()) { |
| 2132 AddCode(tag, *String::cast(name)->ToCString(DISALLOW_NULLS), code); |
| 2133 } else { |
| 2134 AddCode(tag, "", code); |
| 2135 } |
2131 } | 2136 } |
2132 | 2137 |
2133 | 2138 |
2134 void GDBJITInterface::AddCode(GDBJITInterface::CodeTag tag, Code* code) { | 2139 void GDBJITInterface::AddCode(GDBJITInterface::CodeTag tag, Code* code) { |
2135 if (!FLAG_gdbjit) return; | 2140 if (!FLAG_gdbjit) return; |
2136 | 2141 |
2137 AddCode(tag, "", code); | 2142 AddCode(tag, "", code); |
2138 } | 2143 } |
2139 | 2144 |
2140 | 2145 |
(...skipping 23 matching lines...) Expand all Loading... |
2164 ScopedLock lock(mutex.Pointer()); | 2169 ScopedLock lock(mutex.Pointer()); |
2165 ASSERT(!IsLineInfoTagged(line_info)); | 2170 ASSERT(!IsLineInfoTagged(line_info)); |
2166 HashMap::Entry* e = GetEntries()->Lookup(code, HashForCodeObject(code), true); | 2171 HashMap::Entry* e = GetEntries()->Lookup(code, HashForCodeObject(code), true); |
2167 ASSERT(e->value == NULL); | 2172 ASSERT(e->value == NULL); |
2168 e->value = TagLineInfo(line_info); | 2173 e->value = TagLineInfo(line_info); |
2169 } | 2174 } |
2170 | 2175 |
2171 | 2176 |
2172 } } // namespace v8::internal | 2177 } } // namespace v8::internal |
2173 #endif | 2178 #endif |
OLD | NEW |