[llvm-branch-commits] [llvm] [JITLink][LoongArch] Refactor jump stub to support LoongArch32 (PR #175355)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sat Jan 10 08:55:26 PST 2026
https://github.com/heiher created https://github.com/llvm/llvm-project/pull/175355
None
>From 1a825290d5cde70b5121015d1962eff7621f6bdc Mon Sep 17 00:00:00 2001
From: WANG Rui <wangrui at loongson.cn>
Date: Wed, 31 Dec 2025 10:14:32 +0800
Subject: [PATCH] [JITLink][LoongArch] Refactor jump stub to support
LoongArch32
---
.../llvm/ExecutionEngine/JITLink/loongarch.h | 11 ++++++++---
llvm/lib/ExecutionEngine/JITLink/loongarch.cpp | 4 ++--
.../ExecutionEngine/JITLink/StubsTests.cpp | 16 ++++++++--------
3 files changed, 18 insertions(+), 13 deletions(-)
diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/loongarch.h b/llvm/include/llvm/ExecutionEngine/JITLink/loongarch.h
index cb3c1919d65d1..1d9038a6fe2d8 100644
--- a/llvm/include/llvm/ExecutionEngine/JITLink/loongarch.h
+++ b/llvm/include/llvm/ExecutionEngine/JITLink/loongarch.h
@@ -447,9 +447,14 @@ inline Symbol &createAnonymousPointerJumpStub(LinkGraph &G,
Symbol &PointerSymbol) {
Block &StubContentBlock = G.createContentBlock(
StubSection, getStubBlockContent(G), orc::ExecutorAddr(), 4, 0);
- StubContentBlock.addEdge(Page20, 0, PointerSymbol, 0);
- StubContentBlock.addEdge(PageOffset12, 4, PointerSymbol, 0);
- return G.addAnonymousSymbol(StubContentBlock, 0, StubEntrySize, true, false);
+ Symbol &StubSymbol =
+ G.addAnonymousSymbol(StubContentBlock, 0, StubEntrySize, true, false);
+ StubContentBlock.addEdge(G.getPointerSize() == 8 ? Page20 : PCAdd20, 0,
+ PointerSymbol, 0);
+ StubContentBlock.addEdge(G.getPointerSize() == 8 ? PageOffset12 : PCAdd12, 4,
+ G.getPointerSize() == 8 ? PointerSymbol : StubSymbol,
+ 0);
+ return StubSymbol;
}
/// Global Offset Table Builder.
diff --git a/llvm/lib/ExecutionEngine/JITLink/loongarch.cpp b/llvm/lib/ExecutionEngine/JITLink/loongarch.cpp
index 3c37c934fcd53..d6f0d8db0efb4 100644
--- a/llvm/lib/ExecutionEngine/JITLink/loongarch.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/loongarch.cpp
@@ -28,8 +28,8 @@ const uint8_t LA64StubContent[StubEntrySize] = {
};
const uint8_t LA32StubContent[StubEntrySize] = {
- 0x14, 0x00, 0x00, 0x1a, // pcalau12i $t8, %page20(imm)
- 0x94, 0x02, 0x80, 0x28, // ld.w $t8, $t8, %pageoff12(imm)
+ 0x14, 0x00, 0x00, 0x1c, // pcaddu12i $t8, %pcadd20(imm)
+ 0x94, 0x02, 0x80, 0x28, // ld.w $t8, $t8, %pcadd12(.Lpcadd_hi)
0x80, 0x02, 0x00, 0x4c // jr $t8
};
diff --git a/llvm/unittests/ExecutionEngine/JITLink/StubsTests.cpp b/llvm/unittests/ExecutionEngine/JITLink/StubsTests.cpp
index 643ea6754f2d1..fe03f27ec1abf 100644
--- a/llvm/unittests/ExecutionEngine/JITLink/StubsTests.cpp
+++ b/llvm/unittests/ExecutionEngine/JITLink/StubsTests.cpp
@@ -119,11 +119,11 @@ TEST(StubsTest, StubsGeneration_loongarch32) {
0x14,
0x00,
0x00,
- 0x1a, // pcalau12i $t8, %page20(imm)
+ 0x1c, // pcaddu12i $t8, %pcadd20(imm)
static_cast<char>(0x94),
0x02,
static_cast<char>(0x80),
- 0x28, // ld.d $t8, $t8, %pageoff12(imm)
+ 0x28, // ld.w $t8, $t8, %pcadd12(.Lpcadd_hi)
static_cast<char>(0x80),
0x02,
0x00,
@@ -137,12 +137,12 @@ TEST(StubsTest, StubsGeneration_loongarch32) {
EXPECT_EQ(std::distance(StubSym.getBlock().edges().begin(),
StubSym.getBlock().edges().end()),
2U);
- auto &PageHighEdge = *StubSym.getBlock().edges().begin();
- auto &PageLowEdge = *++StubSym.getBlock().edges().begin();
- EXPECT_EQ(PageHighEdge.getKind(), loongarch::Page20);
- EXPECT_EQ(&PageHighEdge.getTarget(), &PointerSym);
- EXPECT_EQ(PageLowEdge.getKind(), loongarch::PageOffset12);
- EXPECT_EQ(&PageLowEdge.getTarget(), &PointerSym);
+ auto &HighEdge = *StubSym.getBlock().edges().begin();
+ auto &LowEdge = *++StubSym.getBlock().edges().begin();
+ EXPECT_EQ(HighEdge.getKind(), loongarch::PCAdd20);
+ EXPECT_EQ(&HighEdge.getTarget(), &PointerSym);
+ EXPECT_EQ(LowEdge.getKind(), loongarch::PCAdd12);
+ EXPECT_EQ(&LowEdge.getTarget(), &StubSym);
EXPECT_EQ(StubSym.getBlock().getContent(),
ArrayRef<char>(PointerJumpStubContent));
}
More information about the llvm-branch-commits
mailing list