[llvm] r308543 - Use delegation instead of inheritance.
Rafael Avila de Espindola via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 24 12:35:28 PDT 2017
Fixed in r308913.
Thanks,
Rafael
"Robinson, Paul" <paul.robinson at sony.com> writes:
> 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