diff --git a/llvm/lib/ExecutionEngine/JITLink/COFF_x86_64.cpp b/llvm/lib/ExecutionEngine/JITLink/COFF_x86_64.cpp --- a/llvm/lib/ExecutionEngine/JITLink/COFF_x86_64.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/COFF_x86_64.cpp @@ -29,6 +29,7 @@ enum EdgeKind_coff_x86_64 : Edge::Kind { PCRel32 = x86_64::FirstPlatformRelocation, Pointer32NB, + Pointer64, }; class COFFJITLinker_x86_64 : public JITLinker { @@ -114,6 +115,11 @@ Addend -= 1; break; } + case COFF::RelocationTypeAMD64::IMAGE_REL_AMD64_ADDR64: { + Kind = EdgeKind_coff_x86_64::Pointer64; + Addend = *reinterpret_cast(FixupPtr); + break; + } default: { return make_error("Unsupported x86_64 relocation:" + formatv("{0:d}", Rel.getType())); @@ -158,6 +164,10 @@ E.setKind(x86_64::PCRel32); break; } + case EdgeKind_coff_x86_64::Pointer64: { + E.setKind(x86_64::Pointer64); + break; + } default: break; } @@ -221,6 +231,8 @@ return "PCRel32"; case Pointer32NB: return "Pointer32NB"; + case Pointer64: + return "Pointer64"; default: return x86_64::getEdgeKindName(R); } diff --git a/llvm/test/ExecutionEngine/JITLink/X86/COFF_x86-64_small_pic_relocations.s b/llvm/test/ExecutionEngine/JITLink/X86/COFF_x86-64_small_pic_relocations.s --- a/llvm/test/ExecutionEngine/JITLink/X86/COFF_x86-64_small_pic_relocations.s +++ b/llvm/test/ExecutionEngine/JITLink/X86/COFF_x86-64_small_pic_relocations.s @@ -55,6 +55,18 @@ test_call_dllimport: callq *__imp_extern_out_of_range32(%rip) +# Check IMAGE_REL_AMD64_ADDR64 sets address of symbol to the fixup position. +# jitlink-check: *{8}(test_addr64) = named_data + .text + .def named_func; + .scl 2; + .type 32; + .endef + .globl test_addr64 + .p2align 4, 0x90 +test_addr64: + .quad named_data + # Local named data/func that is used in conjunction with other test cases .text .def named_func;