[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