diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2012-06-05 15:54:37 +0200 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2012-06-05 15:54:37 +0200 |
commit | 0829b00d5771a32860242063c82bc120fe65c7a9 (patch) | |
tree | 0bcb3c87b81375addc530096f55fd73bcc51786f /qv4isel_llvm.cpp | |
parent | 89bb85c9c4ddf307050d5cb3e9c4749ede078d13 (diff) |
Fix code generation for IR::Call nodes.
Diffstat (limited to 'qv4isel_llvm.cpp')
-rw-r--r-- | qv4isel_llvm.cpp | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/qv4isel_llvm.cpp b/qv4isel_llvm.cpp index 08d2738c8b..64ca9a9554 100644 --- a/qv4isel_llvm.cpp +++ b/qv4isel_llvm.cpp @@ -357,14 +357,16 @@ void LLVMInstructionSelection::visitCall(IR::Call *e) { llvm::Value *func = 0; llvm::Value *base = 0; - if (IR::Temp *t = e->asTemp()) { + if (IR::Temp *t = e->base->asTemp()) { base = getLLVMTemp(t); func = _llvmModule->getFunction("__qmljs_llvm_call_value"); - } else if (IR::Name *n = e->asName()) { - llvm::Value *str = getStringPtr(*n->id); - base = CreateCall2(_llvmModule->getFunction("__qmljs_llvm_get_identifier"), - _llvmFunction->arg_begin(), str); - func = _llvmModule->getFunction("__qmljs_llvm_call_activation_property"); + } else if (IR::Name *n = e->base->asName()) { + if (n->id) { + llvm::Value *str = getStringPtr(*n->id); + base = CreateCall2(_llvmModule->getFunction("__qmljs_llvm_get_identifier"), + _llvmFunction->arg_begin(), str); + func = _llvmModule->getFunction("__qmljs_llvm_call_activation_property"); + } } int argc = 0; @@ -381,8 +383,9 @@ void LLVMInstructionSelection::visitCall(IR::Call *e) } if (func) { - llvm::Value *result = llvm::Constant::getNullValue(_valueTy); - CreateCall5(func, _llvmFunction->arg_begin(), result, base, args, getInt32(argc)); + llvm::Value *result = CreateAlloca(_valueTy); + CreateStore(llvm::Constant::getNullValue(_valueTy), result); + _llvmValue = CreateCall5(func, _llvmFunction->arg_begin(), result, base, args, getInt32(argc)); } else { Q_UNIMPLEMENTED(); } |