wip
This commit is contained in:
parent
5e8a08d5be
commit
06773cfd6a
@ -1012,6 +1012,7 @@ CompileFile = struct
|
||||
relative_file_path: []u8,
|
||||
build_mode: BuildMode,
|
||||
has_debug_info: u1,
|
||||
host_cpu_model: u1,
|
||||
silent: u1,
|
||||
}
|
||||
|
||||
@ -1031,11 +1032,16 @@ Target = struct
|
||||
{
|
||||
cpu: CPUArchitecture,
|
||||
os: OperatingSystem,
|
||||
host_cpu_model: u1,
|
||||
}
|
||||
|
||||
target_get_native = fn () Target
|
||||
target_get_native = fn (host_cpu_model: u1) Target
|
||||
{
|
||||
return { .cpu = .x86_64, .os = .linux };
|
||||
return {
|
||||
.cpu = .x86_64,
|
||||
.os = .linux,
|
||||
.host_cpu_model = host_cpu_model,
|
||||
};
|
||||
}
|
||||
|
||||
target_compare = fn (a: Target, b: Target) u1
|
||||
@ -17179,13 +17185,22 @@ emit = fn (module: &Module) void
|
||||
>cpu_model: &u8 = zero;
|
||||
>cpu_features: &u8 = zero;
|
||||
|
||||
if (target_compare(module.target, target_get_native()))
|
||||
if (target_compare(module.target, target_get_native(module.target.host_cpu_model)))
|
||||
{
|
||||
target_triple = host_target_triple;
|
||||
|
||||
if (module.target.host_cpu_model)
|
||||
{
|
||||
cpu_model = host_cpu_model;
|
||||
cpu_features = host_cpu_features;
|
||||
}
|
||||
else
|
||||
{
|
||||
cpu_model = "generic";
|
||||
cpu_features = "";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
#trap();
|
||||
}
|
||||
@ -18273,30 +18288,45 @@ compile_file = fn (arena: &Arena, compile_options: CompileFile, envp: &&u8) []u8
|
||||
>base_name = relative_file_path[base_start..extension_start];
|
||||
|
||||
>is_compiler = string_equal(relative_file_path, "src/compiler.bbb");
|
||||
|
||||
os_make_directory(base_cache_dir.pointer);
|
||||
|
||||
>base_dir = arena_join_string(arena, [
|
||||
base_cache_dir,
|
||||
"/",
|
||||
#select(compile_options.host_cpu_model, "native", "generic"),
|
||||
][..]);
|
||||
|
||||
os_make_directory(base_dir.pointer);
|
||||
|
||||
base_dir = arena_join_string(arena, [
|
||||
base_dir,
|
||||
"/",
|
||||
#enum_name(#build_mode),
|
||||
"_",
|
||||
#select(#has_debug_info(), "di", "nodi"),
|
||||
][..]);
|
||||
>outputh_path_dir = arena_join_string(arena, [
|
||||
base_dir,
|
||||
#select(is_compiler, "/compiler/", "/"),
|
||||
#enum_name(compile_options.build_mode),
|
||||
"_",
|
||||
#select(compile_options.has_debug_info, "di", "nodi"),
|
||||
][..]);
|
||||
|
||||
os_make_directory(base_cache_dir.pointer);
|
||||
os_make_directory(base_dir.pointer);
|
||||
|
||||
if (is_compiler)
|
||||
{
|
||||
>compiler_dir = arena_join_string(arena, [ base_dir, "/compiler" ][..]);
|
||||
os_make_directory(compiler_dir.pointer);
|
||||
base_dir = arena_join_string(arena, [
|
||||
base_dir,
|
||||
"/compiler",
|
||||
][..]);
|
||||
|
||||
os_make_directory(base_dir.pointer);
|
||||
}
|
||||
|
||||
>outputh_path_dir = arena_join_string(arena, [
|
||||
base_dir,
|
||||
"/",
|
||||
#enum_name(compile_options.build_mode),
|
||||
"_",
|
||||
#select(compile_options.has_debug_info, "di", "nodi"),
|
||||
][..]);
|
||||
|
||||
os_make_directory(outputh_path_dir.pointer);
|
||||
|
||||
>outputh_path_base = arena_join_string(arena, [ outputh_path_dir, "/", base_name ][..]);
|
||||
@ -18456,7 +18486,7 @@ compile_file = fn (arena: &Arena, compile_options: CompileFile, envp: &&u8) []u8
|
||||
.content = file_content,
|
||||
.path = file_path,
|
||||
.has_debug_info = compile_options.has_debug_info,
|
||||
.target = target_get_native(),
|
||||
.target = target_get_native(compile_options.host_cpu_model),
|
||||
.silent = compile_options.silent,
|
||||
};
|
||||
|
||||
@ -18608,6 +18638,7 @@ names: [_][]u8 =
|
||||
}
|
||||
|
||||
>debug_info_array: [_]u1 = [1, 0];
|
||||
>is_host_cpu_model_array: [_]u1 = [1, 0];
|
||||
|
||||
>command = command_string_to_enum.enum_value;
|
||||
|
||||
@ -18661,6 +18692,7 @@ names: [_][]u8 =
|
||||
compile_file(arena, {
|
||||
.relative_file_path = relative_file_path,
|
||||
.build_mode = build_mode,
|
||||
.host_cpu_model = 0,
|
||||
.has_debug_info = has_debug_info,
|
||||
.silent = 0,
|
||||
}, envp);
|
||||
@ -18673,6 +18705,8 @@ names: [_][]u8 =
|
||||
}
|
||||
|
||||
for (name: names)
|
||||
{
|
||||
for (is_host_cpu_model: is_host_cpu_model_array)
|
||||
{
|
||||
for (build_mode: #enum_values(BuildMode))
|
||||
{
|
||||
@ -18685,6 +18719,7 @@ names: [_][]u8 =
|
||||
.relative_file_path = relative_file_path,
|
||||
.build_mode = build_mode,
|
||||
.has_debug_info = has_debug_info,
|
||||
.host_cpu_model = is_host_cpu_model,
|
||||
.silent = 1,
|
||||
}, envp);
|
||||
|
||||
@ -18706,8 +18741,11 @@ names: [_][]u8 =
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
.reproduce =>
|
||||
{
|
||||
for (is_host_cpu_model: is_host_cpu_model_array)
|
||||
{
|
||||
for (build_mode: #enum_values(BuildMode))
|
||||
{
|
||||
@ -18719,6 +18757,7 @@ names: [_][]u8 =
|
||||
>relative_file_path = "src/compiler.bbb";
|
||||
>executable_path = compile_file(arena, {
|
||||
.relative_file_path = relative_file_path,
|
||||
.host_cpu_model = is_host_cpu_model,
|
||||
.build_mode = build_mode,
|
||||
.has_debug_info = has_debug_info,
|
||||
.silent = 1,
|
||||
@ -18743,6 +18782,7 @@ names: [_][]u8 =
|
||||
arena.position = position;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -163,22 +163,39 @@ fn String compile_file(Arena* arena, Compile options)
|
||||
|
||||
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),
|
||||
is_compiler ? string_literal("/compiler/") : string_literal("/"),
|
||||
string_literal("/"),
|
||||
options.host_cpu_model ? string_literal("native") : string_literal("generic"),
|
||||
};
|
||||
|
||||
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,
|
||||
string_literal("/compiler"),
|
||||
};
|
||||
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),
|
||||
string_literal("_"),
|
||||
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));
|
||||
|
||||
make_directory(base_cache_dir);
|
||||
|
||||
if (is_compiler)
|
||||
{
|
||||
make_directory(base_cache_dir "/compiler");
|
||||
}
|
||||
|
||||
make_directory(cstr(output_path_dir));
|
||||
|
||||
String output_path_base_parts[] = {
|
||||
@ -341,6 +358,7 @@ fn String compile_file(Arena* arena, Compile options)
|
||||
.target = {
|
||||
.cpu = CPUArchitecture::x86_64,
|
||||
.os = OperatingSystem::linux_,
|
||||
.host_cpu_model = options.host_cpu_model,
|
||||
},
|
||||
.build_mode = options.build_mode,
|
||||
.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 is_host_cpu_model_array[] = {true, false};
|
||||
|
||||
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))
|
||||
{
|
||||
@ -599,6 +620,7 @@ void entry_point(Slice<char* const> arguments, Slice<char* const> envp)
|
||||
.relative_file_path = relative_file_path,
|
||||
.build_mode = build_mode,
|
||||
.has_debug_info = has_debug_info,
|
||||
.host_cpu_model = is_host_cpu_model,
|
||||
.silent = true,
|
||||
});
|
||||
|
||||
@ -623,6 +645,7 @@ void entry_point(Slice<char* const> arguments, Slice<char* const> envp)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BuildMode compiler_build_mode = BuildMode::debug_none;
|
||||
bool compiler_has_debug_info = true;
|
||||
|
@ -247,6 +247,7 @@ struct Target
|
||||
{
|
||||
CPUArchitecture cpu;
|
||||
OperatingSystem os;
|
||||
bool host_cpu_model;
|
||||
};
|
||||
|
||||
fn Target target_get_native()
|
||||
@ -270,6 +271,7 @@ struct Compile
|
||||
String relative_file_path;
|
||||
BuildMode build_mode;
|
||||
bool has_debug_info;
|
||||
bool host_cpu_model;
|
||||
bool silent;
|
||||
};
|
||||
|
||||
|
@ -416,17 +416,25 @@ fn void llvm_initialize(Module* module)
|
||||
module->scope.llvm = di_compile_unit;
|
||||
}
|
||||
|
||||
char* target_triple = {};
|
||||
char* cpu_model = {};
|
||||
char* cpu_features = {};
|
||||
const char* target_triple = {};
|
||||
const char* cpu_model = {};
|
||||
const char* cpu_features = {};
|
||||
|
||||
if (target_compare(module->target, target_get_native()))
|
||||
{
|
||||
target_triple = llvm_global.host_triple;
|
||||
if (module->target.host_cpu_model)
|
||||
{
|
||||
cpu_model = llvm_global.host_cpu_model;
|
||||
cpu_features = llvm_global.host_cpu_features;
|
||||
}
|
||||
else
|
||||
{
|
||||
cpu_model = "generic";
|
||||
cpu_features = "";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO
|
||||
report_error();
|
||||
|
Loading…
x
Reference in New Issue
Block a user