diff options
Diffstat (limited to 'src/tilde_backend.cpp')
| -rw-r--r-- | src/tilde_backend.cpp | 167 |
1 files changed, 108 insertions, 59 deletions
diff --git a/src/tilde_backend.cpp b/src/tilde_backend.cpp index dd3c8e537..8009a7703 100644 --- a/src/tilde_backend.cpp +++ b/src/tilde_backend.cpp @@ -458,6 +458,22 @@ gb_internal TB_FunctionPrototype *cg_procedure_type_as_prototype(cgModule *m, Ty case Basic_f64be: param.dt = TB_TYPE_F64; break; } + case Type_Pointer: + case Type_MultiPointer: + case Type_Proc: + param.dt = TB_TYPE_PTR; + break; + + default: + switch (sz) { + case 1: param.dt = TB_TYPE_I8; break; + case 2: param.dt = TB_TYPE_I16; break; + case 4: param.dt = TB_TYPE_I32; break; + case 8: param.dt = TB_TYPE_I64; break; + default: + param.dt = TB_TYPE_PTR; + break; + } } if (param.dt.width != 0) { @@ -468,7 +484,13 @@ gb_internal TB_FunctionPrototype *cg_procedure_type_as_prototype(cgModule *m, Ty } } - return tb_prototype_create(m->mod, TB_CDECL, params.count, params.data, 0, nullptr, false); + auto results = array_make<TB_PrototypeParam>(heap_allocator(), 0, pt->result_count); + // if (pt->results) for (Entity *e : pt->params->Tuple.variables) { + // // TODO(bill): + // } + + + return tb_prototype_create(m->mod, TB_CDECL, params.count, params.data, results.count, results.data, pt->c_vararg); } gb_internal cgProcedure *cg_procedure_create(cgModule *m, Entity *entity, bool ignore_body=false) { @@ -619,7 +641,8 @@ gb_internal void cg_procedure_generate(cgProcedure *p) { cg_procedure_begin(p); defer (cg_procedure_end(p)); - if (p->name != "bug.main") { + if (p->name != "bug.main" && + p->name != "main") { return; } if (p->body != nullptr) { @@ -628,8 +651,12 @@ gb_internal void cg_procedure_generate(cgProcedure *p) { } +#include "tilde_const.cpp" +#include "tilde_expr.cpp" #include "tilde_stmt.cpp" + + gb_internal bool cg_generate_code(Checker *c) { TIME_SECTION("Tilde Module Initializtion"); @@ -722,88 +749,110 @@ gb_internal bool cg_generate_code(Checker *c) { cg_procedure_generate(m->procedures_to_generate[i]); } + TB_DebugFormat debug_format = TB_DEBUGFMT_NONE; + if (build_context.ODIN_DEBUG) { + switch (build_context.metrics.os) { + case TargetOs_windows: + debug_format = TB_DEBUGFMT_CODEVIEW; + break; + case TargetOs_darwin: + case TargetOs_linux: + case TargetOs_essence: + case TargetOs_freebsd: + case TargetOs_openbsd: + debug_format = TB_DEBUGFMT_DWARF; + break; + } + } + TB_ExportBuffer export_buffer = tb_module_object_export(m->mod, debug_format); + defer (tb_export_buffer_free(export_buffer)); + + char const *path = "W:/Odin/tilde_main.obj"; + GB_ASSERT(tb_export_buffer_to_file(export_buffer, path)); //////////////////////////////////////////////////////////////////////////////////// - TB_Arena *arena = tb_default_arena(); + // TB_Arena *arena = tb_default_arena(); - TB_Global *str = nullptr; - { - TB_Global *str_data = nullptr; - { - str_data = tb_global_create(m->mod, "csb$1", nullptr, TB_LINKAGE_PRIVATE); - tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), str_data, 8, 1, 1); - void *region = tb_global_add_region(m->mod, str_data, 0, 8); - memcpy(region, "Hellope\x00", 8); - } + // TB_Global *str = nullptr; + // { + // TB_Global *str_data = nullptr; + // { + // str_data = tb_global_create(m->mod, "csb$1", nullptr, TB_LINKAGE_PRIVATE); + // tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), str_data, 8, 1, 1); + // void *region = tb_global_add_region(m->mod, str_data, 0, 8); + // memcpy(region, "Hellope\x00", 8); + // } - str = tb_global_create(m->mod, "global$str", nullptr, TB_LINKAGE_PRIVATE); - tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), str, 16, 8, 2); - tb_global_add_symbol_reloc(m->mod, str, 0, cast(TB_Symbol *)str_data); - void *len = tb_global_add_region(m->mod, str, 8, 8); - *cast(i64 *)len = 7; - } + // str = tb_global_create(m->mod, "global$str", nullptr, TB_LINKAGE_PRIVATE); + // tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), str, 16, 8, 2); + // tb_global_add_symbol_reloc(m->mod, str, 0, cast(TB_Symbol *)str_data); + // void *len = tb_global_add_region(m->mod, str, 8, 8); + // *cast(i64 *)len = 7; + // } - { - TB_PrototypeParam printf_ret = {TB_TYPE_I32}; - TB_PrototypeParam printf_params = {TB_TYPE_PTR}; - TB_FunctionPrototype *printf_proto = tb_prototype_create(m->mod, TB_STDCALL, 1, &printf_params, 1, &printf_ret, true); - TB_External *printf_proc = tb_extern_create(m->mod, "printf", TB_EXTERNAL_SO_LOCAL); + // { + // TB_PrototypeParam printf_ret = {TB_TYPE_I32}; + // TB_PrototypeParam printf_params = {TB_TYPE_PTR}; + // TB_FunctionPrototype *printf_proto = tb_prototype_create(m->mod, TB_STDCALL, 1, &printf_params, 1, &printf_ret, true); + // TB_External *printf_proc = tb_extern_create(m->mod, "printf", TB_EXTERNAL_SO_LOCAL); - TB_PrototypeParam main_ret = {TB_TYPE_I32}; - TB_FunctionPrototype *main_proto = tb_prototype_create(m->mod, TB_STDCALL, 0, nullptr, 1, &main_ret, false); - TB_Function * p = tb_function_create(m->mod, "main", TB_LINKAGE_PUBLIC, TB_COMDAT_NONE); - tb_function_set_prototype(p, main_proto, arena); + // TB_PrototypeParam main_ret = {TB_TYPE_I32}; + // TB_FunctionPrototype *main_proto = tb_prototype_create(m->mod, TB_STDCALL, 0, nullptr, 1, &main_ret, false); + // TB_Function * p = tb_function_create(m->mod, "main", TB_LINKAGE_PUBLIC, TB_COMDAT_NONE); + // tb_function_set_prototype(p, main_proto, arena); - auto str_ptr = tb_inst_get_symbol_address(p, cast(TB_Symbol *)str); - auto str_data_ptr_ptr = tb_inst_member_access(p, str_ptr, 0); - auto str_data_ptr = tb_inst_load(p, TB_TYPE_PTR, str_data_ptr_ptr, 1, false); - auto str_len_ptr = tb_inst_member_access(p, str_ptr, 8); - auto str_len = tb_inst_load(p, TB_TYPE_I64, str_len_ptr, 8, false); + // auto str_ptr = tb_inst_get_symbol_address(p, cast(TB_Symbol *)str); + // auto str_data_ptr_ptr = tb_inst_member_access(p, str_ptr, 0); + // auto str_data_ptr = tb_inst_load(p, TB_TYPE_PTR, str_data_ptr_ptr, 1, false); + // auto str_len_ptr = tb_inst_member_access(p, str_ptr, 8); + // auto str_len = tb_inst_load(p, TB_TYPE_I64, str_len_ptr, 8, false); - TB_Node *params[4] = {}; - params[0] = tb_inst_cstring(p, "%.*s %s!\n"); - params[1] = tb_inst_trunc(p, str_len, TB_TYPE_I32); - params[2] = str_data_ptr; - params[3] = tb_inst_cstring(p, "World"); - TB_MultiOutput output = tb_inst_call(p, printf_proto, tb_inst_get_symbol_address(p, cast(TB_Symbol *)printf_proc), gb_count_of(params), params); - gb_unused(output); - TB_Node *printf_return_value = output.single; + // TB_Node *params[4] = {}; + // params[0] = tb_inst_cstring(p, "%.*s %s!\n"); + // params[1] = tb_inst_trunc(p, str_len, TB_TYPE_I32); + // params[2] = str_data_ptr; + // params[3] = tb_inst_cstring(p, "World"); + // TB_MultiOutput output = tb_inst_call(p, printf_proto, tb_inst_get_symbol_address(p, cast(TB_Symbol *)printf_proc), gb_count_of(params), params); + // gb_unused(output); + // TB_Node *printf_return_value = output.single; - TB_Node *zero = tb_inst_uint(p, TB_TYPE_I32, 0); - TB_Node *one = tb_inst_uint(p, TB_TYPE_I32, 1); + // TB_Node *zero = tb_inst_uint(p, TB_TYPE_I32, 0); + // TB_Node *one = tb_inst_uint(p, TB_TYPE_I32, 1); - TB_Node *prev_case = tb_inst_get_control(p); + // TB_Node *prev_case = tb_inst_get_control(p); - TB_Node *true_case = tb_inst_region(p); - TB_Node *false_case = tb_inst_region(p); + // TB_Node *true_case = tb_inst_region(p); + // TB_Node *false_case = tb_inst_region(p); - TB_Node *cond = tb_inst_cmp_igt(p, printf_return_value, zero, true); - tb_inst_if(p, cond, true_case, false_case); + // TB_Node *cond = tb_inst_cmp_igt(p, printf_return_value, zero, true); + // tb_inst_if(p, cond, true_case, false_case); - tb_inst_set_control(p, true_case); - tb_inst_ret(p, 1, &zero); + // tb_inst_set_control(p, true_case); + // tb_inst_ret(p, 1, &zero); - tb_inst_set_control(p, false_case); - tb_inst_ret(p, 1, &one); + // tb_inst_set_control(p, false_case); + // tb_inst_ret(p, 1, &one); - tb_inst_set_control(p, prev_case); + // tb_inst_set_control(p, prev_case); - tb_module_compile_function(m->mod, p, TB_ISEL_FAST); + // tb_module_compile_function(m->mod, p, TB_ISEL_FAST); - tb_function_print(p, tb_default_print_callback, stdout); + // tb_function_print(p, tb_default_print_callback, stdout); - TB_ExportBuffer export_buffer = tb_module_object_export(m->mod, TB_DEBUGFMT_NONE); - defer (tb_export_buffer_free(export_buffer)); - char const *path = "W:/Odin/tilde_main.obj"; - GB_ASSERT(tb_export_buffer_to_file(export_buffer, path)); - } + // TB_DebugFormat debug_format = TB_DEBUGFMT_NONE; + // TB_ExportBuffer export_buffer = tb_module_object_export(m->mod, debug_format); + // defer (tb_export_buffer_free(export_buffer)); + + // char const *path = "W:/Odin/tilde_main.obj"; + // GB_ASSERT(tb_export_buffer_to_file(export_buffer, path)); + // } return true; } |