DWARFDebugFrame.cpp revision d9a8d43ed3e7c6c32f52ab5d0f627f7b1cdb6aac
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 202e402d5b5f2fce8bfe29509cc771b9919946003bEli Bendersky/// \brief Abstract frame entry defining the common interface concrete 212e402d5b5f2fce8bfe29509cc771b9919946003bEli Bendersky/// entries implement. 2260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskyclass llvm::FrameEntry { 2360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskypublic: 2460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky enum FrameKind {FK_CIE, FK_FDE}; 2560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky FrameEntry(FrameKind K, DataExtractor D, uint64_t Offset, uint64_t Length) 26ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky : Kind(K), Data(D), Offset(Offset), Length(Length) {} 2760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 288a0329e6ffc290fb177fd058a64b4cf81d4b620aEli Bendersky virtual ~FrameEntry() { 298a0329e6ffc290fb177fd058a64b4cf81d4b620aEli Bendersky } 308a0329e6ffc290fb177fd058a64b4cf81d4b620aEli Bendersky 3160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky FrameKind getKind() const { return Kind; } 3260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 3360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky virtual void dumpHeader(raw_ostream &OS) const = 0; 34ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky 3560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskyprotected: 3660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky const FrameKind Kind; 37ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky 38ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky /// \brief The data stream holding the section from which the entry was 39ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky /// parsed. 4060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky DataExtractor Data; 41ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky 42ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky /// \brief Offset of this entry in the section. 4360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t Offset; 44ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky 45ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky /// \brief Entry length as specified in DWARF. 4660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t Length; 4760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky}; 4860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 4960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 502e402d5b5f2fce8bfe29509cc771b9919946003bEli Bendersky/// \brief DWARF Common Information Entry (CIE) 5160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskyclass CIE : public FrameEntry { 5260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskypublic: 5360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // CIEs (and FDEs) are simply container classes, so the only sensible way to 5460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // create them is by providing the full parsed contents in the constructor. 5560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky CIE(DataExtractor D, uint64_t Offset, uint64_t Length, uint8_t Version, 5660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky SmallString<8> Augmentation, uint64_t CodeAlignmentFactor, 5760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky int64_t DataAlignmentFactor, uint64_t ReturnAddressRegister) 5860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky : FrameEntry(FK_CIE, D, Offset, Length), Version(Version), 5960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky Augmentation(Augmentation), CodeAlignmentFactor(CodeAlignmentFactor), 6060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky DataAlignmentFactor(DataAlignmentFactor), 61ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky ReturnAddressRegister(ReturnAddressRegister) {} 6260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 638a0329e6ffc290fb177fd058a64b4cf81d4b620aEli Bendersky ~CIE() { 648a0329e6ffc290fb177fd058a64b4cf81d4b620aEli Bendersky } 658a0329e6ffc290fb177fd058a64b4cf81d4b620aEli Bendersky 6660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky void dumpHeader(raw_ostream &OS) const { 6790e01ac0ea5bdc6dd6bccd9c59c3acb04e339666NAKAMURA Takumi OS << format("%08x %08x %08x CIE", 6890e01ac0ea5bdc6dd6bccd9c59c3acb04e339666NAKAMURA Takumi (uint32_t)Offset, (uint32_t)Length, DW_CIE_ID) 6990e01ac0ea5bdc6dd6bccd9c59c3acb04e339666NAKAMURA Takumi << "\n"; 7060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky OS << format(" Version: %d\n", Version); 7160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky OS << " Augmentation: \"" << Augmentation << "\"\n"; 7260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky OS << format(" Code alignment factor: %u\n", CodeAlignmentFactor); 7360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky OS << format(" Data alignment factor: %d\n", DataAlignmentFactor); 7460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky OS << format(" Return address column: %d\n", ReturnAddressRegister); 7560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky OS << "\n"; 7660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } 7760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 7860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky static bool classof(const FrameEntry *FE) { 7960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky return FE->getKind() == FK_CIE; 8060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } 81ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky 8260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskyprivate: 83ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky /// The following fields are defined in section 6.4.1 of the DWARF standard v3 8460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint8_t Version; 8560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky SmallString<8> Augmentation; 8660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t CodeAlignmentFactor; 8760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky int64_t DataAlignmentFactor; 8860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t ReturnAddressRegister; 8960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky}; 9060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 9160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 922e402d5b5f2fce8bfe29509cc771b9919946003bEli Bendersky/// \brief DWARF Frame Description Entry (FDE) 9360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskyclass FDE : public FrameEntry { 9460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskypublic: 9560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // Each FDE has a CIE it's "linked to". Our FDE contains is constructed with 9660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // an offset to the CIE (provided by parsing the FDE header). The CIE itself 9760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // is obtained lazily once it's actually required. 98ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky FDE(DataExtractor D, uint64_t Offset, uint64_t Length, 99ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky int64_t LinkedCIEOffset, uint64_t InitialLocation, uint64_t AddressRange) 10060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky : FrameEntry(FK_FDE, D, Offset, Length), LinkedCIEOffset(LinkedCIEOffset), 10160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky InitialLocation(InitialLocation), AddressRange(AddressRange), 102ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky LinkedCIE(NULL) {} 10360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 1048a0329e6ffc290fb177fd058a64b4cf81d4b620aEli Bendersky ~FDE() { 1058a0329e6ffc290fb177fd058a64b4cf81d4b620aEli Bendersky } 1068a0329e6ffc290fb177fd058a64b4cf81d4b620aEli Bendersky 10760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky void dumpHeader(raw_ostream &OS) const { 10890e01ac0ea5bdc6dd6bccd9c59c3acb04e339666NAKAMURA Takumi OS << format("%08x %08x %08x FDE ", 109d9a8d43ed3e7c6c32f52ab5d0f627f7b1cdb6aacNAKAMURA Takumi (uint32_t)Offset, (uint32_t)Length, (int32_t)LinkedCIEOffset); 11060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky OS << format("cie=%08x pc=%08x...%08x\n", 111d9a8d43ed3e7c6c32f52ab5d0f627f7b1cdb6aacNAKAMURA Takumi (int32_t)LinkedCIEOffset, 1128ff0631967c64d51b193b862aa0a6f1e8eb06f78NAKAMURA Takumi (uint32_t)InitialLocation, 1138ff0631967c64d51b193b862aa0a6f1e8eb06f78NAKAMURA Takumi (uint32_t)InitialLocation + (uint32_t)AddressRange); 11460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky OS << "\n"; 115b2ac7c09b17efadea2a9f90f45801d9d2ee687aaEli Bendersky if (LinkedCIE) { 116b2ac7c09b17efadea2a9f90f45801d9d2ee687aaEli Bendersky OS << format("%p\n", LinkedCIE); 117b2ac7c09b17efadea2a9f90f45801d9d2ee687aaEli Bendersky } 11860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } 11960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 12060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky static bool classof(const FrameEntry *FE) { 12160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky return FE->getKind() == FK_FDE; 12260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } 12360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskyprivate: 124ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky 125ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli Bendersky /// The following fields are defined in section 6.4.1 of the DWARF standard v3 12660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t LinkedCIEOffset; 12760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t InitialLocation; 12860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t AddressRange; 12960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky CIE *LinkedCIE; 13060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky}; 13160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 13260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 133ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli BenderskyDWARFDebugFrame::DWARFDebugFrame() { 13460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky} 13560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 13660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 137ba42625074aa7f4f1324a5d6666bd0e302b57f2bEli BenderskyDWARFDebugFrame::~DWARFDebugFrame() { 13860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky for (EntryVector::iterator I = Entries.begin(), E = Entries.end(); 13960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky I != E; ++I) { 14060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky delete *I; 14160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } 14260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky} 14360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 14460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 14560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskystatic void LLVM_ATTRIBUTE_UNUSED dumpDataAux(DataExtractor Data, 14660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint32_t Offset, int Length) { 14760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky errs() << "DUMP: "; 14860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky for (int i = 0; i < Length; ++i) { 14960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint8_t c = Data.getU8(&Offset); 15060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky errs().write_hex(c); errs() << " "; 15160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } 15260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky errs() << "\n"; 15360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky} 15460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 15560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 15660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskyvoid DWARFDebugFrame::parse(DataExtractor Data) { 15760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint32_t Offset = 0; 15860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 15960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky while (Data.isValidOffset(Offset)) { 16060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint32_t StartOffset = Offset; 16160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 16260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky bool IsDWARF64 = false; 16360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t Length = Data.getU32(&Offset); 16460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t Id; 16560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 16660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky if (Length == UINT32_MAX) { 16760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // DWARF-64 is distinguished by the first 32 bits of the initial length 16860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // field being 0xffffffff. Then, the next 64 bits are the actual entry 16960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // length. 17060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky IsDWARF64 = true; 17160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky Length = Data.getU64(&Offset); 17260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } 17360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 17460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // At this point, Offset points to the next field after Length. 17560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // Length is the structure size excluding itself. Compute an offset one 17660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // past the end of the structure (needed to know how many instructions to 17760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // read). 17860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // TODO: For honest DWARF64 support, DataExtractor will have to treat 17960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // offset_ptr as uint64_t* 18060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint32_t EndStructureOffset = Offset + static_cast<uint32_t>(Length); 18160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 18260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // The Id field's size depends on the DWARF format 18360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky Id = Data.getUnsigned(&Offset, IsDWARF64 ? 8 : 4); 18460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky bool IsCIE = ((IsDWARF64 && Id == DW64_CIE_ID) || Id == DW_CIE_ID); 18560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 18660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky if (IsCIE) { 18760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // Note: this is specifically DWARFv3 CIE header structure. It was 18860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // changed in DWARFv4. 18960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint8_t Version = Data.getU8(&Offset); 19060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky const char *Augmentation = Data.getCStr(&Offset); 19160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t CodeAlignmentFactor = Data.getULEB128(&Offset); 19260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky int64_t DataAlignmentFactor = Data.getSLEB128(&Offset); 19360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t ReturnAddressRegister = Data.getULEB128(&Offset); 19460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 19560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky CIE *NewCIE = new CIE(Data, StartOffset, Length, Version, 19660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky StringRef(Augmentation), CodeAlignmentFactor, 19760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky DataAlignmentFactor, ReturnAddressRegister); 19860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky Entries.push_back(NewCIE); 19960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } else { 20060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky // FDE 20160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t CIEPointer = Id; 20260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t InitialLocation = Data.getAddress(&Offset); 20360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky uint64_t AddressRange = Data.getAddress(&Offset); 20460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 20560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky FDE *NewFDE = new FDE(Data, StartOffset, Length, CIEPointer, 20660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky InitialLocation, AddressRange); 20760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky Entries.push_back(NewFDE); 20860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } 20960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 21060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky Offset = EndStructureOffset; 21160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } 21260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky} 21360bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 21460bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 21560bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Benderskyvoid DWARFDebugFrame::dump(raw_ostream &OS) const { 21660bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky OS << "\n"; 21760bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky for (EntryVector::const_iterator I = Entries.begin(), E = Entries.end(); 21860bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky I != E; ++I) { 21960bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky (*I)->dumpHeader(OS); 22060bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky } 22160bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky} 22260bdc5b16e2fc17be184b515a00c2e2a2eb40b89Eli Bendersky 223