DWARFDebugFrame.cpp revision 8a0329e6ffc290fb177fd058a64b4cf81d4b620a
160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky//===-- DWARFDebugFrame.h - Parsing of .debug_frame -------------*- C++ -*-===// 260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky// 360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky// The LLVM Compiler Infrastructure 460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky// 560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky// This file is distributed under the University of Illinois Open Source 660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky// License. See LICENSE.TXT for details. 760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky// 860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky//===----------------------------------------------------------------------===// 960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 1060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky#include "DWARFDebugFrame.h" 1160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky#include "llvm/ADT/SmallString.h" 1260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky#include "llvm/Support/DataTypes.h" 1360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky#include "llvm/Support/Dwarf.h" 1460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky#include "llvm/Support/Format.h" 1560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 1660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskyusing namespace llvm; 1760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskyusing namespace dwarf; 1860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 1960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 2060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskyclass llvm::FrameEntry { 2160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskypublic: 2260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky enum FrameKind {FK_CIE, FK_FDE}; 2360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky FrameEntry(FrameKind K, DataExtractor D, uint64_t Offset, uint64_t Length) 24ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky : Kind(K), Data(D), Offset(Offset), Length(Length) {} 2560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 268a0329e6ffc290fb177fd058a64b4cf81d4b620aEli Bendersky virtual ~FrameEntry() { 278a0329e6ffc290fb177fd058a64b4cf81d4b620aEli Bendersky } 288a0329e6ffc290fb177fd058a64b4cf81d4b620aEli Bendersky 2960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky FrameKind getKind() const { return Kind; } 3060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 3160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky virtual void dumpHeader(raw_ostream &OS) const = 0; 32ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky 3360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskyprotected: 3460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky const FrameKind Kind; 35ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky 36ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky /// \brief The data stream holding the section from which the entry was 37ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky /// parsed. 3860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky DataExtractor Data; 39ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky 40ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky /// \brief Offset of this entry in the section. 4160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t Offset; 42ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky 43ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky /// \brief Entry length as specified in DWARF. 4460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t Length; 4560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky}; 4660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 4760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 4860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskyclass CIE : public FrameEntry { 4960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskypublic: 5060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // CIEs (and FDEs) are simply container classes, so the only sensible way to 5160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // create them is by providing the full parsed contents in the constructor. 5260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky CIE(DataExtractor D, uint64_t Offset, uint64_t Length, uint8_t Version, 5360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky SmallString<8> Augmentation, uint64_t CodeAlignmentFactor, 5460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky int64_t DataAlignmentFactor, uint64_t ReturnAddressRegister) 5560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky : FrameEntry(FK_CIE, D, Offset, Length), Version(Version), 5660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky Augmentation(Augmentation), CodeAlignmentFactor(CodeAlignmentFactor), 5760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky DataAlignmentFactor(DataAlignmentFactor), 58ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky ReturnAddressRegister(ReturnAddressRegister) {} 5960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 608a0329e6ffc290fb177fd058a64b4cf81d4b620aEli Bendersky ~CIE() { 618a0329e6ffc290fb177fd058a64b4cf81d4b620aEli Bendersky } 628a0329e6ffc290fb177fd058a64b4cf81d4b620aEli Bendersky 6360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky void dumpHeader(raw_ostream &OS) const { 6460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky OS << format("%08x %08x %08x CIE", Offset, Length, DW_CIE_ID) << "\n"; 6560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky OS << format(" Version: %d\n", Version); 6660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky OS << " Augmentation: \"" << Augmentation << "\"\n"; 6760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky OS << format(" Code alignment factor: %u\n", CodeAlignmentFactor); 6860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky OS << format(" Data alignment factor: %d\n", DataAlignmentFactor); 6960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky OS << format(" Return address column: %d\n", ReturnAddressRegister); 7060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky OS << "\n"; 7160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } 7260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 7360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky static bool classof(const FrameEntry *FE) { 7460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky return FE->getKind() == FK_CIE; 7560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } 76ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky 7760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskyprivate: 78ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky /// The following fields are defined in section 6.4.1 of the DWARF standard v3 7960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint8_t Version; 8060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky SmallString<8> Augmentation; 8160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t CodeAlignmentFactor; 8260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky int64_t DataAlignmentFactor; 8360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t ReturnAddressRegister; 8460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky}; 8560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 8660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 8760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskyclass FDE : public FrameEntry { 8860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskypublic: 8960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // Each FDE has a CIE it's "linked to". Our FDE contains is constructed with 9060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // an offset to the CIE (provided by parsing the FDE header). The CIE itself 9160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // is obtained lazily once it's actually required. 92ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky FDE(DataExtractor D, uint64_t Offset, uint64_t Length, 93ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky int64_t LinkedCIEOffset, uint64_t InitialLocation, uint64_t AddressRange) 9460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky : FrameEntry(FK_FDE, D, Offset, Length), LinkedCIEOffset(LinkedCIEOffset), 9560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky InitialLocation(InitialLocation), AddressRange(AddressRange), 96ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky LinkedCIE(NULL) {} 9760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 988a0329e6ffc290fb177fd058a64b4cf81d4b620aEli Bendersky ~FDE() { 998a0329e6ffc290fb177fd058a64b4cf81d4b620aEli Bendersky } 1008a0329e6ffc290fb177fd058a64b4cf81d4b620aEli Bendersky 10160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky void dumpHeader(raw_ostream &OS) const { 10260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky OS << format("%08x %08x %08x FDE ", Offset, Length, LinkedCIEOffset); 10360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky OS << format("cie=%08x pc=%08x...%08x\n", 10460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky LinkedCIEOffset, InitialLocation, 10560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky InitialLocation + AddressRange); 10660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky OS << "\n"; 10760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } 10860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 10960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky static bool classof(const FrameEntry *FE) { 11060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky return FE->getKind() == FK_FDE; 11160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } 11260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskyprivate: 113ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky 114ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky /// The following fields are defined in section 6.4.1 of the DWARF standard v3 11560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t LinkedCIEOffset; 11660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t InitialLocation; 11760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t AddressRange; 11860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky CIE *LinkedCIE; 11960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky}; 12060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 12160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 122ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli BenderskyDWARFDebugFrame::DWARFDebugFrame() { 12360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky} 12460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 12560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 126ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli BenderskyDWARFDebugFrame::~DWARFDebugFrame() { 12760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky for (EntryVector::iterator I = Entries.begin(), E = Entries.end(); 12860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky I != E; ++I) { 12960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky delete *I; 13060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } 13160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky} 13260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 13360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 13460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskystatic void LLVM_ATTRIBUTE_UNUSED dumpDataAux(DataExtractor Data, 13560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint32_t Offset, int Length) { 13660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky errs() << "DUMP: "; 13760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky for (int i = 0; i < Length; ++i) { 13860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint8_t c = Data.getU8(&Offset); 13960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky errs().write_hex(c); errs() << " "; 14060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } 14160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky errs() << "\n"; 14260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky} 14360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 14460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 14560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskyvoid DWARFDebugFrame::parse(DataExtractor Data) { 14660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint32_t Offset = 0; 14760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 14860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky while (Data.isValidOffset(Offset)) { 14960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint32_t StartOffset = Offset; 15060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 15160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky bool IsDWARF64 = false; 15260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t Length = Data.getU32(&Offset); 15360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t Id; 15460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 15560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky if (Length == UINT32_MAX) { 15660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // DWARF-64 is distinguished by the first 32 bits of the initial length 15760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // field being 0xffffffff. Then, the next 64 bits are the actual entry 15860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // length. 15960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky IsDWARF64 = true; 16060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky Length = Data.getU64(&Offset); 16160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } 16260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 16360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // At this point, Offset points to the next field after Length. 16460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // Length is the structure size excluding itself. Compute an offset one 16560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // past the end of the structure (needed to know how many instructions to 16660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // read). 16760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // TODO: For honest DWARF64 support, DataExtractor will have to treat 16860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // offset_ptr as uint64_t* 16960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint32_t EndStructureOffset = Offset + static_cast<uint32_t>(Length); 17060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 17160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // The Id field's size depends on the DWARF format 17260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky Id = Data.getUnsigned(&Offset, IsDWARF64 ? 8 : 4); 17360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky bool IsCIE = ((IsDWARF64 && Id == DW64_CIE_ID) || Id == DW_CIE_ID); 17460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 17560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky if (IsCIE) { 17660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // Note: this is specifically DWARFv3 CIE header structure. It was 17760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // changed in DWARFv4. 17860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint8_t Version = Data.getU8(&Offset); 17960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky const char *Augmentation = Data.getCStr(&Offset); 18060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t CodeAlignmentFactor = Data.getULEB128(&Offset); 18160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky int64_t DataAlignmentFactor = Data.getSLEB128(&Offset); 18260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t ReturnAddressRegister = Data.getULEB128(&Offset); 18360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 18460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky CIE *NewCIE = new CIE(Data, StartOffset, Length, Version, 18560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky StringRef(Augmentation), CodeAlignmentFactor, 18660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky DataAlignmentFactor, ReturnAddressRegister); 18760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky Entries.push_back(NewCIE); 18860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } else { 18960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // FDE 19060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t CIEPointer = Id; 19160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t InitialLocation = Data.getAddress(&Offset); 19260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t AddressRange = Data.getAddress(&Offset); 19360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 19460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky FDE *NewFDE = new FDE(Data, StartOffset, Length, CIEPointer, 19560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky InitialLocation, AddressRange); 19660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky Entries.push_back(NewFDE); 19760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } 19860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 19960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky Offset = EndStructureOffset; 20060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } 20160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky} 20260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 20360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 20460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskyvoid DWARFDebugFrame::dump(raw_ostream &OS) const { 20560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky OS << "\n"; 20660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky for (EntryVector::const_iterator I = Entries.begin(), E = Entries.end(); 20760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky I != E; ++I) { 20860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky (*I)->dumpHeader(OS); 20960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } 21060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky} 21160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 212