9#ifndef LLVM_DWARFLINKER_ADDRESSESMAP_H
10#define LLVM_DWARFLINKER_ADDRESSESMAP_H
56 std::optional<uint64_t> AddrOffset =
57 U.getIndexedAddressOffset(
Op.getRawOperand(0));
61 U,
Op, *AddrOffset, *AddrOffset + U.getAddressByteSize(),
Verbose);
71 virtual std::optional<int64_t>
82 bool IsLittleEndian) = 0;
117 virtual std::optional<uint64_t>
130 int64_t Adjustment) {
134 assert(Symbol->LowPC <= LowPC && LowPC < Symbol->HighPC &&
135 "Symbol range must contain the address it was looked up for");
136 uint64_t LinkedSymbolHighPC = Symbol->HighPC + Adjustment;
137 assert(LinkedSymbolHighPC > Symbol->LowPC + Adjustment &&
138 "Adjusting a symbol range must preserve its order");
139 std::optional<uint64_t> NextStart =
143 assert(*NextStart >= LinkedSymbolHighPC &&
144 "A range must never be cut short of its own symbol");
145 return std::min(HighPC, *NextStart - Adjustment);
154 std::pair<bool, std::optional<int64_t>>
157 DIE.
getTag() == dwarf::DW_TAG_constant) &&
158 "Wrong type of input die");
160 const auto *Abbrev =
DIE.getAbbreviationDeclarationPtr();
164 std::optional<uint32_t> LocationIdx =
165 Abbrev->findAttributeIndex(dwarf::DW_AT_location);
167 return std::make_pair(
false, std::nullopt);
171 Abbrev->getAttributeOffsetFromIndex(*LocationIdx,
DIE.
getOffset(), *U);
174 std::optional<DWARFFormValue> LocationValue =
175 Abbrev->getAttributeValueFromOffset(*LocationIdx, AttrOffset, *U);
177 return std::make_pair(
false, std::nullopt);
182 std::optional<ArrayRef<uint8_t>> Expr = LocationValue->getAsBlock();
184 return std::make_pair(
false, std::nullopt);
189 U->getFormParams().Format);
191 bool HasLocationAddress =
false;
199 switch (
Op.getCode()) {
200 case dwarf::DW_OP_const2u:
201 case dwarf::DW_OP_const4u:
202 case dwarf::DW_OP_const8u:
203 case dwarf::DW_OP_const2s:
204 case dwarf::DW_OP_const4s:
205 case dwarf::DW_OP_const8s:
210 case dwarf::DW_OP_addr: {
211 HasLocationAddress =
true;
213 if (std::optional<int64_t> RelocAdjustment =
215 *U,
Op, AttrOffset + CurExprOffset,
216 AttrOffset +
Op.getEndOffset(),
Verbose))
217 return std::make_pair(HasLocationAddress, *RelocAdjustment);
219 case dwarf::DW_OP_constx:
220 case dwarf::DW_OP_addrx: {
221 HasLocationAddress =
true;
222 if (std::optional<uint64_t> AddressOffset =
223 DIE.getDwarfUnit()->getIndexedAddressOffset(
224 Op.getRawOperand(0))) {
226 if (std::optional<int64_t> RelocAdjustment =
228 *U,
Op, *AddressOffset,
229 *AddressOffset +
DIE.getDwarfUnit()->getAddressByteSize(),
231 return std::make_pair(HasLocationAddress, *RelocAdjustment);
238 CurExprOffset =
Op.getEndOffset();
241 return std::make_pair(HasLocationAddress, std::nullopt);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AddressRangesMap class maps values to the address ranges.
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.
This class represents an Operation in the Expression.
An iterator to go through the expression operations.
Class representing an expression and its matching format.
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
AddressesMap represents information about valid addresses used by debug information.
virtual bool hasValidRelocs()=0
Checks that there are valid relocations in the .debug_info section.
virtual void updateAndSaveValidRelocs(bool IsDWARF5, uint64_t OriginalUnitOffset, int64_t LinkedOffset, uint64_t StartOffset, uint64_t EndOffset)=0
Update and save relocation values to be serialized.
virtual void clear()=0
Erases all data.
virtual std::optional< uint64_t > getNextLinkedSymbolStart(uint64_t LinkedAddr)
Returns the linked address of the first symbol placed at or after LinkedAddr, if one is known.
virtual bool needToSaveValidRelocs()=0
Check if the linker needs to gather and save relocation info.
virtual std::optional< StringRef > getLibraryInstallName()=0
virtual ~AddressesMap()=default
std::optional< int64_t > getAddrIndexRelocAdjustment(DWARFUnit &U, const DWARFExpression::Operation &Op, bool Verbose)
Returns the relocation adjustment value for the .debug_addr entry that the DW_OP_addrx or DW_OP_const...
uint64_t constrainCodeRangeHighPC(uint64_t LowPC, uint64_t HighPC, int64_t Adjustment)
Constrains the end of the code range starting at LowPC, whose addresses shift by Adjustment in the ou...
virtual std::optional< SymbolRange > getSymbolRangeForAddress(uint64_t Addr)
Returns the symbol range [LowPC, HighPC) containing Addr, if known.
virtual bool applyValidRelocs(MutableArrayRef< char > Data, uint64_t BaseOffset, bool IsLittleEndian)=0
Apply the valid relocations to the buffer Data, taking into account that Data is at BaseOffset in the...
virtual std::optional< int64_t > getExprOpAddressRelocAdjustment(DWARFUnit &U, const DWARFExpression::Operation &Op, uint64_t StartOffset, uint64_t EndOffset, bool Verbose)=0
Checks that the specified DWARF expression operand Op references live code section and returns the re...
virtual void updateRelocationsWithUnitOffset(uint64_t OriginalUnitOffset, uint64_t OutputUnitOffset)=0
Update the valid relocations that used OriginalUnitOffset as the compile unit offset,...
std::pair< bool, std::optional< int64_t > > getVariableRelocAdjustment(const DWARFDie &DIE, bool Verbose)
This function checks whether variable has DWARF expression containing operation referencing live addr...
virtual std::optional< int64_t > getSubprogramRelocAdjustment(const DWARFDie &DIE, bool Verbose)=0
Checks that the specified subprogram DIE references the live code section and returns the relocation ...
AddressRangesMap RangesTy
Mapped value in the address map is the offset to apply to the linked address.
bool isTlsAddressOp(uint8_t O)
This is an optimization pass for GlobalISel generic memory operations.
DWARFExpression::Operation Op
SymbolRange(uint64_t LowPC, uint64_t HighPC)