diff options
author | Chris Lattner <sabre@nondot.org> | 2004-11-24 18:00:02 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-11-24 18:00:02 +0000 |
commit | 892afa9556eabf358ef632f1be0bde1587b3d610 (patch) | |
tree | 8c34db2228576ff2366d0314443fa2e19cdfaff7 /lib/Target | |
parent | fb887e010dea16ecfe5204132dacf453af0d62c2 (diff) | |
download | external_llvm-892afa9556eabf358ef632f1be0bde1587b3d610.zip external_llvm-892afa9556eabf358ef632f1be0bde1587b3d610.tar.gz external_llvm-892afa9556eabf358ef632f1be0bde1587b3d610.tar.bz2 |
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')
-rw-r--r-- | lib/Target/PowerPC/PPCJITInfo.cpp | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/lib/Target/PowerPC/PPCJITInfo.cpp b/lib/Target/PowerPC/PPCJITInfo.cpp index 299dce7..f7abc53 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; } } |