Index: lib/Target/X86/X86TargetMachine.cpp =================================================================== RCS file: /var/cvs/llvm/llvm/lib/Target/X86/X86TargetMachine.cpp,v retrieving revision 1.68 diff -u -r1.68 X86TargetMachine.cpp --- lib/Target/X86/X86TargetMachine.cpp 8 Oct 2004 22:41:46 -0000 1.68 +++ lib/Target/X86/X86TargetMachine.cpp 18 Oct 2004 13:43:52 -0000 @@ -53,8 +53,10 @@ RegisterTarget X("x86", " IA-32 (Pentium and above)"); } +void X86TargetMachine::stub() {} + unsigned X86TargetMachine::getJITMatchQuality() { -#if defined(i386) || defined(__i386__) || defined(__x86__) +#if defined(i386) || defined(__i386__) || defined(__x86__) || defined(_M_IX86) return 10; #else return 0; Index: lib/Target/X86/X86TargetMachine.h =================================================================== RCS file: /var/cvs/llvm/llvm/lib/Target/X86/X86TargetMachine.h,v retrieving revision 1.25 diff -u -r1.25 X86TargetMachine.h --- lib/Target/X86/X86TargetMachine.h 11 Jul 2004 02:44:51 -0000 1.25 +++ lib/Target/X86/X86TargetMachine.h 18 Oct 2004 13:43:52 -0000 @@ -29,7 +29,7 @@ X86JITInfo JITInfo; public: X86TargetMachine(const Module &M, IntrinsicLowering *IL); - + static void stub(); virtual const X86InstrInfo *getInstrInfo() const { return &InstrInfo; } virtual const TargetFrameInfo *getFrameInfo() const { return &FrameInfo; } virtual TargetJITInfo *getJITInfo() { return &JITInfo; } @@ -58,7 +58,8 @@ const X86InstrInfo& ii, const MachineInstr& MI); } - +static IncludeFile +X86TARGETMACHINE_INCLUDE_FILE((void*)&X86TargetMachine::stub); } // End llvm namespace #endif Index: lib/Target/X86/X86CodeEmitter.cpp =================================================================== RCS file: /var/cvs/llvm/llvm/lib/Target/X86/X86CodeEmitter.cpp,v retrieving revision 1.67 diff -u -r1.67 X86CodeEmitter.cpp --- lib/Target/X86/X86CodeEmitter.cpp 17 Oct 2004 07:49:45 -0000 1.67 +++ lib/Target/X86/X86CodeEmitter.cpp 18 Oct 2004 13:43:53 -0000 @@ -102,21 +102,34 @@ return Stub; } +#ifdef _MSC_VER +#pragma optimize("y", off) +#endif + void JITResolver::CompilationCallback() { +#ifdef _MSC_VER + unsigned *StackPtr, RetAddr; + __asm mov StackPtr, ebp; + __asm mov eax, DWORD PTR [ebp + 4]; + __asm mov RetAddr, eax; +#else unsigned *StackPtr = (unsigned*)__builtin_frame_address(0); unsigned RetAddr = (unsigned)(intptr_t)__builtin_return_address(0); +#endif assert(StackPtr[1] == RetAddr && "Could not find return address on the stack!"); // It's a stub if there is an interrupt marker after the call... bool isStub = ((unsigned char*)(intptr_t)RetAddr)[0] == 0xCD; +#ifndef _MSC_VER // FIXME FIXME FIXME FIXME: __builtin_frame_address doesn't work if frame // pointer elimination has been performed. Having a variable sized alloca // disables frame pointer elimination currently, even if it's dead. This is a // gross hack. alloca(10+isStub); // FIXME FIXME FIXME FIXME +#endif // The call instruction should have pushed the return value onto the stack... RetAddr -= 4; // Backtrack to the reference itself... @@ -150,6 +163,10 @@ StackPtr[1] -= 5; } +#ifdef _MSC_VER +#pragma optimize( "", on ) +#endif + /// emitStubForFunction - This method is used by the JIT when it needs to emit /// the address of a function for a function whose code has not yet been /// generated. In order to do this, it generates a stub which jumps to the lazy