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