diff options
| author | gingerBill <ginger.bill.22@gmail.com> | 2016-08-16 12:33:11 +0100 |
|---|---|---|
| committer | gingerBill <ginger.bill.22@gmail.com> | 2016-08-16 12:33:11 +0100 |
| commit | 5da6b74567793e15cf651be50edbfe407f42a714 (patch) | |
| tree | c629e026d2d3149b8868bd19972c28ec231071da /src/main.cpp | |
| parent | 6f7f82d87766d4d60165ea54f2ee760f9ad12bc0 (diff) | |
Compile with odin.exe and no run.bat
This is win32 only and requires CreateProcessA
Diffstat (limited to 'src/main.cpp')
| -rw-r--r-- | src/main.cpp | 88 |
1 files changed, 66 insertions, 22 deletions
diff --git a/src/main.cpp b/src/main.cpp index 9b5b99aaa..f4240dec1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,46 +6,90 @@ #include "checker/checker.cpp" #include "codegen/codegen.cpp" +void win32_exec_command_line_app(char *fmt, ...) { + STARTUPINFOA start_info = {gb_size_of(STARTUPINFOA)}; + PROCESS_INFORMATION pi = {}; + start_info.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; + start_info.wShowWindow = SW_SHOW; + start_info.hStdInput = GetStdHandle(STD_INPUT_HANDLE); + start_info.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); + start_info.hStdError = GetStdHandle(STD_ERROR_HANDLE); + + char cmd_line[2048] = {}; + va_list va; + va_start(va, fmt); + gb_snprintf_va(cmd_line, gb_size_of(cmd_line), fmt, va); + va_end(va); + + if (CreateProcessA(NULL, cmd_line, + NULL, NULL, true, 0, NULL, NULL, + &start_info, &pi)) { + WaitForSingleObject(pi.hProcess, INFINITE); + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } else { + // NOTE(bill): failed to create process + } + +} + int main(int argc, char **argv) { if (argc < 2) { gb_printf_err("Please specify a .odin file\n"); return 1; } - int success = 1; - init_universal_scope(); - for (int arg_index = 1; arg_index < argc; arg_index++) { - char *arg = argv[arg_index]; - char *init_filename = arg; - Parser parser = {0}; + char *init_filename = argv[1]; + b32 run_output = false; + if (gb_strncmp(argv[1], "run", 3) == 0) { + run_output = true; + init_filename = argv[2]; + } + Parser parser = {0}; + + + if (init_parser(&parser)) { + defer (destroy_parser(&parser)); + + if (parse_files(&parser, init_filename) == ParseFile_None) { + // print_ast(parser.files[0].decls, 0); - if (init_parser(&parser)) { - defer (destroy_parser(&parser)); + Checker checker = {}; - if (parse_files(&parser, init_filename) == ParseFile_None) { - // print_ast(parser.files[0].declarations, 0); + init_checker(&checker, &parser); + defer (destroy_checker(&checker)); - Checker checker = {}; + check_parsed_files(&checker); + ssaGen ssa = {}; + if (ssa_gen_init(&ssa, &checker)) { + defer (ssa_gen_destroy(&ssa)); - init_checker(&checker, &parser); - defer (destroy_checker(&checker)); + ssa_gen_code(&ssa); - check_parsed_files(&checker); - ssaGen ssa = {}; - if (ssa_gen_init(&ssa, &checker)) { - defer (ssa_gen_destroy(&ssa)); + char const *output_name = ssa.output_file.filename; + isize base_name_len = gb_path_extension(output_name)-1 - output_name; - ssa_gen_code(&ssa); + win32_exec_command_line_app( + "opt -mem2reg %s -o %.*s.bc", + output_name, cast(int)base_name_len, output_name); + win32_exec_command_line_app( + "clang %.*s.bc -o %.*s.exe -Wno-override-module " + "-lkernel32.lib -luser32.lib", + cast(int)base_name_len, output_name, + cast(int)base_name_len, output_name); - success = 0; - } else { - gb_printf("Failed to build: %s\n", init_filename); + + if (run_output) { + win32_exec_command_line_app("%.*s.exe", cast(int)base_name_len, output_name); } + + + return 0; } } } - return success; + return 1; } |