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