diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp --- a/llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp @@ -57,6 +57,8 @@ ELFLdSt64Abs12, ELFLdSt128Abs12, ELFAbs64, + ELFPrel32, + ELFPrel64, ELFAdrGOTPage21, ELFLd64GOTLo12, }; @@ -83,6 +85,10 @@ 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 @@ 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 @@ 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 --- /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