[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