blob b72f5fc7 (14316B) - Raw
1 /* 2 * Copyright (c) 2016 Andrew Kelley 3 * 4 * This file is part of zig, which is MIT licensed. 5 * See http://opensource.org/licenses/MIT 6 */ 7 8 #include "target.hpp" 9 #include "util.hpp" 10 #include "error.hpp" 11 12 #include <stdio.h> 13 14 static const ArchType arch_list[] = { 15 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v8_2a}, 16 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v8_1a}, 17 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v8}, 18 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v8m_baseline}, 19 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v8m_mainline}, 20 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v7}, 21 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v7em}, 22 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v7m}, 23 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v7s}, 24 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v7k}, 25 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v6}, 26 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v6m}, 27 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v6k}, 28 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v6t2}, 29 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v5}, 30 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v5te}, 31 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v4t}, 32 33 {ZigLLVM_armeb, ZigLLVM_NoSubArch}, 34 {ZigLLVM_aarch64, ZigLLVM_NoSubArch}, 35 {ZigLLVM_aarch64_be, ZigLLVM_NoSubArch}, 36 {ZigLLVM_avr, ZigLLVM_NoSubArch}, 37 {ZigLLVM_bpfel, ZigLLVM_NoSubArch}, 38 {ZigLLVM_bpfeb, ZigLLVM_NoSubArch}, 39 {ZigLLVM_hexagon, ZigLLVM_NoSubArch}, 40 {ZigLLVM_mips, ZigLLVM_NoSubArch}, 41 {ZigLLVM_mipsel, ZigLLVM_NoSubArch}, 42 {ZigLLVM_mips64, ZigLLVM_NoSubArch}, 43 {ZigLLVM_mips64el, ZigLLVM_NoSubArch}, 44 {ZigLLVM_msp430, ZigLLVM_NoSubArch}, 45 {ZigLLVM_ppc, ZigLLVM_NoSubArch}, 46 {ZigLLVM_ppc64, ZigLLVM_NoSubArch}, 47 {ZigLLVM_ppc64le, ZigLLVM_NoSubArch}, 48 {ZigLLVM_r600, ZigLLVM_NoSubArch}, 49 {ZigLLVM_amdgcn, ZigLLVM_NoSubArch}, 50 {ZigLLVM_sparc, ZigLLVM_NoSubArch}, 51 {ZigLLVM_sparcv9, ZigLLVM_NoSubArch}, 52 {ZigLLVM_sparcel, ZigLLVM_NoSubArch}, 53 {ZigLLVM_systemz, ZigLLVM_NoSubArch}, 54 {ZigLLVM_tce, ZigLLVM_NoSubArch}, 55 {ZigLLVM_thumb, ZigLLVM_NoSubArch}, 56 {ZigLLVM_thumbeb, ZigLLVM_NoSubArch}, 57 {ZigLLVM_x86, ZigLLVM_NoSubArch}, 58 {ZigLLVM_x86_64, ZigLLVM_NoSubArch}, 59 {ZigLLVM_xcore, ZigLLVM_NoSubArch}, 60 {ZigLLVM_nvptx, ZigLLVM_NoSubArch}, 61 {ZigLLVM_nvptx64, ZigLLVM_NoSubArch}, 62 {ZigLLVM_le32, ZigLLVM_NoSubArch}, 63 {ZigLLVM_le64, ZigLLVM_NoSubArch}, 64 {ZigLLVM_amdil, ZigLLVM_NoSubArch}, 65 {ZigLLVM_amdil64, ZigLLVM_NoSubArch}, 66 {ZigLLVM_hsail, ZigLLVM_NoSubArch}, 67 {ZigLLVM_hsail64, ZigLLVM_NoSubArch}, 68 {ZigLLVM_spir, ZigLLVM_NoSubArch}, 69 {ZigLLVM_spir64, ZigLLVM_NoSubArch}, 70 71 {ZigLLVM_kalimba, ZigLLVM_KalimbaSubArch_v3}, 72 {ZigLLVM_kalimba, ZigLLVM_KalimbaSubArch_v4}, 73 {ZigLLVM_kalimba, ZigLLVM_KalimbaSubArch_v5}, 74 75 {ZigLLVM_shave, ZigLLVM_NoSubArch}, 76 {ZigLLVM_lanai, ZigLLVM_NoSubArch}, 77 {ZigLLVM_wasm32, ZigLLVM_NoSubArch}, 78 {ZigLLVM_wasm64, ZigLLVM_NoSubArch}, 79 {ZigLLVM_renderscript32, ZigLLVM_NoSubArch}, 80 {ZigLLVM_renderscript64, ZigLLVM_NoSubArch}, 81 }; 82 83 static const ZigLLVM_VendorType vendor_list[] = { 84 ZigLLVM_Apple, 85 ZigLLVM_PC, 86 ZigLLVM_SCEI, 87 ZigLLVM_BGP, 88 ZigLLVM_BGQ, 89 ZigLLVM_Freescale, 90 ZigLLVM_IBM, 91 ZigLLVM_ImaginationTechnologies, 92 ZigLLVM_MipsTechnologies, 93 ZigLLVM_NVIDIA, 94 ZigLLVM_CSR, 95 ZigLLVM_Myriad, 96 ZigLLVM_AMD, 97 ZigLLVM_Mesa, 98 }; 99 100 static const ZigLLVM_OSType os_list[] = { 101 ZigLLVM_UnknownOS, 102 ZigLLVM_CloudABI, 103 ZigLLVM_Darwin, 104 ZigLLVM_DragonFly, 105 ZigLLVM_FreeBSD, 106 ZigLLVM_IOS, 107 ZigLLVM_KFreeBSD, 108 ZigLLVM_Linux, 109 ZigLLVM_Lv2, 110 ZigLLVM_MacOSX, 111 ZigLLVM_NetBSD, 112 ZigLLVM_OpenBSD, 113 ZigLLVM_Solaris, 114 ZigLLVM_Win32, 115 ZigLLVM_Haiku, 116 ZigLLVM_Minix, 117 ZigLLVM_RTEMS, 118 ZigLLVM_NaCl, 119 ZigLLVM_CNK, 120 ZigLLVM_Bitrig, 121 ZigLLVM_AIX, 122 ZigLLVM_CUDA, 123 ZigLLVM_NVCL, 124 ZigLLVM_AMDHSA, 125 ZigLLVM_PS4, 126 ZigLLVM_ELFIAMCU, 127 ZigLLVM_TvOS, 128 ZigLLVM_WatchOS, 129 ZigLLVM_Mesa3D, 130 }; 131 132 static const ZigLLVM_EnvironmentType environ_list[] = { 133 ZigLLVM_GNU, 134 ZigLLVM_GNUABI64, 135 ZigLLVM_GNUEABI, 136 ZigLLVM_GNUEABIHF, 137 ZigLLVM_GNUX32, 138 ZigLLVM_CODE16, 139 ZigLLVM_EABI, 140 ZigLLVM_EABIHF, 141 ZigLLVM_Android, 142 ZigLLVM_Musl, 143 ZigLLVM_MuslEABI, 144 ZigLLVM_MuslEABIHF, 145 ZigLLVM_MSVC, 146 ZigLLVM_Itanium, 147 ZigLLVM_Cygnus, 148 ZigLLVM_AMDOpenCL, 149 ZigLLVM_CoreCLR, 150 }; 151 152 static const ZigLLVM_ObjectFormatType oformat_list[] = { 153 ZigLLVM_UnknownObjectFormat, 154 ZigLLVM_COFF, 155 ZigLLVM_ELF, 156 ZigLLVM_MachO, 157 }; 158 159 int target_oformat_count(void) { 160 return array_length(oformat_list); 161 } 162 163 const ZigLLVM_ObjectFormatType get_target_oformat(int index) { 164 return oformat_list[index]; 165 } 166 167 const char *get_target_oformat_name(ZigLLVM_ObjectFormatType oformat) { 168 switch (oformat) { 169 case ZigLLVM_UnknownObjectFormat: return "unknown"; 170 case ZigLLVM_COFF: return "coff"; 171 case ZigLLVM_ELF: return "elf"; 172 case ZigLLVM_MachO: return "macho"; 173 } 174 zig_unreachable(); 175 } 176 177 int target_arch_count(void) { 178 return array_length(arch_list); 179 } 180 181 const ArchType *get_target_arch(int index) { 182 return &arch_list[index]; 183 } 184 185 int target_vendor_count(void) { 186 return array_length(vendor_list); 187 } 188 189 ZigLLVM_VendorType get_target_vendor(int index) { 190 return vendor_list[index]; 191 } 192 193 int target_os_count(void) { 194 return array_length(os_list); 195 } 196 ZigLLVM_OSType get_target_os(int index) { 197 return os_list[index]; 198 } 199 200 const char *get_target_os_name(ZigLLVM_OSType os_type) { 201 return (os_type == ZigLLVM_UnknownOS) ? "freestanding" : ZigLLVMGetOSTypeName(os_type); 202 } 203 204 int target_environ_count(void) { 205 return array_length(environ_list); 206 } 207 ZigLLVM_EnvironmentType get_target_environ(int index) { 208 return environ_list[index]; 209 } 210 211 void get_native_target(ZigTarget *target) { 212 ZigLLVMGetNativeTarget( 213 &target->arch.arch, 214 &target->arch.sub_arch, 215 &target->vendor, 216 &target->os, 217 &target->env_type, 218 &target->oformat); 219 } 220 221 void get_unknown_target(ZigTarget *target) { 222 target->arch.arch = ZigLLVM_UnknownArch; 223 target->arch.sub_arch = ZigLLVM_NoSubArch; 224 target->vendor = ZigLLVM_UnknownVendor; 225 target->os = ZigLLVM_UnknownOS; 226 target->env_type = ZigLLVM_UnknownEnvironment; 227 target->oformat = ZigLLVM_UnknownObjectFormat; 228 } 229 230 static void get_arch_name_raw(char *out_str, ZigLLVM_ArchType arch, ZigLLVM_SubArchType sub_arch) { 231 const char *sub_str = (sub_arch == ZigLLVM_NoSubArch) ? "" : ZigLLVMGetSubArchTypeName(sub_arch); 232 sprintf(out_str, "%s%s", ZigLLVMGetArchTypeName(arch), sub_str); 233 } 234 235 void get_arch_name(char *out_str, const ArchType *arch) { 236 return get_arch_name_raw(out_str, arch->arch, arch->sub_arch); 237 } 238 239 int parse_target_arch(const char *str, ArchType *out_arch) { 240 for (int i = 0; i < array_length(arch_list); i += 1) { 241 const ArchType *arch = &arch_list[i]; 242 char arch_name[50]; 243 get_arch_name_raw(arch_name, arch->arch, arch->sub_arch); 244 if (strcmp(arch_name, str) == 0) { 245 *out_arch = *arch; 246 return 0; 247 } 248 } 249 return ErrorFileNotFound; 250 } 251 252 int parse_target_os(const char *str, ZigLLVM_OSType *out_os) { 253 for (int i = 0; i < array_length(os_list); i += 1) { 254 ZigLLVM_OSType os = os_list[i]; 255 const char *os_name = get_target_os_name(os); 256 if (strcmp(os_name, str) == 0) { 257 *out_os = os; 258 return 0; 259 } 260 } 261 return ErrorFileNotFound; 262 } 263 264 int parse_target_environ(const char *str, ZigLLVM_EnvironmentType *out_environ) { 265 for (int i = 0; i < array_length(environ_list); i += 1) { 266 ZigLLVM_EnvironmentType env_type = environ_list[i]; 267 const char *environ_name = ZigLLVMGetEnvironmentTypeName(env_type); 268 if (strcmp(environ_name, str) == 0) { 269 *out_environ = env_type; 270 return 0; 271 } 272 } 273 return ErrorFileNotFound; 274 } 275 276 void init_all_targets(void) { 277 LLVMInitializeAllTargets(); 278 LLVMInitializeAllTargetInfos(); 279 LLVMInitializeAllTargetMCs(); 280 LLVMInitializeAllAsmPrinters(); 281 LLVMInitializeAllAsmParsers(); 282 } 283 284 void get_target_triple(Buf *triple, const ZigTarget *target) { 285 ZigLLVMGetTargetTriple(triple, target->arch.arch, target->arch.sub_arch, 286 target->vendor, target->os, target->env_type, target->oformat); 287 } 288 289 static bool is_os_darwin(ZigTarget *target) { 290 switch (target->os) { 291 case ZigLLVM_Darwin: 292 case ZigLLVM_IOS: 293 case ZigLLVM_MacOSX: 294 return true; 295 default: 296 return false; 297 } 298 } 299 300 void resolve_target_object_format(ZigTarget *target) { 301 if (target->oformat != ZigLLVM_UnknownObjectFormat) { 302 return; 303 } 304 305 switch (target->arch.arch) { 306 case ZigLLVM_UnknownArch: 307 case ZigLLVM_aarch64: 308 case ZigLLVM_arm: 309 case ZigLLVM_thumb: 310 case ZigLLVM_x86: 311 case ZigLLVM_x86_64: 312 if (is_os_darwin(target)) { 313 target->oformat = ZigLLVM_MachO; 314 } else if (target->os == ZigLLVM_Win32) { 315 target->oformat = ZigLLVM_COFF; 316 } else { 317 target->oformat = ZigLLVM_ELF; 318 } 319 return; 320 321 case ZigLLVM_aarch64_be: 322 case ZigLLVM_amdgcn: 323 case ZigLLVM_amdil: 324 case ZigLLVM_amdil64: 325 case ZigLLVM_armeb: 326 case ZigLLVM_avr: 327 case ZigLLVM_bpfeb: 328 case ZigLLVM_bpfel: 329 case ZigLLVM_hexagon: 330 case ZigLLVM_lanai: 331 case ZigLLVM_hsail: 332 case ZigLLVM_hsail64: 333 case ZigLLVM_kalimba: 334 case ZigLLVM_le32: 335 case ZigLLVM_le64: 336 case ZigLLVM_mips: 337 case ZigLLVM_mips64: 338 case ZigLLVM_mips64el: 339 case ZigLLVM_mipsel: 340 case ZigLLVM_msp430: 341 case ZigLLVM_nvptx: 342 case ZigLLVM_nvptx64: 343 case ZigLLVM_ppc64le: 344 case ZigLLVM_r600: 345 case ZigLLVM_renderscript32: 346 case ZigLLVM_renderscript64: 347 case ZigLLVM_shave: 348 case ZigLLVM_sparc: 349 case ZigLLVM_sparcel: 350 case ZigLLVM_sparcv9: 351 case ZigLLVM_spir: 352 case ZigLLVM_spir64: 353 case ZigLLVM_systemz: 354 case ZigLLVM_tce: 355 case ZigLLVM_thumbeb: 356 case ZigLLVM_wasm32: 357 case ZigLLVM_wasm64: 358 case ZigLLVM_xcore: 359 target->oformat= ZigLLVM_ELF; 360 return; 361 362 case ZigLLVM_ppc: 363 case ZigLLVM_ppc64: 364 if (is_os_darwin(target)) { 365 target->oformat = ZigLLVM_MachO; 366 } else { 367 target->oformat= ZigLLVM_ELF; 368 } 369 return; 370 } 371 } 372 373 // See lib/Support/Triple.cpp in LLVM for the source of this data. 374 static int get_arch_pointer_bit_width(ZigLLVM_ArchType arch) { 375 switch (arch) { 376 case ZigLLVM_UnknownArch: 377 return 0; 378 379 case ZigLLVM_avr: 380 case ZigLLVM_msp430: 381 return 16; 382 383 case ZigLLVM_arm: 384 case ZigLLVM_armeb: 385 case ZigLLVM_hexagon: 386 case ZigLLVM_le32: 387 case ZigLLVM_mips: 388 case ZigLLVM_mipsel: 389 case ZigLLVM_nvptx: 390 case ZigLLVM_ppc: 391 case ZigLLVM_r600: 392 case ZigLLVM_sparc: 393 case ZigLLVM_sparcel: 394 case ZigLLVM_tce: 395 case ZigLLVM_thumb: 396 case ZigLLVM_thumbeb: 397 case ZigLLVM_x86: 398 case ZigLLVM_xcore: 399 case ZigLLVM_amdil: 400 case ZigLLVM_hsail: 401 case ZigLLVM_spir: 402 case ZigLLVM_kalimba: 403 case ZigLLVM_lanai: 404 case ZigLLVM_shave: 405 case ZigLLVM_wasm32: 406 case ZigLLVM_renderscript32: 407 return 32; 408 409 case ZigLLVM_aarch64: 410 case ZigLLVM_aarch64_be: 411 case ZigLLVM_amdgcn: 412 case ZigLLVM_bpfel: 413 case ZigLLVM_bpfeb: 414 case ZigLLVM_le64: 415 case ZigLLVM_mips64: 416 case ZigLLVM_mips64el: 417 case ZigLLVM_nvptx64: 418 case ZigLLVM_ppc64: 419 case ZigLLVM_ppc64le: 420 case ZigLLVM_sparcv9: 421 case ZigLLVM_systemz: 422 case ZigLLVM_x86_64: 423 case ZigLLVM_amdil64: 424 case ZigLLVM_hsail64: 425 case ZigLLVM_spir64: 426 case ZigLLVM_wasm64: 427 case ZigLLVM_renderscript64: 428 return 64; 429 } 430 zig_unreachable(); 431 } 432 433 int get_c_type_size_in_bits(const ZigTarget *target, CIntType id) { 434 switch (target->os) { 435 case ZigLLVM_UnknownOS: 436 zig_unreachable(); 437 case ZigLLVM_Linux: 438 case ZigLLVM_Darwin: 439 switch (id) { 440 case CIntTypeShort: 441 case CIntTypeUShort: 442 return 16; 443 case CIntTypeInt: 444 case CIntTypeUInt: 445 return 32; 446 case CIntTypeLong: 447 case CIntTypeULong: 448 return get_arch_pointer_bit_width(target->arch.arch); 449 case CIntTypeLongLong: 450 case CIntTypeULongLong: 451 return 64; 452 case CIntTypeCount: 453 zig_unreachable(); 454 } 455 case ZigLLVM_Win32: 456 switch (id) { 457 case CIntTypeShort: 458 case CIntTypeUShort: 459 return 16; 460 case CIntTypeInt: 461 case CIntTypeUInt: 462 case CIntTypeLong: 463 case CIntTypeULong: 464 return 32; 465 case CIntTypeLongLong: 466 case CIntTypeULongLong: 467 return 64; 468 case CIntTypeCount: 469 zig_unreachable(); 470 } 471 case ZigLLVM_CloudABI: 472 case ZigLLVM_DragonFly: 473 case ZigLLVM_FreeBSD: 474 case ZigLLVM_IOS: 475 case ZigLLVM_KFreeBSD: 476 case ZigLLVM_Lv2: 477 case ZigLLVM_MacOSX: 478 case ZigLLVM_NetBSD: 479 case ZigLLVM_OpenBSD: 480 case ZigLLVM_Solaris: 481 case ZigLLVM_Haiku: 482 case ZigLLVM_Minix: 483 case ZigLLVM_RTEMS: 484 case ZigLLVM_NaCl: 485 case ZigLLVM_CNK: 486 case ZigLLVM_Bitrig: 487 case ZigLLVM_AIX: 488 case ZigLLVM_CUDA: 489 case ZigLLVM_NVCL: 490 case ZigLLVM_AMDHSA: 491 case ZigLLVM_PS4: 492 case ZigLLVM_ELFIAMCU: 493 case ZigLLVM_TvOS: 494 case ZigLLVM_WatchOS: 495 case ZigLLVM_Mesa3D: 496 zig_panic("TODO c type size in bits for this target"); 497 } 498 zig_unreachable(); 499 }