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" int main() { // CL source example: const char* 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"; // Compile size_t outputSpvSize = 0; char* outputSpv = nullptr; char* outputBuildLog = nullptr; ClspvError ret = clspvCompileFromSourcesString(1, NULL, (const char**)&clSrc, "", &outputSpv, &outputSpvSize, &outputBuildLog); printf("Build Log:\n%s\n", outputBuildLog); if (ret != CLSPV_SUCCESS) { // Handle error ... } // Cleanup clspvFreeOutputBuildObjs(outputSpv, outputBuildLog); /* // User can also cleanup like so: free(outputSpv); outputSpv = NULL; free(outputBuildLog); outputBuildLog = NULL; */ return 0; }
#include <cstdio> #include <cstdint> #include "clspv/Compiler.h" int main() { // Test/Build CL source example: const char* 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"; const char* 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 IR size_t outputBinSize = 0; char* outputBin = nullptr; char* outputBuildLog = nullptr; ClspvError ret = clspvCompileFromSourcesString(1, NULL, (const char**)&clSrc, "--output-format=bc ", &outputBin, &outputBinSize, &outputBuildLog); if (ret != CLSPV_SUCCESS) { // Handle error ... } // Compile second program to LLVM IR size_t outputBinSize2 = 0; char* outputBin2 = nullptr; char* outputBuildLog2 = nullptr; ret = clspvCompileFromSourcesString(1, NULL, (const char**)&clSrc2, "--output-format=bc ", &outputBin2, &outputBinSize2, &outputBuildLog2); if (ret != CLSPV_SUCCESS) { // Handle error ... } // Link programs size_t outputSpvSize = 0; char* outputSpv = nullptr; size_t outputBinSizes[2] = { outputBinSize, outputBinSize2 }; const char* outputBinChars[2] = { outputBin, outputBin2 }; char* outputBuildLog3 = nullptr; ret = clspvCompileFromSourcesString(2, outputBinSizes, outputBinChars, "-x ir ", &outputSpv, &outputSpvSize, &outputBuildLog3); if (ret != CLSPV_SUCCESS) { // Handle error ... } // Cleanup clspvFreeOutputBuildObjs(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; */ return 0; }