<div dir="ltr">Ah, sure thing - r304080. Thanks for asking!</div><br><div class="gmail_quote"><div dir="ltr">On Thu, May 25, 2017 at 4:49 PM Robinson, Paul <<a href="mailto:paul.robinson@sony.com">paul.robinson@sony.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Could you check in the source for the test and instructions for<br>
re-creating the .o/.dwo?  Not that I expect the test to change<br>
but it'll make things a whole lot easier for me to write an<br>
equivalent v5 test when the time comes.<br>
Thanks,<br>
--paulr<br>
<br>
> -----Original Message-----<br>
> From: llvm-commits [mailto:<a href="mailto:llvm-commits-bounces@lists.llvm.org" target="_blank">llvm-commits-bounces@lists.llvm.org</a>] On Behalf<br>
> Of David Blaikie via llvm-commits<br>
> Sent: Monday, May 22, 2017 11:49 PM<br>
> To: <a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
> Subject: [llvm] r303609 - libDebugInfo: Support symbolizing using DWP<br>
> files<br>
><br>
> Author: dblaikie<br>
> Date: Tue May 23 01:48:53 2017<br>
> New Revision: 303609<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=303609&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=303609&view=rev</a><br>
> Log:<br>
> libDebugInfo: Support symbolizing using DWP files<br>
><br>
> Added:<br>
>     llvm/trunk/test/DebugInfo/Inputs/split-dwarf-dwp.o<br>
>     llvm/trunk/test/DebugInfo/Inputs/split-dwarf-dwp.o.dwp<br>
> Modified:<br>
>     llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h<br>
>     llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp<br>
>     llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp<br>
>     llvm/trunk/test/DebugInfo/llvm-symbolizer.test<br>
><br>
> Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-</a><br>
> project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h?rev=303609&<br>
> r1=303608&r2=303609&view=diff<br>
> ==========================================================================<br>
> ====<br>
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h (original)<br>
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h Tue May 23<br>
> 01:48:53 2017<br>
> @@ -76,6 +76,8 @@ class DWARFContext : public DIContext {<br>
>      std::unique_ptr<DWARFContext> Context;<br>
>    };<br>
>    StringMap<std::weak_ptr<DWOFile>> DWOFiles;<br>
> +  std::weak_ptr<DWOFile> DWP;<br>
> +  bool CheckedForDWP = false;<br>
><br>
>    /// Read compile units from the debug_info section (if necessary)<br>
>    /// and store them in CUs.<br>
> @@ -171,6 +173,8 @@ public:<br>
>      return DWOCUs[index].get();<br>
>    }<br>
><br>
> +  DWARFCompileUnit *getDWOCompileUnitForHash(uint64_t Hash);<br>
> +<br>
>    /// Get a DIE given an exact offset.<br>
>    DWARFDie getDIEForOffset(uint32_t Offset);<br>
><br>
> @@ -212,6 +216,7 @@ public:<br>
>    DIInliningInfo getInliningInfoForAddress(uint64_t Address,<br>
>        DILineInfoSpecifier Specifier = DILineInfoSpecifier()) override;<br>
><br>
> +  virtual StringRef getFileName() const = 0;<br>
>    virtual bool isLittleEndian() const = 0;<br>
>    virtual uint8_t getAddressSize() const = 0;<br>
>    virtual const DWARFSection &getInfoSection() = 0;<br>
> @@ -271,6 +276,7 @@ private:<br>
>  class DWARFContextInMemory : public DWARFContext {<br>
>    virtual void anchor();<br>
><br>
> +  StringRef FileName;<br>
>    bool IsLittleEndian;<br>
>    uint8_t AddressSize;<br>
>    DWARFSection InfoSection;<br>
> @@ -324,6 +330,7 @@ public:<br>
>                         uint8_t AddrSize,<br>
>                         bool isLittleEndian = sys::IsLittleEndianHost);<br>
><br>
> +  StringRef getFileName() const override { return FileName; }<br>
>    bool isLittleEndian() const override { return IsLittleEndian; }<br>
>    uint8_t getAddressSize() const override { return AddressSize; }<br>
>    const DWARFSection &getInfoSection() override { return InfoSection; }<br>
><br>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-</a><br>
> project/llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp?rev=303609&r1=3036<br>
> 08&r2=303609&view=diff<br>
> ==========================================================================<br>
> ====<br>
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp (original)<br>
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp Tue May 23 01:48:53<br>
> 2017<br>
> @@ -287,6 +287,15 @@ void DWARFContext::dump(raw_ostream &OS,<br>
>                       getStringSection(), isLittleEndian());<br>
>  }<br>
><br>
> +DWARFCompileUnit *DWARFContext::getDWOCompileUnitForHash(uint64_t Hash) {<br>
> +  // FIXME: Improve this for the case where this DWO file is really a DWP<br>
> file<br>
> +  // with an index - use the index for lookup instead of a linear search.<br>
> +  for (const auto &DWOCU : dwo_compile_units())<br>
> +    if (DWOCU->getDWOId() == Hash)<br>
> +      return DWOCU.get();<br>
> +  return nullptr;<br>
> +}<br>
> +<br>
>  DWARFDie DWARFContext::getDIEForOffset(uint32_t Offset) {<br>
>    parseCompileUnits();<br>
>    if (auto *CU = CUs.getUnitForOffset(Offset))<br>
> @@ -899,22 +908,47 @@ DWARFContext::getInliningInfoForAddress(<br>
><br>
>  std::shared_ptr<DWARFContext><br>
>  DWARFContext::getDWOContext(StringRef AbsolutePath) {<br>
> -  auto &Entry = DWOFiles[AbsolutePath];<br>
> -  if (auto S = Entry.lock()) {<br>
> +  if (auto S = DWP.lock()) {<br>
>      DWARFContext *Ctxt = S->Context.get();<br>
>      return std::shared_ptr<DWARFContext>(std::move(S), Ctxt);<br>
>    }<br>
><br>
> -  auto S = std::make_shared<DWOFile>();<br>
> -  auto Obj = object::ObjectFile::createObjectFile(AbsolutePath);<br>
> +  std::weak_ptr<DWOFile> *Entry = &DWOFiles[AbsolutePath];<br>
> +<br>
> +  if (auto S = Entry->lock()) {<br>
> +    DWARFContext *Ctxt = S->Context.get();<br>
> +    return std::shared_ptr<DWARFContext>(std::move(S), Ctxt);<br>
> +  }<br>
> +<br>
> +  SmallString<128> DWPName;<br>
> +  Expected<OwningBinary<ObjectFile>> Obj = [&] {<br>
> +    if (!CheckedForDWP) {<br>
> +      (getFileName() + ".dwp").toVector(DWPName);<br>
> +      auto Obj = object::ObjectFile::createObjectFile(DWPName);<br>
> +      if (Obj) {<br>
> +        Entry = &DWP;<br>
> +        return Obj;<br>
> +      } else {<br>
> +        CheckedForDWP = true;<br>
> +        // TODO: Should this error be handled (maybe in a high verbosity<br>
> mode)<br>
> +        // before falling back to .dwo files?<br>
> +        consumeError(Obj.takeError());<br>
> +      }<br>
> +    }<br>
> +<br>
> +    return object::ObjectFile::createObjectFile(AbsolutePath);<br>
> +  }();<br>
> +<br>
>    if (!Obj) {<br>
>      // TODO: Actually report errors helpfully.<br>
>      consumeError(Obj.takeError());<br>
>      return nullptr;<br>
>    }<br>
> +<br>
> +  auto S = std::make_shared<DWOFile>();<br>
>    S->File = std::move(Obj.get());<br>
>    S->Context = llvm::make_unique<DWARFContextInMemory>(*S-<br>
> >File.getBinary());<br>
> -  Entry = S;<br>
> +  *Entry = S;<br>
>    auto *Ctxt = S->Context.get();<br>
>    return std::shared_ptr<DWARFContext>(std::move(S), Ctxt);<br>
>  }<br>
> @@ -1011,8 +1045,8 @@ Error DWARFContextInMemory::maybeDecompr<br>
>  }<br>
><br>
>  DWARFContextInMemory::DWARFContextInMemory(const object::ObjectFile &Obj,<br>
> -    const LoadedObjectInfo *L)<br>
> -    : IsLittleEndian(Obj.isLittleEndian()),<br>
> +                                           const LoadedObjectInfo *L)<br>
> +    : FileName(Obj.getFileName()), IsLittleEndian(Obj.isLittleEndian()),<br>
>        AddressSize(Obj.getBytesInAddress()) {<br>
>    for (const SectionRef &Section : Obj.sections()) {<br>
>      StringRef name;<br>
><br>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-</a><br>
> project/llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp?rev=303609&r1=303608&<br>
> r2=303609&view=diff<br>
> ==========================================================================<br>
> ====<br>
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp (original)<br>
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp Tue May 23 01:48:53 2017<br>
> @@ -274,13 +274,10 @@ bool DWARFUnit::parseDWO() {<br>
>    if (!DWOContext)<br>
>      return false;<br>
><br>
> -  for (const auto &DWOCU : DWOContext->dwo_compile_units())<br>
> -    if (DWOCU->getDWOId() == DWOId) {<br>
> -      DWO = std::shared_ptr<DWARFUnit>(std::move(DWOContext),<br>
> DWOCU.get());<br>
> -      break;<br>
> -    }<br>
> -  if (!DWO)<br>
> +  DWARFCompileUnit *DWOCU = DWOContext->getDWOCompileUnitForHash(*DWOId);<br>
> +  if (!DWOCU)<br>
>      return false;<br>
> +  DWO = std::shared_ptr<DWARFCompileUnit>(std::move(DWOContext), DWOCU);<br>
>    // Share .debug_addr and .debug_ranges section with compile unit in<br>
> .dwo<br>
>    DWO->setAddrOffsetSection(AddrOffsetSection, AddrOffsetSectionBase);<br>
>    auto DWORangesBase = UnitDie.getRangesBaseAttribute();<br>
><br>
> Added: llvm/trunk/test/DebugInfo/Inputs/split-dwarf-dwp.o<br>
> URL: <a href="http://llvm.org/viewvc/llvm-" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-</a><br>
> project/llvm/trunk/test/DebugInfo/Inputs/split-dwarf-<br>
> dwp.o?rev=303609&view=auto<br>
> ==========================================================================<br>
> ====<br>
> Binary files llvm/trunk/test/DebugInfo/Inputs/split-dwarf-dwp.o (added)<br>
> and llvm/trunk/test/DebugInfo/Inputs/split-dwarf-dwp.o Tue May 23 01:48:53<br>
> 2017 differ<br>
><br>
> Added: llvm/trunk/test/DebugInfo/Inputs/split-dwarf-dwp.o.dwp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-</a><br>
> project/llvm/trunk/test/DebugInfo/Inputs/split-dwarf-<br>
> dwp.o.dwp?rev=303609&view=auto<br>
> ==========================================================================<br>
> ====<br>
> Binary files llvm/trunk/test/DebugInfo/Inputs/split-dwarf-dwp.o.dwp<br>
> (added) and llvm/trunk/test/DebugInfo/Inputs/split-dwarf-dwp.o.dwp Tue May<br>
> 23 01:48:53 2017 differ<br>
><br>
> Modified: llvm/trunk/test/DebugInfo/llvm-symbolizer.test<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/llvm-" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/llvm-</a><br>
> symbolizer.test?rev=303609&r1=303608&r2=303609&view=diff<br>
> ==========================================================================<br>
> ====<br>
> --- llvm/trunk/test/DebugInfo/llvm-symbolizer.test (original)<br>
> +++ llvm/trunk/test/DebugInfo/llvm-symbolizer.test Tue May 23 01:48:53<br>
> 2017<br>
> @@ -27,6 +27,9 @@ RUN: cp %p/Inputs/split-dwarf-multiple-c<br>
>  RUN: echo "%p/Inputs/split-dwarf-multiple-cu.o 0x4" >> %t.input<br>
>  RUN: cp %p/Inputs/split-dwarf-addr-object-relocation.dwo %T<br>
>  RUN: echo "%p/Inputs/split-dwarf-addr-object-relocation.o 0x14" >><br>
> %t.input<br>
> +RUN: cp %p/Inputs/split-dwarf-dwp.o %T<br>
> +RUN: cp %p/Inputs/split-dwarf-dwp.o.dwp %T<br>
> +RUN: echo "%T/split-dwarf-dwp.o 0x4" >> %t.input<br>
><br>
>  RUN: llvm-symbolizer --functions=linkage --inlining --demangle=false \<br>
>  RUN:    --default-arch=i386 < %t.input | FileCheck --check-prefix=CHECK -<br>
> -check-prefix=SPLIT --check-prefix=DWO %s<br>
> @@ -147,6 +150,11 @@ CHECK-NEXT: split-dwarf-addr-object-relo<br>
>  CHECK-NEXT: f3<br>
>  CHECK-NEXT: split-dwarf-addr-object-relocation.cpp:6:0<br>
><br>
> +CHECK:      f2<br>
> +CHECK-NEXT: split-dwarf-dwp.cpp:3:3<br>
> +CHECK-NEXT: f3<br>
> +CHECK-NEXT: split-dwarf-dwp.cpp:6:0<br>
> +<br>
>  RUN: echo "unexisting-file 0x1234" > %t.input2<br>
>  RUN: llvm-symbolizer < %t.input2 2>&1 | FileCheck %s --check-<br>
> prefix=MISSING-FILE<br>
><br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>