Пример #1
0
SEXP
R_cuCtxGetCurrent()
{
    SEXP r_ans = R_NilValue;
    CUcontext pctx;
    CUresult ans;
    ans = cuCtxGetCurrent(& pctx);
    if(ans)
       return(R_cudaErrorInfo(ans));
    r_ans = R_createRef(pctx, "CUcontext") ;
    return(r_ans);
}
Пример #2
0
SEXP R_clang_getIncludedFile(SEXP r_cursor)
{
    SEXP r_ans = R_NilValue;
    CXCursor cursor = * GET_REF(r_cursor, CXCursor);
    
    CXFile ans;
    ans = clang_getIncludedFile(cursor);
    
    r_ans = R_createRef(ans, "CXFile") ;
    
    return(r_ans);
} 
Пример #3
0
SEXP
R_IRBuilder_CreateSIToFP(SEXP r_builder, SEXP r_val, SEXP r_type)
{
    llvm::IRBuilder<> *builder;
    builder = GET_REF(r_builder, IRBuilder<>);
    llvm::Value *val = GET_REF(r_val, Value);
    llvm::Type *type = GET_REF(r_type, Type);

    llvm::Value * ans = builder->CreateSIToFP(val, type);

    return(R_createRef(ans, "Value"));
}
Пример #4
0
SEXP
R_auto_cuMemAllocHost(SEXP r_bytesize)
{
    SEXP r_ans = R_NilValue;
    void * pp;
    size_t bytesize = REAL(r_bytesize)[0];
    CUresult ans;
    ans = cuMemAllocHost(& pp,  bytesize);
    if(ans)
       return(R_cudaErrorInfo(ans));
    r_ans = R_createRef(pp, "voidPtr") ;
    return(r_ans);
}
Пример #5
0
SEXP
R_Function_clone(SEXP r_func)
{
    llvm::Function *func = GET_REF(r_func, Function);

	IdentityMapper VMap;

  	llvm::Function* duplicateFunction = llvm::CloneFunction(func, VMap,
                                              /*ModuleLevelChanges=*/false);
  	func->getParent()->getFunctionList().push_back(duplicateFunction);

    return(R_createRef(duplicateFunction, "Function"));
}
Пример #6
0
SEXP
R_auto_cuEventCreate(SEXP r_Flags)
{
    SEXP r_ans = R_NilValue;
    CUevent phEvent;
    unsigned int Flags = REAL(r_Flags)[0];
    CUresult ans;
    ans = cuEventCreate(& phEvent,  Flags);
    if(ans)
       return(R_cudaErrorInfo(ans));
    r_ans = R_createRef(phEvent, "CUevent") ;
    return(r_ans);
}
Пример #7
0
SEXP
R_auto_cuMemAlloc(SEXP r_bytesize)
{
    SEXP r_ans = R_NilValue;
    CUdeviceptr dptr;
    size_t bytesize = REAL(r_bytesize)[0];
    CUresult ans;
    ans = cuMemAlloc(& dptr,  bytesize);
    if(ans)
       return(R_cudaErrorInfo(ans));
    r_ans = R_createRef((void*) dptr, "CUdeviceptr") ;
    return(r_ans);
}
Пример #8
0
SEXP
R_auto_cuModuleLoad(SEXP r_fname)
{
    SEXP r_ans = R_NilValue;
    CUmodule module;
    const char * fname = CHAR(STRING_ELT(r_fname, 0));
    CUresult ans;
    ans = cuModuleLoad(& module,  fname);
    if(ans)
       return(R_cudaErrorInfo(ans));
    r_ans = R_createRef(module, "CUmodule") ;
    return(r_ans);
}
Пример #9
0
SEXP
R_IRBuilder_CreateGlobalString(SEXP r_builder, SEXP r_val, SEXP r_id)
{
    llvm::IRBuilder<> *builder;
    llvm::Value *ans;

    builder = GET_REF(r_builder, IRBuilder<>);
    ans = builder->CreateGlobalString(llvm::StringRef(strdup(CHAR(STRING_ELT(r_val, 0)))));

    if(Rf_length(r_id))
       ans->setName(makeTwine(r_id));
    return(R_createRef(ans, "Value"));
}
Пример #10
0
SEXP
R_IRBuilder_CreatePHI(SEXP r_builder, SEXP r_type, SEXP r_numReservedValues, SEXP r_id)
{
    llvm::IRBuilder<> *builder;
    builder = GET_REF(r_builder, IRBuilder<>);
    llvm::Type *type = GET_REF(r_type, Type);

    llvm::PHINode *ret = builder->CreatePHI(type, INTEGER(r_numReservedValues)[0]);
    if(Rf_length(r_id)) 
        ret->setName(makeTwine(r_id));

    return(R_createRef(ret, "PHINode"));
} 
Пример #11
0
SEXP
R_IRBuilder_CreateUnwind(SEXP r_builder, SEXP r_id)
{
#if LLVM_VERSION > 2
    PROBLEM "cannot (yet) create unwind instruction for this version of LLVM"
    WARN;
    return(R_NilValue);
#else
    llvm::IRBuilder<> *builder;
    llvm::UnwindInst *ans = builder->CreateUnwind();
    return(R_createRef(ans, "UnwindInst"));
#endif
}
Пример #12
0
SEXP
R_IRBuilder_CreateStructGEP(SEXP r_builder, SEXP r_value, SEXP r_index, SEXP r_id) 
{
    llvm::IRBuilder<> *builder;
    builder = GET_REF(r_builder, IRBuilder<>);
    llvm::Value *ans, *value;
    value = GET_REF(r_builder, Value);
    ans = builder->CreateStructGEP(NULL, value,  INTEGER(r_index)[0]);
    if(Rf_length(r_id)) 
        ans->setName(makeTwine(r_id));

    return(R_createRef(ans, "Value"));
}
Пример #13
0
SEXP
R_auto_cuModuleLoadData(SEXP r_image)
{
    SEXP r_ans = R_NilValue;
    CUmodule module;
    const void * image = GET_REF(r_image, const void );
    CUresult ans;
    ans = cuModuleLoadData(& module,  image);
    if(ans)
       return(R_cudaErrorInfo(ans));
    r_ans = R_createRef(module, "CUmodule") ;
    return(r_ans);
}
Пример #14
0
SEXP
R_IRBuilder_CreateCondBr(SEXP r_builder, SEXP r_cond, SEXP r_true, SEXP r_false)
{
    llvm::IRBuilder<> *builder;
    builder = GET_REF(r_builder, IRBuilder<>);
    llvm::Value *cond = GET_REF(r_cond, Value);
    llvm::BasicBlock *block1 = GET_REF(r_true, BasicBlock);
    llvm::BasicBlock *block2 = GET_REF(r_false, BasicBlock);

    llvm::BranchInst *ans = builder->CreateCondBr(cond, block1, block2);

    return(R_createRef(ans, "BranchInst"));
}
Пример #15
0
SEXP
R_auto_cuModuleLoadFatBinary(SEXP r_fatCubin)
{
    SEXP r_ans = R_NilValue;
    CUmodule module;
    const void * fatCubin = GET_REF(r_fatCubin, const void );
    CUresult ans;
    ans = cuModuleLoadFatBinary(& module,  fatCubin);
    if(ans)
       return(R_cudaErrorInfo(ans));
    r_ans = R_createRef(module, "CUmodule") ;
    return(r_ans);
}
Пример #16
0
SEXP
R_Target_createTargetMachine(SEXP r_target, SEXP r_triple, SEXP r_cpu, SEXP r_features, SEXP r_opts)
{
    const llvm::Target *tgt = GET_REF(r_target, Target);
//    llvm::Module *mod = GET_REF(r_module, Module);
    std::string triple(CHAR(STRING_ELT(r_triple, 0)));
    llvm::TargetOptions *opts = NULL, defaultOpts;
    llvm::TargetMachine *ans;

    if(Rf_length(r_opts))
        opts = GET_REF(r_opts, TargetOptions);
    else  {
        /* taken from Halide's CodeGen.cpp */
        defaultOpts.LessPreciseFPMADOption = true;
        //defaultOpts.NoFramePointerElim = false;
#ifdef LLVM_HAS_NOFRAMEPOINTERELIMNONLEAF
        defaultOpts.NoFramePointerElimNonLeaf = false;
#endif
        defaultOpts.AllowFPOpFusion = llvm::FPOpFusion::Fast;
        defaultOpts.UnsafeFPMath = true;
        defaultOpts.NoInfsFPMath = true;
        defaultOpts.NoNaNsFPMath = true;
        defaultOpts.HonorSignDependentRoundingFPMathOption = false;
        //defaultOpts.UseSoftFloat = false;
        defaultOpts.FloatABIType = llvm::FloatABI::Soft;
        defaultOpts.NoZerosInBSS = false;
        defaultOpts.GuaranteedTailCallOpt = false;
        //defaultOpts.DisableTailCalls = false;
        defaultOpts.StackAlignmentOverride = 32;
#ifdef LLVM_HAS_REALIGNSTACK
        defaultOpts.RealignStack = true;
#endif
        //defaultOpts.TrapFuncName = "";
        defaultOpts.PositionIndependentExecutable = true;

#if LLVM_VERSION == 3 && LLVM_MINOR_VERSION < 5
        defaultOpts.EnableSegmentedStacks = false;
#endif

        defaultOpts.UseInitArray = false;
#ifdef LLVM_HAS_SSPBUFFERSIZE
        defaultOpts.SSPBufferSize = 0;
#endif

        opts = &defaultOpts; 
    }

    ans = tgt->createTargetMachine(triple, std::string(CHAR(STRING_ELT(r_cpu, 0))),
                                   std::string(CHAR(STRING_ELT(r_features, 0))), *opts);
    return(R_createRef(ans, "TargetMachine"));
}
Пример #17
0
SEXP
R_IRBuilder_CreateTrunc(SEXP r_builder, SEXP r_value, SEXP r_type, SEXP r_id)
{
    llvm::IRBuilder<> *builder;
    builder = GET_REF(r_builder, IRBuilder<>);
    llvm::Value *value = GET_REF(r_value, Value);
    llvm::Type *type = GET_REF(r_type, Type);

    llvm::Value *ans = builder->CreateTrunc(value, type);
    if(Rf_length(r_id)) 
        ans->setName(makeTwine(r_id));

    return(R_createRef(ans, "TruncInst"));
}
Пример #18
0
SEXP
R_IRBuilder_CreateCast(SEXP r_builder, SEXP r_op, SEXP r_lhs, SEXP r_type, SEXP r_id)
{
    llvm::IRBuilder<> *builder;
    builder = GET_REF(r_builder, IRBuilder<>);
    llvm::Value *lhs = GET_REF(r_lhs, Value);
    llvm::Type *rhs = GET_REF(r_type, Type);
    llvm::Value *ret = builder->CreateCast((llvm::Instruction::CastOps) INTEGER(r_op)[0], lhs, rhs);

    if(Rf_length(r_id)) 
        ret->setName(makeTwine(r_id));
   
    return(R_createRef(ret, "Value"));
}
Пример #19
0
SEXP
R_new_BasicBlock(SEXP r_context, SEXP r_name, SEXP r_fun)
{
    llvm::LLVMContext *context = GET_REF(r_context, LLVMContext);
    llvm::Function *fun = GET_REF(r_fun, Function);
    const char * name;
    if(Rf_length(r_name))
        name = CHAR(STRING_ELT(r_name, 0));
    else
        name = "";

    llvm::BasicBlock *ans = llvm::BasicBlock::Create(*context, name, fun);
    return(R_createRef(ans, "BasicBlock"));
}
Пример #20
0
SEXP
R_IRBuilder_CreateIsNotNull(SEXP r_builder, SEXP r_val, SEXP r_id)
{
    llvm::IRBuilder<> *builder;
    builder = GET_REF(r_builder, IRBuilder<>);
    llvm::Value *val =  GET_REF(r_val, Value);
  
    llvm::Value* ans = builder->CreateIsNotNull(val);

    if(Rf_length(r_id))
        ans->setName(makeTwine(r_id));

    return(R_createRef(ans, "Value"));
}
Пример #21
0
SEXP
R_auto_cuModuleGetSurfRef(SEXP r_hmod, SEXP r_name)
{
    SEXP r_ans = R_NilValue;
    CUsurfref pSurfRef;
    CUmodule hmod = (CUmodule) getRReference(r_hmod);
    const char * name = CHAR(STRING_ELT(r_name, 0));
    CUresult ans;
    ans = cuModuleGetSurfRef(& pSurfRef,  hmod,  name);
    if(ans)
       return(R_cudaErrorInfo(ans));
    r_ans = R_createRef(pSurfRef, "CUsurfref") ;
    return(r_ans);
}
Пример #22
0
SEXP
R_IRBuilder_CreateFCmp(SEXP r_builder, SEXP r_op, SEXP r_lhs, SEXP r_rhs)
{
    llvm::IRBuilder<> *builder;
    builder = GET_REF(r_builder, IRBuilder<>);
    
    llvm::Value *lhs = GET_REF(r_lhs, Value);
    llvm::Value *rhs = GET_REF(r_rhs, Value);
    llvm::FCmpInst::Predicate op = (llvm::FCmpInst::Predicate) INTEGER(r_op)[0];

    llvm::Value* ans = builder->CreateFCmp(op, lhs, rhs);

    return(R_createRef(ans, "Value"));
}
Пример #23
0
SEXP
R_auto_cuMemHostAlloc(SEXP r_bytesize, SEXP r_Flags)
{
    SEXP r_ans = R_NilValue;
    void * pp;
    size_t bytesize = REAL(r_bytesize)[0];
    unsigned int Flags = REAL(r_Flags)[0];
    CUresult ans;
    ans = cuMemHostAlloc(& pp,  bytesize,  Flags);
    if(ans)
       return(R_cudaErrorInfo(ans));
    r_ans = R_createRef(pp, "voidPtr") ;
    return(r_ans);
}
Пример #24
0
SEXP
R_Module_getGlobalVariable(SEXP r_module, SEXP r_name, SEXP r_allowInternal)
{
    llvm::Module *module;
    module = GET_REF(r_module, Module); 
    llvm::GlobalVariable *var;
    llvm::StringRef strRef(CHAR(STRING_ELT(r_name, 0)));

    var = module->getGlobalVariable(strRef, LOGICAL(r_allowInternal)[0]);
    if(!var)
      return(R_NilValue);

    return(R_createRef(var, "GlobalVariable"));
}
Пример #25
0
SEXP
R_new_Module(SEXP r_name, SEXP r_context)
{
    llvm::Module *ans;
    llvm::LLVMContext *context;
    if(Rf_length(r_context))
        context = (GET_REF(r_context, LLVMContext)); // llvm::cast<llvm::LLVMContext> 
    else
        context = & llvm::getGlobalContext();

    ans = new llvm::Module(CHAR(STRING_ELT(r_name, 0)), *context);

    return(R_createRef(ans, "Module"));
}
Пример #26
0
SEXP
R_auto_cuMemHostGetDevicePointer(SEXP r_p, SEXP r_Flags)
{
    SEXP r_ans = R_NilValue;
    CUdeviceptr pdptr;
    void * p = GET_REF(r_p, void );
    unsigned int Flags = REAL(r_Flags)[0];
    CUresult ans;
    ans = cuMemHostGetDevicePointer(& pdptr,  p,  Flags);
    if(ans)
       return(R_cudaErrorInfo(ans));
    r_ans = R_createRef((void*) pdptr, "CUdeviceptr") ;
    return(r_ans);
}
Пример #27
0
SEXP
R_cuCtxCreate(SEXP r_flags, SEXP r_dev)
{
    SEXP r_ans = R_NilValue;
    CUcontext pctx;
    unsigned int flags = REAL(r_flags)[0];
    int dev = INTEGER(r_dev)[0];
    CUresult ans;
    ans = cuCtxCreate(& pctx,  flags,  dev);
    if(ans)
       return(R_cudaErrorInfo(ans));
    r_ans = R_createRef(pctx, "CUcontext") ;
    return(r_ans);
}
Пример #28
0
SEXP
R_DIBuilder_CreateBasicType(SEXP r_builder,SEXP r_name, SEXP r_size, SEXP r_align, SEXP r_dwarf_type) {

    llvm::DIBuilder *builder;
    builder = GET_REF(r_builder, DIBuilder);

	const char * name=CHAR(STRING_ELT(r_name, 0));
	int size=asInteger(r_size);
	int align=asInteger(r_align);
	int dwarf_type=asInteger(r_dwarf_type);

	llvm::DIType* ans = builder->createBasicType(llvm::StringRef(name), size, align, dwarf_type);
	return(R_createRef(ans,"DIType"));
}
Пример #29
0
SEXP
R_llvm_ParseIRFile(SEXP r_content, SEXP r_inMemory, SEXP r_context)
{
    llvm::Module *mod;
    llvm::SMDiagnostic err;

    llvm::LLVMContext *context;
    if(Rf_length(r_context))
        context = (GET_REF(r_context, LLVMContext)); // llvm::cast<llvm::LLVMContext> 
    else
        context = & llvm::getGlobalContext();

    std::string fn(CHAR(STRING_ELT(r_content, 0)));

    if(LOGICAL(r_inMemory)[0])  {
        llvm::MemoryBuffer *buf;
#if LLVM_VERSION == 3 && LLVM_MINOR_VERSION > 5
        buf = llvm::MemoryBuffer::getMemBuffer(fn).get();
        mod = llvm::parseIR(buf->getMemBufferRef(), err, *context).get();
#else
        buf = llvm::MemoryBuffer::getMemBuffer(fn);
        mod = llvm::ParseIR(buf, err, *context);
#endif
    } else { 
#if LLVM_VERSION == 3 && LLVM_MINOR_VERSION > 5
        std::unique_ptr<llvm::Module> tmp;
        tmp = llvm::parseIRFile(fn, err, *context);
        mod = tmp.get();
        tmp.reset(NULL);
        // mod = llvm::parseIRFile(fn, err, *context).get();
#else
        mod = llvm::ParseIRFile(fn, err, *context);
#endif
    }
    if(!mod) {
  raiseError(err);
       char msg[1000];
       sprintf(msg, "(%d)  %s", (int) strlen(err.getMessage().data()), err.getMessage().data());
       msg[120] = '\0';
//   Rprintf("%s", msg);
   Rf_error(msg);
        PROBLEM "failed to parse IR: (line = %d, col = %d) %s", 
            err.getLineNo(), err.getColumnNo(), msg
      //      err.getMessage().data()  // c_str()
           ERROR;

    }
    return(mod  ?  R_createRef(mod, "Module") : R_NilValue );
}
Пример #30
0
SEXP
R_IRBuilder_CreatePtrDiff(SEXP r_builder, SEXP r_lhs, SEXP r_rhs, SEXP r_id)
{
    llvm::IRBuilder<> *builder;
    builder = GET_REF(r_builder, IRBuilder<>);
    llvm::Value *lhs = GET_REF(r_lhs, Value);
    llvm::Value *rhs = GET_REF(r_rhs, Value);

    llvm::Value *ret = builder->CreatePtrDiff(lhs, rhs); 

    if(Rf_length(r_id)) 
        ret->setName(makeTwine(r_id));
   
    return(R_createRef(ret, "PtrDiff"));
}