[llvm] 279e808 - MC: Make mc-dump output compact
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sat Jun 28 22:31:43 PDT 2025
Author: Fangrui Song
Date: 2025-06-28T22:31:38-07:00
New Revision: 279e808b75119173a0b0ab9e4a48091e8dbe8193
URL: https://github.com/llvm/llvm-project/commit/279e808b75119173a0b0ab9e4a48091e8dbe8193
DIFF: https://github.com/llvm/llvm-project/commit/279e808b75119173a0b0ab9e4a48091e8dbe8193.diff
LOG: MC: Make mc-dump output compact
Remove unneeded details like "<" and ">". Reduce indentation.
Omit `this` address to simplify output comparison.
Add a -debug-only=mc-dump test.
While here, add fixup printing for MCRelaxableFragment.
Added:
llvm/test/MC/ELF/mc-dump.s
Modified:
llvm/lib/MC/MCAssembler.cpp
llvm/lib/MC/MCFragment.cpp
llvm/lib/MC/MCSection.cpp
llvm/test/DebugInfo/X86/debug-line-in-one-fragment.ll
Removed:
################################################################################
diff --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp
index 3de3e421ef1ac..a331ec8fe0eb4 100644
--- a/llvm/lib/MC/MCAssembler.cpp
+++ b/llvm/lib/MC/MCAssembler.cpp
@@ -1274,30 +1274,26 @@ void MCAssembler::flushPendingErrors() const {
LLVM_DUMP_METHOD void MCAssembler::dump() const{
raw_ostream &OS = errs();
- OS << "<MCAssembler\n";
- OS << " Sections:[\n ";
+ OS << "Sections:[";
bool First = true;
for (const MCSection &Sec : *this) {
- if (First)
- First = false;
- else
- OS << ",\n ";
+ OS << '\n';
Sec.dump();
}
- OS << "],\n";
- OS << " Symbols:[";
+ OS << "\n]\n";
+ OS << "Symbols:[\n";
First = true;
for (const MCSymbol &Sym : symbols()) {
if (First)
First = false;
else
- OS << ",\n ";
+ OS << "\n";
OS << "(";
Sym.dump();
OS << ", Index:" << Sym.getIndex() << ", ";
OS << ")";
}
- OS << "]>\n";
+ OS << "\n]\n";
}
#endif
diff --git a/llvm/lib/MC/MCFragment.cpp b/llvm/lib/MC/MCFragment.cpp
index 32c1c80478626..64e2e01c7ddba 100644
--- a/llvm/lib/MC/MCFragment.cpp
+++ b/llvm/lib/MC/MCFragment.cpp
@@ -79,79 +79,65 @@ const MCSymbol *MCFragment::getAtom() const {
return cast<MCSectionMachO>(Parent)->getAtom(LayoutOrder);
}
-// Debugging methods
-
-namespace llvm {
-
-raw_ostream &operator<<(raw_ostream &OS, const MCFixup &AF) {
- OS << "<MCFixup" << " Offset:" << AF.getOffset() << " Value:";
- AF.getValue()->print(OS, nullptr);
- OS << " Kind:" << AF.getKind() << ">";
- return OS;
-}
-
-} // end namespace llvm
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
LLVM_DUMP_METHOD void MCFragment::dump() const {
raw_ostream &OS = errs();
- OS << "<";
+ OS << Offset << ' ';
switch (getKind()) {
- case MCFragment::FT_Align: OS << "MCAlignFragment"; break;
- case MCFragment::FT_Data: OS << "MCDataFragment"; break;
- case MCFragment::FT_Fill: OS << "MCFillFragment"; break;
- case MCFragment::FT_Nops:
- OS << "MCFNopsFragment";
- break;
- case MCFragment::FT_Relaxable: OS << "MCRelaxableFragment"; break;
- case MCFragment::FT_Org: OS << "MCOrgFragment"; break;
- case MCFragment::FT_Dwarf: OS << "MCDwarfFragment"; break;
- case MCFragment::FT_DwarfFrame: OS << "MCDwarfCallFrameFragment"; break;
- case MCFragment::FT_LEB: OS << "MCLEBFragment"; break;
- case MCFragment::FT_BoundaryAlign: OS<<"MCBoundaryAlignFragment"; break;
- case MCFragment::FT_SymbolId: OS << "MCSymbolIdFragment"; break;
- case MCFragment::FT_CVInlineLines: OS << "MCCVInlineLineTableFragment"; break;
- case MCFragment::FT_CVDefRange: OS << "MCCVDefRangeTableFragment"; break;
- case MCFragment::FT_PseudoProbe:
- OS << "MCPseudoProbe";
- break;
+ // clang-format off
+ case MCFragment::FT_Align: OS << "Align"; break;
+ case MCFragment::FT_Data: OS << "Data"; break;
+ case MCFragment::FT_Fill: OS << "Fill"; break;
+ case MCFragment::FT_Nops: OS << "Nops"; break;
+ case MCFragment::FT_Relaxable: OS << "Relaxable"; break;
+ case MCFragment::FT_Org: OS << "Org"; break;
+ case MCFragment::FT_Dwarf: OS << "Dwarf"; break;
+ case MCFragment::FT_DwarfFrame: OS << "DwarfCallFrame"; break;
+ case MCFragment::FT_LEB: OS << "LEB"; break;
+ case MCFragment::FT_BoundaryAlign: OS<<"BoundaryAlign"; break;
+ case MCFragment::FT_SymbolId: OS << "SymbolId"; break;
+ case MCFragment::FT_CVInlineLines: OS << "CVInlineLineTable"; break;
+ case MCFragment::FT_CVDefRange: OS << "CVDefRangeTable"; break;
+ case MCFragment::FT_PseudoProbe: OS << "PseudoProbe"; break;
+ // clang-format on
}
- OS << "<MCFragment " << (const void *)this << " LayoutOrder:" << LayoutOrder
- << " Offset:" << Offset << " HasInstructions:" << hasInstructions();
if (const auto *EF = dyn_cast<MCEncodedFragment>(this))
- OS << " BundlePadding:" << static_cast<unsigned>(EF->getBundlePadding());
- OS << ">";
+ if (auto Pad = static_cast<unsigned>(EF->getBundlePadding()))
+ OS << " BundlePadding:" << Pad;
+
+ auto printFixups = [&](llvm::ArrayRef<MCFixup> Fixups) {
+ if (Fixups.empty())
+ return;
+ for (auto [I, F] : llvm::enumerate(Fixups)) {
+ OS << "\n Fixup Offset:" << F.getOffset() << " Value:";
+ F.getValue()->print(OS, nullptr);
+ OS << " Kind:" << F.getKind();
+ }
+ };
switch (getKind()) {
case MCFragment::FT_Align: {
const auto *AF = cast<MCAlignFragment>(this);
+ OS << " Align:" << AF->getAlignment().value() << " Value:" << AF->getValue()
+ << " ValueSize:" << AF->getValueSize()
+ << " MaxBytesToEmit:" << AF->getMaxBytesToEmit();
if (AF->hasEmitNops())
- OS << " (emit nops)";
- OS << "\n ";
- OS << " Alignment:" << AF->getAlignment().value()
- << " Value:" << AF->getValue() << " ValueSize:" << AF->getValueSize()
- << " MaxBytesToEmit:" << AF->getMaxBytesToEmit() << ">";
+ OS << " Nops";
break;
}
case MCFragment::FT_Data: {
- const auto *DF = cast<MCDataFragment>(this);
- OS << "\n ";
- OS << " Contents:[";
- const SmallVectorImpl<char> &Contents = DF->getContents();
+ const auto *F = cast<MCDataFragment>(this);
+ const SmallVectorImpl<char> &Contents = F->getContents();
+ OS << " Size:" << Contents.size() << " [";
for (unsigned i = 0, e = Contents.size(); i != e; ++i) {
if (i) OS << ",";
- OS << hexdigit((Contents[i] >> 4) & 0xF) << hexdigit(Contents[i] & 0xF);
- }
- OS << "] (" << Contents.size() << " bytes)";
-
- if (DF->getFixups().size()) {
- OS << ",\n ";
- OS << " Fixups:[";
- interleave(DF->getFixups(), OS, ",\n ");
- OS << "]";
+ OS << format("%02x", uint8_t(Contents[i]));
}
+ OS << ']';
+ printFixups(F->getFixups());
break;
}
case MCFragment::FT_Fill: {
@@ -170,15 +156,13 @@ LLVM_DUMP_METHOD void MCFragment::dump() const {
}
case MCFragment::FT_Relaxable: {
const auto *F = cast<MCRelaxableFragment>(this);
- OS << "\n ";
- OS << " Inst:";
+ OS << " Size:" << F->getContents().size() << ' ';
F->getInst().dump_pretty(OS);
- OS << " (" << F->getContents().size() << " bytes)";
+ printFixups(F->getFixups());
break;
}
case MCFragment::FT_Org: {
const auto *OF = cast<MCOrgFragment>(this);
- OS << "\n ";
OS << " Offset:";
OF->getOffset().print(OS, nullptr);
OS << " Value:" << static_cast<unsigned>(OF->getValue());
@@ -186,7 +170,6 @@ LLVM_DUMP_METHOD void MCFragment::dump() const {
}
case MCFragment::FT_Dwarf: {
const auto *OF = cast<MCDwarfLineAddrFragment>(this);
- OS << "\n ";
OS << " AddrDelta:";
OF->getAddrDelta().print(OS, nullptr);
OS << " LineDelta:" << OF->getLineDelta();
@@ -194,14 +177,12 @@ LLVM_DUMP_METHOD void MCFragment::dump() const {
}
case MCFragment::FT_DwarfFrame: {
const auto *CF = cast<MCDwarfCallFrameFragment>(this);
- OS << "\n ";
OS << " AddrDelta:";
CF->getAddrDelta().print(OS, nullptr);
break;
}
case MCFragment::FT_LEB: {
const auto *LF = cast<MCLEBFragment>(this);
- OS << "\n ";
OS << " Value:";
LF->getValue().print(OS, nullptr);
OS << " Signed:" << LF->isSigned();
@@ -209,7 +190,6 @@ LLVM_DUMP_METHOD void MCFragment::dump() const {
}
case MCFragment::FT_BoundaryAlign: {
const auto *BF = cast<MCBoundaryAlignFragment>(this);
- OS << "\n ";
OS << " BoundarySize:" << BF->getAlignment().value()
<< " LastFragment:" << BF->getLastFragment()
<< " Size:" << BF->getSize();
@@ -217,19 +197,17 @@ LLVM_DUMP_METHOD void MCFragment::dump() const {
}
case MCFragment::FT_SymbolId: {
const auto *F = cast<MCSymbolIdFragment>(this);
- OS << "\n ";
OS << " Sym:" << F->getSymbol();
break;
}
case MCFragment::FT_CVInlineLines: {
const auto *F = cast<MCCVInlineLineTableFragment>(this);
- OS << "\n ";
OS << " Sym:" << *F->getFnStartSym();
break;
}
case MCFragment::FT_CVDefRange: {
const auto *F = cast<MCCVDefRangeFragment>(this);
- OS << "\n ";
+ OS << "\n ";
for (std::pair<const MCSymbol *, const MCSymbol *> RangeStartEnd :
F->getRanges()) {
OS << " RangeStart:" << RangeStartEnd.first;
@@ -239,12 +217,10 @@ LLVM_DUMP_METHOD void MCFragment::dump() const {
}
case MCFragment::FT_PseudoProbe: {
const auto *OF = cast<MCPseudoProbeAddrFragment>(this);
- OS << "\n ";
OS << " AddrDelta:";
OF->getAddrDelta().print(OS, nullptr);
break;
}
}
- OS << ">";
}
#endif
diff --git a/llvm/lib/MC/MCSection.cpp b/llvm/lib/MC/MCSection.cpp
index b61738d8837a2..4637ce93c3fe5 100644
--- a/llvm/lib/MC/MCSection.cpp
+++ b/llvm/lib/MC/MCSection.cpp
@@ -70,16 +70,10 @@ StringRef MCSection::getVirtualSectionKind() const { return "virtual"; }
LLVM_DUMP_METHOD void MCSection::dump() const {
raw_ostream &OS = errs();
- OS << "<MCSection Name:" << getName();
- OS << " Fragments:[\n ";
- bool First = true;
+ OS << "MCSection Name:" << getName();
for (auto &F : *this) {
- if (First)
- First = false;
- else
- OS << ",\n ";
+ OS << '\n';
F.dump();
}
- OS << "]>";
}
#endif
diff --git a/llvm/test/DebugInfo/X86/debug-line-in-one-fragment.ll b/llvm/test/DebugInfo/X86/debug-line-in-one-fragment.ll
index 16c9e12accbc0..776674d53533d 100644
--- a/llvm/test/DebugInfo/X86/debug-line-in-one-fragment.ll
+++ b/llvm/test/DebugInfo/X86/debug-line-in-one-fragment.ll
@@ -43,15 +43,13 @@
;; single data fragment. (Check that we see one data fragment, then no more
;; fragments until the next section).
;
-; FRAGMENTS: <MCSection Name:.debug_line Fragments:[
-; FRAGMENTS-NEXT: <MCDataFragment<MCFragment
-; FRAGMENTS-NEXT: Contents:[
-; FRAGMENTS-NEXT: Fixups:[
+; FRAGMENTS: Section Name:.debug_line
+; FRAGMENTS-NEXT: Data
+; FRAGMENTS-NEXT: Fixup
;
-; FRAGMENTS-NOT: MCDataFragment
-; FRAGMENTS-NOT: MCFragment
+; FRAGMENTS-NOT: Data
;
-; FRAGMENTS: <MCSection Name:.debug_line_str Fragments:[
+; FRAGMENTS: Section Name:.debug_line_str
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
diff --git a/llvm/test/MC/ELF/mc-dump.s b/llvm/test/MC/ELF/mc-dump.s
new file mode 100644
index 0000000000000..e7b018f9dad25
--- /dev/null
+++ b/llvm/test/MC/ELF/mc-dump.s
@@ -0,0 +1,40 @@
+# REQUIRES: asserts
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t -debug-only=mc-dump 2>&1 | FileCheck %s --match-full-lines --strict-whitespace
+
+#CHECK-LABEL:assembler backend - pre-layout
+# CHECK:MCSection Name:.text
+#CHECK-LABEL:assembler backend - final-layout
+# CHECK:Sections:[
+# CHECK-NEXT:MCSection Name:.text
+# CHECK-NEXT:0 Data Size:0 []
+# CHECK-NEXT:0 Align Align:4 Value:0 ValueSize:1 MaxBytesToEmit:4 Nops
+# CHECK-NEXT:0 Data Size:0 []
+# CHECK-NEXT:0 Org Offset:3 Value:0
+# CHECK-NEXT:3 Relaxable Size:2 <MCInst #1996 <MCOperand Expr:.Ltmp1>>
+# CHECK-NEXT: Fixup Offset:1 Value:.Ltmp1-1 Kind:4006
+# CHECK-NEXT:5 Data Size:16 [48,8b,04,25,00,00,00,00,48,8b,04,25,00,00,00,00]
+# CHECK-NEXT: Fixup Offset:4 Value:f0@<variant 11> Kind:4021
+# CHECK-NEXT: Fixup Offset:12 Value:f1@<variant 11> Kind:4021
+# CHECK-NEXT:MCSection Name:.data
+# CHECK-NEXT:0 Data Size:0 []
+# CHECK-NEXT:0 Align Align:4 Value:0 ValueSize:1 MaxBytesToEmit:4
+# CHECK-NEXT:0 Data Size:4 [01,00,00,00]
+# CHECK-NEXT:4 Fill Value:0 ValueSize:1 NumValues:1
+# CHECK-NEXT:5 LEB Value:.Ltmp1-.Ltmp0 Signed:0
+# CHECK-NEXT:]
+# CHECK-NEXT:Symbols:[
+# CHECK-NEXT:(.text, Index:0, )
+# CHECK-NEXT:(.Ltmp0, Index:0, )
+
+0:
+.org 3
+jmp 1f
+movq f0 at GOTPCREL, %rax
+movq f1 at GOTPCREL, %rax
+1:
+
+.data
+.p2align 2
+.long 1
+.space 1
+.uleb128 1b-0b
More information about the llvm-commits
mailing list