aboutsummaryrefslogtreecommitdiffstats
path: root/qv4isel_llvm.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2012-06-05 15:54:37 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2012-06-05 15:54:37 +0200
commit0829b00d5771a32860242063c82bc120fe65c7a9 (patch)
tree0bcb3c87b81375addc530096f55fd73bcc51786f /qv4isel_llvm.cpp
parent89bb85c9c4ddf307050d5cb3e9c4749ede078d13 (diff)
Fix code generation for IR::Call nodes.
Diffstat (limited to 'qv4isel_llvm.cpp')
-rw-r--r--qv4isel_llvm.cpp19
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();
}