mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[DebugInfo] Use absolute addresses in location lists
Rather than relying on the user to do the address calculating in DW_AT_location we should just dump the absolute address. rdar://problem/38513870 Differential revision: https://reviews.llvm.org/D47152 llvm-svn: 332873
This commit is contained in:
parent
2d0d4e82be
commit
92f8a3c24d
@ -42,7 +42,8 @@ public:
|
||||
SmallVector<Entry, 2> Entries;
|
||||
/// Dump this list on OS.
|
||||
void dump(raw_ostream &OS, bool IsLittleEndian, unsigned AddressSize,
|
||||
const MCRegisterInfo *MRI, unsigned Indent) const;
|
||||
const MCRegisterInfo *MRI, uint64_t BaseAddress,
|
||||
unsigned Indent) const;
|
||||
};
|
||||
|
||||
private:
|
||||
|
@ -420,9 +420,7 @@ public:
|
||||
llvm_unreachable("Invalid UnitType.");
|
||||
}
|
||||
|
||||
llvm::Optional<BaseAddress> getBaseAddress() const { return BaseAddr; }
|
||||
|
||||
void setBaseAddress(BaseAddress BaseAddr) { this->BaseAddr = BaseAddr; }
|
||||
llvm::Optional<BaseAddress> getBaseAddress();
|
||||
|
||||
DWARFDie getUnitDIE(bool ExtractUnitDIEOnly = true) {
|
||||
extractDIEsIfNeeded(ExtractUnitDIEOnly);
|
||||
|
@ -40,13 +40,15 @@ static void dumpExpression(raw_ostream &OS, ArrayRef<char> Data,
|
||||
void DWARFDebugLoc::LocationList::dump(raw_ostream &OS, bool IsLittleEndian,
|
||||
unsigned AddressSize,
|
||||
const MCRegisterInfo *MRI,
|
||||
uint64_t BaseAddress,
|
||||
unsigned Indent) const {
|
||||
for (const Entry &E : Entries) {
|
||||
OS << '\n';
|
||||
OS.indent(Indent);
|
||||
OS << format("[0x%*.*" PRIx64 ", ", AddressSize * 2, AddressSize * 2,
|
||||
E.Begin)
|
||||
<< format(" 0x%*.*" PRIx64 ")", AddressSize * 2, AddressSize * 2, E.End);
|
||||
BaseAddress + E.Begin);
|
||||
OS << format(" 0x%*.*" PRIx64 ")", AddressSize * 2, AddressSize * 2,
|
||||
BaseAddress + E.End);
|
||||
OS << ": ";
|
||||
|
||||
dumpExpression(OS, E.Loc, IsLittleEndian, AddressSize, MRI);
|
||||
@ -67,7 +69,7 @@ void DWARFDebugLoc::dump(raw_ostream &OS, const MCRegisterInfo *MRI,
|
||||
Optional<uint64_t> Offset) const {
|
||||
auto DumpLocationList = [&](const LocationList &L) {
|
||||
OS << format("0x%8.8x: ", L.Offset);
|
||||
L.dump(OS, IsLittleEndian, AddressSize, MRI, 12);
|
||||
L.dump(OS, IsLittleEndian, AddressSize, MRI, 0, 12);
|
||||
OS << "\n\n";
|
||||
};
|
||||
|
||||
|
@ -102,15 +102,18 @@ static void dumpLocation(raw_ostream &OS, DWARFFormValue &FormValue,
|
||||
const DWARFSection &LocSection = Obj.getLocSection();
|
||||
const DWARFSection &LocDWOSection = Obj.getLocDWOSection();
|
||||
uint32_t Offset = *FormValue.getAsSectionOffset();
|
||||
|
||||
if (!LocSection.Data.empty()) {
|
||||
DWARFDebugLoc DebugLoc;
|
||||
DWARFDataExtractor Data(Obj, LocSection, Ctx.isLittleEndian(),
|
||||
Obj.getAddressSize());
|
||||
auto LL = DebugLoc.parseOneLocationList(Data, &Offset);
|
||||
if (LL)
|
||||
LL->dump(OS, Ctx.isLittleEndian(), Obj.getAddressSize(), MRI, Indent);
|
||||
else
|
||||
if (LL) {
|
||||
uint64_t BaseAddr = 0;
|
||||
if (Optional<BaseAddress> BA = U->getBaseAddress())
|
||||
BaseAddr = BA->Address;
|
||||
LL->dump(OS, Ctx.isLittleEndian(), Obj.getAddressSize(), MRI, BaseAddr,
|
||||
Indent);
|
||||
} else
|
||||
OS << "error extracting location list.";
|
||||
} else if (!LocDWOSection.Data.empty()) {
|
||||
DataExtractor Data(LocDWOSection.Data, Ctx.isLittleEndian(), 0);
|
||||
|
@ -269,10 +269,6 @@ size_t DWARFUnit::extractDIEsIfNeeded(bool CUDieOnly) {
|
||||
// If CU DIE was just parsed, copy several attribute values from it.
|
||||
if (!HasCUDie) {
|
||||
DWARFDie UnitDie = getUnitDIE();
|
||||
Optional<DWARFFormValue> PC = UnitDie.find({DW_AT_low_pc, DW_AT_entry_pc});
|
||||
if (Optional<uint64_t> Addr = toAddress(PC))
|
||||
setBaseAddress({*Addr, PC->getSectionIndex()});
|
||||
|
||||
if (!isDWO) {
|
||||
assert(AddrOffsetSectionBase == 0);
|
||||
assert(RangeSectionBase == 0);
|
||||
@ -578,6 +574,18 @@ const DWARFAbbreviationDeclarationSet *DWARFUnit::getAbbreviations() const {
|
||||
return Abbrevs;
|
||||
}
|
||||
|
||||
llvm::Optional<BaseAddress> DWARFUnit::getBaseAddress() {
|
||||
if (BaseAddr)
|
||||
return BaseAddr;
|
||||
|
||||
DWARFDie UnitDie = getUnitDIE();
|
||||
Optional<DWARFFormValue> PC = UnitDie.find({DW_AT_low_pc, DW_AT_entry_pc});
|
||||
if (Optional<uint64_t> Addr = toAddress(PC))
|
||||
BaseAddr = {*Addr, PC->getSectionIndex()};
|
||||
|
||||
return BaseAddr;
|
||||
}
|
||||
|
||||
Optional<StrOffsetsContributionDescriptor>
|
||||
StrOffsetsContributionDescriptor::validateContributionSize(
|
||||
DWARFDataExtractor &DA) {
|
||||
|
@ -43,8 +43,8 @@
|
||||
; CHECK: DW_TAG_formal_parameter
|
||||
; CHECK-NOT: DW_TAG
|
||||
; CHECK: DW_AT_location [DW_FORM_sec_offset] ({{.*}}
|
||||
; CHECK-NEXT: [0x00000000, 0x00000017): DW_OP_breg0 EAX+0, DW_OP_deref
|
||||
; CHECK-NEXT: [0x00000017, 0x00000043): DW_OP_breg5 EBP-8, DW_OP_deref, DW_OP_deref
|
||||
; CHECK-NEXT: [0x00000020, 0x00000037): DW_OP_breg0 EAX+0, DW_OP_deref
|
||||
; CHECK-NEXT: [0x00000037, 0x00000063): DW_OP_breg5 EBP-8, DW_OP_deref, DW_OP_deref
|
||||
; CHECK-NEXT: DW_AT_name [DW_FORM_strp]{{.*}}"a"
|
||||
|
||||
; CHECK: DW_TAG_variable
|
||||
|
@ -74,7 +74,7 @@ CHECK: DW_AT_prototyped (true)
|
||||
CHECK: DW_AT_type (0x000000a1
|
||||
CHECK: DW_TAG_formal_parameter
|
||||
CHECK: DW_AT_location (0x00000000
|
||||
CHECK: [0x0000000000000000, 0x000000000000000c): DW_OP_reg5 RDI, DW_OP_piece 0x4)
|
||||
CHECK: [0x0000000100000f50, 0x0000000100000f5c): DW_OP_reg5 RDI, DW_OP_piece 0x4)
|
||||
CHECK: DW_AT_name ("arg")
|
||||
CHECK: DW_AT_type (0x000000a1
|
||||
CHECK: DW_TAG_inlined_subroutine
|
||||
@ -107,8 +107,8 @@ CHECK: DW_AT_frame_base (DW_OP_reg6 RBP)
|
||||
CHECK: DW_AT_name ("bar")
|
||||
CHECK: DW_TAG_formal_parameter
|
||||
CHECK: DW_AT_location (0x00000025
|
||||
CHECK: [0x0000000000000000, 0x000000000000000f): DW_OP_reg5 RDI, DW_OP_piece 0x4
|
||||
CHECK: [0x0000000000000019, 0x000000000000001d): DW_OP_reg5 RDI, DW_OP_piece 0x4)
|
||||
CHECK: [0x0000000100000f90, 0x0000000100000f9f): DW_OP_reg5 RDI, DW_OP_piece 0x4
|
||||
CHECK: [0x0000000100000fa9, 0x0000000100000fad): DW_OP_reg5 RDI, DW_OP_piece 0x4)
|
||||
CHECK: DW_AT_name ("arg")
|
||||
CHECK: DW_TAG_inlined_subroutine
|
||||
CHECK: DW_AT_abstract_origin (0x0000015f "inc")
|
||||
|
@ -77,7 +77,7 @@ CHECK: DW_TAG_formal_parameter
|
||||
CHECK: DW_AT_name ("arg")
|
||||
CHECK: DW_AT_type (0x0000000000000063
|
||||
CHECK: DW_AT_location (0x00000000
|
||||
CHECK: [0x0000000000000000, 0x000000000000000e): DW_OP_reg5 RDI, DW_OP_piece 0x4)
|
||||
CHECK: [0x0000000100000f50, 0x0000000100000f5e): DW_OP_reg5 RDI, DW_OP_piece 0x4)
|
||||
CHECK:[[INC1:0x[0-9a-f]*]]{{.*}}DW_TAG_inlined_subroutine
|
||||
CHECK: DW_AT_abstract_origin (0x00000128 "inc")
|
||||
CHECK: DW_AT_low_pc (0x0000000100000f63)
|
||||
@ -115,8 +115,8 @@ CHECK: DW_TAG_formal_parameter
|
||||
CHECK: DW_AT_name ("arg")
|
||||
CHECK: DW_AT_type (0x0000000000000063
|
||||
CHECK: DW_AT_location (0x00000025
|
||||
CHECK: [0x0000000000000000, 0x000000000000000f): DW_OP_reg5 RDI, DW_OP_piece 0x4
|
||||
CHECK: [0x0000000000000019, 0x000000000000001d): DW_OP_reg5 RDI, DW_OP_piece 0x4)
|
||||
CHECK: [0x0000000100000f90, 0x0000000100000f9f): DW_OP_reg5 RDI, DW_OP_piece 0x4
|
||||
CHECK: [0x0000000100000fa9, 0x0000000100000fad): DW_OP_reg5 RDI, DW_OP_piece 0x4)
|
||||
CHECK: DW_TAG_lexical_block
|
||||
CHECK: DW_AT_low_pc (0x0000000100000f94)
|
||||
CHECK: DW_AT_high_pc (0x0000000100000fa7)
|
||||
|
Loading…
Reference in New Issue
Block a user