[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