1 //===--- ARM.cpp - Implement ARM target feature support -------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements ARM TargetInfo objects. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "ARM.h" 15 #include "clang/Basic/Builtins.h" 16 #include "clang/Basic/Diagnostic.h" 17 #include "clang/Basic/TargetBuiltins.h" 18 #include "llvm/ADT/StringExtras.h" 19 #include "llvm/ADT/StringRef.h" 20 #include "llvm/ADT/StringSwitch.h" 21 22 using namespace clang; 23 using namespace clang::targets; 24 25 void ARMTargetInfo::setABIAAPCS() { 26 IsAAPCS = true; 27 28 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64; 29 const llvm::Triple &T = getTriple(); 30 31 bool IsNetBSD = T.getOS() == llvm::Triple::NetBSD; 32 bool IsOpenBSD = T.getOS() == llvm::Triple::OpenBSD; 33 if (!T.isOSWindows() && !IsNetBSD && !IsOpenBSD) 34 WCharType = UnsignedInt; 35 36 UseBitFieldTypeAlignment = true; 37 38 ZeroLengthBitfieldBoundary = 0; 39 40 // Thumb1 add sp, #imm requires the immediate value be multiple of 4, 41 // so set preferred for small types to 32. 42 if (T.isOSBinFormatMachO()) { 43 resetDataLayout(BigEndian 44 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" 45 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"); 46 } else if (T.isOSWindows()) { 47 assert(!BigEndian && "Windows on ARM does not support big endian"); 48 resetDataLayout("e" 49 "-m:w" 50 "-p:32:32" 51 "-i64:64" 52 "-v128:64:128" 53 "-a:0:32" 54 "-n32" 55 "-S64"); 56 } else if (T.isOSNaCl()) { 57 assert(!BigEndian && "NaCl on ARM does not support big endian"); 58 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128"); 59 } else { 60 resetDataLayout(BigEndian 61 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" 62 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"); 63 } 64 65 // FIXME: Enumerated types are variable width in straight AAPCS. 66 } 67 68 void ARMTargetInfo::setABIAPCS(bool IsAAPCS16) { 69 const llvm::Triple &T = getTriple(); 70 71 IsAAPCS = false; 72 73 if (IsAAPCS16) 74 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64; 75 else 76 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32; 77 78 WCharType = SignedInt; 79 80 // Do not respect the alignment of bit-field types when laying out 81 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc. 82 UseBitFieldTypeAlignment = false; 83 84 /// gcc forces the alignment to 4 bytes, regardless of the type of the 85 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in 86 /// gcc. 87 ZeroLengthBitfieldBoundary = 32; 88 89 if (T.isOSBinFormatMachO() && IsAAPCS16) { 90 assert(!BigEndian && "AAPCS16 does not support big-endian"); 91 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128"); 92 } else if (T.isOSBinFormatMachO()) 93 resetDataLayout( 94 BigEndian 95 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" 96 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"); 97 else 98 resetDataLayout( 99 BigEndian 100 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" 101 : "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"); 102 103 // FIXME: Override "preferred align" for double and long long. 104 } 105 106 void ARMTargetInfo::setArchInfo() { 107 StringRef ArchName = getTriple().getArchName(); 108 109 ArchISA = llvm::ARM::parseArchISA(ArchName); 110 CPU = llvm::ARM::getDefaultCPU(ArchName); 111 llvm::ARM::ArchKind AK = llvm::ARM::parseArch(ArchName); 112 if (AK != llvm::ARM::ArchKind::INVALID) 113 ArchKind = AK; 114 setArchInfo(ArchKind); 115 } 116 117 void ARMTargetInfo::setArchInfo(llvm::ARM::ArchKind Kind) { 118 StringRef SubArch; 119 120 // cache TargetParser info 121 ArchKind = Kind; 122 SubArch = llvm::ARM::getSubArch(ArchKind); 123 ArchProfile = llvm::ARM::parseArchProfile(SubArch); 124 ArchVersion = llvm::ARM::parseArchVersion(SubArch); 125 126 // cache CPU related strings 127 CPUAttr = getCPUAttr(); 128 CPUProfile = getCPUProfile(); 129 } 130 131 void ARMTargetInfo::setAtomic() { 132 // when triple does not specify a sub arch, 133 // then we are not using inline atomics 134 bool ShouldUseInlineAtomic = 135 (ArchISA == llvm::ARM::ISAKind::ARM && ArchVersion >= 6) || 136 (ArchISA == llvm::ARM::ISAKind::THUMB && ArchVersion >= 7); 137 // Cortex M does not support 8 byte atomics, while general Thumb2 does. 138 if (ArchProfile == llvm::ARM::ProfileKind::M) { 139 MaxAtomicPromoteWidth = 32; 140 if (ShouldUseInlineAtomic) 141 MaxAtomicInlineWidth = 32; 142 } else { 143 MaxAtomicPromoteWidth = 64; 144 if (ShouldUseInlineAtomic) 145 MaxAtomicInlineWidth = 64; 146 } 147 } 148 149 bool ARMTargetInfo::isThumb() const { 150 return ArchISA == llvm::ARM::ISAKind::THUMB; 151 } 152 153 bool ARMTargetInfo::supportsThumb() const { 154 return CPUAttr.count('T') || ArchVersion >= 6; 155 } 156 157 bool ARMTargetInfo::supportsThumb2() const { 158 return CPUAttr.equals("6T2") || 159 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE")); 160 } 161 162 StringRef ARMTargetInfo::getCPUAttr() const { 163 // For most sub-arches, the build attribute CPU name is enough. 164 // For Cortex variants, it's slightly different. 165 switch (ArchKind) { 166 default: 167 return llvm::ARM::getCPUAttr(ArchKind); 168 case llvm::ARM::ArchKind::ARMV6M: 169 return "6M"; 170 case llvm::ARM::ArchKind::ARMV7S: 171 return "7S"; 172 case llvm::ARM::ArchKind::ARMV7A: 173 return "7A"; 174 case llvm::ARM::ArchKind::ARMV7R: 175 return "7R"; 176 case llvm::ARM::ArchKind::ARMV7M: 177 return "7M"; 178 case llvm::ARM::ArchKind::ARMV7EM: 179 return "7EM"; 180 case llvm::ARM::ArchKind::ARMV7VE: 181 return "7VE"; 182 case llvm::ARM::ArchKind::ARMV8A: 183 return "8A"; 184 case llvm::ARM::ArchKind::ARMV8_1A: 185 return "8_1A"; 186 case llvm::ARM::ArchKind::ARMV8_2A: 187 return "8_2A"; 188 case llvm::ARM::ArchKind::ARMV8_3A: 189 return "8_3A"; 190 case llvm::ARM::ArchKind::ARMV8_4A: 191 return "8_4A"; 192 case llvm::ARM::ArchKind::ARMV8MBaseline: 193 return "8M_BASE"; 194 case llvm::ARM::ArchKind::ARMV8MMainline: 195 return "8M_MAIN"; 196 case llvm::ARM::ArchKind::ARMV8R: 197 return "8R"; 198 } 199 } 200 201 StringRef ARMTargetInfo::getCPUProfile() const { 202 switch (ArchProfile) { 203 case llvm::ARM::ProfileKind::A: 204 return "A"; 205 case llvm::ARM::ProfileKind::R: 206 return "R"; 207 case llvm::ARM::ProfileKind::M: 208 return "M"; 209 default: 210 return ""; 211 } 212 } 213 214 ARMTargetInfo::ARMTargetInfo(const llvm::Triple &Triple, 215 const TargetOptions &Opts) 216 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0), 217 HW_FP(0) { 218 bool IsOpenBSD = Triple.getOS() == llvm::Triple::OpenBSD; 219 bool IsNetBSD = Triple.getOS() == llvm::Triple::NetBSD; 220 221 // FIXME: the isOSBinFormatMachO is a workaround for identifying a Darwin-like 222 // environment where size_t is `unsigned long` rather than `unsigned int` 223 224 PtrDiffType = IntPtrType = 225 (Triple.isOSDarwin() || Triple.isOSBinFormatMachO() || IsOpenBSD || 226 IsNetBSD) 227 ? SignedLong 228 : SignedInt; 229 230 SizeType = (Triple.isOSDarwin() || Triple.isOSBinFormatMachO() || IsOpenBSD || 231 IsNetBSD) 232 ? UnsignedLong 233 : UnsignedInt; 234 235 // ptrdiff_t is inconsistent on Darwin 236 if ((Triple.isOSDarwin() || Triple.isOSBinFormatMachO()) && 237 !Triple.isWatchABI()) 238 PtrDiffType = SignedInt; 239 240 // Cache arch related info. 241 setArchInfo(); 242 243 // {} in inline assembly are neon specifiers, not assembly variant 244 // specifiers. 245 NoAsmVariants = true; 246 247 // FIXME: This duplicates code from the driver that sets the -target-abi 248 // option - this code is used if -target-abi isn't passed and should 249 // be unified in some way. 250 if (Triple.isOSBinFormatMachO()) { 251 // The backend is hardwired to assume AAPCS for M-class processors, ensure 252 // the frontend matches that. 253 if (Triple.getEnvironment() == llvm::Triple::EABI || 254 Triple.getOS() == llvm::Triple::UnknownOS || 255 ArchProfile == llvm::ARM::ProfileKind::M) { 256 setABI("aapcs"); 257 } else if (Triple.isWatchABI()) { 258 setABI("aapcs16"); 259 } else { 260 setABI("apcs-gnu"); 261 } 262 } else if (Triple.isOSWindows()) { 263 // FIXME: this is invalid for WindowsCE 264 setABI("aapcs"); 265 } else { 266 // Select the default based on the platform. 267 switch (Triple.getEnvironment()) { 268 case llvm::Triple::Android: 269 case llvm::Triple::GNUEABI: 270 case llvm::Triple::GNUEABIHF: 271 case llvm::Triple::MuslEABI: 272 case llvm::Triple::MuslEABIHF: 273 setABI("aapcs-linux"); 274 break; 275 case llvm::Triple::EABIHF: 276 case llvm::Triple::EABI: 277 setABI("aapcs"); 278 break; 279 case llvm::Triple::GNU: 280 setABI("apcs-gnu"); 281 break; 282 default: 283 if (Triple.getOS() == llvm::Triple::NetBSD) 284 setABI("apcs-gnu"); 285 else if (Triple.getOS() == llvm::Triple::OpenBSD) 286 setABI("aapcs-linux"); 287 else 288 setABI("aapcs"); 289 break; 290 } 291 } 292 293 // ARM targets default to using the ARM C++ ABI. 294 TheCXXABI.set(TargetCXXABI::GenericARM); 295 296 // ARM has atomics up to 8 bytes 297 setAtomic(); 298 299 // Maximum alignment for ARM NEON data types should be 64-bits (AAPCS) 300 if (IsAAPCS && (Triple.getEnvironment() != llvm::Triple::Android)) 301 MaxVectorAlign = 64; 302 303 // Do force alignment of members that follow zero length bitfields. If 304 // the alignment of the zero-length bitfield is greater than the member 305 // that follows it, `bar', `bar' will be aligned as the type of the 306 // zero length bitfield. 307 UseZeroLengthBitfieldAlignment = true; 308 309 if (Triple.getOS() == llvm::Triple::Linux || 310 Triple.getOS() == llvm::Triple::UnknownOS) 311 this->MCountName = Opts.EABIVersion == llvm::EABI::GNU 312 ? "\01__gnu_mcount_nc" 313 : "\01mcount"; 314 } 315 316 StringRef ARMTargetInfo::getABI() const { return ABI; } 317 318 bool ARMTargetInfo::setABI(const std::string &Name) { 319 ABI = Name; 320 321 // The defaults (above) are for AAPCS, check if we need to change them. 322 // 323 // FIXME: We need support for -meabi... we could just mangle it into the 324 // name. 325 if (Name == "apcs-gnu" || Name == "aapcs16") { 326 setABIAPCS(Name == "aapcs16"); 327 return true; 328 } 329 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") { 330 setABIAAPCS(); 331 return true; 332 } 333 return false; 334 } 335 336 // FIXME: This should be based on Arch attributes, not CPU names. 337 bool ARMTargetInfo::initFeatureMap( 338 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU, 339 const std::vector<std::string> &FeaturesVec) const { 340 341 std::string ArchFeature; 342 std::vector<StringRef> TargetFeatures; 343 llvm::ARM::ArchKind Arch = llvm::ARM::parseArch(getTriple().getArchName()); 344 345 // Map the base architecture to an appropriate target feature, so we don't 346 // rely on the target triple. 347 llvm::ARM::ArchKind CPUArch = llvm::ARM::parseCPUArch(CPU); 348 if (CPUArch == llvm::ARM::ArchKind::INVALID) 349 CPUArch = Arch; 350 if (CPUArch != llvm::ARM::ArchKind::INVALID) { 351 ArchFeature = ("+" + llvm::ARM::getArchName(CPUArch)).str(); 352 TargetFeatures.push_back(ArchFeature); 353 } 354 355 // get default FPU features 356 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch); 357 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures); 358 359 // get default Extension features 360 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch); 361 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures); 362 363 for (auto Feature : TargetFeatures) 364 if (Feature[0] == '+') 365 Features[Feature.drop_front(1)] = true; 366 367 // Enable or disable thumb-mode explicitly per function to enable mixed 368 // ARM and Thumb code generation. 369 if (isThumb()) 370 Features["thumb-mode"] = true; 371 else 372 Features["thumb-mode"] = false; 373 374 // Convert user-provided arm and thumb GNU target attributes to 375 // [-|+]thumb-mode target features respectively. 376 std::vector<std::string> UpdatedFeaturesVec(FeaturesVec); 377 for (auto &Feature : UpdatedFeaturesVec) { 378 if (Feature.compare("+arm") == 0) 379 Feature = "-thumb-mode"; 380 else if (Feature.compare("+thumb") == 0) 381 Feature = "+thumb-mode"; 382 } 383 384 return TargetInfo::initFeatureMap(Features, Diags, CPU, UpdatedFeaturesVec); 385 } 386 387 388 bool ARMTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, 389 DiagnosticsEngine &Diags) { 390 FPU = 0; 391 CRC = 0; 392 Crypto = 0; 393 DSP = 0; 394 Unaligned = 1; 395 SoftFloat = SoftFloatABI = false; 396 HWDiv = 0; 397 DotProd = 0; 398 399 // This does not diagnose illegal cases like having both 400 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp". 401 uint32_t HW_FP_remove = 0; 402 for (const auto &Feature : Features) { 403 if (Feature == "+soft-float") { 404 SoftFloat = true; 405 } else if (Feature == "+soft-float-abi") { 406 SoftFloatABI = true; 407 } else if (Feature == "+vfp2") { 408 FPU |= VFP2FPU; 409 HW_FP |= HW_FP_SP | HW_FP_DP; 410 } else if (Feature == "+vfp3") { 411 FPU |= VFP3FPU; 412 HW_FP |= HW_FP_SP | HW_FP_DP; 413 } else if (Feature == "+vfp4") { 414 FPU |= VFP4FPU; 415 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP; 416 } else if (Feature == "+fp-armv8") { 417 FPU |= FPARMV8; 418 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP; 419 } else if (Feature == "+neon") { 420 FPU |= NeonFPU; 421 HW_FP |= HW_FP_SP | HW_FP_DP; 422 } else if (Feature == "+hwdiv") { 423 HWDiv |= HWDivThumb; 424 } else if (Feature == "+hwdiv-arm") { 425 HWDiv |= HWDivARM; 426 } else if (Feature == "+crc") { 427 CRC = 1; 428 } else if (Feature == "+crypto") { 429 Crypto = 1; 430 } else if (Feature == "+dsp") { 431 DSP = 1; 432 } else if (Feature == "+fp-only-sp") { 433 HW_FP_remove |= HW_FP_DP; 434 } else if (Feature == "+strict-align") { 435 Unaligned = 0; 436 } else if (Feature == "+fp16") { 437 HW_FP |= HW_FP_HP; 438 } else if (Feature == "+fullfp16") { 439 HasLegalHalfType = true; 440 } else if (Feature == "+dotprod") { 441 DotProd = true; 442 } 443 } 444 HW_FP &= ~HW_FP_remove; 445 446 switch (ArchVersion) { 447 case 6: 448 if (ArchProfile == llvm::ARM::ProfileKind::M) 449 LDREX = 0; 450 else if (ArchKind == llvm::ARM::ArchKind::ARMV6K) 451 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B; 452 else 453 LDREX = LDREX_W; 454 break; 455 case 7: 456 if (ArchProfile == llvm::ARM::ProfileKind::M) 457 LDREX = LDREX_W | LDREX_H | LDREX_B; 458 else 459 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B; 460 break; 461 case 8: 462 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B; 463 } 464 465 if (!(FPU & NeonFPU) && FPMath == FP_Neon) { 466 Diags.Report(diag::err_target_unsupported_fpmath) << "neon"; 467 return false; 468 } 469 470 if (FPMath == FP_Neon) 471 Features.push_back("+neonfp"); 472 else if (FPMath == FP_VFP) 473 Features.push_back("-neonfp"); 474 475 // Remove front-end specific options which the backend handles differently. 476 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float-abi"); 477 if (Feature != Features.end()) 478 Features.erase(Feature); 479 480 return true; 481 } 482 483 bool ARMTargetInfo::hasFeature(StringRef Feature) const { 484 return llvm::StringSwitch<bool>(Feature) 485 .Case("arm", true) 486 .Case("aarch32", true) 487 .Case("softfloat", SoftFloat) 488 .Case("thumb", isThumb()) 489 .Case("neon", (FPU & NeonFPU) && !SoftFloat) 490 .Case("vfp", FPU && !SoftFloat) 491 .Case("hwdiv", HWDiv & HWDivThumb) 492 .Case("hwdiv-arm", HWDiv & HWDivARM) 493 .Default(false); 494 } 495 496 bool ARMTargetInfo::isValidCPUName(StringRef Name) const { 497 return Name == "generic" || 498 llvm::ARM::parseCPUArch(Name) != llvm::ARM::ArchKind::INVALID; 499 } 500 501 void ARMTargetInfo::fillValidCPUList(SmallVectorImpl<StringRef> &Values) const { 502 llvm::ARM::fillValidCPUArchList(Values); 503 } 504 505 bool ARMTargetInfo::setCPU(const std::string &Name) { 506 if (Name != "generic") 507 setArchInfo(llvm::ARM::parseCPUArch(Name)); 508 509 if (ArchKind == llvm::ARM::ArchKind::INVALID) 510 return false; 511 setAtomic(); 512 CPU = Name; 513 return true; 514 } 515 516 bool ARMTargetInfo::setFPMath(StringRef Name) { 517 if (Name == "neon") { 518 FPMath = FP_Neon; 519 return true; 520 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" || 521 Name == "vfp4") { 522 FPMath = FP_VFP; 523 return true; 524 } 525 return false; 526 } 527 528 void ARMTargetInfo::getTargetDefinesARMV81A(const LangOptions &Opts, 529 MacroBuilder &Builder) const { 530 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1"); 531 } 532 533 void ARMTargetInfo::getTargetDefinesARMV82A(const LangOptions &Opts, 534 MacroBuilder &Builder) const { 535 // Also include the ARMv8.1-A defines 536 getTargetDefinesARMV81A(Opts, Builder); 537 } 538 539 void ARMTargetInfo::getTargetDefines(const LangOptions &Opts, 540 MacroBuilder &Builder) const { 541 // Target identification. 542 Builder.defineMacro("__arm"); 543 Builder.defineMacro("__arm__"); 544 // For bare-metal none-eabi. 545 if (getTriple().getOS() == llvm::Triple::UnknownOS && 546 (getTriple().getEnvironment() == llvm::Triple::EABI || 547 getTriple().getEnvironment() == llvm::Triple::EABIHF)) 548 Builder.defineMacro("__ELF__"); 549 550 // Target properties. 551 Builder.defineMacro("__REGISTER_PREFIX__", ""); 552 553 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU 554 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__. 555 if (getTriple().isWatchABI()) 556 Builder.defineMacro("__ARM_ARCH_7K__", "2"); 557 558 if (!CPUAttr.empty()) 559 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__"); 560 561 // ACLE 6.4.1 ARM/Thumb instruction set architecture 562 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA 563 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion)); 564 565 if (ArchVersion >= 8) { 566 // ACLE 6.5.7 Crypto Extension 567 if (Crypto) 568 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1"); 569 // ACLE 6.5.8 CRC32 Extension 570 if (CRC) 571 Builder.defineMacro("__ARM_FEATURE_CRC32", "1"); 572 // ACLE 6.5.10 Numeric Maximum and Minimum 573 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1"); 574 // ACLE 6.5.9 Directed Rounding 575 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1"); 576 } 577 578 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It 579 // is not defined for the M-profile. 580 // NOTE that the default profile is assumed to be 'A' 581 if (CPUProfile.empty() || ArchProfile != llvm::ARM::ProfileKind::M) 582 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1"); 583 584 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original 585 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the 586 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all 587 // v7 and v8 architectures excluding v8-M Baseline. 588 if (supportsThumb2()) 589 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2"); 590 else if (supportsThumb()) 591 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1"); 592 593 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit 594 // instruction set such as ARM or Thumb. 595 Builder.defineMacro("__ARM_32BIT_STATE", "1"); 596 597 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex) 598 599 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset. 600 if (!CPUProfile.empty()) 601 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'"); 602 603 // ACLE 6.4.3 Unaligned access supported in hardware 604 if (Unaligned) 605 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1"); 606 607 // ACLE 6.4.4 LDREX/STREX 608 if (LDREX) 609 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + Twine::utohexstr(LDREX)); 610 611 // ACLE 6.4.5 CLZ 612 if (ArchVersion == 5 || (ArchVersion == 6 && CPUProfile != "M") || 613 ArchVersion > 6) 614 Builder.defineMacro("__ARM_FEATURE_CLZ", "1"); 615 616 // ACLE 6.5.1 Hardware Floating Point 617 if (HW_FP) 618 Builder.defineMacro("__ARM_FP", "0x" + Twine::utohexstr(HW_FP)); 619 620 // ACLE predefines. 621 Builder.defineMacro("__ARM_ACLE", "200"); 622 623 // FP16 support (we currently only support IEEE format). 624 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1"); 625 Builder.defineMacro("__ARM_FP16_ARGS", "1"); 626 627 // ACLE 6.5.3 Fused multiply-accumulate (FMA) 628 if (ArchVersion >= 7 && (FPU & VFP4FPU)) 629 Builder.defineMacro("__ARM_FEATURE_FMA", "1"); 630 631 // Subtarget options. 632 633 // FIXME: It's more complicated than this and we don't really support 634 // interworking. 635 // Windows on ARM does not "support" interworking 636 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows()) 637 Builder.defineMacro("__THUMB_INTERWORK__"); 638 639 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") { 640 // Embedded targets on Darwin follow AAPCS, but not EABI. 641 // Windows on ARM follows AAPCS VFP, but does not conform to EABI. 642 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows()) 643 Builder.defineMacro("__ARM_EABI__"); 644 Builder.defineMacro("__ARM_PCS", "1"); 645 } 646 647 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" || ABI == "aapcs16") 648 Builder.defineMacro("__ARM_PCS_VFP", "1"); 649 650 if (SoftFloat) 651 Builder.defineMacro("__SOFTFP__"); 652 653 if (ArchKind == llvm::ARM::ArchKind::XSCALE) 654 Builder.defineMacro("__XSCALE__"); 655 656 if (isThumb()) { 657 Builder.defineMacro("__THUMBEL__"); 658 Builder.defineMacro("__thumb__"); 659 if (supportsThumb2()) 660 Builder.defineMacro("__thumb2__"); 661 } 662 663 // ACLE 6.4.9 32-bit SIMD instructions 664 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM")) 665 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1"); 666 667 // ACLE 6.4.10 Hardware Integer Divide 668 if (((HWDiv & HWDivThumb) && isThumb()) || 669 ((HWDiv & HWDivARM) && !isThumb())) { 670 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); 671 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1"); 672 } 673 674 // Note, this is always on in gcc, even though it doesn't make sense. 675 Builder.defineMacro("__APCS_32__"); 676 677 if (FPUModeIsVFP((FPUMode)FPU)) { 678 Builder.defineMacro("__VFP_FP__"); 679 if (FPU & VFP2FPU) 680 Builder.defineMacro("__ARM_VFPV2__"); 681 if (FPU & VFP3FPU) 682 Builder.defineMacro("__ARM_VFPV3__"); 683 if (FPU & VFP4FPU) 684 Builder.defineMacro("__ARM_VFPV4__"); 685 if (FPU & FPARMV8) 686 Builder.defineMacro("__ARM_FPV5__"); 687 } 688 689 // This only gets set when Neon instructions are actually available, unlike 690 // the VFP define, hence the soft float and arch check. This is subtly 691 // different from gcc, we follow the intent which was that it should be set 692 // when Neon instructions are actually available. 693 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) { 694 Builder.defineMacro("__ARM_NEON", "1"); 695 Builder.defineMacro("__ARM_NEON__"); 696 // current AArch32 NEON implementations do not support double-precision 697 // floating-point even when it is present in VFP. 698 Builder.defineMacro("__ARM_NEON_FP", 699 "0x" + Twine::utohexstr(HW_FP & ~HW_FP_DP)); 700 } 701 702 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", 703 Twine(Opts.WCharSize ? Opts.WCharSize : 4)); 704 705 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ? "1" : "4"); 706 707 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") { 708 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1"); 709 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2"); 710 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4"); 711 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8"); 712 } 713 714 // ACLE 6.4.7 DSP instructions 715 if (DSP) { 716 Builder.defineMacro("__ARM_FEATURE_DSP", "1"); 717 } 718 719 // ACLE 6.4.8 Saturation instructions 720 bool SAT = false; 721 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6) { 722 Builder.defineMacro("__ARM_FEATURE_SAT", "1"); 723 SAT = true; 724 } 725 726 // ACLE 6.4.6 Q (saturation) flag 727 if (DSP || SAT) 728 Builder.defineMacro("__ARM_FEATURE_QBIT", "1"); 729 730 if (Opts.UnsafeFPMath) 731 Builder.defineMacro("__ARM_FP_FAST", "1"); 732 733 // Armv8.2-A FP16 vector intrinsic 734 if ((FPU & NeonFPU) && HasLegalHalfType) 735 Builder.defineMacro("__ARM_FEATURE_FP16_VECTOR_ARITHMETIC", "1"); 736 737 // Armv8.2-A FP16 scalar intrinsics 738 if (HasLegalHalfType) 739 Builder.defineMacro("__ARM_FEATURE_FP16_SCALAR_ARITHMETIC", "1"); 740 741 // Armv8.2-A dot product intrinsics 742 if (DotProd) 743 Builder.defineMacro("__ARM_FEATURE_DOTPROD", "1"); 744 745 switch (ArchKind) { 746 default: 747 break; 748 case llvm::ARM::ArchKind::ARMV8_1A: 749 getTargetDefinesARMV81A(Opts, Builder); 750 break; 751 case llvm::ARM::ArchKind::ARMV8_2A: 752 getTargetDefinesARMV82A(Opts, Builder); 753 break; 754 } 755 } 756 757 const Builtin::Info ARMTargetInfo::BuiltinInfo[] = { 758 #define BUILTIN(ID, TYPE, ATTRS) \ 759 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr}, 760 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 761 {#ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr}, 762 #include "clang/Basic/BuiltinsNEON.def" 763 764 #define BUILTIN(ID, TYPE, ATTRS) \ 765 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr}, 766 #define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \ 767 {#ID, TYPE, ATTRS, nullptr, LANG, nullptr}, 768 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 769 {#ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr}, 770 #define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \ 771 {#ID, TYPE, ATTRS, HEADER, LANGS, FEATURE}, 772 #include "clang/Basic/BuiltinsARM.def" 773 }; 774 775 ArrayRef<Builtin::Info> ARMTargetInfo::getTargetBuiltins() const { 776 return llvm::makeArrayRef(BuiltinInfo, clang::ARM::LastTSBuiltin - 777 Builtin::FirstTSBuiltin); 778 } 779 780 bool ARMTargetInfo::isCLZForZeroUndef() const { return false; } 781 TargetInfo::BuiltinVaListKind ARMTargetInfo::getBuiltinVaListKind() const { 782 return IsAAPCS 783 ? AAPCSABIBuiltinVaList 784 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList 785 : TargetInfo::VoidPtrBuiltinVaList); 786 } 787 788 const char *const ARMTargetInfo::GCCRegNames[] = { 789 // Integer registers 790 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", 791 "r12", "sp", "lr", "pc", 792 793 // Float registers 794 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11", 795 "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21", "s22", 796 "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31", 797 798 // Double registers 799 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "d11", 800 "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21", "d22", 801 "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", 802 803 // Quad registers 804 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "q10", "q11", 805 "q12", "q13", "q14", "q15"}; 806 807 ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const { 808 return llvm::makeArrayRef(GCCRegNames); 809 } 810 811 const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = { 812 {{"a1"}, "r0"}, {{"a2"}, "r1"}, {{"a3"}, "r2"}, {{"a4"}, "r3"}, 813 {{"v1"}, "r4"}, {{"v2"}, "r5"}, {{"v3"}, "r6"}, {{"v4"}, "r7"}, 814 {{"v5"}, "r8"}, {{"v6", "rfp"}, "r9"}, {{"sl"}, "r10"}, {{"fp"}, "r11"}, 815 {{"ip"}, "r12"}, {{"r13"}, "sp"}, {{"r14"}, "lr"}, {{"r15"}, "pc"}, 816 // The S, D and Q registers overlap, but aren't really aliases; we 817 // don't want to substitute one of these for a different-sized one. 818 }; 819 820 ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const { 821 return llvm::makeArrayRef(GCCRegAliases); 822 } 823 824 bool ARMTargetInfo::validateAsmConstraint( 825 const char *&Name, TargetInfo::ConstraintInfo &Info) const { 826 switch (*Name) { 827 default: 828 break; 829 case 'l': // r0-r7 830 case 'h': // r8-r15 831 case 't': // VFP Floating point register single precision 832 case 'w': // VFP Floating point register double precision 833 Info.setAllowsRegister(); 834 return true; 835 case 'I': 836 case 'J': 837 case 'K': 838 case 'L': 839 case 'M': 840 // FIXME 841 return true; 842 case 'Q': // A memory address that is a single base register. 843 Info.setAllowsMemory(); 844 return true; 845 case 'U': // a memory reference... 846 switch (Name[1]) { 847 case 'q': // ...ARMV4 ldrsb 848 case 'v': // ...VFP load/store (reg+constant offset) 849 case 'y': // ...iWMMXt load/store 850 case 't': // address valid for load/store opaque types wider 851 // than 128-bits 852 case 'n': // valid address for Neon doubleword vector load/store 853 case 'm': // valid address for Neon element and structure load/store 854 case 's': // valid address for non-offset loads/stores of quad-word 855 // values in four ARM registers 856 Info.setAllowsMemory(); 857 Name++; 858 return true; 859 } 860 } 861 return false; 862 } 863 864 std::string ARMTargetInfo::convertConstraint(const char *&Constraint) const { 865 std::string R; 866 switch (*Constraint) { 867 case 'U': // Two-character constraint; add "^" hint for later parsing. 868 R = std::string("^") + std::string(Constraint, 2); 869 Constraint++; 870 break; 871 case 'p': // 'p' should be translated to 'r' by default. 872 R = std::string("r"); 873 break; 874 default: 875 return std::string(1, *Constraint); 876 } 877 return R; 878 } 879 880 bool ARMTargetInfo::validateConstraintModifier( 881 StringRef Constraint, char Modifier, unsigned Size, 882 std::string &SuggestedModifier) const { 883 bool isOutput = (Constraint[0] == '='); 884 bool isInOut = (Constraint[0] == '+'); 885 886 // Strip off constraint modifiers. 887 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&') 888 Constraint = Constraint.substr(1); 889 890 switch (Constraint[0]) { 891 default: 892 break; 893 case 'r': { 894 switch (Modifier) { 895 default: 896 return (isInOut || isOutput || Size <= 64); 897 case 'q': 898 // A register of size 32 cannot fit a vector type. 899 return false; 900 } 901 } 902 } 903 904 return true; 905 } 906 const char *ARMTargetInfo::getClobbers() const { 907 // FIXME: Is this really right? 908 return ""; 909 } 910 911 TargetInfo::CallingConvCheckResult 912 ARMTargetInfo::checkCallingConvention(CallingConv CC) const { 913 switch (CC) { 914 case CC_AAPCS: 915 case CC_AAPCS_VFP: 916 case CC_Swift: 917 case CC_OpenCLKernel: 918 return CCCR_OK; 919 default: 920 return CCCR_Warning; 921 } 922 } 923 924 int ARMTargetInfo::getEHDataRegisterNumber(unsigned RegNo) const { 925 if (RegNo == 0) 926 return 0; 927 if (RegNo == 1) 928 return 1; 929 return -1; 930 } 931 932 bool ARMTargetInfo::hasSjLjLowering() const { return true; } 933 934 ARMleTargetInfo::ARMleTargetInfo(const llvm::Triple &Triple, 935 const TargetOptions &Opts) 936 : ARMTargetInfo(Triple, Opts) {} 937 938 void ARMleTargetInfo::getTargetDefines(const LangOptions &Opts, 939 MacroBuilder &Builder) const { 940 Builder.defineMacro("__ARMEL__"); 941 ARMTargetInfo::getTargetDefines(Opts, Builder); 942 } 943 944 ARMbeTargetInfo::ARMbeTargetInfo(const llvm::Triple &Triple, 945 const TargetOptions &Opts) 946 : ARMTargetInfo(Triple, Opts) {} 947 948 void ARMbeTargetInfo::getTargetDefines(const LangOptions &Opts, 949 MacroBuilder &Builder) const { 950 Builder.defineMacro("__ARMEB__"); 951 Builder.defineMacro("__ARM_BIG_ENDIAN"); 952 ARMTargetInfo::getTargetDefines(Opts, Builder); 953 } 954 955 WindowsARMTargetInfo::WindowsARMTargetInfo(const llvm::Triple &Triple, 956 const TargetOptions &Opts) 957 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) { 958 } 959 960 void WindowsARMTargetInfo::getVisualStudioDefines(const LangOptions &Opts, 961 MacroBuilder &Builder) const { 962 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder); 963 964 // FIXME: this is invalid for WindowsCE 965 Builder.defineMacro("_M_ARM_NT", "1"); 966 Builder.defineMacro("_M_ARMT", "_M_ARM"); 967 Builder.defineMacro("_M_THUMB", "_M_ARM"); 968 969 assert((Triple.getArch() == llvm::Triple::arm || 970 Triple.getArch() == llvm::Triple::thumb) && 971 "invalid architecture for Windows ARM target info"); 972 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6; 973 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset)); 974 975 // TODO map the complete set of values 976 // 31: VFPv3 40: VFPv4 977 Builder.defineMacro("_M_ARM_FP", "31"); 978 } 979 980 TargetInfo::BuiltinVaListKind 981 WindowsARMTargetInfo::getBuiltinVaListKind() const { 982 return TargetInfo::CharPtrBuiltinVaList; 983 } 984 985 TargetInfo::CallingConvCheckResult 986 WindowsARMTargetInfo::checkCallingConvention(CallingConv CC) const { 987 switch (CC) { 988 case CC_X86StdCall: 989 case CC_X86ThisCall: 990 case CC_X86FastCall: 991 case CC_X86VectorCall: 992 return CCCR_Ignore; 993 case CC_C: 994 case CC_OpenCLKernel: 995 case CC_PreserveMost: 996 case CC_PreserveAll: 997 return CCCR_OK; 998 default: 999 return CCCR_Warning; 1000 } 1001 } 1002 1003 // Windows ARM + Itanium C++ ABI Target 1004 ItaniumWindowsARMleTargetInfo::ItaniumWindowsARMleTargetInfo( 1005 const llvm::Triple &Triple, const TargetOptions &Opts) 1006 : WindowsARMTargetInfo(Triple, Opts) { 1007 TheCXXABI.set(TargetCXXABI::GenericARM); 1008 } 1009 1010 void ItaniumWindowsARMleTargetInfo::getTargetDefines( 1011 const LangOptions &Opts, MacroBuilder &Builder) const { 1012 WindowsARMTargetInfo::getTargetDefines(Opts, Builder); 1013 1014 if (Opts.MSVCCompat) 1015 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder); 1016 } 1017 1018 // Windows ARM, MS (C++) ABI 1019 MicrosoftARMleTargetInfo::MicrosoftARMleTargetInfo(const llvm::Triple &Triple, 1020 const TargetOptions &Opts) 1021 : WindowsARMTargetInfo(Triple, Opts) { 1022 TheCXXABI.set(TargetCXXABI::Microsoft); 1023 } 1024 1025 void MicrosoftARMleTargetInfo::getTargetDefines(const LangOptions &Opts, 1026 MacroBuilder &Builder) const { 1027 WindowsARMTargetInfo::getTargetDefines(Opts, Builder); 1028 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder); 1029 } 1030 1031 MinGWARMTargetInfo::MinGWARMTargetInfo(const llvm::Triple &Triple, 1032 const TargetOptions &Opts) 1033 : WindowsARMTargetInfo(Triple, Opts) { 1034 TheCXXABI.set(TargetCXXABI::GenericARM); 1035 } 1036 1037 void MinGWARMTargetInfo::getTargetDefines(const LangOptions &Opts, 1038 MacroBuilder &Builder) const { 1039 WindowsARMTargetInfo::getTargetDefines(Opts, Builder); 1040 Builder.defineMacro("_ARM_"); 1041 } 1042 1043 CygwinARMTargetInfo::CygwinARMTargetInfo(const llvm::Triple &Triple, 1044 const TargetOptions &Opts) 1045 : ARMleTargetInfo(Triple, Opts) { 1046 this->WCharType = TargetInfo::UnsignedShort; 1047 TLSSupported = false; 1048 DoubleAlign = LongLongAlign = 64; 1049 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"); 1050 } 1051 1052 void CygwinARMTargetInfo::getTargetDefines(const LangOptions &Opts, 1053 MacroBuilder &Builder) const { 1054 ARMleTargetInfo::getTargetDefines(Opts, Builder); 1055 Builder.defineMacro("_ARM_"); 1056 Builder.defineMacro("__CYGWIN__"); 1057 Builder.defineMacro("__CYGWIN32__"); 1058 DefineStd(Builder, "unix", Opts); 1059 if (Opts.CPlusPlus) 1060 Builder.defineMacro("_GNU_SOURCE"); 1061 } 1062 1063 DarwinARMTargetInfo::DarwinARMTargetInfo(const llvm::Triple &Triple, 1064 const TargetOptions &Opts) 1065 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) { 1066 HasAlignMac68kSupport = true; 1067 // iOS always has 64-bit atomic instructions. 1068 // FIXME: This should be based off of the target features in 1069 // ARMleTargetInfo. 1070 MaxAtomicInlineWidth = 64; 1071 1072 if (Triple.isWatchABI()) { 1073 // Darwin on iOS uses a variant of the ARM C++ ABI. 1074 TheCXXABI.set(TargetCXXABI::WatchOS); 1075 1076 // BOOL should be a real boolean on the new ABI 1077 UseSignedCharForObjCBool = false; 1078 } else 1079 TheCXXABI.set(TargetCXXABI::iOS); 1080 } 1081 1082 void DarwinARMTargetInfo::getOSDefines(const LangOptions &Opts, 1083 const llvm::Triple &Triple, 1084 MacroBuilder &Builder) const { 1085 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion); 1086 } 1087 1088 RenderScript32TargetInfo::RenderScript32TargetInfo(const llvm::Triple &Triple, 1089 const TargetOptions &Opts) 1090 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(), 1091 Triple.getOSName(), 1092 Triple.getEnvironmentName()), 1093 Opts) { 1094 IsRenderScriptTarget = true; 1095 LongWidth = LongAlign = 64; 1096 } 1097 1098 void RenderScript32TargetInfo::getTargetDefines(const LangOptions &Opts, 1099 MacroBuilder &Builder) const { 1100 Builder.defineMacro("__RENDERSCRIPT__"); 1101 ARMleTargetInfo::getTargetDefines(Opts, Builder); 1102 } 1103