These only really work if returning int or void
authorChris Lattner <sabre@nondot.org>
Sun, 15 Aug 2004 23:34:48 +0000 (23:34 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 15 Aug 2004 23:34:48 +0000 (23:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15796 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/JIT/JIT.cpp

index 586936f21c7607ce8eff893c9ebac43e4c893c5f..a2f2275384f2dca69d1d55c03d8e3974bc56aee5 100644 (file)
@@ -63,23 +63,27 @@ GenericValue JIT::runFunction(Function *F,
 
   void *FPtr = getPointerToFunction(F);
   assert(FPtr && "Pointer to fn's code was null after getPointerToFunction");
-
-  if (ArgValues.size() == 3) {
-    int (*PF)(int, char **, const char **) =
-      (int(*)(int, char **, const char **))FPtr;
-    
-    // Call the function.
-    rv.IntVal = PF(ArgValues[0].IntVal, (char **)GVTOP(ArgValues[1]),
-                   (const char **)GVTOP(ArgValues[2]));
-    return rv;
-  } else if (ArgValues.size() == 1) {
-    int (*PF)(int) = (int(*)(int))FPtr;
-    rv.IntVal = PF(ArgValues[0].IntVal);
-    return rv;
-  } else if (ArgValues.size() == 0) {
-    int (*PF)() = (int(*)())FPtr;
-    rv.IntVal = PF();
-    return rv;
+  const Type *RetTy = F->getReturnType();
+
+  // Handle some common cases first.
+  if (RetTy == Type::IntTy || RetTy == Type::UIntTy || RetTy == Type::VoidTy) {
+    if (ArgValues.size() == 3) {
+      int (*PF)(int, char **, const char **) =
+        (int(*)(int, char **, const char **))FPtr;
+      
+      // Call the function.
+      rv.IntVal = PF(ArgValues[0].IntVal, (char **)GVTOP(ArgValues[1]),
+                     (const char **)GVTOP(ArgValues[2]));
+      return rv;
+    } else if (ArgValues.size() == 1) {
+      int (*PF)(int) = (int(*)(int))FPtr;
+      rv.IntVal = PF(ArgValues[0].IntVal);
+      return rv;
+    } else if (ArgValues.size() == 0) {
+      int (*PF)() = (int(*)())FPtr;
+      rv.IntVal = PF();
+      return rv;
+    }
   }
 
   // FIXME: This code should handle a couple of common cases efficiently, but