mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-04 14:48:47 +00:00
Add -build-mode:assembly for -llvm-api
This commit is contained in:
@@ -101,6 +101,7 @@ enum BuildModeKind {
|
|||||||
BuildMode_Executable,
|
BuildMode_Executable,
|
||||||
BuildMode_DynamicLibrary,
|
BuildMode_DynamicLibrary,
|
||||||
BuildMode_Object,
|
BuildMode_Object,
|
||||||
|
BuildMode_Assembly,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+22
-14
@@ -11872,9 +11872,12 @@ void lb_generate_code(lbGenerator *gen) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GB_ASSERT_MSG(LLVMTargetHasAsmBackend(target));
|
||||||
|
|
||||||
LLVMTargetMachineRef target_machine = LLVMCreateTargetMachine(target, target_triple, llvm_cpu, llvm_features, LLVMCodeGenLevelNone, LLVMRelocDefault, code_mode);
|
LLVMTargetMachineRef target_machine = LLVMCreateTargetMachine(target, target_triple, llvm_cpu, llvm_features, LLVMCodeGenLevelNone, LLVMRelocDefault, code_mode);
|
||||||
defer (LLVMDisposeTargetMachine(target_machine));
|
defer (LLVMDisposeTargetMachine(target_machine));
|
||||||
|
|
||||||
|
|
||||||
LLVMSetModuleDataLayout(mod, LLVMCreateTargetDataLayout(target_machine));
|
LLVMSetModuleDataLayout(mod, LLVMCreateTargetDataLayout(target_machine));
|
||||||
|
|
||||||
{ // Debug Info
|
{ // Debug Info
|
||||||
@@ -12461,18 +12464,25 @@ void lb_generate_code(lbGenerator *gen) {
|
|||||||
defer (gb_free(heap_allocator(), filepath_ll.text));
|
defer (gb_free(heap_allocator(), filepath_ll.text));
|
||||||
|
|
||||||
String filepath_obj = {};
|
String filepath_obj = {};
|
||||||
switch (build_context.metrics.os) {
|
LLVMCodeGenFileType code_gen_file_type = LLVMObjectFile;
|
||||||
case TargetOs_windows:
|
|
||||||
filepath_obj = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".obj"));
|
if (build_context.build_mode == BuildMode_Assembly) {
|
||||||
break;
|
filepath_obj = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".S"));
|
||||||
case TargetOs_darwin:
|
code_gen_file_type = LLVMAssemblyFile;
|
||||||
case TargetOs_linux:
|
} else {
|
||||||
case TargetOs_essence:
|
switch (build_context.metrics.os) {
|
||||||
filepath_obj = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".o"));
|
case TargetOs_windows:
|
||||||
break;
|
filepath_obj = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".obj"));
|
||||||
case TargetOs_js:
|
break;
|
||||||
filepath_obj = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".wasm-obj"));
|
case TargetOs_darwin:
|
||||||
break;
|
case TargetOs_linux:
|
||||||
|
case TargetOs_essence:
|
||||||
|
filepath_obj = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".o"));
|
||||||
|
break;
|
||||||
|
case TargetOs_js:
|
||||||
|
filepath_obj = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".wasm-obj"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -12492,8 +12502,6 @@ void lb_generate_code(lbGenerator *gen) {
|
|||||||
|
|
||||||
TIME_SECTION("LLVM Object Generation");
|
TIME_SECTION("LLVM Object Generation");
|
||||||
|
|
||||||
LLVMCodeGenFileType code_gen_file_type = LLVMObjectFile;
|
|
||||||
|
|
||||||
if (LLVMTargetMachineEmitToFile(target_machine, mod, cast(char *)filepath_obj.text, code_gen_file_type, &llvm_error)) {
|
if (LLVMTargetMachineEmitToFile(target_machine, mod, cast(char *)filepath_obj.text, code_gen_file_type, &llvm_error)) {
|
||||||
gb_printf_err("LLVM Error: %s\n", llvm_error);
|
gb_printf_err("LLVM Error: %s\n", llvm_error);
|
||||||
gb_exit(1);
|
gb_exit(1);
|
||||||
|
|||||||
+17
-4
@@ -1061,6 +1061,8 @@ bool parse_build_flags(Array<String> args) {
|
|||||||
build_context.build_mode = BuildMode_Object;
|
build_context.build_mode = BuildMode_Object;
|
||||||
} else if (str == "exe") {
|
} else if (str == "exe") {
|
||||||
build_context.build_mode = BuildMode_Executable;
|
build_context.build_mode = BuildMode_Executable;
|
||||||
|
} else if (str == "asm" || str == "assembly" || str == "assembler") {
|
||||||
|
build_context.build_mode = BuildMode_Assembly;
|
||||||
} else {
|
} else {
|
||||||
gb_printf_err("Unknown build mode '%.*s'\n", LIT(str));
|
gb_printf_err("Unknown build mode '%.*s'\n", LIT(str));
|
||||||
bad_flags = true;
|
bad_flags = true;
|
||||||
@@ -1762,6 +1764,12 @@ int main(int arg_count, char const **arg_ptr) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!build_context.use_llvm_api) {
|
||||||
|
if (build_context.build_mode == BuildMode_Assembly) {
|
||||||
|
print_usage_line(0, "-build-mode:assembly is only supported with the -llvm-api backend", LIT(args[0]));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
init_universal();
|
init_universal();
|
||||||
// TODO(bill): prevent compiling without a linker
|
// TODO(bill): prevent compiling without a linker
|
||||||
@@ -1825,11 +1833,16 @@ int main(int arg_count, char const **arg_ptr) {
|
|||||||
}
|
}
|
||||||
lb_generate_code(&gen);
|
lb_generate_code(&gen);
|
||||||
|
|
||||||
if (build_context.build_mode != BuildMode_Object) {
|
switch (build_context.build_mode) {
|
||||||
i32 linker_stage_exit_count = linker_stage(&gen);
|
case BuildMode_Executable:
|
||||||
if (linker_stage_exit_count != 0) {
|
case BuildMode_DynamicLibrary:
|
||||||
return linker_stage_exit_count;
|
{
|
||||||
|
i32 linker_stage_exit_count = linker_stage(&gen);
|
||||||
|
if (linker_stage_exit_count != 0) {
|
||||||
|
return linker_stage_exit_count;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (build_context.show_timings) {
|
if (build_context.show_timings) {
|
||||||
|
|||||||
Reference in New Issue
Block a user