From d32781359548cb7831776717dd3f8a0f51998d1e Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Thu, 29 May 2025 06:26:52 -0600 Subject: [PATCH] Unify argument builder API --- src/compiler.cpp | 15 +++++++++------ src/compiler.hpp | 19 +++++++++++++++++++ src/emitter.cpp | 22 +--------------------- src/entry_point.cpp | 4 ++-- src/lib.cpp | 2 +- src/lib.hpp | 2 +- src/llvm.hpp | 2 +- 7 files changed, 34 insertions(+), 32 deletions(-) diff --git a/src/compiler.cpp b/src/compiler.cpp index a2c9ebb..c0e4874 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -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 arguments, Slice envp) +void entry_point(Slice arguments, Slice envp) { environment = envp; Arena* arena = arena_initialize_default(16 * mb); @@ -457,7 +460,7 @@ void entry_point(Slice arguments, Slice envp) (char*)executable_path.pointer, 0, }; - Slice arg_slice = array_to_slice(arguments); + Slice 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 arguments, Slice 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 arg_slice = array_to_slice(arguments); + Slice 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; diff --git a/src/compiler.hpp b/src/compiler.hpp index 7642928..cbd788b 100644 --- a/src/compiler.hpp +++ b/src/compiler.hpp @@ -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 flush() + { + assert(argument_count < array_length(args)); + args[argument_count] = 0; + return { args, argument_count }; + } +}; void parse(Module* module); void emit(Module* module); diff --git a/src/emitter.cpp b/src/emitter.cpp index 3eee46f..729bcad 100644 --- a/src/emitter.cpp +++ b/src/emitter.cpp @@ -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 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; diff --git a/src/entry_point.cpp b/src/entry_point.cpp index a6e60bf..97e54ea 100644 --- a/src/entry_point.cpp +++ b/src/entry_point.cpp @@ -1,5 +1,5 @@ #include -void entry_point(Slice arguments, Slice environment); +void entry_point(Slice arguments, Slice 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*)argv, (u64)argc}, {envp, (u64)(envp_end - envp)}); return 0; } diff --git a/src/lib.cpp b/src/lib.cpp index ff76892..f631bbe 100644 --- a/src/lib.cpp +++ b/src/lib.cpp @@ -75,7 +75,7 @@ fn bool IFSIGNALED(u32 s) { return (s & 0xffff) - 1 < 0xff; } -Execution os_execute(Arena* arena, Slice arguments, Slice environment, ExecuteOptions options) +Execution os_execute(Arena* arena, Slice arguments, Slice environment, ExecuteOptions options) { unused(arena); assert(arguments.pointer[arguments.length] == 0); diff --git a/src/lib.hpp b/src/lib.hpp index 424974f..f262391 100644 --- a/src/lib.hpp +++ b/src/lib.hpp @@ -715,4 +715,4 @@ struct Execution u32 termination_code; }; -Execution os_execute(Arena* arena, Slice arguments, Slice environment, ExecuteOptions options); +Execution os_execute(Arena* arena, Slice arguments, Slice environment, ExecuteOptions options); diff --git a/src/llvm.hpp b/src/llvm.hpp index 9855bca..806ac1e 100644 --- a/src/llvm.hpp +++ b/src/llvm.hpp @@ -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);