File: DWARFLinkerUnit.h

package info (click to toggle)
llvm-toolchain-17 1%3A17.0.6-22
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,799,624 kB
  • sloc: cpp: 6,428,607; ansic: 1,383,196; asm: 793,408; python: 223,504; objc: 75,364; f90: 60,502; lisp: 33,869; pascal: 15,282; sh: 9,684; perl: 7,453; ml: 4,937; awk: 3,523; makefile: 2,889; javascript: 2,149; xml: 888; fortran: 619; cs: 573
file content (186 lines) | stat: -rw-r--r-- 5,946 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
//===- DWARFLinkerUnit.h ----------------------------------------*- 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
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIB_DWARFLINKERPARALLEL_DWARFLINKERUNIT_H
#define LLVM_LIB_DWARFLINKERPARALLEL_DWARFLINKERUNIT_H

#include "OutputSections.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/CodeGen/DIE.h"
#include "llvm/DWARFLinkerParallel/StringPool.h"
#include "llvm/DebugInfo/DWARF/DWARFUnit.h"
#include "llvm/Support/LEB128.h"

namespace llvm {
namespace dwarflinker_parallel {

using UnitMessageHandlerTy = function_ref<void(
    const Twine &Error, StringRef Context, const DWARFDie *DIE)>;

/// Each unit keeps output data as a file with debug tables
/// corresponding to the concrete unit.
using OutTablesFileTy = SmallString<0>;

/// Base class for all Dwarf units(Compile unit/Type table unit).
class DwarfUnit : public OutputSections {
public:
  virtual ~DwarfUnit() {}
  DwarfUnit(unsigned ID, StringRef ClangModuleName,
            UnitMessageHandlerTy WarningHandler)
      : ID(ID), ClangModuleName(ClangModuleName),
        WarningHandler(WarningHandler) {
    FormParams.Version = 4;
    FormParams.Format = dwarf::DWARF32;
    FormParams.AddrSize = 4;
  }

  /// Endiannes for the compile unit.
  support::endianness getEndianness() const { return Endianess; }

  /// Return DWARF version.
  uint16_t getVersion() const { return FormParams.Version; }

  /// Return size of header of debug_info table.
  uint16_t getHeaderSize() const { return FormParams.Version >= 5 ? 12 : 11; }

  /// Return size of address.
  uint8_t getAddressByteSize() const { return FormParams.AddrSize; }

  /// Return size of reference.
  uint8_t getRefAddrByteSize() const { return FormParams.getRefAddrByteSize(); }

  /// Return format of the Dwarf(DWARF32 or DWARF64).
  /// TODO: DWARF64 is not currently supported.
  dwarf::DwarfFormat getDwarfFormat() const { return FormParams.Format; }

  /// Unique id of the unit.
  unsigned getUniqueID() const { return ID; }

  /// Return language of this unit.
  uint16_t getLanguage() const { return Language; }

  /// Set size of this(newly generated) compile unit.
  void setUnitSize(uint64_t UnitSize) { this->UnitSize = UnitSize; }

  /// Returns size of this(newly generated) compile unit.
  uint64_t getUnitSize() const { return UnitSize; }

  /// Returns this unit name.
  StringRef getUnitName() const { return UnitName; }

  /// Return the DW_AT_LLVM_sysroot of the compile unit or an empty StringRef.
  StringRef getSysRoot() { return SysRoot; }

  /// Create a Die for this unit.
  void setOutputDIE(DIE *UnitDie) { NewUnit = UnitDie; }

  /// Return Die for this compile unit.
  DIE *getOutputUnitDIE() const { return NewUnit; }

  /// Return true if this compile unit is from Clang module.
  bool isClangModule() const { return !ClangModuleName.empty(); }

  /// Return Clang module name;
  const std::string &getClangModuleName() const { return ClangModuleName; }

  /// Returns generated file keeping debug tables for this compile unit.
  OutTablesFileTy &getOutDwarfBits() { return OutDebugInfoBits; }

  /// Erases generated file keeping debug tables for this compile unit.
  void eraseDwarfBits() { OutDebugInfoBits = OutTablesFileTy(); }

  MCSymbol *getLabelBegin() { return LabelBegin; }
  void setLabelBegin(MCSymbol *S) { LabelBegin = S; }

  /// Error reporting methods.
  /// @{

  void reportWarning(const Twine &Warning,
                     const DWARFDie *Die = nullptr) const {
    if (WarningHandler)
      WarningHandler(Warning, getUnitName(), Die);
  }
  void reportWarning(Error Warning) const {
    handleAllErrors(std::move(Warning), [&](ErrorInfoBase &Info) {
      if (WarningHandler)
        WarningHandler(Info.message(), getUnitName(), nullptr);
    });
  }
  /// @}

  /// This structure keeps fields which would be used for creating accelerator
  /// table.
  struct AccelInfo {
    AccelInfo(StringEntry *Name, const DIE *Die, bool SkipPubSection = false);
    AccelInfo(StringEntry *Name, const DIE *Die, uint32_t QualifiedNameHash,
              bool ObjCClassIsImplementation);

    /// Name of the entry.
    StringEntry *Name = nullptr;

    /// Tag of the DIE this entry describes.
    dwarf::Tag Tag = dwarf::DW_TAG_null;

    /// Output offset of the DIE this entry describes.
    uint64_t OutOffset = 0;

    /// Hash of the fully qualified name.
    uint32_t QualifiedNameHash = 0;

    /// Emit this entry only in the apple_* sections.
    bool SkipPubSection = false;

    /// Is this an ObjC class implementation?
    bool ObjcClassImplementation = false;

    /// Cloned Die containing acceleration info.
    const DIE *Die = nullptr;
  };

protected:
  /// Unique ID for the unit.
  unsigned ID = 0;

  /// Properties of the unit.
  dwarf::FormParams FormParams;

  /// DIE for newly generated compile unit.
  DIE *NewUnit = nullptr;

  /// The DW_AT_language of this unit.
  uint16_t Language = 0;

  /// The name of this unit.
  std::string UnitName;

  /// The DW_AT_LLVM_sysroot of this unit.
  std::string SysRoot;

  /// If this is a Clang module, this holds the module's name.
  std::string ClangModuleName;

  uint64_t UnitSize = 0;

  /// Elf file containg generated debug tables for this compile unit.
  OutTablesFileTy OutDebugInfoBits;

  /// Endiannes for this compile unit.
  support::endianness Endianess = support::endianness::little;

  MCSymbol *LabelBegin = nullptr;

  /// true if current unit references_to/is_referenced by other unit.
  std::atomic<bool> IsInterconnectedCU = {false};

  UnitMessageHandlerTy WarningHandler;
};

} // end of namespace dwarflinker_parallel
} // end namespace llvm

#endif // LLVM_LIB_DWARFLINKERPARALLEL_DWARFLINKERUNIT_H