[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