1dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//===-- llvm/CodeGen/DwarfFile.h - Dwarf Debug Framework -------*- C++ -*--===//
2dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//
3dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//                     The LLVM Compiler Infrastructure
4dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//
5dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// This file is distributed under the University of Illinois Open Source
6dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// License. See LICENSE.TXT for details.
7dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//
8dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//===----------------------------------------------------------------------===//
9dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
10dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#ifndef CODEGEN_ASMPRINTER_DWARFFILE_H__
11dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define CODEGEN_ASMPRINTER_DWARFFILE_H__
12dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
13dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/ADT/DenseMap.h"
14dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/ADT/FoldingSet.h"
15dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/ADT/SmallVector.h"
16dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/ADT/StringMap.h"
17dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/Support/Allocator.h"
18dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "AddressPool.h"
19dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "DwarfStringPool.h"
20dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include <vector>
22dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include <string>
23dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include <memory>
24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesnamespace llvm {
26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass AsmPrinter;
27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass DwarfUnit;
28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass DIEAbbrev;
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCSymbol;
30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass DIE;
31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass StringRef;
32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass DwarfDebug;
33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCSection;
34dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass DwarfFile {
35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Target of Dwarf emission, used for sizing of abbreviations.
36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  AsmPrinter *Asm;
37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Used to uniquely define abbreviations.
39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  FoldingSet<DIEAbbrev> AbbreviationsSet;
40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // A list of all the unique abbreviations in use.
42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  std::vector<DIEAbbrev *> Abbreviations;
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // A pointer to all units in the section.
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SmallVector<std::unique_ptr<DwarfUnit>, 1> CUs;
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  DwarfStringPool StrPool;
48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinespublic:
50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  DwarfFile(AsmPrinter *AP, StringRef Pref, BumpPtrAllocator &DA);
51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ~DwarfFile();
53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const SmallVectorImpl<std::unique_ptr<DwarfUnit>> &getUnits() { return CUs; }
55dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// \brief Compute the size and offset of a DIE given an incoming Offset.
57dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned computeSizeAndOffset(DIE &Die, unsigned Offset);
58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// \brief Compute the size and offset of all the DIEs.
60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void computeSizeAndOffsets();
61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
62dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// \brief Define a unique number for the abbreviation.
63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void assignAbbrevNumber(DIEAbbrev &Abbrev);
64dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// \brief Add a unit to the list of CUs.
66dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void addUnit(std::unique_ptr<DwarfUnit> U);
67dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
68dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// \brief Emit all of the units to the section listed with the given
69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// abbreviation section.
70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void emitUnits(DwarfDebug *DD, const MCSymbol *ASectionSym);
71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
72dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// \brief Emit a set of abbreviations to the specific section.
73dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void emitAbbrevs(const MCSection *);
74dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
75dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// \brief Emit all of the strings to the section given.
76dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void emitStrings(const MCSection *StrSection,
77dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                   const MCSection *OffsetSection = nullptr,
78dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                   const MCSymbol *StrSecSym = nullptr);
79dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
80dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// \brief Returns the string pool.
81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  DwarfStringPool &getStringPool() { return StrPool; }
82dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines};
83dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
84dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#endif
85