Author: hev
Date: 2026-01-22T08:27:36Z
New Revision: 3dafa81323f98ca427e32943a1f665a90a4b72fa

URL: 
https://github.com/llvm/llvm-project/commit/3dafa81323f98ca427e32943a1f665a90a4b72fa
DIFF: 
https://github.com/llvm/llvm-project/commit/3dafa81323f98ca427e32943a1f665a90a4b72fa.diff

LOG: [JITLink][LoongArch] Refactor jump stub to support LA32R (#175355)

(cherry picked from commit 29419c48d518e6e9082ec9a3c5dbba309ec25ebe)

Added: 
    

Modified: 
    llvm/include/llvm/ExecutionEngine/JITLink/loongarch.h
    llvm/lib/ExecutionEngine/JITLink/loongarch.cpp
    llvm/unittests/ExecutionEngine/JITLink/StubsTests.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/ExecutionEngine/JITLink/loongarch.h 
b/llvm/include/llvm/ExecutionEngine/JITLink/loongarch.h
index 2da2a4201ae16..50a0ded54c3e3 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 : PCAddHi20, 0,
+                           PointerSymbol, 0);
+  StubContentBlock.addEdge(
+      G.getPointerSize() == 8 ? PageOffset12 : PCAddLo12, 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 69609c1b9c982..221dd45a7eff0 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..8473c71ef0ce3 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::PCAddHi20);
+  EXPECT_EQ(&HighEdge.getTarget(), &PointerSym);
+  EXPECT_EQ(LowEdge.getKind(), loongarch::PCAddLo12);
+  EXPECT_EQ(&LowEdge.getTarget(), &StubSym);
   EXPECT_EQ(StubSym.getBlock().getContent(),
             ArrayRef<char>(PointerJumpStubContent));
 }


        
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to