forked from OSchip/llvm-project
When rewriting the original call instruction, make sure to rewrite it to
call the right address. llvm-svn: 18213
This commit is contained in:
parent
cb9af557e7
commit
659d72e319
|
@ -81,12 +81,13 @@ static void CompilationCallback() {
|
||||||
// does not need to go through the stub anymore.
|
// does not need to go through the stub anymore.
|
||||||
unsigned CameFromOrigInst = CameFromOrig[-1];
|
unsigned CameFromOrigInst = CameFromOrig[-1];
|
||||||
if ((CameFromOrigInst >> 26) == 18) { // Direct call.
|
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?
|
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 &= (63 << 26) | 3;
|
||||||
CameFromOrigInst |= Offset << 2;
|
// Fill in the new target.
|
||||||
|
CameFromOrigInst |= (Offset & ((1 << 24)-1)) << 2;
|
||||||
|
// Replace the call.
|
||||||
CameFromOrig[-1] = CameFromOrigInst;
|
CameFromOrig[-1] = CameFromOrigInst;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue