diff options
| author | gingerBill <bill@gingerbill.org> | 2020-05-25 12:46:23 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2020-05-25 12:46:23 +0100 |
| commit | 098699103da15894be771ce7c5f28812fd6de883 (patch) | |
| tree | 190f776252f33eb4d6f22e55eba235fe82063d84 /src | |
| parent | d6bcc25b6965e099313fdc45d0be971cd70d7a18 (diff) | |
Begin work on supporting wasm32 architecture
Diffstat (limited to 'src')
| -rw-r--r-- | src/build_settings.cpp | 25 | ||||
| -rw-r--r-- | src/llvm_backend.cpp | 30 | ||||
| -rw-r--r-- | src/main.cpp | 18 |
3 files changed, 64 insertions, 9 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp index aea5b0292..c2f35f221 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -5,6 +5,7 @@ enum TargetOsKind { TargetOs_darwin, TargetOs_linux, TargetOs_essence, + TargetOs_js, TargetOs_COUNT, }; @@ -14,6 +15,7 @@ enum TargetArchKind { TargetArch_amd64, TargetArch_386, + TargetArch_wasm32, TargetArch_COUNT, }; @@ -33,12 +35,14 @@ String target_os_names[TargetOs_COUNT] = { str_lit("darwin"), str_lit("linux"), str_lit("essence"), + str_lit("js"), }; String target_arch_names[TargetArch_COUNT] = { str_lit(""), str_lit("amd64"), str_lit("386"), + str_lit("wasm32"), }; String target_endian_names[TargetEndian_COUNT] = { @@ -51,11 +55,12 @@ TargetEndianKind target_endians[TargetArch_COUNT] = { TargetEndian_Invalid, TargetEndian_Little, TargetEndian_Little, + TargetEndian_Little, }; -String const ODIN_VERSION = str_lit("0.12.0"); +String const ODIN_VERSION = str_lit("0.13.0"); @@ -204,6 +209,16 @@ gb_global TargetMetrics target_essence_amd64 = { str_lit("x86_64-pc-none-elf"), }; +gb_global TargetMetrics target_js_wasm32 = { + TargetOs_js, + TargetArch_wasm32, + 4, + 8, + str_lit("wasm32-freestanding-js"), + str_lit(""), +}; + + struct NamedTargetMetrics { String name; TargetMetrics *metrics; @@ -216,6 +231,8 @@ gb_global NamedTargetMetrics named_targets[] = { { str_lit("linux_amd64"), &target_linux_amd64 }, { str_lit("windows_386"), &target_windows_386 }, { str_lit("windows_amd64"), &target_windows_amd64 }, + { str_lit("js_wasm32"), &target_js_wasm32 }, + { str_lit("wasm32"), &target_js_wasm32 }, }; NamedTargetMetrics *selected_target_metrics; @@ -601,7 +618,7 @@ void init_build_context(TargetMetrics *cross_target) { #if defined(GB_SYSTEM_WINDOWS) metrics = target_windows_386; #elif defined(GB_SYSTEM_OSX) - #error "Unsupported architecture" + #error "Build Error: Unsupported architecture" #else metrics = target_linux_386; #endif @@ -666,8 +683,10 @@ void init_build_context(TargetMetrics *cross_target) { bc->link_flags = str_lit("-arch x86 "); break; } + } else if (bc->metrics.arch == TargetArch_wasm32) { + } else { - gb_printf_err("Unsupported architecture\n");; + gb_printf_err("Compiler Error: Unsupported architecture\n");; gb_exit(1); } diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index e26308c35..8095b06f1 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -2030,6 +2030,11 @@ lbProcedure *lb_create_procedure(lbModule *m, Entity *entity) { lb_add_member(m, p->name, proc_value); lb_add_procedure_value(m, p); + if (p->is_export) { + LLVMSetLinkage(p->value, LLVMDLLExportLinkage); + LLVMSetDLLStorageClass(p->value, LLVMDLLExportStorageClass); + LLVMSetVisibility(p->value, LLVMDefaultVisibility); + } // NOTE(bill): offset==0 is the return value isize offset = 1; @@ -11135,7 +11140,7 @@ void lb_setup_type_info_data(lbProcedure *p) { // NOTE(bill): Setup type_info da { GB_ASSERT(t->Enum.base_type != nullptr); - GB_ASSERT(type_size_of(t_type_info_enum_value) == 16); + // GB_ASSERT_MSG(type_size_of(t_type_info_enum_value) == 16, "%lld == 16", cast(long long)type_size_of(t_type_info_enum_value)); LLVMValueRef vals[3] = {}; @@ -11542,7 +11547,12 @@ void lb_generate_code(lbGenerator *gen) { TIME_SECTION("LLVM Create Target Machine"); - LLVMTargetMachineRef target_machine = LLVMCreateTargetMachine(target, target_triple, "generic", "", LLVMCodeGenLevelNone, LLVMRelocDefault, LLVMCodeModelDefault); + LLVMCodeModel code_mode = LLVMCodeModelDefault; + if (build_context.metrics.arch == TargetArch_wasm32) { + code_mode = LLVMCodeModelJITDefault; + } + + LLVMTargetMachineRef target_machine = LLVMCreateTargetMachine(target, target_triple, "generic", "", LLVMCodeGenLevelNone, LLVMRelocDefault, code_mode); defer (LLVMDisposeTargetMachine(target_machine)); LLVMSetModuleDataLayout(mod, LLVMCreateTargetDataLayout(target_machine)); @@ -11749,6 +11759,7 @@ void lb_generate_code(lbGenerator *gen) { } if (is_export) { LLVMSetLinkage(g.value, LLVMDLLExportLinkage); + LLVMSetDLLStorageClass(g.value, LLVMDLLExportStorageClass); } GlobalVariable var = {}; @@ -12135,7 +12146,20 @@ void lb_generate_code(lbGenerator *gen) { String filepath_ll = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".ll")); defer (gb_free(heap_allocator(), filepath_ll.text)); - String filepath_obj = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".obj")); + String filepath_obj = {}; + switch (build_context.metrics.os) { + case TargetOs_windows: + filepath_obj = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".obj")); + break; + case TargetOs_darwin: + 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")); + break; + } if (build_context.keep_temp_files) { diff --git a/src/main.cpp b/src/main.cpp index f430c5f68..60ed95ced 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1415,6 +1415,8 @@ void print_show_help(String const arg0, String const &command) { print_usage_line(3, "-build-mode:exe Build as an executable"); print_usage_line(3, "-build-mode:dll Build as a dynamically linked library"); print_usage_line(3, "-build-mode:shared Build as a dynamically linked library"); + print_usage_line(3, "-build-mode:obj Build as an object file"); + print_usage_line(3, "-build-mode:object Build as an object file"); print_usage_line(0, ""); } @@ -1514,6 +1516,7 @@ int main(int arg_count, char const **arg_ptr) { global_big_int_init(); arena_init(&global_ast_arena, heap_allocator()); + array_init(&library_collections, heap_allocator()); // NOTE(bill): 'core' cannot be (re)defined by the user add_library_collection(str_lit("core"), get_fullpath_relative(heap_allocator(), odin_root_dir(), str_lit("core"))); @@ -1617,10 +1620,20 @@ int main(int arg_count, char const **arg_ptr) { init_build_context(selected_target_metrics ? selected_target_metrics->metrics : nullptr); - if (build_context.word_size == 4) { - print_usage_line(0, "%.*s 32-bit is not yet supported", LIT(args[0])); + if (build_context.word_size == 4 && build_context.metrics.os != TargetOs_js) { + print_usage_line(0, "%.*s 32-bit is not yet supported for this platform", LIT(args[0])); return 1; } + if (build_context.metrics.os == TargetOs_js) { + if (!build_context.use_llvm_api) { + print_usage_line(0, "%.*s - js platform only supported with the -llvm-api backend", LIT(args[0])); + return 1; + } + if (build_context.build_mode != BuildMode_Object) { + print_usage_line(0, "%.*s - js platform only supports -build-mode:object", LIT(args[0])); + return 1; + } + } init_universal(); // TODO(bill): prevent compiling without a linker @@ -1677,7 +1690,6 @@ int main(int arg_count, char const **arg_ptr) { if (build_context.use_llvm_api) { #if defined(LLVM_BACKEND_SUPPORT) - timings_start_section(timings, str_lit("LLVM API Code Gen")); lbGenerator gen = {}; if (!lb_init_generator(&gen, &checker)) { |