[llvm-commits] CVS: llvm/lib/Target/X86/X86CodeEmitter.cpp X86TargetMachine.cpp

Chris Lattner lattner at cs.uiuc.edu
Mon Oct 18 08:54:30 PDT 2004



Changes in directory llvm/lib/Target/X86:

X86CodeEmitter.cpp updated: 1.67 -> 1.68
X86TargetMachine.cpp updated: 1.68 -> 1.69
---
Log message:

Improve compatibility with VC++, patch contributed by Morten Ofstad!


---
Diffs of the changes:  (+18 -1)

Index: llvm/lib/Target/X86/X86CodeEmitter.cpp
diff -u llvm/lib/Target/X86/X86CodeEmitter.cpp:1.67 llvm/lib/Target/X86/X86CodeEmitter.cpp:1.68
--- llvm/lib/Target/X86/X86CodeEmitter.cpp:1.67	Sun Oct 17 02:49:45 2004
+++ llvm/lib/Target/X86/X86CodeEmitter.cpp	Mon Oct 18 10:54:17 2004
@@ -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


Index: llvm/lib/Target/X86/X86TargetMachine.cpp
diff -u llvm/lib/Target/X86/X86TargetMachine.cpp:1.68 llvm/lib/Target/X86/X86TargetMachine.cpp:1.69
--- llvm/lib/Target/X86/X86TargetMachine.cpp:1.68	Fri Oct  8 17:41:46 2004
+++ llvm/lib/Target/X86/X86TargetMachine.cpp	Mon Oct 18 10:54:17 2004
@@ -54,7 +54,7 @@
 }
 
 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;






More information about the llvm-commits mailing list