Exemplo n.º 1
0
    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);
    }
Exemplo n.º 2
0
    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));
    }
Exemplo n.º 3
0
    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));
    }
Exemplo n.º 4
0
    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));
    }
Exemplo n.º 5
0
 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));
 }
Exemplo n.º 6
0
  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)));
  }
Exemplo n.º 7
0
    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)));
    }
Exemplo n.º 8
0
    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));
    }
Exemplo n.º 9
0
  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);
  }
Exemplo n.º 10
0
  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);
  }
Exemplo n.º 11
0
  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);
  }
Exemplo n.º 12
0
  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);
  }
Exemplo n.º 13
0
  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));
  }
Exemplo n.º 14
0
    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
    }
Exemplo n.º 15
0
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();
}
Exemplo n.º 16
0
    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
    }
Exemplo n.º 17
0
    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);
    }
Exemplo n.º 18
0
    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;
        }
    }
Exemplo n.º 19
0
    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;
        }
    }
Exemplo n.º 20
0
    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);
    }
Exemplo n.º 21
0
    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));
    }
Exemplo n.º 22
0
 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));
 }