aboutsummaryrefslogtreecommitdiffstats
path: root/qv4isel_llvm.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@digia.com>2012-11-14 10:10:04 +0100
committerErik Verbruggen <erik.verbruggen@digia.com>2012-11-14 12:01:52 +0100
commita09d75dd1fd4d598e641ff29ee73c312a0aaba73 (patch)
treec8d5295b6bee53c88300bab7100e7cad319c85e8 /qv4isel_llvm.cpp
parent03e7d5e3ef407852c37ffb7a3008da26fce77e6a (diff)
Added more built-ins to the llvm backend and runtime.
Change-Id: I7c63395bc80ce8d37d04f1102b02220a54050d06 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'qv4isel_llvm.cpp')
-rw-r--r--qv4isel_llvm.cpp45
1 files changed, 37 insertions, 8 deletions
diff --git a/qv4isel_llvm.cpp b/qv4isel_llvm.cpp
index 9b6907159f..d7643ef167 100644
--- a/qv4isel_llvm.cpp
+++ b/qv4isel_llvm.cpp
@@ -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();