mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-04 00:30:11 +01:00
clc: Tell clang to track imported dependencies
Clang is capable of tacking what headers it imports, as long as we set it up to do that. While that isn't important for rusticl, it would be useful for the various `_clc` tools, as they can then tell Ninja which headers they read to make rebuilds more reliable. Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Reviewed-by: Dylan Baker <dylan.c.baker@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32505>
This commit is contained in:
parent
483c40a21d
commit
33a1acb0da
8 changed files with 44 additions and 17 deletions
|
|
@ -91,9 +91,10 @@ clc_print_kernels_info(const struct clc_parsed_spirv *obj)
|
|||
bool
|
||||
clc_compile_c_to_spir(const struct clc_compile_args *args,
|
||||
const struct clc_logger *logger,
|
||||
struct clc_binary *out_spir)
|
||||
struct clc_binary *out_spir,
|
||||
struct set *dependencies)
|
||||
{
|
||||
return clc_c_to_spir(args, logger, out_spir) >= 0;
|
||||
return clc_c_to_spir(args, logger, out_spir, dependencies) >= 0;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -125,9 +126,10 @@ clc_free_spirv(struct clc_binary *spirv)
|
|||
bool
|
||||
clc_compile_c_to_spirv(const struct clc_compile_args *args,
|
||||
const struct clc_logger *logger,
|
||||
struct clc_binary *out_spirv)
|
||||
struct clc_binary *out_spirv,
|
||||
struct set *dependencies)
|
||||
{
|
||||
if (clc_c_to_spirv(args, logger, out_spirv) < 0)
|
||||
if (clc_c_to_spirv(args, logger, out_spirv, dependencies) < 0)
|
||||
return false;
|
||||
|
||||
if (debug_get_option_debug_clc() & CLC_DEBUG_DUMP_SPIRV)
|
||||
|
|
|
|||
|
|
@ -210,10 +210,14 @@ void clc_libclc_serialize(struct clc_libclc *lib, void **serialized, size_t *siz
|
|||
void clc_libclc_free_serialized(void *serialized);
|
||||
struct clc_libclc *clc_libclc_deserialize(const void *serialized, size_t size);
|
||||
|
||||
/* Forward declare */
|
||||
struct set;
|
||||
|
||||
bool
|
||||
clc_compile_c_to_spir(const struct clc_compile_args *args,
|
||||
const struct clc_logger *logger,
|
||||
struct clc_binary *out_spir);
|
||||
struct clc_binary *out_spir,
|
||||
struct set *dependencies);
|
||||
|
||||
void
|
||||
clc_free_spir(struct clc_binary *spir);
|
||||
|
|
@ -229,7 +233,8 @@ clc_free_spirv(struct clc_binary *spirv);
|
|||
bool
|
||||
clc_compile_c_to_spirv(const struct clc_compile_args *args,
|
||||
const struct clc_logger *logger,
|
||||
struct clc_binary *out_spirv);
|
||||
struct clc_binary *out_spirv,
|
||||
struct set *dependencies);
|
||||
|
||||
bool
|
||||
clc_link_spirv(const struct clc_linker_args *args,
|
||||
|
|
|
|||
|
|
@ -28,6 +28,8 @@
|
|||
#include <sstream>
|
||||
#include <mutex>
|
||||
|
||||
#include "util/ralloc.h"
|
||||
#include "util/set.h"
|
||||
#include <llvm/ADT/ArrayRef.h>
|
||||
#include <llvm/IR/DiagnosticPrinter.h>
|
||||
#include <llvm/IR/DiagnosticInfo.h>
|
||||
|
|
@ -50,6 +52,7 @@
|
|||
#include <clang/Frontend/CompilerInstance.h>
|
||||
#include <clang/Frontend/TextDiagnosticBuffer.h>
|
||||
#include <clang/Frontend/TextDiagnosticPrinter.h>
|
||||
#include <clang/Frontend/Utils.h>
|
||||
#include <clang/Basic/TargetInfo.h>
|
||||
|
||||
#include <spirv-tools/libspirv.hpp>
|
||||
|
|
@ -780,7 +783,8 @@ clc_free_kernels_info(const struct clc_kernel_info *kernels,
|
|||
static std::unique_ptr<::llvm::Module>
|
||||
clc_compile_to_llvm_module(LLVMContext &llvm_ctx,
|
||||
const struct clc_compile_args *args,
|
||||
const struct clc_logger *logger)
|
||||
const struct clc_logger *logger,
|
||||
struct set *dependencies)
|
||||
{
|
||||
static_assert(std::has_unique_object_representations<clc_optional_features>(),
|
||||
"no padding allowed inside clc_optional_features");
|
||||
|
|
@ -789,6 +793,11 @@ clc_compile_to_llvm_module(LLVMContext &llvm_ctx,
|
|||
raw_string_ostream diag_log_stream { diag_log_str };
|
||||
|
||||
std::unique_ptr<clang::CompilerInstance> c { new clang::CompilerInstance };
|
||||
std::shared_ptr<clang::DependencyCollector> dep;
|
||||
if (dependencies != nullptr) {
|
||||
dep = std::make_shared<clang::DependencyCollector>();
|
||||
c->addDependencyCollector(dep);
|
||||
}
|
||||
|
||||
clang::DiagnosticsEngine diag {
|
||||
new clang::DiagnosticIDs,
|
||||
|
|
@ -1038,6 +1047,12 @@ clc_compile_to_llvm_module(LLVMContext &llvm_ctx,
|
|||
return {};
|
||||
}
|
||||
|
||||
if (dependencies != nullptr) {
|
||||
for (auto dep : dep->getDependencies()) {
|
||||
_mesa_set_add(dependencies, ralloc_strdup(dependencies, dep.c_str()));
|
||||
}
|
||||
}
|
||||
|
||||
auto mod = act.takeModule();
|
||||
|
||||
if (clc_debug_flags() & CLC_DEBUG_DUMP_LLVM)
|
||||
|
|
@ -1159,7 +1174,8 @@ llvm_mod_to_spirv(std::unique_ptr<::llvm::Module> mod,
|
|||
int
|
||||
clc_c_to_spir(const struct clc_compile_args *args,
|
||||
const struct clc_logger *logger,
|
||||
struct clc_binary *out_spir)
|
||||
struct clc_binary *out_spir,
|
||||
struct set *dependencies)
|
||||
{
|
||||
clc_initialize_llvm();
|
||||
|
||||
|
|
@ -1167,7 +1183,7 @@ clc_c_to_spir(const struct clc_compile_args *args,
|
|||
llvm_ctx.setDiagnosticHandlerCallBack(llvm_log_handler,
|
||||
const_cast<clc_logger *>(logger));
|
||||
|
||||
auto mod = clc_compile_to_llvm_module(llvm_ctx, args, logger);
|
||||
auto mod = clc_compile_to_llvm_module(llvm_ctx, args, logger, dependencies);
|
||||
if (!mod)
|
||||
return -1;
|
||||
|
||||
|
|
@ -1185,7 +1201,8 @@ clc_c_to_spir(const struct clc_compile_args *args,
|
|||
int
|
||||
clc_c_to_spirv(const struct clc_compile_args *args,
|
||||
const struct clc_logger *logger,
|
||||
struct clc_binary *out_spirv)
|
||||
struct clc_binary *out_spirv,
|
||||
struct set *dependencies)
|
||||
{
|
||||
clc_initialize_llvm();
|
||||
|
||||
|
|
@ -1193,9 +1210,10 @@ clc_c_to_spirv(const struct clc_compile_args *args,
|
|||
llvm_ctx.setDiagnosticHandlerCallBack(llvm_log_handler,
|
||||
const_cast<clc_logger *>(logger));
|
||||
|
||||
auto mod = clc_compile_to_llvm_module(llvm_ctx, args, logger);
|
||||
auto mod = clc_compile_to_llvm_module(llvm_ctx, args, logger, dependencies);
|
||||
if (!mod)
|
||||
return -1;
|
||||
|
||||
return llvm_mod_to_spirv(std::move(mod), llvm_ctx, args, logger, out_spirv);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -56,7 +56,8 @@ clc_free_kernels_info(const struct clc_kernel_info *kernels,
|
|||
int
|
||||
clc_c_to_spir(const struct clc_compile_args *args,
|
||||
const struct clc_logger *logger,
|
||||
struct clc_binary *out_spir);
|
||||
struct clc_binary *out_spir,
|
||||
struct set *dependencies);
|
||||
|
||||
int
|
||||
clc_spir_to_spirv(const struct clc_binary *in_spir,
|
||||
|
|
@ -66,7 +67,8 @@ clc_spir_to_spirv(const struct clc_binary *in_spir,
|
|||
int
|
||||
clc_c_to_spirv(const struct clc_compile_args *args,
|
||||
const struct clc_logger *logger,
|
||||
struct clc_binary *out_spirv);
|
||||
struct clc_binary *out_spirvl,
|
||||
struct set *dependencies);
|
||||
|
||||
int
|
||||
clc_link_spirv_binaries(const struct clc_linker_args *args,
|
||||
|
|
|
|||
|
|
@ -155,7 +155,7 @@ main(int argc, char **argv)
|
|||
struct clc_binary *spirv_out =
|
||||
util_dynarray_grow(&spirv_objs, struct clc_binary, 1);
|
||||
|
||||
if (!clc_compile_c_to_spirv(&clc_args, &logger, spirv_out)) {
|
||||
if (!clc_compile_c_to_spirv(&clc_args, &logger, spirv_out, NULL)) {
|
||||
ralloc_free(mem_ctx);
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -157,7 +157,7 @@ impl SPIRVBin {
|
|||
let logger = create_clc_logger(&mut msgs);
|
||||
let mut out = clc_binary::default();
|
||||
|
||||
let res = unsafe { clc_compile_c_to_spirv(&args, &logger, &mut out) };
|
||||
let res = unsafe { clc_compile_c_to_spirv(&args, &logger, &mut out, ptr::null_mut()) };
|
||||
|
||||
let res = if res {
|
||||
let spirv = SPIRVBin {
|
||||
|
|
|
|||
|
|
@ -635,7 +635,7 @@ int main(int argc, char **argv)
|
|||
.allowed_spirv_extensions = allowed_spirv_extensions,
|
||||
};
|
||||
|
||||
if (!clc_compile_c_to_spirv(&clc_args, &logger, &spirv_obj)) {
|
||||
if (!clc_compile_c_to_spirv(&clc_args, &logger, &spirv_obj, NULL)) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -810,7 +810,7 @@ ComputeTest::compile(const std::vector<const char *> &sources,
|
|||
args.source.value = sources[i];
|
||||
|
||||
clc_binary spirv{};
|
||||
if (!clc_compile_c_to_spirv(&args, &logger, &spirv))
|
||||
if (!clc_compile_c_to_spirv(&args, &logger, &spirv, NULL))
|
||||
throw runtime_error("failed to compile object!");
|
||||
|
||||
Shader shader;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue