[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32JITInfo.cpp
Chris Lattner
lattner at cs.uiuc.edu
Mon Nov 22 22:55:19 PST 2004
Changes in directory llvm/lib/Target/PowerPC:
PPC32JITInfo.cpp updated: 1.2 -> 1.3
---
Log message:
Implement the first hunk of CompilationCallback. The pieces missing are the
ones noted, which require funny PPC specific inline assembly.
If some angel felt the desire to help me, I think this is that last bit missing
for JIT support (however, generic code emitter might night work right with
the constant pool yet).
---
Diffs of the changes: (+54 -10)
Index: llvm/lib/Target/PowerPC/PPC32JITInfo.cpp
diff -u llvm/lib/Target/PowerPC/PPC32JITInfo.cpp:1.2 llvm/lib/Target/PowerPC/PPC32JITInfo.cpp:1.3
--- llvm/lib/Target/PowerPC/PPC32JITInfo.cpp:1.2 Tue Nov 23 00:27:02 2004
+++ llvm/lib/Target/PowerPC/PPC32JITInfo.cpp Tue Nov 23 00:55:05 2004
@@ -34,16 +34,6 @@
#define BUILD_MTCTR(RS) BUILD_MTSPR(RS,9)
#define BUILD_BCTR(LINK) BUILD_BCCTRx(20,0,LINK)
-static void CompilationCallback() {
- //JITCompilerFunction
- assert(0 && "CompilationCallback not implemented yet!");
-}
-
-
-TargetJITInfo::LazyResolverFn
-PPC32JITInfo::getLazyResolverFunction(JITCompilerFn Fn) {
- return CompilationCallback;
-}
static void EmitBranchToAt(void *At, void *To, bool isCall) {
intptr_t Addr = (intptr_t)To;
@@ -57,6 +47,60 @@
AtI[3] = BUILD_BCTR(isCall); // bctr/bctrl
}
+static void CompilationCallback() {
+ // FIXME: Should save R3-R10 and F1-F13 onto the stack, just like the Sparc
+ // version does.
+ //int IntRegs[8];
+ //uint64_t FPRegs[13];
+ unsigned *CameFromStub = (unsigned*)__builtin_return_address(0);
+ unsigned *CameFromOrig = (unsigned*)__builtin_return_address(1);
+
+ // Adjust our pointers to the branches, not the return addresses.
+ --CameFromStub; --CameFromOrig;
+
+ void *Target = JITCompilerFunction(CameFromStub);
+
+ // Check to see if CameFromOrig[-1] is a 'bl' instruction, and if we can
+ // rewrite it to branch directly to the destination. If so, rewrite it so it
+ // does not need to go through the stub anymore.
+ unsigned CameFromOrigInst = *CameFromOrig;
+ if ((CameFromOrigInst >> 26) == 18) { // Direct call.
+ intptr_t Offset = ((intptr_t)Target-(intptr_t)CameFromOrig) >> 2;
+ if (Offset >= -(1 << 23) && Offset < (1 << 23)) { // In range?
+ // FIXME: hasn't been tested at all.
+ // Clear the original target out:
+ CameFromOrigInst &= (63 << 26) | 3;
+ CameFromOrigInst |= Offset << 2;
+ *CameFromOrig = CameFromOrigInst;
+ }
+ }
+
+ // Locate the start of the stub. If this is a short call, adjust backwards
+ // the short amount, otherwise the full amount.
+ bool isShortStub = (*CameFromStub >> 26) == 18;
+ CameFromStub -= isShortStub ? 3 : 7;
+
+ // Rewrite the stub with an unconditional branch to the target, for any users
+ // who took the address of the stub.
+ EmitBranchToAt(CameFromStub, Target, false);
+
+
+ // FIXME: Need to restore the registers from IntRegs/FPRegs.
+
+ // FIXME: Need to pop two frames off of the stack and return to a place where
+ // we magically reexecute the call, or jump directly to the caller. This
+ // requires inline asm majik.
+ assert(0 && "CompilationCallback not finished yet!");
+}
+
+
+
+TargetJITInfo::LazyResolverFn
+PPC32JITInfo::getLazyResolverFunction(JITCompilerFn Fn) {
+ JITCompilerFunction = Fn;
+ return CompilationCallback;
+}
+
void *PPC32JITInfo::emitFunctionStub(void *Fn, MachineCodeEmitter &MCE) {
// If this is just a call to an external function, emit a branch instead of a
// call. The code is the same except for one bit of the last instruction.
More information about the llvm-commits
mailing list