| ... | @@ -503,10 +503,27 @@ void get_target_triple(Buf *triple, const ZigTarget *target) { | ... | @@ -503,10 +503,27 @@ void get_target_triple(Buf *triple, const ZigTarget *target) { |
| 503 | get_arch_name(arch_name, &target->arch); | 503 | get_arch_name(arch_name, &target->arch); |
| 504 | | 504 | |
| 505 | buf_resize(triple, 0); | 505 | buf_resize(triple, 0); |
| 506 | buf_appendf(triple, "%s-%s-%s-%s", arch_name, | 506 | |
| 507 | ZigLLVMGetVendorTypeName(target->vendor), | 507 | // LLVM WebAssembly output support requires the target to be activated at |
| 508 | ZigLLVMGetOSTypeName(get_llvm_os_type(target->os)), | 508 | // build type with -DCMAKE_LLVM_EXPIERMENTAL_TARGETS_TO_BUILD=WebAssembly. |
| 509 | ZigLLVMGetEnvironmentTypeName(target->env_type)); | 509 | // |
| | 510 | // LLVM determines the output format based on the environment suffix, |
| | 511 | // defaulting to an object based on the architecture. The default format in |
| | 512 | // LLVM 6 sets the wasm arch output incorrectly to ELF. We need to |
| | 513 | // explicitly set this ourself in order for it to work. |
| | 514 | // |
| | 515 | // This is fixed in LLVM 7 and you will be able to get wasm output by |
| | 516 | // using the target triple `wasm32-unknown-unknown-unknown`. |
| | 517 | if (!strncmp(arch_name, "wasm", 4)) { |
| | 518 | buf_appendf(triple, "%s-%s-%s-wasm", arch_name, |
| | 519 | ZigLLVMGetVendorTypeName(target->vendor), |
| | 520 | ZigLLVMGetOSTypeName(get_llvm_os_type(target->os))); |
| | 521 | } else { |
| | 522 | buf_appendf(triple, "%s-%s-%s-%s", arch_name, |
| | 523 | ZigLLVMGetVendorTypeName(target->vendor), |
| | 524 | ZigLLVMGetOSTypeName(get_llvm_os_type(target->os)), |
| | 525 | ZigLLVMGetEnvironmentTypeName(target->env_type)); |
| | 526 | } |
| 510 | } | 527 | } |
| 511 | | 528 | |
| 512 | static bool is_os_darwin(ZigTarget *target) { | 529 | static bool is_os_darwin(ZigTarget *target) { |