| author | |
| committer | |
| log | d4ca337e6b8d0c268ebce5c4b5fbe9015f3d8ab6 |
| tree | ee40cf55aaa0b7f3f44e6a482605ddca7a35b5c1 |
| parent | 04ce5376a8ba030249765779d5dcda0770445979 |
| signature |
4 files changed, 41 insertions(+), 4 deletions(-)
src/codegen.cpp+17-1| ... | @@ -8390,13 +8390,13 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa | ... | @@ -8390,13 +8390,13 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa |
| 8390 | } | 8390 | } |
| 8391 | } | 8391 | } |
| 8392 | 8392 | ||
| 8393 | // According to Rich Felker libc headers are supposed to go before C language headers. | ||
| 8393 | for (size_t i = 0; i < g->libc_include_dir_len; i += 1) { | 8394 | for (size_t i = 0; i < g->libc_include_dir_len; i += 1) { |
| 8394 | Buf *include_dir = g->libc_include_dir_list[i]; | 8395 | Buf *include_dir = g->libc_include_dir_list[i]; |
| 8395 | args.append("-isystem"); | 8396 | args.append("-isystem"); |
| 8396 | args.append(buf_ptr(include_dir)); | 8397 | args.append(buf_ptr(include_dir)); |
| 8397 | } | 8398 | } |
| 8398 | 8399 | ||
| 8399 | // According to Rich Felker libc headers are supposed to go before C language headers. | ||
| 8400 | args.append("-isystem"); | 8400 | args.append("-isystem"); |
| 8401 | args.append(buf_ptr(g->zig_c_headers_dir)); | 8401 | args.append(buf_ptr(g->zig_c_headers_dir)); |
| 8402 | 8402 | ||
| ... | @@ -8405,6 +8405,21 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa | ... | @@ -8405,6 +8405,21 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa |
| 8405 | } else { | 8405 | } else { |
| 8406 | args.append("-target"); | 8406 | args.append("-target"); |
| 8407 | args.append(buf_ptr(&g->llvm_triple_str)); | 8407 | args.append(buf_ptr(&g->llvm_triple_str)); |
| 8408 | |||
| 8409 | if (target_is_musl(g->zig_target) && target_is_riscv(g->zig_target)) { | ||
| 8410 | // Musl depends on atomic instructions, which are disabled by default in Clang/LLVM's | ||
| 8411 | // cross compilation CPU info for RISCV. | ||
| 8412 | switch (g->zig_target->arch) { | ||
| 8413 | case ZigLLVM_riscv32: | ||
| 8414 | args.append("-march=rv32ia"); | ||
| 8415 | break; | ||
| 8416 | case ZigLLVM_riscv64: | ||
| 8417 | args.append("-march=rv64ia"); | ||
| 8418 | break; | ||
| 8419 | default: | ||
| 8420 | zig_unreachable(); | ||
| 8421 | } | ||
| 8422 | } | ||
| 8408 | } | 8423 | } |
| 8409 | if (g->zig_target->os == OsFreestanding) { | 8424 | if (g->zig_target->os == OsFreestanding) { |
| 8410 | args.append("-ffreestanding"); | 8425 | args.append("-ffreestanding"); |
| ... | @@ -8474,6 +8489,7 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa | ... | @@ -8474,6 +8489,7 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa |
| 8474 | for (size_t arg_i = 0; arg_i < g->clang_argv_len; arg_i += 1) { | 8489 | for (size_t arg_i = 0; arg_i < g->clang_argv_len; arg_i += 1) { |
| 8475 | args.append(g->clang_argv[arg_i]); | 8490 | args.append(g->clang_argv[arg_i]); |
| 8476 | } | 8491 | } |
| 8492 | |||
| 8477 | } | 8493 | } |
| 8478 | 8494 | ||
| 8479 | void codegen_translate_c(CodeGen *g, Buf *full_path, FILE *out_file, bool use_userland_implementation) { | 8495 | void codegen_translate_c(CodeGen *g, Buf *full_path, FILE *out_file, bool use_userland_implementation) { |
src/link.cpp+4-2| ... | @@ -1658,7 +1658,9 @@ static void construct_linker_job_elf(LinkJob *lj) { | ... | @@ -1658,7 +1658,9 @@ static void construct_linker_job_elf(LinkJob *lj) { |
| 1658 | crt1o = "Scrt1.o"; | 1658 | crt1o = "Scrt1.o"; |
| 1659 | } | 1659 | } |
| 1660 | lj->args.append(get_libc_crt_file(g, crt1o)); | 1660 | lj->args.append(get_libc_crt_file(g, crt1o)); |
| 1661 | lj->args.append(get_libc_crt_file(g, "crti.o")); | 1661 | if (target_libc_needs_crti_crtn(g->zig_target)) { |
| 1662 | lj->args.append(get_libc_crt_file(g, "crti.o")); | ||
| 1663 | } | ||
| 1662 | } | 1664 | } |
| 1663 | 1665 | ||
| 1664 | for (size_t i = 0; i < g->rpath_list.length; i += 1) { | 1666 | for (size_t i = 0; i < g->rpath_list.length; i += 1) { |
| ... | @@ -1791,7 +1793,7 @@ static void construct_linker_job_elf(LinkJob *lj) { | ... | @@ -1791,7 +1793,7 @@ static void construct_linker_job_elf(LinkJob *lj) { |
| 1791 | } | 1793 | } |
| 1792 | 1794 | ||
| 1793 | // crt end | 1795 | // crt end |
| 1794 | if (lj->link_in_crt) { | 1796 | if (lj->link_in_crt && target_libc_needs_crti_crtn(g->zig_target)) { |
| 1795 | lj->args.append(get_libc_crt_file(g, "crtn.o")); | 1797 | lj->args.append(get_libc_crt_file(g, "crtn.o")); |
| 1796 | } | 1798 | } |
| 1797 | 1799 |
src/target.cpp+18-1| ... | @@ -1739,8 +1739,25 @@ const char *target_arch_musl_name(ZigLLVM_ArchType arch) { | ... | @@ -1739,8 +1739,25 @@ const char *target_arch_musl_name(ZigLLVM_ArchType arch) { |
| 1739 | } | 1739 | } |
| 1740 | 1740 | ||
| 1741 | bool target_supports_libunwind(const ZigTarget *target) { | 1741 | bool target_supports_libunwind(const ZigTarget *target) { |
| 1742 | if (target->arch == ZigLLVM_arm || target->arch == ZigLLVM_armeb) { | 1742 | switch (target->arch) { |
| 1743 | case ZigLLVM_arm: | ||
| 1744 | case ZigLLVM_armeb: | ||
| 1745 | case ZigLLVM_riscv32: | ||
| 1746 | case ZigLLVM_riscv64: | ||
| 1747 | return false; | ||
| 1748 | default: | ||
| 1749 | return true; | ||
| 1750 | } | ||
| 1751 | return true; | ||
| 1752 | } | ||
| 1753 | |||
| 1754 | bool target_libc_needs_crti_crtn(const ZigTarget *target) { | ||
| 1755 | if (target->arch == ZigLLVM_riscv32 || target->arch == ZigLLVM_riscv64) { | ||
| 1743 | return false; | 1756 | return false; |
| 1744 | } | 1757 | } |
| 1745 | return true; | 1758 | return true; |
| 1746 | } | 1759 | } |
| 1760 | |||
| 1761 | bool target_is_riscv(const ZigTarget *target) { | ||
| 1762 | return target->arch == ZigLLVM_riscv32 || target->arch == ZigLLVM_riscv64; | ||
| 1763 | } |
src/target.hpp+2| ... | @@ -186,6 +186,7 @@ bool target_abi_is_musl(ZigLLVM_EnvironmentType abi); | ... | @@ -186,6 +186,7 @@ bool target_abi_is_musl(ZigLLVM_EnvironmentType abi); |
| 186 | bool target_is_glibc(const ZigTarget *target); | 186 | bool target_is_glibc(const ZigTarget *target); |
| 187 | bool target_is_musl(const ZigTarget *target); | 187 | bool target_is_musl(const ZigTarget *target); |
| 188 | bool target_is_wasm(const ZigTarget *target); | 188 | bool target_is_wasm(const ZigTarget *target); |
| 189 | bool target_is_riscv(const ZigTarget *target); | ||
| 189 | bool target_is_android(const ZigTarget *target); | 190 | bool target_is_android(const ZigTarget *target); |
| 190 | bool target_is_single_threaded(const ZigTarget *target); | 191 | bool target_is_single_threaded(const ZigTarget *target); |
| 191 | bool target_supports_stack_probing(const ZigTarget *target); | 192 | bool target_supports_stack_probing(const ZigTarget *target); |
| ... | @@ -197,5 +198,6 @@ uint32_t target_arch_pointer_bit_width(ZigLLVM_ArchType arch); | ... | @@ -197,5 +198,6 @@ uint32_t target_arch_pointer_bit_width(ZigLLVM_ArchType arch); |
| 197 | 198 | ||
| 198 | size_t target_libc_count(void); | 199 | size_t target_libc_count(void); |
| 199 | void target_libc_enum(size_t index, ZigTarget *out_target); | 200 | void target_libc_enum(size_t index, ZigTarget *out_target); |
| 201 | bool target_libc_needs_crti_crtn(const ZigTarget *target); | ||
| 200 | 202 | ||
| 201 | #endif | 203 | #endif |