[llvm] [JITLink] Add x86_64::Delta8 edge kind, ELF::R_X86_64_PC8 support (PR #95869)

Maksim Panchenko via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 17 22:18:56 PDT 2024


https://github.com/maksfb updated https://github.com/llvm/llvm-project/pull/95869

>From 2903899c2e6bd726b032d9e0d5b2a5ae744ba6aa Mon Sep 17 00:00:00 2001
From: Maksim Panchenko <maks at fb.com>
Date: Mon, 17 Jun 2024 14:24:29 -0700
Subject: [PATCH 1/3] [JITLink] Add x86_64::Delta8 edge kind, ELF::R_X86_64_PC8
 support

Add support for ELF::R_X86_64_PC8 relocation via new x86_64::Delta8 edge
kind.
---
 .../llvm/ExecutionEngine/JITLink/x86_64.h     | 22 +++++++++++++++++++
 .../ExecutionEngine/JITLink/ELF_x86_64.cpp    |  3 +++
 llvm/lib/ExecutionEngine/JITLink/x86_64.cpp   |  2 ++
 .../JITLink/x86-64/ELF_R_X86_64_PC8.s         | 19 ++++++++++++++++
 4 files changed, 46 insertions(+)
 create mode 100644 llvm/test/ExecutionEngine/JITLink/x86-64/ELF_R_X86_64_PC8.s

diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/x86_64.h b/llvm/include/llvm/ExecutionEngine/JITLink/x86_64.h
index e072ee1575de8..e6f72bcae91a6 100644
--- a/llvm/include/llvm/ExecutionEngine/JITLink/x86_64.h
+++ b/llvm/include/llvm/ExecutionEngine/JITLink/x86_64.h
@@ -95,6 +95,19 @@ enum EdgeKind_x86_64 : Edge::Kind {
   ///
   Delta32,
 
+  /// An 8-bit delta.
+  ///
+  /// Delta from the fixup to the target.
+  ///
+  /// Fixup expression:
+  ///   Fixup <- Target - Fixup + Addend : int64
+  ///
+  /// Errors:
+  ///   - The result of the fixup expression must fit into an int8, otherwise
+  ///     an out-of-range error will be returned.
+  ///
+  Delta8,
+
   /// A 64-bit negative delta.
   ///
   /// Delta from target back to the fixup.
@@ -473,6 +486,15 @@ inline Error applyFixup(LinkGraph &G, Block &B, const Edge &E,
     break;
   }
 
+  case Delta8: {
+    int64_t Value = E.getTarget().getAddress() - FixupAddress + E.getAddend();
+    if (LLVM_LIKELY(isInt<8>(Value)))
+      *(little32_t *)FixupPtr = Value;
+    else
+      return makeTargetOutOfRangeError(G, B, E);
+    break;
+  }
+
   case NegDelta64: {
     int64_t Value = FixupAddress - E.getTarget().getAddress() + E.getAddend();
     *(little64_t *)FixupPtr = Value;
diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp
index 52dd83d9040fe..b27a1a19acae0 100644
--- a/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp
@@ -153,6 +153,9 @@ class ELFLinkGraphBuilder_x86_64 : public ELFLinkGraphBuilder<object::ELF64LE> {
     Edge::Kind Kind = Edge::Invalid;
 
     switch (ELFReloc) {
+    case ELF::R_X86_64_PC8:
+      Kind = x86_64::Delta8;
+      break;
     case ELF::R_X86_64_PC32:
     case ELF::R_X86_64_GOTPC32:
       Kind = x86_64::Delta32;
diff --git a/llvm/lib/ExecutionEngine/JITLink/x86_64.cpp b/llvm/lib/ExecutionEngine/JITLink/x86_64.cpp
index 273ac7b372a7f..9f7ece8ffbbb3 100644
--- a/llvm/lib/ExecutionEngine/JITLink/x86_64.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/x86_64.cpp
@@ -34,6 +34,8 @@ const char *getEdgeKindName(Edge::Kind K) {
     return "Delta64";
   case Delta32:
     return "Delta32";
+  case Delta8:
+    return "Delta8";
   case NegDelta64:
     return "NegDelta64";
   case NegDelta32:
diff --git a/llvm/test/ExecutionEngine/JITLink/x86-64/ELF_R_X86_64_PC8.s b/llvm/test/ExecutionEngine/JITLink/x86-64/ELF_R_X86_64_PC8.s
new file mode 100644
index 0000000000000..cac6dd9c612b6
--- /dev/null
+++ b/llvm/test/ExecutionEngine/JITLink/x86-64/ELF_R_X86_64_PC8.s
@@ -0,0 +1,19 @@
+# RUN: llvm-mc -triple=x86_64-unknown-linux -position-independent \
+# RUN:     -filetype=obj -o %t.o %s
+# RUN: llvm-jitlink -noexec %t.o
+#
+# Check R_X86_64_PC8 handling.
+
+	.text
+	.globl	main
+	.type	main, at function
+main:
+	xorl	%eax, %eax
+	retq
+	.size	main, .-main
+
+	.type	P, at object
+	.globl	P
+P:
+	.byte main-. # Generate R_X86_64_PC8 relocation.
+  .size P, .-P

>From 0352a3401ad73ae503786bbc2b7328f4481558c3 Mon Sep 17 00:00:00 2001
From: Maksim Panchenko <maks at fb.com>
Date: Mon, 17 Jun 2024 19:10:29 -0700
Subject: [PATCH 2/3] fixup! [JITLink] Add x86_64::Delta8 edge kind,
 ELF::R_X86_64_PC8 support

---
 llvm/include/llvm/ExecutionEngine/JITLink/x86_64.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/x86_64.h b/llvm/include/llvm/ExecutionEngine/JITLink/x86_64.h
index e6f72bcae91a6..1bc9f44fdc904 100644
--- a/llvm/include/llvm/ExecutionEngine/JITLink/x86_64.h
+++ b/llvm/include/llvm/ExecutionEngine/JITLink/x86_64.h
@@ -489,7 +489,7 @@ inline Error applyFixup(LinkGraph &G, Block &B, const Edge &E,
   case Delta8: {
     int64_t Value = E.getTarget().getAddress() - FixupAddress + E.getAddend();
     if (LLVM_LIKELY(isInt<8>(Value)))
-      *(little32_t *)FixupPtr = Value;
+      *FixupPtr = Value;
     else
       return makeTargetOutOfRangeError(G, B, E);
     break;

>From 4492831b0ad485b51c3af1cf16799c39fc3045d0 Mon Sep 17 00:00:00 2001
From: Maksim Panchenko <maks at fb.com>
Date: Mon, 17 Jun 2024 22:18:40 -0700
Subject: [PATCH 3/3] fixup! [JITLink] Add x86_64::Delta8 edge kind,
 ELF::R_X86_64_PC8 support

---
 llvm/include/llvm/ExecutionEngine/JITLink/x86_64.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/x86_64.h b/llvm/include/llvm/ExecutionEngine/JITLink/x86_64.h
index 1bc9f44fdc904..2f475ed884a7e 100644
--- a/llvm/include/llvm/ExecutionEngine/JITLink/x86_64.h
+++ b/llvm/include/llvm/ExecutionEngine/JITLink/x86_64.h
@@ -87,7 +87,7 @@ enum EdgeKind_x86_64 : Edge::Kind {
   /// Delta from the fixup to the target.
   ///
   /// Fixup expression:
-  ///   Fixup <- Target - Fixup + Addend : int64
+  ///   Fixup <- Target - Fixup + Addend : int32
   ///
   /// Errors:
   ///   - The result of the fixup expression must fit into an int32, otherwise
@@ -100,7 +100,7 @@ enum EdgeKind_x86_64 : Edge::Kind {
   /// Delta from the fixup to the target.
   ///
   /// Fixup expression:
-  ///   Fixup <- Target - Fixup + Addend : int64
+  ///   Fixup <- Target - Fixup + Addend : int8
   ///
   /// Errors:
   ///   - The result of the fixup expression must fit into an int8, otherwise



More information about the llvm-commits mailing list