| 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 | 63 | exe.addObjectFile(lib); |
| 64 | 64 | } |
| 65 | 65 | } else { |
| 66 | addCppLib(b, exe, cmake_binary_dir, "embedded_lld_wasm"); | |
| 66 | 67 | addCppLib(b, exe, cmake_binary_dir, "embedded_lld_elf"); |
| 67 | 68 | addCppLib(b, exe, cmake_binary_dir, "embedded_lld_coff"); |
| 68 | 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 | 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 | 407 | //static bool is_target_cyg_mingw(const ZigTarget *target) { |
| 395 | 408 | // return (target->os == ZigLLVM_Win32 && target->env_type == ZigLLVM_Cygnus) || |
| 396 | 409 | // (target->os == ZigLLVM_Win32 && target->env_type == ZigLLVM_GNU); |
| ... | ... | @@ -924,7 +937,7 @@ static void construct_linker_job(LinkJob *lj) { |
| 924 | 937 | case ZigLLVM_MachO: |
| 925 | 938 | return construct_linker_job_macho(lj); |
| 926 | 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 | 597 | case ZigLLVM_tce: |
| 598 | 598 | case ZigLLVM_tcele: |
| 599 | 599 | case ZigLLVM_thumbeb: |
| 600 | case ZigLLVM_wasm32: | |
| 601 | case ZigLLVM_wasm64: | |
| 602 | 600 | case ZigLLVM_xcore: |
| 603 | 601 | target->oformat= ZigLLVM_ELF; |
| 604 | 602 | return; |
| 605 | 603 | |
| 604 | case ZigLLVM_wasm32: | |
| 605 | case ZigLLVM_wasm64: | |
| 606 | target->oformat = ZigLLVM_Wasm; | |
| 607 | return; | |
| 608 | ||
| 606 | 609 | case ZigLLVM_ppc: |
| 607 | 610 | case ZigLLVM_ppc64: |
| 608 | 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 | 838 | return lld::mach_o::link(array_ref_args, diag); |
| 839 | 839 | |
| 840 | 840 | case ZigLLVM_Wasm: |
| 841 | assert(false); // TODO ZigLLDLink for Wasm | |
| 841 | return lld::wasm::link(array_ref_args, false, diag); | |
| 842 | 842 | } |
| 843 | 843 | assert(false); // unreachable |
| 844 | 844 | abort(); |