[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