aboutsummaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2016-09-21 18:31:01 +0100
committerGinger Bill <bill@gingerbill.org>2016-09-21 18:31:01 +0100
commit33bd3f635f9d98636ab4631fac9cff4e9d7fdb4d (patch)
tree9d040210126baf0ff238b4cd5d132641fd5b026e /src/main.cpp
parent0e2347e582147019f904e25cf26aa70259c66e38 (diff)
Remove the need for clang
Replaced by: opt -> llc -> link
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp108
1 files changed, 59 insertions, 49 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 0ae2f684d..e4bf5fb7d 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -40,7 +40,7 @@ i32 win32_exec_command_line_app(char *fmt, ...) {
}
}
-
+// #define DISPLAY_TIMING
#if defined(DISPLAY_TIMING)
#define INIT_TIMER() f64 start_time = gb_time_now(), end_time = 0, total_time = 0
#define PRINT_TIMER(section) do { \
@@ -67,6 +67,18 @@ int main(int argc, char **argv) {
gb_printf_err("Please specify a .odin file\n");
return 1;
}
+ char module_path_buf[300] = {};
+ String module_path = {};
+ module_path.text = cast(u8 *)module_path_buf;
+ module_path.len = GetModuleFileNameA(NULL, module_path_buf, gb_size_of(module_path_buf));
+ for (isize i = module_path.len-1; i >= 0; i--) {
+ u8 c = module_path.text[i];
+ if (c == '/' || c == '\\') {
+ break;
+ }
+ module_path.len--;
+ }
+
INIT_TIMER();
@@ -81,12 +93,14 @@ int main(int argc, char **argv) {
Parser parser = {0};
- if (!init_parser(&parser))
+ if (!init_parser(&parser)) {
return 1;
+ }
// defer (destroy_parser(&parser));
- if (parse_files(&parser, init_filename) != ParseFile_None)
+ if (parse_files(&parser, init_filename) != ParseFile_None) {
return 1;
+ }
PRINT_TIMER("Syntax Parser");
@@ -109,8 +123,9 @@ int main(int argc, char **argv) {
#endif
#if 1
ssaGen ssa = {};
- if (!ssa_gen_init(&ssa, &checker))
+ if (!ssa_gen_init(&ssa, &checker)) {
return 1;
+ }
// defer (ssa_gen_destroy(&ssa));
ssa_gen_tree(&ssa);
@@ -124,73 +139,68 @@ int main(int argc, char **argv) {
char const *output_name = ssa.output_file.filename;
isize base_name_len = gb_path_extension(output_name)-1 - output_name;
+ String output = make_string(cast(u8 *)output_name, base_name_len);
i32 exit_code = 0;
- {
- char buf[300] = {};
- u32 buf_len = GetModuleFileNameA(GetModuleHandleA(NULL), buf, gb_size_of(buf));
- for (isize i = buf_len-1; i >= 0; i--) {
- if (buf[i] == '\\' ||
- buf[i] == '/') {
- break;
- }
- buf_len--;
- }
+ // For more passes arguments: http://llvm.org/docs/Passes.html
+ exit_code = win32_exec_command_line_app(
+ "%.*sbin/opt %s -o %.*s.bc "
+ "-memcpyopt "
+ "-mem2reg "
+ "-die -dse "
+ "-dce "
+ // "-S "
+ // "-debug-pass=Arguments "
+ "",
+ LIT(module_path),
+ output_name, LIT(output));
+ if (exit_code != 0) {
+ return exit_code;
+ }
- // For more passes arguments: http://llvm.org/docs/Passes.html
- exit_code = win32_exec_command_line_app(
- // "../misc/llvm-bin/opt %s -o %.*s.bc "
- "\"%.*sbin\\opt.exe\" %s -o %.*s.bc "
- "-memcpyopt "
- "-mem2reg "
- "-die -dse "
- "-dce "
- // "-S "
- // "-debug-pass=Arguments "
- "",
- buf_len, buf,
- output_name,
- cast(int)base_name_len, output_name);
- if (exit_code != 0)
- return exit_code;
-
- PRINT_TIMER("llvm-opt");
+ PRINT_TIMER("llvm-opt");
+
+ // For more arguments: http://llvm.org/docs/CommandGuide/llc.html
+ exit_code = win32_exec_command_line_app(
+ "%.*sbin/llc %.*s.bc -filetype=obj -O0 "
+ "-march=x86-64 "
+ "",
+ LIT(module_path),
+ LIT(output));
+ if (exit_code != 0) {
+ return exit_code;
}
-#if 1
- gbString lib_str = gb_string_make(gb_heap_allocator(), "-lKernel32");
+ PRINT_TIMER("llvm-llc");
+
+ gbString lib_str = gb_string_make(gb_heap_allocator(), "Kernel32.lib");
// defer (gb_string_free(lib_str));
char lib_str_buf[1024] = {};
gb_for_array(i, parser.system_libraries) {
String lib = parser.system_libraries[i];
isize len = gb_snprintf(lib_str_buf, gb_size_of(lib_str_buf),
- " -l%.*s", LIT(lib));
+ " %.*s.lib", LIT(lib));
lib_str = gb_string_appendc(lib_str, lib_str_buf);
}
+ char *linker_flags = "-nologo -DEFAULTLIB:libcmt -machine:x64 -incremental:no -opt:ref -subsystem:console";
exit_code = win32_exec_command_line_app(
- "clang %.*s.bc -o %.*s.exe "
- "-O0 -g "
- // "-O2 "
- "-Wno-override-module "
- "%s",
- cast(int)base_name_len, output_name,
- cast(int)base_name_len, output_name,
- lib_str);
-
- if (exit_code != 0)
+ "link %.*s.obj -OUT:%.*s.exe %s %s "
+ "",
+ LIT(output), LIT(output),
+ lib_str, linker_flags);
+ if (exit_code != 0) {
return exit_code;
+ }
- PRINT_TIMER("clang-compiler");
-
+ PRINT_TIMER("msvc-link");
+#endif
PRINT_ACCUMULATION();
if (run_output) {
win32_exec_command_line_app("%.*s.exe", cast(int)base_name_len, output_name);
}
-#endif
-#endif
return 0;
}