//===- lib/CodeGen/DIE.h - DWARF Info Entries -------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Data structures for DWARF info entries. // //===----------------------------------------------------------------------===// #ifndef LLVM_CODEGEN_DIE_H #define LLVM_CODEGEN_DIE_H #include "llvm/ADT/FoldingSet.h" #include "llvm/ADT/PointerIntPair.h" #include "llvm/ADT/PointerUnion.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/iterator.h" #include "llvm/ADT/iterator_range.h" #include "llvm/BinaryFormat/Dwarf.h" #include "llvm/CodeGen/DwarfStringPoolEntry.h" #include "llvm/Support/AlignOf.h" #include "llvm/Support/Allocator.h" #include <cassert> #include <cstddef> #include <cstdint> #include <iterator> #include <new> #include <type_traits> #include <utility> #include <vector> namespace llvm { class AsmPrinter; class DIE; class DIEUnit; class DwarfCompileUnit; class MCExpr; class MCSection; class MCSymbol; class raw_ostream; //===--------------------------------------------------------------------===// /// Dwarf abbreviation data, describes one attribute of a Dwarf abbreviation. class DIEAbbrevData { … }; //===--------------------------------------------------------------------===// /// Dwarf abbreviation, describes the organization of a debug information /// object. class DIEAbbrev : public FoldingSetNode { … }; //===--------------------------------------------------------------------===// /// Helps unique DIEAbbrev objects and assigns abbreviation numbers. /// /// This class will unique the DIE abbreviations for a llvm::DIE object and /// assign a unique abbreviation number to each unique DIEAbbrev object it /// finds. The resulting collection of DIEAbbrev objects can then be emitted /// into the .debug_abbrev section. class DIEAbbrevSet { … }; //===--------------------------------------------------------------------===// /// An integer value DIE. /// class DIEInteger { … }; //===--------------------------------------------------------------------===// /// An expression DIE. class DIEExpr { … }; //===--------------------------------------------------------------------===// /// A label DIE. class DIELabel { … }; //===--------------------------------------------------------------------===// /// A BaseTypeRef DIE. class DIEBaseTypeRef { … }; //===--------------------------------------------------------------------===// /// A simple label difference DIE. /// class DIEDelta { … }; //===--------------------------------------------------------------------===// /// A container for string pool string values. /// /// This class is used with the DW_FORM_strp and DW_FORM_GNU_str_index forms. class DIEString { … }; //===--------------------------------------------------------------------===// /// A container for inline string values. /// /// This class is used with the DW_FORM_string form. class DIEInlineString { … }; //===--------------------------------------------------------------------===// /// A pointer to another debug information entry. An instance of this class can /// also be used as a proxy for a debug information entry not yet defined /// (ie. types.) class DIEEntry { … }; //===--------------------------------------------------------------------===// /// Represents a pointer to a location list in the debug_loc /// section. class DIELocList { … }; //===--------------------------------------------------------------------===// /// A BaseTypeRef DIE. class DIEAddrOffset { … }; //===--------------------------------------------------------------------===// /// A debug information entry value. Some of these roughly correlate /// to DWARF attribute classes. class DIEBlock; class DIELoc; class DIEValue { … }; struct IntrusiveBackListNode { … }; struct IntrusiveBackListBase { … }; template <class T> class IntrusiveBackList : IntrusiveBackListBase { … }; /// A list of DIE values. /// /// This is a singly-linked list, but instead of reversing the order of /// insertion, we keep a pointer to the back of the list so we can push in /// order. /// /// There are two main reasons to choose a linked list over a customized /// vector-like data structure. /// /// 1. For teardown efficiency, we want DIEs to be BumpPtrAllocated. Using a /// linked list here makes this way easier to accomplish. /// 2. Carrying an extra pointer per \a DIEValue isn't expensive. 45% of DIEs /// have 2 or fewer values, and 90% have 5 or fewer. A vector would be /// over-allocated by 50% on average anyway, the same cost as the /// linked-list node. class DIEValueList { … }; //===--------------------------------------------------------------------===// /// A structured debug information entry. Has an abbreviation which /// describes its organization. class DIE : IntrusiveBackListNode, public DIEValueList { … }; //===--------------------------------------------------------------------===// /// Represents a compile or type unit. class DIEUnit { … }; struct BasicDIEUnit final : DIEUnit { … }; //===--------------------------------------------------------------------===// /// DIELoc - Represents an expression location. // class DIELoc : public DIEValueList { … }; //===--------------------------------------------------------------------===// /// DIEBlock - Represents a block of values. // class DIEBlock : public DIEValueList { … }; } // end namespace llvm #endif // LLVM_CODEGEN_DIE_H