authorgravatar for info@bnoordhuis.nlBen Noordhuis <info@bnoordhuis.nl> 2018-06-10 04:39:22+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-06-09 22:39:22-04:00
logd464b2532200de3778ac7362e701791a11150d55
tree0b78986c512fac465bd2f045ef72ff745af93354
parent7a9635555b5ddc681134ebe0e0e9f4f373ac5025

support `--target-arch wasm32` (#1094)

Add wasm32 support to the build-obj, build-exe and build-lib commands of the stage 1 compiler. Wasm64 should work transparently once it's supported in upstream LLVM. To export a function: // lib.zig - for exposition, not necessary for this example pub use @import("add.zig"); // add.zig export fn add(a: i32, b: i32) i32 { return a + b; } To import a function: // cube.zig extern fn square(x: i32) i32; export fn cube(x: i32) i32 { return x * square(x); }

4 files changed, 21 insertions(+), 4 deletions(-)

build.zig+1
...@@ -63,6 +63,7 @@ pub fn build(b: *Builder) !void {...@@ -63,6 +63,7 @@ pub fn build(b: *Builder) !void {
63 exe.addObjectFile(lib);63 exe.addObjectFile(lib);
64 }64 }
65 } else {65 } else {
66 addCppLib(b, exe, cmake_binary_dir, "embedded_lld_wasm");
66 addCppLib(b, exe, cmake_binary_dir, "embedded_lld_elf");67 addCppLib(b, exe, cmake_binary_dir, "embedded_lld_elf");
67 addCppLib(b, exe, cmake_binary_dir, "embedded_lld_coff");68 addCppLib(b, exe, cmake_binary_dir, "embedded_lld_coff");
68 addCppLib(b, exe, cmake_binary_dir, "embedded_lld_lib");69 addCppLib(b, exe, cmake_binary_dir, "embedded_lld_lib");
src/link.cpp+14-1
...@@ -391,6 +391,19 @@ static void construct_linker_job_elf(LinkJob *lj) {...@@ -391,6 +391,19 @@ static void construct_linker_job_elf(LinkJob *lj) {
391 }391 }
392}392}
393393
394static void construct_linker_job_wasm(LinkJob *lj) {
395 CodeGen *g = lj->codegen;
396
397 lj->args.append("--relocatable"); // So lld doesn't look for _start.
398 lj->args.append("-o");
399 lj->args.append(buf_ptr(&lj->out_file));
400
401 // .o files
402 for (size_t i = 0; i < g->link_objects.length; i += 1) {
403 lj->args.append((const char *)buf_ptr(g->link_objects.at(i)));
404 }
405}
406
394//static bool is_target_cyg_mingw(const ZigTarget *target) {407//static bool is_target_cyg_mingw(const ZigTarget *target) {
395// return (target->os == ZigLLVM_Win32 && target->env_type == ZigLLVM_Cygnus) ||408// return (target->os == ZigLLVM_Win32 && target->env_type == ZigLLVM_Cygnus) ||
396// (target->os == ZigLLVM_Win32 && target->env_type == ZigLLVM_GNU);409// (target->os == ZigLLVM_Win32 && target->env_type == ZigLLVM_GNU);
...@@ -924,7 +937,7 @@ static void construct_linker_job(LinkJob *lj) {...@@ -924,7 +937,7 @@ static void construct_linker_job(LinkJob *lj) {
924 case ZigLLVM_MachO:937 case ZigLLVM_MachO:
925 return construct_linker_job_macho(lj);938 return construct_linker_job_macho(lj);
926 case ZigLLVM_Wasm:939 case ZigLLVM_Wasm:
927 zig_panic("TODO link wasm");940 return construct_linker_job_wasm(lj);
928 }941 }
929}942}
930943
src/target.cpp+5-2
...@@ -597,12 +597,15 @@ void resolve_target_object_format(ZigTarget *target) {...@@ -597,12 +597,15 @@ void resolve_target_object_format(ZigTarget *target) {
597 case ZigLLVM_tce:597 case ZigLLVM_tce:
598 case ZigLLVM_tcele:598 case ZigLLVM_tcele:
599 case ZigLLVM_thumbeb:599 case ZigLLVM_thumbeb:
600 case ZigLLVM_wasm32:
601 case ZigLLVM_wasm64:
602 case ZigLLVM_xcore:600 case ZigLLVM_xcore:
603 target->oformat= ZigLLVM_ELF;601 target->oformat= ZigLLVM_ELF;
604 return;602 return;
605603
604 case ZigLLVM_wasm32:
605 case ZigLLVM_wasm64:
606 target->oformat = ZigLLVM_Wasm;
607 return;
608
606 case ZigLLVM_ppc:609 case ZigLLVM_ppc:
607 case ZigLLVM_ppc64:610 case ZigLLVM_ppc64:
608 if (is_os_darwin(target)) {611 if (is_os_darwin(target)) {
src/zig_llvm.cpp+1-1
...@@ -838,7 +838,7 @@ bool ZigLLDLink(ZigLLVM_ObjectFormatType oformat, const char **args, size_t arg_...@@ -838,7 +838,7 @@ bool ZigLLDLink(ZigLLVM_ObjectFormatType oformat, const char **args, size_t arg_
838 return lld::mach_o::link(array_ref_args, diag);838 return lld::mach_o::link(array_ref_args, diag);
839839
840 case ZigLLVM_Wasm:840 case ZigLLVM_Wasm:
841 assert(false); // TODO ZigLLDLink for Wasm841 return lld::wasm::link(array_ref_args, false, diag);
842 }842 }
843 assert(false); // unreachable843 assert(false); // unreachable
844 abort();844 abort();