From e22491c83265200f518e9fb4deff54e3c2823b68 Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Tue, 22 Nov 2022 11:48:08 +0100 Subject: [PATCH] clc: fetch clang resource dir at runtime Signed-off-by: Karol Herbst Reviewed-by: Jesse Natalie Part-of: --- src/compiler/clc/clc_helpers.cpp | 15 +++++++++++++-- src/compiler/clc/meson.build | 4 ++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/compiler/clc/clc_helpers.cpp b/src/compiler/clc/clc_helpers.cpp index 5827d066338..fe30b6aac0f 100644 --- a/src/compiler/clc/clc_helpers.cpp +++ b/src/compiler/clc/clc_helpers.cpp @@ -23,6 +23,7 @@ // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. +#include #include #include @@ -38,6 +39,7 @@ #include #include +#include #include #include #include @@ -63,6 +65,8 @@ #include "clc_helpers.h" +namespace fs = std::filesystem; + /* Use the highest version of SPIRV supported by SPIRV-Tools. */ constexpr spv_target_env spirv_target = SPV_ENV_UNIVERSAL_1_5; @@ -853,12 +857,19 @@ clc_compile_to_llvm_module(LLVMContext &llvm_ctx, ::llvm::MemoryBuffer::getMemBuffer(llvm::StringRef(opencl_c_base_source, ARRAY_SIZE(opencl_c_base_source) - 1)).release()); } #else + // GetResourcePath is a way to retrive the actual libclang resource dir based on a given binary + // or library. The path doesn't even need to exist, we just have to put something in there, + // because we might have linked clang statically. + auto libclang_path = fs::path(LLVM_LIB_DIR) / "libclang.so"; + auto clang_res_path = + fs::path(clang::driver::Driver::GetResourcesPath(libclang_path.string())) / "include"; + c->getHeaderSearchOpts().UseBuiltinIncludes = true; c->getHeaderSearchOpts().UseStandardSystemIncludes = true; - c->getHeaderSearchOpts().ResourceDir = CLANG_RESOURCE_DIR; + c->getHeaderSearchOpts().ResourceDir = clang_res_path.string(); // Add opencl-c generic search path - c->getHeaderSearchOpts().AddPath(CLANG_RESOURCE_DIR, + c->getHeaderSearchOpts().AddPath(clang_res_path.string(), clang::frontend::Angled, false, false); // Add opencl include diff --git a/src/compiler/clc/meson.build b/src/compiler/clc/meson.build index 4fd4a220f6a..caae07e26dd 100644 --- a/src/compiler/clc/meson.build +++ b/src/compiler/clc/meson.build @@ -19,17 +19,17 @@ # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS # IN THE SOFTWARE. -clang_resource_dir = join_paths(llvm_libdir, 'clang', dep_llvm.version(), 'include') files_libclc = files( 'clc.c', 'clc_helpers.cpp', ) -_libclc_cpp_args = ['-DCLANG_RESOURCE_DIR="@0@"'.format(clang_resource_dir)] +_libclc_cpp_args = ['-DLLVM_LIB_DIR="@0@"'.format(llvm_libdir)] _libclc_sources = [] if with_microsoft_clc + clang_resource_dir = join_paths(llvm_libdir, 'clang', dep_llvm.version(), 'include') if dep_llvm.version().version_compare('< 15.0') opencl_c_h = custom_target( 'opencl-c.h',