[Lldb-commits] [lldb] 4283cfd - Revert "Remove the dependency between lib/DebugInfoDWARF and MC."
Shubham Sandeep Rastogi via lldb-commits
lldb-commits at lists.llvm.org
Wed Dec 14 18:32:24 PST 2022
Author: Shubham Sandeep Rastogi
Date: 2022-12-14T18:32:18-08:00
New Revision: 4283cfdc1116725d951660a01104cf4cd98e8453
URL: https://github.com/llvm/llvm-project/commit/4283cfdc1116725d951660a01104cf4cd98e8453
DIFF: https://github.com/llvm/llvm-project/commit/4283cfdc1116725d951660a01104cf4cd98e8453.diff
LOG: Revert "Remove the dependency between lib/DebugInfoDWARF and MC."
This reverts commit 7dde94251e1c9e4634f5d51d41f2d4a191258fb3.
Because of test failures:
lldb-shell :: SymbolFile/DWARF/x86/DW_AT_loclists_base.s
lldb-shell :: SymbolFile/DWARF/x86/debug_loc.s
lldb-shell :: SymbolFile/DWARF/x86/debug_loc_and_loclists.s
lldb-shell :: SymbolFile/DWARF/x86/debug_loclists-dwo.s
lldb-shell :: SymbolFile/DWARF/x86/debug_loclists-dwp.s
lldb-shell :: SymbolFile/DWARF/x86/dwp.s
lldb-shell :: SymbolFile/DWARF/x86/unused-inlined-params.test
lldb-shell :: SymbolFile/NativePDB/inline_sites.test
lldb-shell :: SymbolFile/NativePDB/local-variables-registers.s
lldb-shell :: SymbolFile/NativePDB/nested-blocks-same-address.s
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/lib/DebugInfo/LogicalView/Readers/LVELFReader.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 6842c7a11bcdb..d6029aa137092 100644
--- a/lldb/source/Expression/DWARFExpression.cpp
+++ b/lldb/source/Expression/DWARFExpression.cpp
@@ -70,7 +70,8 @@ void DWARFExpression::UpdateValue(uint64_t const_value,
void DWARFExpression::DumpLocation(Stream *s, lldb::DescriptionLevel level,
ABI *abi) const {
llvm::DWARFExpression(m_data.GetAsLLVM(), m_data.GetAddressByteSize())
- .print(s->AsRawOstream(), llvm::DIDumpOptions(), 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 eace7c4f32466..51301e4ee43fb 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 6866a6614b56b..afc2d5176ebcb 100644
--- a/llvm/include/llvm/DebugInfo/DIContext.h
+++ b/llvm/include/llvm/DebugInfo/DIContext.h
@@ -199,9 +199,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 5dbec262f3028..5dc000163e7d9 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 8e1e61910696f..6f25964ef42b1 100644
--- a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugFrame.h
+++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugFrame.h
@@ -164,7 +164,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;
};
@@ -222,7 +222,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(); }
@@ -303,7 +303,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;
};
@@ -348,7 +348,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).
@@ -454,8 +454,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); }
@@ -523,6 +523,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;
};
@@ -547,7 +548,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;
@@ -603,7 +605,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
@@ -642,7 +645,8 @@ class FDE : public FrameEntry {
uint64_t getAddressRange() const { return AddressRange; }
std::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; }
@@ -684,7 +688,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,
std::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 5a82e7bd6289a..74638fc180b54 100644
--- a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h
+++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h
@@ -66,8 +66,9 @@ class DWARFLocationTable {
/// updated to point past the end of the current list).
bool dumpLocationList(uint64_t *Offset, raw_ostream &OS,
std::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, std::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,
std::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 7fde32711745d..6e5a16f635c82 100644
--- a/llvm/include/llvm/DebugInfo/DWARF/DWARFExpression.h
+++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFExpression.h
@@ -93,7 +93,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);
@@ -146,16 +147,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,
+ 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);
@@ -165,7 +165,8 @@ class DWARFExpression {
static bool prettyPrintRegisterOp(DWARFUnit *U, raw_ostream &OS,
DIDumpOptions DumpOpts, uint8_t Opcode,
- const uint64_t Operands[2]);
+ const uint64_t Operands[2],
+ const MCRegisterInfo *MRI, bool isEH);
private:
DataExtractor Data;
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 184eeff0ad9c4..d7118b835a0da 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,
std::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=*/std::nullopt, Obj,
+ Loc.dumpLocationList(&Offset, OS, /*BaseAddr=*/std::nullopt, 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,12 +450,12 @@ void DWARFContext::dump(
if (*Off) {
uint64_t Offset = **Off;
Loc.dumpLocationList(&Offset, OS,
- /*BaseAddr=*/std::nullopt, *DObj, nullptr,
- LLDumpOpts,
- /*Indent=*/0);
+ /*BaseAddr=*/std::nullopt, 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);
}
}
@@ -460,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());
}
@@ -469,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());
}
@@ -2017,6 +2020,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 1b71f4b7dab70..53512135cf78b 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp
@@ -13,6 +13,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 (std::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,
std::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 00c2823cee0af..58c3889f2cc44 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp
@@ -111,19 +111,20 @@ 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, std::optional<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 {
DWARFLocationInterpreter Interp(
BaseAddr, [U](uint32_t Index) -> std::optional<SectionedAddress> {
if (U)
@@ -156,7 +157,7 @@ bool DWARFLocationTable::dumpLocationList(
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 +183,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,
std::optional<uint64_t> DumpOffset) const {
auto BaseAddr = std::nullopt;
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 +199,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 +386,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 +400,8 @@ void DWARFDebugLoclists::dumpRange(uint64_t StartOffset, uint64_t Size,
OS << Separator;
Separator = "\n";
- CanContinue = dumpLocationList(&Offset, OS, /*BaseAddr=*/std::nullopt, Obj,
- nullptr, DumpOpts, /*Indent=*/12);
+ CanContinue = dumpLocationList(&Offset, OS, /*BaseAddr=*/std::nullopt, 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 26cef8713df11..93e7a7db855e8 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
@@ -74,6 +74,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) {
@@ -84,8 +85,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,
@@ -95,11 +97,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 523dee486d2d6..061b656bf9aaa 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>
@@ -224,11 +225,10 @@ static void prettyPrintBaseTypeRef(DWARFUnit *U, raw_ostream &OS,
}
}
-bool DWARFExpression::prettyPrintRegisterOp(DWARFUnit *U, raw_ostream &OS,
- DIDumpOptions DumpOpts,
- uint8_t Opcode,
- const uint64_t Operands[2]) {
- if (!DumpOpts.GetNameForDWARFReg)
+bool DWARFExpression::prettyPrintRegisterOp(
+ DWARFUnit *U, raw_ostream &OS, DIDumpOptions DumpOpts, uint8_t Opcode,
+ const uint64_t Operands[2], const MCRegisterInfo *MRI, bool isEH) {
+ if (!MRI)
return false;
uint64_t DwarfRegNum;
@@ -242,17 +242,19 @@ bool DWARFExpression::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 (std::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;
@@ -260,7 +262,8 @@ bool DWARFExpression::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;
@@ -274,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) {
@@ -320,15 +323,15 @@ bool DWARFExpression::Operation::print(raw_ostream &OS, DIDumpOptions DumpOpts,
}
void DWARFExpression::print(raw_ostream &OS, DIDumpOptions DumpOpts,
- DWARFUnit *U, bool IsEH) 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) {
- DumpOpts.IsEH = IsEH;
- 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));
@@ -399,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) {
@@ -414,21 +415,27 @@ 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())
+ std::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())
+ std::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;
@@ -442,7 +449,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;
@@ -459,20 +466,26 @@ 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())
+ std::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())
+ std::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 {
@@ -497,10 +510,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/lib/DebugInfo/LogicalView/Readers/LVELFReader.cpp b/llvm/lib/DebugInfo/LogicalView/Readers/LVELFReader.cpp
index 1eac529ebab1f..37bd53576483e 100644
--- a/llvm/lib/DebugInfo/LogicalView/Readers/LVELFReader.cpp
+++ b/llvm/lib/DebugInfo/LogicalView/Readers/LVELFReader.cpp
@@ -770,19 +770,9 @@ std::string LVELFReader::getRegisterName(LVSmall Opcode, uint64_t Operands[2]) {
std::string string;
raw_string_ostream Stream(string);
DIDumpOptions DumpOpts;
- auto *MCRegInfo = MRI.get();
- auto GetRegName = [&MCRegInfo](uint64_t DwarfRegNum, bool IsEH) -> StringRef {
- if (!MCRegInfo)
- return {};
- if (std::optional<unsigned> LLVMRegNum =
- MCRegInfo->getLLVMRegNum(DwarfRegNum, IsEH))
- if (const char *RegName = MCRegInfo->getName(*LLVMRegNum))
- return StringRef(RegName);
- return {};
- };
- DumpOpts.GetNameForDWARFReg = GetRegName;
DWARFExpression::prettyPrintRegisterOp(/*U=*/nullptr, Stream, DumpOpts,
- Opcode, Operands);
+ Opcode, Operands, MRI.get(),
+ /*isEH=*/false);
return Stream.str();
}
diff --git a/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp b/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
index c1511297131d3..59e736183e571 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"
@@ -342,11 +340,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) {
@@ -372,18 +368,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);
}
}
@@ -427,9 +422,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);
@@ -441,7 +435,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);
}
@@ -558,41 +551,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 (std::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';
@@ -607,21 +569,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 943c056e6709e..ac16ae8b5b7c6 100644
--- a/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp
+++ b/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp
@@ -286,6 +286,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 6736cbc9ad5f8..d0b80fde43869 100644
--- a/llvm/tools/llvm-objdump/SourcePrinter.cpp
+++ b/llvm/tools/llvm-objdump/SourcePrinter.cpp
@@ -42,17 +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 (std::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 d06138154392d..155b799b22f95 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 e0c59189bf841..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 (std::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);
}
More information about the lldb-commits
mailing list