[llvm] r304078 - Recommit "[DWARF] - Make collectAddressRanges() return section index in addition to Low/High PC"
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Sat May 27 12:23:05 PDT 2017
On Sat, May 27, 2017 at 11:10 AM George Rimar via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: grimar
> Date: Sat May 27 13:10:23 2017
> New Revision: 304078
>
> URL: http://llvm.org/viewvc/llvm-project?rev=304078&view=rev
> Log:
> Recommit "[DWARF] - Make collectAddressRanges() return section index in
> addition to Low/High PC"
>
> With fix of uninitialized variable.
>
Which variable/where was it uninitialized? Do you know if this was failing
reliably with msan?
>
> Original commit message:
>
> This change is intended to use for LLD in D33183.
> Problem we have in LLD when building .gdb_index is that we need to know
> section which address range belongs to.
>
> Previously it was solved on LLD side by providing fake section addresses
> with use of llvm::LoadedObjectInfo
> interface. We assigned file offsets as addressed. Then after obtaining
> ranges lists, for each range we had to find section ID's.
> That not only was slow, but also complicated implementation and was the
> reason of incorrect behavior when
> sections share the same offsets, like D33176 shows.
>
> This patch makes DWARF parsers to return section index as well. That
> solves problem mentioned above.
>
> Differential revision: https://reviews.llvm.org/D33184
>
> Modified:
> llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h
> llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugRangeList.h
> llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDie.h
> llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFFormValue.h
> llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFRelocMap.h
> llvm/trunk/include/llvm/Object/COFF.h
> llvm/trunk/include/llvm/Object/ELFObjectFile.h
> llvm/trunk/include/llvm/Object/MachO.h
> llvm/trunk/include/llvm/Object/ObjectFile.h
> llvm/trunk/include/llvm/Object/Wasm.h
> llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp
> llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRangeList.cpp
> llvm/trunk/lib/DebugInfo/DWARF/DWARFDie.cpp
> llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp
> llvm/trunk/lib/Object/COFFObjectFile.cpp
> llvm/trunk/lib/Object/MachOObjectFile.cpp
> llvm/trunk/lib/Object/WasmObjectFile.cpp
> llvm/trunk/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp
>
> Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h?rev=304078&r1=304077&r2=304078&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h Sat May 27
> 13:10:23 2017
> @@ -46,7 +46,8 @@ class raw_ostream;
> /// Reads a value from data extractor and applies a relocation to the
> result if
> /// one exists for the given offset.
> uint64_t getRelocatedValue(const DataExtractor &Data, uint32_t Size,
> - uint32_t *Off, const RelocAddrMap *Relocs);
> + uint32_t *Off, const RelocAddrMap *Relocs,
> + uint64_t *SecNdx = nullptr);
>
> /// DWARFContext
> /// This data structure is the top level entity that deals with dwarf
> debug
>
> Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugRangeList.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugRangeList.h?rev=304078&r1=304077&r2=304078&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugRangeList.h
> (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugRangeList.h Sat May
> 27 13:10:23 2017
> @@ -25,6 +25,7 @@ class raw_ostream;
> struct DWARFAddressRange {
> uint64_t LowPC;
> uint64_t HighPC;
> + uint64_t SectionIndex;
> };
>
> /// DWARFAddressRangesVector - represents a set of absolute address
> ranges.
> @@ -44,6 +45,8 @@ public:
> /// address past the end of the address range. The ending address must
> /// be greater than or equal to the beginning address.
> uint64_t EndAddress;
> + /// A section index this range belongs to.
> + uint64_t SectionIndex;
>
> /// The end of any given range list is marked by an end of list entry,
> /// which consists of a 0 for the beginning address offset
>
> Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDie.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDie.h?rev=304078&r1=304077&r2=304078&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDie.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDie.h Sat May 27 13:10:23
> 2017
> @@ -195,7 +195,8 @@ public:
>
> /// Retrieves DW_AT_low_pc and DW_AT_high_pc from CU.
> /// Returns true if both attributes are present.
> - bool getLowAndHighPC(uint64_t &LowPC, uint64_t &HighPC) const;
> + bool getLowAndHighPC(uint64_t &LowPC, uint64_t &HighPC,
> + uint64_t &SectionIndex) const;
>
> /// Get the address ranges for this DIE.
> ///
>
> Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFFormValue.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFFormValue.h?rev=304078&r1=304077&r2=304078&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFFormValue.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFFormValue.h Sat May 27
> 13:10:23 2017
> @@ -47,6 +47,7 @@ private:
> const char *cstr;
> };
> const uint8_t *data = nullptr;
> + uint64_t SectionIndex; /// Section index for reference forms.
> };
>
> dwarf::Form Form; /// Form for this value.
> @@ -58,6 +59,7 @@ public:
>
> dwarf::Form getForm() const { return Form; }
> uint64_t getRawUValue() const { return Value.uval; }
> + uint64_t getSectionIndex() const { return Value.SectionIndex; }
> void setForm(dwarf::Form F) { Form = F; }
> void setUValue(uint64_t V) { Value.uval = V; }
> void setSValue(int64_t V) { Value.sval = V; }
>
> Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFRelocMap.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFRelocMap.h?rev=304078&r1=304077&r2=304078&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFRelocMap.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFRelocMap.h Sat May 27
> 13:10:23 2017
> @@ -16,7 +16,10 @@
>
> namespace llvm {
>
> +/// RelocAddrEntry contains relocated value and section index.
> +/// Section index is -1LL if relocation points to absolute symbol.
> struct RelocAddrEntry {
> + uint64_t SectionIndex;
> uint64_t Value;
> };
>
>
> Modified: llvm/trunk/include/llvm/Object/COFF.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/COFF.h?rev=304078&r1=304077&r2=304078&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/COFF.h (original)
> +++ llvm/trunk/include/llvm/Object/COFF.h Sat May 27 13:10:23 2017
> @@ -782,6 +782,7 @@ protected:
> std::error_code getSectionName(DataRefImpl Sec,
> StringRef &Res) const override;
> uint64_t getSectionAddress(DataRefImpl Sec) const override;
> + uint64_t getSectionIndex(DataRefImpl Sec) const override;
> uint64_t getSectionSize(DataRefImpl Sec) const override;
> std::error_code getSectionContents(DataRefImpl Sec,
> StringRef &Res) const override;
>
> Modified: llvm/trunk/include/llvm/Object/ELFObjectFile.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ELFObjectFile.h?rev=304078&r1=304077&r2=304078&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/ELFObjectFile.h (original)
> +++ llvm/trunk/include/llvm/Object/ELFObjectFile.h Sat May 27 13:10:23 2017
> @@ -235,6 +235,7 @@ protected:
> std::error_code getSectionName(DataRefImpl Sec,
> StringRef &Res) const override;
> uint64_t getSectionAddress(DataRefImpl Sec) const override;
> + uint64_t getSectionIndex(DataRefImpl Sec) const override;
> uint64_t getSectionSize(DataRefImpl Sec) const override;
> std::error_code getSectionContents(DataRefImpl Sec,
> StringRef &Res) const override;
> @@ -646,6 +647,17 @@ uint64_t ELFObjectFile<ELFT>::getSection
> }
>
> template <class ELFT>
> +uint64_t ELFObjectFile<ELFT>::getSectionIndex(DataRefImpl Sec) const {
> + auto SectionsOrErr = EF.sections();
> + handleAllErrors(std::move(SectionsOrErr.takeError()),
> + [](const ErrorInfoBase &) {
> + llvm_unreachable("unable to get section index");
> + });
> + const Elf_Shdr *First = SectionsOrErr->begin();
> + return getSection(Sec) - First;
> +}
> +
> +template <class ELFT>
> uint64_t ELFObjectFile<ELFT>::getSectionSize(DataRefImpl Sec) const {
> return getSection(Sec)->sh_size;
> }
>
> Modified: llvm/trunk/include/llvm/Object/MachO.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/MachO.h?rev=304078&r1=304077&r2=304078&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/MachO.h (original)
> +++ llvm/trunk/include/llvm/Object/MachO.h Sat May 27 13:10:23 2017
> @@ -290,6 +290,7 @@ public:
> std::error_code getSectionName(DataRefImpl Sec,
> StringRef &Res) const override;
> uint64_t getSectionAddress(DataRefImpl Sec) const override;
> + uint64_t getSectionIndex(DataRefImpl Sec) const override;
> uint64_t getSectionSize(DataRefImpl Sec) const override;
> std::error_code getSectionContents(DataRefImpl Sec,
> StringRef &Res) const override;
>
> Modified: llvm/trunk/include/llvm/Object/ObjectFile.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ObjectFile.h?rev=304078&r1=304077&r2=304078&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/ObjectFile.h (original)
> +++ llvm/trunk/include/llvm/Object/ObjectFile.h Sat May 27 13:10:23 2017
> @@ -95,6 +95,7 @@ public:
>
> std::error_code getName(StringRef &Result) const;
> uint64_t getAddress() const;
> + uint64_t getIndex() const;
> uint64_t getSize() const;
> std::error_code getContents(StringRef &Result) const;
>
> @@ -222,6 +223,7 @@ protected:
> virtual std::error_code getSectionName(DataRefImpl Sec,
> StringRef &Res) const = 0;
> virtual uint64_t getSectionAddress(DataRefImpl Sec) const = 0;
> + virtual uint64_t getSectionIndex(DataRefImpl Sec) const = 0;
> virtual uint64_t getSectionSize(DataRefImpl Sec) const = 0;
> virtual std::error_code getSectionContents(DataRefImpl Sec,
> StringRef &Res) const = 0;
> @@ -393,6 +395,10 @@ inline uint64_t SectionRef::getAddress()
> return OwningObject->getSectionAddress(SectionPimpl);
> }
>
> +inline uint64_t SectionRef::getIndex() const {
> + return OwningObject->getSectionIndex(SectionPimpl);
> +}
> +
> inline uint64_t SectionRef::getSize() const {
> return OwningObject->getSectionSize(SectionPimpl);
> }
>
> Modified: llvm/trunk/include/llvm/Object/Wasm.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/Wasm.h?rev=304078&r1=304077&r2=304078&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/Wasm.h (original)
> +++ llvm/trunk/include/llvm/Object/Wasm.h Sat May 27 13:10:23 2017
> @@ -119,6 +119,7 @@ public:
> std::error_code getSectionName(DataRefImpl Sec,
> StringRef &Res) const override;
> uint64_t getSectionAddress(DataRefImpl Sec) const override;
> + uint64_t getSectionIndex(DataRefImpl Sec) const override;
> uint64_t getSectionSize(DataRefImpl Sec) const override;
> std::error_code getSectionContents(DataRefImpl Sec,
> StringRef &Res) const override;
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp?rev=304078&r1=304077&r2=304078&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp Sat May 27 13:10:23
> 2017
> @@ -60,12 +60,15 @@ typedef DILineInfoSpecifier::FileLineInf
> typedef DILineInfoSpecifier::FunctionNameKind FunctionNameKind;
>
> uint64_t llvm::getRelocatedValue(const DataExtractor &Data, uint32_t Size,
> - uint32_t *Off, const RelocAddrMap
> *Relocs) {
> + uint32_t *Off, const RelocAddrMap
> *Relocs,
> + uint64_t *SectionIndex) {
> if (!Relocs)
> return Data.getUnsigned(Off, Size);
> RelocAddrMap::const_iterator AI = Relocs->find(*Off);
> if (AI == Relocs->end())
> return Data.getUnsigned(Off, Size);
> + if (SectionIndex)
> + *SectionIndex = AI->second.SectionIndex;
> return Data.getUnsigned(Off, Size) + AI->second.Value;
> }
>
> @@ -958,23 +961,29 @@ static Error createError(const Twine &Re
> inconvertibleErrorCode());
> }
>
> -/// Returns the address of symbol relocation used against. Used for futher
> -/// relocations computation. Symbol's section load address is taken in
> account if
> -/// LoadedObjectInfo interface is provided.
> -static Expected<uint64_t>
> -getSymbolAddress(const object::ObjectFile &Obj, const RelocationRef
> &Reloc,
> - const LoadedObjectInfo *L,
> - std::map<SymbolRef, uint64_t> &Cache) {
> - uint64_t Ret = 0;
> +/// SymInfo contains information about symbol: it's address
> +/// and section index which is -1LL for absolute symbols.
> +struct SymInfo {
> + uint64_t Address;
> + uint64_t SectionIndex;
> +};
> +
> +/// Returns the address of symbol relocation used against and a section
> index.
> +/// Used for futher relocations computation. Symbol's section load
> address is
> +static Expected<SymInfo> getSymbolInfo(const object::ObjectFile &Obj,
> + const RelocationRef &Reloc,
> + const LoadedObjectInfo *L,
> + std::map<SymbolRef, SymInfo>
> &Cache) {
> + SymInfo Ret = {0, (uint64_t)-1LL};
> object::section_iterator RSec = Obj.section_end();
> object::symbol_iterator Sym = Reloc.getSymbol();
>
> - std::map<SymbolRef, uint64_t>::iterator CacheIt = Cache.end();
> + std::map<SymbolRef, SymInfo>::iterator CacheIt = Cache.end();
> // First calculate the address of the symbol or section as it appears
> // in the object file
> if (Sym != Obj.symbol_end()) {
> bool New;
> - std::tie(CacheIt, New) = Cache.insert({*Sym, 0});
> + std::tie(CacheIt, New) = Cache.insert({*Sym, {0, 0}});
> if (!New)
> return CacheIt->second;
>
> @@ -990,12 +999,15 @@ getSymbolAddress(const object::ObjectFil
> SectOrErr.takeError());
>
> RSec = *SectOrErr;
> - Ret = *SymAddrOrErr;
> + Ret.Address = *SymAddrOrErr;
> } else if (auto *MObj = dyn_cast<MachOObjectFile>(&Obj)) {
> RSec = MObj->getRelocationSection(Reloc.getRawDataRefImpl());
> - Ret = RSec->getAddress();
> + Ret.Address = RSec->getAddress();
> }
>
> + if (RSec != Obj.section_end())
> + Ret.SectionIndex = RSec->getIndex();
> +
> // If we are given load addresses for the sections, we need to adjust:
> // SymAddr = (Address of Symbol Or Section in File) -
> // (Address of Section in File) +
> @@ -1005,7 +1017,7 @@ getSymbolAddress(const object::ObjectFil
> // we need to perform the same computation.
> if (L && RSec != Obj.section_end())
> if (uint64_t SectionLoadAddress = L->getSectionLoadAddress(*RSec))
> - Ret += SectionLoadAddress - RSec->getAddress();
> + Ret.Address += SectionLoadAddress - RSec->getAddress();
>
> if (CacheIt != Cache.end())
> CacheIt->second = Ret;
> @@ -1064,7 +1076,7 @@ DWARFContextInMemory::DWARFContextInMemo
> // Try to obtain an already relocated version of this section.
> // Else use the unrelocated section from the object file. We'll have
> to
> // apply relocations ourselves later.
> - if (!L || !L->getLoadedSectionContents(*RelocatedSection,data))
> + if (!L || !L->getLoadedSectionContents(*RelocatedSection, data))
> Section.getContents(data);
>
> if (auto Err = maybeDecompress(Section, name, data)) {
> @@ -1103,7 +1115,7 @@ DWARFContextInMemory::DWARFContextInMemo
> // If the section we're relocating was relocated already by the JIT,
> // then we used the relocated version above, so we do not need to
> process
> // relocations for it now.
> - if (L && L->getLoadedSectionContents(*RelocatedSection,RelSecData))
> + if (L && L->getLoadedSectionContents(*RelocatedSection, RelSecData))
> continue;
>
> // In Mach-o files, the relocations do not need to be applied if
> @@ -1147,29 +1159,30 @@ DWARFContextInMemory::DWARFContextInMemo
> if (Section.relocation_begin() == Section.relocation_end())
> continue;
>
> - std::map<SymbolRef, uint64_t> AddrCache;
> + // Symbol to [address, section index] cache mapping.
> + std::map<SymbolRef, SymInfo> AddrCache;
> for (const RelocationRef &Reloc : Section.relocations()) {
> // FIXME: it's not clear how to correctly handle scattered
> // relocations.
> if (isRelocScattered(Obj, Reloc))
> continue;
>
> - Expected<uint64_t> SymAddrOrErr =
> - getSymbolAddress(Obj, Reloc, L, AddrCache);
> - if (!SymAddrOrErr) {
> - errs() << toString(SymAddrOrErr.takeError()) << '\n';
> + Expected<SymInfo> SymInfoOrErr = getSymbolInfo(Obj, Reloc, L,
> AddrCache);
> + if (!SymInfoOrErr) {
> + errs() << toString(SymInfoOrErr.takeError()) << '\n';
> continue;
> }
>
> object::RelocVisitor V(Obj);
> - uint64_t Val = V.visit(Reloc.getType(), Reloc, *SymAddrOrErr);
> + uint64_t Val = V.visit(Reloc.getType(), Reloc,
> SymInfoOrErr->Address);
> if (V.error()) {
> SmallString<32> Name;
> Reloc.getTypeName(Name);
> errs() << "error: failed to compute relocation: " << Name << "\n";
> continue;
> }
> - Map->insert({Reloc.getOffset(), {Val}});
> + llvm::RelocAddrEntry Rel = {SymInfoOrErr->SectionIndex, Val};
> + Map->insert({Reloc.getOffset(), Rel});
> }
> }
> }
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRangeList.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRangeList.cpp?rev=304078&r1=304077&r2=304078&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRangeList.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRangeList.cpp Sat May 27
> 13:10:23 2017
> @@ -35,8 +35,8 @@ bool DWARFDebugRangeList::extract(DataEx
> while (true) {
> RangeListEntry entry;
> uint32_t prev_offset = *offset_ptr;
> - entry.StartAddress =
> - getRelocatedValue(data, AddressSize, offset_ptr, &Relocs);
> + entry.StartAddress = getRelocatedValue(data, AddressSize, offset_ptr,
> + &Relocs, &entry.SectionIndex);
> entry.EndAddress =
> getRelocatedValue(data, AddressSize, offset_ptr, &Relocs);
>
> @@ -69,8 +69,8 @@ DWARFDebugRangeList::getAbsoluteRanges(u
> if (RLE.isBaseAddressSelectionEntry(AddressSize)) {
> BaseAddress = RLE.EndAddress;
> } else {
> - Res.push_back(
> - {BaseAddress + RLE.StartAddress, BaseAddress + RLE.EndAddress});
> + Res.push_back({BaseAddress + RLE.StartAddress,
> + BaseAddress + RLE.EndAddress, RLE.SectionIndex});
> }
> }
> return Res;
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFDie.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFDie.cpp?rev=304078&r1=304077&r2=304078&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFDie.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFDie.cpp Sat May 27 13:10:23 2017
> @@ -211,13 +211,16 @@ Optional<uint64_t> DWARFDie::getHighPC(u
> return None;
> }
>
> -bool DWARFDie::getLowAndHighPC(uint64_t &LowPC, uint64_t &HighPC) const {
> - auto LowPcAddr = toAddress(find(DW_AT_low_pc));
> +bool DWARFDie::getLowAndHighPC(uint64_t &LowPC, uint64_t &HighPC,
> + uint64_t &SectionIndex) const {
> + auto F = find(DW_AT_low_pc);
> + auto LowPcAddr = toAddress(F);
> if (!LowPcAddr)
> return false;
> if (auto HighPcAddr = getHighPC(*LowPcAddr)) {
> LowPC = *LowPcAddr;
> HighPC = *HighPcAddr;
> + SectionIndex = F->getSectionIndex();
> return true;
> }
> return false;
> @@ -228,9 +231,9 @@ DWARFDie::getAddressRanges() const {
> if (isNULL())
> return DWARFAddressRangesVector();
> // Single range specified by low/high PC.
> - uint64_t LowPC, HighPC;
> - if (getLowAndHighPC(LowPC, HighPC))
> - return {{LowPC, HighPC}};
> + uint64_t LowPC, HighPC, Index;
> + if (getLowAndHighPC(LowPC, HighPC, Index))
> + return {{LowPC, HighPC, Index}};
>
> // Multiple ranges from .debug_ranges section.
> auto RangesOffset = toSectionOffset(find(DW_AT_ranges));
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp?rev=304078&r1=304077&r2=304078&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp Sat May 27 13:10:23
> 2017
> @@ -333,8 +333,8 @@ bool DWARFFormValue::extractValue(const
> return false;
> uint16_t AddrSize = (Form == DW_FORM_addr) ? U->getAddressByteSize()
> :
> U->getRefAddrByteSize();
> - Value.uval =
> - getRelocatedValue(Data, AddrSize, OffsetPtr, U->getRelocMap());
> + Value.uval = getRelocatedValue(Data, AddrSize, OffsetPtr,
> + U->getRelocMap(),
> &Value.SectionIndex);
> break;
> }
> case DW_FORM_exprloc:
>
> Modified: llvm/trunk/lib/Object/COFFObjectFile.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/COFFObjectFile.cpp?rev=304078&r1=304077&r2=304078&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Object/COFFObjectFile.cpp (original)
> +++ llvm/trunk/lib/Object/COFFObjectFile.cpp Sat May 27 13:10:23 2017
> @@ -293,6 +293,10 @@ uint64_t COFFObjectFile::getSectionAddre
> return Result;
> }
>
> +uint64_t COFFObjectFile::getSectionIndex(DataRefImpl Sec) const {
> + return toSec(Sec) - SectionTable;
> +}
> +
> uint64_t COFFObjectFile::getSectionSize(DataRefImpl Ref) const {
> return getSectionSize(toSec(Ref));
> }
>
> Modified: llvm/trunk/lib/Object/MachOObjectFile.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/MachOObjectFile.cpp?rev=304078&r1=304077&r2=304078&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Object/MachOObjectFile.cpp (original)
> +++ llvm/trunk/lib/Object/MachOObjectFile.cpp Sat May 27 13:10:23 2017
> @@ -1820,6 +1820,10 @@ uint64_t MachOObjectFile::getSectionAddr
> return getSection(Sec).addr;
> }
>
> +uint64_t MachOObjectFile::getSectionIndex(DataRefImpl Sec) const {
> + return Sec.d.a;
> +}
> +
> uint64_t MachOObjectFile::getSectionSize(DataRefImpl Sec) const {
> // In the case if a malformed Mach-O file where the section offset is
> past
> // the end of the file or some part of the section size is past the end
> of
>
> Modified: llvm/trunk/lib/Object/WasmObjectFile.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/WasmObjectFile.cpp?rev=304078&r1=304077&r2=304078&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Object/WasmObjectFile.cpp (original)
> +++ llvm/trunk/lib/Object/WasmObjectFile.cpp Sat May 27 13:10:23 2017
> @@ -743,6 +743,10 @@ std::error_code WasmObjectFile::getSecti
>
> uint64_t WasmObjectFile::getSectionAddress(DataRefImpl Sec) const {
> return 0; }
>
> +uint64_t WasmObjectFile::getSectionIndex(DataRefImpl Sec) const {
> + return Sec.d.a;
> +}
> +
> uint64_t WasmObjectFile::getSectionSize(DataRefImpl Sec) const {
> const WasmSection &S = Sections[Sec.d.a];
> return S.Content.size();
>
> Modified: llvm/trunk/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp?rev=304078&r1=304077&r2=304078&view=diff
>
> ==============================================================================
> --- llvm/trunk/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp (original)
> +++ llvm/trunk/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp Sat May 27
> 13:10:23 2017
> @@ -853,8 +853,8 @@ template <uint16_t Version, class AddrTy
> // Get the compile unit DIE is valid.
> auto DieDG = U->getUnitDIE(false);
> EXPECT_TRUE(DieDG.isValid());
> -
> - uint64_t LowPC, HighPC;
> +
> + uint64_t LowPC, HighPC, SectionIndex;
> Optional<uint64_t> OptU64;
> // Verify the that our subprogram with no PC value fails appropriately
> when
> // asked for any PC values.
> @@ -865,14 +865,14 @@ template <uint16_t Version, class AddrTy
> EXPECT_FALSE((bool)OptU64);
> OptU64 = toAddress(SubprogramDieNoPC.find(DW_AT_high_pc));
> EXPECT_FALSE((bool)OptU64);
> - EXPECT_FALSE(SubprogramDieNoPC.getLowAndHighPC(LowPC, HighPC));
> + EXPECT_FALSE(SubprogramDieNoPC.getLowAndHighPC(LowPC, HighPC,
> SectionIndex));
> OptU64 = toAddress(SubprogramDieNoPC.find(DW_AT_high_pc));
> EXPECT_FALSE((bool)OptU64);
> OptU64 = toUnsigned(SubprogramDieNoPC.find(DW_AT_high_pc));
> EXPECT_FALSE((bool)OptU64);
> OptU64 = SubprogramDieNoPC.getHighPC(ActualLowPC);
> EXPECT_FALSE((bool)OptU64);
> - EXPECT_FALSE(SubprogramDieNoPC.getLowAndHighPC(LowPC, HighPC));
> + EXPECT_FALSE(SubprogramDieNoPC.getLowAndHighPC(LowPC, HighPC,
> SectionIndex));
>
> // Verify the that our subprogram with only a low PC value succeeds when
> // we ask for the Low PC, but fails appropriately when asked for the
> high PC
> @@ -889,7 +889,7 @@ template <uint16_t Version, class AddrTy
> EXPECT_FALSE((bool)OptU64);
> OptU64 = SubprogramDieLowPC.getHighPC(ActualLowPC);
> EXPECT_FALSE((bool)OptU64);
> - EXPECT_FALSE(SubprogramDieLowPC.getLowAndHighPC(LowPC, HighPC));
> + EXPECT_FALSE(SubprogramDieLowPC.getLowAndHighPC(LowPC, HighPC,
> SectionIndex));
>
> // Verify the that our subprogram with only a low PC value succeeds when
> // we ask for the Low PC, but fails appropriately when asked for the
> high PC
> @@ -923,7 +923,7 @@ template <uint16_t Version, class AddrTy
> EXPECT_TRUE((bool)OptU64);
> EXPECT_EQ(OptU64.getValue(), ActualHighPC);
>
> - EXPECT_TRUE(SubprogramDieLowHighPC.getLowAndHighPC(LowPC, HighPC));
> + EXPECT_TRUE(SubprogramDieLowHighPC.getLowAndHighPC(LowPC, HighPC,
> SectionIndex));
> EXPECT_EQ(LowPC, ActualLowPC);
> EXPECT_EQ(HighPC, ActualHighPC);
> }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170527/5bab83e1/attachment.html>
More information about the llvm-commits
mailing list