[llvm] 5d5183b - [JITLink][ELF][AArch64] Implement R_AARCH64_PREL32 and R_AARCH64_PREL64.

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 8 12:14:11 PDT 2022


Author: Sunho Kim
Date: 2022-06-08T12:14:05-07:00
New Revision: 5d5183b1983822e6c4b9dc1156cf4bd73efd4786

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

LOG: [JITLink][ELF][AArch64] Implement R_AARCH64_PREL32 and R_AARCH64_PREL64.

This patch implements R_AARCH64_PREL64 and R_AARCH64_PREL32 relocations that is
used in eh frame pointers. The test case utlizes obj2yaml tool to create an
artifical eh frame that generates related relocation types.

Reviewed By: lhames

Differential Revision: https://reviews.llvm.org/D127058

Added: 
    llvm/test/ExecutionEngine/JITLink/AArch64/ELF_aarch64_ehframe.test

Modified: 
    llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp
index 02615a502250e..7711e93f0e79d 100644
--- a/llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp
@@ -57,6 +57,8 @@ class ELFLinkGraphBuilder_aarch64 : public ELFLinkGraphBuilder<ELFT> {
     ELFLdSt64Abs12,
     ELFLdSt128Abs12,
     ELFAbs64,
+    ELFPrel32,
+    ELFPrel64,
     ELFAdrGOTPage21,
     ELFLd64GOTLo12,
   };
@@ -83,6 +85,10 @@ class ELFLinkGraphBuilder_aarch64 : public ELFLinkGraphBuilder<ELFT> {
       return ELFLdSt128Abs12;
     case ELF::R_AARCH64_ABS64:
       return ELFAbs64;
+    case ELF::R_AARCH64_PREL32:
+      return ELFPrel32;
+    case ELF::R_AARCH64_PREL64:
+      return ELFPrel64;
     case ELF::R_AARCH64_ADR_GOT_PAGE:
       return ELFAdrGOTPage21;
     case ELF::R_AARCH64_LD64_GOT_LO12_NC:
@@ -214,6 +220,14 @@ class ELFLinkGraphBuilder_aarch64 : public ELFLinkGraphBuilder<ELFT> {
       Kind = aarch64::Pointer64;
       break;
     }
+    case ELFPrel32: {
+      Kind = aarch64::Delta32;
+      break;
+    }
+    case ELFPrel64: {
+      Kind = aarch64::Delta64;
+      break;
+    }
     case ELFAdrGOTPage21: {
       Kind = aarch64::GOTPage21;
       break;
@@ -256,6 +270,10 @@ class ELFLinkGraphBuilder_aarch64 : public ELFLinkGraphBuilder<ELFT> {
       return "ELFLdSt128Abs12";
     case ELFAbs64:
       return "ELFAbs64";
+    case ELFPrel32:
+      return "ELFPrel32";
+    case ELFPrel64:
+      return "ELFPrel64";
     case ELFAdrGOTPage21:
       return "ELFAdrGOTPage21";
     case ELFLd64GOTLo12:

diff  --git a/llvm/test/ExecutionEngine/JITLink/AArch64/ELF_aarch64_ehframe.test b/llvm/test/ExecutionEngine/JITLink/AArch64/ELF_aarch64_ehframe.test
new file mode 100644
index 0000000000000..fa224d856c4ef
--- /dev/null
+++ b/llvm/test/ExecutionEngine/JITLink/AArch64/ELF_aarch64_ehframe.test
@@ -0,0 +1,60 @@
+# RUN: yaml2obj -o %t.o %s
+# RUN: llvm-jitlink -noexec -check %s %t.o
+
+--- !ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_REL
+  Machine:         EM_AARCH64
+  SectionHeaderStringTable: .strtab
+Sections:
+  - Name:            .text
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+    AddressAlign:    0x4
+    Content:         E0031F2AC0035FD6
+  - Name:            .eh_frame
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC ]
+    AddressAlign:    0x8
+    Content:         1000000000000000017A5200017C1E011B0C1F001000000018000000000000000800000000000000
+  - Name:            .rela.eh_frame
+    Type:            SHT_RELA
+    Flags:           [ SHF_INFO_LINK ]
+    Link:            .symtab
+    AddressAlign:    0x8
+    Info:            .eh_frame
+    Relocations:
+      - Offset:          0x1C
+        Symbol:          text
+        Type:            R_AARCH64_PREL32
+      - Offset:          0x20
+        Symbol:          text
+        Type:            R_AARCH64_PREL64
+  - Type:            SectionHeaderTable
+    Sections:
+      - Name:            .strtab
+      - Name:            .text
+      - Name:            .eh_frame
+      - Name:            .rela.eh_frame
+      - Name:            .symtab
+Symbols:
+  - Name:            text
+    Type:            STT_SECTION
+    Binding:         STB_GLOBAL
+    Section:         .text
+    Size:            0x8
+  - Name:            eh_frame
+    Type:            STT_SECTION
+    Binding:         STB_GLOBAL
+    Section:         .eh_frame
+    Size:            0x28
+  - Name:            main
+    Type:            STT_FUNC
+    Section:         .text
+    Binding:         STB_GLOBAL
+    Size:            0x8
+
+# jitlink-check: *{4}(eh_frame + 28) = (text + 0) - (eh_frame + 28)
+# jitlink-check: *{8}(eh_frame + 32) = (text + 0) - (eh_frame + 32)
\ No newline at end of file


        


More information about the llvm-commits mailing list