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 + +@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 +} _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
