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

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

Issue 18014003: Add X32 port into V8 (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 7 years, 5 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
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 507 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 518
519 private: 519 private:
520 struct MachOHeader { 520 struct MachOHeader {
521 uint32_t magic; 521 uint32_t magic;
522 uint32_t cputype; 522 uint32_t cputype;
523 uint32_t cpusubtype; 523 uint32_t cpusubtype;
524 uint32_t filetype; 524 uint32_t filetype;
525 uint32_t ncmds; 525 uint32_t ncmds;
526 uint32_t sizeofcmds; 526 uint32_t sizeofcmds;
527 uint32_t flags; 527 uint32_t flags;
528 #if V8_TARGET_ARCH_X64 528 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_X32
529 uint32_t reserved; 529 uint32_t reserved;
530 #endif 530 #endif
531 }; 531 };
532 532
533 struct MachOSegmentCommand { 533 struct MachOSegmentCommand {
534 uint32_t cmd; 534 uint32_t cmd;
535 uint32_t cmdsize; 535 uint32_t cmdsize;
536 char segname[16]; 536 char segname[16];
537 #if V8_TARGET_ARCH_IA32 537 #if V8_TARGET_ARCH_IA32
538 uint32_t vmaddr; 538 uint32_t vmaddr;
(...skipping 18 matching lines...) Expand all
557 }; 557 };
558 558
559 559
560 Writer::Slot<MachOHeader> WriteHeader(Writer* w) { 560 Writer::Slot<MachOHeader> WriteHeader(Writer* w) {
561 ASSERT(w->position() == 0); 561 ASSERT(w->position() == 0);
562 Writer::Slot<MachOHeader> header = w->CreateSlotHere<MachOHeader>(); 562 Writer::Slot<MachOHeader> header = w->CreateSlotHere<MachOHeader>();
563 #if V8_TARGET_ARCH_IA32 563 #if V8_TARGET_ARCH_IA32
564 header->magic = 0xFEEDFACEu; 564 header->magic = 0xFEEDFACEu;
565 header->cputype = 7; // i386 565 header->cputype = 7; // i386
566 header->cpusubtype = 3; // CPU_SUBTYPE_I386_ALL 566 header->cpusubtype = 3; // CPU_SUBTYPE_I386_ALL
567 #elif V8_TARGET_ARCH_X64 567 #elif V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_X32
568 header->magic = 0xFEEDFACFu; 568 header->magic = 0xFEEDFACFu;
569 header->cputype = 7 | 0x01000000; // i386 | 64-bit ABI 569 header->cputype = 7 | 0x01000000; // i386 | 64-bit ABI
570 header->cpusubtype = 3; // CPU_SUBTYPE_I386_ALL 570 header->cpusubtype = 3; // CPU_SUBTYPE_I386_ALL
571 header->reserved = 0; 571 header->reserved = 0;
572 #else 572 #else
573 #error Unsupported target architecture. 573 #error Unsupported target architecture.
574 #endif 574 #endif
575 header->filetype = 0x1; // MH_OBJECT 575 header->filetype = 0x1; // MH_OBJECT
576 header->ncmds = 1; 576 header->ncmds = 1;
577 header->sizeofcmds = 0; 577 header->sizeofcmds = 0;
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
665 uint16_t pht_entry_num; 665 uint16_t pht_entry_num;
666 uint16_t sht_entry_size; 666 uint16_t sht_entry_size;
667 uint16_t sht_entry_num; 667 uint16_t sht_entry_num;
668 uint16_t sht_strtab_index; 668 uint16_t sht_strtab_index;
669 }; 669 };
670 670
671 671
672 void WriteHeader(Writer* w) { 672 void WriteHeader(Writer* w) {
673 ASSERT(w->position() == 0); 673 ASSERT(w->position() == 0);
674 Writer::Slot<ELFHeader> header = w->CreateSlotHere<ELFHeader>(); 674 Writer::Slot<ELFHeader> header = w->CreateSlotHere<ELFHeader>();
675 #if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM 675 #if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X32
676 const uint8_t ident[16] = 676 const uint8_t ident[16] =
677 { 0x7f, 'E', 'L', 'F', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 677 { 0x7f, 'E', 'L', 'F', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0};
678 #elif V8_TARGET_ARCH_X64 678 #elif V8_TARGET_ARCH_X64
679 const uint8_t ident[16] = 679 const uint8_t ident[16] =
680 { 0x7f, 'E', 'L', 'F', 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 680 { 0x7f, 'E', 'L', 'F', 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0};
681 #else 681 #else
682 #error Unsupported target architecture. 682 #error Unsupported target architecture.
683 #endif 683 #endif
684 OS::MemCopy(header->ident, ident, 16); 684 OS::MemCopy(header->ident, ident, 16);
685 header->type = 1; 685 header->type = 1;
686 #if V8_TARGET_ARCH_IA32 686 #if V8_TARGET_ARCH_IA32
687 header->machine = 3; 687 header->machine = 3;
688 #elif V8_TARGET_ARCH_X64 688 #elif V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_X32
689 // Processor identification value for x64 is 62 as defined in 689 // Processor identification value for x64 is 62 as defined in
690 // System V ABI, AMD64 Supplement 690 // System V ABI, AMD64 Supplement
691 // http://www.x86-64.org/documentation/abi.pdf 691 // http://www.x86-64.org/documentation/abi.pdf
692 header->machine = 62; 692 header->machine = 62;
693 #elif V8_TARGET_ARCH_ARM 693 #elif V8_TARGET_ARCH_ARM
694 // Set to EM_ARM, defined as 40, in "ARM ELF File Format" at 694 // Set to EM_ARM, defined as 40, in "ARM ELF File Format" at
695 // infocenter.arm.com/help/topic/com.arm.doc.dui0101a/DUI0101A_Elf.pdf 695 // infocenter.arm.com/help/topic/com.arm.doc.dui0101a/DUI0101A_Elf.pdf
696 header->machine = 40; 696 header->machine = 40;
697 #else 697 #else
698 #error Unsupported target architecture. 698 #error Unsupported target architecture.
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
778 value(value), 778 value(value),
779 size(size), 779 size(size),
780 info((binding << 4) | type), 780 info((binding << 4) | type),
781 other(0), 781 other(0),
782 section(section) { 782 section(section) {
783 } 783 }
784 784
785 Binding binding() const { 785 Binding binding() const {
786 return static_cast<Binding>(info >> 4); 786 return static_cast<Binding>(info >> 4);
787 } 787 }
788 #if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM 788 #if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X32
789 struct SerializedLayout { 789 struct SerializedLayout {
790 SerializedLayout(uint32_t name, 790 SerializedLayout(uint32_t name,
791 uintptr_t value, 791 uintptr_t value,
792 uintptr_t size, 792 uintptr_t size,
793 Binding binding, 793 Binding binding,
794 Type type, 794 Type type,
795 uint16_t section) 795 uint16_t section)
796 : name(name), 796 : name(name),
797 value(value), 797 value(value),
798 size(size), 798 size(size),
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
915 } 915 }
916 916
917 ZoneList<ELFSymbol> locals_; 917 ZoneList<ELFSymbol> locals_;
918 ZoneList<ELFSymbol> globals_; 918 ZoneList<ELFSymbol> globals_;
919 }; 919 };
920 #endif // defined(__ELF) 920 #endif // defined(__ELF)
921 921
922 922
923 class CodeDescription BASE_EMBEDDED { 923 class CodeDescription BASE_EMBEDDED {
924 public: 924 public:
925 #if V8_TARGET_ARCH_X64 925 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_X32
926 enum StackState { 926 enum StackState {
927 POST_RBP_PUSH, 927 POST_RBP_PUSH,
928 POST_RBP_SET, 928 POST_RBP_SET,
929 POST_RBP_POP, 929 POST_RBP_POP,
930 STACK_STATE_MAX 930 STACK_STATE_MAX
931 }; 931 };
932 #endif 932 #endif
933 933
934 CodeDescription(const char* name, 934 CodeDescription(const char* name,
935 Code* code, 935 Code* code,
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
978 } 978 }
979 979
980 bool IsLineInfoAvailable() { 980 bool IsLineInfoAvailable() {
981 return !script_.is_null() && 981 return !script_.is_null() &&
982 script_->source()->IsString() && 982 script_->source()->IsString() &&
983 script_->HasValidSource() && 983 script_->HasValidSource() &&
984 script_->name()->IsString() && 984 script_->name()->IsString() &&
985 lineinfo_ != NULL; 985 lineinfo_ != NULL;
986 } 986 }
987 987
988 #if V8_TARGET_ARCH_X64 988 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_X32
989 uintptr_t GetStackStateStartAddress(StackState state) const { 989 uintptr_t GetStackStateStartAddress(StackState state) const {
990 ASSERT(state < STACK_STATE_MAX); 990 ASSERT(state < STACK_STATE_MAX);
991 return stack_state_start_addresses_[state]; 991 return stack_state_start_addresses_[state];
992 } 992 }
993 993
994 void SetStackStateStartAddress(StackState state, uintptr_t addr) { 994 void SetStackStateStartAddress(StackState state, uintptr_t addr) {
995 ASSERT(state < STACK_STATE_MAX); 995 ASSERT(state < STACK_STATE_MAX);
996 stack_state_start_addresses_[state] = addr; 996 stack_state_start_addresses_[state] = addr;
997 } 997 }
998 #endif 998 #endif
999 999
1000 SmartArrayPointer<char> GetFilename() { 1000 SmartArrayPointer<char> GetFilename() {
1001 return String::cast(script_->name())->ToCString(); 1001 return String::cast(script_->name())->ToCString();
1002 } 1002 }
1003 1003
1004 int GetScriptLineNumber(int pos) { 1004 int GetScriptLineNumber(int pos) {
1005 return GetScriptLineNumberSafe(script_, pos) + 1; 1005 return GetScriptLineNumberSafe(script_, pos) + 1;
1006 } 1006 }
1007 1007
1008 1008
1009 private: 1009 private:
1010 const char* name_; 1010 const char* name_;
1011 Code* code_; 1011 Code* code_;
1012 Handle<Script> script_; 1012 Handle<Script> script_;
1013 GDBJITLineInfo* lineinfo_; 1013 GDBJITLineInfo* lineinfo_;
1014 GDBJITInterface::CodeTag tag_; 1014 GDBJITInterface::CodeTag tag_;
1015 CompilationInfo* info_; 1015 CompilationInfo* info_;
1016 #if V8_TARGET_ARCH_X64 1016 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_X32
1017 uintptr_t stack_state_start_addresses_[STACK_STATE_MAX]; 1017 uintptr_t stack_state_start_addresses_[STACK_STATE_MAX];
1018 #endif 1018 #endif
1019 }; 1019 };
1020 1020
1021 #if defined(__ELF) 1021 #if defined(__ELF)
1022 static void CreateSymbolsTable(CodeDescription* desc, 1022 static void CreateSymbolsTable(CodeDescription* desc,
1023 Zone* zone, 1023 Zone* zone,
1024 ELF* elf, 1024 ELF* elf,
1025 int text_section_index) { 1025 int text_section_index) {
1026 ELFSymbolTable* symtab = new(zone) ELFSymbolTable(".symtab", zone); 1026 ELFSymbolTable* symtab = new(zone) ELFSymbolTable(".symtab", zone);
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1102 if (desc_->IsInfoAvailable()) { 1102 if (desc_->IsInfoAvailable()) {
1103 Scope* scope = desc_->info()->scope(); 1103 Scope* scope = desc_->info()->scope();
1104 w->WriteULEB128(2); 1104 w->WriteULEB128(2);
1105 w->WriteString(desc_->name()); 1105 w->WriteString(desc_->name());
1106 w->Write<intptr_t>(desc_->CodeStart()); 1106 w->Write<intptr_t>(desc_->CodeStart());
1107 w->Write<intptr_t>(desc_->CodeStart() + desc_->CodeSize()); 1107 w->Write<intptr_t>(desc_->CodeStart() + desc_->CodeSize());
1108 Writer::Slot<uint32_t> fb_block_size = w->CreateSlotHere<uint32_t>(); 1108 Writer::Slot<uint32_t> fb_block_size = w->CreateSlotHere<uint32_t>();
1109 uintptr_t fb_block_start = w->position(); 1109 uintptr_t fb_block_start = w->position();
1110 #if V8_TARGET_ARCH_IA32 1110 #if V8_TARGET_ARCH_IA32
1111 w->Write<uint8_t>(DW_OP_reg5); // The frame pointer's here on ia32 1111 w->Write<uint8_t>(DW_OP_reg5); // The frame pointer's here on ia32
1112 #elif V8_TARGET_ARCH_X64 1112 #elif V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_X32
1113 w->Write<uint8_t>(DW_OP_reg6); // and here on x64. 1113 w->Write<uint8_t>(DW_OP_reg6); // and here on x64.
1114 #elif V8_TARGET_ARCH_ARM 1114 #elif V8_TARGET_ARCH_ARM
1115 UNIMPLEMENTED(); 1115 UNIMPLEMENTED();
1116 #elif V8_TARGET_ARCH_MIPS 1116 #elif V8_TARGET_ARCH_MIPS
1117 UNIMPLEMENTED(); 1117 UNIMPLEMENTED();
1118 #else 1118 #else
1119 #error Unsupported target architecture. 1119 #error Unsupported target architecture.
1120 #endif 1120 #endif
1121 fb_block_size.set(static_cast<uint32_t>(w->position() - fb_block_start)); 1121 fb_block_size.set(static_cast<uint32_t>(w->position() - fb_block_start));
1122 1122
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
1557 return +1; 1557 return +1;
1558 } else { 1558 } else {
1559 return -1; 1559 return -1;
1560 } 1560 }
1561 } 1561 }
1562 1562
1563 CodeDescription* desc_; 1563 CodeDescription* desc_;
1564 }; 1564 };
1565 1565
1566 1566
1567 #if V8_TARGET_ARCH_X64 1567 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_X32
1568 1568
1569 class UnwindInfoSection : public DebugSection { 1569 class UnwindInfoSection : public DebugSection {
1570 public: 1570 public:
1571 explicit UnwindInfoSection(CodeDescription* desc); 1571 explicit UnwindInfoSection(CodeDescription* desc);
1572 virtual bool WriteBodyInternal(Writer* w); 1572 virtual bool WriteBodyInternal(Writer* w);
1573 1573
1574 int WriteCIE(Writer* w); 1574 int WriteCIE(Writer* w);
1575 void WriteFDE(Writer* w, int); 1575 void WriteFDE(Writer* w, int);
1576 1576
1577 void WriteFDEStateOnEntry(Writer* w); 1577 void WriteFDEStateOnEntry(Writer* w);
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
1781 } 1781 }
1782 1782
1783 1783
1784 bool UnwindInfoSection::WriteBodyInternal(Writer* w) { 1784 bool UnwindInfoSection::WriteBodyInternal(Writer* w) {
1785 uint32_t cie_position = WriteCIE(w); 1785 uint32_t cie_position = WriteCIE(w);
1786 WriteFDE(w, cie_position); 1786 WriteFDE(w, cie_position);
1787 return true; 1787 return true;
1788 } 1788 }
1789 1789
1790 1790
1791 #endif // V8_TARGET_ARCH_X64 1791 #endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_X32
1792 1792
1793 static void CreateDWARFSections(CodeDescription* desc, 1793 static void CreateDWARFSections(CodeDescription* desc,
1794 Zone* zone, 1794 Zone* zone,
1795 DebugObject* obj) { 1795 DebugObject* obj) {
1796 if (desc->IsLineInfoAvailable()) { 1796 if (desc->IsLineInfoAvailable()) {
1797 obj->AddSection(new(zone) DebugInfoSection(desc)); 1797 obj->AddSection(new(zone) DebugInfoSection(desc));
1798 obj->AddSection(new(zone) DebugAbbrevSection(desc)); 1798 obj->AddSection(new(zone) DebugAbbrevSection(desc));
1799 obj->AddSection(new(zone) DebugLineSection(desc)); 1799 obj->AddSection(new(zone) DebugLineSection(desc));
1800 } 1800 }
1801 #if V8_TARGET_ARCH_X64 1801 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_X32
1802 obj->AddSection(new(zone) UnwindInfoSection(desc)); 1802 obj->AddSection(new(zone) UnwindInfoSection(desc));
1803 #endif 1803 #endif
1804 } 1804 }
1805 1805
1806 1806
1807 // ------------------------------------------------------------------- 1807 // -------------------------------------------------------------------
1808 // Binary GDB JIT Interface as described in 1808 // Binary GDB JIT Interface as described in
1809 // http://sourceware.org/gdb/onlinedocs/gdb/Declarations.html 1809 // http://sourceware.org/gdb/onlinedocs/gdb/Declarations.html
1810 extern "C" { 1810 extern "C" {
1811 typedef enum { 1811 typedef enum {
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
2009 if (!name.is_null() && name->IsString()) { 2009 if (!name.is_null() && name->IsString()) {
2010 SmartArrayPointer<char> name_cstring = 2010 SmartArrayPointer<char> name_cstring =
2011 Handle<String>::cast(name)->ToCString(DISALLOW_NULLS); 2011 Handle<String>::cast(name)->ToCString(DISALLOW_NULLS);
2012 AddCode(*name_cstring, *code, GDBJITInterface::FUNCTION, *script, info); 2012 AddCode(*name_cstring, *code, GDBJITInterface::FUNCTION, *script, info);
2013 } else { 2013 } else {
2014 AddCode("", *code, GDBJITInterface::FUNCTION, *script, info); 2014 AddCode("", *code, GDBJITInterface::FUNCTION, *script, info);
2015 } 2015 }
2016 } 2016 }
2017 2017
2018 static void AddUnwindInfo(CodeDescription* desc) { 2018 static void AddUnwindInfo(CodeDescription* desc) {
2019 #if V8_TARGET_ARCH_X64 2019 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_X32
2020 if (desc->tag() == GDBJITInterface::FUNCTION) { 2020 if (desc->tag() == GDBJITInterface::FUNCTION) {
2021 // To avoid propagating unwinding information through 2021 // To avoid propagating unwinding information through
2022 // compilation pipeline we use an approximation. 2022 // compilation pipeline we use an approximation.
2023 // For most use cases this should not affect usability. 2023 // For most use cases this should not affect usability.
2024 static const int kFramePointerPushOffset = 1; 2024 static const int kFramePointerPushOffset = 1;
2025 static const int kFramePointerSetOffset = 4; 2025 static const int kFramePointerSetOffset = 4;
2026 static const int kFramePointerPopOffset = -3; 2026 static const int kFramePointerPopOffset = -3;
2027 2027
2028 uintptr_t frame_pointer_push_address = 2028 uintptr_t frame_pointer_push_address =
2029 desc->CodeStart() + kFramePointerPushOffset; 2029 desc->CodeStart() + kFramePointerPushOffset;
(...skipping 11 matching lines...) Expand all
2041 desc->SetStackStateStartAddress(CodeDescription::POST_RBP_POP, 2041 desc->SetStackStateStartAddress(CodeDescription::POST_RBP_POP,
2042 frame_pointer_pop_address); 2042 frame_pointer_pop_address);
2043 } else { 2043 } else {
2044 desc->SetStackStateStartAddress(CodeDescription::POST_RBP_PUSH, 2044 desc->SetStackStateStartAddress(CodeDescription::POST_RBP_PUSH,
2045 desc->CodeStart()); 2045 desc->CodeStart());
2046 desc->SetStackStateStartAddress(CodeDescription::POST_RBP_SET, 2046 desc->SetStackStateStartAddress(CodeDescription::POST_RBP_SET,
2047 desc->CodeStart()); 2047 desc->CodeStart());
2048 desc->SetStackStateStartAddress(CodeDescription::POST_RBP_POP, 2048 desc->SetStackStateStartAddress(CodeDescription::POST_RBP_POP,
2049 desc->CodeEnd()); 2049 desc->CodeEnd());
2050 } 2050 }
2051 #endif // V8_TARGET_ARCH_X64 2051 #endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_X32
2052 } 2052 }
2053 2053
2054 2054
2055 static LazyMutex mutex = LAZY_MUTEX_INITIALIZER; 2055 static LazyMutex mutex = LAZY_MUTEX_INITIALIZER;
2056 2056
2057 2057
2058 void GDBJITInterface::AddCode(const char* name, 2058 void GDBJITInterface::AddCode(const char* name,
2059 Code* code, 2059 Code* code,
2060 GDBJITInterface::CodeTag tag, 2060 GDBJITInterface::CodeTag tag,
2061 Script* script, 2061 Script* script,
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
2189 ScopedLock lock(mutex.Pointer()); 2189 ScopedLock lock(mutex.Pointer());
2190 ASSERT(!IsLineInfoTagged(line_info)); 2190 ASSERT(!IsLineInfoTagged(line_info));
2191 HashMap::Entry* e = GetEntries()->Lookup(code, HashForCodeObject(code), true); 2191 HashMap::Entry* e = GetEntries()->Lookup(code, HashForCodeObject(code), true);
2192 ASSERT(e->value == NULL); 2192 ASSERT(e->value == NULL);
2193 e->value = TagLineInfo(line_info); 2193 e->value = TagLineInfo(line_info);
2194 } 2194 }
2195 2195
2196 2196
2197 } } // namespace v8::internal 2197 } } // namespace v8::internal
2198 #endif 2198 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698