diff --git a/llvm/lib/ExecutionEngine/Orc/OrcABISupport.cpp b/llvm/lib/ExecutionEngine/Orc/OrcABISupport.cpp index c84b54fba7996..6d568199378a0 100644 --- a/llvm/lib/ExecutionEngine/Orc/OrcABISupport.cpp +++ b/llvm/lib/ExecutionEngine/Orc/OrcABISupport.cpp @@ -165,11 +165,11 @@ void OrcAArch64::writeIndirectStubsBlock( // // .section __orc_stubs // stub1: - // ldr x0, ptr1 ; PC-rel load of ptr1 - // br x0 ; Jump to resolver + // ldr x16, ptr1 ; PC-rel load of ptr1 + // br x16 ; Jump to resolver // stub2: - // ldr x0, ptr2 ; PC-rel load of ptr2 - // br x0 ; Jump to resolver + // ldr x16, ptr2 ; PC-rel load of ptr2 + // br x16 ; Jump to resolver // // ... // @@ -188,8 +188,10 @@ void OrcAArch64::writeIndirectStubsBlock( "PointersBlock is out of range"); uint64_t PtrDisplacement = PointersBlockTargetAddress - StubsBlockTargetAddress; + assert((PtrDisplacement % 8 == 0) && + "Displacement to pointer is not a multiple of 8"); uint64_t *Stub = reinterpret_cast(StubsBlockWorkingMem); - uint64_t PtrOffsetField = PtrDisplacement << 3; + uint64_t PtrOffsetField = ((PtrDisplacement >> 2) & 0x7ffff) << 5; for (unsigned I = 0; I < NumStubs; ++I) Stub[I] = 0xd61f020058000010 | PtrOffsetField;