[llvm] f491b89 - Revert "Remove the dependency between lib/DebugInfoDWARF and MC."
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 10 10:50:49 PDT 2022
Please include details about the reason for a revert in the commit message.
On Thu, Oct 6, 2022 at 2:59 PM Shubham Sandeep Rastogi via
llvm-commits <llvm-commits at lists.llvm.org> wrote:
>
>
> Author: Shubham Sandeep Rastogi
> Date: 2022-10-06T14:58:34-07:00
> New Revision: f491b898c5d1312112d14f02d9cbdea7a4b4dc9d
>
> URL: https://github.com/llvm/llvm-project/commit/f491b898c5d1312112d14f02d9cbdea7a4b4dc9d
> DIFF: https://github.com/llvm/llvm-project/commit/f491b898c5d1312112d14f02d9cbdea7a4b4dc9d.diff
>
> LOG: Revert "Remove the dependency between lib/DebugInfoDWARF and MC."
>
> This reverts commit d96ade00c3c96bd451c60e34a17e613cdd5fdc38.
>
> Added:
>
>
> Modified:
> lldb/source/Expression/DWARFExpression.cpp
> lldb/source/Symbol/UnwindPlan.cpp
> lldb/unittests/Symbol/PostfixExpressionTest.cpp
> lldb/unittests/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpressionTests.cpp
> llvm/include/llvm/DebugInfo/DIContext.h
> llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h
> llvm/include/llvm/DebugInfo/DWARF/DWARFDebugFrame.h
> llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h
> llvm/include/llvm/DebugInfo/DWARF/DWARFExpression.h
> llvm/lib/DebugInfo/DWARF/CMakeLists.txt
> llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
> llvm/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp
> llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp
> llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
> llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp
> llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
> llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp
> llvm/tools/llvm-objdump/SourcePrinter.cpp
> llvm/tools/llvm-objdump/SourcePrinter.h
> llvm/tools/llvm-readobj/DwarfCFIEHPrinter.h
> llvm/unittests/DebugInfo/DWARF/DWARFDebugFrameTest.cpp
> llvm/unittests/DebugInfo/DWARF/DWARFExpressionCompactPrinterTest.cpp
>
> Removed:
>
>
>
> ################################################################################
> diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp
> index 5284d946dac84..1ccda944cd013 100644
> --- a/lldb/source/Expression/DWARFExpression.cpp
> +++ b/lldb/source/Expression/DWARFExpression.cpp
> @@ -69,21 +69,9 @@ void DWARFExpression::UpdateValue(uint64_t const_value,
>
> void DWARFExpression::DumpLocation(Stream *s, lldb::DescriptionLevel level,
> ABI *abi) const {
> - std::function<llvm::StringRef(uint64_t DwarfRegNum, bool IsEH)> GetRegName;
> - if (abi) {
> - auto RegInfo = abi->GetMCRegisterInfo();
> - GetRegName = [RegInfo](uint64_t DwarfRegNum, bool IsEH) -> llvm::StringRef {
> - if (llvm::Optional<unsigned> LLVMRegNum =
> - RegInfo.getLLVMRegNum(DwarfRegNum, IsEH))
> - if (const char *RegName = RegInfo.getName(*LLVMRegNum))
> - return llvm::StringRef(RegName);
> - return {};
> - };
> - }
> - auto DumpOpts = llvm::DIDumpOptions();
> - DumpOpts.GetNameForDWARFReg = GetRegName;
> llvm::DWARFExpression(m_data.GetAsLLVM(), m_data.GetAddressByteSize())
> - .print(s->AsRawOstream(), DumpOpts, nullptr);
> + .print(s->AsRawOstream(), llvm::DIDumpOptions(),
> + abi ? &abi->GetMCRegisterInfo() : nullptr, nullptr);
> }
>
> RegisterKind DWARFExpression::GetRegisterKind() const { return m_reg_kind; }
>
> diff --git a/lldb/source/Symbol/UnwindPlan.cpp b/lldb/source/Symbol/UnwindPlan.cpp
> index 8ca03344d43a4..bd4690547c6bd 100644
> --- a/lldb/source/Symbol/UnwindPlan.cpp
> +++ b/lldb/source/Symbol/UnwindPlan.cpp
> @@ -84,7 +84,7 @@ static void DumpDWARFExpr(Stream &s, llvm::ArrayRef<uint8_t> expr, Thread *threa
> llvm::DataExtractor data(expr, order_and_width->first == eByteOrderLittle,
> order_and_width->second);
> llvm::DWARFExpression(data, order_and_width->second, llvm::dwarf::DWARF32)
> - .print(s.AsRawOstream(), llvm::DIDumpOptions(), nullptr);
> + .print(s.AsRawOstream(), llvm::DIDumpOptions(), nullptr, nullptr);
> } else
> s.PutCString("dwarf-expr");
> }
>
> diff --git a/lldb/unittests/Symbol/PostfixExpressionTest.cpp b/lldb/unittests/Symbol/PostfixExpressionTest.cpp
> index 0eaa9d829a656..4d4706d60602d 100644
> --- a/lldb/unittests/Symbol/PostfixExpressionTest.cpp
> +++ b/lldb/unittests/Symbol/PostfixExpressionTest.cpp
> @@ -159,7 +159,7 @@ static std::string ParseAndGenerateDWARF(llvm::StringRef expr) {
> std::string result;
> llvm::raw_string_ostream os(result);
> llvm::DWARFExpression(extractor, addr_size, llvm::dwarf::DWARF32)
> - .print(os, llvm::DIDumpOptions(), nullptr);
> + .print(os, llvm::DIDumpOptions(), nullptr, nullptr);
> return std::move(os.str());
> }
>
>
> diff --git a/lldb/unittests/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpressionTests.cpp b/lldb/unittests/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpressionTests.cpp
> index 270cc8e56b7a0..730afb3fbedee 100644
> --- a/lldb/unittests/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpressionTests.cpp
> +++ b/lldb/unittests/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpressionTests.cpp
> @@ -40,7 +40,7 @@ CheckValidProgramTranslation(llvm::StringRef fpo_program,
> std::string result;
> llvm::raw_string_ostream os(result);
> llvm::DWARFExpression(extractor, /*AddressSize=*/4, llvm::dwarf::DWARF32)
> - .print(os, llvm::DIDumpOptions(), nullptr);
> + .print(os, llvm::DIDumpOptions(), nullptr, nullptr);
>
> // actual check
> ASSERT_EQ(expected_dwarf_expression, os.str());
>
> diff --git a/llvm/include/llvm/DebugInfo/DIContext.h b/llvm/include/llvm/DebugInfo/DIContext.h
> index 347ac16b8aae1..9b278b6960738 100644
> --- a/llvm/include/llvm/DebugInfo/DIContext.h
> +++ b/llvm/include/llvm/DebugInfo/DIContext.h
> @@ -198,9 +198,6 @@ struct DIDumpOptions {
> bool SummarizeTypes = false;
> bool Verbose = false;
> bool DisplayRawContents = false;
> - bool IsEH = false;
> - std::function<llvm::StringRef(uint64_t DwarfRegNum, bool IsEH)>
> - GetNameForDWARFReg;
>
> /// Return default option set for printing a single DIE without children.
> static DIDumpOptions getForSingleDIE() {
>
> diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h
> index 6e69f9cd623b1..bf591ed554c6a 100644
> --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h
> +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h
> @@ -27,6 +27,7 @@
>
> namespace llvm {
>
> +class MCRegisterInfo;
> class MemoryBuffer;
> class AppleAcceleratorTable;
> class DWARFCompileUnit;
> @@ -80,6 +81,9 @@ class DWARFContext : public DIContext {
> std::weak_ptr<DWOFile> DWP;
> bool CheckedForDWP = false;
> std::string DWPName;
> +
> + std::unique_ptr<MCRegisterInfo> RegInfo;
> +
> std::function<void(Error)> RecoverableErrorHandler =
> WithColor::defaultErrorHandler;
> std::function<void(Error)> WarningHandler = WithColor::defaultWarningHandler;
> @@ -404,6 +408,8 @@ class DWARFContext : public DIContext {
>
> std::shared_ptr<DWARFContext> getDWOContext(StringRef AbsolutePath);
>
> + const MCRegisterInfo *getRegisterInfo() const { return RegInfo.get(); }
> +
> function_ref<void(Error)> getRecoverableErrorHandler() {
> return RecoverableErrorHandler;
> }
> @@ -429,6 +435,11 @@ class DWARFContext : public DIContext {
> std::function<void(Error)> WarningHandler =
> WithColor::defaultWarningHandler);
>
> + /// Loads register info for the architecture of the provided object file.
> + /// Improves readability of dumped DWARF expressions. Requires the caller to
> + /// have initialized the relevant target descriptions.
> + Error loadRegisterInfo(const object::ObjectFile &Obj);
> +
> /// Get address size from CUs.
> /// TODO: refactor compile_units() to make this const.
> uint8_t getCUAddrSize();
>
> diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugFrame.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugFrame.h
> index bd5eca12079e4..48df091412bf3 100644
> --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugFrame.h
> +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugFrame.h
> @@ -162,7 +162,7 @@ class UnwindLocation {
> /// instead of from .debug_frame. This is needed for register number
> /// conversion because some register numbers
> diff er between the two sections
> /// for certain architectures like x86.
> - void dump(raw_ostream &OS, DIDumpOptions DumpOpts) const;
> + void dump(raw_ostream &OS, const MCRegisterInfo *MRI, bool IsEH) const;
>
> bool operator==(const UnwindLocation &RHS) const;
> };
> @@ -220,7 +220,7 @@ class RegisterLocations {
> /// instead of from .debug_frame. This is needed for register number
> /// conversion because some register numbers
> diff er between the two sections
> /// for certain architectures like x86.
> - void dump(raw_ostream &OS, DIDumpOptions DumpOpts) const;
> + void dump(raw_ostream &OS, const MCRegisterInfo *MRI, bool IsEH) const;
>
> /// Returns true if we have any register locations in this object.
> bool hasLocations() const { return !Locations.empty(); }
> @@ -301,7 +301,7 @@ class UnwindRow {
> ///
> /// \param IndentLevel specify the indent level as an integer. The UnwindRow
> /// will be output to the stream preceded by 2 * IndentLevel number of spaces.
> - void dump(raw_ostream &OS, DIDumpOptions DumpOpts,
> + void dump(raw_ostream &OS, const MCRegisterInfo *MRI, bool IsEH,
> unsigned IndentLevel = 0) const;
> };
>
> @@ -346,7 +346,7 @@ class UnwindTable {
> ///
> /// \param IndentLevel specify the indent level as an integer. The UnwindRow
> /// will be output to the stream preceded by 2 * IndentLevel number of spaces.
> - void dump(raw_ostream &OS, DIDumpOptions DumpOpts,
> + void dump(raw_ostream &OS, const MCRegisterInfo *MRI, bool IsEH,
> unsigned IndentLevel = 0) const;
>
> /// Create an UnwindTable from a Common Information Entry (CIE).
> @@ -452,8 +452,8 @@ class CFIProgram {
> /// where a problem occurred in case an error is returned.
> Error parse(DWARFDataExtractor Data, uint64_t *Offset, uint64_t EndOffset);
>
> - void dump(raw_ostream &OS, DIDumpOptions DumpOpts,
> - unsigned IndentLevel = 1) const;
> + void dump(raw_ostream &OS, DIDumpOptions DumpOpts, const MCRegisterInfo *MRI,
> + bool IsEH, unsigned IndentLevel = 1) const;
>
> void addInstruction(const Instruction &I) { Instructions.push_back(I); }
>
> @@ -521,6 +521,7 @@ class CFIProgram {
>
> /// Print \p Opcode's operand number \p OperandIdx which has value \p Operand.
> void printOperand(raw_ostream &OS, DIDumpOptions DumpOpts,
> + const MCRegisterInfo *MRI, bool IsEH,
> const Instruction &Instr, unsigned OperandIdx,
> uint64_t Operand) const;
> };
> @@ -545,7 +546,8 @@ class FrameEntry {
> CFIProgram &cfis() { return CFIs; }
>
> /// Dump the instructions in this CFI fragment
> - virtual void dump(raw_ostream &OS, DIDumpOptions DumpOpts) const = 0;
> + virtual void dump(raw_ostream &OS, DIDumpOptions DumpOpts,
> + const MCRegisterInfo *MRI, bool IsEH) const = 0;
>
> protected:
> const FrameKind Kind;
> @@ -599,7 +601,8 @@ class CIE : public FrameEntry {
>
> uint32_t getLSDAPointerEncoding() const { return LSDAPointerEncoding; }
>
> - void dump(raw_ostream &OS, DIDumpOptions DumpOpts) const override;
> + void dump(raw_ostream &OS, DIDumpOptions DumpOpts, const MCRegisterInfo *MRI,
> + bool IsEH) const override;
>
> private:
> /// The following fields are defined in section 6.4.1 of the DWARF standard v4
> @@ -639,7 +642,8 @@ class FDE : public FrameEntry {
> uint64_t getAddressRange() const { return AddressRange; }
> Optional<uint64_t> getLSDAAddress() const { return LSDAAddress; }
>
> - void dump(raw_ostream &OS, DIDumpOptions DumpOpts) const override;
> + void dump(raw_ostream &OS, DIDumpOptions DumpOpts, const MCRegisterInfo *MRI,
> + bool IsEH) const override;
>
> static bool classof(const FrameEntry *FE) { return FE->getKind() == FK_FDE; }
>
> @@ -681,7 +685,7 @@ class DWARFDebugFrame {
> ~DWARFDebugFrame();
>
> /// Dump the section data into the given stream.
> - void dump(raw_ostream &OS, DIDumpOptions DumpOpts,
> + void dump(raw_ostream &OS, DIDumpOptions DumpOpts, const MCRegisterInfo *MRI,
> Optional<uint64_t> Offset) const;
>
> /// Parse the section from raw data. \p Data is assumed to contain the whole
>
> diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h
> index e36b255219c39..90e009e514d4a 100644
> --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h
> +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h
> @@ -67,8 +67,9 @@ class DWARFLocationTable {
> /// updated to point past the end of the current list).
> bool dumpLocationList(uint64_t *Offset, raw_ostream &OS,
> Optional<object::SectionedAddress> BaseAddr,
> - const DWARFObject &Obj, DWARFUnit *U,
> - DIDumpOptions DumpOpts, unsigned Indent) const;
> + const MCRegisterInfo *MRI, const DWARFObject &Obj,
> + DWARFUnit *U, DIDumpOptions DumpOpts,
> + unsigned Indent) const;
>
> Error visitAbsoluteLocationList(
> uint64_t Offset, Optional<object::SectionedAddress> BaseAddr,
> @@ -108,7 +109,8 @@ class DWARFDebugLoc final : public DWARFLocationTable {
> : DWARFLocationTable(std::move(Data)) {}
>
> /// Print the location lists found within the debug_loc section.
> - void dump(raw_ostream &OS, const DWARFObject &Obj, DIDumpOptions DumpOpts,
> + void dump(raw_ostream &OS, const MCRegisterInfo *RegInfo,
> + const DWARFObject &Obj, DIDumpOptions DumpOpts,
> Optional<uint64_t> Offset) const;
>
> Error visitLocationList(
> @@ -132,7 +134,8 @@ class DWARFDebugLoclists final : public DWARFLocationTable {
>
> /// Dump all location lists within the given range.
> void dumpRange(uint64_t StartOffset, uint64_t Size, raw_ostream &OS,
> - const DWARFObject &Obj, DIDumpOptions DumpOpts);
> + const MCRegisterInfo *MRI, const DWARFObject &Obj,
> + DIDumpOptions DumpOpts);
>
> protected:
> void dumpRawEntry(const DWARFLocationEntry &Entry, raw_ostream &OS,
>
> diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFExpression.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFExpression.h
> index cb93b45105dfa..c4d81047a4dca 100644
> --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFExpression.h
> +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFExpression.h
> @@ -94,7 +94,8 @@ class DWARFExpression {
> uint64_t getEndOffset() const { return EndOffset; }
> bool isError() const { return Error; }
> bool print(raw_ostream &OS, DIDumpOptions DumpOpts,
> - const DWARFExpression *Expr, DWARFUnit *U) const;
> + const DWARFExpression *Expr, const MCRegisterInfo *RegInfo,
> + DWARFUnit *U, bool isEH) const;
>
> /// Verify \p Op. Does not affect the return of \a isError().
> static bool verify(const Operation &Op, DWARFUnit *U);
> @@ -147,15 +148,15 @@ class DWARFExpression {
> iterator begin() const { return iterator(this, 0); }
> iterator end() const { return iterator(this, Data.getData().size()); }
>
> - void print(raw_ostream &OS, DIDumpOptions DumpOpts, DWARFUnit *U) const;
> + void print(raw_ostream &OS, DIDumpOptions DumpOpts,
> + const MCRegisterInfo *RegInfo, DWARFUnit *U,
> + bool IsEH = false) const;
>
> /// Print the expression in a format intended to be compact and useful to a
> /// user, but not perfectly unambiguous, or capable of representing every
> /// valid DWARF expression. Returns true if the expression was sucessfully
> /// printed.
> - bool printCompact(raw_ostream &OS,
> - std::function<StringRef(uint64_t RegNum, bool IsEH)>
> - GetNameForDWARFReg = nullptr);
> + bool printCompact(raw_ostream &OS, const MCRegisterInfo &RegInfo);
>
> bool verify(DWARFUnit *U);
>
>
> diff --git a/llvm/lib/DebugInfo/DWARF/CMakeLists.txt b/llvm/lib/DebugInfo/DWARF/CMakeLists.txt
> index 0a3351393fbff..5ff72add9faf9 100644
> --- a/llvm/lib/DebugInfo/DWARF/CMakeLists.txt
> +++ b/llvm/lib/DebugInfo/DWARF/CMakeLists.txt
> @@ -36,5 +36,6 @@ add_llvm_component_library(LLVMDebugInfoDWARF
> LINK_COMPONENTS
> BinaryFormat
> Object
> + MC
> Support
> )
>
> diff --git a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
> index 8e3d5467c8650..19d7d659a86aa 100644
> --- a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
> +++ b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
> @@ -38,6 +38,7 @@
> #include "llvm/DebugInfo/DWARF/DWARFTypeUnit.h"
> #include "llvm/DebugInfo/DWARF/DWARFUnitIndex.h"
> #include "llvm/DebugInfo/DWARF/DWARFVerifier.h"
> +#include "llvm/MC/MCRegisterInfo.h"
> #include "llvm/MC/TargetRegistry.h"
> #include "llvm/Object/Decompressor.h"
> #include "llvm/Object/MachO.h"
> @@ -308,7 +309,9 @@ DWARFContext::parseMacroOrMacinfo(MacroSecType SectionType) {
> }
>
> static void dumpLoclistsSection(raw_ostream &OS, DIDumpOptions DumpOpts,
> - DWARFDataExtractor Data, const DWARFObject &Obj,
> + DWARFDataExtractor Data,
> + const MCRegisterInfo *MRI,
> + const DWARFObject &Obj,
> Optional<uint64_t> DumpOffset) {
> uint64_t Offset = 0;
>
> @@ -327,13 +330,13 @@ static void dumpLoclistsSection(raw_ostream &OS, DIDumpOptions DumpOpts,
> if (DumpOffset) {
> if (DumpOffset >= Offset && DumpOffset < EndOffset) {
> Offset = *DumpOffset;
> - Loc.dumpLocationList(&Offset, OS, /*BaseAddr=*/None, Obj, nullptr,
> + Loc.dumpLocationList(&Offset, OS, /*BaseAddr=*/None, MRI, Obj, nullptr,
> DumpOpts, /*Indent=*/0);
> OS << "\n";
> return;
> }
> } else {
> - Loc.dumpRange(Offset, EndOffset - Offset, OS, Obj, DumpOpts);
> + Loc.dumpRange(Offset, EndOffset - Offset, OS, MRI, Obj, DumpOpts);
> }
> Offset = EndOffset;
> }
> @@ -421,21 +424,21 @@ void DWARFContext::dump(
>
> if (const auto *Off = shouldDump(Explicit, ".debug_loc", DIDT_ID_DebugLoc,
> DObj->getLocSection().Data)) {
> - getDebugLoc()->dump(OS, *DObj, LLDumpOpts, *Off);
> + getDebugLoc()->dump(OS, getRegisterInfo(), *DObj, LLDumpOpts, *Off);
> }
> if (const auto *Off =
> shouldDump(Explicit, ".debug_loclists", DIDT_ID_DebugLoclists,
> DObj->getLoclistsSection().Data)) {
> DWARFDataExtractor Data(*DObj, DObj->getLoclistsSection(), isLittleEndian(),
> 0);
> - dumpLoclistsSection(OS, LLDumpOpts, Data, *DObj, *Off);
> + dumpLoclistsSection(OS, LLDumpOpts, Data, getRegisterInfo(), *DObj, *Off);
> }
> if (const auto *Off =
> shouldDump(ExplicitDWO, ".debug_loclists.dwo", DIDT_ID_DebugLoclists,
> DObj->getLoclistsDWOSection().Data)) {
> DWARFDataExtractor Data(*DObj, DObj->getLoclistsDWOSection(),
> isLittleEndian(), 0);
> - dumpLoclistsSection(OS, LLDumpOpts, Data, *DObj, *Off);
> + dumpLoclistsSection(OS, LLDumpOpts, Data, getRegisterInfo(), *DObj, *Off);
> }
>
> if (const auto *Off =
> @@ -447,11 +450,12 @@ void DWARFContext::dump(
> if (*Off) {
> uint64_t Offset = **Off;
> Loc.dumpLocationList(&Offset, OS,
> - /*BaseAddr=*/None, *DObj, nullptr, LLDumpOpts,
> - /*Indent=*/0);
> + /*BaseAddr=*/None, getRegisterInfo(), *DObj, nullptr,
> + LLDumpOpts, /*Indent=*/0);
> OS << "\n";
> } else {
> - Loc.dumpRange(0, Data.getData().size(), OS, *DObj, LLDumpOpts);
> + Loc.dumpRange(0, Data.getData().size(), OS, getRegisterInfo(), *DObj,
> + LLDumpOpts);
> }
> }
>
> @@ -459,7 +463,7 @@ void DWARFContext::dump(
> shouldDump(Explicit, ".debug_frame", DIDT_ID_DebugFrame,
> DObj->getFrameSection().Data)) {
> if (Expected<const DWARFDebugFrame *> DF = getDebugFrame())
> - (*DF)->dump(OS, DumpOpts, *Off);
> + (*DF)->dump(OS, DumpOpts, getRegisterInfo(), *Off);
> else
> RecoverableErrorHandler(DF.takeError());
> }
> @@ -468,7 +472,7 @@ void DWARFContext::dump(
> shouldDump(Explicit, ".eh_frame", DIDT_ID_DebugFrame,
> DObj->getEHFrameSection().Data)) {
> if (Expected<const DWARFDebugFrame *> DF = getEHFrame())
> - (*DF)->dump(OS, DumpOpts, *Off);
> + (*DF)->dump(OS, DumpOpts, getRegisterInfo(), *Off);
> else
> RecoverableErrorHandler(DF.takeError());
> }
> @@ -2015,6 +2019,23 @@ DWARFContext::create(const StringMap<std::unique_ptr<MemoryBuffer>> &Sections,
> std::move(DObj), "", RecoverableErrorHandler, WarningHandler);
> }
>
> +Error DWARFContext::loadRegisterInfo(const object::ObjectFile &Obj) {
> + // Detect the architecture from the object file. We usually don't need OS
> + // info to lookup a target and create register info.
> + Triple TT;
> + TT.setArch(Triple::ArchType(Obj.getArch()));
> + TT.setVendor(Triple::UnknownVendor);
> + TT.setOS(Triple::UnknownOS);
> + std::string TargetLookupError;
> + const Target *TheTarget =
> + TargetRegistry::lookupTarget(TT.str(), TargetLookupError);
> + if (!TargetLookupError.empty())
> + return createStringError(errc::invalid_argument,
> + TargetLookupError.c_str());
> + RegInfo.reset(TheTarget->createMCRegInfo(TT.str()));
> + return Error::success();
> +}
> +
> uint8_t DWARFContext::getCUAddrSize() {
> // In theory,
> diff erent compile units may have
> diff erent address byte
> // sizes, but for simplicity we just use the address byte size of the
>
> diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp
> index ee6ebb0fdcd93..cf9057c99dbd7 100644
> --- a/llvm/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp
> +++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp
> @@ -14,6 +14,7 @@
> #include "llvm/BinaryFormat/Dwarf.h"
> #include "llvm/DebugInfo/DIContext.h"
> #include "llvm/DebugInfo/DWARF/DWARFDataExtractor.h"
> +#include "llvm/MC/MCRegisterInfo.h"
> #include "llvm/Support/Compiler.h"
> #include "llvm/Support/DataExtractor.h"
> #include "llvm/Support/Errc.h"
> @@ -28,13 +29,14 @@
> using namespace llvm;
> using namespace dwarf;
>
> -static void printRegister(raw_ostream &OS, DIDumpOptions DumpOpts,
> +static void printRegister(raw_ostream &OS, const MCRegisterInfo *MRI, bool IsEH,
> unsigned RegNum) {
> - if (DumpOpts.GetNameForDWARFReg) {
> - auto RegName = DumpOpts.GetNameForDWARFReg(RegNum, DumpOpts.IsEH);
> - if (!RegName.empty()) {
> - OS << RegName;
> - return;
> + if (MRI) {
> + if (Optional<unsigned> LLVMRegNum = MRI->getLLVMRegNum(RegNum, IsEH)) {
> + if (const char *RegName = MRI->getName(*LLVMRegNum)) {
> + OS << RegName;
> + return;
> + }
> }
> }
> OS << "reg" << RegNum;
> @@ -78,7 +80,8 @@ UnwindLocation UnwindLocation::createAtDWARFExpression(DWARFExpression Expr) {
> return {Expr, true};
> }
>
> -void UnwindLocation::dump(raw_ostream &OS, DIDumpOptions DumpOpts) const {
> +void UnwindLocation::dump(raw_ostream &OS, const MCRegisterInfo *MRI,
> + bool IsEH) const {
> if (Dereference)
> OS << '[';
> switch (Kind) {
> @@ -100,7 +103,7 @@ void UnwindLocation::dump(raw_ostream &OS, DIDumpOptions DumpOpts) const {
> OS << Offset;
> break;
> case RegPlusOffset:
> - printRegister(OS, DumpOpts, RegNum);
> + printRegister(OS, MRI, IsEH, RegNum);
> if (Offset == 0 && !AddrSpace)
> break;
> if (Offset >= 0)
> @@ -109,10 +112,9 @@ void UnwindLocation::dump(raw_ostream &OS, DIDumpOptions DumpOpts) const {
> if (AddrSpace)
> OS << " in addrspace" << *AddrSpace;
> break;
> - case DWARFExpr: {
> - Expr->print(OS, DumpOpts, nullptr);
> + case DWARFExpr:
> + Expr->print(OS, DIDumpOptions(), MRI, nullptr, IsEH);
> break;
> - }
> case Constant:
> OS << Offset;
> break;
> @@ -123,8 +125,7 @@ void UnwindLocation::dump(raw_ostream &OS, DIDumpOptions DumpOpts) const {
>
> raw_ostream &llvm::dwarf::operator<<(raw_ostream &OS,
> const UnwindLocation &UL) {
> - auto DumpOpts = DIDumpOptions();
> - UL.dump(OS, DumpOpts);
> + UL.dump(OS, nullptr, false);
> return OS;
> }
>
> @@ -149,55 +150,53 @@ bool UnwindLocation::operator==(const UnwindLocation &RHS) const {
> return false;
> }
>
> -void RegisterLocations::dump(raw_ostream &OS, DIDumpOptions DumpOpts) const {
> +void RegisterLocations::dump(raw_ostream &OS, const MCRegisterInfo *MRI,
> + bool IsEH) const {
> bool First = true;
> for (const auto &RegLocPair : Locations) {
> if (First)
> First = false;
> else
> OS << ", ";
> - printRegister(OS, DumpOpts, RegLocPair.first);
> + printRegister(OS, MRI, IsEH, RegLocPair.first);
> OS << '=';
> - RegLocPair.second.dump(OS, DumpOpts);
> + RegLocPair.second.dump(OS, MRI, IsEH);
> }
> }
>
> raw_ostream &llvm::dwarf::operator<<(raw_ostream &OS,
> const RegisterLocations &RL) {
> - auto DumpOpts = DIDumpOptions();
> - RL.dump(OS, DumpOpts);
> + RL.dump(OS, nullptr, false);
> return OS;
> }
>
> -void UnwindRow::dump(raw_ostream &OS, DIDumpOptions DumpOpts,
> +void UnwindRow::dump(raw_ostream &OS, const MCRegisterInfo *MRI, bool IsEH,
> unsigned IndentLevel) const {
> OS.indent(2 * IndentLevel);
> if (hasAddress())
> OS << format("0x%" PRIx64 ": ", *Address);
> OS << "CFA=";
> - CFAValue.dump(OS, DumpOpts);
> + CFAValue.dump(OS, MRI, IsEH);
> if (RegLocs.hasLocations()) {
> OS << ": ";
> - RegLocs.dump(OS, DumpOpts);
> + RegLocs.dump(OS, MRI, IsEH);
> }
> OS << "\n";
> }
>
> raw_ostream &llvm::dwarf::operator<<(raw_ostream &OS, const UnwindRow &Row) {
> - auto DumpOpts = DIDumpOptions();
> - Row.dump(OS, DumpOpts, 0);
> + Row.dump(OS, nullptr, false, 0);
> return OS;
> }
>
> -void UnwindTable::dump(raw_ostream &OS, DIDumpOptions DumpOpts,
> +void UnwindTable::dump(raw_ostream &OS, const MCRegisterInfo *MRI, bool IsEH,
> unsigned IndentLevel) const {
> for (const UnwindRow &Row : Rows)
> - Row.dump(OS, DumpOpts, IndentLevel);
> + Row.dump(OS, MRI, IsEH, IndentLevel);
> }
>
> raw_ostream &llvm::dwarf::operator<<(raw_ostream &OS, const UnwindTable &Rows) {
> - auto DumpOpts = DIDumpOptions();
> - Rows.dump(OS, DumpOpts, 0);
> + Rows.dump(OS, nullptr, false, 0);
> return OS;
> }
>
> @@ -854,6 +853,7 @@ CFIProgram::getOperandTypes() {
>
> /// Print \p Opcode's operand number \p OperandIdx which has value \p Operand.
> void CFIProgram::printOperand(raw_ostream &OS, DIDumpOptions DumpOpts,
> + const MCRegisterInfo *MRI, bool IsEH,
> const Instruction &Instr, unsigned OperandIdx,
> uint64_t Operand) const {
> assert(OperandIdx < MaxOperands);
> @@ -901,7 +901,7 @@ void CFIProgram::printOperand(raw_ostream &OS, DIDumpOptions DumpOpts,
> break;
> case OT_Register:
> OS << ' ';
> - printRegister(OS, DumpOpts, Operand);
> + printRegister(OS, MRI, IsEH, Operand);
> break;
> case OT_AddressSpace:
> OS << format(" in addrspace%" PRId64, Operand);
> @@ -909,19 +909,20 @@ void CFIProgram::printOperand(raw_ostream &OS, DIDumpOptions DumpOpts,
> case OT_Expression:
> assert(Instr.Expression && "missing DWARFExpression object");
> OS << " ";
> - Instr.Expression->print(OS, DumpOpts, nullptr);
> + Instr.Expression->print(OS, DumpOpts, MRI, nullptr, IsEH);
> break;
> }
> }
>
> void CFIProgram::dump(raw_ostream &OS, DIDumpOptions DumpOpts,
> + const MCRegisterInfo *MRI, bool IsEH,
> unsigned IndentLevel) const {
> for (const auto &Instr : Instructions) {
> uint8_t Opcode = Instr.Opcode;
> OS.indent(2 * IndentLevel);
> OS << callFrameString(Opcode) << ":";
> for (unsigned i = 0; i < Instr.Ops.size(); ++i)
> - printOperand(OS, DumpOpts, Instr, i, Instr.Ops[i]);
> + printOperand(OS, DumpOpts, MRI, IsEH, Instr, i, Instr.Ops[i]);
> OS << '\n';
> }
> }
> @@ -938,20 +939,21 @@ constexpr uint64_t getCIEId(bool IsDWARF64, bool IsEH) {
> return DW_CIE_ID;
> }
>
> -void CIE::dump(raw_ostream &OS, DIDumpOptions DumpOpts) const {
> +void CIE::dump(raw_ostream &OS, DIDumpOptions DumpOpts,
> + const MCRegisterInfo *MRI, bool IsEH) const {
> // A CIE with a zero length is a terminator entry in the .eh_frame section.
> - if (DumpOpts.IsEH && Length == 0) {
> + if (IsEH && Length == 0) {
> OS << format("%08" PRIx64, Offset) << " ZERO terminator\n";
> return;
> }
>
> OS << format("%08" PRIx64, Offset)
> << format(" %0*" PRIx64, IsDWARF64 ? 16 : 8, Length)
> - << format(" %0*" PRIx64, IsDWARF64 && !DumpOpts.IsEH ? 16 : 8,
> - getCIEId(IsDWARF64, DumpOpts.IsEH))
> + << format(" %0*" PRIx64, IsDWARF64 && !IsEH ? 16 : 8,
> + getCIEId(IsDWARF64, IsEH))
> << " CIE\n"
> << " Format: " << FormatString(IsDWARF64) << "\n";
> - if (DumpOpts.IsEH && Version != 1)
> + if (IsEH && Version != 1)
> OS << "WARNING: unsupported CIE version\n";
> OS << format(" Version: %d\n", Version)
> << " Augmentation: \"" << Augmentation << "\"\n";
> @@ -972,11 +974,11 @@ void CIE::dump(raw_ostream &OS, DIDumpOptions DumpOpts) const {
> OS << "\n";
> }
> OS << "\n";
> - CFIs.dump(OS, DumpOpts);
> + CFIs.dump(OS, DumpOpts, MRI, IsEH);
> OS << "\n";
>
> if (Expected<UnwindTable> RowsOrErr = UnwindTable::create(this))
> - RowsOrErr->dump(OS, DumpOpts, 1);
> + RowsOrErr->dump(OS, MRI, IsEH, 1);
> else {
> DumpOpts.RecoverableErrorHandler(joinErrors(
> createStringError(errc::invalid_argument,
> @@ -986,10 +988,11 @@ void CIE::dump(raw_ostream &OS, DIDumpOptions DumpOpts) const {
> OS << "\n";
> }
>
> -void FDE::dump(raw_ostream &OS, DIDumpOptions DumpOpts) const {
> +void FDE::dump(raw_ostream &OS, DIDumpOptions DumpOpts,
> + const MCRegisterInfo *MRI, bool IsEH) const {
> OS << format("%08" PRIx64, Offset)
> << format(" %0*" PRIx64, IsDWARF64 ? 16 : 8, Length)
> - << format(" %0*" PRIx64, IsDWARF64 && !DumpOpts.IsEH ? 16 : 8, CIEPointer)
> + << format(" %0*" PRIx64, IsDWARF64 && !IsEH ? 16 : 8, CIEPointer)
> << " FDE cie=";
> if (LinkedCIE)
> OS << format("%08" PRIx64, LinkedCIE->getOffset());
> @@ -1000,11 +1003,11 @@ void FDE::dump(raw_ostream &OS, DIDumpOptions DumpOpts) const {
> OS << " Format: " << FormatString(IsDWARF64) << "\n";
> if (LSDAAddress)
> OS << format(" LSDA Address: %016" PRIx64 "\n", *LSDAAddress);
> - CFIs.dump(OS, DumpOpts);
> + CFIs.dump(OS, DumpOpts, MRI, IsEH);
> OS << "\n";
>
> if (Expected<UnwindTable> RowsOrErr = UnwindTable::create(this))
> - RowsOrErr->dump(OS, DumpOpts, 1);
> + RowsOrErr->dump(OS, MRI, IsEH, 1);
> else {
> DumpOpts.RecoverableErrorHandler(joinErrors(
> createStringError(errc::invalid_argument,
> @@ -1239,15 +1242,15 @@ FrameEntry *DWARFDebugFrame::getEntryAtOffset(uint64_t Offset) const {
> }
>
> void DWARFDebugFrame::dump(raw_ostream &OS, DIDumpOptions DumpOpts,
> + const MCRegisterInfo *MRI,
> Optional<uint64_t> Offset) const {
> - DumpOpts.IsEH = IsEH;
> if (Offset) {
> if (auto *Entry = getEntryAtOffset(*Offset))
> - Entry->dump(OS, DumpOpts);
> + Entry->dump(OS, DumpOpts, MRI, IsEH);
> return;
> }
>
> OS << "\n";
> for (const auto &Entry : Entries)
> - Entry->dump(OS, DumpOpts);
> + Entry->dump(OS, DumpOpts, MRI, IsEH);
> }
>
> diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp
> index b61206aeabb63..b68af4cfafefb 100644
> --- a/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp
> +++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp
> @@ -110,17 +110,19 @@ DWARFLocationInterpreter::Interpret(const DWARFLocationEntry &E) {
>
> static void dumpExpression(raw_ostream &OS, DIDumpOptions DumpOpts,
> ArrayRef<uint8_t> Data, bool IsLittleEndian,
> - unsigned AddressSize, DWARFUnit *U) {
> + unsigned AddressSize, const MCRegisterInfo *MRI,
> + DWARFUnit *U) {
> DWARFDataExtractor Extractor(Data, IsLittleEndian, AddressSize);
> // Note. We do not pass any format to DWARFExpression, even if the
> // corresponding unit is known. For now, there is only one operation,
> // DW_OP_call_ref, which depends on the format; it is rarely used, and
> // is unexpected in location tables.
> - DWARFExpression(Extractor, AddressSize).print(OS, DumpOpts, U);
> + DWARFExpression(Extractor, AddressSize).print(OS, DumpOpts, MRI, U);
> }
>
> bool DWARFLocationTable::dumpLocationList(uint64_t *Offset, raw_ostream &OS,
> Optional<SectionedAddress> BaseAddr,
> + const MCRegisterInfo *MRI,
> const DWARFObject &Obj, DWARFUnit *U,
> DIDumpOptions DumpOpts,
> unsigned Indent) const {
> @@ -156,7 +158,7 @@ bool DWARFLocationTable::dumpLocationList(uint64_t *Offset, raw_ostream &OS,
> E.Kind != dwarf::DW_LLE_end_of_list) {
> OS << ": ";
> dumpExpression(OS, DumpOpts, E.Loc, Data.isLittleEndian(),
> - Data.getAddressSize(), U);
> + Data.getAddressSize(), MRI, U);
> }
> return true;
> });
> @@ -182,13 +184,13 @@ Error DWARFLocationTable::visitAbsoluteLocationList(
> });
> }
>
> -void DWARFDebugLoc::dump(raw_ostream &OS, const DWARFObject &Obj,
> - DIDumpOptions DumpOpts,
> +void DWARFDebugLoc::dump(raw_ostream &OS, const MCRegisterInfo *MRI,
> + const DWARFObject &Obj, DIDumpOptions DumpOpts,
> Optional<uint64_t> DumpOffset) const {
> auto BaseAddr = None;
> unsigned Indent = 12;
> if (DumpOffset) {
> - dumpLocationList(&*DumpOffset, OS, BaseAddr, Obj, nullptr, DumpOpts,
> + dumpLocationList(&*DumpOffset, OS, BaseAddr, MRI, Obj, nullptr, DumpOpts,
> Indent);
> } else {
> uint64_t Offset = 0;
> @@ -198,7 +200,7 @@ void DWARFDebugLoc::dump(raw_ostream &OS, const DWARFObject &Obj,
> OS << Separator;
> Separator = "\n";
>
> - CanContinue = dumpLocationList(&Offset, OS, BaseAddr, Obj, nullptr,
> + CanContinue = dumpLocationList(&Offset, OS, BaseAddr, MRI, Obj, nullptr,
> DumpOpts, Indent);
> OS << '\n';
> }
> @@ -385,7 +387,8 @@ void DWARFDebugLoclists::dumpRawEntry(const DWARFLocationEntry &Entry,
> }
>
> void DWARFDebugLoclists::dumpRange(uint64_t StartOffset, uint64_t Size,
> - raw_ostream &OS, const DWARFObject &Obj,
> + raw_ostream &OS, const MCRegisterInfo *MRI,
> + const DWARFObject &Obj,
> DIDumpOptions DumpOpts) {
> if (!Data.isValidOffsetForDataOfSize(StartOffset, Size)) {
> OS << "Invalid dump range\n";
> @@ -398,8 +401,8 @@ void DWARFDebugLoclists::dumpRange(uint64_t StartOffset, uint64_t Size,
> OS << Separator;
> Separator = "\n";
>
> - CanContinue = dumpLocationList(&Offset, OS, /*BaseAddr=*/None, Obj, nullptr,
> - DumpOpts, /*Indent=*/12);
> + CanContinue = dumpLocationList(&Offset, OS, /*BaseAddr=*/None, MRI, Obj,
> + nullptr, DumpOpts, /*Indent=*/12);
> OS << '\n';
> }
> }
>
> diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
> index 7fd29babb44e3..15a2d23c4fd2a 100644
> --- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
> +++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
> @@ -76,6 +76,7 @@ static void dumpLocationList(raw_ostream &OS, const DWARFFormValue &FormValue,
> assert(FormValue.isFormClass(DWARFFormValue::FC_SectionOffset) &&
> "bad FORM for location list");
> DWARFContext &Ctx = U->getContext();
> + const MCRegisterInfo *MRI = Ctx.getRegisterInfo();
> uint64_t Offset = *FormValue.getAsSectionOffset();
>
> if (FormValue.getForm() == DW_FORM_loclistx) {
> @@ -86,8 +87,9 @@ static void dumpLocationList(raw_ostream &OS, const DWARFFormValue &FormValue,
> else
> return;
> }
> - U->getLocationTable().dumpLocationList(
> - &Offset, OS, U->getBaseAddress(), Ctx.getDWARFObj(), U, DumpOpts, Indent);
> + U->getLocationTable().dumpLocationList(&Offset, OS, U->getBaseAddress(), MRI,
> + Ctx.getDWARFObj(), U, DumpOpts,
> + Indent);
> }
>
> static void dumpLocationExpr(raw_ostream &OS, const DWARFFormValue &FormValue,
> @@ -97,11 +99,12 @@ static void dumpLocationExpr(raw_ostream &OS, const DWARFFormValue &FormValue,
> FormValue.isFormClass(DWARFFormValue::FC_Exprloc)) &&
> "bad FORM for location expression");
> DWARFContext &Ctx = U->getContext();
> + const MCRegisterInfo *MRI = Ctx.getRegisterInfo();
> ArrayRef<uint8_t> Expr = *FormValue.getAsBlock();
> DataExtractor Data(StringRef((const char *)Expr.data(), Expr.size()),
> Ctx.isLittleEndian(), 0);
> DWARFExpression(Data, U->getAddressByteSize(), U->getFormParams().Format)
> - .print(OS, DumpOpts, U);
> + .print(OS, DumpOpts, MRI, U);
> }
>
> static DWARFDie resolveReferencedType(DWARFDie D, DWARFFormValue F) {
>
> diff --git a/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp b/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp
> index 7b59ae9622218..e19f5b8138fa0 100644
> --- a/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp
> +++ b/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp
> @@ -8,6 +8,7 @@
>
> #include "llvm/DebugInfo/DWARF/DWARFExpression.h"
> #include "llvm/DebugInfo/DWARF/DWARFUnit.h"
> +#include "llvm/MC/MCRegisterInfo.h"
> #include "llvm/Support/Format.h"
> #include <cassert>
> #include <cstdint>
> @@ -226,8 +227,9 @@ static void prettyPrintBaseTypeRef(DWARFUnit *U, raw_ostream &OS,
>
> static bool prettyPrintRegisterOp(DWARFUnit *U, raw_ostream &OS,
> DIDumpOptions DumpOpts, uint8_t Opcode,
> - const uint64_t Operands[2]) {
> - if (!DumpOpts.GetNameForDWARFReg)
> + const uint64_t Operands[2],
> + const MCRegisterInfo *MRI, bool isEH) {
> + if (!MRI)
> return false;
>
> uint64_t DwarfRegNum;
> @@ -241,17 +243,18 @@ static bool prettyPrintRegisterOp(DWARFUnit *U, raw_ostream &OS,
> else
> DwarfRegNum = Opcode - DW_OP_reg0;
>
> - auto RegName = DumpOpts.GetNameForDWARFReg(DwarfRegNum, DumpOpts.IsEH);
> - if (!RegName.empty()) {
> - if ((Opcode >= DW_OP_breg0 && Opcode <= DW_OP_breg31) ||
> - Opcode == DW_OP_bregx)
> - OS << ' ' << RegName << format("%+" PRId64, Operands[OpNum]);
> - else
> - OS << ' ' << RegName.data();
> -
> - if (Opcode == DW_OP_regval_type)
> - prettyPrintBaseTypeRef(U, OS, DumpOpts, Operands, 1);
> - return true;
> + if (Optional<unsigned> LLVMRegNum = MRI->getLLVMRegNum(DwarfRegNum, isEH)) {
> + if (const char *RegName = MRI->getName(*LLVMRegNum)) {
> + if ((Opcode >= DW_OP_breg0 && Opcode <= DW_OP_breg31) ||
> + Opcode == DW_OP_bregx)
> + OS << format(" %s%+" PRId64, RegName, Operands[OpNum]);
> + else
> + OS << ' ' << RegName;
> +
> + if (Opcode == DW_OP_regval_type)
> + prettyPrintBaseTypeRef(U, OS, DumpOpts, Operands, 1);
> + return true;
> + }
> }
>
> return false;
> @@ -259,7 +262,8 @@ static bool prettyPrintRegisterOp(DWARFUnit *U, raw_ostream &OS,
>
> bool DWARFExpression::Operation::print(raw_ostream &OS, DIDumpOptions DumpOpts,
> const DWARFExpression *Expr,
> - DWARFUnit *U) const {
> + const MCRegisterInfo *RegInfo,
> + DWARFUnit *U, bool isEH) const {
> if (Error) {
> OS << "<decoding error>";
> return false;
> @@ -273,7 +277,7 @@ bool DWARFExpression::Operation::print(raw_ostream &OS, DIDumpOptions DumpOpts,
> (Opcode >= DW_OP_reg0 && Opcode <= DW_OP_reg31) ||
> Opcode == DW_OP_bregx || Opcode == DW_OP_regx ||
> Opcode == DW_OP_regval_type)
> - if (prettyPrintRegisterOp(U, OS, DumpOpts, Opcode, Operands))
> + if (prettyPrintRegisterOp(U, OS, DumpOpts, Opcode, Operands, RegInfo, isEH))
> return true;
>
> for (unsigned Operand = 0; Operand < 2; ++Operand) {
> @@ -319,14 +323,15 @@ bool DWARFExpression::Operation::print(raw_ostream &OS, DIDumpOptions DumpOpts,
> }
>
> void DWARFExpression::print(raw_ostream &OS, DIDumpOptions DumpOpts,
> - DWARFUnit *U) const {
> + const MCRegisterInfo *RegInfo, DWARFUnit *U,
> + bool IsEH) const {
> uint32_t EntryValExprSize = 0;
> uint64_t EntryValStartOffset = 0;
> if (Data.getData().empty())
> OS << "<empty>";
>
> for (auto &Op : *this) {
> - if (!Op.print(OS, DumpOpts, this, U)) {
> + if (!Op.print(OS, DumpOpts, this, RegInfo, U, IsEH)) {
> uint64_t FailOffset = Op.getEndOffset();
> while (FailOffset < Data.getData().size())
> OS << format(" %02x", Data.getU8(&FailOffset));
> @@ -397,11 +402,9 @@ struct PrintedExpr {
> PrintedExpr(ExprKind K = Address) : Kind(K) {}
> };
>
> -static bool printCompactDWARFExpr(
> - raw_ostream &OS, DWARFExpression::iterator I,
> - const DWARFExpression::iterator E,
> - std::function<StringRef(uint64_t RegNum, bool IsEH)> GetNameForDWARFReg =
> - nullptr) {
> +static bool printCompactDWARFExpr(raw_ostream &OS, DWARFExpression::iterator I,
> + const DWARFExpression::iterator E,
> + const MCRegisterInfo &MRI) {
> SmallVector<PrintedExpr, 4> Stack;
>
> while (I != E) {
> @@ -412,21 +415,25 @@ static bool printCompactDWARFExpr(
> // DW_OP_regx: A register, with the register num given as an operand.
> // Printed as the plain register name.
> uint64_t DwarfRegNum = Op.getRawOperand(0);
> - auto RegName = GetNameForDWARFReg(DwarfRegNum, false);
> - if (RegName.empty())
> + Optional<unsigned> LLVMRegNum = MRI.getLLVMRegNum(DwarfRegNum, false);
> + if (!LLVMRegNum) {
> + OS << "<unknown register " << DwarfRegNum << ">";
> return false;
> + }
> raw_svector_ostream S(Stack.emplace_back(PrintedExpr::Value).String);
> - S << RegName;
> + S << MRI.getName(*LLVMRegNum);
> break;
> }
> case dwarf::DW_OP_bregx: {
> int DwarfRegNum = Op.getRawOperand(0);
> int64_t Offset = Op.getRawOperand(1);
> - auto RegName = GetNameForDWARFReg(DwarfRegNum, false);
> - if (RegName.empty())
> + Optional<unsigned> LLVMRegNum = MRI.getLLVMRegNum(DwarfRegNum, false);
> + if (!LLVMRegNum) {
> + OS << "<unknown register " << DwarfRegNum << ">";
> return false;
> + }
> raw_svector_ostream S(Stack.emplace_back().String);
> - S << RegName;
> + S << MRI.getName(*LLVMRegNum);
> if (Offset)
> S << format("%+" PRId64, Offset);
> break;
> @@ -440,7 +447,7 @@ static bool printCompactDWARFExpr(
> ++I;
> raw_svector_ostream S(Stack.emplace_back().String);
> S << "entry(";
> - printCompactDWARFExpr(S, I, SubExprEnd, GetNameForDWARFReg);
> + printCompactDWARFExpr(S, I, SubExprEnd, MRI);
> S << ")";
> I = SubExprEnd;
> continue;
> @@ -457,20 +464,24 @@ static bool printCompactDWARFExpr(
> // DW_OP_reg<N>: A register, with the register num implied by the
> // opcode. Printed as the plain register name.
> uint64_t DwarfRegNum = Opcode - dwarf::DW_OP_reg0;
> - auto RegName = GetNameForDWARFReg(DwarfRegNum, false);
> - if (RegName.empty())
> + Optional<unsigned> LLVMRegNum = MRI.getLLVMRegNum(DwarfRegNum, false);
> + if (!LLVMRegNum) {
> + OS << "<unknown register " << DwarfRegNum << ">";
> return false;
> + }
> raw_svector_ostream S(Stack.emplace_back(PrintedExpr::Value).String);
> - S << RegName;
> + S << MRI.getName(*LLVMRegNum);
> } else if (Opcode >= dwarf::DW_OP_breg0 &&
> Opcode <= dwarf::DW_OP_breg31) {
> int DwarfRegNum = Opcode - dwarf::DW_OP_breg0;
> int64_t Offset = Op.getRawOperand(0);
> - auto RegName = GetNameForDWARFReg(DwarfRegNum, false);
> - if (RegName.empty())
> + Optional<unsigned> LLVMRegNum = MRI.getLLVMRegNum(DwarfRegNum, false);
> + if (!LLVMRegNum) {
> + OS << "<unknown register " << DwarfRegNum << ">";
> return false;
> + }
> raw_svector_ostream S(Stack.emplace_back().String);
> - S << RegName;
> + S << MRI.getName(*LLVMRegNum);
> if (Offset)
> S << format("%+" PRId64, Offset);
> } else {
> @@ -495,10 +506,8 @@ static bool printCompactDWARFExpr(
> return true;
> }
>
> -bool DWARFExpression::printCompact(
> - raw_ostream &OS,
> - std::function<StringRef(uint64_t RegNum, bool IsEH)> GetNameForDWARFReg) {
> - return printCompactDWARFExpr(OS, begin(), end(), GetNameForDWARFReg);
> +bool DWARFExpression::printCompact(raw_ostream &OS, const MCRegisterInfo &MRI) {
> + return printCompactDWARFExpr(OS, begin(), end(), MRI);
> }
>
> bool DWARFExpression::operator==(const DWARFExpression &RHS) const {
>
> diff --git a/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp b/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
> index c02481402045a..cc7f353330b1d 100644
> --- a/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
> +++ b/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
> @@ -18,8 +18,6 @@
> #include "llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h"
> #include "llvm/DebugInfo/DWARF/DWARFCompileUnit.h"
> #include "llvm/DebugInfo/DWARF/DWARFContext.h"
> -#include "llvm/MC/MCRegisterInfo.h"
> -#include "llvm/MC/TargetRegistry.h"
> #include "llvm/Object/Archive.h"
> #include "llvm/Object/MachOUniversal.h"
> #include "llvm/Object/ObjectFile.h"
> @@ -343,11 +341,9 @@ using HandlerFn = std::function<bool(ObjectFile &, DWARFContext &DICtx,
> const Twine &, raw_ostream &)>;
>
> /// Print only DIEs that have a certain name.
> -static bool filterByName(
> - const StringSet<> &Names, DWARFDie Die, StringRef NameRef, raw_ostream &OS,
> - std::function<StringRef(uint64_t RegNum, bool IsEH)> GetNameForDWARFReg) {
> +static bool filterByName(const StringSet<> &Names, DWARFDie Die,
> + StringRef NameRef, raw_ostream &OS) {
> DIDumpOptions DumpOpts = getDumpOpts(Die.getDwarfUnit()->getContext());
> - DumpOpts.GetNameForDWARFReg = GetNameForDWARFReg;
> std::string Name =
> (IgnoreCase && !UseRegex) ? NameRef.lower() : NameRef.str();
> if (UseRegex) {
> @@ -373,18 +369,17 @@ static bool filterByName(
> }
>
> /// Print only DIEs that have a certain name.
> -static void filterByName(
> - const StringSet<> &Names, DWARFContext::unit_iterator_range CUs,
> - raw_ostream &OS,
> - std::function<StringRef(uint64_t RegNum, bool IsEH)> GetNameForDWARFReg) {
> +static void filterByName(const StringSet<> &Names,
> + DWARFContext::unit_iterator_range CUs,
> + raw_ostream &OS) {
> for (const auto &CU : CUs)
> for (const auto &Entry : CU->dies()) {
> DWARFDie Die = {CU.get(), &Entry};
> if (const char *Name = Die.getName(DINameKind::ShortName))
> - if (filterByName(Names, Die, Name, OS, GetNameForDWARFReg))
> + if (filterByName(Names, Die, Name, OS))
> continue;
> if (const char *Name = Die.getName(DINameKind::LinkageName))
> - filterByName(Names, Die, Name, OS, GetNameForDWARFReg);
> + filterByName(Names, Die, Name, OS);
> }
> }
>
> @@ -428,9 +423,8 @@ static void getDies(DWARFContext &DICtx, const DWARFDebugNames &Accel,
> }
>
> /// Print only DIEs that have a certain name.
> -static void filterByAccelName(
> - ArrayRef<std::string> Names, DWARFContext &DICtx, raw_ostream &OS,
> - std::function<StringRef(uint64_t RegNum, bool IsEH)> GetNameForDWARFReg) {
> +static void filterByAccelName(ArrayRef<std::string> Names, DWARFContext &DICtx,
> + raw_ostream &OS) {
> SmallVector<DWARFDie, 4> Dies;
> for (const auto &Name : Names) {
> getDies(DICtx, DICtx.getAppleNames(), Name, Dies);
> @@ -442,7 +436,6 @@ static void filterByAccelName(
> Dies.erase(std::unique(Dies.begin(), Dies.end()), Dies.end());
>
> DIDumpOptions DumpOpts = getDumpOpts(DICtx);
> - DumpOpts.GetNameForDWARFReg = GetNameForDWARFReg;
> for (DWARFDie Die : Dies)
> Die.dump(OS, 0, DumpOpts);
> }
> @@ -559,41 +552,10 @@ static bool collectObjectSources(ObjectFile &Obj, DWARFContext &DICtx,
> return Result;
> }
>
> -static std::unique_ptr<MCRegisterInfo>
> -createRegInfo(const object::ObjectFile &Obj) {
> - std::unique_ptr<MCRegisterInfo> MCRegInfo;
> - Triple TT;
> - TT.setArch(Triple::ArchType(Obj.getArch()));
> - TT.setVendor(Triple::UnknownVendor);
> - TT.setOS(Triple::UnknownOS);
> - std::string TargetLookupError;
> - const Target *TheTarget =
> - TargetRegistry::lookupTarget(TT.str(), TargetLookupError);
> - if (!TargetLookupError.empty())
> - return nullptr;
> - MCRegInfo.reset(TheTarget->createMCRegInfo(TT.str()));
> - return MCRegInfo;
> -}
> -
> static bool dumpObjectFile(ObjectFile &Obj, DWARFContext &DICtx,
> const Twine &Filename, raw_ostream &OS) {
> -
> - auto MCRegInfo = createRegInfo(Obj);
> - if (!MCRegInfo)
> - logAllUnhandledErrors(createStringError(inconvertibleErrorCode(),
> - "Error in creating MCRegInfo"),
> - errs(), Filename.str() + ": ");
> -
> - auto GetRegName = [&MCRegInfo](uint64_t DwarfRegNum, bool IsEH) -> StringRef {
> - if (!MCRegInfo)
> - return {};
> - if (llvm::Optional<unsigned> LLVMRegNum =
> - MCRegInfo->getLLVMRegNum(DwarfRegNum, IsEH))
> - if (const char *RegName = MCRegInfo->getName(*LLVMRegNum))
> - return StringRef(RegName);
> - return {};
> - };
> -
> + logAllUnhandledErrors(DICtx.loadRegisterInfo(Obj), errs(),
> + Filename.str() + ": ");
> // The UUID dump already contains all the same information.
> if (!(DumpType & DIDT_UUID) || DumpType == DIDT_All)
> OS << Filename << ":\tfile format " << Obj.getFileFormatName() << '\n';
> @@ -608,21 +570,19 @@ static bool dumpObjectFile(ObjectFile &Obj, DWARFContext &DICtx,
> for (auto name : Name)
> Names.insert((IgnoreCase && !UseRegex) ? StringRef(name).lower() : name);
>
> - filterByName(Names, DICtx.normal_units(), OS, GetRegName);
> - filterByName(Names, DICtx.dwo_units(), OS, GetRegName);
> + filterByName(Names, DICtx.normal_units(), OS);
> + filterByName(Names, DICtx.dwo_units(), OS);
> return true;
> }
>
> // Handle the --find option and lower it to --debug-info=<offset>.
> if (!Find.empty()) {
> - filterByAccelName(Find, DICtx, OS, GetRegName);
> + filterByAccelName(Find, DICtx, OS);
> return true;
> }
>
> // Dump the complete DWARF structure.
> - auto DumpOpts = getDumpOpts(DICtx);
> - DumpOpts.GetNameForDWARFReg = GetRegName;
> - DICtx.dump(OS, DumpOpts, DumpOffsets);
> + DICtx.dump(OS, getDumpOpts(DICtx), DumpOffsets);
> return true;
> }
>
>
> diff --git a/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp b/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp
> index ba4625ad9b807..476954668b5ab 100644
> --- a/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp
> +++ b/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp
> @@ -285,6 +285,7 @@ static llvm::Error handleObjectFile(ObjectFile &Obj,
> if (!DICtx)
> return createStringError(std::errc::invalid_argument,
> "unable to create DWARF context");
> + logAllUnhandledErrors(DICtx->loadRegisterInfo(Obj), OS, "DwarfTransformer: ");
>
> // Make a DWARF transformer object and populate the ranges of the code
> // so we don't end up adding invalid functions to GSYM data.
>
> diff --git a/llvm/tools/llvm-objdump/SourcePrinter.cpp b/llvm/tools/llvm-objdump/SourcePrinter.cpp
> index 67ced1c3b77e0..c8ea6b543245a 100644
> --- a/llvm/tools/llvm-objdump/SourcePrinter.cpp
> +++ b/llvm/tools/llvm-objdump/SourcePrinter.cpp
> @@ -42,16 +42,7 @@ void LiveVariable::print(raw_ostream &OS, const MCRegisterInfo &MRI) const {
> DataExtractor Data({LocExpr.Expr.data(), LocExpr.Expr.size()},
> Unit->getContext().isLittleEndian(), 0);
> DWARFExpression Expression(Data, Unit->getAddressByteSize());
> -
> - auto GetRegName = [&MRI, &OS](uint64_t DwarfRegNum, bool IsEH) -> StringRef {
> - if (Optional<unsigned> LLVMRegNum = MRI.getLLVMRegNum(DwarfRegNum, IsEH))
> - if (const char *RegName = MRI.getName(*LLVMRegNum))
> - return StringRef(RegName);
> - OS << "<unknown register " << DwarfRegNum << ">";
> - return {};
> - };
> -
> - Expression.printCompact(OS, GetRegName);
> + Expression.printCompact(OS, MRI);
> }
>
> void LiveVariablePrinter::addVariable(DWARFDie FuncDie, DWARFDie VarDie) {
>
> diff --git a/llvm/tools/llvm-objdump/SourcePrinter.h b/llvm/tools/llvm-objdump/SourcePrinter.h
> index 6209bb0e43e40..29ef19c98c803 100644
> --- a/llvm/tools/llvm-objdump/SourcePrinter.h
> +++ b/llvm/tools/llvm-objdump/SourcePrinter.h
> @@ -13,7 +13,6 @@
> #include "llvm/ADT/StringSet.h"
> #include "llvm/DebugInfo/DWARF/DWARFContext.h"
> #include "llvm/DebugInfo/Symbolize/Symbolize.h"
> -#include "llvm/MC/MCRegisterInfo.h"
> #include "llvm/MC/MCSubtargetInfo.h"
> #include "llvm/Support/FormattedStream.h"
> #include <unordered_map>
>
> diff --git a/llvm/tools/llvm-readobj/DwarfCFIEHPrinter.h b/llvm/tools/llvm-readobj/DwarfCFIEHPrinter.h
> index 365a5985e48de..5dc947e024b92 100644
> --- a/llvm/tools/llvm-readobj/DwarfCFIEHPrinter.h
> +++ b/llvm/tools/llvm-readobj/DwarfCFIEHPrinter.h
> @@ -226,9 +226,8 @@ void PrinterContext<ELFT>::printEHFrame(const Elf_Shdr *EHFrameShdr) const {
> W.getOStream() << "\n";
> W.startLine() << "Program:\n";
> W.indent();
> - auto DumpOpts = DIDumpOptions();
> - DumpOpts.IsEH = true;
> - Entry.cfis().dump(W.getOStream(), DumpOpts, W.getIndentLevel());
> + Entry.cfis().dump(W.getOStream(), DIDumpOptions(), nullptr,
> + W.getIndentLevel());
> W.unindent();
> W.unindent();
> W.getOStream() << "\n";
>
> diff --git a/llvm/unittests/DebugInfo/DWARF/DWARFDebugFrameTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFDebugFrameTest.cpp
> index 785199c783059..dbc54e7bdb8ef 100644
> --- a/llvm/unittests/DebugInfo/DWARF/DWARFDebugFrameTest.cpp
> +++ b/llvm/unittests/DebugInfo/DWARF/DWARFDebugFrameTest.cpp
> @@ -41,9 +41,7 @@ void expectDumpResult(const dwarf::CIE &TestCIE, bool IsEH,
> StringRef ExpectedFirstLine) {
> std::string Output;
> raw_string_ostream OS(Output);
> - auto DumpOpts = DIDumpOptions();
> - DumpOpts.IsEH = IsEH;
> - TestCIE.dump(OS, DumpOpts);
> + TestCIE.dump(OS, DIDumpOptions(), /*MRI=*/nullptr, IsEH);
> OS.flush();
> StringRef FirstLine = StringRef(Output).split('\n').first;
> EXPECT_EQ(FirstLine, ExpectedFirstLine);
> @@ -53,9 +51,7 @@ void expectDumpResult(const dwarf::FDE &TestFDE, bool IsEH,
> StringRef ExpectedFirstLine) {
> std::string Output;
> raw_string_ostream OS(Output);
> - auto DumpOpts = DIDumpOptions();
> - DumpOpts.IsEH = IsEH;
> - TestFDE.dump(OS, DumpOpts);
> + TestFDE.dump(OS, DIDumpOptions(), /*MRI=*/nullptr, IsEH);
> OS.flush();
> StringRef FirstLine = StringRef(Output).split('\n').first;
> EXPECT_EQ(FirstLine, ExpectedFirstLine);
>
> diff --git a/llvm/unittests/DebugInfo/DWARF/DWARFExpressionCompactPrinterTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFExpressionCompactPrinterTest.cpp
> index b2382d426b0db..50b8b6b1c0d5b 100644
> --- a/llvm/unittests/DebugInfo/DWARF/DWARFExpressionCompactPrinterTest.cpp
> +++ b/llvm/unittests/DebugInfo/DWARF/DWARFExpressionCompactPrinterTest.cpp
> @@ -60,17 +60,7 @@ void DWARFExpressionCompactPrinterTest::TestExprPrinter(
> raw_string_ostream OS(Result);
> DataExtractor DE(ExprData, true, 8);
> DWARFExpression Expr(DE, 8);
> -
> - auto GetRegName = [&](uint64_t DwarfRegNum, bool IsEH) -> StringRef {
> - if (llvm::Optional<unsigned> LLVMRegNum =
> - this->MRI->getLLVMRegNum(DwarfRegNum, IsEH))
> - if (const char *RegName = this->MRI->getName(*LLVMRegNum))
> - return llvm::StringRef(RegName);
> - OS << "<unknown register " << DwarfRegNum << ">";
> - return {};
> - };
> -
> - Expr.printCompact(OS, GetRegName);
> + Expr.printCompact(OS, *MRI);
> EXPECT_EQ(OS.str(), Expected);
> }
>
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list