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:
Dylan Baker 2024-03-22 11:43:42 -07:00 committed by Alyssa Rosenzweig
parent 483c40a21d
commit 33a1acb0da
8 changed files with 44 additions and 17 deletions

View file

@ -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)

View file

@ -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,

View file

@ -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);
}

View file

@ -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,

View file

@ -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;
}

View file

@ -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 {

View file

@ -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;
}

View file

@ -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;