Index: include/llvm/DebugInfo/DWARF/DWARFFormValue.h =================================================================== --- include/llvm/DebugInfo/DWARF/DWARFFormValue.h +++ include/llvm/DebugInfo/DWARF/DWARFFormValue.h @@ -49,40 +49,41 @@ const uint8_t* data; }; - dwarf::Form Form; // Form for this value. + dwarf::Form Form; // Form for this value. ValueType Value; // Contains all data for the form. + const DWARFUnit *U; // Remember the DWARFUnit at extract time. public: - DWARFFormValue(dwarf::Form F = dwarf::Form(0)) : Form(F) {} + DWARFFormValue(dwarf::Form F = dwarf::Form(0)) : Form(F), U(nullptr) {} dwarf::Form getForm() const { return Form; } bool isFormClass(FormClass FC) const; + const DWARFUnit *getUnit() const { return U; } + void dump(raw_ostream &OS) const; - void dump(raw_ostream &OS, const DWARFUnit *U) const; - /// \brief extracts a value in data at offset *offset_ptr. /// /// The passed DWARFUnit is allowed to be nullptr, in which /// case no relocation processing will be performed and some /// kind of forms that depend on Unit information are disallowed. /// \returns whether the extraction succeeded. - bool extractValue(DataExtractor data, uint32_t *offset_ptr, - const DWARFUnit *u); + bool extractValue(const DataExtractor &Data, uint32_t *OffsetPtr, + const DWARFUnit *U); bool isInlinedCStr() const { return Value.data != nullptr && Value.data == (const uint8_t*)Value.cstr; } /// getAsFoo functions below return the extracted value as Foo if only /// DWARFFormValue has form class is suitable for representing Foo. - Optional getAsReference(const DWARFUnit *U) const; + Optional getAsReference() const; Optional getAsUnsignedConstant() const; Optional getAsSignedConstant() const; - Optional getAsCString(const DWARFUnit *U) const; - Optional getAsAddress(const DWARFUnit *U) const; + Optional getAsCString() const; + Optional getAsAddress() const; Optional getAsSectionOffset() const; Optional> getAsBlock() const; bool skipValue(DataExtractor debug_info_data, uint32_t *offset_ptr, - const DWARFUnit *u) const; + const DWARFUnit *U) const; static bool skipValue(dwarf::Form form, DataExtractor debug_info_data, uint32_t *offset_ptr, const DWARFUnit *u); static bool skipValue(dwarf::Form form, DataExtractor debug_info_data, @@ -92,7 +93,7 @@ static ArrayRef getFixedFormSizes(uint8_t AddrSize, uint16_t Version); private: - void dumpString(raw_ostream &OS, const DWARFUnit *U) const; + void dumpString(raw_ostream &OS) const; }; } Index: include/llvm/DebugInfo/DWARF/DWARFUnit.h =================================================================== --- include/llvm/DebugInfo/DWARF/DWARFUnit.h +++ include/llvm/DebugInfo/DWARF/DWARFUnit.h @@ -195,6 +195,10 @@ return Abbrevs; } uint8_t getAddressByteSize() const { return AddrSize; } + uint8_t getRefAddrByteSize() const { + // FIXME: Support DWARF64. + return (Version == 2) ? AddrSize : 4; + } uint64_t getBaseAddress() const { return BaseAddr; } void setBaseAddress(uint64_t base_addr) { Index: lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp =================================================================== --- lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp +++ lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp @@ -120,7 +120,7 @@ for (auto &Atom : AtomForms) { OS << format("{Atom[%d]: ", i++); if (Atom.extractValue(AccelSection, &DataOffset, nullptr)) - Atom.dump(OS, nullptr); + Atom.dump(OS); else OS << "Error extracting the value"; OS << "} "; Index: lib/DebugInfo/DWARF/DWARFDebugInfoEntry.cpp =================================================================== --- lib/DebugInfo/DWARF/DWARFDebugInfoEntry.cpp +++ lib/DebugInfo/DWARF/DWARFDebugInfoEntry.cpp @@ -158,13 +158,13 @@ else if (attr == DW_AT_decl_line || attr == DW_AT_call_line) OS << *formValue.getAsUnsignedConstant(); else - formValue.dump(OS, u); + formValue.dump(OS); // We have dumped the attribute raw value. For some attributes // having both the raw value and the pretty-printed value is // interesting. These attributes are handled below. if (attr == DW_AT_specification || attr == DW_AT_abstract_origin) { - Optional Ref = formValue.getAsReference(u); + Optional Ref = formValue.getAsReference(); if (Ref.hasValue()) { uint32_t RefOffset = Ref.getValue(); DWARFDebugInfoEntryMinimal DIE; @@ -264,7 +264,7 @@ DWARFFormValue FormValue; if (!getAttributeValue(U, Attr, FormValue)) return FailValue; - Optional Result = FormValue.getAsCString(U); + Optional Result = FormValue.getAsCString(); return Result.hasValue() ? Result.getValue() : FailValue; } @@ -274,7 +274,7 @@ DWARFFormValue FormValue; if (!getAttributeValue(U, Attr, FormValue)) return FailValue; - Optional Result = FormValue.getAsAddress(U); + Optional Result = FormValue.getAsAddress(); return Result.hasValue() ? Result.getValue() : FailValue; } @@ -294,7 +294,7 @@ DWARFFormValue FormValue; if (!getAttributeValue(U, Attr, FormValue)) return FailValue; - Optional Result = FormValue.getAsReference(U); + Optional Result = FormValue.getAsReference(); return Result.hasValue() ? Result.getValue() : FailValue; } Index: lib/DebugInfo/DWARF/DWARFFormValue.cpp =================================================================== --- lib/DebugInfo/DWARF/DWARFFormValue.cpp +++ lib/DebugInfo/DWARF/DWARFFormValue.cpp @@ -133,8 +133,10 @@ FC == FC_SectionOffset; } -bool DWARFFormValue::extractValue(DataExtractor data, uint32_t *offset_ptr, +bool DWARFFormValue::extractValue(const DataExtractor &data, + uint32_t *offset_ptr, const DWARFUnit *cu) { + U = cu; bool indirect = false; bool is_block = false; Value.data = nullptr; @@ -145,14 +147,14 @@ switch (Form) { case DW_FORM_addr: case DW_FORM_ref_addr: { - if (!cu) + if (!U) return false; uint16_t AddrSize = (Form == DW_FORM_addr) - ? cu->getAddressByteSize() - : getRefAddrSize(cu->getAddressByteSize(), cu->getVersion()); - RelocAddrMap::const_iterator AI = cu->getRelocMap()->find(*offset_ptr); - if (AI != cu->getRelocMap()->end()) { + ? U->getAddressByteSize() + : U->getRefAddrByteSize(); + RelocAddrMap::const_iterator AI = U->getRelocMap()->find(*offset_ptr); + if (AI != U->getRelocMap()->end()) { const std::pair &R = AI->second; Value.uval = data.getUnsigned(offset_ptr, AddrSize) + R.second; } else @@ -188,10 +190,10 @@ case DW_FORM_data4: case DW_FORM_ref4: { Value.uval = data.getU32(offset_ptr); - if (!cu) + if (!U) break; - RelocAddrMap::const_iterator AI = cu->getRelocMap()->find(*offset_ptr-4); - if (AI != cu->getRelocMap()->end()) + RelocAddrMap::const_iterator AI = U->getRelocMap()->find(*offset_ptr-4); + if (AI != U->getRelocMap()->end()) Value.uval += AI->second.second; break; } @@ -219,11 +221,11 @@ case DW_FORM_GNU_strp_alt: { // FIXME: This is 64-bit for DWARF64. Value.uval = data.getU32(offset_ptr); - if (!cu) + if (!U) break; RelocAddrMap::const_iterator AI = - cu->getRelocMap()->find(*offset_ptr - 4); - if (AI != cu->getRelocMap()->end()) + U->getRelocMap()->find(*offset_ptr - 4); + if (AI != U->getRelocMap()->end()) Value.uval += AI->second.second; break; } @@ -256,8 +258,8 @@ bool DWARFFormValue::skipValue(DataExtractor debug_info_data, uint32_t* offset_ptr, - const DWARFUnit *cu) const { - return DWARFFormValue::skipValue(Form, debug_info_data, offset_ptr, cu); + const DWARFUnit *U) const { + return DWARFFormValue::skipValue(Form, debug_info_data, offset_ptr, U); } bool @@ -371,7 +373,7 @@ } void -DWARFFormValue::dump(raw_ostream &OS, const DWARFUnit *cu) const { +DWARFFormValue::dump(raw_ostream &OS) const { uint64_t uvalue = Value.uval; bool cu_relative_offset = false; @@ -380,7 +382,9 @@ case DW_FORM_GNU_addr_index: { OS << format(" indexed (%8.8x) address = ", (uint32_t)uvalue); uint64_t Address; - if (cu->getAddrOffsetSectionItem(uvalue, Address)) + if (U == nullptr) + OS << ""; + else if (U->getAddrOffsetSectionItem(uvalue, Address)) OS << format("0x%016" PRIx64, Address); else OS << ""; @@ -431,17 +435,17 @@ case DW_FORM_udata: OS << Value.uval; break; case DW_FORM_strp: { OS << format(" .debug_str[0x%8.8x] = ", (uint32_t)uvalue); - dumpString(OS, cu); + dumpString(OS); break; } case DW_FORM_GNU_str_index: { OS << format(" indexed (%8.8x) string = ", (uint32_t)uvalue); - dumpString(OS, cu); + dumpString(OS); break; } case DW_FORM_GNU_strp_alt: { OS << format("alt indirect string, offset: 0x%" PRIx64 "", uvalue); - dumpString(OS, cu); + dumpString(OS); break; } case DW_FORM_ref_addr: @@ -490,13 +494,13 @@ if (cu_relative_offset) { OS << " => {"; WithColor(OS, syntax::Address).get() - << format("0x%8.8" PRIx64, uvalue + (cu ? cu->getOffset() : 0)); + << format("0x%8.8" PRIx64, uvalue + (U ? U->getOffset() : 0)); OS << "}"; } } -void DWARFFormValue::dumpString(raw_ostream &OS, const DWARFUnit *U) const { - Optional DbgStr = getAsCString(U); +void DWARFFormValue::dumpString(raw_ostream &OS) const { + Optional DbgStr = getAsCString(); if (DbgStr.hasValue()) { raw_ostream &COS = WithColor(OS, syntax::String); COS << '"'; @@ -505,7 +509,7 @@ } } -Optional DWARFFormValue::getAsCString(const DWARFUnit *U) const { +Optional DWARFFormValue::getAsCString() const { if (!isFormClass(FC_String)) return None; if (Form == DW_FORM_string) @@ -526,7 +530,7 @@ return None; } -Optional DWARFFormValue::getAsAddress(const DWARFUnit *U) const { +Optional DWARFFormValue::getAsAddress() const { if (!isFormClass(FC_Address)) return None; if (Form == DW_FORM_GNU_addr_index) { @@ -539,7 +543,7 @@ return Value.uval; } -Optional DWARFFormValue::getAsReference(const DWARFUnit *U) const { +Optional DWARFFormValue::getAsReference() const { if (!isFormClass(FC_Reference)) return None; switch (Form) { Index: lib/DebugInfo/DWARF/DWARFTypeUnit.cpp =================================================================== --- lib/DebugInfo/DWARF/DWARFTypeUnit.cpp +++ lib/DebugInfo/DWARF/DWARFTypeUnit.cpp @@ -30,7 +30,7 @@ DWARFFormValue NameVal; const char *Name = ""; if (TD->getAttributeValue(this, llvm::dwarf::DW_AT_name, NameVal)) - if (auto ON = NameVal.getAsCString(this)) + if (auto ON = NameVal.getAsCString()) Name = *ON; if (SummarizeTypes) { Index: tools/dsymutil/DwarfLinker.cpp =================================================================== --- tools/dsymutil/DwarfLinker.cpp +++ tools/dsymutil/DwarfLinker.cpp @@ -1487,7 +1487,7 @@ const DWARFFormValue &RefValue, const DWARFUnit &Unit, const DWARFDebugInfoEntryMinimal &DIE, CompileUnit *&RefCU) { assert(RefValue.isFormClass(DWARFFormValue::FC_Reference)); - uint64_t RefOffset = *RefValue.getAsReference(&Unit); + uint64_t RefOffset = *RefValue.getAsReference(); if ((RefCU = getUnitForOffset(Units, RefOffset))) if (const auto *RefDie = RefCU->getOrigUnit().getDIEForOffset(RefOffset)) @@ -2159,7 +2159,7 @@ uint64_t HighPc; if (HighPcValue.isFormClass(DWARFFormValue::FC_Address)) { - HighPc = *HighPcValue.getAsAddress(&OrigUnit); + HighPc = *HighPcValue.getAsAddress(); } else { assert(HighPcValue.isFormClass(DWARFFormValue::FC_Constant)); HighPc = LowPc + *HighPcValue.getAsUnsignedConstant(); @@ -2357,7 +2357,7 @@ const DWARFFormValue &Val, const DWARFUnit &U) { // Switch everything to out of line strings. - const char *String = *Val.getAsCString(&U); + const char *String = *Val.getAsCString(); unsigned Offset = Linker.StringPool.getStringOffset(String); Die.addValue(DIEAlloc, dwarf::Attribute(AttrSpec.Attr), dwarf::DW_FORM_strp, DIEInteger(Offset)); @@ -2369,7 +2369,7 @@ AttributeSpec AttrSpec, unsigned AttrSize, const DWARFFormValue &Val, CompileUnit &Unit) { const DWARFUnit &U = Unit.getOrigUnit(); - uint32_t Ref = *Val.getAsReference(&U); + uint32_t Ref = *Val.getAsReference(); DIE *NewRefDie = nullptr; CompileUnit *RefUnit = nullptr; DeclContext *Ctxt = nullptr; @@ -2481,7 +2481,7 @@ unsigned DwarfLinker::DIECloner::cloneAddressAttribute( DIE &Die, AttributeSpec AttrSpec, const DWARFFormValue &Val, const CompileUnit &Unit, AttributesInfo &Info) { - uint64_t Addr = *Val.getAsAddress(&Unit.getOrigUnit()); + uint64_t Addr = *Val.getAsAddress(); if (AttrSpec.Attr == dwarf::DW_AT_low_pc) { if (Die.getTag() == dwarf::DW_TAG_inlined_subroutine || Die.getTag() == dwarf::DW_TAG_lexical_block)