ejsval Module_prototype_getOrInsertFunction(ejsval env, ejsval _this, int argc, ejsval *args) { Module *module = ((Module*)EJSVAL_TO_OBJECT(_this)); REQ_UTF8_ARG(0, name); REQ_LLVM_TYPE_ARG(1, returnType); REQ_ARRAY_ARG(2, paramTypes); std::vector< llvm::Type*> param_types; for (int i = 0; i < EJSARRAY_LEN(paramTypes); i ++) { param_types.push_back (Type_GetLLVMObj(EJSDENSEARRAY_ELEMENTS(paramTypes)[i])); } llvm::FunctionType *FT = llvm::FunctionType::get(returnType, param_types, false); llvm::Function* f = static_cast< llvm::Function*>(module->llvm_module->getOrInsertFunction(name, FT)); // XXX this needs to come from the js call, since when we hoist anonymous methods we'll need to give them a private linkage. f->setLinkage (llvm::Function::ExternalLinkage); // XXX the args might not be identifiers but might instead be destructuring expressions. punt for now. #if notyet // Set names for all arguments. unsigned Idx = 0; for (Function::arg_iterator AI = F->arg_begin(); Idx != Args.size(); ++AI, ++Idx) AI->setName(Args[Idx]); #endif return Function_new (f); }
static ejsval Constant_getAggregateZero (ejsval env, ejsval _this, int argc, ejsval *args) { REQ_LLVM_TYPE_ARG (0, ty); return Value_new (llvm::ConstantAggregateZero::get(ty)); }
ejsval IRBuilder_createAlloca(ejsval env, ejsval _this, int argc, ejsval *args) { REQ_LLVM_TYPE_ARG(0, ty); FALLBACK_EMPTY_UTF8_ARG(1, name); return AllocaInst_new (_llvm_builder.CreateAlloca(ty, 0, name)); }
static ejsval ArrayType_get (ejsval env, ejsval _this, int argc, ejsval *args) { REQ_LLVM_TYPE_ARG (0, elementType); REQ_INT_ARG (1, numElements); return ArrayType_new (llvm::ArrayType::get(elementType, numElements)); }
ejsval IRBuilder_createBitCast(ejsval env, ejsval _this, int argc, ejsval *args) { REQ_LLVM_VAL_ARG(0, V); REQ_LLVM_TYPE_ARG(1, dest_ty); FALLBACK_EMPTY_UTF8_ARG(2, name); return Value_new (_llvm_builder.CreateBitCast(V, dest_ty, name)); }
Handle<Value> ArrayType::Get(const Arguments& args) { HandleScope scope; REQ_LLVM_TYPE_ARG (0, elementType); REQ_INT_ARG (1, numElements); return scope.Close(ArrayType::New(llvm::ArrayType::get(elementType, numElements))); }
ejsval Module_prototype_getOrInsertGlobal(ejsval env, ejsval _this, int argc, ejsval *args) { Module *module = ((Module*)EJSVAL_TO_OBJECT(_this)); REQ_UTF8_ARG(0, name); REQ_LLVM_TYPE_ARG(1, type); return GlobalVariable_new (static_cast<llvm::GlobalVariable*>(module->llvm_module->getOrInsertGlobal(name, type))); }
ejsval IRBuilder_createLandingPad(ejsval env, ejsval _this, int argc, ejsval *args) { REQ_LLVM_TYPE_ARG(0, ty); REQ_LLVM_VAL_ARG(1, persFn); REQ_INT_ARG(2, num_clauses); FALLBACK_EMPTY_UTF8_ARG(3, name); return LandingPad_new (_llvm_builder.CreateLandingPad(ty, persFn, num_clauses, name)); }
v8::Handle<v8::Value> IRBuilder::CreateAlloca(const v8::Arguments& args) { HandleScope scope; REQ_LLVM_TYPE_ARG(0, ty); FALLBACK_EMPTY_UTF8_ARG(1, name); Handle<v8::Value> result = AllocaInst::New(IRBuilder::builder.CreateAlloca(ty, 0, *name)); return scope.Close(result); }
v8::Handle<v8::Value> IRBuilder::CreateFPCast(const v8::Arguments& args) { HandleScope scope; REQ_LLVM_VAL_ARG(0,val); REQ_LLVM_TYPE_ARG(1,ty); FALLBACK_EMPTY_UTF8_ARG(2,name); Handle<v8::Value> result = Instruction::New(static_cast<llvm::Instruction*>(builder.CreateFPCast(val, ty, *name))); return scope.Close(result); }
v8::Handle<v8::Value> IRBuilder::CreatePhi(const v8::Arguments& args) { HandleScope scope; REQ_LLVM_TYPE_ARG(0, ty); REQ_INT_ARG(1, incoming_values); FALLBACK_EMPTY_UTF8_ARG(2, name); Handle<v8::Value> result = Instruction::New(static_cast<llvm::Instruction*>(IRBuilder::builder.CreatePHI(ty, incoming_values, *name))); return scope.Close(result); }
v8::Handle<v8::Value> IRBuilder::CreateLandingPad(const v8::Arguments& args) { HandleScope scope; REQ_LLVM_TYPE_ARG(0, ty); REQ_LLVM_VAL_ARG(1, persFn); REQ_INT_ARG(2, num_clauses); FALLBACK_EMPTY_UTF8_ARG(3, name); Handle<v8::Value> result = LandingPad::New(IRBuilder::builder.CreateLandingPad(ty, persFn, num_clauses, *name)); return scope.Close(result); }
static ejsval ConstantArray_get (ejsval env, ejsval _this, int argc, ejsval *args) { REQ_LLVM_TYPE_ARG(0, array_type); REQ_ARRAY_ARG(1, elements); std::vector< llvm::Constant*> element_constants; for (int i = 0; i < EJSARRAY_LEN(elements); i ++) { element_constants.push_back (static_cast<llvm::Constant*>(Value_GetLLVMObj(EJSDENSEARRAY_ELEMENTS(elements)[i]))); } return Value_new (llvm::ConstantArray::get(static_cast<llvm::ArrayType*>(array_type), element_constants)); }
ejsval IRBuilder_createPhi(ejsval env, ejsval _this, int argc, ejsval *args) { abort(); #if notyet REQ_LLVM_TYPE_ARG(0, ty); REQ_INT_ARG(1, incoming_values); FALLBACK_EMPTY_UTF8_ARG(2, name); ejsval rv = Value_new (_llvm_builder.CreatePHI(ty, incoming_values, name)); free (name); return rv; #endif }
Handle< ::v8::Value> GlobalVariable::New(const Arguments& args) { HandleScope scope; if (args.Length()) { REQ_LLVM_MODULE_ARG(0, module); REQ_LLVM_TYPE_ARG(1, type); REQ_UTF8_ARG(2, name); REQ_LLVM_CONST_ARG(3, init); GlobalVariable* val = new GlobalVariable(new ::llvm::GlobalVariable(*module, type, false, llvm::GlobalValue::InternalLinkage, init, *name)); val->Wrap(args.This()); } return args.This(); }
static ejsval Constant_getIntegerValue (ejsval env, ejsval _this, int argc, ejsval *args) { REQ_LLVM_TYPE_ARG (0, ty); REQ_INT_ARG (1, v); if (argc == 2) { return Value_new (llvm::Constant::getIntegerValue(ty, llvm::APInt(ty->getPrimitiveSizeInBits(), v))); } else if (argc == 3 && EJSVAL_IS_NUMBER(args[2]) && ty->getPrimitiveSizeInBits() == 64) { uint64_t vhi = v; uint32_t vlo = (uint32_t)EJSVAL_TO_NUMBER(args[2]); return Value_new (llvm::Constant::getIntegerValue(ty, llvm::APInt(ty->getPrimitiveSizeInBits(), (int64_t)((vhi << 32) | vlo)))); } else abort(); // FIXME throw an exception }
static ejsval FunctionType_get (ejsval env, ejsval _this, int argc, ejsval *args) { REQ_LLVM_TYPE_ARG(0, returnType); REQ_ARRAY_ARG(1, argTypes); std::vector<llvm::Type*> arg_types; for (int i = 0; i < EJSARRAY_LEN(argTypes); i ++) { arg_types.push_back (Type_GetLLVMObj(EJSDENSEARRAY_ELEMENTS(argTypes)[i])); } llvm::FunctionType *FT = llvm::FunctionType::get(returnType, arg_types, false); EJSObject* result = FunctionType_alloc_instance(); _ejs_init_object (result, _ejs_FunctionType_proto, NULL); ((FunctionType*)result)->type = FT; return OBJECT_TO_EJSVAL(result); }
static ejsval GlobalVariable_impl (ejsval env, ejsval _this, int argc, ejsval *args) { if (EJSVAL_IS_UNDEFINED(_this)) { // called as a function EJS_NOT_IMPLEMENTED(); } else { GlobalVariable* gv = (GlobalVariable*)EJSVAL_TO_OBJECT(_this); REQ_LLVM_MODULE_ARG(0, module); REQ_LLVM_TYPE_ARG(1, type); REQ_UTF8_ARG(2, name); REQ_LLVM_CONST_ARG(3, init); gv->llvm_global = new ::llvm::GlobalVariable(*module, type, false, llvm::GlobalValue::InternalLinkage, init, name); free(name); return _this; } }
static EJS_NATIVE_FUNC(GlobalVariable_impl) { if (EJSVAL_IS_UNDEFINED(newTarget)) { // called as a function EJS_NOT_IMPLEMENTED(); } else { ejsval O = OrdinaryCreateFromConstructor(newTarget, _ejs_GlobalVariable_prototype, &_ejs_GlobalVariable_specops); *_this = O; GlobalVariable* gv = (GlobalVariable*)EJSVAL_TO_OBJECT(O); REQ_LLVM_MODULE_ARG(0, module); REQ_LLVM_TYPE_ARG(1, type); REQ_UTF8_ARG(2, name); REQ_NULLABLE_LLVM_CONST_ARG(3, init); REQ_BOOL_ARG(4, visible); gv->llvm_global = new ::llvm::GlobalVariable(*module, type, false, visible ? llvm::GlobalValue::ExternalLinkage : llvm::GlobalValue::InternalLinkage, init, name); return *_this; } }
ejsval Module_prototype_getOrInsertExternalFunction(ejsval env, ejsval _this, int argc, ejsval *args) { Module *module = ((Module*)EJSVAL_TO_OBJECT(_this)); REQ_UTF8_ARG(0, name); REQ_LLVM_TYPE_ARG(1, returnType); REQ_ARRAY_ARG(2, paramTypes); std::vector< llvm::Type*> param_types; for (int i = 0; i < EJSARRAY_LEN(paramTypes); i ++) { param_types.push_back (Type_GetLLVMObj(EJSDENSEARRAY_ELEMENTS(paramTypes)[i])); } llvm::FunctionType *FT = llvm::FunctionType::get(returnType, param_types, false); llvm::Function* f = static_cast< llvm::Function*>(module->llvm_module->getOrInsertFunction(name, FT)); f->setLinkage (llvm::Function::ExternalLinkage); return Function_new (f); }
static EJS_NATIVE_FUNC(ArrayType_get) { REQ_LLVM_TYPE_ARG (0, elementType); REQ_INT_ARG (1, numElements); return ArrayType_new (llvm::ArrayType::get(elementType, numElements)); }
static ejsval Constant_getNull (ejsval env, ejsval _this, int argc, ejsval *args) { REQ_LLVM_TYPE_ARG (0, ty); return Value_new (llvm::Constant::getNullValue(ty)); }