[llvm] r308543 - Use delegation instead of inheritance.
Robinson, Paul via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 21 12:42:34 PDT 2017
Hi Rafael,
I am thinking that DWARFSectionMap should be local to DWARFContext.cpp
as it is used only by DWARFObjInMemory. Relocations are handled very
differently in LLD, so when I tried to use DWARFSectionMap in my v5
work, it caused LLD to fail to build. Better not to be tempted, I think!
Thanks,
--paulr
> -----Original Message-----
> From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] On Behalf
> Of Rafael Espindola via llvm-commits
> Sent: Wednesday, July 19, 2017 3:27 PM
> To: llvm-commits at lists.llvm.org
> Subject: [llvm] r308543 - Use delegation instead of inheritance.
>
> Author: rafael
> Date: Wed Jul 19 15:27:28 2017
> New Revision: 308543
>
> URL: http://llvm.org/viewvc/llvm-project?rev=308543&view=rev
> Log:
> Use delegation instead of inheritance.
>
> This changes DwarfContext to delegate to DwarfObject instead of having
> pure virtual methods.
>
> With this DwarfContextInMemory is replaced with an implementation of
> DwarfObject that is local to a .cpp file.
>
> Added:
> llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFObject.h
> Modified:
> llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h
> llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDataExtractor.h
> llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFSection.h
> llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h
> llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp
> llvm/trunk/lib/DebugInfo/DWARF/DWARFDataExtractor.cpp
> llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugAranges.cpp
> llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp
> llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp
> llvm/trunk/lib/DebugInfo/Symbolize/Symbolize.cpp
> llvm/trunk/tools/dsymutil/DwarfLinker.cpp
> llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
> llvm/trunk/tools/llvm-objdump/MachODump.cpp
> llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
> llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp
> llvm/trunk/tools/obj2yaml/dwarf2yaml.cpp
> llvm/trunk/tools/obj2yaml/macho2yaml.cpp
> llvm/trunk/tools/obj2yaml/obj2yaml.h
> 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=308543&
> r1=308542&r2=308543&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h Wed Jul 19
> 15:27:28 2017
> @@ -26,6 +26,7 @@
> #include "llvm/DebugInfo/DWARF/DWARFDebugMacro.h"
> #include "llvm/DebugInfo/DWARF/DWARFDie.h"
> #include "llvm/DebugInfo/DWARF/DWARFGdbIndex.h"
> +#include "llvm/DebugInfo/DWARF/DWARFObject.h"
> #include "llvm/DebugInfo/DWARF/DWARFSection.h"
> #include "llvm/DebugInfo/DWARF/DWARFTypeUnit.h"
> #include "llvm/DebugInfo/DWARF/DWARFUnit.h"
> @@ -45,10 +46,14 @@ class DataExtractor;
> class MemoryBuffer;
> class raw_ostream;
>
> +/// Used as a return value for a error callback passed to DWARF context.
> +/// Callback should return Halt if client application wants to stop
> +/// object parsing, or should return Continue otherwise.
> +enum class ErrorPolicy { Halt, Continue };
> +
> /// DWARFContext
> /// This data structure is the top level entity that deals with dwarf
> debug
> -/// information parsing. The actual data is supplied through pure virtual
> -/// methods that a concrete implementation provides.
> +/// information parsing. The actual data is supplied through DWARFObj.
> class DWARFContext : public DIContext {
> DWARFUnitSection<DWARFCompileUnit> CUs;
> std::deque<DWARFUnitSection<DWARFTypeUnit>> TUs;
> @@ -95,11 +100,17 @@ class DWARFContext : public DIContext {
> /// and store them in DWOTUs.
> void parseDWOTypeUnits();
>
> +protected:
> + std::unique_ptr<const DWARFObject> DObj;
> +
> public:
> - DWARFContext() : DIContext(CK_DWARF) {}
> + DWARFContext(std::unique_ptr<const DWARFObject> DObj)
> + : DIContext(CK_DWARF), DObj(std::move(DObj)) {}
> DWARFContext(DWARFContext &) = delete;
> DWARFContext &operator=(DWARFContext &) = delete;
>
> + const DWARFObject &getDWARFObj() const { return *DObj; }
> +
> static bool classof(const DIContext *DICtx) {
> return DICtx->getKind() == CK_DWARF;
> }
> @@ -222,55 +233,24 @@ 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;
> - virtual void forEachTypesSections(function_ref<void(DWARFSection &)> F)
> = 0;
> - virtual StringRef getAbbrevSection() = 0;
> - virtual const DWARFSection &getLocSection() = 0;
> - virtual StringRef getARangeSection() = 0;
> - virtual StringRef getDebugFrameSection() = 0;
> - virtual StringRef getEHFrameSection() = 0;
> - virtual const DWARFSection &getLineSection() = 0;
> - virtual StringRef getStringSection() = 0;
> - virtual const DWARFSection& getRangeSection() = 0;
> - virtual StringRef getMacinfoSection() = 0;
> - virtual StringRef getPubNamesSection() = 0;
> - virtual StringRef getPubTypesSection() = 0;
> - virtual StringRef getGnuPubNamesSection() = 0;
> - virtual StringRef getGnuPubTypesSection() = 0;
> -
> - /// DWARF v5
> - /// @{
> - virtual const DWARFSection &getStringOffsetSection() = 0;
> - /// @}
> -
> - // Sections for DWARF5 split dwarf proposal.
> - virtual const DWARFSection &getInfoDWOSection() = 0;
> - virtual void
> - forEachTypesDWOSections(function_ref<void(DWARFSection &)> F) = 0;
> - virtual StringRef getAbbrevDWOSection() = 0;
> - virtual const DWARFSection &getLineDWOSection() = 0;
> - virtual const DWARFSection &getLocDWOSection() = 0;
> - virtual StringRef getStringDWOSection() = 0;
> - virtual const DWARFSection &getStringOffsetDWOSection() = 0;
> - virtual const DWARFSection &getRangeDWOSection() = 0;
> - virtual const DWARFSection &getAddrSection() = 0;
> - virtual const DWARFSection& getAppleNamesSection() = 0;
> - virtual const DWARFSection& getAppleTypesSection() = 0;
> - virtual const DWARFSection& getAppleNamespacesSection() = 0;
> - virtual const DWARFSection& getAppleObjCSection() = 0;
> - virtual StringRef getCUIndexSection() = 0;
> - virtual StringRef getGdbIndexSection() = 0;
> - virtual StringRef getTUIndexSection() = 0;
> -
> + bool isLittleEndian() const { return DObj->isLittleEndian(); }
> static bool isSupportedVersion(unsigned version) {
> return version == 2 || version == 3 || version == 4 || version == 5;
> }
>
> std::shared_ptr<DWARFContext> getDWOContext(StringRef AbsolutePath);
>
> + /// Function used to handle default error reporting policy. Prints a
> error
> + /// message and returns Continue, so DWARF context ignores the error.
> + static ErrorPolicy defaultErrorHandler(Error E);
> + static std::unique_ptr<DWARFContext>
> + create(const object::ObjectFile &Obj, const LoadedObjectInfo *L =
> nullptr,
> + function_ref<ErrorPolicy(Error)> HandleError =
> defaultErrorHandler);
> +
> + static std::unique_ptr<DWARFContext>
> + create(const StringMap<std::unique_ptr<MemoryBuffer>> &Sections,
> + uint8_t AddrSize, bool isLittleEndian =
> sys::IsLittleEndianHost);
> +
> private:
> /// Return the compile unit that includes an offset (relative to
> .debug_info).
> DWARFCompileUnit *getCompileUnitForOffset(uint32_t Offset);
> @@ -280,142 +260,6 @@ private:
> DWARFCompileUnit *getCompileUnitForAddress(uint64_t Address);
> };
>
> -/// Used as a return value for a error callback passed to DWARF context.
> -/// Callback should return Halt if client application wants to stop
> -/// object parsing, or should return Continue otherwise.
> -enum class ErrorPolicy { Halt, Continue };
> -
> -/// DWARFContextInMemory is the simplest possible implementation of a
> -/// DWARFContext. It assumes all content is available in memory and
> stores
> -/// pointers to it.
> -class DWARFContextInMemory : public DWARFContext {
> - virtual void anchor();
> -
> - using TypeSectionMap = MapVector<object::SectionRef, DWARFSection,
> - std::map<object::SectionRef,
> unsigned>>;
> -
> - StringRef FileName;
> - bool IsLittleEndian;
> - uint8_t AddressSize;
> - DWARFSection InfoSection;
> - TypeSectionMap TypesSections;
> - StringRef AbbrevSection;
> - DWARFSection LocSection;
> - StringRef ARangeSection;
> - StringRef DebugFrameSection;
> - StringRef EHFrameSection;
> - DWARFSection LineSection;
> - StringRef StringSection;
> - DWARFSection RangeSection;
> - StringRef MacinfoSection;
> - StringRef PubNamesSection;
> - StringRef PubTypesSection;
> - StringRef GnuPubNamesSection;
> - StringRef GnuPubTypesSection;
> -
> - /// DWARF v5
> - /// @{
> - DWARFSection StringOffsetSection;
> - /// @}
> -
> - // Sections for DWARF5 split dwarf proposal.
> - DWARFSection InfoDWOSection;
> - TypeSectionMap TypesDWOSections;
> - StringRef AbbrevDWOSection;
> - DWARFSection LineDWOSection;
> - DWARFSection LocDWOSection;
> - StringRef StringDWOSection;
> - DWARFSection StringOffsetDWOSection;
> - DWARFSection RangeDWOSection;
> - DWARFSection AddrSection;
> - DWARFSection AppleNamesSection;
> - DWARFSection AppleTypesSection;
> - DWARFSection AppleNamespacesSection;
> - DWARFSection AppleObjCSection;
> - StringRef CUIndexSection;
> - StringRef GdbIndexSection;
> - StringRef TUIndexSection;
> -
> - SmallVector<SmallString<32>, 4> UncompressedSections;
> -
> - DWARFSection *mapNameToDWARFSection(StringRef Name);
> - StringRef *mapSectionToMember(StringRef Name);
> -
> - /// If Sec is compressed section, decompresses and updates its contents
> - /// provided by Data. Otherwise leaves it unchanged.
> - Error maybeDecompress(const object::SectionRef &Sec, StringRef Name,
> - StringRef &Data);
> -
> - /// Function used to handle default error reporting policy. Prints a
> error
> - /// message and returns Continue, so DWARF context ignores the error.
> - static ErrorPolicy defaultErrorHandler(Error E);
> -
> -public:
> - DWARFContextInMemory(
> - const object::ObjectFile &Obj, const LoadedObjectInfo *L = nullptr,
> - function_ref<ErrorPolicy(Error)> HandleError =
> defaultErrorHandler);
> -
> - DWARFContextInMemory(const StringMap<std::unique_ptr<MemoryBuffer>>
> &Sections,
> - 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; }
> - void forEachTypesSections(function_ref<void(DWARFSection &)> F)
> override {
> - for (auto &P : TypesSections)
> - F(P.second);
> - }
> - StringRef getAbbrevSection() override { return AbbrevSection; }
> - const DWARFSection &getLocSection() override { return LocSection; }
> - StringRef getARangeSection() override { return ARangeSection; }
> - StringRef getDebugFrameSection() override { return DebugFrameSection; }
> - StringRef getEHFrameSection() override { return EHFrameSection; }
> - const DWARFSection &getLineSection() override { return LineSection; }
> - StringRef getStringSection() override { return StringSection; }
> - const DWARFSection &getRangeSection() override { return RangeSection; }
> - StringRef getMacinfoSection() override { return MacinfoSection; }
> - StringRef getPubNamesSection() override { return PubNamesSection; }
> - StringRef getPubTypesSection() override { return PubTypesSection; }
> - StringRef getGnuPubNamesSection() override { return GnuPubNamesSection;
> }
> - StringRef getGnuPubTypesSection() override { return GnuPubTypesSection;
> }
> - const DWARFSection& getAppleNamesSection() override { return
> AppleNamesSection; }
> - const DWARFSection& getAppleTypesSection() override { return
> AppleTypesSection; }
> - const DWARFSection& getAppleNamespacesSection() override { return
> AppleNamespacesSection; }
> - const DWARFSection& getAppleObjCSection() override { return
> AppleObjCSection; }
> -
> - // DWARF v5
> - const DWARFSection &getStringOffsetSection() override {
> - return StringOffsetSection;
> - }
> -
> - // Sections for DWARF5 split dwarf proposal.
> - const DWARFSection &getInfoDWOSection() override { return
> InfoDWOSection; }
> -
> - void forEachTypesDWOSections(function_ref<void(DWARFSection &)> F)
> override {
> - for (auto &P : TypesDWOSections)
> - F(P.second);
> - }
> -
> - StringRef getAbbrevDWOSection() override { return AbbrevDWOSection; }
> - const DWARFSection &getLineDWOSection() override { return
> LineDWOSection; }
> - const DWARFSection &getLocDWOSection() override { return LocDWOSection;
> }
> - StringRef getStringDWOSection() override { return StringDWOSection; }
> -
> - const DWARFSection &getStringOffsetDWOSection() override {
> - return StringOffsetDWOSection;
> - }
> -
> - const DWARFSection &getRangeDWOSection() override { return
> RangeDWOSection; }
> -
> - const DWARFSection &getAddrSection() override { return AddrSection; }
> -
> - StringRef getCUIndexSection() override { return CUIndexSection; }
> - StringRef getGdbIndexSection() override { return GdbIndexSection; }
> - StringRef getTUIndexSection() override { return TUIndexSection; }
> -};
> -
> } // end namespace llvm
>
> #endif // LLVM_DEBUGINFO_DWARF_DWARFCONTEXT_H
>
> Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDataExtractor.h
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDataExtractor.h?rev=3
> 08543&r1=308542&r2=308543&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDataExtractor.h
> (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDataExtractor.h Wed Jul
> 19 15:27:28 2017
> @@ -14,18 +14,21 @@
> #include "llvm/Support/DataExtractor.h"
>
> namespace llvm {
> +class DWARFObject;
>
> /// A DataExtractor (typically for an in-memory copy of an object-file
> section)
> /// plus a relocation map for that section, if there is one.
> class DWARFDataExtractor : public DataExtractor {
> - const RelocAddrMap *RelocMap = nullptr;
> + const DWARFObject *Obj = nullptr;
> + const DWARFSection *Section = nullptr;
> +
> public:
> /// Constructor for the normal case of extracting data from a DWARF
> section.
> /// The DWARFSection's lifetime must be at least as long as the
> extractor's.
> - DWARFDataExtractor(const DWARFSection &Section, bool IsLittleEndian,
> - uint8_t AddressSize)
> - : DataExtractor(Section.Data, IsLittleEndian, AddressSize),
> - RelocMap(&Section.Relocs) {}
> + DWARFDataExtractor(const DWARFObject &Obj, const DWARFSection &Section,
> + bool IsLittleEndian, uint8_t AddressSize)
> + : DataExtractor(Section.Data, IsLittleEndian, AddressSize),
> Obj(&Obj),
> + Section(&Section) {}
>
> /// Constructor for cases when there are no relocations.
> DWARFDataExtractor(StringRef Data, bool IsLittleEndian, uint8_t
> AddressSize)
>
> Added: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFObject.h
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFObject.h?rev=308543&v
> iew=auto
> ==========================================================================
> ====
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFObject.h (added)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFObject.h Wed Jul 19
> 15:27:28 2017
> @@ -0,0 +1,75 @@
> +//===- DWARFObject.h --------------------------------------------*- C++ -
> *-===//
> +//
> +// The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===--------------------------------------------------------------------
> ---===/
> +
> +#ifndef LLVM_DEBUGINFO_DWARF_DWARFOBJECT_H
> +#define LLVM_DEBUGINFO_DWARF_DWARFOBJECT_H
> +
> +#include "llvm/DebugInfo/DWARF/DWARFSection.h"
> +
> +namespace llvm {
> +// This is responsible for low level access to the object file. It
> +// knows how to find the required sections and compute relocated
> +// values.
> +// The default implementations of the get<Section> methods return dummy
> values.
> +// This is to allow clients that only need some of those to implement
> just the
> +// ones they need. We can't use unreachable for as many cases because the
> parser
> +// implementation is eager and will call some of these methods even if
> the
> +// result is not used.
> +class DWARFObject {
> + DWARFSection Dummy;
> +
> +public:
> + virtual ~DWARFObject() = default;
> + virtual StringRef getFileName() const {
> llvm_unreachable("unimplemented"); }
> + virtual bool isLittleEndian() const = 0;
> + virtual uint8_t getAddressSize() const {
> llvm_unreachable("unimplemented"); }
> + virtual const DWARFSection &getInfoSection() const { return Dummy; }
> + virtual void
> + forEachTypesSections(function_ref<void(const DWARFSection &)> F) const
> {}
> + virtual StringRef getAbbrevSection() const { return ""; }
> + virtual const DWARFSection &getLocSection() const { return Dummy; }
> + virtual StringRef getARangeSection() const { return ""; }
> + virtual StringRef getDebugFrameSection() const { return ""; }
> + virtual StringRef getEHFrameSection() const { return ""; }
> + virtual const DWARFSection &getLineSection() const { return Dummy; }
> + virtual StringRef getStringSection() const { return ""; }
> + virtual const DWARFSection &getRangeSection() const { return Dummy; }
> + virtual StringRef getMacinfoSection() const { return ""; }
> + virtual StringRef getPubNamesSection() const { return ""; }
> + virtual StringRef getPubTypesSection() const { return ""; }
> + virtual StringRef getGnuPubNamesSection() const { return ""; }
> + virtual StringRef getGnuPubTypesSection() const { return ""; }
> + virtual const DWARFSection &getStringOffsetSection() const { return
> Dummy; }
> + virtual const DWARFSection &getInfoDWOSection() const { return Dummy; }
> + virtual void
> + forEachTypesDWOSections(function_ref<void(const DWARFSection &)> F)
> const {}
> + virtual StringRef getAbbrevDWOSection() const { return ""; }
> + virtual const DWARFSection &getLineDWOSection() const { return Dummy; }
> + virtual const DWARFSection &getLocDWOSection() const { return Dummy; }
> + virtual StringRef getStringDWOSection() const { return ""; }
> + virtual const DWARFSection &getStringOffsetDWOSection() const {
> + return Dummy;
> + }
> + virtual const DWARFSection &getRangeDWOSection() const { return Dummy;
> }
> + virtual const DWARFSection &getAddrSection() const { return Dummy; }
> + virtual const DWARFSection &getAppleNamesSection() const { return
> Dummy; }
> + virtual const DWARFSection &getAppleTypesSection() const { return
> Dummy; }
> + virtual const DWARFSection &getAppleNamespacesSection() const {
> + return Dummy;
> + }
> + virtual const DWARFSection &getAppleObjCSection() const { return Dummy;
> }
> + virtual StringRef getCUIndexSection() const { return ""; }
> + virtual StringRef getGdbIndexSection() const { return ""; }
> + virtual StringRef getTUIndexSection() const { return ""; }
> + virtual Optional<RelocAddrEntry> find(const DWARFSection &Sec,
> + uint64_t Pos) const = 0;
> +};
> +
> +} // namespace llvm
> +#endif
>
> Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFSection.h
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFSection.h?rev=308543&
> r1=308542&r2=308543&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFSection.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFSection.h Wed Jul 19
> 15:27:28 2017
> @@ -17,6 +17,9 @@ namespace llvm {
>
> struct DWARFSection {
> StringRef Data;
> +};
> +
> +struct DWARFSectionMap final : public DWARFSection {
> RelocAddrMap Relocs;
> };
>
>
> Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h?rev=308543&r1=
> 308542&r2=308543&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h Wed Jul 19
> 15:27:28 2017
> @@ -197,19 +197,12 @@ public:
> bool getAddrOffsetSectionItem(uint32_t Index, uint64_t &Result) const;
> bool getStringOffsetSectionItem(uint32_t Index, uint64_t &Result)
> const;
>
> - DWARFDataExtractor getDebugInfoExtractor() const {
> - return DWARFDataExtractor(InfoSection, isLittleEndian,
> - getAddressByteSize());
> - }
> + DWARFDataExtractor getDebugInfoExtractor() const;
>
> DataExtractor getStringExtractor() const {
> return DataExtractor(StringSection, false, 0);
> }
>
> - const RelocAddrMap *getRelocMap() const { return &InfoSection.Relocs; }
> - const RelocAddrMap &getStringOffsetsRelocMap() const {
> - return StringOffsetSection.Relocs;
> - }
>
> bool extract(DataExtractor debug_info, uint32_t* offset_ptr);
>
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp?rev=308543&r1=3085
> 42&r2=308543&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp Wed Jul 19 15:27:28
> 2017
> @@ -60,9 +60,10 @@ using FileLineInfoKind = DILineInfoSpeci
> using FunctionNameKind = DILineInfoSpecifier::FunctionNameKind;
>
> static void dumpAccelSection(raw_ostream &OS, StringRef Name,
> - const DWARFSection& Section, StringRef
> StringSection,
> - bool LittleEndian) {
> - DWARFDataExtractor AccelSection(Section, LittleEndian, 0);
> + const DWARFObject &Obj,
> + const DWARFSection &Section,
> + StringRef StringSection, bool LittleEndian)
> {
> + DWARFDataExtractor AccelSection(Obj, Section, LittleEndian, 0);
> DataExtractor StrData(StringSection, LittleEndian, 0);
> OS << "\n." << Name << " contents:\n";
> DWARFAcceleratorTable Accel(AccelSection, StrData);
> @@ -73,9 +74,10 @@ static void dumpAccelSection(raw_ostream
>
> static void
> dumpDWARFv5StringOffsetsSection(raw_ostream &OS, StringRef SectionName,
> + const DWARFObject &Obj,
> const DWARFSection &StringOffsetsSection,
> StringRef StringSection, bool
> LittleEndian) {
> - DWARFDataExtractor StrOffsetExt(StringOffsetsSection, LittleEndian, 0);
> + DWARFDataExtractor StrOffsetExt(Obj, StringOffsetsSection,
> LittleEndian, 0);
> uint32_t Offset = 0;
> uint64_t SectionSize = StringOffsetsSection.Data.size();
>
> @@ -153,6 +155,7 @@ dumpDWARFv5StringOffsetsSection(raw_ostr
> // monolithic series of string offsets, as generated by the pre-DWARF v5
> // implementation of split DWARF.
> static void dumpStringOffsetsSection(raw_ostream &OS, StringRef
> SectionName,
> + const DWARFObject &Obj,
> const DWARFSection
> &StringOffsetsSection,
> StringRef StringSection, bool
> LittleEndian,
> unsigned MaxVersion) {
> @@ -163,7 +166,7 @@ static void dumpStringOffsetsSection(raw
> // we assume that the section is formatted like a DWARF v5 string
> offsets
> // section.
> if (MaxVersion >= 5)
> - dumpDWARFv5StringOffsetsSection(OS, SectionName,
> StringOffsetsSection,
> + dumpDWARFv5StringOffsetsSection(OS, SectionName, Obj,
> StringOffsetsSection,
> StringSection, LittleEndian);
> else {
> DataExtractor strOffsetExt(StringOffsetsSection.Data, LittleEndian,
> 0);
> @@ -259,7 +262,7 @@ void DWARFContext::dump(raw_ostream &OS,
> uint32_t offset = 0;
> if (DumpType == DIDT_All || DumpType == DIDT_Aranges) {
> OS << "\n.debug_aranges contents:\n";
> - DataExtractor arangesData(getARangeSection(), isLittleEndian(), 0);
> + DataExtractor arangesData(DObj->getARangeSection(), isLittleEndian(),
> 0);
> DWARFDebugArangeSet set;
> while (set.extract(arangesData, &offset))
> set.dump(OS);
> @@ -274,8 +277,8 @@ void DWARFContext::dump(raw_ostream &OS,
> if (!CUDIE)
> continue;
> if (auto StmtOffset = toSectionOffset(CUDIE.find(DW_AT_stmt_list)))
> {
> - DWARFDataExtractor lineData(getLineSection(), isLittleEndian(),
> - savedAddressByteSize);
> + DWARFDataExtractor lineData(*DObj, DObj->getLineSection(),
> + isLittleEndian(),
> savedAddressByteSize);
> DWARFDebugLine::LineTable LineTable;
> uint32_t Offset = *StmtOffset;
> LineTable.parse(lineData, &Offset);
> @@ -297,8 +300,8 @@ void DWARFContext::dump(raw_ostream &OS,
> if (DumpType == DIDT_All || DumpType == DIDT_LineDwo) {
> OS << "\n.debug_line.dwo contents:\n";
> unsigned stmtOffset = 0;
> - DWARFDataExtractor lineData(getLineDWOSection(), isLittleEndian(),
> - savedAddressByteSize);
> + DWARFDataExtractor lineData(*DObj, DObj->getLineDWOSection(),
> + isLittleEndian(), savedAddressByteSize);
> DWARFDebugLine::LineTable LineTable;
> while (LineTable.Prologue.parse(lineData, &stmtOffset)) {
> LineTable.dump(OS);
> @@ -308,7 +311,7 @@ void DWARFContext::dump(raw_ostream &OS,
>
> if (DumpType == DIDT_All || DumpType == DIDT_Str) {
> OS << "\n.debug_str contents:\n";
> - DataExtractor strData(getStringSection(), isLittleEndian(), 0);
> + DataExtractor strData(DObj->getStringSection(), isLittleEndian(), 0);
> offset = 0;
> uint32_t strOffset = 0;
> while (const char *s = strData.getCStr(&offset)) {
> @@ -318,9 +321,9 @@ void DWARFContext::dump(raw_ostream &OS,
> }
>
> if ((DumpType == DIDT_All || DumpType == DIDT_StrDwo) &&
> - !getStringDWOSection().empty()) {
> + !DObj->getStringDWOSection().empty()) {
> OS << "\n.debug_str.dwo contents:\n";
> - DataExtractor strDWOData(getStringDWOSection(), isLittleEndian(), 0);
> + DataExtractor strDWOData(DObj->getStringDWOSection(),
> isLittleEndian(), 0);
> offset = 0;
> uint32_t strDWOOffset = 0;
> while (const char *s = strDWOData.getCStr(&offset)) {
> @@ -335,8 +338,8 @@ void DWARFContext::dump(raw_ostream &OS,
> // sizes, but for simplicity we just use the address byte size of the
> last
> // compile unit (there is no easy and fast way to associate address
> range
> // list and the compile unit it describes).
> - DWARFDataExtractor rangesData(getRangeSection(), isLittleEndian(),
> - savedAddressByteSize);
> + DWARFDataExtractor rangesData(*DObj, DObj->getRangeSection(),
> + isLittleEndian(),
> savedAddressByteSize);
> offset = 0;
> DWARFDebugRangeList rangeList;
> while (rangeList.extract(rangesData, &offset))
> @@ -344,55 +347,56 @@ void DWARFContext::dump(raw_ostream &OS,
> }
>
> if (DumpType == DIDT_All || DumpType == DIDT_Pubnames)
> - DWARFDebugPubTable(getPubNamesSection(), isLittleEndian(), false)
> + DWARFDebugPubTable(DObj->getPubNamesSection(), isLittleEndian(),
> false)
> .dump("debug_pubnames", OS);
>
> if (DumpType == DIDT_All || DumpType == DIDT_Pubtypes)
> - DWARFDebugPubTable(getPubTypesSection(), isLittleEndian(), false)
> + DWARFDebugPubTable(DObj->getPubTypesSection(), isLittleEndian(),
> false)
> .dump("debug_pubtypes", OS);
>
> if (DumpType == DIDT_All || DumpType == DIDT_GnuPubnames)
> - DWARFDebugPubTable(getGnuPubNamesSection(), isLittleEndian(),
> + DWARFDebugPubTable(DObj->getGnuPubNamesSection(), isLittleEndian(),
> true /* GnuStyle */)
> .dump("debug_gnu_pubnames", OS);
>
> if (DumpType == DIDT_All || DumpType == DIDT_GnuPubtypes)
> - DWARFDebugPubTable(getGnuPubTypesSection(), isLittleEndian(),
> + DWARFDebugPubTable(DObj->getGnuPubTypesSection(), isLittleEndian(),
> true /* GnuStyle */)
> .dump("debug_gnu_pubtypes", OS);
>
> if (DumpType == DIDT_All || DumpType == DIDT_StrOffsets)
> - dumpStringOffsetsSection(OS, "debug_str_offsets",
> getStringOffsetSection(),
> - getStringSection(), isLittleEndian(),
> - getMaxVersion());
> + dumpStringOffsetsSection(
> + OS, "debug_str_offsets", *DObj, DObj->getStringOffsetSection(),
> + DObj->getStringSection(), isLittleEndian(), getMaxVersion());
>
> if (DumpType == DIDT_All || DumpType == DIDT_StrOffsetsDwo) {
> - dumpStringOffsetsSection(OS, "debug_str_offsets.dwo",
> - getStringOffsetDWOSection(),
> getStringDWOSection(),
> - isLittleEndian(), getMaxVersion());
> + dumpStringOffsetsSection(
> + OS, "debug_str_offsets.dwo", *DObj, DObj-
> >getStringOffsetDWOSection(),
> + DObj->getStringDWOSection(), isLittleEndian(), getMaxVersion());
> }
>
> if ((DumpType == DIDT_All || DumpType == DIDT_GdbIndex) &&
> - !getGdbIndexSection().empty()) {
> + !DObj->getGdbIndexSection().empty()) {
> OS << "\n.gnu_index contents:\n";
> getGdbIndex().dump(OS);
> }
>
> if (DumpType == DIDT_All || DumpType == DIDT_AppleNames)
> - dumpAccelSection(OS, "apple_names", getAppleNamesSection(),
> - getStringSection(), isLittleEndian());
> + dumpAccelSection(OS, "apple_names", *DObj, DObj-
> >getAppleNamesSection(),
> + DObj->getStringSection(), isLittleEndian());
>
> if (DumpType == DIDT_All || DumpType == DIDT_AppleTypes)
> - dumpAccelSection(OS, "apple_types", getAppleTypesSection(),
> - getStringSection(), isLittleEndian());
> + dumpAccelSection(OS, "apple_types", *DObj, DObj-
> >getAppleTypesSection(),
> + DObj->getStringSection(), isLittleEndian());
>
> if (DumpType == DIDT_All || DumpType == DIDT_AppleNamespaces)
> - dumpAccelSection(OS, "apple_namespaces", getAppleNamespacesSection(),
> - getStringSection(), isLittleEndian());
> + dumpAccelSection(OS, "apple_namespaces", *DObj,
> + DObj->getAppleNamespacesSection(),
> + DObj->getStringSection(), isLittleEndian());
>
> if (DumpType == DIDT_All || DumpType == DIDT_AppleObjC)
> - dumpAccelSection(OS, "apple_objc", getAppleObjCSection(),
> - getStringSection(), isLittleEndian());
> + dumpAccelSection(OS, "apple_objc", *DObj, DObj-
> >getAppleObjCSection(),
> + DObj->getStringSection(), isLittleEndian());
> }
>
> DWARFCompileUnit *DWARFContext::getDWOCompileUnitForHash(uint64_t Hash) {
> @@ -433,7 +437,7 @@ const DWARFUnitIndex &DWARFContext::getC
> if (CUIndex)
> return *CUIndex;
>
> - DataExtractor CUIndexData(getCUIndexSection(), isLittleEndian(), 0);
> + DataExtractor CUIndexData(DObj->getCUIndexSection(), isLittleEndian(),
> 0);
>
> CUIndex = llvm::make_unique<DWARFUnitIndex>(DW_SECT_INFO);
> CUIndex->parse(CUIndexData);
> @@ -444,7 +448,7 @@ const DWARFUnitIndex &DWARFContext::getT
> if (TUIndex)
> return *TUIndex;
>
> - DataExtractor TUIndexData(getTUIndexSection(), isLittleEndian(), 0);
> + DataExtractor TUIndexData(DObj->getTUIndexSection(), isLittleEndian(),
> 0);
>
> TUIndex = llvm::make_unique<DWARFUnitIndex>(DW_SECT_TYPES);
> TUIndex->parse(TUIndexData);
> @@ -455,7 +459,7 @@ DWARFGdbIndex &DWARFContext::getGdbIndex
> if (GdbIndex)
> return *GdbIndex;
>
> - DataExtractor GdbIndexData(getGdbIndexSection(), true /*LE*/, 0);
> + DataExtractor GdbIndexData(DObj->getGdbIndexSection(), true /*LE*/, 0);
> GdbIndex = llvm::make_unique<DWARFGdbIndex>();
> GdbIndex->parse(GdbIndexData);
> return *GdbIndex;
> @@ -465,7 +469,7 @@ const DWARFDebugAbbrev *DWARFContext::ge
> if (Abbrev)
> return Abbrev.get();
>
> - DataExtractor abbrData(getAbbrevSection(), isLittleEndian(), 0);
> + DataExtractor abbrData(DObj->getAbbrevSection(), isLittleEndian(), 0);
>
> Abbrev.reset(new DWARFDebugAbbrev());
> Abbrev->extract(abbrData);
> @@ -476,7 +480,7 @@ const DWARFDebugAbbrev *DWARFContext::ge
> if (AbbrevDWO)
> return AbbrevDWO.get();
>
> - DataExtractor abbrData(getAbbrevDWOSection(), isLittleEndian(), 0);
> + DataExtractor abbrData(DObj->getAbbrevDWOSection(), isLittleEndian(),
> 0);
> AbbrevDWO.reset(new DWARFDebugAbbrev());
> AbbrevDWO->extract(abbrData);
> return AbbrevDWO.get();
> @@ -489,7 +493,7 @@ const DWARFDebugLoc *DWARFContext::getDe
> Loc.reset(new DWARFDebugLoc);
> // assume all compile units have the same address byte size
> if (getNumCompileUnits()) {
> - DWARFDataExtractor LocData(getLocSection(), isLittleEndian(),
> + DWARFDataExtractor LocData(*DObj, DObj->getLocSection(),
> isLittleEndian(),
> getCompileUnitAtIndex(0)-
> >getAddressByteSize());
> Loc->parse(LocData);
> }
> @@ -500,7 +504,7 @@ const DWARFDebugLocDWO *DWARFContext::ge
> if (LocDWO)
> return LocDWO.get();
>
> - DataExtractor LocData(getLocDWOSection().Data, isLittleEndian(), 0);
> + DataExtractor LocData(DObj->getLocDWOSection().Data, isLittleEndian(),
> 0);
> LocDWO.reset(new DWARFDebugLocDWO());
> LocDWO->parse(LocData);
> return LocDWO.get();
> @@ -528,8 +532,8 @@ const DWARFDebugFrame *DWARFContext::get
> // provides this information). This problem is fixed in DWARFv4
> // See this dwarf-discuss discussion for more details:
> // http://lists.dwarfstd.org/htdig.cgi/dwarf-discuss-dwarfstd.org/2011-
> December/001173.html
> - DataExtractor debugFrameData(getDebugFrameSection(), isLittleEndian(),
> - getAddressSize());
> + DataExtractor debugFrameData(DObj->getDebugFrameSection(),
> isLittleEndian(),
> + DObj->getAddressSize());
> DebugFrame.reset(new DWARFDebugFrame(false /* IsEH */));
> DebugFrame->parse(debugFrameData);
> return DebugFrame.get();
> @@ -539,8 +543,8 @@ const DWARFDebugFrame *DWARFContext::get
> if (EHFrame)
> return EHFrame.get();
>
> - DataExtractor debugFrameData(getEHFrameSection(), isLittleEndian(),
> - getAddressSize());
> + DataExtractor debugFrameData(DObj->getEHFrameSection(),
> isLittleEndian(),
> + DObj->getAddressSize());
> DebugFrame.reset(new DWARFDebugFrame(true /* IsEH */));
> DebugFrame->parse(debugFrameData);
> return DebugFrame.get();
> @@ -550,7 +554,7 @@ const DWARFDebugMacro *DWARFContext::get
> if (Macro)
> return Macro.get();
>
> - DataExtractor MacinfoData(getMacinfoSection(), isLittleEndian(), 0);
> + DataExtractor MacinfoData(DObj->getMacinfoSection(), isLittleEndian(),
> 0);
> Macro.reset(new DWARFDebugMacro());
> Macro->parse(MacinfoData);
> return Macro.get();
> @@ -579,32 +583,32 @@ DWARFContext::getLineTableForUnit(DWARFU
> return nullptr;
>
> // We have to parse it first.
> - DWARFDataExtractor lineData(U->getLineSection(), isLittleEndian(),
> + DWARFDataExtractor lineData(*DObj, U->getLineSection(),
> isLittleEndian(),
> U->getAddressByteSize());
> return Line->getOrParseLineTable(lineData, stmtOffset);
> }
>
> void DWARFContext::parseCompileUnits() {
> - CUs.parse(*this, getInfoSection());
> + CUs.parse(*this, DObj->getInfoSection());
> }
>
> void DWARFContext::parseTypeUnits() {
> if (!TUs.empty())
> return;
> - forEachTypesSections([&](const DWARFSection &S) {
> + DObj->forEachTypesSections([&](const DWARFSection &S) {
> TUs.emplace_back();
> TUs.back().parse(*this, S);
> });
> }
>
> void DWARFContext::parseDWOCompileUnits() {
> - DWOCUs.parseDWO(*this, getInfoDWOSection());
> + DWOCUs.parseDWO(*this, DObj->getInfoDWOSection());
> }
>
> void DWARFContext::parseDWOTypeUnits() {
> if (!DWOTUs.empty())
> return;
> - forEachTypesDWOSections([&](const DWARFSection &S) {
> + DObj->forEachTypesDWOSections([&](const DWARFSection &S) {
> DWOTUs.emplace_back();
> DWOTUs.back().parseDWO(*this, S);
> });
> @@ -779,6 +783,20 @@ DWARFContext::getInliningInfoForAddress(
> return InliningInfo;
> }
>
> +/// DWARFContextInMemory is the simplest possible implementation of a
> +/// DWARFContext. It assumes all content is available in memory and
> stores
> +/// pointers to it.
> +class DWARFContextInMemory : public DWARFContext {
> +public:
> + DWARFContextInMemory(
> + const object::ObjectFile &Obj, const LoadedObjectInfo *L = nullptr,
> + function_ref<ErrorPolicy(Error)> HandleError =
> defaultErrorHandler);
> +
> + DWARFContextInMemory(const StringMap<std::unique_ptr<MemoryBuffer>>
> &Sections,
> + uint8_t AddrSize,
> + bool isLittleEndian = sys::IsLittleEndianHost);
> +};
> +
> std::shared_ptr<DWARFContext>
> DWARFContext::getDWOContext(StringRef AbsolutePath) {
> if (auto S = DWP.lock()) {
> @@ -796,7 +814,7 @@ DWARFContext::getDWOContext(StringRef Ab
> SmallString<128> DWPName;
> Expected<OwningBinary<ObjectFile>> Obj = [&] {
> if (!CheckedForDWP) {
> - (getFileName() + ".dwp").toVector(DWPName);
> + (DObj->getFileName() + ".dwp").toVector(DWPName);
> auto Obj = object::ObjectFile::createObjectFile(DWPName);
> if (Obj) {
> Entry = &DWP;
> @@ -820,7 +838,7 @@ DWARFContext::getDWOContext(StringRef Ab
>
> auto S = std::make_shared<DWOFile>();
> S->File = std::move(Obj.get());
> - S->Context = llvm::make_unique<DWARFContextInMemory>(*S-
> >File.getBinary());
> + S->Context = DWARFContext::create(*S->File.getBinary());
> *Entry = S;
> auto *Ctxt = S->Context.get();
> return std::shared_ptr<DWARFContext>(std::move(S), Ctxt);
> @@ -906,208 +924,355 @@ static bool isRelocScattered(const objec
> return MachObj->isRelocationScattered(RelocInfo);
> }
>
> -Error DWARFContextInMemory::maybeDecompress(const SectionRef &Sec,
> - StringRef Name, StringRef
> &Data) {
> - if (!Decompressor::isCompressed(Sec))
> - return Error::success();
> -
> - Expected<Decompressor> Decompressor =
> - Decompressor::create(Name, Data, IsLittleEndian, AddressSize == 8);
> - if (!Decompressor)
> - return Decompressor.takeError();
> -
> - SmallString<32> Out;
> - if (auto Err = Decompressor->resizeAndDecompress(Out))
> - return Err;
> -
> - UncompressedSections.emplace_back(std::move(Out));
> - Data = UncompressedSections.back();
> -
> - return Error::success();
> -}
> -
> -ErrorPolicy DWARFContextInMemory::defaultErrorHandler(Error E) {
> +ErrorPolicy DWARFContext::defaultErrorHandler(Error E) {
> errs() << "error: " + toString(std::move(E)) << '\n';
> return ErrorPolicy::Continue;
> }
>
> -DWARFContextInMemory::DWARFContextInMemory(
> - const object::ObjectFile &Obj, const LoadedObjectInfo *L,
> - function_ref<ErrorPolicy(Error)> HandleError)
> - : FileName(Obj.getFileName()), IsLittleEndian(Obj.isLittleEndian()),
> - AddressSize(Obj.getBytesInAddress()) {
> - for (const SectionRef &Section : Obj.sections()) {
> - StringRef Name;
> - Section.getName(Name);
> - // Skip BSS and Virtual sections, they aren't interesting.
> - if (Section.isBSS() || Section.isVirtual())
> - continue;
> -
> - StringRef Data;
> - section_iterator RelocatedSection = Section.getRelocatedSection();
> - // 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))
> - Section.getContents(Data);
> -
> - if (auto Err = maybeDecompress(Section, Name, Data)) {
> - ErrorPolicy EP = HandleError(
> - createError("failed to decompress '" + Name + "', ",
> std::move(Err)));
> - if (EP == ErrorPolicy::Halt)
> - return;
> - continue;
> +class DWARFObjInMemory final : public DWARFObject {
> + bool IsLittleEndian;
> + uint8_t AddressSize;
> + StringRef FileName;
> +
> + using TypeSectionMap = MapVector<object::SectionRef, DWARFSectionMap,
> + std::map<object::SectionRef,
> unsigned>>;
> +
> + TypeSectionMap TypesSections;
> + TypeSectionMap TypesDWOSections;
> +
> + DWARFSectionMap InfoSection;
> + DWARFSectionMap LocSection;
> + DWARFSectionMap LineSection;
> + DWARFSectionMap RangeSection;
> + DWARFSectionMap StringOffsetSection;
> + DWARFSectionMap InfoDWOSection;
> + DWARFSectionMap LineDWOSection;
> + DWARFSectionMap LocDWOSection;
> + DWARFSectionMap StringOffsetDWOSection;
> + DWARFSectionMap RangeDWOSection;
> + DWARFSectionMap AddrSection;
> + DWARFSectionMap AppleNamesSection;
> + DWARFSectionMap AppleTypesSection;
> + DWARFSectionMap AppleNamespacesSection;
> + DWARFSectionMap AppleObjCSection;
> +
> + DWARFSectionMap *mapNameToDWARFSection(StringRef Name) {
> + return StringSwitch<DWARFSectionMap *>(Name)
> + .Case("debug_info", &InfoSection)
> + .Case("debug_loc", &LocSection)
> + .Case("debug_line", &LineSection)
> + .Case("debug_str_offsets", &StringOffsetSection)
> + .Case("debug_ranges", &RangeSection)
> + .Case("debug_info.dwo", &InfoDWOSection)
> + .Case("debug_loc.dwo", &LocDWOSection)
> + .Case("debug_line.dwo", &LineDWOSection)
> + .Case("debug_str_offsets.dwo", &StringOffsetDWOSection)
> + .Case("debug_addr", &AddrSection)
> + .Case("apple_names", &AppleNamesSection)
> + .Case("apple_types", &AppleTypesSection)
> + .Case("apple_namespaces", &AppleNamespacesSection)
> + .Case("apple_namespac", &AppleNamespacesSection)
> + .Case("apple_objc", &AppleObjCSection)
> + .Default(nullptr);
> + }
> +
> + StringRef AbbrevSection;
> + StringRef ARangeSection;
> + StringRef DebugFrameSection;
> + StringRef EHFrameSection;
> + StringRef StringSection;
> + StringRef MacinfoSection;
> + StringRef PubNamesSection;
> + StringRef PubTypesSection;
> + StringRef GnuPubNamesSection;
> + StringRef AbbrevDWOSection;
> + StringRef StringDWOSection;
> + StringRef GnuPubTypesSection;
> + StringRef CUIndexSection;
> + StringRef GdbIndexSection;
> + StringRef TUIndexSection;
> +
> + SmallVector<SmallString<32>, 4> UncompressedSections;
> +
> + StringRef *mapSectionToMember(StringRef Name) {
> + if (DWARFSection *Sec = mapNameToDWARFSection(Name))
> + return &Sec->Data;
> + return StringSwitch<StringRef *>(Name)
> + .Case("debug_abbrev", &AbbrevSection)
> + .Case("debug_aranges", &ARangeSection)
> + .Case("debug_frame", &DebugFrameSection)
> + .Case("eh_frame", &EHFrameSection)
> + .Case("debug_str", &StringSection)
> + .Case("debug_macinfo", &MacinfoSection)
> + .Case("debug_pubnames", &PubNamesSection)
> + .Case("debug_pubtypes", &PubTypesSection)
> + .Case("debug_gnu_pubnames", &GnuPubNamesSection)
> + .Case("debug_gnu_pubtypes", &GnuPubTypesSection)
> + .Case("debug_abbrev.dwo", &AbbrevDWOSection)
> + .Case("debug_str.dwo", &StringDWOSection)
> + .Case("debug_cu_index", &CUIndexSection)
> + .Case("debug_tu_index", &TUIndexSection)
> + .Case("gdb_index", &GdbIndexSection)
> + // Any more debug info sections go here.
> + .Default(nullptr);
> + }
> +
> + /// If Sec is compressed section, decompresses and updates its contents
> + /// provided by Data. Otherwise leaves it unchanged.
> + Error maybeDecompress(const object::SectionRef &Sec, StringRef Name,
> + StringRef &Data) {
> + if (!Decompressor::isCompressed(Sec))
> + return Error::success();
> +
> + Expected<Decompressor> Decompressor =
> + Decompressor::create(Name, Data, IsLittleEndian, AddressSize ==
> 8);
> + if (!Decompressor)
> + return Decompressor.takeError();
> +
> + SmallString<32> Out;
> + if (auto Err = Decompressor->resizeAndDecompress(Out))
> + return Err;
> +
> + UncompressedSections.emplace_back(std::move(Out));
> + Data = UncompressedSections.back();
> +
> + return Error::success();
> + }
> +
> +public:
> + DWARFObjInMemory(const StringMap<std::unique_ptr<MemoryBuffer>>
> &Sections,
> + uint8_t AddrSize, bool IsLittleEndian)
> + : IsLittleEndian(IsLittleEndian) {
> + for (const auto &SecIt : Sections) {
> + if (StringRef *SectionData = mapSectionToMember(SecIt.first()))
> + *SectionData = SecIt.second->getBuffer();
> }
> + }
> + DWARFObjInMemory(const object::ObjectFile &Obj, const LoadedObjectInfo
> *L,
> + function_ref<ErrorPolicy(Error)> HandleError)
> + : IsLittleEndian(Obj.isLittleEndian()),
> + AddressSize(Obj.getBytesInAddress()), FileName(Obj.getFileName())
> {
> +
> + for (const SectionRef &Section : Obj.sections()) {
> + StringRef Name;
> + Section.getName(Name);
> + // Skip BSS and Virtual sections, they aren't interesting.
> + if (Section.isBSS() || Section.isVirtual())
> + continue;
>
> - // Compressed sections names in GNU style starts from ".z",
> - // at this point section is decompressed and we drop compression
> prefix.
> - Name = Name.substr(
> - Name.find_first_not_of("._z")); // Skip ".", "z" and "_"
> prefixes.
> -
> - // Map platform specific debug section names to DWARF standard
> section
> - // names.
> - Name = Obj.mapDebugSectionName(Name);
> -
> - if (StringRef *SectionData = mapSectionToMember(Name)) {
> - *SectionData = Data;
> - if (Name == "debug_ranges") {
> - // FIXME: Use the other dwo range section when we emit it.
> - RangeDWOSection.Data = Data;
> + StringRef Data;
> + section_iterator RelocatedSection = Section.getRelocatedSection();
> + // 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))
> + Section.getContents(Data);
> +
> + if (auto Err = maybeDecompress(Section, Name, Data)) {
> + ErrorPolicy EP = HandleError(createError(
> + "failed to decompress '" + Name + "', ", std::move(Err)));
> + if (EP == ErrorPolicy::Halt)
> + return;
> + continue;
> }
> - } else if (Name == "debug_types") {
> - // Find debug_types data by section rather than name as there are
> - // multiple, comdat grouped, debug_types sections.
> - TypesSections[Section].Data = Data;
> - } else if (Name == "debug_types.dwo") {
> - TypesDWOSections[Section].Data = Data;
> - }
>
> - if (RelocatedSection == Obj.section_end())
> - continue;
> + // Compressed sections names in GNU style starts from ".z",
> + // at this point section is decompressed and we drop compression
> prefix.
> + Name = Name.substr(
> + Name.find_first_not_of("._z")); // Skip ".", "z" and "_"
> prefixes.
> +
> + // Map platform specific debug section names to DWARF standard
> section
> + // names.
> + Name = Obj.mapDebugSectionName(Name);
> +
> + if (StringRef *SectionData = mapSectionToMember(Name)) {
> + *SectionData = Data;
> + if (Name == "debug_ranges") {
> + // FIXME: Use the other dwo range section when we emit it.
> + RangeDWOSection.Data = Data;
> + }
> + } else if (Name == "debug_types") {
> + // Find debug_types data by section rather than name as there are
> + // multiple, comdat grouped, debug_types sections.
> + TypesSections[Section].Data = Data;
> + } else if (Name == "debug_types.dwo") {
> + TypesDWOSections[Section].Data = Data;
> + }
>
> - StringRef RelSecName;
> - StringRef RelSecData;
> - RelocatedSection->getName(RelSecName);
> -
> - // 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))
> - continue;
> -
> - // In Mach-o files, the relocations do not need to be applied if
> - // there is no load offset to apply. The value read at the
> - // relocation point already factors in the section address
> - // (actually applying the relocations will produce wrong results
> - // as the section address will be added twice).
> - if (!L && isa<MachOObjectFile>(&Obj))
> - continue;
> -
> - RelSecName = RelSecName.substr(
> - RelSecName.find_first_not_of("._z")); // Skip . and _ prefixes.
> -
> - // TODO: Add support for relocations in other sections as needed.
> - // Record relocations for the debug_info and debug_line sections.
> - DWARFSection *Sec = mapNameToDWARFSection(RelSecName);
> - RelocAddrMap *Map = Sec ? &Sec->Relocs : nullptr;
> - if (!Map) {
> - // Find debug_types relocs by section rather than name as there are
> - // multiple, comdat grouped, debug_types sections.
> - if (RelSecName == "debug_types")
> - Map = &TypesSections[*RelocatedSection].Relocs;
> - else if (RelSecName == "debug_types.dwo")
> - Map = &TypesDWOSections[*RelocatedSection].Relocs;
> - else
> + if (RelocatedSection == Obj.section_end())
> continue;
> - }
> -
> - if (Section.relocation_begin() == Section.relocation_end())
> - continue;
>
> - // 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))
> + StringRef RelSecName;
> + StringRef RelSecData;
> + RelocatedSection->getName(RelSecName);
> +
> + // 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))
> continue;
>
> - Expected<SymInfo> SymInfoOrErr = getSymbolInfo(Obj, Reloc, L,
> AddrCache);
> - if (!SymInfoOrErr) {
> - if (HandleError(SymInfoOrErr.takeError()) == ErrorPolicy::Halt)
> - return;
> + // In Mach-o files, the relocations do not need to be applied if
> + // there is no load offset to apply. The value read at the
> + // relocation point already factors in the section address
> + // (actually applying the relocations will produce wrong results
> + // as the section address will be added twice).
> + if (!L && isa<MachOObjectFile>(&Obj))
> continue;
> +
> + RelSecName = RelSecName.substr(
> + RelSecName.find_first_not_of("._z")); // Skip . and _ prefixes.
> +
> + // TODO: Add support for relocations in other sections as needed.
> + // Record relocations for the debug_info and debug_line sections.
> + DWARFSectionMap *Sec = mapNameToDWARFSection(RelSecName);
> + RelocAddrMap *Map = Sec ? &Sec->Relocs : nullptr;
> + if (!Map) {
> + // Find debug_types relocs by section rather than name as there
> are
> + // multiple, comdat grouped, debug_types sections.
> + if (RelSecName == "debug_types")
> + Map =
> + &static_cast<DWARFSectionMap
> &>(TypesSections[*RelocatedSection])
> + .Relocs;
> + else if (RelSecName == "debug_types.dwo")
> + Map = &static_cast<DWARFSectionMap &>(
> + TypesDWOSections[*RelocatedSection])
> + .Relocs;
> + else
> + continue;
> }
>
> - object::RelocVisitor V(Obj);
> - uint64_t Val = V.visit(Reloc.getType(), Reloc, SymInfoOrErr-
> >Address);
> - if (V.error()) {
> - SmallString<32> Type;
> - Reloc.getTypeName(Type);
> - ErrorPolicy EP = HandleError(
> - createError("failed to compute relocation: " + Type + ", ",
> - errorCodeToError(object_error::parse_failed)));
> - if (EP == ErrorPolicy::Halt)
> - return;
> + if (Section.relocation_begin() == Section.relocation_end())
> continue;
> +
> + // 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<SymInfo> SymInfoOrErr =
> + getSymbolInfo(Obj, Reloc, L, AddrCache);
> + if (!SymInfoOrErr) {
> + if (HandleError(SymInfoOrErr.takeError()) == ErrorPolicy::Halt)
> + return;
> + continue;
> + }
> +
> + object::RelocVisitor V(Obj);
> + uint64_t Val = V.visit(Reloc.getType(), Reloc, SymInfoOrErr-
> >Address);
> + if (V.error()) {
> + SmallString<32> Type;
> + Reloc.getTypeName(Type);
> + ErrorPolicy EP = HandleError(
> + createError("failed to compute relocation: " + Type + ", ",
> + errorCodeToError(object_error::parse_failed)));
> + if (EP == ErrorPolicy::Halt)
> + return;
> + continue;
> + }
> + RelocAddrEntry Rel = {SymInfoOrErr->SectionIndex, Val};
> + Map->insert({Reloc.getOffset(), Rel});
> }
> - RelocAddrEntry Rel = {SymInfoOrErr->SectionIndex, Val};
> - Map->insert({Reloc.getOffset(), Rel});
> }
> }
> -}
>
> -DWARFContextInMemory::DWARFContextInMemory(
> - const StringMap<std::unique_ptr<MemoryBuffer>> &Sections, uint8_t
> AddrSize,
> - bool isLittleEndian)
> - : IsLittleEndian(isLittleEndian), AddressSize(AddrSize) {
> - for (const auto &SecIt : Sections) {
> - if (StringRef *SectionData = mapSectionToMember(SecIt.first()))
> - *SectionData = SecIt.second->getBuffer();
> + Optional<RelocAddrEntry> find(const DWARFSection &S,
> + uint64_t Pos) const override {
> + auto &Sec = static_cast<const DWARFSectionMap &>(S);
> + RelocAddrMap::const_iterator AI = Sec.Relocs.find(Pos);
> + if (AI == Sec.Relocs.end())
> + return None;
> + return AI->second;
> + }
> +
> + bool isLittleEndian() const override { return IsLittleEndian; }
> + StringRef getAbbrevDWOSection() const override { return
> AbbrevDWOSection; }
> + const DWARFSection &getLineDWOSection() const override {
> + return LineDWOSection;
> + }
> + const DWARFSection &getLocDWOSection() const override {
> + return LocDWOSection;
> + }
> + StringRef getStringDWOSection() const override { return
> StringDWOSection; }
> + const DWARFSection &getStringOffsetDWOSection() const override {
> + return StringOffsetDWOSection;
> + }
> + const DWARFSection &getRangeDWOSection() const override {
> + return RangeDWOSection;
> + }
> + const DWARFSection &getAddrSection() const override { return
> AddrSection; }
> + StringRef getCUIndexSection() const override { return CUIndexSection; }
> + StringRef getGdbIndexSection() const override { return GdbIndexSection;
> }
> + StringRef getTUIndexSection() const override { return TUIndexSection; }
> +
> + // DWARF v5
> + const DWARFSection &getStringOffsetSection() const override {
> + return StringOffsetSection;
> + }
> +
> + // Sections for DWARF5 split dwarf proposal.
> + const DWARFSection &getInfoDWOSection() const override {
> + return InfoDWOSection;
> + }
> + void forEachTypesDWOSections(
> + function_ref<void(const DWARFSection &)> F) const override {
> + for (auto &P : TypesDWOSections)
> + F(P.second);
> + }
> +
> + StringRef getAbbrevSection() const override { return AbbrevSection; }
> + const DWARFSection &getLocSection() const override { return LocSection;
> }
> + StringRef getARangeSection() const override { return ARangeSection; }
> + StringRef getDebugFrameSection() const override { return
> DebugFrameSection; }
> + StringRef getEHFrameSection() const override { return EHFrameSection; }
> + const DWARFSection &getLineSection() const override { return
> LineSection; }
> + StringRef getStringSection() const override { return StringSection; }
> + const DWARFSection &getRangeSection() const override { return
> RangeSection; }
> + StringRef getMacinfoSection() const override { return MacinfoSection; }
> + StringRef getPubNamesSection() const override { return PubNamesSection;
> }
> + StringRef getPubTypesSection() const override { return PubTypesSection;
> }
> + StringRef getGnuPubNamesSection() const override {
> + return GnuPubNamesSection;
> + }
> + StringRef getGnuPubTypesSection() const override {
> + return GnuPubTypesSection;
> + }
> + const DWARFSection &getAppleNamesSection() const override {
> + return AppleNamesSection;
> + }
> + const DWARFSection &getAppleTypesSection() const override {
> + return AppleTypesSection;
> + }
> + const DWARFSection &getAppleNamespacesSection() const override {
> + return AppleNamespacesSection;
> + }
> + const DWARFSection &getAppleObjCSection() const override {
> + return AppleObjCSection;
> + }
> +
> + StringRef getFileName() const override { return FileName; }
> + uint8_t getAddressSize() const override { return AddressSize; }
> + const DWARFSection &getInfoSection() const override { return
> InfoSection; }
> + void forEachTypesSections(
> + function_ref<void(const DWARFSection &)> F) const override {
> + for (auto &P : TypesSections)
> + F(P.second);
> }
> -}
> +};
>
> -DWARFSection *DWARFContextInMemory::mapNameToDWARFSection(StringRef Name)
> {
> - return StringSwitch<DWARFSection *>(Name)
> - .Case("debug_info", &InfoSection)
> - .Case("debug_loc", &LocSection)
> - .Case("debug_line", &LineSection)
> - .Case("debug_str_offsets", &StringOffsetSection)
> - .Case("debug_ranges", &RangeSection)
> - .Case("debug_info.dwo", &InfoDWOSection)
> - .Case("debug_loc.dwo", &LocDWOSection)
> - .Case("debug_line.dwo", &LineDWOSection)
> - .Case("debug_str_offsets.dwo", &StringOffsetDWOSection)
> - .Case("debug_addr", &AddrSection)
> - .Case("apple_names", &AppleNamesSection)
> - .Case("apple_types", &AppleTypesSection)
> - .Case("apple_namespaces", &AppleNamespacesSection)
> - .Case("apple_namespac", &AppleNamespacesSection)
> - .Case("apple_objc", &AppleObjCSection)
> - .Default(nullptr);
> -}
> -
> -StringRef *DWARFContextInMemory::mapSectionToMember(StringRef Name) {
> - if (DWARFSection *Sec = mapNameToDWARFSection(Name))
> - return &Sec->Data;
> - return StringSwitch<StringRef *>(Name)
> - .Case("debug_abbrev", &AbbrevSection)
> - .Case("debug_aranges", &ARangeSection)
> - .Case("debug_frame", &DebugFrameSection)
> - .Case("eh_frame", &EHFrameSection)
> - .Case("debug_str", &StringSection)
> - .Case("debug_macinfo", &MacinfoSection)
> - .Case("debug_pubnames", &PubNamesSection)
> - .Case("debug_pubtypes", &PubTypesSection)
> - .Case("debug_gnu_pubnames", &GnuPubNamesSection)
> - .Case("debug_gnu_pubtypes", &GnuPubTypesSection)
> - .Case("debug_abbrev.dwo", &AbbrevDWOSection)
> - .Case("debug_str.dwo", &StringDWOSection)
> - .Case("debug_cu_index", &CUIndexSection)
> - .Case("debug_tu_index", &TUIndexSection)
> - .Case("gdb_index", &GdbIndexSection)
> - // Any more debug info sections go here.
> - .Default(nullptr);
> +std::unique_ptr<DWARFContext>
> +DWARFContext::create(const object::ObjectFile &Obj, const
> LoadedObjectInfo *L,
> + function_ref<ErrorPolicy(Error)> HandleError) {
> + auto DObj = make_unique<DWARFObjInMemory>(Obj, L, HandleError);
> + return make_unique<DWARFContext>(std::move(DObj));
> }
>
> -void DWARFContextInMemory::anchor() {}
> +std::unique_ptr<DWARFContext>
> +DWARFContext::create(const StringMap<std::unique_ptr<MemoryBuffer>>
> &Sections,
> + uint8_t AddrSize, bool isLittleEndian) {
> + auto DObj = make_unique<DWARFObjInMemory>(Sections, AddrSize,
> isLittleEndian);
> + return make_unique<DWARFContext>(std::move(DObj));
> +}
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFDataExtractor.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/DebugInfo/DWARF/DWARFDataExtractor.cpp?rev=308543&r
> 1=308542&r2=308543&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFDataExtractor.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFDataExtractor.cpp Wed Jul 19
> 15:27:28 2017
> @@ -8,17 +8,18 @@
> //===--------------------------------------------------------------------
> --===//
>
> #include "llvm/DebugInfo/DWARF/DWARFDataExtractor.h"
> +#include "llvm/DebugInfo/DWARF/DWARFContext.h"
>
> using namespace llvm;
>
> uint64_t DWARFDataExtractor::getRelocatedValue(uint32_t Size, uint32_t
> *Off,
> uint64_t *SecNdx) const {
> - if (!RelocMap)
> + if (!Section)
> return getUnsigned(Off, Size);
> - RelocAddrMap::const_iterator AI = RelocMap->find(*Off);
> - if (AI == RelocMap->end())
> + Optional<RelocAddrEntry> Rel = Obj->find(*Section, *Off);
> + if (!Rel)
> return getUnsigned(Off, Size);
> if (SecNdx)
> - *SecNdx = AI->second.SectionIndex;
> - return getUnsigned(Off, Size) + AI->second.Value;
> + *SecNdx = Rel->SectionIndex;
> + return getUnsigned(Off, Size) + Rel->Value;
> }
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugAranges.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugAranges.cpp?rev=308543&r1
> =308542&r2=308543&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugAranges.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugAranges.cpp Wed Jul 19
> 15:27:28 2017
> @@ -43,7 +43,8 @@ void DWARFDebugAranges::generate(DWARFCo
> return;
>
> // Extract aranges from .debug_aranges section.
> - DataExtractor ArangesData(CTX->getARangeSection(), CTX-
> >isLittleEndian(), 0);
> + DataExtractor ArangesData(CTX->getDWARFObj().getARangeSection(),
> + CTX->isLittleEndian(), 0);
> extract(ArangesData);
>
> // Generate aranges from DIEs: even if .debug_aranges section is
> present,
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp?rev=308543&r1=308542&
> r2=308543&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp Wed Jul 19 15:27:28 2017
> @@ -30,17 +30,19 @@ using namespace llvm;
> using namespace dwarf;
>
> void DWARFUnitSectionBase::parse(DWARFContext &C, const DWARFSection
> &Section) {
> - parseImpl(C, Section, C.getDebugAbbrev(), &C.getRangeSection(),
> - C.getStringSection(), C.getStringOffsetSection(),
> - &C.getAddrSection(), C.getLineSection(), C.isLittleEndian(),
> false);
> + const DWARFObject &D = C.getDWARFObj();
> + parseImpl(C, Section, C.getDebugAbbrev(), &D.getRangeSection(),
> + D.getStringSection(), D.getStringOffsetSection(),
> + &D.getAddrSection(), D.getLineSection(), D.isLittleEndian(),
> false);
> }
>
> void DWARFUnitSectionBase::parseDWO(DWARFContext &C,
> const DWARFSection &DWOSection,
> DWARFUnitIndex *Index) {
> - parseImpl(C, DWOSection, C.getDebugAbbrevDWO(),
> &C.getRangeDWOSection(),
> - C.getStringDWOSection(), C.getStringOffsetDWOSection(),
> - &C.getAddrSection(), C.getLineDWOSection(),
> C.isLittleEndian(),
> + const DWARFObject &D = C.getDWARFObj();
> + parseImpl(C, DWOSection, C.getDebugAbbrevDWO(),
> &D.getRangeDWOSection(),
> + D.getStringDWOSection(), D.getStringOffsetDWOSection(),
> + &D.getAddrSection(), D.getLineDWOSection(),
> C.isLittleEndian(),
> true);
> }
>
> @@ -59,13 +61,18 @@ DWARFUnit::DWARFUnit(DWARFContext &DC, c
>
> DWARFUnit::~DWARFUnit() = default;
>
> +DWARFDataExtractor DWARFUnit::getDebugInfoExtractor() const {
> + return DWARFDataExtractor(Context.getDWARFObj(), InfoSection,
> isLittleEndian,
> + getAddressByteSize());
> +}
> +
> bool DWARFUnit::getAddrOffsetSectionItem(uint32_t Index,
> uint64_t &Result) const {
> uint32_t Offset = AddrOffsetSectionBase + Index * getAddressByteSize();
> if (AddrOffsetSection->Data.size() < Offset + getAddressByteSize())
> return false;
> - DWARFDataExtractor DA(*AddrOffsetSection, isLittleEndian,
> - getAddressByteSize());
> + DWARFDataExtractor DA(Context.getDWARFObj(), *AddrOffsetSection,
> + isLittleEndian, getAddressByteSize());
> Result = DA.getRelocatedAddress(&Offset);
> return true;
> }
> @@ -76,7 +83,8 @@ bool DWARFUnit::getStringOffsetSectionIt
> uint32_t Offset = StringOffsetSectionBase + Index * ItemSize;
> if (StringOffsetSection.Data.size() < Offset + ItemSize)
> return false;
> - DWARFDataExtractor DA(StringOffsetSection, isLittleEndian, 0);
> + DWARFDataExtractor DA(Context.getDWARFObj(), StringOffsetSection,
> + isLittleEndian, 0);
> Result = DA.getRelocatedValue(ItemSize, &Offset);
> return true;
> }
> @@ -141,8 +149,8 @@ bool DWARFUnit::extractRangeList(uint32_
> DWARFDebugRangeList &RangeList) const {
> // Require that compile unit is extracted.
> assert(!DieArray.empty());
> - DWARFDataExtractor RangesData(*RangeSection, isLittleEndian,
> - getAddressByteSize());
> + DWARFDataExtractor RangesData(Context.getDWARFObj(), *RangeSection,
> + isLittleEndian, getAddressByteSize());
> uint32_t ActualRangeListOffset = RangeSectionBase + RangeListOffset;
> return RangeList.extract(RangesData, &ActualRangeListOffset);
> }
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp?rev=308543&r1=308
> 542&r2=308543&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp Wed Jul 19 15:27:28
> 2017
> @@ -105,8 +105,9 @@ bool DWARFVerifier::verifyUnitContents(D
> bool DWARFVerifier::handleDebugInfo() {
> OS << "Verifying .debug_info Unit Header Chain...\n";
>
> - DWARFDataExtractor DebugInfoData(DCtx.getInfoSection(),
> DCtx.isLittleEndian(),
> - 0);
> + const DWARFObject &DObj = DCtx.getDWARFObj();
> + DWARFDataExtractor DebugInfoData(DObj, DObj.getInfoSection(),
> + DCtx.isLittleEndian(), 0);
> uint32_t NumDebugInfoErrors = 0;
> uint32_t OffsetStart = 0, Offset = 0, UnitIdx = 0;
> uint8_t UnitType = 0;
> @@ -127,10 +128,10 @@ bool DWARFVerifier::handleDebugInfo() {
> case dwarf::DW_UT_split_type: {
> DWARFUnitSection<DWARFTypeUnit> TUSection{};
> Unit.reset(new DWARFTypeUnit(
> - DCtx, DCtx.getInfoSection(), DCtx.getDebugAbbrev(),
> - &DCtx.getRangeSection(), DCtx.getStringSection(),
> - DCtx.getStringOffsetSection(), &DCtx.getAppleObjCSection(),
> - DCtx.getLineSection(), DCtx.isLittleEndian(), false,
> TUSection,
> + DCtx, DObj.getInfoSection(), DCtx.getDebugAbbrev(),
> + &DObj.getRangeSection(), DObj.getStringSection(),
> + DObj.getStringOffsetSection(), &DObj.getAppleObjCSection(),
> + DObj.getLineSection(), DCtx.isLittleEndian(), false,
> TUSection,
> nullptr));
> break;
> }
> @@ -143,10 +144,10 @@ bool DWARFVerifier::handleDebugInfo() {
> case 0: {
> DWARFUnitSection<DWARFCompileUnit> CUSection{};
> Unit.reset(new DWARFCompileUnit(
> - DCtx, DCtx.getInfoSection(), DCtx.getDebugAbbrev(),
> - &DCtx.getRangeSection(), DCtx.getStringSection(),
> - DCtx.getStringOffsetSection(), &DCtx.getAppleObjCSection(),
> - DCtx.getLineSection(), DCtx.isLittleEndian(), false,
> CUSection,
> + DCtx, DObj.getInfoSection(), DCtx.getDebugAbbrev(),
> + &DObj.getRangeSection(), DObj.getStringSection(),
> + DObj.getStringOffsetSection(), &DObj.getAppleObjCSection(),
> + DObj.getLineSection(), DCtx.isLittleEndian(), false,
> CUSection,
> nullptr));
> break;
> }
> @@ -169,13 +170,14 @@ bool DWARFVerifier::handleDebugInfo() {
>
> unsigned DWARFVerifier::verifyDebugInfoAttribute(const DWARFDie &Die,
> DWARFAttribute
> &AttrValue) {
> + const DWARFObject &DObj = DCtx.getDWARFObj();
> unsigned NumErrors = 0;
> const auto Attr = AttrValue.Attr;
> switch (Attr) {
> case DW_AT_ranges:
> // Make sure the offset in the DW_AT_ranges attribute is valid.
> if (auto SectionOffset = AttrValue.Value.getAsSectionOffset()) {
> - if (*SectionOffset >= DCtx.getRangeSection().Data.size()) {
> + if (*SectionOffset >= DObj.getRangeSection().Data.size()) {
> ++NumErrors;
> OS << "error: DW_AT_ranges offset is beyond .debug_ranges "
> "bounds:\n";
> @@ -192,7 +194,7 @@ unsigned DWARFVerifier::verifyDebugInfoA
> case DW_AT_stmt_list:
> // Make sure the offset in the DW_AT_stmt_list attribute is valid.
> if (auto SectionOffset = AttrValue.Value.getAsSectionOffset()) {
> - if (*SectionOffset >= DCtx.getLineSection().Data.size()) {
> + if (*SectionOffset >= DObj.getLineSection().Data.size()) {
> ++NumErrors;
> OS << "error: DW_AT_stmt_list offset is beyond .debug_line "
> "bounds: "
> @@ -216,6 +218,7 @@ unsigned DWARFVerifier::verifyDebugInfoA
>
> unsigned DWARFVerifier::verifyDebugInfoForm(const DWARFDie &Die,
> DWARFAttribute &AttrValue) {
> + const DWARFObject &DObj = DCtx.getDWARFObj();
> unsigned NumErrors = 0;
> const auto Form = AttrValue.Value.getForm();
> switch (Form) {
> @@ -253,7 +256,7 @@ unsigned DWARFVerifier::verifyDebugInfoF
> Optional<uint64_t> RefVal = AttrValue.Value.getAsReference();
> assert(RefVal);
> if (RefVal) {
> - if (*RefVal >= DCtx.getInfoSection().Data.size()) {
> + if (*RefVal >= DObj.getInfoSection().Data.size()) {
> ++NumErrors;
> OS << "error: DW_FORM_ref_addr offset beyond .debug_info "
> "bounds:\n";
> @@ -270,7 +273,7 @@ unsigned DWARFVerifier::verifyDebugInfoF
> case DW_FORM_strp: {
> auto SecOffset = AttrValue.Value.getAsSectionOffset();
> assert(SecOffset); // DW_FORM_strp is a section offset.
> - if (SecOffset && *SecOffset >= DCtx.getStringSection().size()) {
> + if (SecOffset && *SecOffset >= DObj.getStringSection().size()) {
> ++NumErrors;
> OS << "error: DW_FORM_strp offset beyond .debug_str bounds:\n";
> Die.dump(OS, 0);
> @@ -318,7 +321,7 @@ void DWARFVerifier::verifyDebugLineStmtO
> continue;
> const uint32_t LineTableOffset = *StmtSectionOffset;
> auto LineTable = DCtx.getLineTableForUnit(CU.get());
> - if (LineTableOffset < DCtx.getLineSection().Data.size()) {
> + if (LineTableOffset <
> DCtx.getDWARFObj().getLineSection().Data.size()) {
> if (!LineTable) {
> ++NumDebugLineErrors;
> OS << "error: .debug_line[" << format("0x%08" PRIx32,
> LineTableOffset)
> @@ -408,10 +411,10 @@ bool DWARFVerifier::handleDebugLine() {
>
> bool DWARFVerifier::handleAppleNames() {
> NumAppleNamesErrors = 0;
> -
> - DWARFDataExtractor AppleNamesSection(DCtx.getAppleNamesSection(),
> + const DWARFObject &D = DCtx.getDWARFObj();
> + DWARFDataExtractor AppleNamesSection(D, D.getAppleNamesSection(),
> DCtx.isLittleEndian(), 0);
> - DataExtractor StrData(DCtx.getStringSection(), DCtx.isLittleEndian(),
> 0);
> + DataExtractor StrData(D.getStringSection(), DCtx.isLittleEndian(), 0);
> DWARFAcceleratorTable AppleNames(AppleNamesSection, StrData);
>
> if (!AppleNames.extract()) {
>
> Modified: llvm/trunk/lib/DebugInfo/Symbolize/Symbolize.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/DebugInfo/Symbolize/Symbolize.cpp?rev=308543&r1=308
> 542&r2=308543&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/lib/DebugInfo/Symbolize/Symbolize.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/Symbolize/Symbolize.cpp Wed Jul 19 15:27:28
> 2017
> @@ -409,7 +409,7 @@ LLVMSymbolizer::getOrCreateModuleInfo(co
> }
> }
> if (!Context)
> - Context.reset(new DWARFContextInMemory(*Objects.second));
> + Context = DWARFContext::create(*Objects.second);
> assert(Context);
> auto InfoOrErr =
> SymbolizableObjectFile::create(Objects.first, std::move(Context));
>
> Modified: llvm/trunk/tools/dsymutil/DwarfLinker.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/tools/dsymutil/DwarfLinker.cpp?rev=308543&r1=308542&r2=
> 308543&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/tools/dsymutil/DwarfLinker.cpp (original)
> +++ llvm/trunk/tools/dsymutil/DwarfLinker.cpp Wed Jul 19 15:27:28 2017
> @@ -845,7 +845,7 @@ void DwarfStreamer::emitLocationsForUnit
> MS->SwitchSection(MC->getObjectFileInfo()->getDwarfLocSection());
>
> unsigned AddressSize = Unit.getOrigUnit().getAddressByteSize();
> - const DWARFSection &InputSec = Dwarf.getLocSection();
> + const DWARFSection &InputSec = Dwarf.getDWARFObj().getLocSection();
> DataExtractor Data(InputSec.Data, Dwarf.isLittleEndian(), AddressSize);
> DWARFUnit &OrigUnit = Unit.getOrigUnit();
> auto OrigUnitDie = OrigUnit.getUnitDIE(false);
> @@ -1301,7 +1301,7 @@ private:
> /// Construct the output DIE tree by cloning the DIEs we
> /// chose to keep above. If there are no valid relocs, then there's
> /// nothing to clone/emit.
> - void cloneAllCompileUnits(DWARFContextInMemory &DwarfContext);
> + void cloneAllCompileUnits(DWARFContext &DwarfContext);
>
> private:
> typedef DWARFAbbreviationDeclaration::AttributeSpec AttributeSpec;
> @@ -2873,7 +2873,8 @@ void DwarfLinker::patchRangesForUnit(con
> DWARFDebugRangeList RangeList;
> const auto &FunctionRanges = Unit.getFunctionRanges();
> unsigned AddressSize = Unit.getOrigUnit().getAddressByteSize();
> - DWARFDataExtractor RangeExtractor(OrigDwarf.getRangeSection(),
> + DWARFDataExtractor RangeExtractor(OrigDwarf.getDWARFObj(),
> +
> OrigDwarf.getDWARFObj().getRangeSection(),
> OrigDwarf.isLittleEndian(),
> AddressSize);
> auto InvalidRange = FunctionRanges.end(), CurrRange = InvalidRange;
> DWARFUnit &OrigUnit = Unit.getOrigUnit();
> @@ -2984,9 +2985,9 @@ void DwarfLinker::patchLineTableForUnit(
> // Parse the original line info for the unit.
> DWARFDebugLine::LineTable LineTable;
> uint32_t StmtOffset = *StmtList;
> - DWARFDataExtractor LineExtractor(OrigDwarf.getLineSection(),
> - OrigDwarf.isLittleEndian(),
> -
> Unit.getOrigUnit().getAddressByteSize());
> + DWARFDataExtractor LineExtractor(
> + OrigDwarf.getDWARFObj(), OrigDwarf.getDWARFObj().getLineSection(),
> + OrigDwarf.isLittleEndian(),
> Unit.getOrigUnit().getAddressByteSize());
> LineTable.parse(LineExtractor, &StmtOffset);
>
> // This vector is the output line table.
> @@ -3086,7 +3087,7 @@ void DwarfLinker::patchLineTableForUnit(
> LineTable.Prologue.OpcodeBase > 13)
> reportWarning("line table parameters mismatch. Cannot emit.");
> else {
> - StringRef LineData = OrigDwarf.getLineSection().Data;
> + StringRef LineData = OrigDwarf.getDWARFObj().getLineSection().Data;
> MCDwarfLineTableParams Params;
> Params.DWARF2LineOpcodeBase = LineTable.Prologue.OpcodeBase;
> Params.DWARF2LineBase = LineTable.Prologue.LineBase;
> @@ -3112,7 +3113,7 @@ void DwarfLinker::emitAcceleratorEntries
> void DwarfLinker::patchFrameInfoForObject(const DebugMapObject &DMO,
> DWARFContext &OrigDwarf,
> unsigned AddrSize) {
> - StringRef FrameData = OrigDwarf.getDebugFrameSection();
> + StringRef FrameData = OrigDwarf.getDWARFObj().getDebugFrameSection();
> if (FrameData.empty())
> return;
>
> @@ -3323,9 +3324,9 @@ void DwarfLinker::loadClangModule(String
> std::unique_ptr<CompileUnit> Unit;
>
> // Setup access to the debug info.
> - DWARFContextInMemory DwarfContext(*ErrOrObj);
> + auto DwarfContext = DWARFContext::create(*ErrOrObj);
> RelocationManager RelocMgr(*this);
> - for (const auto &CU : DwarfContext.compile_units()) {
> + for (const auto &CU : DwarfContext->compile_units()) {
> auto CUDie = CU->getUnitDIE(false);
> // Recursively get all modules imported by this one.
> if (!registerModuleReference(CUDie, *CU, ModuleMap, Indent)) {
> @@ -3365,11 +3366,10 @@ void DwarfLinker::loadClangModule(String
> std::vector<std::unique_ptr<CompileUnit>> CompileUnits;
> CompileUnits.push_back(std::move(Unit));
> DIECloner(*this, RelocMgr, DIEAlloc, CompileUnits, Options)
> - .cloneAllCompileUnits(DwarfContext);
> + .cloneAllCompileUnits(*DwarfContext);
> }
>
> -void DwarfLinker::DIECloner::cloneAllCompileUnits(
> - DWARFContextInMemory &DwarfContext) {
> +void DwarfLinker::DIECloner::cloneAllCompileUnits(DWARFContext
> &DwarfContext) {
> if (!Linker.Streamer)
> return;
>
> @@ -3438,11 +3438,11 @@ bool DwarfLinker::link(const DebugMap &M
> }
>
> // Setup access to the debug info.
> - DWARFContextInMemory DwarfContext(*ErrOrObj);
> - startDebugObject(DwarfContext, *Obj);
> + auto DwarfContext = DWARFContext::create(*ErrOrObj);
> + startDebugObject(*DwarfContext, *Obj);
>
> // In a first phase, just read in the debug info and load all clang
> modules.
> - for (const auto &CU : DwarfContext.compile_units()) {
> + for (const auto &CU : DwarfContext->compile_units()) {
> auto CUDie = CU->getUnitDIE(false);
> if (Options.Verbose) {
> outs() << "Input compilation unit:";
> @@ -3476,9 +3476,9 @@ bool DwarfLinker::link(const DebugMap &M
> RelocMgr.resetValidRelocs();
> if (RelocMgr.hasValidRelocs())
> DIECloner(*this, RelocMgr, DIEAlloc, Units, Options)
> - .cloneAllCompileUnits(DwarfContext);
> + .cloneAllCompileUnits(*DwarfContext);
> if (!Options.NoOutput && !Units.empty())
> - patchFrameInfoForObject(*Obj, DwarfContext,
> + patchFrameInfoForObject(*Obj, *DwarfContext,
> Units[0]-
> >getOrigUnit().getAddressByteSize());
>
> // Clean-up before starting working on the next object.
>
> Modified: llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-
> dwarfdump/llvm-dwarfdump.cpp?rev=308543&r1=308542&r2=308543&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp (original)
> +++ llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp Wed Jul 19 15:27:28
> 2017
> @@ -94,7 +94,7 @@ static void error(StringRef Filename, st
> }
>
> static void DumpObjectFile(ObjectFile &Obj, Twine Filename) {
> - std::unique_ptr<DIContext> DICtx(new DWARFContextInMemory(Obj));
> + std::unique_ptr<DIContext> DICtx = DWARFContext::create(Obj);
>
> outs() << Filename.str() << ":\tfile format " <<
> Obj.getFileFormatName()
> << "\n\n";
> @@ -131,8 +131,8 @@ static void DumpInput(StringRef Filename
> }
>
> static bool VerifyObjectFile(ObjectFile &Obj, Twine Filename) {
> - std::unique_ptr<DIContext> DICtx(new DWARFContextInMemory(Obj));
> -
> + std::unique_ptr<DIContext> DICtx = DWARFContext::create(Obj);
> +
> // Verify the DWARF and exit with non-zero exit status if verification
> // fails.
> raw_ostream &stream = Quiet ? nulls() : outs();
>
> Modified: llvm/trunk/tools/llvm-objdump/MachODump.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-
> objdump/MachODump.cpp?rev=308543&r1=308542&r2=308543&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/tools/llvm-objdump/MachODump.cpp (original)
> +++ llvm/trunk/tools/llvm-objdump/MachODump.cpp Wed Jul 19 15:27:28 2017
> @@ -1275,7 +1275,7 @@ static void ProcessMachO(StringRef Name,
> printWeakBindTable(MachOOF);
>
> if (DwarfDumpType != DIDT_Null) {
> - std::unique_ptr<DIContext> DICtx(new DWARFContextInMemory(*MachOOF));
> + std::unique_ptr<DIContext> DICtx = DWARFContext::create(*MachOOF);
> // Dump the complete DWARF structure.
> DIDumpOptions DumpOpts;
> DumpOpts.DumpType = DwarfDumpType;
> @@ -6594,7 +6594,7 @@ static void DisassembleMachO(StringRef F
> }
>
> // Setup the DIContext
> - diContext.reset(new DWARFContextInMemory(*DbgObj));
> + diContext = DWARFContext::create(*DbgObj);
> }
>
> if (FilterSections.size() == 0)
>
> Modified: llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-
> objdump/llvm-objdump.cpp?rev=308543&r1=308542&r2=308543&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp (original)
> +++ llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp Wed Jul 19 15:27:28
> 2017
> @@ -62,8 +62,8 @@
> #include <cctype>
> #include <cstring>
> #include <system_error>
> -#include <utility>
> #include <unordered_map>
> +#include <utility>
>
> using namespace llvm;
> using namespace object;
> @@ -2081,7 +2081,7 @@ static void DumpObject(ObjectFile *o, co
> if (PrintFaultMaps)
> printFaultMaps(o);
> if (DwarfDumpType != DIDT_Null) {
> - std::unique_ptr<DIContext> DICtx(new DWARFContextInMemory(*o));
> + std::unique_ptr<DIContext> DICtx = DWARFContext::create(*o);
> // Dump the complete DWARF structure.
> DIDumpOptions DumpOpts;
> DumpOpts.DumpType = DwarfDumpType;
>
> Modified: llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-
> rtdyld/llvm-rtdyld.cpp?rev=308543&r1=308542&r2=308543&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp (original)
> +++ llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp Wed Jul 19 15:27:28 2017
> @@ -324,8 +324,8 @@ static int printLineInfoForInput(bool Lo
> }
> }
>
> - std::unique_ptr<DIContext> Context(
> - new DWARFContextInMemory(*SymbolObj,LoadedObjInfo.get()));
> + std::unique_ptr<DIContext> Context =
> + DWARFContext::create(*SymbolObj, LoadedObjInfo.get());
>
> std::vector<std::pair<SymbolRef, uint64_t>> SymAddr =
> object::computeSymbolSizes(*SymbolObj);
>
> Modified: llvm/trunk/tools/obj2yaml/dwarf2yaml.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/tools/obj2yaml/dwarf2yaml.cpp?rev=308543&r1=308542&r2=3
> 08543&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/tools/obj2yaml/dwarf2yaml.cpp (original)
> +++ llvm/trunk/tools/obj2yaml/dwarf2yaml.cpp Wed Jul 19 15:27:28 2017
> @@ -24,7 +24,7 @@ void dumpInitialLength(DataExtractor &Da
> InitialLength.TotalLength64 = Data.getU64(&Offset);
> }
>
> -void dumpDebugAbbrev(DWARFContextInMemory &DCtx, DWARFYAML::Data &Y) {
> +void dumpDebugAbbrev(DWARFContext &DCtx, DWARFYAML::Data &Y) {
> auto AbbrevSetPtr = DCtx.getDebugAbbrev();
> if (AbbrevSetPtr) {
> for (auto AbbrvDeclSet : *AbbrevSetPtr) {
> @@ -48,8 +48,8 @@ void dumpDebugAbbrev(DWARFContextInMemor
> }
> }
>
> -void dumpDebugStrings(DWARFContextInMemory &DCtx, DWARFYAML::Data &Y) {
> - StringRef RemainingTable = DCtx.getStringSection();
> +void dumpDebugStrings(DWARFContext &DCtx, DWARFYAML::Data &Y) {
> + StringRef RemainingTable = DCtx.getDWARFObj().getStringSection();
> while (RemainingTable.size() > 0) {
> auto SymbolPair = RemainingTable.split('\0');
> RemainingTable = SymbolPair.second;
> @@ -57,8 +57,9 @@ void dumpDebugStrings(DWARFContextInMemo
> }
> }
>
> -void dumpDebugARanges(DWARFContextInMemory &DCtx, DWARFYAML::Data &Y) {
> - DataExtractor ArangesData(DCtx.getARangeSection(),
> DCtx.isLittleEndian(), 0);
> +void dumpDebugARanges(DWARFContext &DCtx, DWARFYAML::Data &Y) {
> + DataExtractor ArangesData(DCtx.getDWARFObj().getARangeSection(),
> + DCtx.isLittleEndian(), 0);
> uint32_t Offset = 0;
> DWARFDebugArangeSet Set;
>
> @@ -79,7 +80,7 @@ void dumpDebugARanges(DWARFContextInMemo
> }
> }
>
> -void dumpPubSection(DWARFContextInMemory &DCtx, DWARFYAML::PubSection &Y,
> +void dumpPubSection(DWARFContext &DCtx, DWARFYAML::PubSection &Y,
> StringRef Section) {
> DataExtractor PubSectionData(Section, DCtx.isLittleEndian(), 0);
> uint32_t Offset = 0;
> @@ -97,21 +98,22 @@ void dumpPubSection(DWARFContextInMemory
> }
> }
>
> -void dumpDebugPubSections(DWARFContextInMemory &DCtx, DWARFYAML::Data &Y)
> {
> +void dumpDebugPubSections(DWARFContext &DCtx, DWARFYAML::Data &Y) {
> + const DWARFObject &D = DCtx.getDWARFObj();
> Y.PubNames.IsGNUStyle = false;
> - dumpPubSection(DCtx, Y.PubNames, DCtx.getPubNamesSection());
> + dumpPubSection(DCtx, Y.PubNames, D.getPubNamesSection());
>
> Y.PubTypes.IsGNUStyle = false;
> - dumpPubSection(DCtx, Y.PubTypes, DCtx.getPubTypesSection());
> + dumpPubSection(DCtx, Y.PubTypes, D.getPubTypesSection());
>
> Y.GNUPubNames.IsGNUStyle = true;
> - dumpPubSection(DCtx, Y.GNUPubNames, DCtx.getGnuPubNamesSection());
> + dumpPubSection(DCtx, Y.GNUPubNames, D.getGnuPubNamesSection());
>
> Y.GNUPubTypes.IsGNUStyle = true;
> - dumpPubSection(DCtx, Y.GNUPubTypes, DCtx.getGnuPubTypesSection());
> + dumpPubSection(DCtx, Y.GNUPubTypes, D.getGnuPubTypesSection());
> }
>
> -void dumpDebugInfo(DWARFContextInMemory &DCtx, DWARFYAML::Data &Y) {
> +void dumpDebugInfo(DWARFContext &DCtx, DWARFYAML::Data &Y) {
> for (const auto &CU : DCtx.compile_units()) {
> DWARFYAML::Unit NewUnit;
> NewUnit.Length.setLength(CU->getLength());
> @@ -235,7 +237,7 @@ bool dumpFileEntry(DataExtractor &Data,
> return true;
> }
>
> -void dumpDebugLines(DWARFContextInMemory &DCtx, DWARFYAML::Data &Y) {
> +void dumpDebugLines(DWARFContext &DCtx, DWARFYAML::Data &Y) {
> for (const auto &CU : DCtx.compile_units()) {
> auto CUDIE = CU->getUnitDIE();
> if (!CUDIE)
> @@ -243,8 +245,8 @@ void dumpDebugLines(DWARFContextInMemory
> if (auto StmtOffset =
> dwarf::toSectionOffset(CUDIE.find(dwarf::DW_AT_stmt_list))) {
> DWARFYAML::LineTable DebugLines;
> - DataExtractor LineData(DCtx.getLineSection().Data,
> DCtx.isLittleEndian(),
> - CU->getAddressByteSize());
> + DataExtractor LineData(DCtx.getDWARFObj().getLineSection().Data,
> + DCtx.isLittleEndian(), CU-
> >getAddressByteSize());
> uint32_t Offset = *StmtOffset;
> dumpInitialLength(LineData, Offset, DebugLines.Length);
> uint64_t LineTableLength = DebugLines.Length.getLength();
> @@ -344,7 +346,7 @@ void dumpDebugLines(DWARFContextInMemory
> }
> }
>
> -std::error_code dwarf2yaml(DWARFContextInMemory &DCtx, DWARFYAML::Data
> &Y) {
> +std::error_code dwarf2yaml(DWARFContext &DCtx, DWARFYAML::Data &Y) {
> dumpDebugAbbrev(DCtx, Y);
> dumpDebugStrings(DCtx, Y);
> dumpDebugARanges(DCtx, Y);
>
> Modified: llvm/trunk/tools/obj2yaml/macho2yaml.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/tools/obj2yaml/macho2yaml.cpp?rev=308543&r1=308542&r2=3
> 08543&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/tools/obj2yaml/macho2yaml.cpp (original)
> +++ llvm/trunk/tools/obj2yaml/macho2yaml.cpp Wed Jul 19 15:27:28 2017
> @@ -35,9 +35,9 @@ class MachODumper {
> ArrayRef<uint8_t> OpcodeBuffer, bool Lazy =
> false);
> void dumpExportTrie(std::unique_ptr<MachOYAML::Object> &Y);
> void dumpSymbols(std::unique_ptr<MachOYAML::Object> &Y);
> - void dumpDebugAbbrev(DWARFContextInMemory &DCtx,
> + void dumpDebugAbbrev(DWARFContext &DCtx,
> std::unique_ptr<MachOYAML::Object> &Y);
> - void dumpDebugStrings(DWARFContextInMemory &DCtx,
> + void dumpDebugStrings(DWARFContext &DCtx,
> std::unique_ptr<MachOYAML::Object> &Y);
>
> public:
> @@ -187,8 +187,8 @@ Expected<std::unique_ptr<MachOYAML::Obje
> dumpLoadCommands(Y);
> dumpLinkEdit(Y);
>
> - DWARFContextInMemory DICtx(Obj);
> - if (auto Err = dwarf2yaml(DICtx, Y->DWARF))
> + std::unique_ptr<DWARFContext> DICtx = DWARFContext::create(Obj);
> + if (auto Err = dwarf2yaml(*DICtx, Y->DWARF))
> return errorCodeToError(Err);
> return std::move(Y);
> }
>
> Modified: llvm/trunk/tools/obj2yaml/obj2yaml.h
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/tools/obj2yaml/obj2yaml.h?rev=308543&r1=308542&r2=30854
> 3&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/tools/obj2yaml/obj2yaml.h (original)
> +++ llvm/trunk/tools/obj2yaml/obj2yaml.h Wed Jul 19 15:27:28 2017
> @@ -29,13 +29,12 @@ std::error_code wasm2yaml(llvm::raw_ostr
>
> // Forward decls for dwarf2yaml
> namespace llvm {
> -class DWARFContextInMemory;
> +class DWARFContext;
> namespace DWARFYAML {
> struct Data;
> }
> }
>
> -std::error_code dwarf2yaml(llvm::DWARFContextInMemory &DCtx,
> - llvm::DWARFYAML::Data &Y);
> +std::error_code dwarf2yaml(llvm::DWARFContext &DCtx,
> llvm::DWARFYAML::Data &Y);
>
> #endif
>
> Modified: llvm/trunk/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp?rev=30
> 8543&r1=308542&r2=308543&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp (original)
> +++ llvm/trunk/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp Wed Jul 19
> 15:27:28 2017
> @@ -14,8 +14,8 @@
> #include "llvm/ADT/StringRef.h"
> #include "llvm/ADT/Triple.h"
> #include "llvm/BinaryFormat/Dwarf.h"
> -#include "llvm/Config/llvm-config.h"
> #include "llvm/CodeGen/AsmPrinter.h"
> +#include "llvm/Config/llvm-config.h"
> #include "llvm/DebugInfo/DWARF/DWARFCompileUnit.h"
> #include "llvm/DebugInfo/DWARF/DWARFContext.h"
> #include "llvm/DebugInfo/DWARF/DWARFDie.h"
> @@ -28,8 +28,8 @@
> #include "llvm/ObjectYAML/DWARFYAML.h"
> #include "llvm/Support/Error.h"
> #include "llvm/Support/MemoryBuffer.h"
> -#include "llvm/Support/TargetSelect.h"
> #include "llvm/Support/TargetRegistry.h"
> +#include "llvm/Support/TargetSelect.h"
> #include "llvm/Testing/Support/Error.h"
> #include "gtest/gtest.h"
> #include <climits>
> @@ -228,10 +228,10 @@ void TestAllForms() {
> MemoryBufferRef FileBuffer(FileBytes, "dwarf");
> auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
> EXPECT_TRUE((bool)Obj);
> - DWARFContextInMemory DwarfContext(*Obj.get());
> - uint32_t NumCUs = DwarfContext.getNumCompileUnits();
> + std::unique_ptr<DWARFContext> DwarfContext =
> DWARFContext::create(**Obj);
> + uint32_t NumCUs = DwarfContext->getNumCompileUnits();
> EXPECT_EQ(NumCUs, 1u);
> - DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
> + DWARFCompileUnit *U = DwarfContext->getCompileUnitAtIndex(0);
> auto DieDG = U->getUnitDIE(false);
> EXPECT_TRUE(DieDG.isValid());
>
> @@ -458,12 +458,12 @@ template <uint16_t Version, class AddrTy
> MemoryBufferRef FileBuffer(FileBytes, "dwarf");
> auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
> EXPECT_TRUE((bool)Obj);
> - DWARFContextInMemory DwarfContext(*Obj.get());
> + std::unique_ptr<DWARFContext> DwarfContext =
> DWARFContext::create(**Obj);
>
> // Verify the number of compile units is correct.
> - uint32_t NumCUs = DwarfContext.getNumCompileUnits();
> + uint32_t NumCUs = DwarfContext->getNumCompileUnits();
> EXPECT_EQ(NumCUs, 1u);
> - DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
> + DWARFCompileUnit *U = DwarfContext->getCompileUnitAtIndex(0);
>
> // Get the compile unit DIE is valid.
> auto DieDG = U->getUnitDIE(false);
> @@ -629,13 +629,13 @@ template <uint16_t Version, class AddrTy
> MemoryBufferRef FileBuffer(FileBytes, "dwarf");
> auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
> EXPECT_TRUE((bool)Obj);
> - DWARFContextInMemory DwarfContext(*Obj.get());
> + std::unique_ptr<DWARFContext> DwarfContext =
> DWARFContext::create(**Obj);
>
> // Verify the number of compile units is correct.
> - uint32_t NumCUs = DwarfContext.getNumCompileUnits();
> + uint32_t NumCUs = DwarfContext->getNumCompileUnits();
> EXPECT_EQ(NumCUs, 2u);
> - DWARFCompileUnit *U1 = DwarfContext.getCompileUnitAtIndex(0);
> - DWARFCompileUnit *U2 = DwarfContext.getCompileUnitAtIndex(1);
> + DWARFCompileUnit *U1 = DwarfContext->getCompileUnitAtIndex(0);
> + DWARFCompileUnit *U2 = DwarfContext->getCompileUnitAtIndex(1);
>
> // Get the compile unit DIE is valid.
> auto Unit1DieDG = U1->getUnitDIE(false);
> @@ -837,12 +837,12 @@ template <uint16_t Version, class AddrTy
> MemoryBufferRef FileBuffer(FileBytes, "dwarf");
> auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
> EXPECT_TRUE((bool)Obj);
> - DWARFContextInMemory DwarfContext(*Obj.get());
> + std::unique_ptr<DWARFContext> DwarfContext =
> DWARFContext::create(**Obj);
>
> // Verify the number of compile units is correct.
> - uint32_t NumCUs = DwarfContext.getNumCompileUnits();
> + uint32_t NumCUs = DwarfContext->getNumCompileUnits();
> EXPECT_EQ(NumCUs, 1u);
> - DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
> + DWARFCompileUnit *U = DwarfContext->getCompileUnitAtIndex(0);
>
> // Get the compile unit DIE is valid.
> auto DieDG = U->getUnitDIE(false);
> @@ -1012,12 +1012,12 @@ TEST(DWARFDebugInfo, TestRelations) {
> MemoryBufferRef FileBuffer(DG->generate(), "dwarf");
> auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
> EXPECT_TRUE((bool)Obj);
> - DWARFContextInMemory DwarfContext(*Obj.get());
> + std::unique_ptr<DWARFContext> DwarfContext =
> DWARFContext::create(**Obj);
>
> // Verify the number of compile units is correct.
> - uint32_t NumCUs = DwarfContext.getNumCompileUnits();
> + uint32_t NumCUs = DwarfContext->getNumCompileUnits();
> EXPECT_EQ(NumCUs, 1u);
> - DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
> + DWARFCompileUnit *U = DwarfContext->getCompileUnitAtIndex(0);
>
> // Get the compile unit DIE is valid.
> auto CUDie = U->getUnitDIE(false);
> @@ -1127,12 +1127,12 @@ TEST(DWARFDebugInfo, TestChildIterators)
> MemoryBufferRef FileBuffer(DG->generate(), "dwarf");
> auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
> EXPECT_TRUE((bool)Obj);
> - DWARFContextInMemory DwarfContext(*Obj.get());
> + std::unique_ptr<DWARFContext> DwarfContext =
> DWARFContext::create(**Obj);
>
> // Verify the number of compile units is correct.
> - uint32_t NumCUs = DwarfContext.getNumCompileUnits();
> + uint32_t NumCUs = DwarfContext->getNumCompileUnits();
> EXPECT_EQ(NumCUs, 1u);
> - DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
> + DWARFCompileUnit *U = DwarfContext->getCompileUnitAtIndex(0);
>
> // Get the compile unit DIE is valid.
> auto CUDie = U->getUnitDIE(false);
> @@ -1188,12 +1188,13 @@ TEST(DWARFDebugInfo, TestEmptyChildren)
>
> auto ErrOrSections = DWARFYAML::EmitDebugSections(StringRef(yamldata));
> ASSERT_TRUE((bool)ErrOrSections);
> - DWARFContextInMemory DwarfContext(*ErrOrSections, 8);
> + std::unique_ptr<DWARFContext> DwarfContext =
> + DWARFContext::create(*ErrOrSections, 8);
>
> // Verify the number of compile units is correct.
> - uint32_t NumCUs = DwarfContext.getNumCompileUnits();
> + uint32_t NumCUs = DwarfContext->getNumCompileUnits();
> EXPECT_EQ(NumCUs, 1u);
> - DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
> + DWARFCompileUnit *U = DwarfContext->getCompileUnitAtIndex(0);
>
> // Get the compile unit DIE is valid.
> auto CUDie = U->getUnitDIE(false);
> @@ -1235,12 +1236,12 @@ TEST(DWARFDebugInfo, TestAttributeIterat
> MemoryBufferRef FileBuffer(DG->generate(), "dwarf");
> auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
> EXPECT_TRUE((bool)Obj);
> - DWARFContextInMemory DwarfContext(*Obj.get());
> + std::unique_ptr<DWARFContext> DwarfContext =
> DWARFContext::create(**Obj);
>
> // Verify the number of compile units is correct.
> - uint32_t NumCUs = DwarfContext.getNumCompileUnits();
> + uint32_t NumCUs = DwarfContext->getNumCompileUnits();
> EXPECT_EQ(NumCUs, 1u);
> - DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
> + DWARFCompileUnit *U = DwarfContext->getCompileUnitAtIndex(0);
>
> // Get the compile unit DIE is valid.
> auto CUDie = U->getUnitDIE(false);
> @@ -1299,12 +1300,12 @@ TEST(DWARFDebugInfo, TestFindRecurse) {
> MemoryBufferRef FileBuffer(DG->generate(), "dwarf");
> auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
> EXPECT_TRUE((bool)Obj);
> - DWARFContextInMemory DwarfContext(*Obj.get());
> + std::unique_ptr<DWARFContext> DwarfContext =
> DWARFContext::create(**Obj);
>
> // Verify the number of compile units is correct.
> - uint32_t NumCUs = DwarfContext.getNumCompileUnits();
> + uint32_t NumCUs = DwarfContext->getNumCompileUnits();
> EXPECT_EQ(NumCUs, 1u);
> - DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
> + DWARFCompileUnit *U = DwarfContext->getCompileUnitAtIndex(0);
>
> // Get the compile unit DIE is valid.
> auto CUDie = U->getUnitDIE(false);
> @@ -1505,12 +1506,12 @@ TEST(DWARFDebugInfo, TestFindAttrs) {
> MemoryBufferRef FileBuffer(DG->generate(), "dwarf");
> auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
> EXPECT_TRUE((bool)Obj);
> - DWARFContextInMemory DwarfContext(*Obj.get());
> + std::unique_ptr<DWARFContext> DwarfContext =
> DWARFContext::create(**Obj);
>
> // Verify the number of compile units is correct.
> - uint32_t NumCUs = DwarfContext.getNumCompileUnits();
> + uint32_t NumCUs = DwarfContext->getNumCompileUnits();
> EXPECT_EQ(NumCUs, 1u);
> - DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
> + DWARFCompileUnit *U = DwarfContext->getCompileUnitAtIndex(0);
>
> // Get the compile unit DIE is valid.
> auto CUDie = U->getUnitDIE(false);
> @@ -1568,8 +1569,8 @@ TEST(DWARFDebugInfo, TestImplicitConstAb
> MemoryBufferRef FileBuffer(DG->generate(), "dwarf");
> auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
> EXPECT_TRUE((bool)Obj);
> - DWARFContextInMemory DwarfContext(*Obj.get());
> - DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
> + std::unique_ptr<DWARFContext> DwarfContext =
> DWARFContext::create(**Obj);
> + DWARFCompileUnit *U = DwarfContext->getCompileUnitAtIndex(0);
> EXPECT_TRUE((bool)U);
>
> const auto *Abbrevs = U->getAbbreviations();
> @@ -1708,10 +1709,11 @@ TEST(DWARFDebugInfo, TestDwarfVerifyInva
> )";
> auto ErrOrSections = DWARFYAML::EmitDebugSections(StringRef(yamldata));
> ASSERT_TRUE((bool)ErrOrSections);
> - DWARFContextInMemory DwarfContext(*ErrOrSections, 8);
> - VerifyError(DwarfContext, "error: DW_FORM_ref4 CU offset 0x00001234 is
> "
> - "invalid (must be less than CU size of "
> - "0x0000001a):");
> + std::unique_ptr<DWARFContext> DwarfContext =
> + DWARFContext::create(*ErrOrSections, 8);
> + VerifyError(*DwarfContext, "error: DW_FORM_ref4 CU offset 0x00001234 is
> "
> + "invalid (must be less than CU size of "
> + "0x0000001a):");
> }
>
> TEST(DWARFDebugInfo, TestDwarfVerifyInvalidRefAddr) {
> @@ -1756,8 +1758,9 @@ TEST(DWARFDebugInfo, TestDwarfVerifyInva
> )";
> auto ErrOrSections = DWARFYAML::EmitDebugSections(StringRef(yamldata));
> ASSERT_TRUE((bool)ErrOrSections);
> - DWARFContextInMemory DwarfContext(*ErrOrSections, 8);
> - VerifyError(DwarfContext,
> + std::unique_ptr<DWARFContext> DwarfContext =
> + DWARFContext::create(*ErrOrSections, 8);
> + VerifyError(*DwarfContext,
> "error: DW_FORM_ref_addr offset beyond .debug_info
> bounds:");
> }
>
> @@ -1792,8 +1795,9 @@ TEST(DWARFDebugInfo, TestDwarfVerifyInva
> )";
> auto ErrOrSections = DWARFYAML::EmitDebugSections(StringRef(yamldata));
> ASSERT_TRUE((bool)ErrOrSections);
> - DWARFContextInMemory DwarfContext(*ErrOrSections, 8);
> - VerifyError(DwarfContext,
> + std::unique_ptr<DWARFContext> DwarfContext =
> + DWARFContext::create(*ErrOrSections, 8);
> + VerifyError(*DwarfContext,
> "error: DW_AT_ranges offset is beyond .debug_ranges
> bounds:");
> }
>
> @@ -1828,9 +1832,10 @@ TEST(DWARFDebugInfo, TestDwarfVerifyInva
> )";
> auto ErrOrSections = DWARFYAML::EmitDebugSections(StringRef(yamldata));
> ASSERT_TRUE((bool)ErrOrSections);
> - DWARFContextInMemory DwarfContext(*ErrOrSections, 8);
> + std::unique_ptr<DWARFContext> DwarfContext =
> + DWARFContext::create(*ErrOrSections, 8);
> VerifyError(
> - DwarfContext,
> + *DwarfContext,
> "error: DW_AT_stmt_list offset is beyond .debug_line bounds:
> 0x00001000");
> }
>
> @@ -1860,8 +1865,9 @@ TEST(DWARFDebugInfo, TestDwarfVerifyInva
> )";
> auto ErrOrSections = DWARFYAML::EmitDebugSections(StringRef(yamldata));
> ASSERT_TRUE((bool)ErrOrSections);
> - DWARFContextInMemory DwarfContext(*ErrOrSections, 8);
> - VerifyError(DwarfContext,
> + std::unique_ptr<DWARFContext> DwarfContext =
> + DWARFContext::create(*ErrOrSections, 8);
> + VerifyError(*DwarfContext,
> "error: DW_FORM_strp offset beyond .debug_str bounds:");
> }
>
> @@ -1907,9 +1913,10 @@ TEST(DWARFDebugInfo, TestDwarfVerifyInva
> )";
> auto ErrOrSections = DWARFYAML::EmitDebugSections(StringRef(yamldata));
> ASSERT_TRUE((bool)ErrOrSections);
> - DWARFContextInMemory DwarfContext(*ErrOrSections, 8);
> + std::unique_ptr<DWARFContext> DwarfContext =
> + DWARFContext::create(*ErrOrSections, 8);
> VerifyError(
> - DwarfContext,
> + *DwarfContext,
> "error: invalid DIE reference 0x00000011. Offset is in between
> DIEs:");
> }
>
> @@ -1977,9 +1984,10 @@ TEST(DWARFDebugInfo, TestDwarfVerifyInva
> )";
> auto ErrOrSections = DWARFYAML::EmitDebugSections(yamldata);
> ASSERT_TRUE((bool)ErrOrSections);
> - DWARFContextInMemory DwarfContext(*ErrOrSections, 8);
> - VerifyError(DwarfContext, "error: .debug_line[0x00000000] row[1]
> decreases "
> - "in address from previous row:");
> + std::unique_ptr<DWARFContext> DwarfContext =
> + DWARFContext::create(*ErrOrSections, 8);
> + VerifyError(*DwarfContext, "error: .debug_line[0x00000000] row[1]
> decreases "
> + "in address from previous row:");
> }
>
> TEST(DWARFDebugInfo, TestDwarfVerifyInvalidLineFileIndex) {
> @@ -2048,9 +2056,10 @@ TEST(DWARFDebugInfo, TestDwarfVerifyInva
> )";
> auto ErrOrSections = DWARFYAML::EmitDebugSections(yamldata);
> ASSERT_TRUE((bool)ErrOrSections);
> - DWARFContextInMemory DwarfContext(*ErrOrSections, 8);
> - VerifyError(DwarfContext, "error: .debug_line[0x00000000][1] has
> invalid "
> - "file index 5 (valid values are [1,1]):");
> + std::unique_ptr<DWARFContext> DwarfContext =
> + DWARFContext::create(*ErrOrSections, 8);
> + VerifyError(*DwarfContext, "error: .debug_line[0x00000000][1] has
> invalid "
> + "file index 5 (valid values are [1,1]):");
> }
>
> TEST(DWARFDebugInfo, TestDwarfVerifyCUDontShareLineTable) {
> @@ -2128,10 +2137,12 @@ TEST(DWARFDebugInfo, TestDwarfVerifyCUDo
> )";
> auto ErrOrSections = DWARFYAML::EmitDebugSections(yamldata);
> ASSERT_TRUE((bool)ErrOrSections);
> - DWARFContextInMemory DwarfContext(*ErrOrSections, 8);
> - VerifyError(DwarfContext, "error: two compile unit DIEs, 0x0000000b and
> "
> - "0x0000001f, have the same DW_AT_stmt_list
> section "
> - "offset:");
> + std::unique_ptr<DWARFContext> DwarfContext =
> + DWARFContext::create(*ErrOrSections, 8);
> + VerifyError(*DwarfContext,
> + "error: two compile unit DIEs, 0x0000000b and "
> + "0x0000001f, have the same DW_AT_stmt_list section "
> + "offset:");
> }
>
> TEST(DWARFDebugInfo, TestErrorReportingPolicy) {
> @@ -2161,20 +2172,22 @@ TEST(DWARFDebugInfo, TestErrorReportingP
> // DWARFContextInMemory
> // to parse whole file and find both two errors we know about.
> int Errors = 0;
> - DWARFContextInMemory Ctx1(*Obj.get(), nullptr, [&](Error E) {
> - ++Errors;
> - consumeError(std::move(E));
> - return ErrorPolicy::Continue;
> - });
> + std::unique_ptr<DWARFContext> Ctx1 =
> + DWARFContext::create(**Obj, nullptr, [&](Error E) {
> + ++Errors;
> + consumeError(std::move(E));
> + return ErrorPolicy::Continue;
> + });
> EXPECT_TRUE(Errors == 2);
>
> // Case 2: error handler stops parsing of object after first error.
> Errors = 0;
> - DWARFContextInMemory Ctx2(*Obj.get(), nullptr, [&](Error E) {
> - ++Errors;
> - consumeError(std::move(E));
> - return ErrorPolicy::Halt;
> - });
> + std::unique_ptr<DWARFContext> Ctx2 =
> + DWARFContext::create(**Obj, nullptr, [&](Error E) {
> + ++Errors;
> + consumeError(std::move(E));
> + return ErrorPolicy::Halt;
> + });
> EXPECT_TRUE(Errors == 1);
> }
>
>
>
> _______________________________________________
> 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