[llvm-branch-commits] [llvm] 47bafb7 - [SPARC] Preserve inline asm relocation modifiers (#219971)
Tobias Hieta via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Sep 2 02:13:43 PDT 2026
Author: Daniel Cederman
Date: 2026-09-02T11:13:32+02:00
New Revision: 47bafb75220225344cfe236ff0fce54cadc57405
URL: https://github.com/llvm/llvm-project/commit/47bafb75220225344cfe236ff0fce54cadc57405
DIFF: https://github.com/llvm/llvm-project/commit/47bafb75220225344cfe236ff0fce54cadc57405.diff
LOG: [SPARC] Preserve inline asm relocation modifiers (#219971)
Make sure that inline assembly that references a global symbol gets the
correct relocation.
sethi %hi(fsr_storage), %i0
st %fsr, [%i0+fsr_storage]
ld [%i0+fsr_storage], %i0
-->
sethi %hi(fsr_storage), %i0
st %fsr, [%i0+%lo(fsr_storage)]
ld [%i0+%lo(fsr_storage)], %i0
(cherry picked from commit cf584bda4c3434086f7fdfebd1c0ce8ecb9423bb)
Added:
llvm/test/CodeGen/SPARC/inlineasm-global-memory.ll
Modified:
llvm/lib/Target/Sparc/SparcAsmPrinter.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/Sparc/SparcAsmPrinter.cpp b/llvm/lib/Target/Sparc/SparcAsmPrinter.cpp
index 84768bc450703..2979d78c57d63 100644
--- a/llvm/lib/Target/Sparc/SparcAsmPrinter.cpp
+++ b/llvm/lib/Target/Sparc/SparcAsmPrinter.cpp
@@ -66,6 +66,7 @@ class SparcAsmPrinter : public AsmPrinter {
const char *ExtraCode, raw_ostream &O) override;
bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
const char *ExtraCode, raw_ostream &O) override;
+ void PrintSymbolOperand(const MachineOperand &MO, raw_ostream &O) override;
void LowerGETPCXAndEmitMCInsts(const MachineInstr *MI,
const MCSubtargetInfo &STI);
@@ -417,6 +418,17 @@ void SparcAsmPrinter::printOperand(const MachineInstr *MI, int opNum,
}
}
+void SparcAsmPrinter::PrintSymbolOperand(const MachineOperand &MO,
+ raw_ostream &O) {
+ const unsigned RelType = MO.getTargetFlags();
+ StringRef Specifier = Sparc::getSpecifierName(RelType);
+ if (!Specifier.empty())
+ O << '%' << Specifier << '(';
+ AsmPrinter::PrintSymbolOperand(MO, O);
+ if (!Specifier.empty())
+ O << ')';
+}
+
void SparcAsmPrinter::printMemOperand(const MachineInstr *MI, int opNum,
raw_ostream &O) {
printOperand(MI, opNum, O);
diff --git a/llvm/test/CodeGen/SPARC/inlineasm-global-memory.ll b/llvm/test/CodeGen/SPARC/inlineasm-global-memory.ll
new file mode 100644
index 0000000000000..e27c06c19e6ba
--- /dev/null
+++ b/llvm/test/CodeGen/SPARC/inlineasm-global-memory.ll
@@ -0,0 +1,14 @@
+; RUN: llc -mtriple=sparc < %s | FileCheck %s
+
+ at fsr_storage = global i32 0, align 4
+
+; CHECK-LABEL: get_fsr:
+; CHECK: sethi %hi(fsr_storage), %[[HI:[gilo][0-7]]]
+; CHECK: st %fsr, [%[[HI]]+%lo(fsr_storage)]
+; CHECK-NEXT: ld [%[[HI]]+%lo(fsr_storage)], %{{[gilo][0-7]}}
+
+define i32 @get_fsr() {
+entry:
+ %fsr = call i32 asm sideeffect "st\09%fsr, $1\0A\09ld\09$1, $0", "=r,*m"(ptr elementtype(i32) @fsr_storage)
+ ret i32 %fsr
+}
More information about the llvm-branch-commits
mailing list