mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-23 05:29:23 +00:00
Add DwarfCompileUnit::BaseAddress to track the base address used by relative addressing in debug_ranges and debug_loc
This is one of a few steps to generalize range handling to include the CU range (thus the CU's range list will be moved into the range list list, losing track of the base address in the process), which means generalizing ranges from both the skeleton and full unit under fission. And... then I can used that generalized support for ranges in fission+gmlt where there'll be a bunch more ranges in the skeleton. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221182 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8d7cc6b0ff
commit
dc1d16ae54
@ -19,7 +19,7 @@ DwarfCompileUnit::DwarfCompileUnit(unsigned UID, DICompileUnit Node,
|
||||
AsmPrinter *A, DwarfDebug *DW,
|
||||
DwarfFile *DWU)
|
||||
: DwarfUnit(UID, dwarf::DW_TAG_compile_unit, Node, A, DW, DWU),
|
||||
Skeleton(nullptr), LabelBegin(nullptr) {
|
||||
Skeleton(nullptr), LabelBegin(nullptr), BaseAddress(nullptr) {
|
||||
insertDIE(Node, &getUnitDie());
|
||||
}
|
||||
|
||||
|
@ -55,6 +55,10 @@ class DwarfCompileUnit : public DwarfUnit {
|
||||
// List of ranges for a given compile unit.
|
||||
SmallVector<RangeSpan, 1> CURanges;
|
||||
|
||||
// The base address of this unit, if any. Used for relative references in
|
||||
// ranges/locs.
|
||||
const MCSymbol *BaseAddress;
|
||||
|
||||
/// \brief Construct a DIE for the given DbgVariable without initializing the
|
||||
/// DbgVariable's DIE reference.
|
||||
std::unique_ptr<DIE> constructVariableDIEImpl(const DbgVariable &DV,
|
||||
@ -233,6 +237,9 @@ public:
|
||||
|
||||
/// getRanges - Get the list of ranges for this unit.
|
||||
const SmallVectorImpl<RangeSpan> &getRanges() const { return CURanges; }
|
||||
|
||||
void setBaseAddress(const MCSymbol *Base) { BaseAddress = Base; }
|
||||
const MCSymbol *getBaseAddress() const { return BaseAddress; }
|
||||
};
|
||||
|
||||
} // end llvm namespace
|
||||
|
@ -592,6 +592,7 @@ void DwarfDebug::finalizeModuleInfo() {
|
||||
U.addUInt(U.getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
|
||||
} else {
|
||||
const RangeSpan &Range = TheCU.getRanges().back();
|
||||
TheCU.setBaseAddress(Range.getStart());
|
||||
U.attachLowHighPC(U.getUnitDie(), Range.getStart(), Range.getEnd());
|
||||
}
|
||||
}
|
||||
@ -1791,9 +1792,7 @@ void DwarfDebug::emitDebugLoc() {
|
||||
// Set up the range. This range is relative to the entry point of the
|
||||
// compile unit. This is a hard coded 0 for low_pc when we're emitting
|
||||
// ranges, or the DW_AT_low_pc on the compile unit otherwise.
|
||||
if (CU->getRanges().size() == 1) {
|
||||
// Grab the begin symbol from the first range as our base.
|
||||
const MCSymbol *Base = CU->getRanges()[0].getStart();
|
||||
if (auto *Base = CU->getBaseAddress()) {
|
||||
Asm->EmitLabelDifference(Entry.getBeginSym(), Base, Size);
|
||||
Asm->EmitLabelDifference(Entry.getEndSym(), Base, Size);
|
||||
} else {
|
||||
@ -2003,9 +2002,7 @@ void DwarfDebug::emitDebugRanges() {
|
||||
const MCSymbol *End = Range.getEnd();
|
||||
assert(Begin && "Range without a begin symbol?");
|
||||
assert(End && "Range without an end symbol?");
|
||||
if (TheCU->getRanges().size() == 1) {
|
||||
// Grab the begin symbol from the first range as our base.
|
||||
const MCSymbol *Base = TheCU->getRanges()[0].getStart();
|
||||
if (auto *Base = TheCU->getBaseAddress()) {
|
||||
Asm->EmitLabelDifference(Begin, Base, Size);
|
||||
Asm->EmitLabelDifference(End, Base, Size);
|
||||
} else {
|
||||
|
Loading…
x
Reference in New Issue
Block a user