return &ctx->arguments[index];
}
+void __qmljs_llvm_init_undefined(Value *result)
+{
+ __qmljs_init_undefined(result);
+}
+
+void __qmljs_llvm_init_null(Value *result)
+{
+ __qmljs_init_null(result);
+}
+
+void __qmljs_llvm_init_boolean(Value *result, bool value)
+{
+ __qmljs_init_boolean(result, value);
+}
+
void __qmljs_llvm_init_number(Value *result, double value)
{
__qmljs_init_number(result, value);
__qmljs_construct_activation_property(context, result, name, args, argc);
}
+void __qmljs_llvm_get_activation_property(Context *ctx, Value *result, String *name)
+{
+ __qmljs_get_activation_property(ctx, result, name);
+}
+
+void __qmljs_llvm_set_activation_property(Context *ctx, String *name, Value *value)
+{
+ __qmljs_set_activation_property(ctx, name, value);
+}
+
void __qmljs_llvm_get_property(Context *ctx, Value *result, Value *object, String *name)
{
__qmljs_get_property(ctx, result, object, name);
__qmljs_get_element(ctx, result, object, index);
}
+void __qmljs_llvm_set_element(Context *ctx, Value *object, Value *index, Value *value)
+{
+ __qmljs_set_element(ctx, object, index, value);
+}
+
void __qmljs_llvm_set_property(Context *ctx, Value *object, String *name, Value *value)
{
__qmljs_set_property(ctx, object, name, value);
#include "qv4isel_llvm_p.h"
#include "qv4ir_p.h"
+#include <QtCore/QTextStream>
+
#include <llvm/Support/system_error.h>
#include <llvm/Support/MemoryBuffer.h>
#include <llvm/Bitcode/ReaderWriter.h>
using namespace QQmlJS;
+namespace {
+QTextStream qout(stdout, QIODevice::WriteOnly);
+}
+
LLVMInstructionSelection::LLVMInstructionSelection(llvm::LLVMContext &context)
: llvm::IRBuilder<>(context)
, _llvmModule(0)
genMoveSubscript(s);
} else if (s->target->asMember()) {
genMoveMember(s);
+ } else if (IR::Name *n = s->target->asName()) {
+ llvm::Value *name = getIdentifier(*n->id);
+ llvm::Value *source = getLLVMTempReference(s->source);
+ CreateCall3(_llvmModule->getFunction("__qmljs_llvm_set_activation_property"),
+ _llvmFunction->arg_begin(), name, source);
} else if (IR::Temp *t = s->target->asTemp()) {
llvm::Value *target = getLLVMTemp(t);
llvm::Value *source = getLLVMValue(s->source);
CreateStore(source, target);
- return;
+ } else {
+ s->dump(qout, IR::Stmt::HIR);
+ qout << endl;
+ Q_UNIMPLEMENTED();
}
- Q_UNIMPLEMENTED();
}
void LLVMInstructionSelection::visitJump(IR::Jump *s)
void LLVMInstructionSelection::visitConst(IR::Const *e)
{
- llvm::Value *k = llvm::ConstantFP::get(_numberTy, e->value);
llvm::Value *tmp = newLLVMTemp(_valueTy);
- CreateCall2(_llvmModule->getFunction("__qmljs_llvm_init_number"), tmp, k);
+
+ switch (e->type) {
+ case IR::UndefinedType:
+ CreateCall(_llvmModule->getFunction("__qmljs_llvm_init_undefined"), tmp);
+ break;
+
+ case IR::NullType:
+ CreateCall(_llvmModule->getFunction("__qmljs_llvm_init_null"), tmp);
+ break;
+
+ case IR::BoolType:
+ CreateCall2(_llvmModule->getFunction("__qmljs_llvm_init_boolean"), tmp,
+ getInt1(e->value ? 1 : 0));
+ break;
+
+ case IR::NumberType:
+ CreateCall2(_llvmModule->getFunction("__qmljs_llvm_init_number"), tmp,
+ llvm::ConstantFP::get(_numberTy, e->value));
+ break;
+
+ default:
+ Q_UNREACHABLE();
+ }
+
_llvmValue = CreateLoad(tmp);
}
_llvmValue = CreateLoad(tmp);
}
-void LLVMInstructionSelection::visitName(IR::Name *)
+void LLVMInstructionSelection::visitName(IR::Name *e)
{
- Q_UNIMPLEMENTED();
+ llvm::Value *result = newLLVMTemp(_valueTy);
+ llvm::Value *name = getIdentifier(*e->id);
+ CreateCall3(_llvmModule->getFunction("__qmljs_get_activation_property"),
+ _llvmFunction->arg_begin(), result, name);
+ _llvmValue = CreateLoad(result);
+
}
void LLVMInstructionSelection::visitTemp(IR::Temp *e)