diff options
author | Erik Verbruggen <erik.verbruggen@digia.com> | 2012-11-14 10:10:04 +0100 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@digia.com> | 2012-11-14 12:01:52 +0100 |
commit | a09d75dd1fd4d598e641ff29ee73c312a0aaba73 (patch) | |
tree | c8d5295b6bee53c88300bab7100e7cad319c85e8 /qv4isel_llvm.cpp | |
parent | 03e7d5e3ef407852c37ffb7a3008da26fce77e6a (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.cpp | 45 |
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(); |