diff options
Diffstat (limited to 'llvm/lib/Target/PowerPC')
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPC32JITInfo.cpp | 9 | 
1 files changed, 5 insertions, 4 deletions
diff --git a/llvm/lib/Target/PowerPC/PPC32JITInfo.cpp b/llvm/lib/Target/PowerPC/PPC32JITInfo.cpp index 299dce771f9..f7abc53a897 100644 --- a/llvm/lib/Target/PowerPC/PPC32JITInfo.cpp +++ b/llvm/lib/Target/PowerPC/PPC32JITInfo.cpp @@ -81,12 +81,13 @@ static void CompilationCallback() {    // does not need to go through the stub anymore.    unsigned CameFromOrigInst = CameFromOrig[-1];    if ((CameFromOrigInst >> 26) == 18) {     // Direct call. -    intptr_t Offset = ((intptr_t)Target-(intptr_t)CameFromOrig) >> 2; +    intptr_t Offset = ((intptr_t)Target-(intptr_t)CameFromOrig+4) >> 2;      if (Offset >= -(1 << 23) && Offset < (1 << 23)) {   // In range? -      // FIXME: hasn't been tested at all. -      // Clear the original target out: +      // Clear the original target out.        CameFromOrigInst &= (63 << 26) | 3; -      CameFromOrigInst |= Offset << 2; +      // Fill in the new target. +      CameFromOrigInst |= (Offset & ((1 << 24)-1)) << 2; +      // Replace the call.        CameFromOrig[-1] = CameFromOrigInst;      }    }  | 

