Unify argument builder API
All checks were successful
CI / ci (MinSizeRel, ubuntu-latest) (push) Successful in 1m12s
CI / ci (RelWithDebInfo, ubuntu-latest) (push) Successful in 1m14s
CI / ci (Release, ubuntu-latest) (push) Successful in 1m13s
CI / ci (Debug, ubuntu-latest) (push) Successful in 3m32s

This commit is contained in:
David Gonzalez Martin 2025-05-29 06:26:52 -06:00
parent 9138454892
commit d327813595
7 changed files with 34 additions and 32 deletions

View File

@ -183,6 +183,9 @@ fn String compile_file(Arena* arena, Compile options)
if (is_compiler)
{
// ArgBuilder builder = {};
// auto arguments = builder.flush();
// os_execute(arena, arguments, environment, {});
}
else if (base_name.equal(string_literal("c_abi")))
{
@ -327,7 +330,7 @@ global_variable String names[] =
string_literal("basic_struct_passing"),
};
void entry_point(Slice<const char*> arguments, Slice<char* const> envp)
void entry_point(Slice<char* const> arguments, Slice<char* const> envp)
{
environment = envp;
Arena* arena = arena_initialize_default(16 * mb);
@ -457,7 +460,7 @@ void entry_point(Slice<const char*> arguments, Slice<char* const> envp)
(char*)executable_path.pointer,
0,
};
Slice<const char* const> arg_slice = array_to_slice(arguments);
Slice<char* const> arg_slice = array_to_slice(arguments);
arg_slice.length -= 1;
auto execution = os_execute(arena, arg_slice, environment, {});
auto success = execution.termination_kind == TerminationKind::exit && execution.termination_code == 0;
@ -491,16 +494,16 @@ void entry_point(Slice<const char*> arguments, Slice<char* const> envp)
bool has_debug_info = true;
String relative_file_path_parts[] = { string_literal("tests/"), name, string_literal(".bbb") };
auto relative_file_path = arena_join_string(arena, array_to_slice(relative_file_path_parts));
const char* const arguments[] =
char* const arguments[] =
{
(char*)compiler.pointer,
"compile",
(char*)"compile",
(char*)relative_file_path.pointer,
(char*)build_mode_to_string(build_mode).pointer,
has_debug_info ? "true" : "false",
(char*)(has_debug_info ? "true" : "false"),
0,
};
Slice<const char* const> arg_slice = array_to_slice(arguments);
Slice<char* const> arg_slice = array_to_slice(arguments);
arg_slice.length -= 1;
auto execution = os_execute(arena, arg_slice, environment, {});
auto success = execution.termination_kind == TerminationKind::exit && execution.termination_code == 0;

View File

@ -1840,6 +1840,25 @@ fn Type* get_enum_array_type(Module* module, Type* enum_type, Type* element_type
return enum_array_type;
}
struct ArgBuilder
{
char* args[128];
u32 argument_count = 0;
void add(const char* arg)
{
assert(argument_count < array_length(args));
args[argument_count] = (char*)arg;
argument_count += 1;
}
Slice<char* const> flush()
{
assert(argument_count < array_length(args));
args[argument_count] = 0;
return { args, argument_count };
}
};
void parse(Module* module);
void emit(Module* module);

View File

@ -8316,27 +8316,7 @@ fn BBLLVMCodeGenerationPipelineResult generate_object(LLVMModuleRef module, LLVM
return result;
}
struct ArgBuilder
{
const char* args[128];
u32 argument_count = 0;
void add(const char* arg)
{
assert(argument_count < array_length(args));
args[argument_count] = arg;
argument_count += 1;
}
Slice<const char*> flush()
{
assert(argument_count < array_length(args));
args[argument_count] = 0;
return { args, argument_count };
}
};
void link(Module* module)
fn void link(Module* module)
{
Arena* arena = module->arena;
ArgBuilder builder;

View File

@ -1,5 +1,5 @@
#include <lib.hpp>
void entry_point(Slice<const char*> arguments, Slice<char* const> environment);
void entry_point(Slice<char* const> arguments, Slice<char* const> environment);
int main(int argc, const char* argv[], char* const envp[])
{
auto* envp_end = envp;
@ -8,6 +8,6 @@ int main(int argc, const char* argv[], char* const envp[])
envp_end += 1;
}
entry_point({argv, (u64)argc}, {envp, (u64)(envp_end - envp)});
entry_point(Slice<char* const>{(char* const*)argv, (u64)argc}, {envp, (u64)(envp_end - envp)});
return 0;
}

View File

@ -75,7 +75,7 @@ fn bool IFSIGNALED(u32 s)
{
return (s & 0xffff) - 1 < 0xff;
}
Execution os_execute(Arena* arena, Slice<const char* const> arguments, Slice<char* const> environment, ExecuteOptions options)
Execution os_execute(Arena* arena, Slice<char* const> arguments, Slice<char* const> environment, ExecuteOptions options)
{
unused(arena);
assert(arguments.pointer[arguments.length] == 0);

View File

@ -715,4 +715,4 @@ struct Execution
u32 termination_code;
};
Execution os_execute(Arena* arena, Slice<const char* const> arguments, Slice<char* const> environment, ExecuteOptions options);
Execution os_execute(Arena* arena, Slice<char* const> arguments, Slice<char* const> environment, ExecuteOptions options);

View File

@ -640,6 +640,6 @@ extern "C" void llvm_module_set_target(LLVMModuleRef m, LLVMTargetMachineRef tm)
extern "C" void llvm_module_run_optimization_pipeline(LLVMModuleRef module, LLVMTargetMachineRef target_machine, BBLLVMOptimizationPipelineOptions options);
extern "C" BBLLVMCodeGenerationPipelineResult llvm_module_run_code_generation_pipeline(LLVMModuleRef m, LLVMTargetMachineRef tm, const BBLLVMCodeGenerationPipelineOptions* options);
#define lld_api_args() const char** argument_pointer, u64 argument_count, bool exit_early, bool disable_output
#define lld_api_args() char* const* argument_pointer, u64 argument_count, bool exit_early, bool disable_output
#define lld_api_function_decl(link_name) LLDResult lld_ ## link_name ## _link(lld_api_args())
extern "C" lld_api_function_decl(elf);