18using namespace dwarf_linker;
19using namespace dwarf_linker::classic;
21#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
24 llvm::errs() <<
" AddrAdjust: " << AddrAdjust <<
'\n';
27 llvm::errs() <<
" ParentIdx: " << ParentIdx <<
'\n';
29 llvm::errs() <<
" InDebugMap: " << InDebugMap <<
'\n';
31 llvm::errs() <<
" Incomplete: " << Incomplete <<
'\n';
32 llvm::errs() <<
" InModuleScope: " << InModuleScope <<
'\n';
33 llvm::errs() <<
" ODRMarkingDone: " << ODRMarkingDone <<
'\n';
34 llvm::errs() <<
" UnclonedReference: " << UnclonedReference <<
'\n';
42 if (U.getOrigUnit().getDIEAtIndex(
Idx).getTag() == dwarf::DW_TAG_subprogram)
44 Idx = U.getInfo(
Idx).ParentIdx;
58 if (SysRoot.empty()) {
68 for (
auto &
I : Info) {
77 if (
DIE.
getTag() != dwarf::DW_TAG_variable &&
81 std::optional<DWARFFormValue>
Value;
82 if (!(
Value =
DIE.find(dwarf::DW_AT_location))) {
83 if ((
Value =
DIE.find(dwarf::DW_AT_const_value)) &&
89 if (
auto ExprLockBlock =
Value->getAsBlock()) {
92 U->getContext().isLittleEndian(),
93 U->getAddressByteSize());
95 U->getFormParams().Format);
102 switch (It->getCode()) {
103 case dwarf::DW_OP_const2u:
104 case dwarf::DW_OP_const4u:
105 case dwarf::DW_OP_const8u:
106 case dwarf::DW_OP_const2s:
107 case dwarf::DW_OP_const4s:
108 case dwarf::DW_OP_const8s:
110 NextIt->getCode() != dwarf::DW_OP_form_tls_address)
113 case dwarf::DW_OP_constx:
114 case dwarf::DW_OP_addr:
115 case dwarf::DW_OP_addrx:
128 NextUnitOffset = StartOffset;
130 NextUnitOffset += (DwarfVersion >= 5) ? 12 : 11;
131 NextUnitOffset += NewUnit->getUnitDie().getSize();
133 return NextUnitOffset;
140 ForwardDIEReferences.emplace_back(Die, RefUnit, Ctxt, Attr);
144 for (
const auto &
Ref : ForwardDIEReferences) {
149 std::tie(RefDie, RefUnit, Ctxt, Attr) =
Ref;
152 "Canonical die offset is not set");
162 Labels.
insert({LabelLowPc, PcOffset});
167 Ranges.
insert({FuncLowPc, FuncHighPc}, PcOffset);
169 LowPc = std::min(*LowPc, FuncLowPc + PcOffset);
171 LowPc = FuncLowPc + PcOffset;
172 this->HighPc = std::max(HighPc, FuncHighPc + PcOffset);
176 if (Die.
getTag() == dwarf::DW_TAG_compile_unit) {
177 UnitRangeAttribute = Attr;
190 Namespaces.emplace_back(
Name, Die);
195 bool SkipPubSection) {
196 ObjC.emplace_back(
Name, Die, SkipPubSection);
201 bool SkipPubSection) {
202 Pubnames.emplace_back(
Name, Die, SkipPubSection);
207 bool ObjcClassImplementation,
209 Pubtypes.emplace_back(
Name, Die, QualifiedNameHash, ObjcClassImplementation);
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
void insert(AddressRange Range, int64_t Value)
A structured debug information entry.
unsigned getOffset() const
Get the compile/type unit relative offset of this DIE.
dwarf::Tag getTag() const
Utility class that carries the DWARF compile/type unit and the debug info entry in an object.
An iterator to go through the expression operations.
DWARFDie getUnitDIE(bool ExtractUnitDIEOnly=true)
DWARFDie getDIEAtIndex(unsigned Index)
Return the DIE object at the given index Index.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
DwarfStringPoolEntryRef: Dwarf string pool entry reference.
Class representing an expression and its matching format.
reference emplace_back(ArgTypes &&... Args)
StringRef - Represent a constant reference to a string, i.e.
std::string str() const
str - Get the contents as an std::string.
LLVM Value Representation.
Stores all information relating to a compile unit, be it in its original instance in the object file ...
void addFunctionRange(uint64_t LowPC, uint64_t HighPC, int64_t PCOffset)
Add a function range [LowPC, HighPC) that is relocated by applying offset PCOffset.
void fixupForwardReferences()
Apply all fixups recorded by noteForwardReference().
void noteForwardReference(DIE *Die, const CompileUnit *RefUnit, DeclContext *Ctxt, PatchLocation Attr)
Keep track of a forward reference to DIE Die in RefUnit by Attr.
void noteLocationAttribute(PatchLocation Attr)
Keep track of a location attribute pointing to a location list in the debug_loc section.
void addNameAccelerator(const DIE *Die, DwarfStringPoolEntryRef Name, bool SkipPubnamesSection=false)
Add a name accelerator entry for Die with Name.
void addNamespaceAccelerator(const DIE *Die, DwarfStringPoolEntryRef Name)
Add a name accelerator entry for Die with Name.
uint64_t getStartOffset() const
StringRef getSysRoot()
Return the DW_AT_LLVM_sysroot of the compile unit or an empty StringRef.
void noteRangeAttribute(const DIE &Die, PatchLocation Attr)
Keep track of a DW_AT_range attribute that we will need to patch up later.
void addObjCAccelerator(const DIE *Die, DwarfStringPoolEntryRef Name, bool SkipPubnamesSection=false)
Add various accelerator entries for Die with Name which is stored in the string table at Offset.
void addTypeAccelerator(const DIE *Die, DwarfStringPoolEntryRef Name, bool ObjcClassImplementation, uint32_t QualifiedNameHash)
Add a type accelerator entry for Die with Name which is stored in the string table at Offset.
DWARFUnit & getOrigUnit() const
uint64_t computeNextUnitOffset(uint16_t DwarfVersion)
Compute the end offset for this unit.
void addLabelLowPc(uint64_t LabelLowPc, int64_t PcOffset)
Add the low_pc of a label that is relocated by applying offset PCOffset.
void markEverythingAsKept()
Mark every DIE in this unit as kept.
A DeclContext is a named program scope that is used for ODR uniquing of types.
bool hasCanonicalDIE() const
uint32_t getCanonicalDIEOffset() const
StringRef toStringRef(const std::optional< DWARFFormValue > &V, StringRef Default={})
Take an optional DWARFFormValue and try to extract a string value from it.
std::optional< uint64_t > toUnsigned(const std::optional< DWARFFormValue > &V)
Take an optional DWARFFormValue and try to extract an unsigned constant.
This is an optimization pass for GlobalISel generic memory operations.
auto formatv(const char *Fmt, Ts &&...Vals) -> formatv_object< decltype(std::make_tuple(support::detail::build_format_adapter(std::forward< Ts >(Vals))...))>
static bool inFunctionScope(CompileUnit &U, unsigned Idx)
Check if the DIE at Idx is in the scope of a function.
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Ref
The access may reference the value stored in memory.
@ Keep
No function return thunk.
LLVM_DUMP_METHOD void dump()
void set(uint64_t New) const