diff --git a/src/gallium/frontends/clover/llvm/invocation.cpp b/src/gallium/frontends/clover/llvm/invocation.cpp index 3cbb05baecf..ca030b404d7 100644 --- a/src/gallium/frontends/clover/llvm/invocation.cpp +++ b/src/gallium/frontends/clover/llvm/invocation.cpp @@ -24,6 +24,8 @@ // OTHER DEALINGS IN THE SOFTWARE. // +#include + #include #include #include @@ -39,6 +41,8 @@ #include #include #include +#include +#include #if LLVM_VERSION_MAJOR >= 20 #include @@ -323,6 +327,30 @@ namespace { return c; } + std::string getResourceDirectory() { + Dl_info info; + if (dladdr((void *)clang::CompilerInvocation::CreateFromArgs, &info) == 0) { + return FALLBACK_CLANG_RESOURCE_DIR; + } + + char *libclang_path = realpath(info.dli_fname, NULL); + if (libclang_path == nullptr) { + return FALLBACK_CLANG_RESOURCE_DIR; + } + + // GetResourcePath is a way to retrieve the actual libclang resource dir based on a given + // binary or library. + std::string clang_resource_dir = +#if LLVM_VERSION_MAJOR >= 20 + clang::driver::Driver::GetResourcesPath(std::string(libclang_path)); +#else + clang::driver::Driver::GetResourcesPath(std::string(libclang_path), CLANG_RESOURCE_DIR); +#endif + free(libclang_path); + + return clang_resource_dir; + } + std::unique_ptr compile(LLVMContext &ctx, clang::CompilerInstance &c, const std::string &name, const std::string &source, @@ -331,25 +359,18 @@ namespace { c.getFrontendOpts().ProgramAction = clang::frontend::EmitLLVMOnly; c.getHeaderSearchOpts().UseBuiltinIncludes = true; c.getHeaderSearchOpts().UseStandardSystemIncludes = true; - c.getHeaderSearchOpts().ResourceDir = CLANG_RESOURCE_DIR; - if (use_libclc) { - // Add libclc generic search path - c.getHeaderSearchOpts().AddPath(LIBCLC_INCLUDEDIR, - clang::frontend::Angled, - false, false); + std::string clang_resource_dir = getResourceDirectory(); + c.getHeaderSearchOpts().ResourceDir = clang_resource_dir; - // Add libclc include - c.getPreprocessorOpts().Includes.push_back("clc/clc.h"); - } else { - // Add opencl-c generic search path - c.getHeaderSearchOpts().AddPath(CLANG_RESOURCE_DIR, - clang::frontend::Angled, - false, false); + // Add opencl-c generic search path + std::string clang_include_path = clang_resource_dir + "/include"; + c.getHeaderSearchOpts().AddPath(clang_include_path, + clang::frontend::Angled, + false, false); - // Add opencl include - c.getPreprocessorOpts().Includes.push_back("opencl-c.h"); - } + // Add opencl include + c.getPreprocessorOpts().Includes.push_back("opencl-c.h"); // Add definition for the OpenCL version const auto dev_version = dev.device_version(); diff --git a/src/gallium/frontends/clover/meson.build b/src/gallium/frontends/clover/meson.build index e569b86a1be..56a9894f0db 100644 --- a/src/gallium/frontends/clover/meson.build +++ b/src/gallium/frontends/clover/meson.build @@ -10,7 +10,6 @@ clover_opencl_cpp_args = [ '-DCL_USE_DEPRECATED_OPENCL_2_0_APIS', '-DCL_USE_DEPRECATED_OPENCL_2_1_APIS', '-DCL_USE_DEPRECATED_OPENCL_2_2_APIS', - '-DLIBCLC_INCLUDEDIR="@0@/"'.format(dep_clc.get_variable(pkgconfig : 'includedir')), '-DLIBCLC_LIBEXECDIR="@0@/"'.format(dep_clc.get_variable(pkgconfig : 'libexecdir')) ] clover_incs = [inc_include, inc_src, inc_gallium, inc_gallium_aux] @@ -43,9 +42,9 @@ libclllvm = static_library( cpp_args : [ clover_cpp_args, clover_opencl_cpp_args, - '-DCLANG_RESOURCE_DIR="@0@"'.format(join_paths( + '-DFALLBACK_CLANG_RESOURCE_DIR="@0@"'.format(join_paths( dep_llvm.get_variable(cmake : 'LLVM_LIBRARY_DIR', configtool: 'libdir'), 'clang', - dep_llvm.version(), 'include', + dep_llvm.version() )), ], gnu_symbol_visibility : 'hidden',