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