| ... | ... | @@ -756,8 +756,7 @@ bool target_allows_addr_zero(const ZigTarget *target) { |
| 756 | 756 | |
| 757 | 757 | const char *target_o_file_ext(const ZigTarget *target) { |
| 758 | 758 | if (target->abi == ZigLLVM_MSVC || |
| 759 | | (target->os == OsWindows && !target_abi_is_gnu(target->abi)) || |
| 760 | | target->os == OsUefi) |
| 759 | target->os == OsWindows || target->os == OsUefi) |
| 761 | 760 | { |
| 762 | 761 | return ".obj"; |
| 763 | 762 | } else { |
| ... | ... | @@ -777,29 +776,6 @@ bool target_is_android(const ZigTarget *target) { |
| 777 | 776 | return target->abi == ZigLLVM_Android; |
| 778 | 777 | } |
| 779 | 778 | |
| 780 | | bool target_can_exec(const ZigTarget *host_target, const ZigTarget *guest_target) { |
| 781 | | assert(host_target != nullptr); |
| 782 | | |
| 783 | | if (guest_target == nullptr) { |
| 784 | | // null guest target means that the guest target is native |
| 785 | | return true; |
| 786 | | } |
| 787 | | |
| 788 | | if (guest_target->os == host_target->os && guest_target->arch == host_target->arch) { |
| 789 | | // OS and arch match |
| 790 | | return true; |
| 791 | | } |
| 792 | | |
| 793 | | if (guest_target->os == OsWindows && host_target->os == OsWindows && |
| 794 | | host_target->arch == ZigLLVM_x86_64 && guest_target->arch == ZigLLVM_x86) |
| 795 | | { |
| 796 | | // 64-bit windows can run 32-bit programs |
| 797 | | return true; |
| 798 | | } |
| 799 | | |
| 800 | | return false; |
| 801 | | } |
| 802 | | |
| 803 | 779 | const char *arch_stack_pointer_register_name(ZigLLVM_ArchType arch) { |
| 804 | 780 | switch (arch) { |
| 805 | 781 | case ZigLLVM_UnknownArch: |
| ... | ... | @@ -946,21 +922,6 @@ bool target_has_valgrind_support(const ZigTarget *target) { |
| 946 | 922 | zig_unreachable(); |
| 947 | 923 | } |
| 948 | 924 | |
| 949 | | bool target_os_requires_libc(Os os) { |
| 950 | | // On Darwin, we always link libSystem which contains libc. |
| 951 | | // Similarly on FreeBSD and NetBSD we always link system libc |
| 952 | | // since this is the stable syscall interface. |
| 953 | | return (target_os_is_darwin(os) || os == OsFreeBSD || os == OsNetBSD || os == OsDragonFly); |
| 954 | | } |
| 955 | | |
| 956 | | bool target_is_glibc(const ZigTarget *target) { |
| 957 | | return target->os == OsLinux && target_abi_is_gnu(target->abi); |
| 958 | | } |
| 959 | | |
| 960 | | bool target_is_musl(const ZigTarget *target) { |
| 961 | | return target->os == OsLinux && target_abi_is_musl(target->abi); |
| 962 | | } |
| 963 | | |
| 964 | 925 | bool target_is_wasm(const ZigTarget *target) { |
| 965 | 926 | return target->arch == ZigLLVM_wasm32 || target->arch == ZigLLVM_wasm64; |
| 966 | 927 | } |
| ... | ... | @@ -1019,238 +980,10 @@ ZigLLVM_EnvironmentType target_default_abi(ZigLLVM_ArchType arch, Os os) { |
| 1019 | 980 | zig_unreachable(); |
| 1020 | 981 | } |
| 1021 | 982 | |
| 1022 | | bool target_abi_is_gnu(ZigLLVM_EnvironmentType abi) { |
| 1023 | | switch (abi) { |
| 1024 | | case ZigLLVM_GNU: |
| 1025 | | case ZigLLVM_GNUABIN32: |
| 1026 | | case ZigLLVM_GNUABI64: |
| 1027 | | case ZigLLVM_GNUEABI: |
| 1028 | | case ZigLLVM_GNUEABIHF: |
| 1029 | | case ZigLLVM_GNUX32: |
| 1030 | | return true; |
| 1031 | | default: |
| 1032 | | return false; |
| 1033 | | } |
| 1034 | | } |
| 1035 | | |
| 1036 | | bool target_abi_is_musl(ZigLLVM_EnvironmentType abi) { |
| 1037 | | switch (abi) { |
| 1038 | | case ZigLLVM_Musl: |
| 1039 | | case ZigLLVM_MuslEABI: |
| 1040 | | case ZigLLVM_MuslEABIHF: |
| 1041 | | return true; |
| 1042 | | default: |
| 1043 | | return false; |
| 1044 | | } |
| 1045 | | } |
| 1046 | | |
| 1047 | | struct AvailableLibC { |
| 1048 | | ZigLLVM_ArchType arch; |
| 1049 | | Os os; |
| 1050 | | ZigLLVM_EnvironmentType abi; |
| 1051 | | }; |
| 1052 | | |
| 1053 | | static const AvailableLibC libcs_available[] = { |
| 1054 | | {ZigLLVM_aarch64_be, OsLinux, ZigLLVM_GNU}, |
| 1055 | | {ZigLLVM_aarch64_be, OsLinux, ZigLLVM_Musl}, |
| 1056 | | {ZigLLVM_aarch64_be, OsWindows, ZigLLVM_GNU}, |
| 1057 | | {ZigLLVM_aarch64, OsLinux, ZigLLVM_GNU}, |
| 1058 | | {ZigLLVM_aarch64, OsLinux, ZigLLVM_Musl}, |
| 1059 | | {ZigLLVM_aarch64, OsWindows, ZigLLVM_GNU}, |
| 1060 | | {ZigLLVM_armeb, OsLinux, ZigLLVM_GNUEABI}, |
| 1061 | | {ZigLLVM_armeb, OsLinux, ZigLLVM_GNUEABIHF}, |
| 1062 | | {ZigLLVM_armeb, OsLinux, ZigLLVM_MuslEABI}, |
| 1063 | | {ZigLLVM_armeb, OsLinux, ZigLLVM_MuslEABIHF}, |
| 1064 | | {ZigLLVM_armeb, OsWindows, ZigLLVM_GNU}, |
| 1065 | | {ZigLLVM_arm, OsLinux, ZigLLVM_GNUEABI}, |
| 1066 | | {ZigLLVM_arm, OsLinux, ZigLLVM_GNUEABIHF}, |
| 1067 | | {ZigLLVM_arm, OsLinux, ZigLLVM_MuslEABI}, |
| 1068 | | {ZigLLVM_arm, OsLinux, ZigLLVM_MuslEABIHF}, |
| 1069 | | {ZigLLVM_arm, OsWindows, ZigLLVM_GNU}, |
| 1070 | | {ZigLLVM_csky, OsLinux, ZigLLVM_GNUEABI}, |
| 1071 | | {ZigLLVM_csky, OsLinux, ZigLLVM_GNUEABIHF}, |
| 1072 | | {ZigLLVM_x86, OsLinux, ZigLLVM_GNU}, |
| 1073 | | {ZigLLVM_x86, OsLinux, ZigLLVM_Musl}, |
| 1074 | | {ZigLLVM_x86, OsWindows, ZigLLVM_GNU}, |
| 1075 | | {ZigLLVM_mips64el, OsLinux, ZigLLVM_GNUABI64}, |
| 1076 | | {ZigLLVM_mips64el, OsLinux, ZigLLVM_GNUABIN32}, |
| 1077 | | {ZigLLVM_mips64el, OsLinux, ZigLLVM_Musl}, |
| 1078 | | {ZigLLVM_mips64, OsLinux, ZigLLVM_GNUABI64}, |
| 1079 | | {ZigLLVM_mips64, OsLinux, ZigLLVM_GNUABIN32}, |
| 1080 | | {ZigLLVM_mips64, OsLinux, ZigLLVM_Musl}, |
| 1081 | | {ZigLLVM_mipsel, OsLinux, ZigLLVM_GNU}, |
| 1082 | | {ZigLLVM_mipsel, OsLinux, ZigLLVM_Musl}, |
| 1083 | | {ZigLLVM_mips, OsLinux, ZigLLVM_GNU}, |
| 1084 | | {ZigLLVM_mips, OsLinux, ZigLLVM_Musl}, |
| 1085 | | {ZigLLVM_ppc64le, OsLinux, ZigLLVM_GNU}, |
| 1086 | | {ZigLLVM_ppc64le, OsLinux, ZigLLVM_Musl}, |
| 1087 | | {ZigLLVM_ppc64, OsLinux, ZigLLVM_GNU}, |
| 1088 | | {ZigLLVM_ppc64, OsLinux, ZigLLVM_Musl}, |
| 1089 | | {ZigLLVM_ppc, OsLinux, ZigLLVM_GNU}, |
| 1090 | | {ZigLLVM_ppc, OsLinux, ZigLLVM_Musl}, |
| 1091 | | {ZigLLVM_riscv64, OsLinux, ZigLLVM_GNU}, |
| 1092 | | {ZigLLVM_riscv64, OsLinux, ZigLLVM_Musl}, |
| 1093 | | {ZigLLVM_systemz, OsLinux, ZigLLVM_GNU}, |
| 1094 | | {ZigLLVM_systemz, OsLinux, ZigLLVM_Musl}, |
| 1095 | | {ZigLLVM_sparc, OsLinux, ZigLLVM_GNU}, |
| 1096 | | {ZigLLVM_sparcv9, OsLinux, ZigLLVM_GNU}, |
| 1097 | | {ZigLLVM_wasm32, OsFreestanding, ZigLLVM_Musl}, |
| 1098 | | {ZigLLVM_x86_64, OsLinux, ZigLLVM_GNU}, |
| 1099 | | {ZigLLVM_x86_64, OsLinux, ZigLLVM_GNUX32}, |
| 1100 | | {ZigLLVM_x86_64, OsLinux, ZigLLVM_Musl}, |
| 1101 | | {ZigLLVM_x86_64, OsWindows, ZigLLVM_GNU}, |
| 1102 | | }; |
| 1103 | | |
| 1104 | | bool target_can_build_libc(const ZigTarget *target) { |
| 1105 | | for (size_t i = 0; i < array_length(libcs_available); i += 1) { |
| 1106 | | if (target->arch == libcs_available[i].arch && |
| 1107 | | target->os == libcs_available[i].os && |
| 1108 | | target->abi == libcs_available[i].abi) |
| 1109 | | { |
| 1110 | | return true; |
| 1111 | | } |
| 1112 | | } |
| 1113 | | return false; |
| 1114 | | } |
| 1115 | | |
| 1116 | | const char *target_libc_generic_name(const ZigTarget *target) { |
| 1117 | | if (target->os == OsWindows) { |
| 1118 | | return "mingw"; |
| 1119 | | } |
| 1120 | | switch (target->abi) { |
| 1121 | | case ZigLLVM_GNU: |
| 1122 | | case ZigLLVM_GNUABIN32: |
| 1123 | | case ZigLLVM_GNUABI64: |
| 1124 | | case ZigLLVM_GNUEABI: |
| 1125 | | case ZigLLVM_GNUEABIHF: |
| 1126 | | case ZigLLVM_GNUX32: |
| 1127 | | case ZigLLVM_GNUILP32: |
| 1128 | | return "glibc"; |
| 1129 | | case ZigLLVM_Musl: |
| 1130 | | case ZigLLVM_MuslEABI: |
| 1131 | | case ZigLLVM_MuslEABIHF: |
| 1132 | | case ZigLLVM_UnknownEnvironment: |
| 1133 | | return "musl"; |
| 1134 | | case ZigLLVM_CODE16: |
| 1135 | | case ZigLLVM_EABI: |
| 1136 | | case ZigLLVM_EABIHF: |
| 1137 | | case ZigLLVM_Android: |
| 1138 | | case ZigLLVM_MSVC: |
| 1139 | | case ZigLLVM_Itanium: |
| 1140 | | case ZigLLVM_Cygnus: |
| 1141 | | case ZigLLVM_CoreCLR: |
| 1142 | | case ZigLLVM_Simulator: |
| 1143 | | case ZigLLVM_MacABI: |
| 1144 | | zig_unreachable(); |
| 1145 | | } |
| 1146 | | zig_unreachable(); |
| 1147 | | } |
| 1148 | | |
| 1149 | | bool target_is_libc_lib_name(const ZigTarget *target, const char *name) { |
| 1150 | | auto equal = str_eql_str; |
| 1151 | | if (target->os == OsMacOSX) |
| 1152 | | equal = str_eql_str_ignore_case; |
| 1153 | | |
| 1154 | | if (equal(name, "c")) |
| 1155 | | return true; |
| 1156 | | |
| 1157 | | if (target_abi_is_gnu(target->abi) && target->os == OsWindows) { |
| 1158 | | // mingw-w64 |
| 1159 | | |
| 1160 | | if (equal(name, "m")) |
| 1161 | | return true; |
| 1162 | | |
| 1163 | | return false; |
| 1164 | | } |
| 1165 | | |
| 1166 | | if (target_abi_is_gnu(target->abi) || target_abi_is_musl(target->abi) || target_os_is_darwin(target->os)) { |
| 1167 | | if (equal(name, "m")) |
| 1168 | | return true; |
| 1169 | | if (equal(name, "rt")) |
| 1170 | | return true; |
| 1171 | | if (equal(name, "pthread")) |
| 1172 | | return true; |
| 1173 | | if (equal(name, "crypt")) |
| 1174 | | return true; |
| 1175 | | if (equal(name, "util")) |
| 1176 | | return true; |
| 1177 | | if (equal(name, "xnet")) |
| 1178 | | return true; |
| 1179 | | if (equal(name, "resolv")) |
| 1180 | | return true; |
| 1181 | | if (equal(name, "dl")) |
| 1182 | | return true; |
| 1183 | | } |
| 1184 | | |
| 1185 | | if (target_os_is_darwin(target->os) && equal(name, "System")) |
| 1186 | | return true; |
| 1187 | | |
| 1188 | | return false; |
| 1189 | | } |
| 1190 | | |
| 1191 | | bool target_is_libcpp_lib_name(const ZigTarget *target, const char *name) { |
| 1192 | | if (strcmp(name, "c++") == 0 || strcmp(name, "c++abi") == 0) |
| 1193 | | return true; |
| 1194 | | |
| 1195 | | return false; |
| 1196 | | } |
| 1197 | | |
| 1198 | | size_t target_libc_count(void) { |
| 1199 | | return array_length(libcs_available); |
| 1200 | | } |
| 1201 | | |
| 1202 | | void target_libc_enum(size_t index, ZigTarget *out_target) { |
| 1203 | | assert(index < array_length(libcs_available)); |
| 1204 | | out_target->arch = libcs_available[index].arch; |
| 1205 | | out_target->os = libcs_available[index].os; |
| 1206 | | out_target->abi = libcs_available[index].abi; |
| 1207 | | out_target->is_native_os = false; |
| 1208 | | out_target->is_native_cpu = false; |
| 1209 | | } |
| 1210 | | |
| 1211 | 983 | bool target_has_debug_info(const ZigTarget *target) { |
| 1212 | 984 | return !target_is_wasm(target); |
| 1213 | 985 | } |
| 1214 | 986 | |
| 1215 | | const char *target_arch_musl_name(ZigLLVM_ArchType arch) { |
| 1216 | | switch (arch) { |
| 1217 | | case ZigLLVM_aarch64: |
| 1218 | | case ZigLLVM_aarch64_be: |
| 1219 | | return "aarch64"; |
| 1220 | | case ZigLLVM_arm: |
| 1221 | | case ZigLLVM_armeb: |
| 1222 | | return "arm"; |
| 1223 | | case ZigLLVM_mips: |
| 1224 | | case ZigLLVM_mipsel: |
| 1225 | | return "mips"; |
| 1226 | | case ZigLLVM_mips64el: |
| 1227 | | case ZigLLVM_mips64: |
| 1228 | | return "mips64"; |
| 1229 | | case ZigLLVM_ppc: |
| 1230 | | return "powerpc"; |
| 1231 | | case ZigLLVM_ppc64: |
| 1232 | | case ZigLLVM_ppc64le: |
| 1233 | | return "powerpc64"; |
| 1234 | | case ZigLLVM_systemz: |
| 1235 | | return "s390x"; |
| 1236 | | case ZigLLVM_x86: |
| 1237 | | return "i386"; |
| 1238 | | case ZigLLVM_x86_64: |
| 1239 | | return "x86_64"; |
| 1240 | | case ZigLLVM_riscv64: |
| 1241 | | return "riscv64"; |
| 1242 | | default: |
| 1243 | | zig_unreachable(); |
| 1244 | | } |
| 1245 | | } |
| 1246 | | |
| 1247 | | bool target_libc_needs_crti_crtn(const ZigTarget *target) { |
| 1248 | | if (target->arch == ZigLLVM_riscv32 || target->arch == ZigLLVM_riscv64 || target_is_android(target)) { |
| 1249 | | return false; |
| 1250 | | } |
| 1251 | | return true; |
| 1252 | | } |
| 1253 | | |
| 1254 | 987 | bool target_is_riscv(const ZigTarget *target) { |
| 1255 | 988 | return target->arch == ZigLLVM_riscv32 || target->arch == ZigLLVM_riscv64; |
| 1256 | 989 | } |