[llvm] a05a98a - [JITLink][AArch32] Implement ELF::R_ARM_ABS32 after we stopped skipping debug info sections

Stefan Gränitz via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 5 09:02:31 PDT 2023


Author: Stefan Gränitz
Date: 2023-04-05T18:02:12+02:00
New Revision: a05a98a230196f43f8f33f16feeae78167e18e11

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

LOG: [JITLink][AArch32] Implement ELF::R_ARM_ABS32 after we stopped skipping debug info sections

We create LinkGraph sections with NoAlloc lifetime now since f05ac803ffe76c7f4299a4e1288cc6bb8b098410
This means we do process debug info sections now with all their relocations. That's ok for the moment.

Added: 
    

Modified: 
    llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h
    llvm/lib/ExecutionEngine/JITLink/ELF_aarch32.cpp
    llvm/lib/ExecutionEngine/JITLink/aarch32.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h b/llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h
index 8488b10278771..c05c7ab2ad831 100644
--- a/llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h
+++ b/llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h
@@ -27,14 +27,18 @@ namespace aarch32 {
 enum EdgeKind_aarch32 : Edge::Kind {
 
   ///
-  /// Relocations of class Data
+  /// Relocations of class Data respect target endianness (unless otherwise
+  /// specified)
   ///
   FirstDataRelocation = Edge::FirstRelocation,
 
-  /// Plain 32-bit value relocation in target endianness
+  /// Relative 32-bit value relocation
   Data_Delta32 = FirstDataRelocation,
 
-  LastDataRelocation = Data_Delta32,
+  /// Absolute 32-bit value relocation
+  Data_Pointer32,
+
+  LastDataRelocation = Data_Pointer32,
 
   ///
   /// Relocations of class Arm (covers fixed-width 4-byte instruction subset)

diff  --git a/llvm/lib/ExecutionEngine/JITLink/ELF_aarch32.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_aarch32.cpp
index 8aa5a9f84fc3e..570e4dc95c036 100644
--- a/llvm/lib/ExecutionEngine/JITLink/ELF_aarch32.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/ELF_aarch32.cpp
@@ -34,6 +34,8 @@ namespace jitlink {
 /// Translate from ELF relocation type to JITLink-internal edge kind.
 Expected<aarch32::EdgeKind_aarch32> getJITLinkEdgeKind(uint32_t ELFType) {
   switch (ELFType) {
+  case ELF::R_ARM_ABS32:
+    return aarch32::Data_Pointer32;
   case ELF::R_ARM_REL32:
     return aarch32::Data_Delta32;
   case ELF::R_ARM_CALL:
@@ -58,6 +60,8 @@ Expected<uint32_t> getELFRelocationType(Edge::Kind Kind) {
   switch (static_cast<aarch32::EdgeKind_aarch32>(Kind)) {
   case aarch32::Data_Delta32:
     return ELF::R_ARM_REL32;
+  case aarch32::Data_Pointer32:
+    return ELF::R_ARM_ABS32;
   case aarch32::Arm_Call:
     return ELF::R_ARM_CALL;
   case aarch32::Thumb_Call:

diff  --git a/llvm/lib/ExecutionEngine/JITLink/aarch32.cpp b/llvm/lib/ExecutionEngine/JITLink/aarch32.cpp
index 28fa0b6d5895c..ffc3950cdec83 100644
--- a/llvm/lib/ExecutionEngine/JITLink/aarch32.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/aarch32.cpp
@@ -200,6 +200,7 @@ Expected<int64_t> readAddendData(LinkGraph &G, Block &B, const Edge &E) {
 
   switch (Kind) {
   case Data_Delta32:
+  case Data_Pointer32:
     return SignExtend64<32>(support::endian::read32(FixupPtr, Endian));
   default:
     return make_error<JITLinkError>(
@@ -303,6 +304,13 @@ Error applyFixupData(LinkGraph &G, Block &B, const Edge &E) {
     Write32(Value);
     return Error::success();
   }
+  case Data_Pointer32: {
+    int64_t Value = TargetAddress + Addend;
+    if (!isInt<32>(Value))
+      return makeTargetOutOfRangeError(G, B, E);
+    Write32(Value);
+    return Error::success();
+  }
   default:
     return make_error<JITLinkError>(
         "In graph " + G.getName() + ", section " + B.getSection().getName() +


        


More information about the llvm-commits mailing list