[llvm] b54337d - MC: Enhance mc-dump output

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Sun Jun 29 00:11:29 PDT 2025


Author: Fangrui Song
Date: 2025-06-29T00:11:24-07:00
New Revision: b54337d76cc71dc5c807909c679ded74248ac092

URL: https://github.com/llvm/llvm-project/commit/b54337d76cc71dc5c807909c679ded74248ac092
DIFF: https://github.com/llvm/llvm-project/commit/b54337d76cc71dc5c807909c679ded74248ac092.diff

LOG: MC: Enhance mc-dump output

* Make pre-layout to -debug-only=mc-dump-pre. This output is not useful
  for most debugging needs.
* Print fragment-associated symbols. Make it easier to locate relevant
  fragments.
* Print the LinkerRelaxable flag.

Added: 
    llvm/test/MC/RISCV/Relocations/mc-dump.s

Modified: 
    llvm/include/llvm/MC/MCSection.h
    llvm/lib/MC/MCAssembler.cpp
    llvm/lib/MC/MCFragment.cpp
    llvm/lib/MC/MCSection.cpp
    llvm/test/MC/ELF/mc-dump.s

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/MC/MCSection.h b/llvm/include/llvm/MC/MCSection.h
index 7a94a7d65613d..a4e391dfb03ea 100644
--- a/llvm/include/llvm/MC/MCSection.h
+++ b/llvm/include/llvm/MC/MCSection.h
@@ -13,6 +13,7 @@
 #ifndef LLVM_MC_MCSECTION_H
 #define LLVM_MC_MCSECTION_H
 
+#include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/MC/MCFragment.h"
 #include "llvm/MC/SectionKind.h"
