25#define TLI_DEFINE_STRING
26#include "llvm/Analysis/TargetLibraryInfo.def"
30 assert(!VectorFnName.empty() &&
"Vector function name must not be empty.");
33 Out << VABIPrefix <<
"_" << ScalarFnName <<
"(" << VectorFnName <<
")";
34 return std::string(Out.
str());
65#include "llvm/Analysis/TargetLibraryInfo.def"
69 "Missing library function signatures");
80 if (
T.isMacOSX() &&
T.isMacOSXVersionLT(10, 9))
83 if (
T.isiOS() &&
T.isOSVersionLT(7, 0))
93 return TT.isGNUEnvironment() || TT.isMusl();
96 return TT.isOSFreeBSD() || TT.isOSSolaris();
115 if (!FuncTy->getReturnType()->isPointerTy() &&
116 !FuncTy->getReturnType()->isIntegerTy() &&
117 !FuncTy->getReturnType()->isVoidTy())
120 for (
auto *Param : FuncTy->params()) {
121 if (!Param->isPointerTy() && !Param->isIntegerTy())
137 return ::isCallingConvCCompatible(
F->getCallingConv(),
138 F->getParent()->getTargetTriple(),
139 F->getFunctionType());
143 bool ShouldExtI32Param, ShouldExtI32Return;
144 bool ShouldSignExtI32Param, ShouldSignExtI32Return;
146 ShouldExtI32Param, ShouldExtI32Return, ShouldSignExtI32Param,
147 ShouldSignExtI32Return,
T);
205 if (
T.isMacOSXVersionLT(10, 5)) {
210 }
else if (
T.isiOS()) {
211 if (
T.isOSVersionLT(3, 0)) {
216 }
else if (!
T.isWatchOS()) {
235 !
T.isMacOSXVersionLT(10, 7)) {
260 if (
T.isOSWindows() && !
T.isOSCygMing()) {
266 bool hasPartialC99 =
true;
267 if (
T.isKnownWindowsMSVCEnvironment()) {
269 hasPartialC99 = (Version.getMajor() == 0 || Version.getMajor() >= 19);
275 bool hasPartialFloat = (isARM ||
279 if (!hasPartialFloat) {
338 if (!hasPartialC99) {
439 if (
T.isOSWindows() && !
T.isWindowsCygwinEnvironment()) {
481 if (
T.isOSMSVCRT()) {
519 TLI.
setUnavailable(LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t);
522 TLI.
setUnavailable(LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t);
557 if (
T.isMacOSXVersionLT(10, 9)) {
570 if (!
T.isWatchOS() &&
571 (
T.isOSVersionLT(7, 0) || (
T.isOSVersionLT(9, 0) &&
T.isX86()))) {
633 if (!
T.isOSFreeBSD()) {
641 if (!
T.isOSLinux() || !
T.isGNUEnvironment()) {
649 if (!
T.isAndroid() && !
T.isMusl())
713 if ((
T.isOSLinux() &&
T.isGNUEnvironment()) ||
714 (
T.isAndroid() && !
T.isAndroidVersionLT(28))) {
858 if (
T.isOSFreeBSD()) {
944 memset(AvailableArray, -1,
sizeof(AvailableArray));
950 : CustomNames(TLI.CustomNames), ShouldExtI32Param(TLI.ShouldExtI32Param),
951 ShouldExtI32Return(TLI.ShouldExtI32Return),
952 ShouldSignExtI32Param(TLI.ShouldSignExtI32Param),
953 ShouldSignExtI32Return(TLI.ShouldSignExtI32Return),
954 SizeOfInt(TLI.SizeOfInt) {
955 memcpy(AvailableArray, TLI.AvailableArray,
sizeof(AvailableArray));
956 VectorDescs = TLI.VectorDescs;
957 ScalarDescs = TLI.ScalarDescs;
961 : CustomNames(
std::
move(TLI.CustomNames)),
962 ShouldExtI32Param(TLI.ShouldExtI32Param),
963 ShouldExtI32Return(TLI.ShouldExtI32Return),
964 ShouldSignExtI32Param(TLI.ShouldSignExtI32Param),
965 ShouldSignExtI32Return(TLI.ShouldSignExtI32Return),
966 SizeOfInt(TLI.SizeOfInt) {
967 std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray),
969 VectorDescs = TLI.VectorDescs;
970 ScalarDescs = TLI.ScalarDescs;
974 CustomNames = TLI.CustomNames;
975 ShouldExtI32Param = TLI.ShouldExtI32Param;
976 ShouldExtI32Return = TLI.ShouldExtI32Return;
977 ShouldSignExtI32Param = TLI.ShouldSignExtI32Param;
978 ShouldSignExtI32Return = TLI.ShouldSignExtI32Return;
979 SizeOfInt = TLI.SizeOfInt;
980 memcpy(AvailableArray, TLI.AvailableArray,
sizeof(AvailableArray));
985 CustomNames = std::move(TLI.CustomNames);
986 ShouldExtI32Param = TLI.ShouldExtI32Param;
987 ShouldExtI32Return = TLI.ShouldExtI32Return;
988 ShouldSignExtI32Param = TLI.ShouldSignExtI32Param;
989 ShouldSignExtI32Return = TLI.ShouldSignExtI32Return;
990 SizeOfInt = TLI.SizeOfInt;
991 std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray),
1012 for (
const auto &Func : StandardNames)
1013 Indices[Func] =
static_cast<LibFunc>(Idx++);
1019 if (funcName.
empty())
1025 if (
auto Loc = Indices.
find(funcName);
Loc != Indices.
end()) {
1035 unsigned SizeTBits) {
1038 return Ty->isVoidTy();
1040 return Ty->isIntegerTy(8);
1042 return Ty->isIntegerTy(16);
1044 return Ty->isIntegerTy(32);
1046 return Ty->isIntegerTy(IntBits);
1048 return Ty->isIntegerTy() && Ty->getPrimitiveSizeInBits() >= IntBits;
1050 return Ty->isIntegerTy();
1053 return Ty->isIntegerTy() && Ty->getPrimitiveSizeInBits() >= IntBits;
1055 return Ty->isIntegerTy(64);
1057 return Ty->isIntegerTy(64);
1060 return Ty->isIntegerTy(SizeTBits);
1062 return Ty->isFloatTy();
1064 return Ty->isDoubleTy();
1067 return Ty->isFloatingPointTy();
1069 return Ty->isFloatingPointTy();
1071 return Ty->isPointerTy();
1073 return Ty->isStructTy();
1083 int SizeTSizeBits) {
1085 case LibFunc_size_returning_new: {
1086 if (FTy.getNumParams() != 1 ||
1087 !FTy.getParamType(0)->isIntegerTy(SizeTSizeBits)) {
1091 case LibFunc_size_returning_new_hot_cold: {
1092 if (FTy.getNumParams() != 2 ||
1093 !FTy.getParamType(0)->isIntegerTy(SizeTSizeBits) ||
1094 !FTy.getParamType(1)->isIntegerTy(8)) {
1098 case LibFunc_size_returning_new_aligned: {
1099 if (FTy.getNumParams() != 2 ||
1100 !FTy.getParamType(0)->isIntegerTy(SizeTSizeBits) ||
1101 !FTy.getParamType(1)->isIntegerTy(SizeTSizeBits)) {
1105 case LibFunc_size_returning_new_aligned_hot_cold:
1106 if (FTy.getNumParams() != 3 ||
1107 !FTy.getParamType(0)->isIntegerTy(SizeTSizeBits) ||
1108 !FTy.getParamType(1)->isIntegerTy(SizeTSizeBits) ||
1109 !FTy.getParamType(2)->isIntegerTy(8)) {
1117 auto &Context = M.getContext();
1121 return FTy.getReturnType() == SizedPtrTy;
1124bool TargetLibraryInfoImpl::isValidProtoForLibFunc(
const FunctionType &FTy,
1127 unsigned NumParams = FTy.getNumParams();
1133 case LibFunc_cabsl: {
1134 Type *RetTy = FTy.getReturnType();
1138 Type *ParamTy = FTy.getParamType(0);
1145 else if (NumParams == 2)
1146 return ParamTy == RetTy && FTy.getParamType(1) == RetTy;
1152 case LibFunc_sincospi_stret:
1153 case LibFunc_sincospif_stret: {
1157 Type *RetTy = FTy.getReturnType();
1158 Type *ParamTy = FTy.getParamType(0);
1160 if (Ty->getNumElements() != 2)
1162 return (Ty->getElementType(0) == ParamTy &&
1163 Ty->getElementType(1) == ParamTy);
1167 if (Ty->getNumElements() != 2)
1169 return Ty->getElementType() == ParamTy;
1176 case LibFunc_size_returning_new:
1177 case LibFunc_size_returning_new_hot_cold:
1178 case LibFunc_size_returning_new_aligned:
1179 case LibFunc_size_returning_new_aligned_hot_cold:
1192 Type *Ty = FTy.getReturnType(), *LastTy = Ty;
1194 for (
auto TyID : ProtoTypes) {
1195 if (Idx && TyID ==
Void)
1200 if (TyID ==
Ellip) {
1204 assert(Idx == ProtoTypes.size() - 1 || ProtoTypes[Idx + 1] ==
Void);
1205 return FTy.isFunctionVarArg();
1209 assert(Idx != 0 &&
"Type ID 'Same' must not be first!");
1213 if (!Ty || !
matchType(TyID, Ty, IntBits, SizeTBits))
1218 if (Idx == NumParams) {
1226 Ty = FTy.getParamType(Idx++);
1231 return Idx == NumParams + 1 && !FTy.isFunctionVarArg();
1242 assert(M &&
"Expecting FDecl to be connected to a Module.");
1244 if (FDecl.LibFuncCache == Function::UnknownLibFunc)
1251 F = FDecl.LibFuncCache;
1258 if (Opcode != Instruction::FRem || (!Ty->isDoubleTy() && !Ty->isFloatTy()))
1261 F = Ty->isDoubleTy() ? LibFunc_fmod : LibFunc_fmodf;
1266 memset(AvailableArray, 0,
sizeof(AvailableArray));
1270 return LHS.getScalarFnName() <
RHS.getScalarFnName();
1274 return LHS.getVectorFnName() <
RHS.getVectorFnName();
1278 return LHS.getScalarFnName() < S;
1290#define TLI_DEFINE_ACCELERATE_VECFUNCS
1291#include "llvm/Analysis/VecFuncs.def"
1292#undef TLI_DEFINE_ACCELERATE_VECFUNCS
1296#define TLI_DEFINE_DARWIN_LIBSYSTEM_M_VECFUNCS
1297#include "llvm/Analysis/VecFuncs.def"
1298#undef TLI_DEFINE_DARWIN_LIBSYSTEM_M_VECFUNCS
1302#define TLI_DEFINE_LIBMVEC_X86_VECFUNCS
1303#include "llvm/Analysis/VecFuncs.def"
1304#undef TLI_DEFINE_LIBMVEC_X86_VECFUNCS
1308#define TLI_DEFINE_LIBMVEC_AARCH64_VECFUNCS
1309#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, MASK, VABI_PREFIX, CC) \
1310 {SCAL, VEC, VF, MASK, VABI_PREFIX, CC},
1311#include "llvm/Analysis/VecFuncs.def"
1312#undef TLI_DEFINE_LIBMVEC_AARCH64_VECFUNCS
1316#define TLI_DEFINE_MASSV_VECFUNCS
1317#include "llvm/Analysis/VecFuncs.def"
1318#undef TLI_DEFINE_MASSV_VECFUNCS
1322#define TLI_DEFINE_SVML_VECFUNCS
1323#include "llvm/Analysis/VecFuncs.def"
1324#undef TLI_DEFINE_SVML_VECFUNCS
1328#define TLI_DEFINE_SLEEFGNUABI_VF2_VECFUNCS
1329#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, VABI_PREFIX) \
1330 {SCAL, VEC, VF, false, VABI_PREFIX, std::nullopt},
1331#include "llvm/Analysis/VecFuncs.def"
1332#undef TLI_DEFINE_SLEEFGNUABI_VF2_VECFUNCS
1335#define TLI_DEFINE_SLEEFGNUABI_VF4_VECFUNCS
1336#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, VABI_PREFIX) \
1337 {SCAL, VEC, VF, false, VABI_PREFIX, std::nullopt},
1338#include "llvm/Analysis/VecFuncs.def"
1339#undef TLI_DEFINE_SLEEFGNUABI_VF4_VECFUNCS
1342#define TLI_DEFINE_SLEEFGNUABI_SCALABLE_VECFUNCS
1343#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, MASK, VABI_PREFIX) \
1344 {SCAL, VEC, VF, MASK, VABI_PREFIX, std::nullopt},
1345#include "llvm/Analysis/VecFuncs.def"
1346#undef TLI_DEFINE_SLEEFGNUABI_SCALABLE_VECFUNCS
1350#define TLI_DEFINE_SLEEFGNUABI_SCALABLE_VECFUNCS_RISCV
1351#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, MASK, VABI_PREFIX) \
1352 {SCAL, VEC, VF, MASK, VABI_PREFIX, std::nullopt},
1353#include "llvm/Analysis/VecFuncs.def"
1354#undef TLI_DEFINE_SLEEFGNUABI_SCALABLE_VECFUNCS_RISCV
1358#define TLI_DEFINE_ARMPL_VECFUNCS
1359#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, MASK, VABI_PREFIX, CC) \
1360 {SCAL, VEC, VF, MASK, VABI_PREFIX, CC},
1361#include "llvm/Analysis/VecFuncs.def"
1362#undef TLI_DEFINE_ARMPL_VECFUNCS
1366#define TLI_DEFINE_AMDLIBM_VECFUNCS
1367#define TLI_DEFINE_VECFUNC(SCAL, VEC, VF, MASK, VABI_PREFIX) \
1368 {SCAL, VEC, VF, MASK, VABI_PREFIX, std::nullopt},
1369#include "llvm/Analysis/VecFuncs.def"
1370#undef TLI_DEFINE_AMDLIBM_VECFUNCS
1385 switch (TargetTriple.
getArch()) {
1408 switch (TargetTriple.
getArch()) {
1424 switch (TargetTriple.
getArch()) {
1445 if (funcName.
empty())
1448 std::vector<VecDesc>::const_iterator
I =
1450 return I != VectorDescs.end() &&
StringRef(
I->getScalarFnName()) == funcName;
1468 std::vector<VecDesc>::const_iterator
I =
1470 while (
I != VectorDescs.end() &&
StringRef(
I->getScalarFnName()) ==
F) {
1471 if ((
I->getVectorizationFactor() == VF) && (
I->isMasked() ==
Masked))
1480 if (!BaselineInfoImpl)
1487 M.getModuleFlag(
"wchar_size")))
1502 return M.getDataLayout().getIndexSizeInBits(0);
1523 "Target Library Information",
false,
true)
1536 if (ScalarF.
empty())
1539 std::vector<VecDesc>::const_iterator
I =
1541 while (
I != VectorDescs.end() &&
StringRef(
I->getScalarFnName()) == ScalarF) {
1543 I->getVectorizationFactor().isScalable() ? &ScalableVF : &FixedVF;
1545 *VF =
I->getVectorizationFactor();
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
Module.h This file contains the declarations for the Module class.
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
This file defines the SmallString class.
static bool hasSinCosPiStret(const Triple &T)
static bool isCallingConvCCompatible(CallingConv::ID CC, const Triple &TT, FunctionType *FuncTy)
static void initializeLibCalls(TargetLibraryInfoImpl &TLI, const Triple &T, ArrayRef< StringLiteral > StandardNames, VectorLibrary VecLib)
Initialize the set of available library functions based on the specified target triple.
static StringRef sanitizeFunctionName(StringRef funcName)
static const VecDesc VecFuncs_MASSV[]
static bool matchType(FuncArgTypeID ArgTy, const Type *Ty, unsigned IntBits, unsigned SizeTBits)
static bool hasBcmp(const Triple &TT)
static const VecDesc VecFuncs_SLEEFGNUABI_VF2[]
static void initializeBase(TargetLibraryInfoImpl &TLI, const Triple &T)
static bool compareByScalarFnName(const VecDesc &LHS, const VecDesc &RHS)
static const VecDesc VecFuncs_LIBMVEC_AARCH64[]
static bool compareByVectorFnName(const VecDesc &LHS, const VecDesc &RHS)
static const VecDesc VecFuncs_SLEEFGNUABI_VF4[]
static const FuncProtoTy Signatures[]
static const VecDesc VecFuncs_ArmPL[]
static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T, ArrayRef< StringLiteral > StandardNames, VectorLibrary VecLib)
Initialize the set of available library functions based on the specified target triple.
const VecDesc VecFuncs_AMDLIBM[]
static bool isValidProtoForSizeReturningNew(const FunctionType &FTy, LibFunc F, const Module &M, int SizeTSizeBits)
static const VecDesc VecFuncs_LIBMVEC_X86[]
static const VecDesc VecFuncs_DarwinLibSystemM[]
static const VecDesc VecFuncs_SVML[]
std::array< FuncArgTypeID, 8 > FuncProtoTy
static const VecDesc VecFuncs_SLEEFGNUABI_VFScalable[]
static bool compareWithScalarFnName(const VecDesc &LHS, StringRef S)
static const VecDesc VecFuncs_Accelerate[]
static const VecDesc VecFuncs_SLEEFGNUABI_VFScalableRISCV[]
static DenseMap< StringRef, LibFunc > buildIndexMap(ArrayRef< StringLiteral > StandardNames)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
CallingConv::ID getCallingConv() const
FunctionType * getFunctionType() const
iterator find(const_arg_type_t< KeyT > Val)
void reserve(size_type NumEntries)
Grow the densemap so that it can contain at least NumEntries items before resizing again.
static constexpr ElementCount getScalable(ScalarTy MinVal)
static constexpr ElementCount getFixed(ScalarTy MinVal)
Class to represent function types.
FunctionType * getFunctionType() const
Returns the FunctionType for me.
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
Module * getParent()
Get the module that this global value is contained inside of...
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
A Module instance is used to store all the information related to an LLVM module.
const Triple & getTargetTriple() const
Get the target triple which is a string describing the target host.
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
A wrapper around a string literal that serves as a proxy for constructing global tables of StringRefs...
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
bool contains(StringRef Other) const
Return true if the given string is a substring of *this, and false otherwise.
Class to represent struct types.
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
LLVM_ABI TargetLibraryInfo run(const Function &F, FunctionAnalysisManager &)
Implementation of the target library information.
void setShouldExtI32Param(bool Val)
Set to true iff i32 parameters to library functions should have signext or zeroext attributes if they...
void setShouldExtI32Return(bool Val)
Set to true iff i32 results from library functions should have signext or zeroext attributes if they ...
LLVM_ABI unsigned getWCharSize(const Module &M) const
Returns the size of the wchar_t type in bytes or 0 if the size is unknown.
LLVM_ABI bool getLibFunc(StringRef funcName, LibFunc &F) const
Searches for a particular function name.
LLVM_ABI void getWidestVF(StringRef ScalarF, ElementCount &FixedVF, ElementCount &Scalable) const
Returns the largest vectorization factor used in the list of vector functions.
bool isFunctionVectorizable(StringRef F, const ElementCount &VF) const
Return true if the function F has a vector equivalent with vectorization factor VF.
void setShouldSignExtI32Param(bool Val)
Set to true iff i32 parameters to library functions should have signext attribute if they correspond ...
void setAvailableWithName(LibFunc F, StringRef Name)
Forces a function to be marked as available and provide an alternate name that must be used.
TargetLibraryInfoImpl()=delete
unsigned getIntSize() const
Get size of a C-level int or unsigned int, in bits.
LLVM_ABI void addVectorizableFunctionsFromVecLib(enum VectorLibrary VecLib, const llvm::Triple &TargetTriple)
Calls addVectorizableFunctions with a known preset of functions for the given vector library.
void setIntSize(unsigned Bits)
Initialize the C-level size of an integer.
LLVM_ABI unsigned getSizeTSize(const Module &M) const
Returns the size of the size_t type in bits.
LLVM_ABI void addVectorizableFunctions(ArrayRef< VecDesc > Fns)
Add a set of scalar -> vector mappings, queryable via getVectorizedFunction and getScalarizedFunction...
LLVM_ABI const VecDesc * getVectorMappingInfo(StringRef F, const ElementCount &VF, bool Masked) const
Return a pointer to a VecDesc object holding all info for scalar to vector mappings in TLI for the eq...
static LLVM_ABI bool isCallingConvCCompatible(CallBase *CI)
Returns true if call site / callee has cdecl-compatible calling conventions.
void setShouldSignExtI32Return(bool Val)
Set to true iff i32 results from library functions should have signext attribute if they correspond t...
LLVM_ABI TargetLibraryInfoImpl & operator=(const TargetLibraryInfoImpl &TLI)
LLVM_ABI void disableAllFunctions()
Disables all builtins.
void setUnavailable(LibFunc F)
Forces a function to be marked as unavailable.
LLVM_ABI StringRef getVectorizedFunction(StringRef F, const ElementCount &VF, bool Masked) const
Return the name of the equivalent of F, vectorized with factor VF.
void setAvailable(LibFunc F)
Forces a function to be marked as available.
TargetLibraryInfoWrapperPass()
The default constructor should not be used and is only for pass manager initialization purposes.
Provides information about what library functions are available for the current target.
static void initExtensionsForTriple(bool &ShouldExtI32Param, bool &ShouldExtI32Return, bool &ShouldSignExtI32Param, bool &ShouldSignExtI32Return, const Triple &T)
Triple - Helper class for working with autoconf configuration names.
ArchType getArch() const
Get the parsed architecture type of this triple.
The instances of the Type class are immutable: once they are created, they are never changed.
bool isArrayTy() const
True if this is an instance of ArrayType.
Type * getArrayElementType() const
LLVM_ABI uint64_t getArrayNumElements() const
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Provides info so a possible vectorization of a function can be computed.
LLVM_ABI std::string getVectorFunctionABIVariantString() const
Returns a vector function ABI variant string on the form: ZGV<isa><mask><vlen><vparams><scalarname>(<...
StringRef getVectorFnName() const
Represents a version number in the form major[.minor[.subminor[.build]]].
static constexpr bool isKnownGT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
A raw_ostream that writes to an SmallVector or SmallString.
StringRef str() const
Return a StringRef for the vector contents.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ ARM_APCS
ARM Procedure Calling Standard (obsolete, but still used on some targets).
@ ARM_AAPCS
ARM Architecture Procedure Calling Standard calling convention (aka EABI).
@ ARM_AAPCS_VFP
Same as ARM_AAPCS, but uses hard floating point ABI.
@ C
The default llvm calling convention, compatible with C.
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
auto cast_or_null(const Y &Val)
void sort(IteratorTy Start, IteratorTy End)
auto lower_bound(R &&Range, T &&Value)
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
VectorLibrary
List of known vector-functions libraries.
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
Implement std::hash so that hash_code can be used in STL containers.
A special type used by analysis passes to provide an address that identifies that particular analysis...