14#ifndef LLVM_CLANG_BASIC_TARGETINFO_H
15#define LLVM_CLANG_BASIC_TARGETINFO_H
27#include "llvm/ADT/APFloat.h"
28#include "llvm/ADT/APInt.h"
29#include "llvm/ADT/APSInt.h"
30#include "llvm/ADT/ArrayRef.h"
31#include "llvm/ADT/IntrusiveRefCntPtr.h"
32#include "llvm/ADT/SmallSet.h"
33#include "llvm/ADT/StringMap.h"
34#include "llvm/ADT/StringRef.h"
35#include "llvm/ADT/StringSet.h"
36#include "llvm/ADT/StringTable.h"
37#include "llvm/Frontend/OpenMP/OMPGridValues.h"
38#include "llvm/IR/DerivedTypes.h"
39#include "llvm/Support/DataTypes.h"
40#include "llvm/Support/Error.h"
41#include "llvm/Support/VersionTuple.h"
42#include "llvm/TargetParser/Triple.h"
54class DiagnosticsEngine;
73namespace Builtin {
struct Info; }
169 LLVM_PREFERRED_TYPE(
bool)
177 LLVM_PREFERRED_TYPE(
bool)
186 LLVM_PREFERRED_TYPE(
bool)
191 LLVM_PREFERRED_TYPE(
bool)
195 LLVM_PREFERRED_TYPE(
bool)
257 bool UseMicrosoftManglingForC =
false;
263 LLVM_PREFERRED_TYPE(
bool)
267 LLVM_PREFERRED_TYPE(
bool)
268 unsigned ComplexLongDoubleUsesFP2Ret : 1;
270 LLVM_PREFERRED_TYPE(
bool)
271 unsigned HasBuiltinMSVaList : 1;
273 LLVM_PREFERRED_TYPE(
bool)
274 unsigned HasAArch64ACLETypes : 1;
276 LLVM_PREFERRED_TYPE(
bool)
277 unsigned HasRISCVVTypes : 1;
279 LLVM_PREFERRED_TYPE(
bool)
280 unsigned AllowAMDGPUUnsafeFPAtomics : 1;
282 LLVM_PREFERRED_TYPE(
bool)
283 unsigned HasUnalignedAccess : 1;
285 unsigned ARMCDECoprocMask : 8;
287 unsigned MaxOpenCLWorkGroupSize;
289 std::optional<
unsigned> MaxBitIntWidth;
291 std::optional<
llvm::Triple> DarwinTargetVariantTriple;
293 bool HasMicrosoftRecordLayout =
false;
300 void resetDataLayout(StringRef DL, const
char *UserLabelPrefix = "");
306 llvm::StringSet<> ReadOnlyFeatures;
324 assert(TargetOpts &&
"Missing target options");
332 CharPtrBuiltinVaList = 0,
376 XtensaABIBuiltinVaList
394 case UnsignedLongLong:
395 return SignedLongLong;
397 llvm_unreachable(
"Invalid SizeType");
402 return getCorrespondingUnsignedType(IntMaxType);
405 return AddrSpace == LangAS::Default ? PtrDiffType
406 : getPtrDiffTypeV(AddrSpace);
409 return getCorrespondingUnsignedType(getPtrDiffType(AddrSpace));
413 return getCorrespondingUnsignedType(IntPtrType);
421 return getCorrespondingUnsignedType(Int64Type);
425 return getCorrespondingUnsignedType(Int16Type);
435 return UnsignedShort;
441 return UnsignedLongLong;
443 llvm_unreachable(
"Unexpected signed integer type");
452 return PaddingOnUnsignedFixedPoint;
458 unsigned getTypeWidth(IntType T)
const;
461 virtual IntType getIntTypeByWidth(
unsigned BitWidth,
bool IsSigned)
const;
464 virtual IntType getLeastIntTypeByWidth(
unsigned BitWidth,
465 bool IsSigned)
const;
479 unsigned getTypeAlign(IntType T)
const;
482 static bool isTypeSigned(IntType T);
487 return AddrSpace == LangAS::Default ? PointerWidth
488 : getPointerWidthV(AddrSpace);
491 return AddrSpace == LangAS::Default ? PointerAlign
492 : getPointerAlignV(AddrSpace);
546 return BitIntMaxAlign.value_or(LongLongAlign);
552 return llvm::alignTo(NumBits, getBitIntAlign(NumBits));
555 return std::clamp<unsigned>(llvm::PowerOf2Ceil(NumBits),
getCharWidth(),
556 getBitIntMaxAlign());
593 return ShortAccumWidth - ShortAccumScale - 1;
605 return LongAccumWidth - LongAccumScale - 1;
611 return PaddingOnUnsignedFixedPoint ? ShortAccumScale : ShortAccumScale + 1;
614 return PaddingOnUnsignedFixedPoint
615 ? getShortAccumIBits()
616 : ShortAccumWidth - getUnsignedShortAccumScale();
622 return PaddingOnUnsignedFixedPoint ? AccumScale : AccumScale + 1;
625 return PaddingOnUnsignedFixedPoint ? getAccumIBits()
626 : AccumWidth - getUnsignedAccumScale();
632 return PaddingOnUnsignedFixedPoint ? LongAccumScale : LongAccumScale + 1;
635 return PaddingOnUnsignedFixedPoint
636 ? getLongAccumIBits()
637 : LongAccumWidth - getUnsignedLongAccumScale();
655 return PaddingOnUnsignedFixedPoint ? getShortFractScale()
656 : getShortFractScale() + 1;
662 return PaddingOnUnsignedFixedPoint ? getFractScale() : getFractScale() + 1;
668 return PaddingOnUnsignedFixedPoint ? getLongFractScale()
669 : getLongFractScale() + 1;
674 return (getPointerWidth(LangAS::Default) >= 64) ||
675 getTargetOpts().ForceEnableInt128;
693 return std::min<size_t>(*MaxBitIntWidth, llvm::IntegerType::MAX_INT_BITS);
719 return HasBFloat16 || HasFullBFloat16;
747 return DefaultAlignForAttributeAligned;
755 return MinGlobalAlign;
762 return NewAlign ? NewAlign : std::max(LongDoubleAlign, LongLongAlign);
805 return *LongDoubleFormat;
813 return *Float128Format;
830 llvm_unreachable(
"ibm128 not implemented on this target");
838 return LangOptions::FPEvalMethodKind::FEM_Source;
860 uint64_t AlignmentInBits)
const {
861 return AtomicSizeInBits <= AlignmentInBits &&
862 AtomicSizeInBits <= getMaxAtomicInlineWidth() &&
864 llvm::isPowerOf2_64(AtomicSizeInBits /
getCharWidth()));
884 return getDefaultAlignForAttributeAligned();
889 return getTypeWidth(IntMaxType);
894 return getPointerWidth(LangAS::Default);
914 return hasUnalignedAccess();
934 return UseSignedCharForObjCBool;
937 UseSignedCharForObjCBool =
false;
943 return UseBitFieldTypeAlignment;
949 return UseZeroLengthBitfieldAlignment;
955 return UseLeadingZeroLengthBitfield;
961 return ZeroLengthBitfieldBoundary;
965 return LargestOverSizedBitfieldContainer;
975 return UseExplicitBitFieldAlignment;
980 return HasAlignMac68kSupport;
986 static const char *getTypeName(IntType T);
991 const char *getTypeConstantSuffix(IntType T)
const;
997 static const char *getTypeFormatModifier(IntType T);
1008 return ComplexLongDoubleUsesFP2Ret;
1022 return UseAddrSpaceMapMangling;
1039 StreamingCompatible,
1044 virtual std::optional<std::pair<unsigned, unsigned>>
1046 llvm::StringMap<bool> *FeatureMap =
nullptr)
const {
1047 return std::nullopt;
1079 ARM_LDREX_B = (1 << 0),
1080 ARM_LDREX_H = (1 << 1),
1081 ARM_LDREX_W = (1 << 2),
1082 ARM_LDREX_D = (1 << 3),
1091 bool isValidClobber(StringRef Name)
const;
1097 virtual bool isValidGCCRegisterName(StringRef Name)
const;
1104 StringRef getNormalizedGCCRegisterName(StringRef Name,
1105 bool ReturnCanonical =
false)
const;
1123 CI_AllowsMemory = 0x01,
1124 CI_AllowsRegister = 0x02,
1125 CI_ReadWrite = 0x04,
1126 CI_HasMatchingInput = 0x08,
1127 CI_ImmediateConstant = 0x10,
1128 CI_EarlyClobber = 0x20,
1143 : Flags(0), TiedOperand(-1), ConstraintStr(ConstraintStr.str()),
1145 ImmRange.Min = ImmRange.Max = 0;
1146 ImmRange.isConstrained =
false;
1150 const std::string &
getName()
const {
return Name; }
1167 assert(hasTiedOperand() &&
"Has no tied operand!");
1168 return (
unsigned)TiedOperand;
1172 return (Flags & CI_ImmediateConstant) != 0;
1175 if (!ImmSet.empty())
1176 return Value.isSignedIntN(32) && ImmSet.contains(
Value.getZExtValue());
1177 return !ImmRange.isConstrained ||
1178 (
Value.sge(ImmRange.Min) &&
Value.sle(ImmRange.Max));
1187 Flags |= CI_ImmediateConstant;
1190 ImmRange.isConstrained =
true;
1193 Flags |= CI_ImmediateConstant;
1194 ImmSet.insert_range(Exacts);
1197 Flags |= CI_ImmediateConstant;
1198 ImmSet.insert(Exact);
1201 Flags |= CI_ImmediateConstant;
1210 Flags = Output.
Flags;
1224 bool &HasSizeMismatch)
const {
1225 HasSizeMismatch =
false;
1232 bool validateOutputConstraint(ConstraintInfo &Info)
const;
1234 ConstraintInfo &info)
const;
1251 std::string &)
const {
1258 bool resolveSymbolicName(
const char *&Name,
1260 unsigned &Index)
const;
1267 if (*Constraint ==
'p')
1268 return std::string(
"r");
1269 return std::string(1, *Constraint);
1275 return std::nullopt;
1294 return std::nullopt;
1298 assert(!DataLayoutString.empty() &&
"Uninitialized DataLayout!");
1299 return DataLayoutString.c_str();
1303 const char *
const Aliases[5];
1308 const char *
const Names[5];
1327 return getTriple().isWindowsMSVCEnvironment() ||
1328 getTriple().isWindowsItaniumEnvironment() || getTriple().isPS();
1333 return getTriple().isPS() ||
1336 (getTriple().isWindowsItaniumEnvironment() &&
1337 getTriple().getVendor() == llvm::Triple::SCEI);
1352 virtual bool initFeatureMap(llvm::StringMap<bool> &Features,
1354 const std::vector<std::string> &FeatureVec)
const;
1357 virtual StringRef
getABI()
const {
return StringRef(); }
1366 return UseMicrosoftManglingForC;
1372 virtual bool setCPU(
const std::string &Name) {
1381 fillValidCPUList(Values);
1392 return isValidCPUName(Name);
1405 virtual bool setABI(
const std::string &Name) {
1418 StringRef Name)
const {
1419 return Features.lookup(Name);
1426 bool Enabled)
const {
1427 Features[Name] = Enabled;
1450 switch (SignReturnAddr) {
1451 case LangOptions::SignReturnAddressScopeKind::None:
1453 case LangOptions::SignReturnAddressScopeKind::NonLeaf:
1455 case LangOptions::SignReturnAddressScopeKind::All:
1458 llvm_unreachable(
"Unexpected SignReturnAddressScopeKind");
1463 case LangOptions::SignReturnAddressKeyKind::AKey:
1465 case LangOptions::SignReturnAddressKeyKind::BKey:
1468 llvm_unreachable(
"Unexpected SignReturnAddressKeyKind");
1473 SignKey(
LangOptions::SignReturnAddressKeyKind::AKey),
1474 BranchTargetEnforcement(
false), BranchProtectionPAuthLR(
false),
1475 GuardedControlStack(
false) {}
1479 LangOpts.hasSignReturnAddress()
1480 ? (LangOpts.isSignReturnAddressScopeAll()
1481 ? LangOptions::SignReturnAddressScopeKind::All
1482 : LangOptions::SignReturnAddressScopeKind::NonLeaf)
1483 : LangOptions::SignReturnAddressScopeKind::None;
1484 SignKey = LangOpts.isSignReturnAddressWithAKey()
1485 ? LangOptions::SignReturnAddressKeyKind::AKey
1486 : LangOptions::SignReturnAddressKeyKind::BKey;
1487 BranchTargetEnforcement = LangOpts.BranchTargetEnforcement;
1488 BranchProtectionPAuthLR = LangOpts.BranchProtectionPAuthLR;
1489 GuardedControlStack = LangOpts.GuardedControlStack;
1504 StringRef &Err)
const {
1532 return ReadOnlyFeatures.count(
Feature);
1538 return getTriple().isX86() || getTriple().isAArch64() ||
1539 getTriple().isRISCV();
1544 if (getTriple().isOSBinFormatMachO())
1546 if (getTriple().isOSWindows() && getTriple().isAArch64())
1548 if (getTriple().getArch() == llvm::Triple::ArchType::avr)
1550 return getTriple().isOSBinFormatELF() &&
1551 ((getTriple().isOSLinux() && !getTriple().isMusl()) ||
1552 getTriple().isOSFreeBSD());
1568 return llvm::APInt::getZero(32);
1584 "cpu_specific Multiversioning not implemented on this target");
1591 "cpu_specific Multiversioning not implemented on this target");
1600 "cpu_specific Multiversioning not implemented on this target");
1606 return std::nullopt;
1611 assert(RegParmMax < 7 &&
"RegParmMax value is larger than AST can handle");
1617 return TLSSupported;
1631 return getTriple().isOSWindows() &&
1632 (getTriple().isX86() ||
1633 getTriple().getArch() == llvm::Triple::aarch64);
1643 return NoAsmVariants;
1663 return getAddressSpaceMap()[(
unsigned)AS];
1669 virtual bool validatePointerAuthKey(
const llvm::APSInt &value)
const;
1688 return LangAS::Default;
1694 llvm_unreachable(
"getGridValue not implemented on this target");
1743 return CCCR_Warning;
1755 virtual CallingConvKind getCallingConvKind(
bool ClangABICompat4)
const;
1763 virtual bool areDefaultedSMFStillPOD(
const LangOptions&)
const;
1796#define OPENCLEXTNAME(Ext) \
1797 setFeatureEnabled(getTargetOpts().OpenCLFeaturesMap, #Ext, V);
1798#include "clang/Basic/OpenCLExtensions.def"
1803 for (
const auto &Ext : getTargetOpts().OpenCLExtensionsAsWritten) {
1804 bool IsPrefixed = (Ext[0] ==
'+' || Ext[0] ==
'-');
1805 std::string Name = IsPrefixed ? Ext.substr(1) : Ext;
1806 bool V = IsPrefixed ? Ext[0] ==
'+' :
true;
1808 if (Name ==
"all") {
1809 supportAllOpenCLOpts(
V);
1813 getTargetOpts().OpenCLFeaturesMap[Name] =
V;
1819 return getTargetOpts().OpenCLFeaturesMap;
1824 return getTargetOpts().OpenCLFeaturesMap;
1843 return std::nullopt;
1849 return getTargetOpts().SDKVersion;
1859 virtual bool validateOpenCLTarget(
const LangOptions &Opts,
1872 return DarwinTargetVariantTriple ? &*DarwinTargetVariantTriple :
nullptr;
1878 return !getTargetOpts().DarwinTargetVariantSDKVersion.empty()
1879 ? getTargetOpts().DarwinTargetVariantSDKVersion
1880 : std::optional<VersionTuple>();
1892 return std::make_pair(64, 64);
1899 return PointerWidth;
1902 return PointerAlign;
1914 void CheckFixedPointBits()
const;
1918std::unique_ptr<clang::TargetInfo>
Provides definitions for the various language-specific address spaces.
Provides LLVM's BitmaskEnum facility to enumeration types declared in namespace clang.
Defines enum values for all the target-independent builtin functions.
@ LLVM_MARK_AS_BITMASK_ENUM
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
static unsigned getCharWidth(tok::TokenKind kind, const TargetInfo &Target)
Defines various enumerations that describe declaration and type specifiers.
Defines the TargetCXXABI class, which abstracts details of the C++ ABI that we're targeting.
Defines the clang::TargetOptions class.
Concrete class used by the front-end to report problems and issues.
FPEvalMethodKind
Possible float expression evaluation method choices.
SignReturnAddressScopeKind
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
The basic abstraction for the target C++ ABI.
LangOptions::SignReturnAddressScopeKind SignReturnAddr
const char * getSignKeyStr() const
BranchProtectionInfo(const LangOptions &LangOpts)
LangOptions::SignReturnAddressKeyKind SignKey
bool BranchProtectionPAuthLR
bool BranchTargetEnforcement
const char * getSignReturnAddrStr() const
Exposes information about the current target.
const LangASMap & getAddressSpaceMap() const
unsigned getNewAlign() const
Return the largest alignment for which a suitably-sized allocation with '::operator new(size_t)' is g...
virtual bool supportsCpuSupports() const
unsigned getUnsignedLongFractScale() const
getUnsignedLongFractScale - Return the number of fractional bits in a 'unsigned long _Fract' type.
virtual bool setCPU(const std::string &Name)
Target the specified CPU.
IntType getUnsignedPtrDiffType(LangAS AddrSpace) const
virtual std::optional< unsigned > getDWARFAddressSpace(unsigned AddressSpace) const
virtual std::optional< std::string > handleAsmEscapedChar(char C) const
Replace some escaped characters with another string based on target-specific rules.
unsigned getLongFractAlign() const
virtual bool validateCpuIs(StringRef Name) const
virtual bool hasLongDoubleType() const
Determine whether the long double type is supported on this target.
unsigned getShortAccumAlign() const
virtual bool supportsCpuInit() const
virtual unsigned getExnObjectAlignment() const
Return the alignment (in bits) of the thrown exception object.
virtual bool hasBitIntType() const
Determine whether the _BitInt type is supported on this target.
virtual bool hasFullBFloat16Type() const
Determine whether the BFloat type is fully supported on this target, i.e arithemtic operations.
unsigned getLargeArrayAlign() const
unsigned getIbm128Align() const
const char * getMCountName() const
Returns the name of the mcount instrumentation function.
virtual std::optional< std::string > getTargetID() const
Returns the target ID if supported.
unsigned getShortWidth() const
getShortWidth/Align - Return the size of 'signed short' and 'unsigned short' for this target,...
unsigned getUnsignedAccumScale() const
getUnsignedAccumScale/IBits - Return the number of fractional/integral bits in a 'unsigned _Accum' ty...
unsigned getIntAlign() const
virtual ArrayRef< AddlRegName > getGCCAddlRegNames() const
unsigned getUnsignedAccumIBits() const
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual const char * getFloat128Mangling() const
Return the mangled code of __float128.
unsigned getAccumWidth() const
getAccumWidth/Align - Return the size of 'signed _Accum' and 'unsigned _Accum' for this target,...
IntType getUIntPtrType() const
bool useLeadingZeroLengthBitfield() const
Check whether zero length bitfield alignment is respected if they are leading members.
const LangASMap * AddrSpaceMap
const char * UserLabelPrefix
IntType getInt64Type() const
unsigned getMaxAtomicInlineWidth() const
Return the maximum width lock-free atomic operation which can be inlined given the supported features...
virtual bool supportSourceEvalMethod() const
unsigned getUnsignedFractScale() const
getUnsignedFractScale - Return the number of fractional bits in a 'unsigned _Fract' type.
bool hasAlignMac68kSupport() const
Check whether this target support '#pragma options align=mac68k'.
virtual void getCPUSpecificCPUDispatchFeatures(StringRef Name, llvm::SmallVectorImpl< StringRef > &Features) const
unsigned getWCharAlign() const
virtual enum IntType getPtrDiffTypeV(LangAS AddrSpace) const
unsigned getLongAlign() const
virtual bool isCLZForZeroUndef() const
The __builtin_clz* and __builtin_ctz* built-in functions are specified to have undefined results for ...
virtual LangAS getCUDABuiltinAddressSpace(unsigned AS) const
Map from the address space field in builtin description strings to the language address space.
virtual LangAS getOpenCLBuiltinAddressSpace(unsigned AS) const
Map from the address space field in builtin description strings to the language address space.
virtual std::optional< LangAS > getConstantAddressSpace() const
Return an AST address space which can be used opportunistically for constant global memory.
const char * getDataLayoutString() const
unsigned getBitIntAlign(unsigned NumBits) const
bool isReadOnlyFeature(StringRef Feature) const
Determine whether the given target feature is read only.
StringRef getPlatformName() const
Retrieve the name of the platform as it is used in the availability attribute.
virtual bool isBranchProtectionSupportedArch(StringRef Arch) const
Determine if the Architecture in this TargetInfo supports branch protection.
unsigned getLongLongAlign() const
virtual bool hasFeatureEnabled(const llvm::StringMap< bool > &Features, StringRef Name) const
Check if target has a given feature enabled.
virtual const char * getStaticInitSectionSpecifier() const
Return the section to use for C++ static initialization functions.
unsigned getDefaultAlignForAttributeAligned() const
Return the default alignment for attribute((aligned)) on this target, to be used if no alignment valu...
unsigned getBFloat16Width() const
getBFloat16Width/Align/Format - Return the size/align/format of '__bf16'.
BuiltinVaListKind
The different kinds of __builtin_va_list types defined by the target implementation.
@ AArch64ABIBuiltinVaList
__builtin_va_list as defined by the AArch64 ABI http://infocenter.arm.com/help/topic/com....
@ PowerABIBuiltinVaList
__builtin_va_list as defined by the Power ABI: https://www.power.org /resources/downloads/Power-Arch-...
@ AAPCSABIBuiltinVaList
__builtin_va_list as defined by ARM AAPCS ABI http://infocenter.arm.com
@ VoidPtrBuiltinVaList
typedef void* __builtin_va_list;
@ X86_64ABIBuiltinVaList
__builtin_va_list as defined by the x86-64 ABI: http://refspecs.linuxbase.org/elf/x86_64-abi-0....
virtual size_t getMaxBitIntWidth() const
virtual bool setFPMath(StringRef Name)
Use the specified unit for FP math.
bool isSEHTrySupported() const
Whether the target supports SEH __try.
unsigned getChar32Width() const
getChar32Width/Align - Return the size of 'char32_t' for this target, in bits.
virtual bool useFP16ConversionIntrinsics() const
Check whether llvm intrinsics such as llvm.convert.to.fp16 should be used to convert to and from __fp...
virtual std::optional< std::pair< unsigned, unsigned > > getVScaleRange(const LangOptions &LangOpts, ArmStreamingKind Mode, llvm::StringMap< bool > *FeatureMap=nullptr) const
Returns target-specific min and max values VScale_Range.
const llvm::Triple * getDarwinTargetVariantTriple() const
Returns the darwin target variant triple, the variant of the deployment target for which the code is ...
virtual uint64_t getNullPointerValue(LangAS AddrSpace) const
Get integer value for null pointer.
virtual ArrayRef< const char * > getGCCRegNames() const =0
virtual std::optional< unsigned > getCPUCacheLineSize() const
unsigned getLongAccumScale() const
getLongAccumScale/IBits - Return the number of fractional/integral bits in a 'signed long _Accum' typ...
unsigned getLongFractScale() const
getLongFractScale - Return the number of fractional bits in a 'signed long _Fract' type.
unsigned getIbm128Width() const
getIbm128Width/Align/Format - Return the size/align/format of '__ibm128'.
uint64_t getPointerWidth(LangAS AddrSpace) const
Return the width of pointers on this target, for the specified address space.
virtual bool allowHalfArgsAndReturns() const
Whether half args and returns are supported.
unsigned getShortFractAlign() const
virtual unsigned getARMLDREXMask() const
unsigned getFractAlign() const
const llvm::StringMap< bool > & getSupportedOpenCLOpts() const
Get const supported OpenCL extensions and optional core features.
virtual void setFeatureEnabled(llvm::StringMap< bool > &Features, StringRef Name, bool Enabled) const
Enable or disable a specific target feature; the feature name must be valid.
virtual std::pair< unsigned, unsigned > hardwareInterferenceSizes() const
The first value in the pair is the minimum offset between two objects to avoid false sharing (destruc...
virtual CallingConv getDefaultCallingConv() const
Gets the default calling convention for the given target.
bool useSignedCharForObjCBool() const
Check if the Objective-C built-in boolean type should be signed char.
virtual bool hasPS4DLLImportExport() const
virtual bool hasInt128Type() const
Determine whether the __int128 type is supported on this target.
unsigned getAccumIBits() const
bool useObjCFPRetForRealType(FloatModeKind T) const
Check whether the given real type should use the "fpret" flavor of Objective-C message passing on thi...
virtual bool hasFastHalfType() const
Determine whether the target has fast native support for operations on half types.
virtual LangOptions::FPEvalMethodKind getFPEvalMethod() const
Return the value for the C99 FLT_EVAL_METHOD macro.
unsigned getHalfAlign() const
IntType getSigAtomicType() const
virtual bool validateOutputSize(const llvm::StringMap< bool > &FeatureMap, StringRef, unsigned) const
unsigned getAccumScale() const
getAccumScale/IBits - Return the number of fractional/integral bits in a 'signed _Accum' type.
virtual bool hasFloat16Type() const
Determine whether the _Float16 type is supported on this target.
unsigned getBFloat16Align() const
virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const
Determines whether a given calling convention is valid for the target.
unsigned getMaxVectorAlign() const
Return the maximum vector alignment supported for the given target.
VersionTuple PlatformMinVersion
unsigned getChar16Width() const
getChar16Width/Align - Return the size of 'char16_t' for this target, in bits.
virtual unsigned getVtblPtrAddressSpace() const
virtual void setAuxTarget(const TargetInfo *Aux)
unsigned getLongAccumAlign() const
unsigned getIntWidth() const
getIntWidth/Align - Return the size of 'signed int' and 'unsigned int' for this target,...
unsigned getLargestOverSizedBitfieldContainer() const
IntType getPtrDiffType(LangAS AddrSpace) const
virtual llvm::SmallVector< Builtin::InfosShard > getTargetBuiltins() const =0
Return information about target-specific builtins for the current primary target, and info about whic...
virtual bool handleTargetFeatures(std::vector< std::string > &Features, DiagnosticsEngine &Diags)
Perform initialization based on the user configured set of features (e.g., +sse4).
bool isLittleEndian() const
unsigned getShortAccumIBits() const
bool hasUnalignedAccess() const
Return true iff unaligned accesses are a single instruction (rather than a synthesized sequence).
virtual const char * getIbm128Mangling() const
Return the mangled code of __ibm128.
unsigned getFloatWidth() const
getFloatWidth/Align/Format - Return the size/align/format of 'float'.
virtual ArrayRef< GCCRegAlias > getGCCRegAliases() const =0
std::optional< VersionTuple > getDarwinTargetVariantSDKVersion() const
Returns the version of the darwin target variant SDK which was used during the compilation if one was...
unsigned getLongAccumIBits() const
IntType getSizeType() const
IntType getWIntType() const
virtual void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const =0
===-— Other target property query methods -----------------------—===//
static IntType getCorrespondingUnsignedType(IntType T)
unsigned getLongAccumWidth() const
getLongAccumWidth/Align - Return the size of 'signed long _Accum' and 'unsigned long _Accum' for this...
virtual bool setABI(const std::string &Name)
Use the specified ABI.
void noSignedCharForObjCBool()
AtomicOptions getAtomicOpts() const
Get the default atomic options.
unsigned getHalfWidth() const
getHalfWidth/Align/Format - Return the size/align/format of 'half'.
virtual bool validateInputSize(const llvm::StringMap< bool > &FeatureMap, StringRef, unsigned) const
unsigned getShortAccumScale() const
getShortAccumScale/IBits - Return the number of fractional/integral bits in a 'signed short _Accum' t...
unsigned getBitIntWidth(unsigned NumBits) const
getBitIntAlign/Width - Return aligned size of '_BitInt' and 'unsigned _BitInt' for this target,...
unsigned getBoolAlign() const
Return the alignment of '_Bool' and C++ 'bool' for this target.
virtual bool defaultsToAIXPowerAlignment() const
Whether target defaults to the power alignment rules of AIX.
const llvm::fltSemantics & getDoubleFormat() const
virtual bool hasStrictFP() const
Determine whether constrained floating point is supported on this target.
virtual char CPUSpecificManglingCharacter(StringRef Name) const
virtual void fillValidTuneCPUList(SmallVectorImpl< StringRef > &Values) const
Fill a SmallVectorImpl with the valid values for tuning CPU.
virtual bool allowDebugInfoForExternalRef() const
Whether target allows debuginfo types for decl only variables/functions.
unsigned getCharAlign() const
VersionTuple getPlatformMinVersion() const
Retrieve the minimum desired version of the platform, to which the program should be compiled.
unsigned getLongLongWidth() const
getLongLongWidth/Align - Return the size of 'signed long long' and 'unsigned long long' for this targ...
unsigned getMaxOpenCLWorkGroupSize() const
virtual bool hasBuiltinAtomic(uint64_t AtomicSizeInBits, uint64_t AlignmentInBits) const
Returns true if the given target supports lock-free atomic operations at the specified width and alig...
bool isTLSSupported() const
Whether the target supports thread-local storage.
unsigned getZeroLengthBitfieldBoundary() const
Get the fixed alignment value in bits for a member that follows a zero length bitfield.
IntType getIntPtrType() const
uint32_t getARMCDECoprocMask() const
For ARM targets returns a mask defining which coprocessors are configured as Custom Datapath.
unsigned getMaxAlignedAttribute() const
Get the maximum alignment in bits for a static variable with aligned attribute.
IntType getInt16Type() const
virtual llvm::APInt getFMVPriority(ArrayRef< StringRef > Features) const
const llvm::fltSemantics & getHalfFormat() const
virtual bool validateAsmConstraint(const char *&Name, TargetInfo::ConstraintInfo &info) const =0
virtual void supportAllOpenCLOpts(bool V=true)
llvm::StringMap< bool > & getSupportedOpenCLOpts()
Get supported OpenCL extensions and optional core features.
virtual uint64_t getPointerAlignV(LangAS AddrSpace) const
virtual const char * getLongDoubleMangling() const
Return the mangled code of long double.
bool UseAddrSpaceMapMangling
Specify if mangling based on address space map should be used or not for language specific address sp...
virtual bool supportsExtendIntArgs() const
Whether the option -fextend-arguments={32,64} is supported on the target.
unsigned getLargeArrayMinWidth() const
unsigned getMaxTLSAlign() const
Return the maximum alignment (in bits) of a TLS variable.
virtual unsigned getRegisterWidth() const
Return the "preferred" register width on this target.
bool supportsIFunc() const
Identify whether this target supports IFuncs.
virtual bool isValidTuneCPUName(StringRef Name) const
Determine whether this TargetInfo supports the given CPU name for tuning.
virtual bool validateCpuSupports(StringRef Name) const
IntType getWCharType() const
IntType getUInt16Type() const
unsigned getChar16Align() const
virtual bool validateBranchProtection(StringRef Spec, StringRef Arch, BranchProtectionInfo &BPI, const LangOptions &LO, StringRef &Err) const
Determine if this TargetInfo supports the given branch protection specification.
virtual unsigned getMinGlobalAlign(uint64_t Size, bool HasNonWeakDef) const
getMinGlobalAlign - Return the minimum alignment of a global variable, unless its alignment is explic...
virtual bool supportsCpuIs() const
virtual BuiltinVaListKind getBuiltinVaListKind() const =0
Returns the kind of __builtin_va_list type that should be used with this target.
bool isVLASupported() const
Whether target supports variable-length arrays.
bool hasCheapUnalignedBitFieldAccess() const
Return true iff unaligned accesses are cheap.
unsigned getTargetAddressSpace(LangAS AS) const
const llvm::fltSemantics & getBFloat16Format() const
const char * getUserLabelPrefix() const
Returns the default value of the USER_LABEL_PREFIX macro, which is the prefix given to user symbols b...
unsigned getAccumAlign() const
unsigned getFloat128Width() const
getFloat128Width/Align/Format - Return the size/align/format of '__float128'.
virtual bool hasIbm128Type() const
Determine whether the __ibm128 type is supported on this target.
bool useExplicitBitFieldAlignment() const
Check whether explicit bitfield alignment attributes should be.
virtual bool doesFeatureAffectCodeGen(StringRef Feature) const
Returns true if feature has an impact on target code generation.
virtual bool validateConstraintModifier(StringRef, char, unsigned, std::string &) const
uint64_t getPointerAlign(LangAS AddrSpace) const
IntType getChar16Type() const
unsigned getUnsignedShortAccumIBits() const
IntType getChar32Type() const
unsigned getWCharWidth() const
getWCharWidth/Align - Return the size of 'wchar_t' for this target, in bits.
IntType getUInt64Type() const
virtual bool hasFPReturn() const
Determine whether return of a floating point value is supported on this target.
bool hasMicrosoftRecordLayout() const
std::string DataLayoutString
unsigned getUnsignedLongAccumScale() const
getUnsignedLongAccumScale/IBits - Return the number of fractional/integral bits in a 'unsigned long _...
virtual StringRef getConstraintRegister(StringRef Constraint, StringRef Expression) const
Extracts a register from the passed constraint (if it is a single-register constraint) and the asm la...
virtual void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const
Fill a SmallVectorImpl with the valid values to setCPU.
IntType getSignedSizeType() const
bool hasBuiltinMSVaList() const
Returns whether or not type __builtin_ms_va_list type is available on this target.
virtual bool hasFloat128Type() const
Determine whether the __float128 type is supported on this target.
unsigned getUnsignedLongAccumIBits() const
virtual void setMaxAtomicWidth()
Set the maximum inline or promote width lock-free atomic operation for the given target.
unsigned getUnsignedShortFractScale() const
getUnsignedShortFractScale - Return the number of fractional bits in a 'unsigned short _Fract' type.
bool hasNoAsmVariants() const
Return true if {|} are normal characters in the asm string.
virtual bool validateCPUSpecificCPUDispatch(StringRef Name) const
const llvm::fltSemantics & getLongDoubleFormat() const
virtual StringRef getCPUSpecificTuneName(StringRef Name) const
const llvm::fltSemantics & getFloatFormat() const
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
unsigned getBitIntMaxAlign() const
getBitIntMaxAlign() - Returns the maximum possible alignment of '_BitInt' and 'unsigned _BitInt'.
unsigned getDoubleAlign() const
bool shouldUseMicrosoftCCforMangling() const
Should the Microsoft mangling scheme be used for C Calling Convention.
virtual bool hasProtectedVisibility() const
Does this target support "protected" visibility?
unsigned getRegParmMax() const
bool hasAArch64ACLETypes() const
Returns whether or not the AArch64 ACLE built-in types are available on this target.
unsigned getDoubleWidth() const
getDoubleWidth/Align/Format - Return the size/align/format of 'double'.
virtual bool checkArithmeticFenceSupported() const
Controls if __arithmetic_fence is supported in the targeted backend.
unsigned getIntMaxTWidth() const
Return the size of intmax_t and uintmax_t for this target, in bits.
virtual int getEHDataRegisterNumber(unsigned RegNo) const
Return the register number that __builtin_eh_return_regno would return with the specified argument.
unsigned getShortAccumWidth() const
getShortAccumWidth/Align - Return the size of 'signed short _Accum' and 'unsigned short _Accum' for t...
virtual StringRef getABI() const
Get the ABI currently in use.
unsigned getSuitableAlign() const
Return the alignment that is the largest alignment ever used for any scalar/SIMD data type on the tar...
bool useObjCFP2RetForComplexLongDouble() const
Check whether _Complex long double should use the "fp2ret" flavor of Objective-C message passing on t...
virtual const llvm::omp::GV & getGridValue() const
virtual uint64_t getPointerWidthV(LangAS AddrSpace) const
virtual bool allowsLargerPreferedTypeAlignment() const
Whether target allows to overalign ABI-specified preferred alignment.
virtual std::string_view getClobbers() const =0
Returns a string of target-specific clobbers, in LLVM format.
virtual unsigned getUnwindWordWidth() const
unsigned getBoolWidth() const
Return the size of '_Bool' and C++ 'bool' for this target, in bits.
virtual bool isValidFeatureName(StringRef Feature) const
Determine whether this TargetInfo supports the given feature.
bool useAddressSpaceMapMangling() const
Specify if mangling based on address space map should be used or not for language specific address sp...
unsigned getCharWidth() const
bool useZeroLengthBitfieldAlignment() const
Check whether zero length bitfields should force alignment of the next member.
virtual bool validateTarget(DiagnosticsEngine &Diags) const
Check the target is valid after it is fully initialized.
unsigned getLongWidth() const
getLongWidth/Align - Return the size of 'signed long' and 'unsigned long' for this target,...
unsigned getLongFractWidth() const
getLongFractWidth/Align - Return the size of 'signed long _Fract' and 'unsigned long _Fract' for this...
IntType getIntMaxType() const
virtual bool supportsTargetAttributeTune() const
Determine whether this TargetInfo supports tune in target attribute.
unsigned getFractScale() const
getFractScale - Return the number of fractional bits in a 'signed _Fract' type.
bool supportsMultiVersioning() const
Identify whether this target supports multiversioning of functions, which requires support for cpu_su...
virtual bool validateGlobalRegisterVariable(StringRef RegName, unsigned RegSize, bool &HasSizeMismatch) const
Validate register name used for global register variables.
virtual bool shouldDLLImportComdatSymbols() const
Does this target aim for semantic compatibility with Microsoft C++ code using dllimport/export attrib...
unsigned getFractWidth() const
getFractWidth/Align - Return the size of 'signed _Fract' and 'unsigned _Fract' for this target,...
virtual std::string convertConstraint(const char *&Constraint) const
unsigned char MaxAtomicInlineWidth
virtual void setCommandLineOpenCLOpts()
Set supported OpenCL extensions as written on command line.
unsigned getFloat128Align() const
virtual bool hasBFloat16Type() const
Determine whether the _BFloat16 type is supported on this target.
unsigned getShortFractScale() const
getShortFractScale - Return the number of fractional bits in a 'signed short _Fract' type.
IntType getProcessIDType() const
unsigned getFloatAlign() const
virtual uint64_t getMaxPointerWidth() const
Return the maximum width of pointers on this target.
unsigned getShortFractWidth() const
getShortFractWidth/Align - Return the size of 'signed short _Fract' and 'unsigned short _Fract' for t...
virtual bool isAddressSpaceSupersetOf(LangAS A, LangAS B) const
Returns true if an address space can be safely converted to another.
virtual bool hasHIPImageSupport() const
Whether to support HIP image/texture API's.
virtual bool hasFeature(StringRef Feature) const
Determine whether the given target has the given feature.
unsigned getUnsignedShortAccumScale() const
getUnsignedShortAccumScale/IBits - Return the number of fractional/integral bits in a 'unsigned short...
virtual bool isValidCPUName(StringRef Name) const
Determine whether this TargetInfo supports the given CPU name.
unsigned getChar32Align() const
bool doUnsignedFixedPointTypesHavePadding() const
In the event this target uses the same number of fractional bits for its unsigned types as it does wi...
unsigned getMaxAtomicPromoteWidth() const
Return the maximum width lock-free atomic operation which will ever be supported for the given target...
virtual bool isSPRegName(StringRef) const
unsigned getInt128Align() const
getInt128Align() - Returns the alignment of Int128.
IntType getUIntMaxType() const
const llvm::fltSemantics & getFloat128Format() const
virtual bool hasSjLjLowering() const
Controls if __builtin_longjmp / __builtin_setjmp can be lowered to llvm.eh.sjlj.longjmp / llvm....
const llvm::VersionTuple & getSDKVersion() const
unsigned getLongDoubleWidth() const
getLongDoubleWidth/Align/Format - Return the size/align/format of 'long double'.
unsigned getLongDoubleAlign() const
const llvm::fltSemantics & getIbm128Format() const
bool useBitFieldTypeAlignment() const
Check whether the alignment of bit-field types is respected when laying out structures.
unsigned getShortAlign() const
virtual const char * getBFloat16Mangling() const
Return the mangled code of bfloat.
virtual bool isNan2008() const
Returns true if NaN encoding is IEEE 754-2008.
virtual void setSupportedOpenCLOpts()
Set supported OpenCL extensions and optional core features.
bool hasRISCVVTypes() const
Returns whether or not the RISC-V V built-in types are available on this target.
Options for controlling the target.
std::unique_ptr< clang::TargetInfo > AllocateTarget(const llvm::Triple &Triple, const clang::TargetOptions &Opts)
The JSON file list parser is used to communicate input to InstallAPI.
unsigned[(unsigned) LangAS::FirstTargetAddressSpace] LangASMap
The type of a lookup table which maps from language-specific address spaces to target-specific ones.
bool isTargetAddressSpace(LangAS AS)
OpenCLTypeKind
OpenCL type kinds.
unsigned toTargetAddressSpace(LangAS AS)
LangAS
Defines the address space values used by the address space qualifier of QualType.
const FunctionProtoType * T
CallingConv
CallingConv - Specifies the calling convention that a function uses.
LangAS getLangASFromTargetAS(unsigned TargetAS)
@ Other
Other implicit parameter.
Diagnostic wrappers for TextAPI types for error reporting.
Contains information gathered from parsing the contents of TargetAttr.
std::vector< std::string > Features
StringRef BranchProtection
bool operator==(const ParsedTargetAttr &Other) const
llvm::SmallSet< int, 4 > ImmSet
const std::string & getConstraintStr() const
std::string ConstraintStr
void setHasMatchingInput()
bool hasMatchingInput() const
Return true if this output operand has a matching (tied) input operand.
void setRequiresImmediate()
unsigned getTiedOperand() const
bool allowsMemory() const
const std::string & getName() const
ConstraintInfo(StringRef ConstraintStr, StringRef Name)
void setRequiresImmediate(int Exact)
void setTiedOperand(unsigned N, ConstraintInfo &Output)
Indicate that this is an input operand that is tied to the specified output operand.
bool isValidAsmImmediate(const llvm::APInt &Value) const
bool requiresImmediateConstant() const
bool hasTiedOperand() const
Return true if this input operand is a matching constraint that ties it to an output operand.
bool allowsRegister() const
void setRequiresImmediate(llvm::ArrayRef< int > Exacts)
void setRequiresImmediate(int Min, int Max)
const char *const Register
Fields controlling how types are laid out in memory; these may need to be copied for targets like AMD...
const llvm::fltSemantics * DoubleFormat
unsigned UseZeroLengthBitfieldAlignment
Whether zero length bitfields (e.g., int : 0;) force alignment of the next bitfield.
unsigned short SuitableAlign
unsigned char PointerWidth
unsigned UseExplicitBitFieldAlignment
Whether explicit bit field alignment attributes are honored.
IntType
===-— Target Data Type Query Methods ----------------------------—===//
const llvm::fltSemantics * LongDoubleFormat
unsigned char LargeArrayAlign
unsigned char ShortAccumWidth
unsigned ZeroLengthBitfieldBoundary
If non-zero, specifies a fixed alignment value for bitfields that follow zero length bitfield,...
const llvm::fltSemantics * Float128Format
std::optional< unsigned > BitIntMaxAlign
unsigned LargestOverSizedBitfieldContainer
The largest container size which should be used for an over-sized bitfield, in bits.
unsigned char DoubleWidth
unsigned UseLeadingZeroLengthBitfield
Whether zero length bitfield alignment is respected if they are the leading members.
unsigned char LongLongAlign
unsigned char LongAccumAlign
unsigned UseBitFieldTypeAlignment
Control whether the alignment of bit-field types is respected when laying out structures.
unsigned char LargeArrayMinWidth
unsigned char PointerAlign
unsigned char BFloat16Width
unsigned char LongDoubleAlign
unsigned char LongDoubleWidth
unsigned char BFloat16Align
unsigned char Int128Align
unsigned char ShortAccumScale
unsigned MaxAlignedAttribute
If non-zero, specifies a maximum alignment to truncate alignment specified in the aligned attribute o...
unsigned char DoubleAlign
bool PaddingOnUnsignedFixedPoint
const llvm::fltSemantics * Ibm128Format
unsigned char LongFractWidth
unsigned char Ibm128Align
unsigned char ShortFractAlign
unsigned char ShortAccumAlign
unsigned char LongFractAlign
const llvm::fltSemantics * FloatFormat
const llvm::fltSemantics * HalfFormat
unsigned char LongLongWidth
unsigned char LongAccumScale
unsigned char MinGlobalAlign
unsigned UseSignedCharForObjCBool
Whether Objective-C's built-in boolean type should be signed char.
const llvm::fltSemantics * BFloat16Format
unsigned char Float128Align
unsigned char LongAccumWidth
unsigned char DefaultAlignForAttributeAligned
unsigned char ShortFractWidth