| author | |
| committer | |
| log | d464b2532200de3778ac7362e701791a11150d55 |
| tree | 0b78986c512fac465bd2f045ef72ff745af93354 |
| parent | 7a9635555b5ddc681134ebe0e0e9f4f373ac5025 |
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 | } |
| 393 | 393 | ||
| 394 | static 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 | } |
| 930 | 943 |
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; |
| 605 | 603 | ||
| 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); |
| 839 | 839 | ||
| 840 | case ZigLLVM_Wasm: | 840 | case ZigLLVM_Wasm: |
| 841 | assert(false); // TODO ZigLLDLink for Wasm | 841 | return lld::wasm::link(array_ref_args, false, diag); |
| 842 | } | 842 | } |
| 843 | assert(false); // unreachable | 843 | assert(false); // unreachable |
| 844 | abort(); | 844 | abort(); |