Index: llvm/include/llvm/ExecutionEngine/JITLink/ELF_aarch64.h =================================================================== --- llvm/include/llvm/ExecutionEngine/JITLink/ELF_aarch64.h +++ llvm/include/llvm/ExecutionEngine/JITLink/ELF_aarch64.h @@ -22,7 +22,9 @@ namespace ELF_aarch64_Edges { enum ELFAArch64RelocationKind : Edge::Kind { - ELFBranch26 = Edge::FirstRelocation, + ELFCall26 = Edge::FirstRelocation, + ELFAdrPage21, + ELFAddAbs12, }; } // namespace ELF_aarch64_Edges Index: llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp =================================================================== --- llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp +++ llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp @@ -50,7 +50,11 @@ using namespace aarch64; switch (Type) { case ELF::R_AARCH64_CALL26: - return ELF_aarch64_Edges::ELFBranch26; + return ELF_aarch64_Edges::ELFCall26; + case ELF::R_AARCH64_ADR_PREL_PG_HI21: + return ELF_aarch64_Edges::ELFAdrPage21; + case ELF::R_AARCH64_ADD_ABS_LO12_NC: + return ELF_aarch64_Edges::ELFAddAbs12; } return make_error("Unsupported aarch64 relocation:" + @@ -103,10 +107,18 @@ Edge::Kind Kind = Edge::Invalid; switch (*RelocKind) { - case ELFBranch26: { + case ELFCall26: { Kind = aarch64::Branch26; break; } + case ELFAdrPage21: { + Kind = aarch64::Page21; + break; + } + case ELFAddAbs12: { + Kind = aarch64::PageOffset12; + break; + } }; Edge GE(Kind, Offset, *GraphSymbol, Addend); @@ -166,8 +178,12 @@ const char *getELFAArch64RelocationKindName(Edge::Kind R) { switch (R) { - case ELF_aarch64_Edges::ELFBranch26: - return "ELFBranch26"; + case ELF_aarch64_Edges::ELFCall26: + return "ELFCall26"; + case ELF_aarch64_Edges::ELFAdrPage21: + return "ELFAdrPage21"; + case ELF_aarch64_Edges::ELFAddAbs12: + return "ELFAddAbs12"; default: return getGenericEdgeKindName(static_cast(R)); }