summaryrefslogtreecommitdiff
path: root/lib/Target/PowerPC/PPCJITInfo.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-11-24 18:00:02 +0000
committerChris Lattner <sabre@nondot.org>2004-11-24 18:00:02 +0000
commit892afa9556eabf358ef632f1be0bde1587b3d610 (patch)
tree8c34db2228576ff2366d0314443fa2e19cdfaff7 /lib/Target/PowerPC/PPCJITInfo.cpp
parentfb887e010dea16ecfe5204132dacf453af0d62c2 (diff)
downloadllvm-892afa9556eabf358ef632f1be0bde1587b3d610.tar.gz
llvm-892afa9556eabf358ef632f1be0bde1587b3d610.tar.bz2
llvm-892afa9556eabf358ef632f1be0bde1587b3d610.tar.xz
When rewriting the original call instruction, make sure to rewrite it to
call the right address. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18213 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/PowerPC/PPCJITInfo.cpp')
-rw-r--r--lib/Target/PowerPC/PPCJITInfo.cpp9
1 files changed, 5 insertions, 4 deletions
diff --git a/lib/Target/PowerPC/PPCJITInfo.cpp b/lib/Target/PowerPC/PPCJITInfo.cpp
index 299dce771f..f7abc53a89 100644
--- a/lib/Target/PowerPC/PPCJITInfo.cpp
+++ b/lib/Target/PowerPC/PPCJITInfo.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;
}
}