[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