[llvm-branch-commits] [llvm] ff3d385 - [Mips] Strip \x01 no-mangle prefix from R_MIPS_JALR symbol name (#219427)
Tobias Hieta via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Sep 25 01:23:45 PDT 2026
Author: yingopq
Date: 2026-09-25T10:23:16+02:00
New Revision: ff3d38593e6de5e0fd909bdcc52e9a5584f49215
URL: https://github.com/llvm/llvm-project/commit/ff3d38593e6de5e0fd909bdcc52e9a5584f49215
DIFF: https://github.com/llvm/llvm-project/commit/ff3d38593e6de5e0fd909bdcc52e9a5584f49215.diff
LOG: [Mips] Strip \x01 no-mangle prefix from R_MIPS_JALR symbol name (#219427)
R_MIPS_JALR relocation did not strip the \x01 no-mangle prefix, causing
linker to see two different symbols: my_target_sym and
\x01my_target_sym.
Use Mangler::getNameWithPrefix() to process the symbol name.
Fix #207470.
(cherry picked from commit f796b25647e378a02482ef383f2db45804d8fb72)
Added:
llvm/test/CodeGen/Mips/jalr-no-mangle.ll
Modified:
llvm/lib/Target/Mips/MipsAsmPrinter.cpp
llvm/lib/Target/Mips/MipsAsmPrinter.h
Removed:
################################################################################
diff --git a/llvm/lib/Target/Mips/MipsAsmPrinter.cpp b/llvm/lib/Target/Mips/MipsAsmPrinter.cpp
index 62fd0ef319e1a4..adda6154e15a54 100644
--- a/llvm/lib/Target/Mips/MipsAsmPrinter.cpp
+++ b/llvm/lib/Target/Mips/MipsAsmPrinter.cpp
@@ -147,21 +147,21 @@ void MipsAsmPrinter::emitPseudoIndirectBranch(MCStreamer &OutStreamer,
//
// This is an optimization hint for the linker which may then replace
// an indirect call with a direct branch.
-static void emitDirectiveRelocJalr(const MachineInstr &MI,
- MCContext &OutContext,
- TargetMachine &TM,
- MCStreamer &OutStreamer,
- const MipsSubtarget &Subtarget) {
+void MipsAsmPrinter::emitDirectiveRelocJalr(const MachineInstr &MI,
+ MCContext &OutContext,
+ TargetMachine &TM,
+ MCStreamer &OutStreamer,
+ const MipsSubtarget &Subtarget) {
for (const MachineOperand &MO :
llvm::drop_begin(MI.operands(), MI.getDesc().getNumOperands())) {
if (MO.isMCSymbol() && (MO.getTargetFlags() & MipsII::MO_JALR)) {
MCSymbol *Callee = MO.getMCSymbol();
if (Callee && !Callee->getName().empty()) {
+ MCSymbol *Sym = GetExternalSymbolSymbol(Callee->getName());
MCSymbol *OffsetLabel = OutContext.createTempSymbol();
const MCExpr *OffsetExpr =
MCSymbolRefExpr::create(OffsetLabel, OutContext);
- const MCExpr *CaleeExpr =
- MCSymbolRefExpr::create(Callee, OutContext);
+ const MCExpr *CaleeExpr = MCSymbolRefExpr::create(Sym, OutContext);
OutStreamer.emitRelocDirective(
*OffsetExpr,
Subtarget.inMicroMipsMode() ? "R_MICROMIPS_JALR" : "R_MIPS_JALR",
diff --git a/llvm/lib/Target/Mips/MipsAsmPrinter.h b/llvm/lib/Target/Mips/MipsAsmPrinter.h
index 6d45ad551db727..ae77c305f9703b 100644
--- a/llvm/lib/Target/Mips/MipsAsmPrinter.h
+++ b/llvm/lib/Target/Mips/MipsAsmPrinter.h
@@ -159,6 +159,9 @@ class LLVM_LIBRARY_VISIBILITY MipsAsmPrinter : public AsmPrinter {
void emitEndOfAsmFile(Module &M) override;
void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
void emitDebugValue(const MCExpr *Value, unsigned Size) const override;
+ void emitDirectiveRelocJalr(const MachineInstr &MI, MCContext &OutContext,
+ TargetMachine &TM, MCStreamer &OutStreamer,
+ const MipsSubtarget &Subtarget);
};
} // end namespace llvm
diff --git a/llvm/test/CodeGen/Mips/jalr-no-mangle.ll b/llvm/test/CodeGen/Mips/jalr-no-mangle.ll
new file mode 100644
index 00000000000000..573328dfab368b
--- /dev/null
+++ b/llvm/test/CodeGen/Mips/jalr-no-mangle.ll
@@ -0,0 +1,30 @@
+; RUN: llc -mtriple=mipsel-unknown-linux-gnu -relocation-model=pic < %s | FileCheck %s --check-prefix=ASM
+; RUN: llc -mtriple=mipsel-unknown-linux-gnu -relocation-model=pic -filetype=obj -o %t %s
+; RUN: llvm-readelf -r %t | FileCheck %s --check-prefix=RELOC
+; RUN: llvm-readelf -s %t | FileCheck %s --check-prefix=SYM
+
+declare i32 @"\01my_target_sym"()
+
+define i32 @caller() nounwind {
+; ASM-LABEL: caller:
+; ASM: # %bb.0: # %entry
+; ASM-NEXT: lui $2, %hi(_gp_disp)
+; ASM-NEXT: addiu $2, $2, %lo(_gp_disp)
+; ASM-NEXT: addiu $sp, $sp, -24
+; ASM-NEXT: sw $ra, 20($sp)
+; ASM-NEXT: addu $gp, $2, $25
+; ASM-NEXT: lw $25, %call16(my_target_sym)($gp)
+; ASM-NEXT: .reloc $tmp0, R_MIPS_JALR, my_target_sym
+; ASM-NEXT: $tmp0:
+; ASM-NEXT: jalr $25
+; ASM-NEXT: nop
+
+; RELOC: R_MIPS_JALR{{.*}}my_target_sym
+
+; SYM: UND{{.*}}my_target_sym
+; SYM-NOT: UND{{.*}}my_target_sym
+
+entry:
+ %call = call i32 @"\01my_target_sym"()
+ ret i32 %call
+}
More information about the llvm-branch-commits
mailing list