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

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

Issue 9227007: Version 3.8.6 (Closed) Base URL: http://v8.googlecode.com/svn/trunk/
Patch Set: Created 8 years, 11 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 | « src/full-codegen.cc ('k') | src/handles.h » ('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 1538 matching lines...) Expand 10 before | Expand all | Expand 10 after
1549 } 1549 }
1550 1550
1551 CodeDescription* desc_; 1551 CodeDescription* desc_;
1552 }; 1552 };
1553 1553
1554 1554
1555 #ifdef V8_TARGET_ARCH_X64 1555 #ifdef V8_TARGET_ARCH_X64
1556 1556
1557 class UnwindInfoSection : public DebugSection { 1557 class UnwindInfoSection : public DebugSection {
1558 public: 1558 public:
1559 explicit UnwindInfoSection(CodeDescription *desc); 1559 explicit UnwindInfoSection(CodeDescription* desc);
1560 virtual bool WriteBody(Writer *w); 1560 virtual bool WriteBody(Writer* w);
1561 1561
1562 int WriteCIE(Writer *w); 1562 int WriteCIE(Writer* w);
1563 void WriteFDE(Writer *w, int); 1563 void WriteFDE(Writer* w, int);
1564 1564
1565 void WriteFDEStateOnEntry(Writer *w); 1565 void WriteFDEStateOnEntry(Writer* w);
1566 void WriteFDEStateAfterRBPPush(Writer *w); 1566 void WriteFDEStateAfterRBPPush(Writer* w);
1567 void WriteFDEStateAfterRBPSet(Writer *w); 1567 void WriteFDEStateAfterRBPSet(Writer* w);
1568 void WriteFDEStateAfterRBPPop(Writer *w); 1568 void WriteFDEStateAfterRBPPop(Writer* w);
1569 1569
1570 void WriteLength(Writer *w, 1570 void WriteLength(Writer* w,
1571 Writer::Slot<uint32_t>* length_slot, 1571 Writer::Slot<uint32_t>* length_slot,
1572 int initial_position); 1572 int initial_position);
1573 1573
1574 private: 1574 private:
1575 CodeDescription *desc_; 1575 CodeDescription* desc_;
1576 1576
1577 // DWARF3 Specification, Table 7.23 1577 // DWARF3 Specification, Table 7.23
1578 enum CFIInstructions { 1578 enum CFIInstructions {
1579 DW_CFA_ADVANCE_LOC = 0x40, 1579 DW_CFA_ADVANCE_LOC = 0x40,
1580 DW_CFA_OFFSET = 0x80, 1580 DW_CFA_OFFSET = 0x80,
1581 DW_CFA_RESTORE = 0xC0, 1581 DW_CFA_RESTORE = 0xC0,
1582 DW_CFA_NOP = 0x00, 1582 DW_CFA_NOP = 0x00,
1583 DW_CFA_SET_LOC = 0x01, 1583 DW_CFA_SET_LOC = 0x01,
1584 DW_CFA_ADVANCE_LOC1 = 0x02, 1584 DW_CFA_ADVANCE_LOC1 = 0x02,
1585 DW_CFA_ADVANCE_LOC2 = 0x03, 1585 DW_CFA_ADVANCE_LOC2 = 0x03,
(...skipping 30 matching lines...) Expand all
1616 enum CFIConstants { 1616 enum CFIConstants {
1617 CIE_ID = 0, 1617 CIE_ID = 0,
1618 CIE_VERSION = 1, 1618 CIE_VERSION = 1,
1619 CODE_ALIGN_FACTOR = 1, 1619 CODE_ALIGN_FACTOR = 1,
1620 DATA_ALIGN_FACTOR = 1, 1620 DATA_ALIGN_FACTOR = 1,
1621 RETURN_ADDRESS_REGISTER = AMD64_RA 1621 RETURN_ADDRESS_REGISTER = AMD64_RA
1622 }; 1622 };
1623 }; 1623 };
1624 1624
1625 1625
1626 void UnwindInfoSection::WriteLength(Writer *w, 1626 void UnwindInfoSection::WriteLength(Writer* w,
1627 Writer::Slot<uint32_t>* length_slot, 1627 Writer::Slot<uint32_t>* length_slot,
1628 int initial_position) { 1628 int initial_position) {
1629 uint32_t align = (w->position() - initial_position) % kPointerSize; 1629 uint32_t align = (w->position() - initial_position) % kPointerSize;
1630 1630
1631 if (align != 0) { 1631 if (align != 0) {
1632 for (uint32_t i = 0; i < (kPointerSize - align); i++) { 1632 for (uint32_t i = 0; i < (kPointerSize - align); i++) {
1633 w->Write<uint8_t>(DW_CFA_NOP); 1633 w->Write<uint8_t>(DW_CFA_NOP);
1634 } 1634 }
1635 } 1635 }
1636 1636
1637 ASSERT((w->position() - initial_position) % kPointerSize == 0); 1637 ASSERT((w->position() - initial_position) % kPointerSize == 0);
1638 length_slot->set(w->position() - initial_position); 1638 length_slot->set(w->position() - initial_position);
1639 } 1639 }
1640 1640
1641 1641
1642 UnwindInfoSection::UnwindInfoSection(CodeDescription *desc) 1642 UnwindInfoSection::UnwindInfoSection(CodeDescription* desc)
1643 #ifdef __ELF 1643 #ifdef __ELF
1644 : ELFSection(".eh_frame", TYPE_X86_64_UNWIND, 1), 1644 : ELFSection(".eh_frame", TYPE_X86_64_UNWIND, 1),
1645 #else 1645 #else
1646 : MachOSection("__eh_frame", "__TEXT", sizeof(uintptr_t), 1646 : MachOSection("__eh_frame", "__TEXT", sizeof(uintptr_t),
1647 MachOSection::S_REGULAR), 1647 MachOSection::S_REGULAR),
1648 #endif 1648 #endif
1649 desc_(desc) { } 1649 desc_(desc) { }
1650 1650
1651 int UnwindInfoSection::WriteCIE(Writer *w) { 1651 int UnwindInfoSection::WriteCIE(Writer* w) {
1652 Writer::Slot<uint32_t> cie_length_slot = w->CreateSlotHere<uint32_t>(); 1652 Writer::Slot<uint32_t> cie_length_slot = w->CreateSlotHere<uint32_t>();
1653 uint32_t cie_position = w->position(); 1653 uint32_t cie_position = w->position();
1654 1654
1655 // Write out the CIE header. Currently no 'common instructions' are 1655 // Write out the CIE header. Currently no 'common instructions' are
1656 // emitted onto the CIE; every FDE has its own set of instructions. 1656 // emitted onto the CIE; every FDE has its own set of instructions.
1657 1657
1658 w->Write<uint32_t>(CIE_ID); 1658 w->Write<uint32_t>(CIE_ID);
1659 w->Write<uint8_t>(CIE_VERSION); 1659 w->Write<uint8_t>(CIE_VERSION);
1660 w->Write<uint8_t>(0); // Null augmentation string. 1660 w->Write<uint8_t>(0); // Null augmentation string.
1661 w->WriteSLEB128(CODE_ALIGN_FACTOR); 1661 w->WriteSLEB128(CODE_ALIGN_FACTOR);
1662 w->WriteSLEB128(DATA_ALIGN_FACTOR); 1662 w->WriteSLEB128(DATA_ALIGN_FACTOR);
1663 w->Write<uint8_t>(RETURN_ADDRESS_REGISTER); 1663 w->Write<uint8_t>(RETURN_ADDRESS_REGISTER);
1664 1664
1665 WriteLength(w, &cie_length_slot, cie_position); 1665 WriteLength(w, &cie_length_slot, cie_position);
1666 1666
1667 return cie_position; 1667 return cie_position;
1668 } 1668 }
1669 1669
1670 1670
1671 void UnwindInfoSection::WriteFDE(Writer *w, int cie_position) { 1671 void UnwindInfoSection::WriteFDE(Writer* w, int cie_position) {
1672 // The only FDE for this function. The CFA is the current RBP. 1672 // The only FDE for this function. The CFA is the current RBP.
1673 Writer::Slot<uint32_t> fde_length_slot = w->CreateSlotHere<uint32_t>(); 1673 Writer::Slot<uint32_t> fde_length_slot = w->CreateSlotHere<uint32_t>();
1674 int fde_position = w->position(); 1674 int fde_position = w->position();
1675 w->Write<int32_t>(fde_position - cie_position + 4); 1675 w->Write<int32_t>(fde_position - cie_position + 4);
1676 1676
1677 w->Write<uintptr_t>(desc_->CodeStart()); 1677 w->Write<uintptr_t>(desc_->CodeStart());
1678 w->Write<uintptr_t>(desc_->CodeSize()); 1678 w->Write<uintptr_t>(desc_->CodeSize());
1679 1679
1680 WriteFDEStateOnEntry(w); 1680 WriteFDEStateOnEntry(w);
1681 WriteFDEStateAfterRBPPush(w); 1681 WriteFDEStateAfterRBPPush(w);
1682 WriteFDEStateAfterRBPSet(w); 1682 WriteFDEStateAfterRBPSet(w);
1683 WriteFDEStateAfterRBPPop(w); 1683 WriteFDEStateAfterRBPPop(w);
1684 1684
1685 WriteLength(w, &fde_length_slot, fde_position); 1685 WriteLength(w, &fde_length_slot, fde_position);
1686 } 1686 }
1687 1687
1688 1688
1689 void UnwindInfoSection::WriteFDEStateOnEntry(Writer *w) { 1689 void UnwindInfoSection::WriteFDEStateOnEntry(Writer* w) {
1690 // The first state, just after the control has been transferred to the the 1690 // The first state, just after the control has been transferred to the the
1691 // function. 1691 // function.
1692 1692
1693 // RBP for this function will be the value of RSP after pushing the RBP 1693 // RBP for this function will be the value of RSP after pushing the RBP
1694 // for the previous function. The previous RBP has not been pushed yet. 1694 // for the previous function. The previous RBP has not been pushed yet.
1695 w->Write<uint8_t>(DW_CFA_DEF_CFA_SF); 1695 w->Write<uint8_t>(DW_CFA_DEF_CFA_SF);
1696 w->WriteULEB128(AMD64_RSP); 1696 w->WriteULEB128(AMD64_RSP);
1697 w->WriteSLEB128(-kPointerSize); 1697 w->WriteSLEB128(-kPointerSize);
1698 1698
1699 // The RA is stored at location CFA + kCallerPCOffset. This is an invariant, 1699 // The RA is stored at location CFA + kCallerPCOffset. This is an invariant,
1700 // and hence omitted from the next states. 1700 // and hence omitted from the next states.
1701 w->Write<uint8_t>(DW_CFA_OFFSET_EXTENDED); 1701 w->Write<uint8_t>(DW_CFA_OFFSET_EXTENDED);
1702 w->WriteULEB128(AMD64_RA); 1702 w->WriteULEB128(AMD64_RA);
1703 w->WriteSLEB128(StandardFrameConstants::kCallerPCOffset); 1703 w->WriteSLEB128(StandardFrameConstants::kCallerPCOffset);
1704 1704
1705 // The RBP of the previous function is still in RBP. 1705 // The RBP of the previous function is still in RBP.
1706 w->Write<uint8_t>(DW_CFA_SAME_VALUE); 1706 w->Write<uint8_t>(DW_CFA_SAME_VALUE);
1707 w->WriteULEB128(AMD64_RBP); 1707 w->WriteULEB128(AMD64_RBP);
1708 1708
1709 // Last location described by this entry. 1709 // Last location described by this entry.
1710 w->Write<uint8_t>(DW_CFA_SET_LOC); 1710 w->Write<uint8_t>(DW_CFA_SET_LOC);
1711 w->Write<uint64_t>( 1711 w->Write<uint64_t>(
1712 desc_->GetStackStateStartAddress(CodeDescription::POST_RBP_PUSH)); 1712 desc_->GetStackStateStartAddress(CodeDescription::POST_RBP_PUSH));
1713 } 1713 }
1714 1714
1715 1715
1716 void UnwindInfoSection::WriteFDEStateAfterRBPPush(Writer *w) { 1716 void UnwindInfoSection::WriteFDEStateAfterRBPPush(Writer* w) {
1717 // The second state, just after RBP has been pushed. 1717 // The second state, just after RBP has been pushed.
1718 1718
1719 // RBP / CFA for this function is now the current RSP, so just set the 1719 // RBP / CFA for this function is now the current RSP, so just set the
1720 // offset from the previous rule (from -8) to 0. 1720 // offset from the previous rule (from -8) to 0.
1721 w->Write<uint8_t>(DW_CFA_DEF_CFA_OFFSET); 1721 w->Write<uint8_t>(DW_CFA_DEF_CFA_OFFSET);
1722 w->WriteULEB128(0); 1722 w->WriteULEB128(0);
1723 1723
1724 // The previous RBP is stored at CFA + kCallerFPOffset. This is an invariant 1724 // The previous RBP is stored at CFA + kCallerFPOffset. This is an invariant
1725 // in this and the next state, and hence omitted in the next state. 1725 // in this and the next state, and hence omitted in the next state.
1726 w->Write<uint8_t>(DW_CFA_OFFSET_EXTENDED); 1726 w->Write<uint8_t>(DW_CFA_OFFSET_EXTENDED);
1727 w->WriteULEB128(AMD64_RBP); 1727 w->WriteULEB128(AMD64_RBP);
1728 w->WriteSLEB128(StandardFrameConstants::kCallerFPOffset); 1728 w->WriteSLEB128(StandardFrameConstants::kCallerFPOffset);
1729 1729
1730 // Last location described by this entry. 1730 // Last location described by this entry.
1731 w->Write<uint8_t>(DW_CFA_SET_LOC); 1731 w->Write<uint8_t>(DW_CFA_SET_LOC);
1732 w->Write<uint64_t>( 1732 w->Write<uint64_t>(
1733 desc_->GetStackStateStartAddress(CodeDescription::POST_RBP_SET)); 1733 desc_->GetStackStateStartAddress(CodeDescription::POST_RBP_SET));
1734 } 1734 }
1735 1735
1736 1736
1737 void UnwindInfoSection::WriteFDEStateAfterRBPSet(Writer *w) { 1737 void UnwindInfoSection::WriteFDEStateAfterRBPSet(Writer* w) {
1738 // The third state, after the RBP has been set. 1738 // The third state, after the RBP has been set.
1739 1739
1740 // The CFA can now directly be set to RBP. 1740 // The CFA can now directly be set to RBP.
1741 w->Write<uint8_t>(DW_CFA_DEF_CFA); 1741 w->Write<uint8_t>(DW_CFA_DEF_CFA);
1742 w->WriteULEB128(AMD64_RBP); 1742 w->WriteULEB128(AMD64_RBP);
1743 w->WriteULEB128(0); 1743 w->WriteULEB128(0);
1744 1744
1745 // Last location described by this entry. 1745 // Last location described by this entry.
1746 w->Write<uint8_t>(DW_CFA_SET_LOC); 1746 w->Write<uint8_t>(DW_CFA_SET_LOC);
1747 w->Write<uint64_t>( 1747 w->Write<uint64_t>(
1748 desc_->GetStackStateStartAddress(CodeDescription::POST_RBP_POP)); 1748 desc_->GetStackStateStartAddress(CodeDescription::POST_RBP_POP));
1749 } 1749 }
1750 1750
1751 1751
1752 void UnwindInfoSection::WriteFDEStateAfterRBPPop(Writer *w) { 1752 void UnwindInfoSection::WriteFDEStateAfterRBPPop(Writer* w) {
1753 // The fourth (final) state. The RBP has been popped (just before issuing a 1753 // The fourth (final) state. The RBP has been popped (just before issuing a
1754 // return). 1754 // return).
1755 1755
1756 // The CFA can is now calculated in the same way as in the first state. 1756 // The CFA can is now calculated in the same way as in the first state.
1757 w->Write<uint8_t>(DW_CFA_DEF_CFA_SF); 1757 w->Write<uint8_t>(DW_CFA_DEF_CFA_SF);
1758 w->WriteULEB128(AMD64_RSP); 1758 w->WriteULEB128(AMD64_RSP);
1759 w->WriteSLEB128(-kPointerSize); 1759 w->WriteSLEB128(-kPointerSize);
1760 1760
1761 // The RBP 1761 // The RBP
1762 w->Write<uint8_t>(DW_CFA_OFFSET_EXTENDED); 1762 w->Write<uint8_t>(DW_CFA_OFFSET_EXTENDED);
1763 w->WriteULEB128(AMD64_RBP); 1763 w->WriteULEB128(AMD64_RBP);
1764 w->WriteSLEB128(StandardFrameConstants::kCallerFPOffset); 1764 w->WriteSLEB128(StandardFrameConstants::kCallerFPOffset);
1765 1765
1766 // Last location described by this entry. 1766 // Last location described by this entry.
1767 w->Write<uint8_t>(DW_CFA_SET_LOC); 1767 w->Write<uint8_t>(DW_CFA_SET_LOC);
1768 w->Write<uint64_t>(desc_->CodeEnd()); 1768 w->Write<uint64_t>(desc_->CodeEnd());
1769 } 1769 }
1770 1770
1771 1771
1772 bool UnwindInfoSection::WriteBody(Writer *w) { 1772 bool UnwindInfoSection::WriteBody(Writer* w) {
1773 uint32_t cie_position = WriteCIE(w); 1773 uint32_t cie_position = WriteCIE(w);
1774 WriteFDE(w, cie_position); 1774 WriteFDE(w, cie_position);
1775 return true; 1775 return true;
1776 } 1776 }
1777 1777
1778 1778
1779 #endif // V8_TARGET_ARCH_X64 1779 #endif // V8_TARGET_ARCH_X64
1780 1780
1781 static void CreateDWARFSections(CodeDescription* desc, DebugObject* obj) { 1781 static void CreateDWARFSections(CodeDescription* desc, DebugObject* obj) {
1782 if (desc->IsLineInfoAvailable()) { 1782 if (desc->IsLineInfoAvailable()) {
(...skipping 20 matching lines...) Expand all
1803 struct JITCodeEntry { 1803 struct JITCodeEntry {
1804 JITCodeEntry* next_; 1804 JITCodeEntry* next_;
1805 JITCodeEntry* prev_; 1805 JITCodeEntry* prev_;
1806 Address symfile_addr_; 1806 Address symfile_addr_;
1807 uint64_t symfile_size_; 1807 uint64_t symfile_size_;
1808 }; 1808 };
1809 1809
1810 struct JITDescriptor { 1810 struct JITDescriptor {
1811 uint32_t version_; 1811 uint32_t version_;
1812 uint32_t action_flag_; 1812 uint32_t action_flag_;
1813 JITCodeEntry *relevant_entry_; 1813 JITCodeEntry* relevant_entry_;
1814 JITCodeEntry *first_entry_; 1814 JITCodeEntry* first_entry_;
1815 }; 1815 };
1816 1816
1817 // GDB will place breakpoint into this function. 1817 // GDB will place breakpoint into this function.
1818 // To prevent GCC from inlining or removing it we place noinline attribute 1818 // To prevent GCC from inlining or removing it we place noinline attribute
1819 // and inline assembler statement inside. 1819 // and inline assembler statement inside.
1820 void __attribute__((noinline)) __jit_debug_register_code() { 1820 void __attribute__((noinline)) __jit_debug_register_code() {
1821 __asm__(""); 1821 __asm__("");
1822 } 1822 }
1823 1823
1824 // GDB will inspect contents of this descriptor. 1824 // GDB will inspect contents of this descriptor.
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
1991 GetScriptLineNumber(script, 0); 1991 GetScriptLineNumber(script, 0);
1992 1992
1993 if (!name.is_null()) { 1993 if (!name.is_null()) {
1994 SmartArrayPointer<char> name_cstring = name->ToCString(DISALLOW_NULLS); 1994 SmartArrayPointer<char> name_cstring = name->ToCString(DISALLOW_NULLS);
1995 AddCode(*name_cstring, *code, GDBJITInterface::FUNCTION, *script, info); 1995 AddCode(*name_cstring, *code, GDBJITInterface::FUNCTION, *script, info);
1996 } else { 1996 } else {
1997 AddCode("", *code, GDBJITInterface::FUNCTION, *script, info); 1997 AddCode("", *code, GDBJITInterface::FUNCTION, *script, info);
1998 } 1998 }
1999 } 1999 }
2000 2000
2001 static void AddUnwindInfo(CodeDescription *desc) { 2001 static void AddUnwindInfo(CodeDescription* desc) {
2002 #ifdef V8_TARGET_ARCH_X64 2002 #ifdef V8_TARGET_ARCH_X64
2003 if (desc->tag() == GDBJITInterface::FUNCTION) { 2003 if (desc->tag() == GDBJITInterface::FUNCTION) {
2004 // To avoid propagating unwinding information through 2004 // To avoid propagating unwinding information through
2005 // compilation pipeline we use an approximation. 2005 // compilation pipeline we use an approximation.
2006 // For most use cases this should not affect usability. 2006 // For most use cases this should not affect usability.
2007 static const int kFramePointerPushOffset = 1; 2007 static const int kFramePointerPushOffset = 1;
2008 static const int kFramePointerSetOffset = 4; 2008 static const int kFramePointerSetOffset = 4;
2009 static const int kFramePointerPopOffset = -3; 2009 static const int kFramePointerPopOffset = -3;
2010 2010
2011 uintptr_t frame_pointer_push_address = 2011 uintptr_t frame_pointer_push_address =
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
2149 ScopedLock lock(mutex_); 2149 ScopedLock lock(mutex_);
2150 ASSERT(!IsLineInfoTagged(line_info)); 2150 ASSERT(!IsLineInfoTagged(line_info));
2151 HashMap::Entry* e = GetEntries()->Lookup(code, HashForCodeObject(code), true); 2151 HashMap::Entry* e = GetEntries()->Lookup(code, HashForCodeObject(code), true);
2152 ASSERT(e->value == NULL); 2152 ASSERT(e->value == NULL);
2153 e->value = TagLineInfo(line_info); 2153 e->value = TagLineInfo(line_info);
2154 } 2154 }
2155 2155
2156 2156
2157 } } // namespace v8::internal 2157 } } // namespace v8::internal
2158 #endif 2158 #endif
OLDNEW
« no previous file with comments | « src/full-codegen.cc ('k') | src/handles.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698