There is a C API for shared lib version of Clspv.
This C API allows for compiling OpenCL C as well as linking IR generated by Clspv.
User will need to enable CMake option to enable building Clspv as a shared lib:
$ cmake -DCLSPV_SHARED_LIB=ON ...
#include<cstdio> #include<cstdint> #include"clspv/Compiler.h"intmain() { // CL source example:constchar* clSrc = "__kernel void sample_test(__global int *dst, int count) { \n""\n"" int tid = get_global_id(0); \n"" for( int i = 0; i < count; i++ ) \n"" dst[i] = tid + i; \n""} \n"; // Compilesize_t outputSpvSize = 0; char* outputSpv = nullptr; char* outputBuildLog = nullptr; ClspvError ret = clspvCompileFromSourcesString(1, NULL, (constchar**)&clSrc, "", &outputSpv, &outputSpvSize, &outputBuildLog); printf("Build Log:\n%s\n", outputBuildLog); if (ret != CLSPV_SUCCESS) { // Handle error ... } // CleanupclspvFreeOutputBuildObjs(outputSpv, outputBuildLog); /* // User can also cleanup like so: free(outputSpv); outputSpv = NULL; free(outputBuildLog); outputBuildLog = NULL;*/return0; }
#include<cstdio> #include<cstdint> #include"clspv/Compiler.h"intmain() { // Test/Build CL source example:constchar* clSrc = "__kernel void sample_test(__global int *dst, int count) { \n""\n"" int tid = get_global_id(0); \n"" for( int i = 0; i < count; i++ ) \n"" dst[i] = tid + i; \n""} \n"; constchar* clSrc2 = "__kernel void sample_test2(__global float *src, __global int *dst) { \n"" int tid = get_global_id(0); \n"" dst[tid] = (int)src[tid]; \n""} \n"; // Compile first program to LLVM IRsize_t outputBinSize = 0; char* outputBin = nullptr; char* outputBuildLog = nullptr; ClspvError ret = clspvCompileFromSourcesString(1, NULL, (constchar**)&clSrc, "--output-format=bc ", &outputBin, &outputBinSize, &outputBuildLog); if (ret != CLSPV_SUCCESS) { // Handle error ... } // Compile second program to LLVM IRsize_t outputBinSize2 = 0; char* outputBin2 = nullptr; char* outputBuildLog2 = nullptr; ret = clspvCompileFromSourcesString(1, NULL, (constchar**)&clSrc2, "--output-format=bc ", &outputBin2, &outputBinSize2, &outputBuildLog2); if (ret != CLSPV_SUCCESS) { // Handle error ... } // Link programssize_t outputSpvSize = 0; char* outputSpv = nullptr; size_t outputBinSizes[2] = { outputBinSize, outputBinSize2 }; constchar* outputBinChars[2] = { outputBin, outputBin2 }; char* outputBuildLog3 = nullptr; ret = clspvCompileFromSourcesString(2, outputBinSizes, outputBinChars, "-x ir ", &outputSpv, &outputSpvSize, &outputBuildLog3); if (ret != CLSPV_SUCCESS) { // Handle error ... } // CleanupclspvFreeOutputBuildObjs(outputBin, outputBuildLog); clspvFreeOutputBuildObjs(outputBin2, outputBuildLog2); clspvFreeOutputBuildObjs(outputSpv, outputBuildLog3); /* // User can also cleanup like so: free(outputBin); outputBin = NULL; free(outputBuildLog); outputBuildLog = NULL; free(outputBin2); outputBin2 = NULL; free(outputBuildLog2); outputBuildLog2 = NULL; free(outputSpv); outputSpv = NULL; free(outputBuildLog3); outputBuildLog3 = NULL;*/return0; }