Added more built-ins to the llvm backend and runtime.
authorErik Verbruggen <erik.verbruggen@digia.com>
Wed, 14 Nov 2012 09:10:04 +0000 (10:10 +0100)
committerErik Verbruggen <erik.verbruggen@digia.com>
Wed, 14 Nov 2012 11:01:52 +0000 (12:01 +0100)
Change-Id: I7c63395bc80ce8d37d04f1102b02220a54050d06
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
llvm_runtime.cpp
qv4isel_llvm.cpp

index 158cb66..90c7a17 100644 (file)
@@ -41,6 +41,7 @@
 
 #include "qmljs_runtime.h"
 #include <stdio.h>
+#include <setjmp.h>
 
 using namespace QQmlJS::VM;
 
@@ -457,6 +458,32 @@ void __qmljs_llvm_throw(Context *context, Value *value)
     __qmljs_throw(*value, context);
 }
 
+void __qmljs_llvm_create_exception_handler(Context *context, Value *result)
+{
+    void *buf = __qmljs_create_exception_handler(context);
+    *result = Value::fromInt32(setjmp(* static_cast<jmp_buf *>(buf)));
+}
+
+void __qmljs_llvm_delete_exception_handler(Context *context)
+{
+    __qmljs_delete_exception_handler(context);
+}
+
+void __qmljs_llvm_get_exception(Context *context, Value *result)
+{
+    *result = __qmljs_get_exception(context);
+}
+
+void __qmljs_llvm_foreach_iterator_object(Context *context, Value *result, Value *in)
+{
+    *result = __qmljs_foreach_iterator_object(*in, context);
+}
+
+void __qmljs_llvm_foreach_next_property_name(Value *result, Value *it)
+{
+    *result = __qmljs_foreach_next_property_name(*it);
+}
+
 void __qmljs_llvm_get_this_object(Context *ctx, Value *result)
 {
     *result = __qmljs_get_thisObject(ctx);
index 9b69071..d7643ef 100644 (file)
@@ -393,6 +393,7 @@ llvm::Value *LLVMInstructionSelection::getLLVMValue(IR::Expr *expr)
         qSwap(_llvmValue, llvmValue);
     }
     if (! llvmValue) {
+        expr->dump(qerr);qerr<<endl;
         Q_UNIMPLEMENTED();
         llvmValue = llvm::Constant::getNullValue(_valueTy);
     }
@@ -949,12 +950,46 @@ void LLVMInstructionSelection::genCallName(IR::Call *e, llvm::Value *result)
             break;
 
         case IR::Name::builtin_typeof:
-            // inline void __qmljs_typeof(Context *ctx, Value *result, const Value *value)
             CreateCall3(_llvmModule->getFunction("__qmljs_llvm_typeof"),
                         _llvmFunction->arg_begin(), result, getLLVMTempReference(e->args->expr));
             _llvmValue = CreateLoad(result);
             return;
 
+        case IR::Name::builtin_throw:
+            CreateCall2(_llvmModule->getFunction("__qmljs_llvm_throw"),
+                        _llvmFunction->arg_begin(), getLLVMTempReference(e->args->expr));
+            _llvmValue = llvm::UndefValue::get(_valueTy);
+            return;
+
+        case IR::Name::builtin_create_exception_handler:
+            CreateCall2(_llvmModule->getFunction("__qmljs_llvm_create_exception_handler"),
+                        _llvmFunction->arg_begin(), result);
+            _llvmValue = CreateLoad(result);
+            return;
+
+        case IR::Name::builtin_delete_exception_handler:
+            CreateCall(_llvmModule->getFunction("__qmljs_llvm_delete_exception_handler"),
+                       _llvmFunction->arg_begin());
+            return;
+
+        case IR::Name::builtin_get_exception:
+            CreateCall2(_llvmModule->getFunction("__qmljs_llvm_get_exception"),
+                        _llvmFunction->arg_begin(), result);
+            _llvmValue = CreateLoad(result);
+            return;
+
+        case IR::Name::builtin_foreach_iterator_object:
+            CreateCall3(_llvmModule->getFunction("__qmljs_llvm_foreach_iterator_object"),
+                        _llvmFunction->arg_begin(), result, getLLVMTempReference(e->args->expr));
+            _llvmValue = CreateLoad(result);
+            return;
+
+        case IR::Name::builtin_foreach_next_property_name:
+            CreateCall2(_llvmModule->getFunction("__qmljs_llvm_foreach_next_property_name"),
+                        result, getLLVMTempReference(e->args->expr));
+            _llvmValue = CreateLoad(result);
+            return;
+
         case IR::Name::builtin_delete: {
             if (IR::Subscript *subscript = e->args->expr->asSubscript()) {
                 CreateCall4(_llvmModule->getFunction("__qmljs_llvm_delete_subscript"),
@@ -987,13 +1022,7 @@ void LLVMInstructionSelection::genCallName(IR::Call *e, llvm::Value *result)
                 _llvmValue = CreateLoad(result);
                 return;
             }
-        }   break;
-
-        case IR::Name::builtin_throw:
-            CreateCall2(_llvmModule->getFunction("__qmljs_llvm_throw"),
-                        _llvmFunction->arg_begin(), getLLVMTempReference(e->args->expr));
-            _llvmValue = llvm::UndefValue::get(_valueTy);
-            return;
+        } break;
 
         default:
             Q_UNREACHABLE();