This commit is contained in:
David Gonzalez Martin 2025-06-22 09:16:57 -06:00
parent 5e8a08d5be
commit 27dd697cfd
4 changed files with 79 additions and 45 deletions

View File

@ -1031,11 +1031,12 @@ Target = struct
{ {
cpu: CPUArchitecture, cpu: CPUArchitecture,
os: OperatingSystem, os: OperatingSystem,
host_cpu_model: u1,
} }
target_get_native = fn () Target target_get_native = fn () Target
{ {
return { .cpu = .x86_64, .os = .linux }; return { .cpu = .x86_64, .os = .linux, zero };
} }
target_compare = fn (a: Target, b: Target) u1 target_compare = fn (a: Target, b: Target) u1

View File

@ -163,22 +163,39 @@ fn String compile_file(Arena* arena, Compile options)
auto is_compiler = relative_file_path.equal(string_literal("src/compiler.bbb")); auto is_compiler = relative_file_path.equal(string_literal("src/compiler.bbb"));
String output_path_dir_parts[] = { make_directory(base_cache_dir);
String cpu_dir_parts[] = {
string_literal(base_cache_dir), string_literal(base_cache_dir),
string_literal("/"),
options.host_cpu_model ? string_literal("native") : string_literal("baseline"),
};
auto cpu_dir = arena_join_string(arena, array_to_slice(cpu_dir_parts));
make_directory(cstr(cpu_dir));
auto base_dir = cpu_dir;
if (is_compiler)
{
String compiler_dir_parts[] = {
base_dir,
is_compiler ? string_literal("/compiler/") : string_literal("/"), is_compiler ? string_literal("/compiler/") : string_literal("/"),
};
base_dir = arena_join_string(arena, array_to_slice(compiler_dir_parts));
make_directory(cstr(base_dir));
}
String output_path_dir_parts[] = {
base_dir,
string_literal("/"),
build_mode_to_string(options.build_mode), build_mode_to_string(options.build_mode),
string_literal("_"), string_literal("_"),
options.has_debug_info ? string_literal("di") : string_literal("nodi"), options.has_debug_info ? string_literal("di") : string_literal("nodi"),
}; };
auto output_path_dir = arena_join_string(arena, array_to_slice(output_path_dir_parts)); auto output_path_dir = arena_join_string(arena, array_to_slice(output_path_dir_parts));
make_directory(base_cache_dir);
if (is_compiler)
{
make_directory(base_cache_dir "/compiler");
}
make_directory(cstr(output_path_dir)); make_directory(cstr(output_path_dir));
String output_path_base_parts[] = { String output_path_base_parts[] = {
@ -341,6 +358,7 @@ fn String compile_file(Arena* arena, Compile options)
.target = { .target = {
.cpu = CPUArchitecture::x86_64, .cpu = CPUArchitecture::x86_64,
.os = OperatingSystem::linux_, .os = OperatingSystem::linux_,
.host_cpu_model = options.host_cpu_model,
}, },
.build_mode = options.build_mode, .build_mode = options.build_mode,
.has_debug_info = options.has_debug_info, .has_debug_info = options.has_debug_info,
@ -583,8 +601,11 @@ void entry_point(Slice<char* const> arguments, Slice<char* const> envp)
} }
bool has_debug_info_array[] = {true, false}; bool has_debug_info_array[] = {true, false};
bool is_host_cpu_model_array[] = {true, false};
for (auto name: names) for (auto name: names)
{
for (auto is_host_cpu_model : is_host_cpu_model_array)
{ {
for (BuildMode build_mode = BuildMode::debug_none; build_mode < BuildMode::count; build_mode = (BuildMode)((backing_type(BuildMode))build_mode + 1)) for (BuildMode build_mode = BuildMode::debug_none; build_mode < BuildMode::count; build_mode = (BuildMode)((backing_type(BuildMode))build_mode + 1))
{ {
@ -599,6 +620,7 @@ void entry_point(Slice<char* const> arguments, Slice<char* const> envp)
.relative_file_path = relative_file_path, .relative_file_path = relative_file_path,
.build_mode = build_mode, .build_mode = build_mode,
.has_debug_info = has_debug_info, .has_debug_info = has_debug_info,
.host_cpu_model = is_host_cpu_model,
.silent = true, .silent = true,
}); });
@ -623,6 +645,7 @@ void entry_point(Slice<char* const> arguments, Slice<char* const> envp)
} }
} }
} }
}
BuildMode compiler_build_mode = BuildMode::debug_none; BuildMode compiler_build_mode = BuildMode::debug_none;
bool compiler_has_debug_info = true; bool compiler_has_debug_info = true;

View File

@ -247,6 +247,7 @@ struct Target
{ {
CPUArchitecture cpu; CPUArchitecture cpu;
OperatingSystem os; OperatingSystem os;
bool host_cpu_model;
}; };
fn Target target_get_native() fn Target target_get_native()
@ -270,6 +271,7 @@ struct Compile
String relative_file_path; String relative_file_path;
BuildMode build_mode; BuildMode build_mode;
bool has_debug_info; bool has_debug_info;
bool host_cpu_model;
bool silent; bool silent;
}; };

View File

@ -416,17 +416,25 @@ fn void llvm_initialize(Module* module)
module->scope.llvm = di_compile_unit; module->scope.llvm = di_compile_unit;
} }
char* target_triple = {}; const char* target_triple = {};
char* cpu_model = {}; const char* cpu_model = {};
char* cpu_features = {}; const char* cpu_features = {};
if (target_compare(module->target, target_get_native())) if (target_compare(module->target, target_get_native()))
{ {
target_triple = llvm_global.host_triple; target_triple = llvm_global.host_triple;
if (module->target.host_cpu_model)
{
cpu_model = llvm_global.host_cpu_model; cpu_model = llvm_global.host_cpu_model;
cpu_features = llvm_global.host_cpu_features; cpu_features = llvm_global.host_cpu_features;
} }
else else
{
cpu_model = "generic";
cpu_features = "";
}
}
else
{ {
// TODO // TODO
report_error(); report_error();