@@ -182,7 +183,8 @@ class LLVM_ABI MCSection {
   iterator begin() const { return iterator(CurFragList->Head); }
   iterator end() const { return {}; }
 
-  void dump() const;
+  void dump(DenseMap<const MCFragment *, SmallVector<const MCSymbol *, 0>>
+                *FragToSyms = nullptr) const;
 
   virtual void printSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
                                     raw_ostream &OS,

diff  --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp
index 1d6b1f0302bf6..bd2242af23f7c 100644
--- a/llvm/lib/MC/MCAssembler.cpp
+++ b/llvm/lib/MC/MCAssembler.cpp
@@ -812,9 +812,10 @@ void MCAssembler::writeSectionData(raw_ostream &OS,
 
 void MCAssembler::layout() {
   assert(getBackendPtr() && "Expected assembler backend");
-  DEBUG_WITH_TYPE("mc-dump", {
-      errs() << "assembler backend - pre-layout\n--\n";
-      dump(); });
+  DEBUG_WITH_TYPE("mc-dump-pre", {
+    errs() << "assembler backend - pre-layout\n--\n";
+    dump();
+  });
 
   // Assign section ordinals.
   unsigned SectionIndex = 0;
@@ -1269,11 +1270,19 @@ void MCAssembler::flushPendingErrors() const {
 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
 LLVM_DUMP_METHOD void MCAssembler::dump() const{
   raw_ostream &OS = errs();
+  DenseMap<const MCFragment *, SmallVector<const MCSymbol *, 0>> FragToSyms;
+  // Scan symbols and build a map of fragments to their corresponding symbols.
+  // For variable symbols, we don't want to call their getFragment, which might
+  // modify `Fragment`.
+  for (const MCSymbol &Sym : symbols())
+    if (!Sym.isVariable())
+      if (auto *F = Sym.getFragment())
+        FragToSyms.try_emplace(F).first->second.push_back(&Sym);
 
   OS << "Sections:[";
   for (const MCSection &Sec : *this) {
     OS << '\n';
-    Sec.dump();
+    Sec.dump(&FragToSyms);
   }
   OS << "\n]\n";
 }

diff  --git a/llvm/lib/MC/MCFragment.cpp b/llvm/lib/MC/MCFragment.cpp
index 64e2e01c7ddba..d8db55c9a5f5d 100644
--- a/llvm/lib/MC/MCFragment.cpp
+++ b/llvm/lib/MC/MCFragment.cpp
@@ -112,7 +112,7 @@ LLVM_DUMP_METHOD void MCFragment::dump() const {
     if (Fixups.empty())
       return;
     for (auto [I, F] : llvm::enumerate(Fixups)) {
-      OS << "\n  Fixup Offset:" << F.getOffset() << " Value:";
+      OS << "\n  Fixup @" << F.getOffset() << " Value:";
       F.getValue()->print(OS, nullptr);
       OS << " Kind:" << F.getKind();
     }
@@ -130,6 +130,8 @@ LLVM_DUMP_METHOD void MCFragment::dump() const {
   }
   case MCFragment::FT_Data:  {
     const auto *F = cast<MCDataFragment>(this);
+    if (F->isLinkerRelaxable())
+      OS << " LinkerRelaxable";
     const SmallVectorImpl<char> &Contents = F->getContents();
     OS << " Size:" << Contents.size() << " [";
     for (unsigned i = 0, e = Contents.size(); i != e; ++i) {

diff  --git a/llvm/lib/MC/MCSection.cpp b/llvm/lib/MC/MCSection.cpp
index 4637ce93c3fe5..9aad34e0d32ad 100644
--- a/llvm/lib/MC/MCSection.cpp
+++ b/llvm/lib/MC/MCSection.cpp
@@ -67,13 +67,25 @@ void MCSection::setBundleLockState(BundleLockStateType NewState) {
 StringRef MCSection::getVirtualSectionKind() const { return "virtual"; }
 
 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
-LLVM_DUMP_METHOD void MCSection::dump() const {
+LLVM_DUMP_METHOD void MCSection::dump(
+    DenseMap<const MCFragment *, SmallVector<const MCSymbol *, 0>> *FragToSyms)
+    const {
   raw_ostream &OS = errs();
 
   OS << "MCSection Name:" << getName();
   for (auto &F : *this) {
     OS << '\n';
     F.dump();
+    if (!FragToSyms)
+      continue;
+    auto It = FragToSyms->find(&F);
+    if (It == FragToSyms->end())
+      continue;
+    for (auto *Sym : It->second) {
+      OS << "\n  Symbol @" << Sym->getOffset() << ' ' << Sym->getName();
+      if (Sym->isTemporary())
+        OS << " Temporary";
+    }
   }
 }
 #endif

diff  --git a/llvm/test/MC/ELF/mc-dump.s b/llvm/test/MC/ELF/mc-dump.s
index 1b101a3ea863a..7e53731efbfc2 100644
--- a/llvm/test/MC/ELF/mc-dump.s
+++ b/llvm/test/MC/ELF/mc-dump.s
@@ -1,5 +1,5 @@
 # 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
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t -debug-only=mc-dump-pre,mc-dump 2>&1 | FileCheck %s --match-full-lines --strict-whitespace
 
 #CHECK-LABEL:assembler backend - pre-layout
 #      CHECK:MCSection Name:.text
@@ -7,31 +7,36 @@
 #      CHECK:Sections:[
 # CHECK-NEXT:MCSection Name:.text
 # CHECK-NEXT:0 Data Size:0 []
+# CHECK-NEXT:  Symbol @0 .text
 # CHECK-NEXT:0 Align Align:4 Value:0 ValueSize:1 MaxBytesToEmit:4 Nops
 # CHECK-NEXT:0 Data Size:0 []
+# CHECK-NEXT:  Symbol @0 _start
 # 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:3 Relaxable Size:2 <MCInst #1996 <MCOperand Expr:.Ltmp0>>
+# CHECK-NEXT:  Fixup @1 Value:.Ltmp0-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:  Fixup @4 Value:f0@<variant 11> Kind:4021
+# CHECK-NEXT:  Fixup @12 Value:_start@<variant 11> Kind:4021
+# CHECK-NEXT:  Symbol @16 .Ltmp0 Temporary
 # CHECK-NEXT:MCSection Name:.data
 # CHECK-NEXT:0 Data Size:0 []
+# CHECK-NEXT:  Symbol @0 .data
 # 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:5 LEB Value:.Ltmp0-_start Signed:0
 # CHECK-NEXT:]
 
-0:
+_start:
+var = _start
 .org 3
 jmp 1f
 movq f0 at GOTPCREL, %rax
-movq f1 at GOTPCREL, %rax
+movq _start at GOTPCREL, %rax
 1:
 
 .data
 .p2align 2
 .long 1
 .space 1
-.uleb128 1b-0b
+.uleb128 1b-_start

diff  --git a/llvm/test/MC/RISCV/Relocations/mc-dump.s b/llvm/test/MC/RISCV/Relocations/mc-dump.s
new file mode 100644
index 0000000000000..2ebd249fcf49b
--- /dev/null
+++ b/llvm/test/MC/RISCV/Relocations/mc-dump.s
@@ -0,0 +1,20 @@
+# REQUIRES: asserts
+# RUN: llvm-mc -filetype=obj --triple=riscv64 --mattr=+relax %s -debug-only=mc-dump -o /dev/null 2>&1 | FileCheck %s
+
+#      CHECK:Sections:[
+# CHECK-NEXT:MCSection Name:.text
+# CHECK-NEXT:0 Data Size:0 []
+# CHECK-NEXT:  Symbol @0 .text
+# CHECK-NEXT:0 Align Align:4 Value:0 ValueSize:1 MaxBytesToEmit:4 Nops
+# CHECK-NEXT:0 Data LinkerRelaxable Size:8 [97,00,00,00,e7,80,00,00]
+# CHECK-NEXT:  Fixup @0 Value:specifier(19,ext) Kind:4026
+# CHECK-NEXT:  Symbol @0 $x
+# CHECK-NEXT:8 Align Align:8 Value:0 ValueSize:1 MaxBytesToEmit:8 Nops
+# CHECK-NEXT:12 Data Size:4 [13,05,30,00]
+# CHECK-NEXT:16 Align Align:8 Value:0 ValueSize:1 MaxBytesToEmit:8 Nops
+# CHECK-NEXT:]
+
+call ext
+.p2align 3
+li x10, 3
+.p2align 3


        


More information about the llvm-commits mailing list