[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