authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-07-18 11:45:37-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-07-18 12:21:57-04:00
logd4ca337e6b8d0c268ebce5c4b5fbe9015f3d8ab6
treeee40cf55aaa0b7f3f44e6a482605ddca7a35b5c1
parent04ce5376a8ba030249765779d5dcda0770445979
signature Commit is signed but in an unrecognized format.

improvements to riscv support


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 }
83928392
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 }
83988399
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));
84028402
...@@ -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}
84788494
8479void codegen_translate_c(CodeGen *g, Buf *full_path, FILE *out_file, bool use_userland_implementation) {8495void 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 }
16631665
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 }
17921794
1793 // crt end1795 // 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 }
17971799
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}
17401740
1741bool target_supports_libunwind(const ZigTarget *target) {1741bool 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
1754bool 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
1761bool 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);
186bool target_is_glibc(const ZigTarget *target);186bool target_is_glibc(const ZigTarget *target);
187bool target_is_musl(const ZigTarget *target);187bool target_is_musl(const ZigTarget *target);
188bool target_is_wasm(const ZigTarget *target);188bool target_is_wasm(const ZigTarget *target);
189bool target_is_riscv(const ZigTarget *target);
189bool target_is_android(const ZigTarget *target);190bool target_is_android(const ZigTarget *target);
190bool target_is_single_threaded(const ZigTarget *target);191bool target_is_single_threaded(const ZigTarget *target);
191bool target_supports_stack_probing(const ZigTarget *target);192bool 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);
197198
198size_t target_libc_count(void);199size_t target_libc_count(void);
199void target_libc_enum(size_t index, ZigTarget *out_target);200void target_libc_enum(size_t index, ZigTarget *out_target);
201bool target_libc_needs_crti_crtn(const ZigTarget *target);
200202
201#endif203#endif