Skip to content

Commit

Permalink
[JITLink][ELF][AArch64] Implement R_AARCH64_PREL32 and R_AARCH64_PREL64.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
sunho authored and lhames committed Jun 8, 2022
1 parent 7d29374 commit 5d5183b
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 0 deletions.
18 changes: 18 additions & 0 deletions llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ class ELFLinkGraphBuilder_aarch64 : public ELFLinkGraphBuilder<ELFT> {
ELFLdSt64Abs12,
ELFLdSt128Abs12,
ELFAbs64,
ELFPrel32,
ELFPrel64,
ELFAdrGOTPage21,
ELFLd64GOTLo12,
};
Expand All @@ -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:
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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:
Expand Down
60 changes: 60 additions & 0 deletions llvm/test/ExecutionEngine/JITLink/AArch64/ELF_aarch64_ehframe.test
Original file line number Diff line number Diff line change
@@ -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)

0 comments on commit 5d5183b

Please sign in to comment.