[llvm] [LoongArch] Add R_LARCH_MARK_LA relocation for la.abs (PR #161062)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Sep 28 01:49:12 PDT 2025
https://github.com/wangleiat created https://github.com/llvm/llvm-project/pull/161062
The relocation is used for edk2 builds.
>From 77e27c66f976a3b01772c5622a6502dd6a684fe3 Mon Sep 17 00:00:00 2001
From: wanglei <wanglei at loongson.cn>
Date: Sun, 28 Sep 2025 16:49:01 +0800
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
=?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.5-bogner
---
llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp | 4 ++++
llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp | 3 +++
llvm/lib/Target/LoongArch/AsmParser/LoongArchAsmParser.cpp | 4 +++-
.../Target/LoongArch/MCTargetDesc/LoongArchMCAsmInfo.cpp | 1 +
.../LoongArch/MCTargetDesc/LoongArchMCCodeEmitter.cpp | 6 ++++++
llvm/test/MC/LoongArch/Macros/macros-la.s | 1 +
6 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp
index 0dc97104610bb..b3f7a443d2238 100644
--- a/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp
@@ -919,6 +919,10 @@ class ELFLinkGraphBuilder_riscv : public ELFLinkGraphBuilder<ELFT> {
uint32_t Type = Rel.getType(false);
int64_t Addend = Rel.r_addend;
+ // ignore
+ if (Type == ELF::R_LARCH_MARK_LA)
+ return Error::success();
+
if (Type == ELF::R_RISCV_RELAX) {
if (BlockToFix.edges_empty())
return make_error<StringError>(
diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
index d6268037dea86..dd1b1d3b2e943 100644
--- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
+++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
@@ -781,6 +781,9 @@ void RuntimeDyldELF::resolveLoongArch64Relocation(const SectionEntry &Section,
default:
report_fatal_error("Relocation type not implemented yet!");
break;
+ case ELF::R_LARCH_MARK_LA:
+ // ignore
+ break;
case ELF::R_LARCH_32:
support::ulittle32_t::ref{TargetPtr} =
static_cast<uint32_t>(Value + Addend);
diff --git a/llvm/lib/Target/LoongArch/AsmParser/LoongArchAsmParser.cpp b/llvm/lib/Target/LoongArch/AsmParser/LoongArchAsmParser.cpp
index 5be4713b349ee..9b11201d0312d 100644
--- a/llvm/lib/Target/LoongArch/AsmParser/LoongArchAsmParser.cpp
+++ b/llvm/lib/Target/LoongArch/AsmParser/LoongArchAsmParser.cpp
@@ -957,8 +957,10 @@ void LoongArchAsmParser::emitLoadAddressAbs(MCInst &Inst, SMLoc IDLoc,
: Inst.getOperand(2).getExpr();
InstSeq Insts;
+ // To distinguish between la.abs and %abs_hi20, la.abs will generate
+ // R_LARCH_MARK_LA and R_LARCH_ABS_HI20 relocations.
Insts.push_back(
- LoongArchAsmParser::Inst(LoongArch::LU12I_W, ELF::R_LARCH_ABS_HI20));
+ LoongArchAsmParser::Inst(LoongArch::LU12I_W, ELF::R_LARCH_MARK_LA));
Insts.push_back(
LoongArchAsmParser::Inst(LoongArch::ORI, ELF::R_LARCH_ABS_LO12));
diff --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCAsmInfo.cpp b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCAsmInfo.cpp
index 0d7761777cb7d..8ecb62d0ea7bb 100644
--- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCAsmInfo.cpp
+++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCAsmInfo.cpp
@@ -32,6 +32,7 @@ static StringRef getLoongArchSpecifierName(uint16_t S) {
return "b16";
case ELF::R_LARCH_B21:
return "b21";
+ case ELF::R_LARCH_MARK_LA:
case ELF::R_LARCH_ABS_HI20:
return "abs_hi20";
case ELF::R_LARCH_ABS_LO12:
diff --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCCodeEmitter.cpp b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCCodeEmitter.cpp
index b7ead5e61ab81..603c6f77f05dc 100644
--- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCCodeEmitter.cpp
+++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCCodeEmitter.cpp
@@ -161,6 +161,12 @@ LoongArchMCCodeEmitter::getExprOpValue(const MCInst &MI, const MCOperand &MO,
case ELF::R_LARCH_B26:
FixupKind = LoongArch::fixup_loongarch_b26;
break;
+ case ELF::R_LARCH_MARK_LA:
+ // The R_LARCH_MARCH_LA is used for LoongArch edk2 builds.
+ Fixups.push_back(
+ MCFixup::create(0, MCConstantExpr::create(0, Ctx),
+ FirstLiteralRelocationKind + ELF::R_LARCH_MARK_LA));
+ [[fallthrough]];
case ELF::R_LARCH_ABS_HI20:
FixupKind = LoongArch::fixup_loongarch_abs_hi20;
break;
diff --git a/llvm/test/MC/LoongArch/Macros/macros-la.s b/llvm/test/MC/LoongArch/Macros/macros-la.s
index a732988ef1f1a..8022d5b038880 100644
--- a/llvm/test/MC/LoongArch/Macros/macros-la.s
+++ b/llvm/test/MC/LoongArch/Macros/macros-la.s
@@ -26,6 +26,7 @@ la.abs $a0, sym_abs
# ABS-NEXT: lu32i.d $a0, %abs64_lo20(sym_abs)
# ABS-NEXT: lu52i.d $a0, $a0, %abs64_hi12(sym_abs)
# ABS-EMPTY:
+# RELOC-NEXT: R_LARCH_MARK_LA - 0x0
# RELOC-NEXT: R_LARCH_ABS_HI20 sym_abs 0x0
# RELOC-NEXT: R_LARCH_ABS_LO12 sym_abs 0x0
# RELOC-NEXT: R_LARCH_ABS64_LO20 sym_abs 0x0
More information about the llvm-commits
mailing list