aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFangrui Song <i@maskray.me>2023-12-07 18:34:36 -0800
committerFangrui Song <i@maskray.me>2023-12-07 18:34:36 -0800
commit8275dc97483347b88a2fa9067446dfb9d7d7f72e (patch)
tree451e753961b5eeca45d063733a94dc84f7ee89a7
parent4162a9bca42a1152cdf4ae92ff7b90351c10f332 (diff)
downloadllvm-8275dc97483347b88a2fa9067446dfb9d7d7f72e.zip
llvm-8275dc97483347b88a2fa9067446dfb9d7d7f72e.tar.gz
llvm-8275dc97483347b88a2fa9067446dfb9d7d7f72e.tar.bz2
[MC] .reloc: register used symbols
When `sym` in `.reloc ., BFD_RELOC_NONE, sym` is not referenced elsewhere, `sym` is not in the symbol table and the relocation references the null symbol. Visit the expression to fix the issue.
-rw-r--r--llvm/lib/MC/MCELFStreamer.cpp1
-rw-r--r--llvm/lib/MC/MCObjectStreamer.cpp5
-rw-r--r--llvm/test/MC/ELF/reloc-directive.s4
3 files changed, 7 insertions, 3 deletions
diff --git a/llvm/lib/MC/MCELFStreamer.cpp b/llvm/lib/MC/MCELFStreamer.cpp
index 653ff4e..e541090 100644
--- a/llvm/lib/MC/MCELFStreamer.cpp
+++ b/llvm/lib/MC/MCELFStreamer.cpp
@@ -501,7 +501,6 @@ void MCELFStreamer::finalizeCGProfileEntry(const MCSymbolRefExpr *&SRE,
SRE->getLoc());
}
const MCConstantExpr *MCOffset = MCConstantExpr::create(Offset, getContext());
- MCObjectStreamer::visitUsedExpr(*SRE);
if (std::optional<std::pair<bool, std::string>> Err =
MCObjectStreamer::emitRelocDirective(
*MCOffset, "BFD_RELOC_NONE", SRE, SRE->getLoc(),
diff --git a/llvm/lib/MC/MCObjectStreamer.cpp b/llvm/lib/MC/MCObjectStreamer.cpp
index 3cf7b43..d11ccfb 100644
--- a/llvm/lib/MC/MCObjectStreamer.cpp
+++ b/llvm/lib/MC/MCObjectStreamer.cpp
@@ -797,8 +797,9 @@ MCObjectStreamer::emitRelocDirective(const MCExpr &Offset, StringRef Name,
return std::make_pair(true, std::string("unknown relocation name"));
MCFixupKind Kind = *MaybeKind;
-
- if (Expr == nullptr)
+ if (Expr)
+ visitUsedExpr(*Expr);
+ else
Expr =
MCSymbolRefExpr::create(getContext().createTempSymbol(), getContext());
diff --git a/llvm/test/MC/ELF/reloc-directive.s b/llvm/test/MC/ELF/reloc-directive.s
index 59d7ace..a4658f9 100644
--- a/llvm/test/MC/ELF/reloc-directive.s
+++ b/llvm/test/MC/ELF/reloc-directive.s
@@ -10,11 +10,14 @@
# ASM-NEXT: .Ltmp2:
# ASM-NEXT: .reloc 2+.Ltmp2, R_X86_64_NONE, foo
# ASM-NEXT: .reloc (1+foo)+3, R_X86_64_NONE, data+1
+# ASM-NEXT: .Ltmp3:
+# ASM-NEXT: .reloc .Ltmp3, BFD_RELOC_NONE, unused
# CHECK: 0x2 R_X86_64_NONE foo 0x0
# CHECK-NEXT: 0x0 R_X86_64_NONE foo 0x0
# CHECK-NEXT: 0x3 R_X86_64_NONE foo 0x0
# CHECK-NEXT: 0x4 R_X86_64_NONE data 0x1
+# CHECK-NEXT: 0x1 R_X86_64_NONE unused 0x0
.text
.globl foo
@@ -24,6 +27,7 @@ foo:
.reloc .-1, R_X86_64_NONE, foo
.reloc 2+., R_X86_64_NONE, foo
.reloc 1+foo+3, R_X86_64_NONE, data+1
+ .reloc ., BFD_RELOC_NONE, unused
.data
.globl data