36#include "llvm/ABI/FunctionInfo.h"
37#include "llvm/ABI/IRTypeMapper.h"
38#include "llvm/ABI/TargetInfo.h"
39#include "llvm/ABI/Types.h"
40#include "llvm/ADT/STLExtras.h"
41#include "llvm/ADT/StringExtras.h"
42#include "llvm/Analysis/ValueTracking.h"
43#include "llvm/IR/Assumptions.h"
44#include "llvm/IR/AttributeMask.h"
45#include "llvm/IR/Attributes.h"
46#include "llvm/IR/CallingConv.h"
47#include "llvm/IR/DataLayout.h"
48#include "llvm/IR/DebugInfoMetadata.h"
49#include "llvm/IR/InlineAsm.h"
50#include "llvm/IR/IntrinsicInst.h"
51#include "llvm/IR/Intrinsics.h"
52#include "llvm/IR/Type.h"
53#include "llvm/Transforms/Utils/Local.h"
66 if (Target.getTriple().isSPIROrSPIRV())
67 return llvm::CallingConv::SPIR_FUNC;
68 return llvm::CallingConv::C;
70 return llvm::CallingConv::X86_StdCall;
72 return llvm::CallingConv::X86_FastCall;
74 return llvm::CallingConv::X86_RegCall;
76 return llvm::CallingConv::X86_ThisCall;
78 return llvm::CallingConv::Win64;
80 return llvm::CallingConv::X86_64_SysV;
82 return llvm::CallingConv::ARM_AAPCS;
84 return llvm::CallingConv::ARM_AAPCS_VFP;
86 return llvm::CallingConv::Intel_OCL_BI;
89 return llvm::CallingConv::C;
92 return llvm::CallingConv::X86_VectorCall;
94 return llvm::CallingConv::AArch64_VectorCall;
96 return llvm::CallingConv::AArch64_SVE_VectorCall;
98 return llvm::CallingConv::SPIR_FUNC;
100 return CGM.getTargetCodeGenInfo().getDeviceKernelCallingConv();
102 return llvm::CallingConv::PreserveMost;
104 return llvm::CallingConv::PreserveAll;
106 return llvm::CallingConv::Swift;
108 return llvm::CallingConv::SwiftTail;
110 return llvm::CallingConv::M68k_RTD;
112 return llvm::CallingConv::PreserveNone;
116#define CC_VLS_CASE(ABI_VLEN) \
117 case CC_RISCVVLSCall_##ABI_VLEN: \
118 return llvm::CallingConv::RISCV_VLSCall_##ABI_VLEN;
143 RecTy = Context.getCanonicalTagType(RD);
145 RecTy = Context.VoidTy;
150 return Context.getPointerType(RecTy);
183 assert(paramInfos.size() <= prefixArgs);
184 assert(proto->
getNumParams() + prefixArgs <= totalArgs);
186 paramInfos.reserve(totalArgs);
189 paramInfos.resize(prefixArgs);
193 paramInfos.push_back(ParamInfo);
195 if (ParamInfo.hasPassObjectSize())
196 paramInfos.emplace_back();
199 assert(paramInfos.size() <= totalArgs &&
200 "Did we forget to insert pass_object_size args?");
202 paramInfos.resize(totalArgs);
212 if (!FPT->hasExtParameterInfos()) {
213 assert(paramInfos.empty() &&
214 "We have paramInfos, but the prototype doesn't?");
215 prefix.append(FPT->param_type_begin(), FPT->param_type_end());
219 unsigned PrefixSize = prefix.size();
223 prefix.reserve(prefix.size() + FPT->getNumParams());
225 auto ExtInfos = FPT->getExtParameterInfos();
226 assert(ExtInfos.size() == FPT->getNumParams());
227 for (
unsigned I = 0, E = FPT->getNumParams(); I != E; ++I) {
228 prefix.push_back(FPT->getParamType(I));
229 if (ExtInfos[I].hasPassObjectSize())
254 FTP->getExtInfo(), paramInfos,
Required,
265 return ::arrangeLLVMFunctionInfo(*
this,
false, argTypes,
270 bool IsTargetDefaultMSABI) {
275 if (D->
hasAttr<FastCallAttr>())
281 if (D->
hasAttr<ThisCallAttr>())
284 if (D->
hasAttr<VectorCallAttr>())
290 if (PcsAttr *PCS = D->
getAttr<PcsAttr>())
293 if (D->
hasAttr<AArch64VectorPcsAttr>())
296 if (D->
hasAttr<AArch64SVEPcsAttr>())
299 if (D->
hasAttr<DeviceKernelAttr>())
302 if (D->
hasAttr<IntelOclBiccAttr>())
311 if (D->
hasAttr<PreserveMostAttr>())
314 if (D->
hasAttr<PreserveAllAttr>())
320 if (D->
hasAttr<PreserveNoneAttr>())
323 if (D->
hasAttr<RISCVVectorCCAttr>())
326 if (RISCVVLSCCAttr *PCS = D->
getAttr<RISCVVLSCCAttr>()) {
327 switch (PCS->getVectorWidth()) {
329 llvm_unreachable(
"Invalid RISC-V VLS ABI VLEN");
330#define CC_VLS_CASE(ABI_VLEN) \
332 return CC_RISCVVLSCall_##ABI_VLEN;
370 CanonicalFTP.getTypePtr(), argTypes.size());
373 CanonicalFTP->getReturnType().getUnqualifiedType(),
375 paramInfos, required, MD);
381 if (FD->
hasAttr<CUDAGlobalAttr>()) {
413 argTypes, prototype->getExtInfo(), paramInfos,
423 !Target.getCXXABI().hasConstructorVariants();
436 bool PassParams =
true;
438 if (
auto *CD = dyn_cast<CXXConstructorDecl>(MD)) {
441 if (
auto Inherited = CD->getInheritedConstructor())
453 if (!paramInfos.empty()) {
456 paramInfos.insert(paramInfos.begin() + 1, AddedArgs.
Prefix,
459 paramInfos.append(AddedArgs.
Suffix,
464 (PassParams && MD->isVariadic() ?
RequiredArgs(argTypes.size())
470 ? CGM.getContext().VoidPtrTy
473 argTypes, extInfo, paramInfos, required, MD);
479 for (
auto &arg : args)
487 for (
auto &arg : args)
494 unsigned totalArgs) {
512 unsigned ExtraPrefixArgs,
unsigned ExtraSuffixArgs,
515 for (
const auto &Arg : args)
516 ArgTypes.push_back(Context.getCanonicalParamType(Arg.Ty));
519 unsigned TotalPrefixArgs = 1 + ExtraPrefixArgs;
524 FPT, TotalPrefixArgs + ExtraSuffixArgs)
530 ? CGM.getContext().VoidPtrTy
537 if (PassProtoArgs && FPT->hasExtParameterInfos()) {
544 ArgTypes, Info, ParamInfos,
Required,
554 if (MD->isImplicitObjectMemberFunction())
562 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
565 CGM.getTargetCodeGenInfo().setOCLKernelStubCallingConvention(FT);
573 {}, noProto->getExtInfo(), {},
607 argTys.push_back(Context.getCanonicalParamType(receiverType));
609 argTys.push_back(Context.getCanonicalParamType(Context.getObjCSelType()));
611 argTys.push_back(Context.getCanonicalParamType(I->getType()));
613 I->hasAttr<NoEscapeAttr>());
614 extParamInfos.push_back(extParamInfo);
618 bool IsTargetDefaultMSABI =
624 if (
getContext().getLangOpts().ObjCAutoRefCount &&
625 MD->
hasAttr<NSReturnsRetainedAttr>())
663 assert(MD->
isVirtual() &&
"only methods have thunks");
680 ArgTys.push_back(*FTP->param_type_begin());
682 ArgTys.push_back(Context.IntTy);
683 CallingConv CC = Context.getDefaultCallingConvention(
695 unsigned numExtraRequiredArgs,
bool chainCall,
697 assert(args.size() >= numExtraRequiredArgs);
707 if (proto->isVariadic())
710 if (proto->hasExtParameterInfos())
724 for (
const auto &arg : args)
729 paramInfos, required, ABIInfoFD);
740 chainCall ? 1 : 0, chainCall, ABIInfoFD);
772 for (
const auto &Arg : args)
773 argTypes.push_back(Context.getCanonicalParamType(Arg.Ty));
815 assert(numPrefixArgs + 1 <= args.size() &&
816 "Emitting a call with less args than the required prefix?");
827 paramInfos, required, ABIInfoFD);
839 assert(signature.
arg_size() <= args.size());
840 unsigned X86ABIAVXLevel =
841 CGM.getABIInfo().getX86ABIAVXLevel(ABIInfoFD, signature.
getExtInfo());
842 if (signature.
arg_size() == args.size() &&
848 if (!sigParamInfos.empty()) {
849 paramInfos.append(sigParamInfos.begin(), sigParamInfos.end());
850 paramInfos.resize(args.size());
888 return "IndirectAliased";
894 return "CoerceAndExpand";
896 return "TargetSpecific";
900 llvm_unreachable(
"Unknown kind");
906 MappedArgTypes.reserve(FI.
arg_size());
908 MappedArgTypes.push_back(AbiMapper->convertType(Arg.type));
911 llvm::abi::RequiredArgs AbiRequired = llvm::abi::RequiredArgs::All;
913 AbiRequired = llvm::abi::RequiredArgs(
Required.getNumRequiredArgs());
915 auto AbiFI = llvm::abi::FunctionInfo::create(
917 MappedArgTypes, AbiRequired);
926 auto ConvertABIArgInfo = [&](
ABIArgInfo &Target,
929 auto Check = [&](
bool Cond, llvm::function_ref<void()> MessageFn) {
933 llvm::dbgs() <<
"For return value of type ";
935 llvm::dbgs() <<
"For argument " << ArgNo <<
" of type ";
936 llvm::dbgs() <<
Type <<
": ";
938 llvm::dbgs() <<
"\n";
941 auto CheckSimple = [&](
auto TargetVal,
auto ResVal, StringRef What) {
942 Check(TargetVal == ResVal, [&]() {
943 llvm::dbgs() << What <<
" mismatch (expected: " << TargetVal
944 <<
", given: " << ResVal <<
")";
949 Check(Target.getKind() == Res.
getKind(), [&]() {
950 llvm::dbgs() <<
"Kind mismatch (expected: "
951 << abiKindToString(Target.getKind())
952 <<
", given: " << abiKindToString(Res.getKind()) <<
")";
957 llvm::Type *TargetType = Target.getCoerceToType();
964 Check(TargetType == ResType, [&]() {
965 llvm::dbgs() <<
"CoerceToType mismatch (expected: " << *TargetType
966 <<
", given: " << *ResType <<
")";
972 CheckSimple(Target.isSignExt(), Res.
isSignExt(),
"SignExt");
973 CheckSimple(Target.isZeroExt(), Res.
isZeroExt(),
"ZeroExt");
976 CheckSimple(Target.getDirectAlign(), Res.
getDirectAlign(),
"DirectAlign");
986 "IndirectAddrSpace");
990 llvm::dbgs() <<
"IndirectAlign mismatch (expected: "
991 << Target.getIndirectAlign().getQuantity()
992 <<
", given: " << Res.getIndirectAlign().getQuantity()
1003 auto ConvertABIArgInfo =
1005 int ArgNo) { Target = convertABIArgInfo(AbiInfo,
Type); };
1008 ConvertABIArgInfo(FI.
getReturnInfo(), AbiFI->getReturnInfo(),
1012 for (
auto [CGArg, AbiArg] :
1013 llvm::zip_equal(FI.
arguments(), AbiFI->arguments()))
1014 ConvertABIArgInfo(CGArg.info, AbiArg.Info, CGArg.type, ArgNo++);
1017ABIArgInfo CodeGenModule::convertABIArgInfo(
const llvm::abi::ArgInfo &AbiInfo,
1019 switch (AbiInfo.getKind()) {
1020 case llvm::abi::ArgInfo::Direct: {
1021 llvm::Type *CoercedType =
nullptr;
1022 if (AbiInfo.getCoerceToType())
1023 CoercedType = AbiReverseMapper->convertType(AbiInfo.getCoerceToType());
1025 CoercedType = getTypes().ConvertType(
Type);
1028 case llvm::abi::ArgInfo::Extend: {
1029 llvm::Type *CoercedType =
nullptr;
1030 if (AbiInfo.getCoerceToType())
1031 CoercedType = AbiReverseMapper->convertType(AbiInfo.getCoerceToType());
1033 CoercedType = getTypes().ConvertType(
Type);
1039 if (AbiInfo.isSignExt())
1041 if (AbiInfo.isZeroExt())
1045 case llvm::abi::ArgInfo::Indirect: {
1049 AbiInfo.getIndirectByVal(),
1050 AbiInfo.getIndirectRealign());
1052 case llvm::abi::ArgInfo::Ignore:
1055 llvm_unreachable(
"Unexpected llvm::abi::ArgInfo kind");
1066 assert(llvm::all_of(argTypes,
1070 llvm::FoldingSetNodeID ID;
1075 bool isDelegateCall =
1077 unsigned X86ABIAVXLevel = CGM.getABIInfo().getX86ABIAVXLevel(ABIInfoFD, info);
1081 paramInfos, required, resultType, argTypes);
1091 llvm::FoldingSetNodeID ID;
1093 X86ABIAVXLevel, info, paramInfos, required,
1094 resultType, argTypes);
1096 void *insertPos =
nullptr;
1097 CGFunctionInfo *FI = FunctionInfos.FindNodeOrInsertPos(ID, insertPos);
1101 unsigned CC = ClangCallConvToLLVMCallConv(info.getCC());
1105 X86ABIAVXLevel, info, paramInfos, resultType,
1106 argTypes, required);
1107 FunctionInfos.InsertNode(FI, insertPos);
1109 bool inserted = FunctionsBeingProcessed.insert(FI).second;
1111 assert(inserted &&
"Recursively being processed?");
1115 (CC == llvm::CallingConv::SPIR_KERNEL || CC == llvm::CallingConv::C)) {
1120 assert(CC != llvm::CallingConv::C || getContext().getLangOpts().
OpenCL);
1124 }
else if (CGM.shouldUseLLVMABILowering(CC)) {
1125 CGM.computeABIInfoUsingLib(*FI);
1127 CGM.getABIInfo().computeInfo(*FI);
1138 if (I.info.canHaveCoerceToType() && I.info.getCoerceToType() ==
nullptr)
1139 I.info.setCoerceToType(ConvertType(I.type));
1141 bool erased = FunctionsBeingProcessed.erase(FI);
1143 assert(erased &&
"Not in set?");
1149 unsigned llvmCC,
bool instanceMethod,
bool chainCall,
bool delegateCall,
1153 assert(paramInfos.empty() || paramInfos.size() == argTypes.size());
1157 void *buffer =
operator new(totalSizeToAlloc<ArgInfo, ExtParameterInfo>(
1158 argTypes.size() + 1, paramInfos.size()));
1160 CGFunctionInfo *FI =
new (buffer) CGFunctionInfo();
1161 FI->CallingConvention = llvmCC;
1162 FI->EffectiveCallingConvention = llvmCC;
1163 FI->ASTCallingConvention = info.getCC();
1164 FI->InstanceMethod = instanceMethod;
1165 FI->ChainCall = chainCall;
1166 FI->DelegateCall = delegateCall;
1167 FI->CmseNSCall = info.getCmseNSCall();
1168 FI->NoReturn = info.getNoReturn();
1169 FI->ReturnsRetained = info.getProducesResult();
1170 FI->NoCallerSavedRegs = info.getNoCallerSavedRegs();
1171 FI->NoCfCheck = info.getNoCfCheck();
1172 FI->Required = required;
1173 FI->HasRegParm = info.getHasRegParm();
1174 FI->RegParm = info.getRegParm();
1175 FI->X86ABIAVXLevel = X86ABIAVXLevel;
1176 FI->ArgStruct =
nullptr;
1177 FI->ArgStructAlign = 0;
1178 FI->NumArgs = argTypes.size();
1179 FI->HasExtParameterInfos = !paramInfos.empty();
1180 FI->getArgsBuffer()[0].
type = resultType;
1181 FI->MaxVectorWidth = 0;
1182 for (
unsigned i = 0, e = argTypes.size(); i != e; ++i)
1183 FI->getArgsBuffer()[i + 1].
type = argTypes[i];
1184 for (
unsigned i = 0, e = paramInfos.size(); i != e; ++i)
1185 FI->getExtParameterInfosBuffer()[i] = paramInfos[i];
1195struct TypeExpansion {
1196 enum TypeExpansionKind {
1208 const TypeExpansionKind Kind;
1210 TypeExpansion(TypeExpansionKind K) : Kind(K) {}
1211 virtual ~TypeExpansion() {}
1214struct ConstantArrayExpansion : TypeExpansion {
1218 ConstantArrayExpansion(QualType EltTy, uint64_t NumElts)
1219 : TypeExpansion(TEK_ConstantArray), EltTy(EltTy), NumElts(NumElts) {}
1220 static bool classof(
const TypeExpansion *TE) {
1221 return TE->Kind == TEK_ConstantArray;
1225struct RecordExpansion : TypeExpansion {
1226 SmallVector<const CXXBaseSpecifier *, 1> Bases;
1228 SmallVector<const FieldDecl *, 1> Fields;
1230 RecordExpansion(SmallVector<const CXXBaseSpecifier *, 1> &&Bases,
1231 SmallVector<const FieldDecl *, 1> &&Fields)
1232 : TypeExpansion(TEK_Record), Bases(std::move(Bases)),
1233 Fields(std::move(Fields)) {}
1234 static bool classof(
const TypeExpansion *TE) {
1235 return TE->Kind == TEK_Record;
1239struct ComplexExpansion : TypeExpansion {
1242 ComplexExpansion(QualType EltTy) : TypeExpansion(
TEK_Complex), EltTy(EltTy) {}
1243 static bool classof(
const TypeExpansion *TE) {
1248struct NoExpansion : TypeExpansion {
1249 NoExpansion() : TypeExpansion(TEK_None) {}
1250 static bool classof(
const TypeExpansion *TE) {
return TE->Kind == TEK_None; }
1254static std::unique_ptr<TypeExpansion>
1257 return std::make_unique<ConstantArrayExpansion>(AT->getElementType(),
1263 assert(!RD->hasFlexibleArrayMember() &&
1264 "Cannot expand structure with flexible array.");
1265 if (RD->isUnion()) {
1271 for (
const auto *FD : RD->fields()) {
1272 if (FD->isZeroLengthBitField())
1274 assert(!FD->isBitField() &&
1275 "Cannot expand structure with bit-field members.");
1276 CharUnits FieldSize = Context.getTypeSizeInChars(FD->getType());
1277 if (UnionSize < FieldSize) {
1278 UnionSize = FieldSize;
1283 Fields.push_back(LargestFD);
1285 if (
const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
1286 assert(!CXXRD->isDynamicClass() &&
1287 "cannot expand vtable pointers in dynamic classes");
1288 llvm::append_range(Bases, llvm::make_pointer_range(CXXRD->bases()));
1291 for (
const auto *FD : RD->fields()) {
1292 if (FD->isZeroLengthBitField())
1294 assert(!FD->isBitField() &&
1295 "Cannot expand structure with bit-field members.");
1296 Fields.push_back(FD);
1299 return std::make_unique<RecordExpansion>(std::move(Bases),
1303 return std::make_unique<ComplexExpansion>(CT->getElementType());
1305 return std::make_unique<NoExpansion>();
1310 if (
auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
1313 if (
auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
1315 for (
auto BS : RExp->Bases)
1317 for (
auto FD : RExp->Fields)
1330 if (
auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
1331 for (
int i = 0, n = CAExp->NumElts; i < n; i++) {
1334 }
else if (
auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
1335 for (
auto BS : RExp->Bases)
1337 for (
auto FD : RExp->Fields)
1339 }
else if (
auto CExp = dyn_cast<ComplexExpansion>(Exp.get())) {
1350 ConstantArrayExpansion *CAE,
1352 llvm::function_ref<
void(
Address)> Fn) {
1353 for (
int i = 0, n = CAE->NumElts; i < n; i++) {
1359void CodeGenFunction::ExpandTypeFromArgs(QualType Ty, LValue LV,
1360 llvm::Function::arg_iterator &AI) {
1361 assert(LV.isSimple() &&
1362 "Unexpected non-simple lvalue during struct expansion.");
1365 if (
auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
1367 *
this, CAExp, LV.getAddress(), [&](Address EltAddr) {
1368 LValue LV = MakeAddrLValue(EltAddr, CAExp->EltTy);
1369 ExpandTypeFromArgs(CAExp->EltTy, LV, AI);
1371 }
else if (
auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
1373 for (
const CXXBaseSpecifier *BS : RExp->Bases) {
1377 false, SourceLocation());
1378 LValue SubLV = MakeAddrLValue(Base, BS->
getType());
1381 ExpandTypeFromArgs(BS->
getType(), SubLV, AI);
1383 for (
auto FD : RExp->Fields) {
1385 LValue SubLV = EmitLValueForFieldInitialization(LV, FD);
1386 ExpandTypeFromArgs(FD->getType(), SubLV, AI);
1389 auto realValue = &*AI++;
1390 auto imagValue = &*AI++;
1391 EmitStoreOfComplex(
ComplexPairTy(realValue, imagValue), LV,
true);
1396 llvm::Value *Arg = &*AI++;
1397 if (LV.isBitField()) {
1403 if (Arg->getType()->isPointerTy()) {
1405 Arg = Builder.CreateBitCast(Arg,
Addr.getElementType());
1407 EmitStoreOfScalar(Arg, LV);
1412void CodeGenFunction::ExpandTypeToArgs(
1413 QualType Ty, CallArg Arg, llvm::FunctionType *IRFuncTy,
1414 SmallVectorImpl<llvm::Value *> &IRCallArgs,
unsigned &IRCallArgPos) {
1416 if (
auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
1421 CallArg(convertTempToRValue(EltAddr, CAExp->EltTy, SourceLocation()),
1423 ExpandTypeToArgs(CAExp->EltTy, EltArg, IRFuncTy, IRCallArgs,
1426 }
else if (
auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
1429 for (
const CXXBaseSpecifier *BS : RExp->Bases) {
1433 false, SourceLocation());
1437 ExpandTypeToArgs(BS->
getType(), BaseArg, IRFuncTy, IRCallArgs,
1441 LValue LV = MakeAddrLValue(This, Ty);
1442 for (
auto FD : RExp->Fields) {
1444 CallArg(EmitRValueForField(LV, FD, SourceLocation()), FD->getType());
1445 ExpandTypeToArgs(FD->getType(), FldArg, IRFuncTy, IRCallArgs,
1450 IRCallArgs[IRCallArgPos++] = CV.first;
1451 IRCallArgs[IRCallArgPos++] = CV.second;
1455 assert(RV.isScalar() &&
1456 "Unexpected non-scalar rvalue during struct expansion.");
1459 llvm::Value *
V = RV.getScalarVal();
1460 if (IRCallArgPos < IRFuncTy->getNumParams() &&
1461 V->getType() != IRFuncTy->getParamType(IRCallArgPos))
1462 V = Builder.CreateBitCast(
V, IRFuncTy->getParamType(IRCallArgPos));
1464 IRCallArgs[IRCallArgPos++] =
V;
1472 const Twine &Name =
"tmp") {
1485 llvm::StructType *SrcSTy,
1489 if (SrcSTy->getNumElements() == 0)
1498 uint64_t FirstEltSize = CGF.
CGM.
getDataLayout().getTypeStoreSize(FirstElt);
1499 if (FirstEltSize < DstSize &&
1508 if (llvm::StructType *SrcSTy = dyn_cast<llvm::StructType>(SrcTy))
1523 if (Val->getType() == Ty)
1529 return CGF.
Builder.CreateBitCast(Val, Ty,
"coerce.val");
1535 llvm::Type *DestIntTy = Ty;
1539 if (Val->getType() != DestIntTy) {
1541 if (DL.isBigEndian()) {
1544 uint64_t SrcSize = DL.getTypeSizeInBits(Val->getType());
1545 uint64_t DstSize = DL.getTypeSizeInBits(DestIntTy);
1547 if (SrcSize > DstSize) {
1548 Val = CGF.
Builder.CreateLShr(Val, SrcSize - DstSize,
"coerce.highbits");
1549 Val = CGF.
Builder.CreateTrunc(Val, DestIntTy,
"coerce.val.ii");
1551 Val = CGF.
Builder.CreateZExt(Val, DestIntTy,
"coerce.val.ii");
1552 Val = CGF.
Builder.CreateShl(Val, DstSize - SrcSize,
"coerce.highbits");
1556 Val = CGF.
Builder.CreateIntCast(Val, DestIntTy,
false,
"coerce.val.ii");
1561 Val = CGF.
Builder.CreateIntToPtr(Val, Ty,
"coerce.val.ip");
1568 if (PFPFields.empty())
1571 auto LoadCoercedField = [&](
CharUnits Offset,
1572 llvm::Type *FieldType) -> llvm::Value * {
1577 if (!PFPFields.empty() && PFPFields[0].Offset == Offset) {
1581 FieldVal = CGF.
Builder.CreatePtrToInt(FieldVal, FieldType);
1582 PFPFields.erase(PFPFields.begin());
1599 Val = CGF.
Builder.CreatePtrToInt(Val, Ty);
1603 auto *ET = AT->getElementType();
1607 llvm::Value *Val = llvm::PoisonValue::get(AT);
1608 for (
unsigned Idx = 0; Idx != AT->getNumElements(); ++Idx, Offset += WordSize)
1609 Val = CGF.
Builder.CreateInsertValue(Val, LoadCoercedField(Offset, ET), Idx);
1633 if (llvm::StructType *SrcSTy = dyn_cast<llvm::StructType>(SrcTy)) {
1635 DstSize.getFixedValue(), CGF);
1650 if (!SrcSize.isScalable() && !DstSize.isScalable() &&
1651 SrcSize.getFixedValue() >= DstSize.getFixedValue()) {
1665 if (
auto *ScalableDstTy = dyn_cast<llvm::ScalableVectorType>(Ty)) {
1666 if (
auto *FixedSrcTy = dyn_cast<llvm::FixedVectorType>(SrcTy)) {
1669 if (ScalableDstTy->getElementType()->isIntegerTy(1) &&
1670 FixedSrcTy->getElementType()->isIntegerTy(8)) {
1671 ScalableDstTy = llvm::ScalableVectorType::get(
1672 FixedSrcTy->getElementType(),
1674 ScalableDstTy->getElementCount().getKnownMinValue(), 8));
1676 if (ScalableDstTy->getElementType() == FixedSrcTy->getElementType()) {
1678 auto *PoisonVec = llvm::PoisonValue::get(ScalableDstTy);
1680 ScalableDstTy, PoisonVec, Load, uint64_t(0),
"cast.scalable");
1682 llvm::VectorType::getWithSizeAndScalar(ScalableDstTy, Ty));
1683 if (
Result->getType() != ScalableDstTy)
1685 if (
Result->getType() != Ty)
1698 llvm::ConstantInt::get(CGF.
IntPtrTy, SrcSize.getKnownMinValue()));
1705 if (PFPFields.empty())
1708 llvm::Type *SrcTy = Src->getType();
1709 auto StoreCoercedField = [&](
CharUnits Offset, llvm::Value *FieldVal) {
1710 if (!PFPFields.empty() && PFPFields[0].Offset == Offset) {
1715 PFPFields.erase(PFPFields.begin());
1735 auto *ET = AT->getElementType();
1739 for (
unsigned i = 0; i != AT->getNumElements(); ++i, Offset += WordSize)
1740 StoreCoercedField(Offset, CGF.
Builder.CreateExtractValue(Src, i));
1746 Address Dst, llvm::TypeSize DstSize,
1747 bool DstIsVolatile) {
1751 llvm::Type *SrcTy = Src->getType();
1752 llvm::TypeSize SrcSize =
CGM.getDataLayout().getTypeAllocSize(SrcTy);
1758 if (llvm::StructType *DstSTy =
1760 assert(!SrcSize.isScalable());
1762 SrcSize.getFixedValue(), *
this);
1769 if (SrcSize.isScalable() || SrcSize <= DstSize) {
1770 if (SrcTy->isIntegerTy() && Dst.
getElementType()->isPointerTy() &&
1774 auto *I =
Builder.CreateStore(Src, Dst, DstIsVolatile);
1776 }
else if (llvm::StructType *STy =
1777 dyn_cast<llvm::StructType>(Src->getType())) {
1780 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
1782 llvm::Value *Elt =
Builder.CreateExtractValue(Src, i);
1783 auto *I =
Builder.CreateStore(Elt, EltPtr, DstIsVolatile);
1791 }
else if (SrcTy->isIntegerTy()) {
1793 llvm::Type *DstIntTy =
Builder.getIntNTy(DstSize.getFixedValue() * 8);
1810 Builder.CreateStore(Src, Tmp);
1811 auto *I =
Builder.CreateMemCpy(
1821 if (
unsigned offset = info.getDirectOffset()) {
1830static std::pair<llvm::Value *, bool>
1832 llvm::ScalableVectorType *FromTy, llvm::Value *
V,
1833 StringRef Name =
"") {
1836 if (FromTy->getElementType()->isIntegerTy(1) &&
1837 ToTy->getElementType() == CGF.
Builder.getInt8Ty()) {
1838 if (!FromTy->getElementCount().isKnownMultipleOf(8)) {
1839 FromTy = llvm::ScalableVectorType::get(
1840 FromTy->getElementType(),
1841 llvm::alignTo<8>(FromTy->getElementCount().getKnownMinValue()));
1842 llvm::Value *ZeroVec = llvm::Constant::getNullValue(FromTy);
1843 V = CGF.
Builder.CreateInsertVector(FromTy, ZeroVec,
V, uint64_t(0));
1845 FromTy = llvm::ScalableVectorType::get(
1846 ToTy->getElementType(),
1847 FromTy->getElementCount().getKnownMinValue() / 8);
1848 V = CGF.
Builder.CreateBitCast(
V, FromTy);
1850 if (FromTy->getElementType() == ToTy->getElementType()) {
1851 V->setName(Name +
".coerce");
1852 V = CGF.
Builder.CreateExtractVector(ToTy,
V, uint64_t(0),
"cast.fixed");
1862class ClangToLLVMArgMapping {
1863 static const unsigned InvalidIndex = ~0U;
1864 unsigned InallocaArgNo;
1866 unsigned TotalIRArgs;
1870 unsigned PaddingArgIndex;
1873 unsigned FirstArgIndex;
1874 unsigned NumberOfArgs;
1877 : PaddingArgIndex(InvalidIndex), FirstArgIndex(InvalidIndex),
1881 SmallVector<IRArgs, 8> ArgInfo;
1884 ClangToLLVMArgMapping(
const ASTContext &Context,
const CGFunctionInfo &FI,
1885 bool OnlyRequiredArgs =
false)
1886 : InallocaArgNo(InvalidIndex), SRetArgNo(InvalidIndex), TotalIRArgs(0),
1887 ArgInfo(OnlyRequiredArgs ? FI.getNumRequiredArgs() : FI.arg_size()) {
1888 construct(Context, FI, OnlyRequiredArgs);
1891 bool hasInallocaArg()
const {
return InallocaArgNo != InvalidIndex; }
1892 unsigned getInallocaArgNo()
const {
1893 assert(hasInallocaArg());
1894 return InallocaArgNo;
1897 bool hasSRetArg()
const {
return SRetArgNo != InvalidIndex; }
1898 unsigned getSRetArgNo()
const {
1899 assert(hasSRetArg());
1903 unsigned totalIRArgs()
const {
return TotalIRArgs; }
1905 bool hasPaddingArg(
unsigned ArgNo)
const {
1906 assert(ArgNo < ArgInfo.size());
1907 return ArgInfo[ArgNo].PaddingArgIndex != InvalidIndex;
1909 unsigned getPaddingArgNo(
unsigned ArgNo)
const {
1910 assert(hasPaddingArg(ArgNo));
1911 return ArgInfo[ArgNo].PaddingArgIndex;
1916 std::pair<unsigned, unsigned> getIRArgs(
unsigned ArgNo)
const {
1917 assert(ArgNo < ArgInfo.size());
1918 return std::make_pair(ArgInfo[ArgNo].FirstArgIndex,
1919 ArgInfo[ArgNo].NumberOfArgs);
1923 void construct(
const ASTContext &Context,
const CGFunctionInfo &FI,
1924 bool OnlyRequiredArgs);
1927void ClangToLLVMArgMapping::construct(
const ASTContext &Context,
1928 const CGFunctionInfo &FI,
1929 bool OnlyRequiredArgs) {
1930 unsigned IRArgNo = 0;
1931 bool SwapThisWithSRet =
false;
1936 SRetArgNo = SwapThisWithSRet ? 1 : IRArgNo++;
1944 QualType ArgType = I->type;
1945 const ABIArgInfo &AI = I->info;
1947 auto &IRArgs = ArgInfo[ArgNo];
1950 IRArgs.PaddingArgIndex = IRArgNo++;
1957 llvm::StructType *STy = dyn_cast<llvm::StructType>(AI.
getCoerceToType());
1959 IRArgs.NumberOfArgs = STy->getNumElements();
1961 IRArgs.NumberOfArgs = 1;
1967 IRArgs.NumberOfArgs = 1;
1972 IRArgs.NumberOfArgs = 0;
1982 if (IRArgs.NumberOfArgs > 0) {
1983 IRArgs.FirstArgIndex = IRArgNo;
1984 IRArgNo += IRArgs.NumberOfArgs;
1989 if (IRArgNo == 1 && SwapThisWithSRet)
1992 assert(ArgNo == ArgInfo.size());
1995 InallocaArgNo = IRArgNo++;
1997 TotalIRArgs = IRArgNo;
2005 return RI.
isIndirect() || (RI.isInAlloca() && RI.getInAllocaSRet());
2020 switch (BT->getKind()) {
2023 case BuiltinType::Float:
2025 case BuiltinType::Double:
2027 case BuiltinType::LongDouble:
2038 if (BT->getKind() == BuiltinType::LongDouble)
2039 return getTarget().useObjCFP2RetForComplexLongDouble();
2053 bool Inserted = FunctionsBeingProcessed.insert(&FI).second;
2055 assert(Inserted &&
"Recursively being processed?");
2057 llvm::Type *resultType =
nullptr;
2062 llvm_unreachable(
"Invalid ABI kind for return argument");
2074 unsigned addressSpace = CGM.getTypes().getTargetAddressSpace(ret);
2075 resultType = llvm::PointerType::get(
getLLVMContext(), addressSpace);
2091 ClangToLLVMArgMapping IRFunctionArgs(
getContext(), FI,
true);
2095 if (IRFunctionArgs.hasSRetArg()) {
2096 ArgTypes[IRFunctionArgs.getSRetArgNo()] = llvm::PointerType::get(
2101 if (IRFunctionArgs.hasInallocaArg())
2102 ArgTypes[IRFunctionArgs.getInallocaArgNo()] =
2109 for (; it != ie; ++it, ++ArgNo) {
2113 if (IRFunctionArgs.hasPaddingArg(ArgNo))
2114 ArgTypes[IRFunctionArgs.getPaddingArgNo(ArgNo)] =
2117 unsigned FirstIRArg, NumIRArgs;
2118 std::tie(FirstIRArg, NumIRArgs) = IRFunctionArgs.getIRArgs(ArgNo);
2123 assert(NumIRArgs == 0);
2127 assert(NumIRArgs == 1);
2129 ArgTypes[FirstIRArg] = llvm::PointerType::get(
2133 assert(NumIRArgs == 1);
2134 ArgTypes[FirstIRArg] = llvm::PointerType::get(
2143 llvm::StructType *st = dyn_cast<llvm::StructType>(argType);
2145 assert(NumIRArgs == st->getNumElements());
2146 for (
unsigned i = 0, e = st->getNumElements(); i != e; ++i)
2147 ArgTypes[FirstIRArg + i] = st->getElementType(i);
2149 assert(NumIRArgs == 1);
2150 ArgTypes[FirstIRArg] = argType;
2156 auto ArgTypesIter = ArgTypes.begin() + FirstIRArg;
2158 *ArgTypesIter++ = EltTy;
2160 assert(ArgTypesIter == ArgTypes.begin() + FirstIRArg + NumIRArgs);
2165 auto ArgTypesIter = ArgTypes.begin() + FirstIRArg;
2167 assert(ArgTypesIter == ArgTypes.begin() + FirstIRArg + NumIRArgs);
2172 bool Erased = FunctionsBeingProcessed.erase(&FI);
2174 assert(Erased &&
"Not in set?");
2176 return llvm::FunctionType::get(resultType, ArgTypes, FI.
isVariadic());
2190 llvm::AttrBuilder &FuncAttrs,
2197 FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2201 FuncAttrs.addAttribute(
"aarch64_pstate_sm_enabled");
2203 FuncAttrs.addAttribute(
"aarch64_pstate_sm_compatible");
2205 FuncAttrs.addAttribute(
"aarch64_za_state_agnostic");
2209 FuncAttrs.addAttribute(
"aarch64_preserves_za");
2211 FuncAttrs.addAttribute(
"aarch64_in_za");
2213 FuncAttrs.addAttribute(
"aarch64_out_za");
2215 FuncAttrs.addAttribute(
"aarch64_inout_za");
2219 FuncAttrs.addAttribute(
"aarch64_preserves_zt0");
2221 FuncAttrs.addAttribute(
"aarch64_in_zt0");
2223 FuncAttrs.addAttribute(
"aarch64_out_zt0");
2225 FuncAttrs.addAttribute(
"aarch64_inout_zt0");
2229 const Decl *Callee) {
2235 for (
const OMPAssumeAttr *AA : Callee->specific_attrs<OMPAssumeAttr>())
2236 AA->getAssumption().split(Attrs,
",");
2239 FuncAttrs.addAttribute(llvm::AssumptionAttrKey,
2240 llvm::join(Attrs.begin(), Attrs.end(),
","));
2247 if (
const RecordType *RT =
2249 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl()))
2250 return ClassDecl->hasTrivialDestructor();
2256 const Decl *TargetDecl) {
2262 if (
Module.getLangOpts().Sanitize.has(SanitizerKind::Memory))
2266 if (!
Module.getLangOpts().CPlusPlus)
2269 if (
const FunctionDecl *FDecl = dyn_cast<FunctionDecl>(TargetDecl)) {
2270 if (FDecl->isExternC())
2272 }
else if (
const VarDecl *VDecl = dyn_cast<VarDecl>(TargetDecl)) {
2274 if (VDecl->isExternC())
2282 return Module.getCodeGenOpts().StrictReturn ||
2283 !
Module.MayDropFunctionReturn(
Module.getContext(), RetTy) ||
2284 Module.getLangOpts().Sanitize.has(SanitizerKind::Return);
2291 llvm::DenormalMode FP32DenormalMode,
2292 llvm::AttrBuilder &FuncAttrs) {
2293 llvm::DenormalFPEnv FPEnv(FPDenormalMode, FP32DenormalMode);
2294 if (FPEnv != llvm::DenormalFPEnv::getDefault())
2295 FuncAttrs.addDenormalFPEnvAttr(FPEnv);
2303 llvm::AttrBuilder &FuncAttrs) {
2309 StringRef Name,
bool HasOptnone,
const CodeGenOptions &CodeGenOpts,
2311 llvm::AttrBuilder &FuncAttrs) {
2314 if (CodeGenOpts.OptimizeSize)
2315 FuncAttrs.addAttribute(llvm::Attribute::OptimizeForSize);
2316 if (CodeGenOpts.OptimizeSize == 2)
2317 FuncAttrs.addAttribute(llvm::Attribute::MinSize);
2320 if (CodeGenOpts.DisableRedZone)
2321 FuncAttrs.addAttribute(llvm::Attribute::NoRedZone);
2322 if (CodeGenOpts.IndirectTlsSegRefs)
2323 FuncAttrs.addAttribute(
"indirect-tls-seg-refs");
2324 if (CodeGenOpts.NoImplicitFloat)
2325 FuncAttrs.addAttribute(llvm::Attribute::NoImplicitFloat);
2327 if (AttrOnCallSite) {
2332 FuncAttrs.addAttribute(llvm::Attribute::NoBuiltin);
2334 FuncAttrs.addAttribute(
"trap-func-name", CodeGenOpts.
TrapFuncName);
2336 switch (CodeGenOpts.getFramePointer()) {
2344 FuncAttrs.addAttribute(
"frame-pointer",
2346 CodeGenOpts.getFramePointer()));
2349 if (CodeGenOpts.LessPreciseFPMAD)
2350 FuncAttrs.addAttribute(
"less-precise-fpmad",
"true");
2352 if (CodeGenOpts.NullPointerIsValid)
2353 FuncAttrs.addAttribute(llvm::Attribute::NullPointerIsValid);
2356 FuncAttrs.addAttribute(
"no-trapping-math",
"true");
2360 if (CodeGenOpts.SoftFloat)
2361 FuncAttrs.addAttribute(
"use-soft-float",
"true");
2362 FuncAttrs.addAttribute(
"stack-protector-buffer-size",
2363 llvm::utostr(CodeGenOpts.SSPBufferSize));
2364 if (LangOpts.NoSignedZero)
2365 FuncAttrs.addAttribute(
"no-signed-zeros-fp-math",
"true");
2368 const std::vector<std::string> &Recips = CodeGenOpts.
Reciprocals;
2369 if (!Recips.empty())
2370 FuncAttrs.addAttribute(
"reciprocal-estimates", llvm::join(Recips,
","));
2374 FuncAttrs.addAttribute(
"prefer-vector-width",
2377 if (CodeGenOpts.StackRealignment)
2378 FuncAttrs.addAttribute(
"stackrealign");
2379 if (CodeGenOpts.Backchain)
2380 FuncAttrs.addAttribute(
"backchain");
2381 if (CodeGenOpts.EnableSegmentedStacks)
2382 FuncAttrs.addAttribute(
"split-stack");
2384 if (CodeGenOpts.SpeculativeLoadHardening)
2385 FuncAttrs.addAttribute(llvm::Attribute::SpeculativeLoadHardening);
2388 switch (CodeGenOpts.getZeroCallUsedRegs()) {
2389 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::Skip:
2390 FuncAttrs.removeAttribute(
"zero-call-used-regs");
2392 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::UsedGPRArg:
2393 FuncAttrs.addAttribute(
"zero-call-used-regs",
"used-gpr-arg");
2395 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::UsedGPR:
2396 FuncAttrs.addAttribute(
"zero-call-used-regs",
"used-gpr");
2398 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::UsedArg:
2399 FuncAttrs.addAttribute(
"zero-call-used-regs",
"used-arg");
2401 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::Used:
2402 FuncAttrs.addAttribute(
"zero-call-used-regs",
"used");
2404 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::AllGPRArg:
2405 FuncAttrs.addAttribute(
"zero-call-used-regs",
"all-gpr-arg");
2407 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::AllGPR:
2408 FuncAttrs.addAttribute(
"zero-call-used-regs",
"all-gpr");
2410 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::AllArg:
2411 FuncAttrs.addAttribute(
"zero-call-used-regs",
"all-arg");
2413 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::All:
2414 FuncAttrs.addAttribute(
"zero-call-used-regs",
"all");
2425 FuncAttrs.addAttribute(llvm::Attribute::Convergent);
2430 if ((LangOpts.CUDA && LangOpts.CUDAIsDevice) || LangOpts.OpenCL ||
2431 LangOpts.SYCLIsDevice) {
2432 FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2435 if (CodeGenOpts.SaveRegParams && !AttrOnCallSite)
2436 FuncAttrs.addAttribute(
"save-reg-params");
2439 StringRef Var,
Value;
2441 FuncAttrs.addAttribute(Var,
Value);
2455 const llvm::Function &F,
2457 auto FFeatures = F.getFnAttribute(
"target-features");
2459 llvm::StringSet<> MergedNames;
2461 MergedFeatures.reserve(TargetOpts.
Features.size());
2463 auto AddUnmergedFeatures = [&](
auto &&FeatureRange) {
2464 for (StringRef
Feature : FeatureRange) {
2468 StringRef Name =
Feature.drop_front(1);
2469 bool Merged = !MergedNames.insert(Name).second;
2471 MergedFeatures.push_back(
Feature);
2475 if (FFeatures.isValid())
2476 AddUnmergedFeatures(llvm::split(FFeatures.getValueAsString(),
','));
2477 AddUnmergedFeatures(TargetOpts.
Features);
2479 if (!MergedFeatures.empty()) {
2480 llvm::sort(MergedFeatures);
2481 FuncAttr.addAttribute(
"target-features", llvm::join(MergedFeatures,
","));
2488 bool WillInternalize) {
2490 llvm::AttrBuilder FuncAttrs(F.getContext());
2493 if (!TargetOpts.
CPU.empty())
2494 FuncAttrs.addAttribute(
"target-cpu", TargetOpts.
CPU);
2495 if (!TargetOpts.
TuneCPU.empty())
2496 FuncAttrs.addAttribute(
"tune-cpu", TargetOpts.
TuneCPU);
2499 CodeGenOpts, LangOpts,
2502 if (!WillInternalize && F.isInterposable()) {
2507 F.addFnAttrs(FuncAttrs);
2511 llvm::AttributeMask AttrsToRemove;
2515 llvm::DenormalFPEnv MergedFPEnv =
2516 OptsFPEnv.mergeCalleeMode(F.getDenormalFPEnv());
2518 if (MergedFPEnv == llvm::DenormalFPEnv::getDefault()) {
2519 AttrsToRemove.addAttribute(llvm::Attribute::DenormalFPEnv);
2522 FuncAttrs.addDenormalFPEnvAttr(MergedFPEnv);
2525 F.removeFnAttrs(AttrsToRemove);
2529 F.addFnAttrs(FuncAttrs);
2532void CodeGenModule::getTrivialDefaultFunctionAttributes(
2533 StringRef Name,
bool HasOptnone,
bool AttrOnCallSite,
2534 llvm::AttrBuilder &FuncAttrs) {
2536 getLangOpts(), AttrOnCallSite,
2540void CodeGenModule::getDefaultFunctionAttributes(StringRef Name,
2542 bool AttrOnCallSite,
2543 llvm::AttrBuilder &FuncAttrs) {
2547 if (!AttrOnCallSite)
2553 if (!AttrOnCallSite)
2558 llvm::AttrBuilder &attrs) {
2559 getDefaultFunctionAttributes(
"",
false,
2561 GetCPUAndFeaturesAttributes(
GlobalDecl(), attrs);
2566 const NoBuiltinAttr *NBA =
nullptr) {
2567 auto AddNoBuiltinAttr = [&FuncAttrs](StringRef BuiltinName) {
2569 AttributeName +=
"no-builtin-";
2570 AttributeName += BuiltinName;
2571 FuncAttrs.addAttribute(AttributeName);
2575 if (LangOpts.NoBuiltin) {
2577 FuncAttrs.addAttribute(
"no-builtins");
2591 if (llvm::is_contained(NBA->builtinNames(),
"*")) {
2592 FuncAttrs.addAttribute(
"no-builtins");
2597 llvm::for_each(NBA->builtinNames(), AddNoBuiltinAttr);
2601 const llvm::DataLayout &DL,
const ABIArgInfo &AI,
2602 bool CheckCoerce =
true) {
2609 if (!DL.typeSizeEqualsStoreSize(Ty))
2616 if (llvm::TypeSize::isKnownGT(DL.getTypeSizeInBits(CoerceTy),
2617 DL.getTypeSizeInBits(Ty)))
2641 if (
const MatrixType *Matrix = dyn_cast<MatrixType>(QTy))
2652 unsigned NumRequiredArgs,
unsigned ArgNo) {
2653 const auto *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl);
2658 if (ArgNo >= NumRequiredArgs)
2662 if (ArgNo < FD->getNumParams()) {
2663 const ParmVarDecl *Param = FD->getParamDecl(ArgNo);
2664 if (Param && Param->hasAttr<MaybeUndefAttr>())
2681 if (llvm::AttributeFuncs::isNoFPClassCompatibleType(IRTy))
2684 if (llvm::StructType *ST = dyn_cast<llvm::StructType>(IRTy)) {
2686 llvm::all_of(ST->elements(),
2687 llvm::AttributeFuncs::isNoFPClassCompatibleType);
2695 llvm::FPClassTest Mask = llvm::fcNone;
2696 if (LangOpts.NoHonorInfs)
2697 Mask |= llvm::fcInf;
2698 if (LangOpts.NoHonorNaNs)
2699 Mask |= llvm::fcNan;
2705 llvm::AttributeList &Attrs) {
2706 if (Attrs.getMemoryEffects().getModRef() == llvm::ModRefInfo::NoModRef) {
2707 Attrs = Attrs.removeFnAttribute(
getLLVMContext(), llvm::Attribute::Memory);
2708 llvm::Attribute MemoryAttr = llvm::Attribute::getWithMemoryEffects(
2734 llvm::AttributeList &AttrList,
2736 bool AttrOnCallSite,
bool IsThunk) {
2744 FuncAttrs.addAttribute(llvm::Attribute::NoReturn);
2746 FuncAttrs.addAttribute(
"cmse_nonsecure_call");
2757 bool HasOptnone =
false;
2759 const NoBuiltinAttr *NBA =
nullptr;
2763 std::optional<llvm::Attribute::AttrKind> MemAttrForPtrArgs;
2764 bool AddedPotentialArgAccess =
false;
2765 auto AddPotentialArgAccess = [&]() {
2766 AddedPotentialArgAccess =
true;
2767 llvm::Attribute A = FuncAttrs.getAttribute(llvm::Attribute::Memory);
2769 FuncAttrs.addMemoryAttr(A.getMemoryEffects() |
2770 llvm::MemoryEffects::argMemOnly());
2777 if (TargetDecl->
hasAttr<ReturnsTwiceAttr>())
2778 FuncAttrs.addAttribute(llvm::Attribute::ReturnsTwice);
2779 if (TargetDecl->
hasAttr<NoThrowAttr>())
2780 FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2781 if (TargetDecl->
hasAttr<NoReturnAttr>())
2782 FuncAttrs.addAttribute(llvm::Attribute::NoReturn);
2783 if (TargetDecl->
hasAttr<ColdAttr>())
2784 FuncAttrs.addAttribute(llvm::Attribute::Cold);
2785 if (TargetDecl->
hasAttr<HotAttr>())
2786 FuncAttrs.addAttribute(llvm::Attribute::Hot);
2787 if (TargetDecl->
hasAttr<NoDuplicateAttr>())
2788 FuncAttrs.addAttribute(llvm::Attribute::NoDuplicate);
2789 if (TargetDecl->
hasAttr<ConvergentAttr>())
2790 FuncAttrs.addAttribute(llvm::Attribute::Convergent);
2792 if (
const FunctionDecl *Fn = dyn_cast<FunctionDecl>(TargetDecl)) {
2795 if (AttrOnCallSite && Fn->isReplaceableGlobalAllocationFunction()) {
2797 auto Kind = Fn->getDeclName().getCXXOverloadedOperator();
2799 (Kind == OO_New || Kind == OO_Array_New))
2800 RetAttrs.addAttribute(llvm::Attribute::NoAlias);
2803 const bool IsVirtualCall = MD && MD->
isVirtual();
2806 if (!(AttrOnCallSite && IsVirtualCall)) {
2807 if (Fn->isNoReturn())
2808 FuncAttrs.addAttribute(llvm::Attribute::NoReturn);
2809 NBA = Fn->getAttr<NoBuiltinAttr>();
2816 if (AttrOnCallSite && TargetDecl->
hasAttr<NoMergeAttr>())
2817 FuncAttrs.addAttribute(llvm::Attribute::NoMerge);
2821 if (TargetDecl->
hasAttr<ConstAttr>()) {
2822 FuncAttrs.addMemoryAttr(llvm::MemoryEffects::none());
2823 FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2826 FuncAttrs.addAttribute(llvm::Attribute::WillReturn);
2827 MemAttrForPtrArgs = llvm::Attribute::ReadNone;
2828 }
else if (TargetDecl->
hasAttr<PureAttr>()) {
2829 FuncAttrs.addMemoryAttr(llvm::MemoryEffects::readOnly());
2830 FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2832 FuncAttrs.addAttribute(llvm::Attribute::WillReturn);
2833 MemAttrForPtrArgs = llvm::Attribute::ReadOnly;
2834 }
else if (TargetDecl->
hasAttr<NoAliasAttr>()) {
2835 FuncAttrs.addMemoryAttr(llvm::MemoryEffects::inaccessibleOrArgMemOnly());
2836 FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2838 if (
const auto *RA = TargetDecl->
getAttr<RestrictAttr>();
2839 RA && RA->getDeallocator() ==
nullptr)
2840 RetAttrs.addAttribute(llvm::Attribute::NoAlias);
2841 if (TargetDecl->
hasAttr<ReturnsNonNullAttr>() &&
2842 !CodeGenOpts.NullPointerIsValid)
2843 RetAttrs.addAttribute(llvm::Attribute::NonNull);
2844 if (TargetDecl->
hasAttr<AnyX86NoCallerSavedRegistersAttr>())
2845 FuncAttrs.addAttribute(
"no_caller_saved_registers");
2846 if (TargetDecl->
hasAttr<AnyX86NoCfCheckAttr>())
2847 FuncAttrs.addAttribute(llvm::Attribute::NoCfCheck);
2848 if (TargetDecl->
hasAttr<LeafAttr>())
2849 FuncAttrs.addAttribute(llvm::Attribute::NoCallback);
2850 if (TargetDecl->
hasAttr<BPFFastCallAttr>())
2851 FuncAttrs.addAttribute(
"bpf_fastcall");
2853 HasOptnone = TargetDecl->
hasAttr<OptimizeNoneAttr>();
2854 if (
auto *AllocSize = TargetDecl->
getAttr<AllocSizeAttr>()) {
2855 std::optional<unsigned> NumElemsParam;
2856 if (AllocSize->getNumElemsParam().isValid())
2857 NumElemsParam = AllocSize->getNumElemsParam().getLLVMIndex();
2858 FuncAttrs.addAllocSizeAttr(AllocSize->getElemSizeParam().getLLVMIndex(),
2868 FuncAttrs.addAttribute(
"uniform-work-group-size");
2870 if (TargetDecl->
hasAttr<ArmLocallyStreamingAttr>())
2871 FuncAttrs.addAttribute(
"aarch64_pstate_sm_body");
2873 if (
auto *ModularFormat = TargetDecl->
getAttr<ModularFormatAttr>()) {
2874 FormatAttr *Format = TargetDecl->
getAttr<FormatAttr>();
2875 StringRef
Type = Format->getType()->getName();
2876 std::string FormatIdx = std::to_string(Format->getFormatIdx());
2877 std::string FirstArg = std::to_string(Format->getFirstArg());
2879 Type, FormatIdx, FirstArg,
2880 ModularFormat->getModularImplFn()->getName(),
2881 ModularFormat->getImplName()};
2882 llvm::append_range(Args, ModularFormat->aspects());
2883 FuncAttrs.addAttribute(
"modular-format", llvm::join(Args,
","));
2896 getDefaultFunctionAttributes(Name, HasOptnone, AttrOnCallSite, FuncAttrs);
2901 if (TargetDecl->
hasAttr<NoSpeculativeLoadHardeningAttr>())
2902 FuncAttrs.removeAttribute(llvm::Attribute::SpeculativeLoadHardening);
2903 if (TargetDecl->
hasAttr<SpeculativeLoadHardeningAttr>())
2904 FuncAttrs.addAttribute(llvm::Attribute::SpeculativeLoadHardening);
2905 if (TargetDecl->
hasAttr<NoSplitStackAttr>())
2906 FuncAttrs.removeAttribute(
"split-stack");
2907 if (TargetDecl->
hasAttr<ZeroCallUsedRegsAttr>()) {
2910 TargetDecl->
getAttr<ZeroCallUsedRegsAttr>()->getZeroCallUsedRegs();
2911 FuncAttrs.removeAttribute(
"zero-call-used-regs");
2912 FuncAttrs.addAttribute(
2913 "zero-call-used-regs",
2914 ZeroCallUsedRegsAttr::ConvertZeroCallUsedRegsKindToStr(Kind));
2921 if (CodeGenOpts.NoPLT) {
2922 if (
auto *Fn = dyn_cast<FunctionDecl>(TargetDecl)) {
2923 if (!Fn->isDefined() && !AttrOnCallSite) {
2924 FuncAttrs.addAttribute(llvm::Attribute::NonLazyBind);
2929 if (TargetDecl->
hasAttr<NoConvergentAttr>())
2930 FuncAttrs.removeAttribute(llvm::Attribute::Convergent);
2935 if (TargetDecl && CodeGenOpts.UniqueInternalLinkageNames) {
2936 if (
const auto *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl)) {
2937 if (!FD->isExternallyVisible())
2938 FuncAttrs.addAttribute(
"sample-profile-suffix-elision-policy",
2945 if (!AttrOnCallSite) {
2946 if (TargetDecl && TargetDecl->
hasAttr<CmseNSEntryAttr>())
2947 FuncAttrs.addAttribute(
"cmse_nonsecure_entry");
2950 auto shouldDisableTailCalls = [&] {
2952 if (CodeGenOpts.DisableTailCalls)
2958 if (TargetDecl->
hasAttr<DisableTailCallsAttr>() ||
2959 TargetDecl->
hasAttr<AnyX86InterruptAttr>())
2962 if (CodeGenOpts.NoEscapingBlockTailCalls) {
2963 if (
const auto *BD = dyn_cast<BlockDecl>(TargetDecl))
2964 if (!BD->doesNotEscape())
2970 if (shouldDisableTailCalls())
2971 FuncAttrs.addAttribute(
"disable-tail-calls",
"true");
2976 static const llvm::StringSet<> ReturnsTwiceFn{
2977 "_setjmpex",
"setjmp",
"_setjmp",
"vfork",
2978 "sigsetjmp",
"__sigsetjmp",
"savectx",
"getcontext"};
2979 if (ReturnsTwiceFn.contains(Name))
2980 FuncAttrs.addAttribute(llvm::Attribute::ReturnsTwice);
2984 GetCPUAndFeaturesAttributes(CalleeInfo.
getCalleeDecl(), FuncAttrs);
2987 if (!MSHotPatchFunctions.empty()) {
2988 bool IsHotPatched = llvm::binary_search(MSHotPatchFunctions, Name);
2990 FuncAttrs.addAttribute(
"marked_for_windows_hot_patching");
2995 if (CodeGenOpts.isLoaderReplaceableFunctionName(Name))
2996 FuncAttrs.addAttribute(
"loader-replaceable");
2999 ClangToLLVMArgMapping IRFunctionArgs(
getContext(), FI);
3006 if (CodeGenOpts.EnableNoundefAttrs &&
3010 RetAttrs.addAttribute(llvm::Attribute::NoUndef);
3016 RetAttrs.addAttribute(llvm::Attribute::SExt);
3018 RetAttrs.addAttribute(llvm::Attribute::ZExt);
3020 RetAttrs.addAttribute(llvm::Attribute::NoExt);
3025 RetAttrs.addAttribute(llvm::Attribute::InReg);
3037 AddPotentialArgAccess();
3046 llvm_unreachable(
"Invalid ABI kind for return argument");
3054 RetAttrs.addDereferenceableAttr(
3056 if (
getTypes().getTargetAddressSpace(PTy) == 0 &&
3057 !CodeGenOpts.NullPointerIsValid)
3058 RetAttrs.addAttribute(llvm::Attribute::NonNull);
3060 llvm::Align Alignment =
3062 RetAttrs.addAlignmentAttr(Alignment);
3067 bool hasUsedSRet =
false;
3069 for (
unsigned I = 0; I < IRFunctionArgs.totalIRArgs(); ++I)
3073 if (IRFunctionArgs.hasSRetArg()) {
3074 llvm::AttrBuilder &SRETAttrs = ArgAttrs[IRFunctionArgs.getSRetArgNo()];
3075 SRETAttrs.addStructRetAttr(
getTypes().ConvertTypeForMem(RetTy));
3076 SRETAttrs.addAttribute(llvm::Attribute::Writable);
3077 SRETAttrs.addAttribute(llvm::Attribute::DeadOnUnwind);
3080 SRETAttrs.addAttribute(llvm::Attribute::InReg);
3085 if (IRFunctionArgs.hasInallocaArg()) {
3086 ArgAttrs[IRFunctionArgs.getInallocaArgNo()].addInAllocaAttr(
3096 auto IRArgs = IRFunctionArgs.getIRArgs(0);
3098 assert(IRArgs.second == 1 &&
"Expected only a single `this` pointer.");
3100 llvm::AttrBuilder &Attrs = ArgAttrs[IRArgs.first];
3105 if (!CodeGenOpts.NullPointerIsValid &&
3107 Attrs.addAttribute(llvm::Attribute::NonNull);
3108 Attrs.addDereferenceableAttr(ThisSz);
3114 Attrs.addDereferenceableOrNullAttr(ThisSz);
3117 llvm::Align Alignment =
3121 Attrs.addAlignmentAttr(Alignment);
3123 const auto *DD = dyn_cast_if_present<CXXDestructorDecl>(
3137 CodeGenOpts.StrictLifetimes) {
3139 dyn_cast<CXXRecordDecl>(DD->getDeclContext());
3143 Attrs.addDeadOnReturnAttr(llvm::DeadOnReturnInfo(
3144 Context.getASTRecordLayout(ClassDecl).getDataSize().getQuantity()));
3150 I != E; ++I, ++ArgNo) {
3156 if (IRFunctionArgs.hasPaddingArg(ArgNo)) {
3158 ArgAttrs[IRFunctionArgs.getPaddingArgNo(ArgNo)].addAttribute(
3159 llvm::Attribute::InReg);
3164 if (CodeGenOpts.EnableNoundefAttrs &&
3166 Attrs.addAttribute(llvm::Attribute::NoUndef);
3175 Attrs.addAttribute(llvm::Attribute::SExt);
3177 Attrs.addAttribute(llvm::Attribute::ZExt);
3179 Attrs.addAttribute(llvm::Attribute::NoExt);
3184 Attrs.addAttribute(llvm::Attribute::Nest);
3186 Attrs.addAttribute(llvm::Attribute::InReg);
3187 Attrs.addStackAlignmentAttr(llvm::MaybeAlign(AI.
getDirectAlign()));
3194 "Pass-by-value parameter has incomplete definition?");
3197 Attrs.addAttribute(llvm::Attribute::InReg);
3209 Attrs.addByValAttr(
getTypes().ConvertTypeForMem(ParamType));
3217 Attrs.addDeadOnReturnAttr(llvm::DeadOnReturnInfo());
3222 if (CodeGenOpts.PassByValueIsNoAlias &&
Decl &&
3223 Decl->getArgPassingRestrictions() ==
3227 Attrs.addAttribute(llvm::Attribute::NoAlias);
3257 Attrs.addAttribute(llvm::Attribute::NoFree);
3258 Attrs.addDereferenceableAttr(
3259 Context.getTypeSizeInChars(ParamType).getQuantity());
3263 AddPotentialArgAccess();
3268 Attrs.addByRefAttr(
getTypes().ConvertTypeForMem(ParamType));
3279 AddPotentialArgAccess();
3287 if (
getTypes().getTargetAddressSpace(PTy) == 0 &&
3288 !CodeGenOpts.NullPointerIsValid)
3289 Attrs.addAttribute(llvm::Attribute::NonNull);
3291 llvm::Align Alignment =
3293 Attrs.addAlignmentAttr(Alignment);
3302 DeviceKernelAttr::isOpenCLSpelling(
3303 TargetDecl->
getAttr<DeviceKernelAttr>()) &&
3307 llvm::Align Alignment =
3309 Attrs.addAlignmentAttr(Alignment);
3316 Attrs.addAttribute(llvm::Attribute::NoAlias);
3325 Attrs.addStructRetAttr(
getTypes().ConvertTypeForMem(ParamType));
3330 Attrs.addAttribute(llvm::Attribute::NoAlias);
3334 if (!PTy->isIncompleteType() && PTy->isConstantSizeType()) {
3335 auto info =
getContext().getTypeInfoInChars(PTy);
3336 Attrs.addDereferenceableAttr(info.Width.getQuantity());
3337 Attrs.addAlignmentAttr(info.Align.getAsAlign());
3343 Attrs.addAttribute(llvm::Attribute::SwiftError);
3347 Attrs.addAttribute(llvm::Attribute::SwiftSelf);
3351 Attrs.addAttribute(llvm::Attribute::SwiftAsync);
3356 Attrs.addCapturesAttr(
3357 llvm::CaptureInfo(llvm::CaptureComponents::Address));
3359 if (Attrs.hasAttributes()) {
3360 unsigned FirstIRArg, NumIRArgs;
3361 std::tie(FirstIRArg, NumIRArgs) = IRFunctionArgs.getIRArgs(ArgNo);
3362 for (
unsigned i = 0; i < NumIRArgs; i++)
3363 ArgAttrs[FirstIRArg + i].merge(Attrs);
3371 AddPotentialArgAccess();
3374 if (AddedPotentialArgAccess && MemAttrForPtrArgs) {
3378 I != E; ++I, ++ArgNo) {
3379 if (I->info.isDirect() || I->info.isExpand() ||
3380 I->info.isCoerceAndExpand()) {
3381 unsigned FirstIRArg, NumIRArgs;
3382 std::tie(FirstIRArg, NumIRArgs) = IRFunctionArgs.getIRArgs(ArgNo);
3383 for (
unsigned i = FirstIRArg; i < FirstIRArg + NumIRArgs; ++i) {
3390 if (i < FunctionType->getNumParams() &&
3392 ArgAttrs[i].addAttribute(*MemAttrForPtrArgs);
3400 for (
const llvm::AttrBuilder &Attrs : ArgAttrs)
3401 ArgAttrSets.push_back(llvm::AttributeSet::get(
getLLVMContext(), Attrs));
3403 AttrList = llvm::AttributeList::get(
3405 llvm::AttributeSet::get(
getLLVMContext(), RetAttrs), ArgAttrSets);
3412 llvm::Value *value) {
3413 llvm::Type *varType = CGF.
ConvertType(var->getType());
3417 if (value->getType() == varType)
3420 assert((varType->isIntegerTy() || varType->isFloatingPointTy()) &&
3421 "unexpected promotion type");
3424 return CGF.
Builder.CreateTrunc(value, varType,
"arg.unpromote");
3426 return CGF.
Builder.CreateFPCast(value, varType,
"arg.unpromote");
3432 QualType ArgType,
unsigned ArgNo) {
3440 if (!ArgType->isAnyPointerType() && !ArgType->isBlockPointerType())
3444 if (
auto ParmNNAttr = PVD->
getAttr<NonNullAttr>())
3451 if (NNAttr->isNonNull(ArgNo))
3458struct CopyBackSwiftError final : EHScopeStack::Cleanup {
3461 CopyBackSwiftError(Address temp, Address arg) : Temp(temp), Arg(
arg) {}
3462 void Emit(CodeGenFunction &CGF, Flags flags)
override {
3481 if (FD->hasImplicitReturnZero()) {
3482 QualType RetTy = FD->getReturnType().getUnqualifiedType();
3483 llvm::Type *LLVMTy =
CGM.getTypes().ConvertType(RetTy);
3484 llvm::Constant *
Zero = llvm::Constant::getNullValue(LLVMTy);
3492 ClangToLLVMArgMapping IRFunctionArgs(
CGM.getContext(), FI);
3493 assert(Fn->arg_size() == IRFunctionArgs.totalIRArgs());
3498 if (IRFunctionArgs.hasInallocaArg())
3499 ArgStruct =
Address(Fn->getArg(IRFunctionArgs.getInallocaArgNo()),
3503 if (IRFunctionArgs.hasSRetArg()) {
3504 auto AI = Fn->getArg(IRFunctionArgs.getSRetArgNo());
3505 AI->setName(
"agg.result");
3506 AI->addAttr(llvm::Attribute::NoAlias);
3513 ArgVals.reserve(Args.size());
3519 assert(FI.
arg_size() == Args.size() &&
3520 "Mismatch between function signature & arguments.");
3523 for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end(); i != e;
3524 ++i, ++info_it, ++ArgNo) {
3537 unsigned FirstIRArg, NumIRArgs;
3538 std::tie(FirstIRArg, NumIRArgs) = IRFunctionArgs.getIRArgs(ArgNo);
3542 assert(NumIRArgs == 0);
3555 assert(NumIRArgs == 1);
3578 llvm::ConstantInt::get(
IntPtrTy, Size.getQuantity()));
3579 ParamAddr = AlignedTemp;
3596 auto AI = Fn->getArg(FirstIRArg);
3604 assert(NumIRArgs == 1);
3606 if (
const ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(Arg)) {
3609 PVD->getFunctionScopeIndex()) &&
3610 !
CGM.getCodeGenOpts().NullPointerIsValid)
3611 AI->addAttr(llvm::Attribute::NonNull);
3613 QualType OTy = PVD->getOriginalType();
3614 if (
const auto *ArrTy =
getContext().getAsConstantArrayType(OTy)) {
3620 QualType ETy = ArrTy->getElementType();
3621 llvm::Align Alignment =
3622 CGM.getNaturalTypeAlignment(ETy).getAsAlign();
3624 .addAlignmentAttr(Alignment));
3625 uint64_t ArrSize = ArrTy->getZExtSize();
3629 Attrs.addDereferenceableAttr(
3630 getContext().getTypeSizeInChars(ETy).getQuantity() *
3632 AI->addAttrs(Attrs);
3633 }
else if (
getContext().getTargetInfo().getNullPointerValue(
3635 !
CGM.getCodeGenOpts().NullPointerIsValid) {
3636 AI->addAttr(llvm::Attribute::NonNull);
3639 }
else if (
const auto *ArrTy =
3645 QualType ETy = ArrTy->getElementType();
3646 llvm::Align Alignment =
3647 CGM.getNaturalTypeAlignment(ETy).getAsAlign();
3649 .addAlignmentAttr(Alignment));
3650 if (!
getTypes().getTargetAddressSpace(ETy) &&
3651 !
CGM.getCodeGenOpts().NullPointerIsValid)
3652 AI->addAttr(llvm::Attribute::NonNull);
3657 const auto *AVAttr = PVD->getAttr<AlignValueAttr>();
3660 AVAttr = TOTy->getDecl()->getAttr<AlignValueAttr>();
3661 if (AVAttr && !
SanOpts.has(SanitizerKind::Alignment)) {
3665 llvm::ConstantInt *AlignmentCI =
3667 uint64_t AlignmentInt =
3668 AlignmentCI->getLimitedValue(llvm::Value::MaximumAlignment);
3669 if (AI->getParamAlign().valueOrOne() < AlignmentInt) {
3670 AI->removeAttr(llvm::Attribute::AttrKind::Alignment);
3672 .addAlignmentAttr(llvm::Align(AlignmentInt)));
3679 AI->addAttr(llvm::Attribute::NoAlias);
3687 assert(NumIRArgs == 1);
3691 llvm::Value *
V = AI;
3699 V, pointeeTy,
getContext().getTypeAlignInChars(pointeeTy));
3700 llvm::Value *incomingErrorValue =
Builder.CreateLoad(arg);
3701 Builder.CreateStore(incomingErrorValue, temp);
3722 if (
V->getType() != LTy)
3733 if (
auto *VecTyTo = dyn_cast<llvm::FixedVectorType>(
ConvertType(Ty))) {
3734 llvm::Value *ArgVal = Fn->getArg(FirstIRArg);
3735 if (
auto *VecTyFrom =
3736 dyn_cast<llvm::ScalableVectorType>(ArgVal->getType())) {
3738 *
this, VecTyTo, VecTyFrom, ArgVal, Arg->
getName());
3740 assert(NumIRArgs == 1);
3747 llvm::StructType *STy =
3758 STy->getNumElements() > 1) {
3759 llvm::TypeSize StructSize =
CGM.getDataLayout().getTypeAllocSize(STy);
3760 llvm::TypeSize PtrElementSize =
3762 if (StructSize.isScalable()) {
3763 assert(STy->containsHomogeneousScalableVectorTypes() &&
3764 "ABI only supports structure with homogeneous scalable vector "
3766 assert(StructSize == PtrElementSize &&
3767 "Only allow non-fractional movement of structure with"
3768 "homogeneous scalable vector type");
3769 assert(STy->getNumElements() == NumIRArgs);
3771 llvm::Value *LoadedStructValue = llvm::PoisonValue::get(STy);
3772 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
3773 auto *AI = Fn->getArg(FirstIRArg + i);
3774 AI->setName(Arg->
getName() +
".coerce" + Twine(i));
3776 Builder.CreateInsertValue(LoadedStructValue, AI, i);
3779 Builder.CreateStore(LoadedStructValue, Ptr);
3781 uint64_t SrcSize = StructSize.getFixedValue();
3782 uint64_t DstSize = PtrElementSize.getFixedValue();
3785 if (SrcSize <= DstSize) {
3792 assert(STy->getNumElements() == NumIRArgs);
3793 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
3794 auto AI = Fn->getArg(FirstIRArg + i);
3795 AI->setName(Arg->
getName() +
".coerce" + Twine(i));
3797 Builder.CreateStore(AI, EltPtr);
3800 if (SrcSize > DstSize) {
3801 Builder.CreateMemCpy(Ptr, AddrToStoreInto, DstSize);
3813 assert(NumIRArgs == 1);
3814 auto AI = Fn->getArg(FirstIRArg);
3815 AI->setName(Arg->
getName() +
".coerce");
3818 llvm::TypeSize::getFixed(
3819 getContext().getTypeSizeInChars(Ty).getQuantity() -
3845 auto *unpaddedStruct = dyn_cast<llvm::StructType>(unpaddedCoercionType);
3849 unsigned argIndex = FirstIRArg;
3850 unsigned unpaddedIndex = 0;
3851 for (
unsigned i = 0, e = coercionType->getNumElements(); i != e; ++i) {
3852 llvm::Type *eltType = coercionType->getElementType(i);
3856 auto eltAddr =
Builder.CreateStructGEP(alloca, i);
3857 llvm::Value *elt = Fn->getArg(argIndex++);
3859 auto paramType = unpaddedStruct
3860 ? unpaddedStruct->getElementType(unpaddedIndex++)
3861 : unpaddedCoercionType;
3863 if (
auto *VecTyTo = dyn_cast<llvm::FixedVectorType>(eltType)) {
3864 if (
auto *VecTyFrom = dyn_cast<llvm::ScalableVectorType>(paramType)) {
3867 *
this, VecTyTo, VecTyFrom, elt, elt->getName());
3868 assert(Extracted &&
"Unexpected scalable to fixed vector coercion");
3871 Builder.CreateStore(elt, eltAddr);
3873 assert(argIndex == FirstIRArg + NumIRArgs);
3886 auto FnArgIter = Fn->arg_begin() + FirstIRArg;
3887 ExpandTypeFromArgs(Ty, LV, FnArgIter);
3888 assert(FnArgIter == Fn->arg_begin() + FirstIRArg + NumIRArgs);
3889 for (
unsigned i = 0, e = NumIRArgs; i != e; ++i) {
3890 auto AI = Fn->getArg(FirstIRArg + i);
3891 AI->setName(Arg->
getName() +
"." + Twine(i));
3897 auto *AI = Fn->getArg(FirstIRArg);
3898 AI->setName(Arg->
getName() +
".target_coerce");
3902 CGM.getABIInfo().createCoercedStore(AI, Ptr, ArgI,
false, *
this);
3916 assert(NumIRArgs == 0);
3929 if (
getTarget().getCXXABI().areArgsDestroyedLeftToRightInCallee()) {
3930 for (
int I = Args.size() - 1; I >= 0; --I)
3933 for (
unsigned I = 0, E = Args.size(); I != E; ++I)
3939 while (insn->use_empty()) {
3940 llvm::BitCastInst *bitcast = dyn_cast<llvm::BitCastInst>(insn);
3946 bitcast->eraseFromParent();
3952 llvm::Value *result) {
3954 llvm::BasicBlock *BB = CGF.
Builder.GetInsertBlock();
3957 if (&BB->back() != result)
3960 llvm::Type *resultType = result->getType();
3969 while (llvm::BitCastInst *bitcast = dyn_cast<llvm::BitCastInst>(generator)) {
3975 if (generator->getNextNode() != bitcast)
3978 InstsToKill.push_back(bitcast);
3985 llvm::CallInst *call = dyn_cast<llvm::CallInst>(generator);
3989 bool doRetainAutorelease;
3992 doRetainAutorelease =
true;
3993 }
else if (call->getCalledOperand() ==
3995 doRetainAutorelease =
false;
4003 llvm::Instruction *prev = call->getPrevNode();
4006 prev = prev->getPrevNode();
4012 InstsToKill.push_back(prev);
4018 result = call->getArgOperand(0);
4019 InstsToKill.push_back(call);
4023 while (llvm::BitCastInst *bitcast = dyn_cast<llvm::BitCastInst>(result)) {
4024 if (!bitcast->hasOneUse())
4026 InstsToKill.push_back(bitcast);
4027 result = bitcast->getOperand(0);
4031 for (
auto *I : InstsToKill)
4032 I->eraseFromParent();
4035 if (doRetainAutorelease)
4039 return CGF.
Builder.CreateBitCast(result, resultType);
4044 llvm::Value *result) {
4047 dyn_cast_or_null<ObjCMethodDecl>(CGF.
CurCodeDecl);
4056 llvm::CallInst *retainCall = dyn_cast<llvm::CallInst>(result);
4057 if (!retainCall || retainCall->getCalledOperand() !=
4062 llvm::Value *retainedValue = retainCall->getArgOperand(0);
4063 llvm::LoadInst *load =
4064 dyn_cast<llvm::LoadInst>(retainedValue->stripPointerCasts());
4065 if (!load || load->isAtomic() || load->isVolatile() ||
4072 llvm::Type *resultType = result->getType();
4074 assert(retainCall->use_empty());
4075 retainCall->eraseFromParent();
4078 return CGF.
Builder.CreateBitCast(load, resultType);
4085 llvm::Value *result) {
4108 auto GetStoreIfValid = [&CGF,
4109 ReturnValuePtr](llvm::User *
U) -> llvm::StoreInst * {
4110 auto *SI = dyn_cast<llvm::StoreInst>(
U);
4111 if (!SI || SI->getPointerOperand() != ReturnValuePtr ||
4117 assert(!SI->isAtomic() &&
4125 if (!ReturnValuePtr->hasOneUse()) {
4126 llvm::BasicBlock *IP = CGF.
Builder.GetInsertBlock();
4132 const llvm::Instruction *LoadIntoFakeUse =
nullptr;
4133 for (llvm::Instruction &I : llvm::reverse(*IP)) {
4137 if (LoadIntoFakeUse == &I)
4141 if (
auto *II = dyn_cast<llvm::IntrinsicInst>(&I)) {
4142 if (II->getIntrinsicID() == llvm::Intrinsic::lifetime_end)
4145 if (II->getIntrinsicID() == llvm::Intrinsic::fake_use) {
4146 LoadIntoFakeUse = dyn_cast<llvm::Instruction>(II->getArgOperand(0));
4150 return GetStoreIfValid(&I);
4155 llvm::StoreInst *store = GetStoreIfValid(ReturnValuePtr->user_back());
4161 llvm::BasicBlock *StoreBB = store->getParent();
4162 llvm::BasicBlock *IP = CGF.
Builder.GetInsertBlock();
4164 while (IP != StoreBB) {
4165 if (!SeenBBs.insert(IP).second || !(IP = IP->getSinglePredecessor()))
4181 int BitWidth,
int CharWidth) {
4182 assert(CharWidth <= 64);
4183 assert(
static_cast<unsigned>(BitWidth) <= Bits.size() * CharWidth);
4186 if (BitOffset >= CharWidth) {
4187 Pos += BitOffset / CharWidth;
4188 BitOffset = BitOffset % CharWidth;
4191 const uint64_t
Used = (uint64_t(1) << CharWidth) - 1;
4192 if (BitOffset + BitWidth >= CharWidth) {
4193 Bits[Pos++] |= (
Used << BitOffset) &
Used;
4194 BitWidth -= CharWidth - BitOffset;
4198 while (BitWidth >= CharWidth) {
4200 BitWidth -= CharWidth;
4204 Bits[Pos++] |= (
Used >> (CharWidth - BitWidth)) << BitOffset;
4212 int StorageSize,
int BitOffset,
int BitWidth,
4213 int CharWidth,
bool BigEndian) {
4216 setBitRange(TmpBits, BitOffset, BitWidth, CharWidth);
4219 std::reverse(TmpBits.begin(), TmpBits.end());
4221 for (uint64_t
V : TmpBits)
4222 Bits[StorageOffset++] |=
V;
4225static void setUsedBits(CodeGenModule &, QualType,
int,
4226 SmallVectorImpl<uint64_t> &);
4268 QualType ETy = Context.getBaseElementType(ATy);
4269 int Size = Context.getTypeSizeInChars(ETy).getQuantity();
4273 for (
int I = 0, N = Context.getConstantArrayElementCount(ATy); I < N; ++I) {
4274 auto Src = TmpBits.begin();
4275 auto Dst = Bits.begin() + Offset + I * Size;
4276 for (
int J = 0; J < Size; ++J)
4289 if (
const auto *ATy = Context.getAsConstantArrayType(QTy))
4292 int Size = Context.getTypeSizeInChars(QTy).getQuantity();
4296 std::fill_n(Bits.begin() + Offset, Size,
4297 (uint64_t(1) << Context.getCharWidth()) - 1);
4301 int Pos,
int Size,
int CharWidth,
4306 for (
auto P = Bits.begin() + Pos, E = Bits.begin() + Pos + Size; P != E;
4308 Mask = (Mask << CharWidth) | *P;
4310 auto P = Bits.begin() + Pos + Size, End = Bits.begin() + Pos;
4312 Mask = (Mask << CharWidth) | *--P;
4321 llvm::IntegerType *ITy,
4323 assert(Src->getType() == ITy);
4324 assert(ITy->getScalarSizeInBits() <= 64);
4326 const llvm::DataLayout &DataLayout =
CGM.getDataLayout();
4327 int Size = DataLayout.getTypeStoreSize(ITy);
4331 int CharWidth =
CGM.getContext().getCharWidth();
4335 return Builder.CreateAnd(Src, Mask,
"cmse.clear");
4341 llvm::ArrayType *ATy,
4343 const llvm::DataLayout &DataLayout =
CGM.getDataLayout();
4344 int Size = DataLayout.getTypeStoreSize(ATy);
4349 int CharWidth =
CGM.getContext().getCharWidth();
4351 ATy->getArrayElementType()->getScalarSizeInBits() / CharWidth;
4353 llvm::Value *R = llvm::PoisonValue::get(ATy);
4354 for (
int I = 0, N = ATy->getArrayNumElements(); I != N; ++I) {
4356 DataLayout.isBigEndian());
4357 MaskIndex += CharsPerElt;
4358 llvm::Value *T0 =
Builder.CreateExtractValue(Src, I);
4359 llvm::Value *T1 =
Builder.CreateAnd(T0, Mask,
"cmse.clear");
4360 R =
Builder.CreateInsertValue(R, T1, I);
4368 uint64_t RetKeyInstructionsSourceAtom) {
4383 auto *I =
Builder.CreateRetVoid();
4384 if (RetKeyInstructionsSourceAtom)
4391 llvm::DebugLoc RetDbgLoc;
4392 llvm::Value *RV =
nullptr;
4402 llvm::Function::arg_iterator EI =
CurFn->arg_end();
4404 llvm::Value *ArgStruct = &*EI;
4405 llvm::Value *SRet =
Builder.CreateStructGEP(
4414 auto AI =
CurFn->arg_begin();
4432 CGM.getNaturalTypeAlignment(RetTy, &BaseInfo, &TBAAInfo);
4459 RetDbgLoc = SI->getDebugLoc();
4461 RV = SI->getValueOperand();
4462 SI->eraseFromParent();
4485 if (
auto *FD = dyn_cast<FunctionDecl>(
CurCodeDecl))
4486 RT = FD->getReturnType();
4487 else if (
auto *MD = dyn_cast<ObjCMethodDecl>(
CurCodeDecl))
4488 RT = MD->getReturnType();
4490 RT =
BlockInfo->BlockExpression->getFunctionType()->getReturnType();
4492 llvm_unreachable(
"Unexpected function/method type");
4508 auto *unpaddedStruct = dyn_cast<llvm::StructType>(unpaddedCoercionType);
4513 unsigned unpaddedIndex = 0;
4514 for (
unsigned i = 0, e = coercionType->getNumElements(); i != e; ++i) {
4515 auto coercedEltType = coercionType->getElementType(i);
4519 auto eltAddr =
Builder.CreateStructGEP(addr, i);
4522 unpaddedStruct ? unpaddedStruct->getElementType(unpaddedIndex++)
4523 : unpaddedCoercionType,
4525 results.push_back(elt);
4529 if (results.size() == 1) {
4537 RV = llvm::PoisonValue::get(returnType);
4538 for (
unsigned i = 0, e = results.size(); i != e; ++i) {
4539 RV =
Builder.CreateInsertValue(RV, results[i], i);
4546 RV =
CGM.getABIInfo().createCoercedLoad(
V, RetAI, *
this);
4551 llvm_unreachable(
"Invalid ABI kind for return argument");
4554 llvm::Instruction *Ret;
4560 auto *ITy = dyn_cast<llvm::IntegerType>(RV->getType());
4567 Ret =
Builder.CreateRetVoid();
4571 Ret->setDebugLoc(std::move(RetDbgLoc));
4573 llvm::Value *Backup = RV ? Ret->getOperand(0) :
nullptr;
4574 if (RetKeyInstructionsSourceAtom)
4590 ReturnsNonNullAttr *RetNNAttr =
nullptr;
4591 if (
SanOpts.has(SanitizerKind::ReturnsNonnullAttribute))
4592 RetNNAttr =
CurCodeDecl->getAttr<ReturnsNonNullAttr>();
4594 if (!RetNNAttr && !requiresReturnValueNullabilityCheck())
4602 assert(!requiresReturnValueNullabilityCheck() &&
4603 "Cannot check nullability and the nonnull attribute");
4604 AttrLoc = RetNNAttr->getLocation();
4605 CheckKind = SanitizerKind::SO_ReturnsNonnullAttribute;
4606 Handler = SanitizerHandler::NonnullReturn;
4608 if (
auto *DD = dyn_cast<DeclaratorDecl>(
CurCodeDecl))
4609 if (
auto *TSI = DD->getTypeSourceInfo())
4611 AttrLoc = FTL.getReturnLoc().findNullabilityLoc();
4612 CheckKind = SanitizerKind::SO_NullabilityReturn;
4613 Handler = SanitizerHandler::NullabilityReturn;
4622 llvm::Value *SLocPtr =
Builder.CreateLoad(ReturnLocation,
"return.sloc.load");
4623 llvm::Value *CanNullCheck =
Builder.CreateIsNotNull(SLocPtr);
4624 if (requiresReturnValueNullabilityCheck())
4626 Builder.CreateAnd(CanNullCheck, RetValNullabilityPrecondition);
4627 Builder.CreateCondBr(CanNullCheck, Check, NoCheck);
4633 llvm::Value *DynamicData[] = {SLocPtr};
4634 EmitCheck(std::make_pair(
Cond, CheckKind), Handler, StaticData, DynamicData);
4653 llvm::Type *IRPtrTy = llvm::PointerType::getUnqual(CGF.
getLLVMContext());
4654 llvm::Value *Placeholder = llvm::PoisonValue::get(IRPtrTy);
4679 if (
type->isReferenceType()) {
4688 param->
hasAttr<NSConsumedAttr>() &&
type->isObjCRetainableType()) {
4689 llvm::Value *ptr =
Builder.CreateLoad(local);
4692 Builder.CreateStore(null, local);
4703 type->castAsRecordDecl()->isParamDestroyedInCallee() &&
4707 assert(cleanup.isValid() &&
4708 "cleanup for callee-destructed param not recorded");
4710 llvm::Instruction *isActive =
Builder.CreateUnreachable();
4716 return llvm::isa_and_nonnull<llvm::ConstantPointerNull>(addr);
4726 const LValue &srcLV = writeback.
Source;
4727 Address srcAddr = srcLV.getAddress();
4729 "shouldn't have writeback for provably null argument");
4737 llvm::BasicBlock *contBB =
nullptr;
4743 if (!provablyNonNull) {
4748 CGF.
Builder.CreateCondBr(isNull, contBB, writebackBB);
4757 "icr.writeback-cast");
4766 if (writeback.
ToUse) {
4791 if (!provablyNonNull)
4800 for (
const auto &I : llvm::reverse(Cleanups)) {
4802 I.IsActiveIP->eraseFromParent();
4808 if (uop->getOpcode() == UO_AddrOf)
4809 return uop->getSubExpr();
4834 Address srcAddr = srcLV.getAddress();
4839 llvm::PointerType *destType =
4841 llvm::Type *destElemType =
4868 llvm::BasicBlock *contBB =
nullptr;
4869 llvm::BasicBlock *originBB =
nullptr;
4872 llvm::Value *finalArgument;
4876 if (provablyNonNull) {
4881 finalArgument = CGF.
Builder.CreateSelect(
4882 isNull, llvm::ConstantPointerNull::get(destType),
4888 originBB = CGF.
Builder.GetInsertBlock();
4891 CGF.
Builder.CreateCondBr(isNull, contBB, copyBB);
4893 condEval.
begin(CGF);
4897 llvm::Value *valueToUse =
nullptr;
4905 src = CGF.
Builder.CreateBitCast(src, destElemType,
"icr.cast");
4922 if (shouldCopy && !provablyNonNull) {
4923 llvm::BasicBlock *copyBB = CGF.
Builder.GetInsertBlock();
4928 llvm::PHINode *phiToUse =
4929 CGF.
Builder.CreatePHI(valueToUse->getType(), 2,
"icr.to-use");
4930 phiToUse->addIncoming(valueToUse, copyBB);
4931 phiToUse->addIncoming(llvm::PoisonValue::get(valueToUse->getType()),
4933 valueToUse = phiToUse;
4947 StackBase = CGF.
Builder.CreateStackSave(
"inalloca.save");
4953 CGF.
Builder.CreateStackRestore(StackBase);
4960 if (!AC.
getDecl() || !(
SanOpts.has(SanitizerKind::NonnullAttribute) ||
4961 SanOpts.has(SanitizerKind::NullabilityArg)))
4966 unsigned ArgNo = PVD ? PVD->getFunctionScopeIndex() : ParmNum;
4969 const NonNullAttr *NNAttr =
nullptr;
4970 if (
SanOpts.has(SanitizerKind::NonnullAttribute))
4973 bool CanCheckNullability =
false;
4974 if (
SanOpts.has(SanitizerKind::NullabilityArg) && !NNAttr && PVD &&
4975 !PVD->getType()->isRecordType()) {
4976 auto Nullability = PVD->getType()->getNullability();
4977 CanCheckNullability = Nullability &&
4979 PVD->getTypeSourceInfo();
4982 if (!NNAttr && !CanCheckNullability)
4989 AttrLoc = NNAttr->getLocation();
4990 CheckKind = SanitizerKind::SO_NonnullAttribute;
4991 Handler = SanitizerHandler::NonnullArg;
4993 AttrLoc = PVD->getTypeSourceInfo()->getTypeLoc().findNullabilityLoc();
4994 CheckKind = SanitizerKind::SO_NullabilityArg;
4995 Handler = SanitizerHandler::NullabilityArg;
5000 llvm::Constant *StaticData[] = {
5003 llvm::ConstantInt::get(
Int32Ty, ArgNo + 1),
5005 EmitCheck(std::make_pair(
Cond, CheckKind), Handler, StaticData, {});
5011 if (!AC.
getDecl() || !(
SanOpts.has(SanitizerKind::NonnullAttribute) ||
5012 SanOpts.has(SanitizerKind::NullabilityArg)))
5031 return llvm::any_of(ArgTypes, [&](
QualType Ty) {
5042 return classDecl->getTypeParamListAsWritten();
5046 return catDecl->getTypeParamList();
5056 llvm::iterator_range<CallExpr::const_arg_iterator> ArgRange,
5060 assert((ParamsToSkip == 0 ||
Prototype.P) &&
5061 "Can't skip parameters if type info is not provided");
5071 bool IsVariadic =
false;
5073 const auto *MD = dyn_cast<const ObjCMethodDecl *>(
Prototype.P);
5075 IsVariadic = MD->isVariadic();
5077 MD,
CGM.getTarget().getTriple().isOSWindows());
5078 ArgTypes.assign(MD->param_type_begin() + ParamsToSkip,
5079 MD->param_type_end());
5082 IsVariadic = FPT->isVariadic();
5083 ExplicitCC = FPT->getExtInfo().getCC();
5084 ArgTypes.assign(FPT->param_type_begin() + ParamsToSkip,
5085 FPT->param_type_end());
5093 assert(Arg != ArgRange.end() &&
"Running over edge of argument list!");
5095 QualType ArgTy = (*Arg)->getType();
5096 if (
const auto *OBT = ParamTy->
getAs<OverflowBehaviorType>())
5097 ParamTy = OBT->getUnderlyingType();
5098 if (
const auto *OBT = ArgTy->
getAs<OverflowBehaviorType>())
5099 ArgTy = OBT->getUnderlyingType();
5102 getContext().getCanonicalType(ParamTy).getTypePtr() ==
5103 getContext().getCanonicalType(ArgTy).getTypePtr()) &&
5104 "type mismatch in call argument!");
5110 assert((Arg == ArgRange.end() || IsVariadic) &&
5111 "Extra arguments in non-variadic function!");
5116 for (
auto *A : llvm::drop_begin(ArgRange, ArgTypes.size()))
5117 ArgTypes.push_back(IsVariadic ? getVarArgType(A) : A->getType());
5118 assert((
int)ArgTypes.size() == (ArgRange.end() - ArgRange.begin()));
5126 CGM.getTarget().getCXXABI().areArgsDestroyedLeftToRightInCallee()
5130 auto MaybeEmitImplicitObjectSize = [&](
unsigned I,
const Expr *Arg,
5139 auto SizeTy = Context.getSizeType();
5141 assert(EmittedArg.getScalarVal() &&
"We emitted nothing for the arg?");
5142 llvm::Value *
V = evaluateOrEmitBuiltinObjectSize(
5143 Arg, PS->getType(),
T, EmittedArg.getScalarVal(), PS->isDynamic());
5148 std::swap(Args.back(), *(&Args.back() - 1));
5154 "inalloca only supported on x86");
5159 size_t CallArgsStart = Args.size();
5160 for (
unsigned I = 0, E = ArgTypes.size(); I != E; ++I) {
5161 unsigned Idx = LeftToRight ? I : E - I - 1;
5163 unsigned InitialArgSize = Args.size();
5167 getContext().hasSameUnqualifiedType((*Arg)->getType(),
5171 "Argument and parameter types don't match");
5175 assert(InitialArgSize + 1 == Args.size() &&
5176 "The code below depends on only adding one arg per EmitCallArg");
5177 (void)InitialArgSize;
5180 if (!Args.back().hasLValue()) {
5181 RValue RVArg = Args.back().getKnownRValue();
5183 ParamsToSkip + Idx);
5187 MaybeEmitImplicitObjectSize(Idx, *Arg, RVArg);
5194 std::reverse(Args.begin() + CallArgsStart, Args.end());
5203struct DestroyUnpassedArg final : EHScopeStack::Cleanup {
5213 assert(!Dtor->isTrivial());
5236 if (!HasLV &&
RV.isScalar())
5238 else if (!HasLV &&
RV.isComplex())
5241 auto Addr = HasLV ?
LV.getAddress() :
RV.getAggregateAddress();
5245 HasLV ?
LV.isVolatileQualified()
5246 :
RV.isVolatileQualified());
5258 std::optional<DisableDebugLocationUpdates> Dis;
5262 dyn_cast<ObjCIndirectCopyRestoreExpr>(E)) {
5276 "reference binding to unmaterialized r-value!");
5288 if (
type->isRecordType() &&
5289 type->castAsRecordDecl()->isParamDestroyedInCallee()) {
5296 bool DestroyedInCallee =
true, NeedsCleanup =
true;
5297 if (
const auto *RD =
type->getAsCXXRecordDecl())
5298 DestroyedInCallee = RD->hasNonTrivialDestructor();
5300 NeedsCleanup =
type.isDestructedType();
5302 if (DestroyedInCallee)
5309 if (DestroyedInCallee && NeedsCleanup) {
5316 llvm::Instruction *IsActive =
5323 if (HasAggregateEvalKind) {
5324 auto *ICE = dyn_cast<ImplicitCastExpr>(E);
5325 if (ICE && ICE->getCastKind() == CK_LValueToRValue &&
5326 ICE->getSubExpr()->getType().getAddressSpace() !=
5328 !
type->isArrayParameterType() && !
type.isNonTrivialToPrimitiveCopy()) {
5339QualType CodeGenFunction::getVarArgType(
const Expr *Arg) {
5343 if (!getTarget().
getTriple().isOSWindows())
5347 getContext().getTypeSize(Arg->
getType()) <
5351 return getContext().getIntPtrType();
5359void CodeGenFunction::AddObjCARCExceptionMetadata(llvm::Instruction *Inst) {
5360 if (CGM.getCodeGenOpts().OptimizationLevel != 0 &&
5361 !CGM.getCodeGenOpts().ObjCAutoRefCountExceptions)
5362 Inst->setMetadata(
"clang.arc.no_objc_arc_exceptions",
5363 CGM.getNoObjCARCExceptionsMetadata());
5369 const llvm::Twine &name) {
5370 return EmitNounwindRuntimeCall(callee, ArrayRef<llvm::Value *>(), name);
5376 ArrayRef<Address> args,
5377 const llvm::Twine &name) {
5378 SmallVector<llvm::Value *, 3> values;
5379 for (
auto arg : args)
5380 values.push_back(
arg.emitRawPointer(*
this));
5381 return EmitNounwindRuntimeCall(callee, values, name);
5386 ArrayRef<llvm::Value *> args,
5387 const llvm::Twine &name) {
5388 llvm::CallInst *call = EmitRuntimeCall(callee, args, name);
5389 call->setDoesNotThrow();
5396 const llvm::Twine &name) {
5397 return EmitRuntimeCall(callee, {},
name);
5402SmallVector<llvm::OperandBundleDef, 1>
5411 if (
auto *CalleeFn = dyn_cast<llvm::Function>(Callee->stripPointerCasts())) {
5412 if (CalleeFn->isIntrinsic() && CalleeFn->doesNotThrow()) {
5413 auto IID = CalleeFn->getIntrinsicID();
5414 if (!llvm::IntrinsicInst::mayLowerToFunctionCall(IID))
5427 const llvm::Twine &name) {
5428 llvm::CallInst *call = Builder.CreateCall(
5429 callee, args, getBundlesForFunclet(callee.getCallee()), name);
5430 call->setCallingConv(getRuntimeCC());
5432 if (CGM.shouldEmitConvergenceTokens() && call->isConvergent())
5438 const llvm::Twine &Name) {
5439 return EmitIntrinsicCall(ID, {}, {}, Name);
5443 ArrayRef<llvm::Value *> Args,
5444 const llvm::Twine &Name) {
5445 return EmitIntrinsicCall(ID, {}, Args, Name);
5449 ArrayRef<llvm::Type *> Types,
5450 ArrayRef<llvm::Value *> Args,
5451 const llvm::Twine &Name) {
5453 llvm::Intrinsic::getOrInsertDeclaration(&CGM.getModule(), ID, Types);
5454 llvm::CallInst *
Call =
5455 Builder.CreateCall(F, Args, getBundlesForFunclet(F), Name);
5456 if (CGM.shouldEmitConvergenceTokens() &&
Call->isConvergent())
5468 llvm::InvokeInst *invoke =
Builder.CreateInvoke(
5470 invoke->setDoesNotReturn();
5473 llvm::CallInst *call =
Builder.CreateCall(callee, args, BundleList);
5474 call->setDoesNotReturn();
5483 const Twine &name) {
5491 const Twine &name) {
5501 const Twine &Name) {
5506 llvm::CallBase *Inst;
5508 Inst =
Builder.CreateCall(Callee, Args, BundleList, Name);
5511 Inst =
Builder.CreateInvoke(Callee, ContBB, InvokeDest, Args, BundleList,
5518 if (
CGM.getLangOpts().ObjCAutoRefCount)
5519 AddObjCARCExceptionMetadata(Inst);
5524void CodeGenFunction::deferPlaceholderReplacement(llvm::Instruction *Old,
5526 DeferredReplacements.push_back(
5527 std::make_pair(llvm::WeakTrackingVH(Old),
New));
5534[[nodiscard]] llvm::AttributeList
5535maybeRaiseRetAlignmentAttribute(llvm::LLVMContext &Ctx,
5536 const llvm::AttributeList &Attrs,
5537 llvm::Align NewAlign) {
5538 llvm::Align CurAlign = Attrs.getRetAlignment().valueOrOne();
5539 if (CurAlign >= NewAlign)
5541 llvm::Attribute AlignAttr = llvm::Attribute::getWithAlignment(Ctx, NewAlign);
5542 return Attrs.removeRetAttribute(Ctx, llvm::Attribute::AttrKind::Alignment)
5543 .addRetAttribute(Ctx, AlignAttr);
5546template <
typename AlignedAttrTy>
class AbstractAssumeAlignedAttrEmitter {
5551 const AlignedAttrTy *AA =
nullptr;
5553 llvm::Value *Alignment =
nullptr;
5554 llvm::ConstantInt *OffsetCI =
nullptr;
5560 AA = FuncDecl->
getAttr<AlignedAttrTy>();
5565 [[nodiscard]] llvm::AttributeList
5566 TryEmitAsCallSiteAttribute(
const llvm::AttributeList &Attrs) {
5567 if (!AA || OffsetCI || CGF.
SanOpts.
has(SanitizerKind::Alignment))
5569 const auto *AlignmentCI = dyn_cast<llvm::ConstantInt>(Alignment);
5574 if (!AlignmentCI->getValue().isPowerOf2())
5576 llvm::AttributeList NewAttrs = maybeRaiseRetAlignmentAttribute(
5579 AlignmentCI->getLimitedValue(llvm::Value::MaximumAlignment)));
5587 void EmitAsAnAssumption(SourceLocation Loc, QualType RetTy, RValue &Ret) {
5591 AA->getLocation(), Alignment, OffsetCI);
5597class AssumeAlignedAttrEmitter final
5598 :
public AbstractAssumeAlignedAttrEmitter<AssumeAlignedAttr> {
5600 AssumeAlignedAttrEmitter(CodeGenFunction &CGF_,
const Decl *FuncDecl)
5601 : AbstractAssumeAlignedAttrEmitter(CGF_, FuncDecl) {
5606 if (Expr *Offset = AA->getOffset()) {
5608 if (OffsetCI->isNullValue())
5615class AllocAlignAttrEmitter final
5616 :
public AbstractAssumeAlignedAttrEmitter<AllocAlignAttr> {
5618 AllocAlignAttrEmitter(CodeGenFunction &CGF_,
const Decl *FuncDecl,
5619 const CallArgList &CallArgs)
5620 : AbstractAssumeAlignedAttrEmitter(CGF_, FuncDecl) {
5624 Alignment = CallArgs[AA->getParamIndex().getLLVMIndex()]
5633 if (
auto *VT = dyn_cast<llvm::VectorType>(Ty))
5634 return VT->getPrimitiveSizeInBits().getKnownMinValue();
5635 if (
auto *AT = dyn_cast<llvm::ArrayType>(Ty))
5638 unsigned MaxVectorWidth = 0;
5639 if (
auto *ST = dyn_cast<llvm::StructType>(Ty))
5640 for (
auto *I : ST->elements())
5642 return MaxVectorWidth;
5649 llvm::CallBase **callOrInvoke,
bool IsMustTail,
5651 bool IsVirtualFunctionPointerThunk) {
5654 assert(Callee.isOrdinary() || Callee.isVirtual());
5661 llvm::FunctionType *IRFuncTy =
getTypes().GetFunctionType(CallInfo);
5663 const Decl *TargetDecl = Callee.getAbstractInfo().getCalleeDecl().getDecl();
5664 if (
const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl)) {
5671 if ((TargetDecl->
hasAttr<AlwaysInlineAttr>() &&
5672 (TargetDecl->
hasAttr<TargetAttr>() ||
5676 TargetDecl->
hasAttr<TargetAttr>())))
5683 const FunctionDecl *CalleeDecl = dyn_cast_or_null<FunctionDecl>(TargetDecl);
5684 CGM.getTargetCodeGenInfo().checkFunctionCallABI(
CGM, Loc, CallerDecl,
5685 CalleeDecl, CallArgs, RetTy);
5692 if (llvm::StructType *ArgStruct = CallInfo.
getArgStruct()) {
5693 const llvm::DataLayout &DL =
CGM.getDataLayout();
5695 llvm::AllocaInst *AI;
5697 IP = IP->getNextNode();
5698 AI =
new llvm::AllocaInst(ArgStruct, DL.getAllocaAddrSpace(),
"argmem",
5704 AI->setAlignment(Align.getAsAlign());
5705 AI->setUsedWithInAlloca(
true);
5706 assert(AI->isUsedWithInAlloca() && !AI->isStaticAlloca());
5707 ArgMemory =
RawAddress(AI, ArgStruct, Align);
5710 ClangToLLVMArgMapping IRFunctionArgs(
CGM.getContext(), CallInfo);
5718 bool NeedSRetLifetimeEnd =
false;
5724 if ((IsVirtualFunctionPointerThunk || IsMustTail) && RetAI.
isIndirect()) {
5726 IRFunctionArgs.getSRetArgNo(),
5734 if (NeedSRetLifetimeEnd)
5735 SRetAlloca = SRetPtr;
5738 if (IRFunctionArgs.hasSRetArg()) {
5751 IRCallArgs[IRFunctionArgs.getSRetArgNo()] =
5769 assert(CallInfo.
arg_size() == CallArgs.size() &&
5770 "Mismatch between function signature & arguments.");
5773 for (CallArgList::const_iterator I = CallArgs.begin(), E = CallArgs.end();
5774 I != E; ++I, ++info_it, ++ArgNo) {
5778 if (IRFunctionArgs.hasPaddingArg(ArgNo))
5779 IRCallArgs[IRFunctionArgs.getPaddingArgNo(ArgNo)] =
5782 unsigned FirstIRArg, NumIRArgs;
5783 std::tie(FirstIRArg, NumIRArgs) = IRFunctionArgs.getIRArgs(ArgNo);
5785 bool ArgHasMaybeUndefAttr =
5790 assert(NumIRArgs == 0);
5792 if (I->isAggregate()) {
5794 ? I->getKnownLValue().getAddress()
5795 : I->getKnownRValue().getAggregateAddress();
5796 llvm::Instruction *Placeholder =
5801 CGBuilderTy::InsertPoint IP =
Builder.saveIP();
5802 Builder.SetInsertPoint(Placeholder);
5816 deferPlaceholderReplacement(Placeholder,
Addr.getPointer());
5821 I->Ty,
getContext().getTypeAlignInChars(I->Ty),
5822 "indirect-arg-temp");
5823 I->copyInto(*
this,
Addr);
5832 I->copyInto(*
this,
Addr);
5839 assert(NumIRArgs == 1);
5840 if (I->isAggregate()) {
5850 ? I->getKnownLValue().getAddress()
5851 : I->getKnownRValue().getAggregateAddress();
5853 const llvm::DataLayout *TD = &
CGM.getDataLayout();
5855 assert((FirstIRArg >= IRFuncTy->getNumParams() ||
5856 IRFuncTy->getParamType(FirstIRArg)->getPointerAddressSpace() ==
5857 TD->getAllocaAddrSpace()) &&
5858 "indirect argument must be in alloca address space");
5860 bool NeedCopy =
false;
5861 if (
Addr.getAlignment() < Align &&
5862 llvm::getOrEnforceKnownAlignment(
Addr.emitRawPointer(*
this),
5866 }
else if (I->hasLValue()) {
5867 auto LV = I->getKnownLValue();
5872 if (!isByValOrRef ||
5873 (LV.getAlignment() <
getContext().getTypeAlignInChars(I->Ty))) {
5877 if (isByValOrRef &&
Addr.getType()->getAddressSpace() !=
5886 auto *
T = llvm::PointerType::get(
CGM.getLLVMContext(),
5894 if (ArgHasMaybeUndefAttr)
5895 Val =
Builder.CreateFreeze(Val);
5896 IRCallArgs[FirstIRArg] = Val;
5899 }
else if (I->getType()->isArrayParameterType()) {
5905 IRCallArgs[FirstIRArg] = I->getKnownRValue().getScalarVal();
5914 if (ArgHasMaybeUndefAttr)
5915 Val =
Builder.CreateFreeze(Val);
5916 IRCallArgs[FirstIRArg] = Val;
5921 CallLifetimeEndAfterCall.emplace_back(AI);
5924 I->copyInto(*
this, AI);
5929 assert(NumIRArgs == 0);
5937 assert(NumIRArgs == 1);
5939 if (!I->isAggregate())
5940 V = I->getKnownRValue().getScalarVal();
5943 I->hasLValue() ? I->getKnownLValue().getAddress()
5944 : I->getKnownRValue().getAggregateAddress());
5950 assert(!swiftErrorTemp.
isValid() &&
"multiple swifterror args");
5954 V, pointeeTy,
getContext().getTypeAlignInChars(pointeeTy));
5961 llvm::Value *errorValue =
Builder.CreateLoad(swiftErrorArg);
5962 Builder.CreateStore(errorValue, swiftErrorTemp);
5967 V->getType()->isIntegerTy())
5974 if (FirstIRArg < IRFuncTy->getNumParams() &&
5975 V->getType() != IRFuncTy->getParamType(FirstIRArg)) {
5976 assert(
V->getType()->isPointerTy() &&
"Only pointers can mismatch!");
5980 if (ArgHasMaybeUndefAttr)
5982 IRCallArgs[FirstIRArg] =
V;
5986 llvm::StructType *STy =
5991 if (!I->isAggregate()) {
5993 I->copyInto(*
this, Src);
5995 Src = I->hasLValue() ? I->getKnownLValue().getAddress()
5996 : I->getKnownRValue().getAggregateAddress();
6006 llvm::TypeSize SrcTypeSize =
6007 CGM.getDataLayout().getTypeAllocSize(SrcTy);
6008 llvm::TypeSize DstTypeSize =
CGM.getDataLayout().getTypeAllocSize(STy);
6009 if (SrcTypeSize.isScalable()) {
6010 assert(STy->containsHomogeneousScalableVectorTypes() &&
6011 "ABI only supports structure with homogeneous scalable vector "
6013 assert(SrcTypeSize == DstTypeSize &&
6014 "Only allow non-fractional movement of structure with "
6015 "homogeneous scalable vector type");
6016 assert(NumIRArgs == STy->getNumElements());
6018 llvm::Value *StoredStructValue =
6020 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
6021 llvm::Value *Extract =
Builder.CreateExtractValue(
6022 StoredStructValue, i, Src.
getName() +
".extract" + Twine(i));
6023 IRCallArgs[FirstIRArg + i] = Extract;
6026 uint64_t SrcSize = SrcTypeSize.getFixedValue();
6027 uint64_t DstSize = DstTypeSize.getFixedValue();
6028 bool HasPFPFields =
getContext().hasPFPFields(I->Ty);
6034 if (HasPFPFields || SrcSize < DstSize) {
6045 Builder.CreateMemCpy(TempAlloca, Src, SrcSize);
6051 assert(NumIRArgs == STy->getNumElements());
6052 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
6054 llvm::Value *LI =
Builder.CreateLoad(EltPtr);
6055 if (ArgHasMaybeUndefAttr)
6056 LI =
Builder.CreateFreeze(LI);
6057 IRCallArgs[FirstIRArg + i] = LI;
6062 assert(NumIRArgs == 1);
6070 auto *ATy = dyn_cast<llvm::ArrayType>(Load->getType());
6075 if (ArgHasMaybeUndefAttr)
6076 Load =
Builder.CreateFreeze(Load);
6077 IRCallArgs[FirstIRArg] = Load;
6085 auto layout =
CGM.getDataLayout().getStructLayout(coercionType);
6087 auto *unpaddedStruct = dyn_cast<llvm::StructType>(unpaddedCoercionType);
6091 bool NeedLifetimeEnd =
false;
6092 if (I->isAggregate()) {
6093 addr = I->hasLValue() ? I->getKnownLValue().getAddress()
6094 : I->getKnownRValue().getAggregateAddress();
6097 RValue RV = I->getKnownRValue();
6101 auto scalarAlign =
CGM.getDataLayout().getPrefTypeAlign(scalarType);
6106 layout->getAlignment(), scalarAlign)),
6108 nullptr, &AllocaAddr);
6116 unsigned IRArgPos = FirstIRArg;
6117 unsigned unpaddedIndex = 0;
6118 for (
unsigned i = 0, e = coercionType->getNumElements(); i != e; ++i) {
6119 llvm::Type *eltType = coercionType->getElementType(i);
6126 : unpaddedCoercionType,
6128 if (ArgHasMaybeUndefAttr)
6129 elt =
Builder.CreateFreeze(elt);
6130 IRCallArgs[IRArgPos++] = elt;
6132 assert(IRArgPos == FirstIRArg + NumIRArgs);
6134 if (NeedLifetimeEnd)
6140 unsigned IRArgPos = FirstIRArg;
6141 ExpandTypeToArgs(I->Ty, *I, IRFuncTy, IRCallArgs, IRArgPos);
6142 assert(IRArgPos == FirstIRArg + NumIRArgs);
6148 if (!I->isAggregate()) {
6150 I->copyInto(*
this, Src);
6152 Src = I->hasLValue() ? I->getKnownLValue().getAddress()
6153 : I->getKnownRValue().getAggregateAddress();
6159 CGM.getABIInfo().createCoercedLoad(Src, ArgInfo, *
this);
6160 IRCallArgs[FirstIRArg] = Load;
6166 const CGCallee &ConcreteCallee = Callee.prepareConcreteCallee(*
this);
6172 assert(IRFunctionArgs.hasInallocaArg());
6173 IRCallArgs[IRFunctionArgs.getInallocaArgNo()] = Arg;
6184 auto simplifyVariadicCallee = [](llvm::FunctionType *CalleeFT,
6185 llvm::Value *Ptr) -> llvm::Function * {
6186 if (!CalleeFT->isVarArg())
6190 if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(Ptr)) {
6191 if (CE->getOpcode() == llvm::Instruction::BitCast)
6192 Ptr = CE->getOperand(0);
6195 llvm::Function *OrigFn = dyn_cast<llvm::Function>(Ptr);
6199 llvm::FunctionType *OrigFT = OrigFn->getFunctionType();
6203 if (OrigFT->isVarArg() ||
6204 OrigFT->getNumParams() != CalleeFT->getNumParams() ||
6205 OrigFT->getReturnType() != CalleeFT->getReturnType())
6208 for (
unsigned i = 0, e = OrigFT->getNumParams(); i != e; ++i)
6209 if (OrigFT->getParamType(i) != CalleeFT->getParamType(i))
6215 if (llvm::Function *OrigFn = simplifyVariadicCallee(IRFuncTy, CalleePtr)) {
6217 IRFuncTy = OrigFn->getFunctionType();
6228 for (
unsigned i = 0; i < IRCallArgs.size(); ++i)
6229 LargestVectorWidth = std::max(LargestVectorWidth,
6234 llvm::AttributeList Attrs;
6235 CGM.ConstructAttributeList(CalleePtr->getName(), CallInfo,
6240 if (
CallingConv == llvm::CallingConv::X86_VectorCall &&
6242 CGM.Error(Loc,
"__vectorcall calling convention is not currently "
6247 if (FD->hasAttr<StrictFPAttr>())
6249 Attrs = Attrs.addFnAttribute(
getLLVMContext(), llvm::Attribute::StrictFP);
6254 if (FD->hasAttr<OptimizeNoneAttr>() &&
getLangOpts().FastMath)
6255 CGM.AdjustMemoryAttribute(CalleePtr->getName(), Callee.getAbstractInfo(),
6260 Attrs = Attrs.addFnAttribute(
getLLVMContext(), llvm::Attribute::NoMerge);
6264 Attrs = Attrs.addFnAttribute(
getLLVMContext(), llvm::Attribute::NoInline);
6269 !
CGM.getTargetCodeGenInfo().wouldInliningViolateFunctionCallABI(
6270 CallerDecl, CalleeDecl))
6272 Attrs.addFnAttribute(
getLLVMContext(), llvm::Attribute::AlwaysInline);
6277 Attrs.removeFnAttribute(
getLLVMContext(), llvm::Attribute::Convergent);
6286 !(TargetDecl && TargetDecl->
hasAttr<NoInlineAttr>()) &&
6287 !
CGM.getTargetCodeGenInfo().wouldInliningViolateFunctionCallABI(
6288 CallerDecl, CalleeDecl)) {
6290 Attrs.addFnAttribute(
getLLVMContext(), llvm::Attribute::AlwaysInline);
6295 Attrs = Attrs.addFnAttribute(
getLLVMContext(), llvm::Attribute::NoInline);
6302 CannotThrow =
false;
6311 CannotThrow = Attrs.hasFnAttr(llvm::Attribute::NoUnwind);
6313 if (
auto *FPtr = dyn_cast<llvm::Function>(CalleePtr))
6314 if (FPtr->hasFnAttribute(llvm::Attribute::NoUnwind))
6325 if (NeedSRetLifetimeEnd)
6333 if (
SanOpts.has(SanitizerKind::KCFI) &&
6334 !isa_and_nonnull<FunctionDecl>(TargetDecl))
6341 if (FD->hasAttr<StrictFPAttr>())
6343 Attrs = Attrs.addFnAttribute(
getLLVMContext(), llvm::Attribute::StrictFP);
6345 AssumeAlignedAttrEmitter AssumeAlignedAttrEmitter(*
this, TargetDecl);
6346 Attrs = AssumeAlignedAttrEmitter.TryEmitAsCallSiteAttribute(Attrs);
6348 AllocAlignAttrEmitter AllocAlignAttrEmitter(*
this, TargetDecl, CallArgs);
6349 Attrs = AllocAlignAttrEmitter.TryEmitAsCallSiteAttribute(Attrs);
6354 CI =
Builder.CreateCall(IRFuncTy, CalleePtr, IRCallArgs, BundleList);
6357 CI =
Builder.CreateInvoke(IRFuncTy, CalleePtr, Cont, InvokeDest, IRCallArgs,
6361 if (CI->getCalledFunction() && CI->getCalledFunction()->hasName() &&
6362 CI->getCalledFunction()->getName().starts_with(
"_Z4sqrt")) {
6367 if (
CGM.getCodeGenOpts().CallGraphSection) {
6371 else if (
const auto *FPT =
6372 Callee.getAbstractInfo().getCalleeFunctionProtoType())
6376 "Cannot find the callee type to generate callee_type metadata.");
6380 CGM.createCalleeTypeMetadataForIcall(CST, *callOrInvoke);
6387 if (
const auto *FD = dyn_cast_or_null<FunctionDecl>(
CurFuncDecl)) {
6388 if (
const auto *A = FD->getAttr<CFGuardAttr>()) {
6389 if (A->getGuard() == CFGuardAttr::GuardArg::nocf &&
6390 !CI->getCalledFunction())
6396 CI->setAttributes(Attrs);
6397 CI->setCallingConv(
static_cast<llvm::CallingConv::ID
>(
CallingConv));
6401 if (!CI->getType()->isVoidTy())
6402 CI->setName(
"call");
6404 if (
CGM.shouldEmitConvergenceTokens() && CI->isConvergent())
6405 CI = addConvergenceControlToken(CI);
6408 LargestVectorWidth =
6414 if (!CI->getCalledFunction())
6415 PGO->valueProfile(
Builder, llvm::IPVK_IndirectCallTarget, CI, CalleePtr);
6419 if (
CGM.getLangOpts().ObjCAutoRefCount)
6420 AddObjCARCExceptionMetadata(CI);
6423 bool IsPPC =
getTarget().getTriple().isPPC();
6424 bool IsMIPS =
getTarget().getTriple().isMIPS();
6425 bool HasMips16 =
false;
6428 HasMips16 = TargetOpts.
FeatureMap.lookup(
"mips16");
6430 HasMips16 = llvm::is_contained(TargetOpts.
Features,
"+mips16");
6432 if (llvm::CallInst *
Call = dyn_cast<llvm::CallInst>(CI)) {
6433 if (TargetDecl && TargetDecl->
hasAttr<NotTailCalledAttr>())
6434 Call->setTailCallKind(llvm::CallInst::TCK_NoTail);
6435 else if (IsMustTail) {
6438 CGM.getDiags().Report(Loc, diag::err_aix_musttail_unsupported);
6441 CGM.getDiags().Report(Loc, diag::err_ppc_impossible_musttail) << 0;
6442 else if (
Call->isIndirectCall())
6443 CGM.getDiags().Report(Loc, diag::err_ppc_impossible_musttail) << 1;
6444 else if (isa_and_nonnull<FunctionDecl>(TargetDecl)) {
6449 CGM.addUndefinedGlobalForTailCall(
6452 llvm::GlobalValue::LinkageTypes
Linkage =
CGM.getFunctionLinkage(
6454 if (llvm::GlobalValue::isWeakForLinker(
Linkage) ||
6455 llvm::GlobalValue::isDiscardableIfUnused(
Linkage))
6456 CGM.getDiags().Report(Loc, diag::err_ppc_impossible_musttail)
6464 CGM.getDiags().Report(Loc, diag::err_mips_impossible_musttail) << 0;
6465 else if (
const auto *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl))
6466 CGM.addUndefinedGlobalForTailCall({FD, Loc});
6468 Call->setTailCallKind(llvm::CallInst::TCK_MustTail);
6482 bool NeedSrcLoc = TargetDecl->
hasAttr<ErrorAttr>();
6483 if (!NeedSrcLoc &&
CGM.getCodeGenOpts().ShowInliningChain) {
6484 if (
const auto *FD = dyn_cast<FunctionDecl>(TargetDecl))
6485 NeedSrcLoc = FD->isInlined() || FD->hasAttr<AlwaysInlineAttr>() ||
6487 FD->isInAnonymousNamespace();
6491 auto *MD = llvm::ConstantAsMetadata::get(
Line);
6492 CI->setMetadata(
"srcloc", llvm::MDNode::get(
getLLVMContext(), {MD}));
6501 if (CI->doesNotReturn()) {
6502 if (NeedSRetLifetimeEnd)
6506 if (
SanOpts.has(SanitizerKind::Unreachable)) {
6509 if (
auto *F = CI->getCalledFunction())
6510 F->removeFnAttr(llvm::Attribute::NoReturn);
6511 CI->removeFnAttr(llvm::Attribute::NoReturn);
6515 if (
SanOpts.hasOneOf(SanitizerKind::Address |
6516 SanitizerKind::KernelAddress)) {
6518 llvm::IRBuilder<>::InsertPointGuard IPGuard(
Builder);
6520 auto *FnType = llvm::FunctionType::get(
CGM.VoidTy,
false);
6521 llvm::FunctionCallee Fn =
6522 CGM.CreateRuntimeFunction(FnType,
"__asan_handle_no_return");
6528 Builder.ClearInsertionPoint();
6550 if (CI->doesNotThrow())
6553 diag::err_musttail_noexcept_mismatch);
6559 if (Cleanup && Cleanup->isFakeUse()) {
6560 CGBuilderTy::InsertPointGuard IPG(
Builder);
6562 Cleanup->getCleanup()->Emit(*
this, EHScopeStack::Cleanup::Flags());
6563 }
else if (!(Cleanup &&
6564 Cleanup->getCleanup()->isRedundantBeforeReturn())) {
6565 CGM.ErrorUnsupported(
MustTailCall,
"tail call skipping over cleanups");
6568 if (CI->getType()->isVoidTy())
6572 Builder.ClearInsertionPoint();
6578 if (swiftErrorTemp.
isValid()) {
6579 llvm::Value *errorResult =
Builder.CreateLoad(swiftErrorTemp);
6580 Builder.CreateStore(errorResult, swiftErrorArg);
6597 if (IsVirtualFunctionPointerThunk) {
6610 unsigned unpaddedIndex = 0;
6611 for (
unsigned i = 0, e = coercionType->getNumElements(); i != e; ++i) {
6612 llvm::Type *eltType = coercionType->getElementType(i);
6616 llvm::Value *elt = CI;
6617 if (requiresExtract)
6618 elt =
Builder.CreateExtractValue(elt, unpaddedIndex++);
6620 assert(unpaddedIndex == 0);
6621 Builder.CreateStore(elt, eltAddr);
6629 if (NeedSRetLifetimeEnd)
6646 llvm::Value *Real =
Builder.CreateExtractValue(CI, 0);
6647 llvm::Value *Imag =
Builder.CreateExtractValue(CI, 1);
6655 llvm::Value *
V = CI;
6656 if (
V->getType() != RetIRTy)
6666 if (
auto *FixedDstTy = dyn_cast<llvm::FixedVectorType>(RetIRTy)) {
6667 llvm::Value *
V = CI;
6668 if (
auto *ScalableSrcTy =
6669 dyn_cast<llvm::ScalableVectorType>(
V->getType())) {
6670 if (FixedDstTy->getElementType() ==
6671 ScalableSrcTy->getElementType()) {
6672 V =
Builder.CreateExtractVector(FixedDstTy,
V, uint64_t(0),
6682 getContext().getTypeInfoDataSizeInChars(RetTy).Width.getQuantity();
6686 DestIsVolatile =
false;
6687 DestSize =
getContext().getTypeSizeInChars(RetTy).getQuantity();
6697 CI, RetTy, StorePtr,
6711 DestIsVolatile =
false;
6713 CGM.getABIInfo().createCoercedStore(CI, StorePtr, RetAI, DestIsVolatile,
6720 llvm_unreachable(
"Invalid ABI kind for return argument");
6723 llvm_unreachable(
"Unhandled ABIArgInfo::Kind");
6728 if (Ret.isScalar() && TargetDecl) {
6729 AssumeAlignedAttrEmitter.EmitAsAnAssumption(Loc, RetTy, Ret);
6730 AllocAlignAttrEmitter.EmitAsAnAssumption(Loc, RetTy, Ret);
6748 if (CalleeDecl && !CalleeDecl->
hasAttr<NoDebugAttr>() &&
6749 DI->getCallSiteRelatedAttrs() != llvm::DINode::FlagZero) {
6750 CodeGenFunction CalleeCGF(
CGM);
6752 Callee.getAbstractInfo().getCalleeDecl();
6753 CalleeCGF.
CurGD = CalleeGlobalDecl;
6756 DI->EmitFuncDeclForCallSite(
6757 CI, DI->getFunctionType(CalleeDecl, ResTy, Args), CalleeGlobalDecl);
6760 DI->addCallTargetIfVirtual(CalleeDecl, CI);
6781 VAListAddr =
VE->isMicrosoftABI()
6788 if (
VE->isMicrosoftABI())
6789 return CGM.getABIInfo().EmitMSVAArg(*
this, VAListAddr, Ty, Slot);
6791 return CGM.getABIInfo().EmitZOSVAArg(*
this, VAListAddr, Ty, Slot);
6792 return CGM.getABIInfo().EmitVAArg(*
this, VAListAddr, Ty, Slot);
6797 CGF.disableDebugInfo();
6801 CGF.enableDebugInfo();
static ExtParameterInfoList getExtParameterInfosForCall(const FunctionProtoType *proto, unsigned prefixArgs, unsigned totalArgs)
static bool isInAllocaArgument(CGCXXABI &ABI, QualType type)
static uint64_t buildMultiCharMask(const SmallVectorImpl< uint64_t > &Bits, int Pos, int Size, int CharWidth, bool BigEndian)
static llvm::Value * tryRemoveRetainOfSelf(CodeGenFunction &CGF, llvm::Value *result)
If this is a +1 of the value of an immutable 'self', remove it.
static CanQualType GetReturnType(QualType RetTy)
Returns the "extra-canonicalized" return type, which discards qualifiers on the return type.
static const NonNullAttr * getNonNullAttr(const Decl *FD, const ParmVarDecl *PVD, QualType ArgType, unsigned ArgNo)
Returns the attribute (either parameter attribute, or function attribute), which declares argument Ar...
static CanQualTypeList getArgTypesForCall(ASTContext &ctx, const CallArgList &args)
static Address emitAddressAtOffset(CodeGenFunction &CGF, Address addr, const ABIArgInfo &info)
static const char * abiKindToString(ABIArgInfo::Kind K)
static AggValueSlot createPlaceholderSlot(CodeGenFunction &CGF, QualType Ty)
static CallingConv getCallingConventionForDecl(const ObjCMethodDecl *D, bool IsTargetDefaultMSABI)
static void setBitRange(SmallVectorImpl< uint64_t > &Bits, int BitOffset, int BitWidth, int CharWidth)
static bool isProvablyNull(llvm::Value *addr)
static void AddAttributesFromFunctionProtoType(ASTContext &Ctx, llvm::AttrBuilder &FuncAttrs, const FunctionProtoType *FPT)
static void eraseUnusedBitCasts(llvm::Instruction *insn)
static bool isObjCMethodWithTypeParams(const ObjCMethodDecl *method)
static void emitWritebackArg(CodeGenFunction &CGF, CallArgList &args, const ObjCIndirectCopyRestoreExpr *CRE)
Emit an argument that's being passed call-by-writeback.
static void overrideFunctionFeaturesWithTargetFeatures(llvm::AttrBuilder &FuncAttr, const llvm::Function &F, const TargetOptions &TargetOpts)
Merges target-features from \TargetOpts and \F, and sets the result in \FuncAttr.
static llvm::Value * CreatePFPCoercedLoad(Address Src, QualType SrcFETy, llvm::Type *Ty, CodeGenFunction &CGF)
static int getExpansionSize(QualType Ty, const ASTContext &Context)
static CanQual< FunctionProtoType > GetFormalType(const CXXMethodDecl *MD)
Returns the canonical formal type of the given C++ method.
static bool DetermineNoUndef(QualType QTy, CodeGenTypes &Types, const llvm::DataLayout &DL, const ABIArgInfo &AI, bool CheckCoerce=true)
static const Expr * maybeGetUnaryAddrOfOperand(const Expr *E)
static void deactivateArgCleanupsBeforeCall(CodeGenFunction &CGF, const CallArgList &CallArgs)
static bool isProvablyNonNull(Address Addr, CodeGenFunction &CGF)
static llvm::Value * emitArgumentDemotion(CodeGenFunction &CGF, const VarDecl *var, llvm::Value *value)
An argument came in as a promoted argument; demote it back to its declared type.
SmallVector< CanQualType, 16 > CanQualTypeList
static std::pair< llvm::Value *, bool > CoerceScalableToFixed(CodeGenFunction &CGF, llvm::FixedVectorType *ToTy, llvm::ScalableVectorType *FromTy, llvm::Value *V, StringRef Name="")
static const CGFunctionInfo & arrangeLLVMFunctionInfo(CodeGenTypes &CGT, bool instanceMethod, SmallVectorImpl< CanQualType > &prefix, CanQual< FunctionProtoType > FTP)
Arrange the LLVM function layout for a value of the given function type, on top of any implicit param...
static llvm::Value * CreateCoercedLoad(Address Src, QualType SrcFETy, llvm::Type *Ty, CodeGenFunction &CGF)
CreateCoercedLoad - Create a load from.
static void addExtParameterInfosForCall(llvm::SmallVectorImpl< FunctionProtoType::ExtParameterInfo > ¶mInfos, const FunctionProtoType *proto, unsigned prefixArgs, unsigned totalArgs)
static bool canApplyNoFPClass(const ABIArgInfo &AI, QualType ParamType, bool IsReturn)
Test if it's legal to apply nofpclass for the given parameter type and it's lowered IR type.
static void getTrivialDefaultFunctionAttributes(StringRef Name, bool HasOptnone, const CodeGenOptions &CodeGenOpts, const LangOptions &LangOpts, bool AttrOnCallSite, llvm::AttrBuilder &FuncAttrs)
static void forConstantArrayExpansion(CodeGenFunction &CGF, ConstantArrayExpansion *CAE, Address BaseAddr, llvm::function_ref< void(Address)> Fn)
static bool IsArgumentMaybeUndef(const Decl *TargetDecl, unsigned NumRequiredArgs, unsigned ArgNo)
Check if the argument of a function has maybe_undef attribute.
static bool hasInAllocaArgs(CodeGenModule &CGM, CallingConv ExplicitCC, ArrayRef< QualType > ArgTypes)
static std::unique_ptr< TypeExpansion > getTypeExpansion(QualType Ty, const ASTContext &Context)
SmallVector< FunctionProtoType::ExtParameterInfo, 16 > ExtParameterInfoList
static RawAddress CreateTempAllocaForCoercion(CodeGenFunction &CGF, llvm::Type *Ty, CharUnits MinAlign, const Twine &Name="tmp")
Create a temporary allocation for the purposes of coercion.
static void setUsedBits(CodeGenModule &, QualType, int, SmallVectorImpl< uint64_t > &)
static llvm::StoreInst * findDominatingStoreToReturnValue(CodeGenFunction &CGF)
Heuristically search for a dominating store to the return-value slot.
static void setCUDAKernelCallingConvention(CanQualType &FTy, CodeGenModule &CGM, const FunctionDecl *FD)
Set calling convention for CUDA/HIP kernel.
static llvm::Value * tryEmitFusedAutoreleaseOfResult(CodeGenFunction &CGF, llvm::Value *result)
Try to emit a fused autorelease of a return result.
static Address EnterStructPointerForCoercedAccess(Address SrcPtr, llvm::StructType *SrcSTy, uint64_t DstSize, CodeGenFunction &CGF)
EnterStructPointerForCoercedAccess - Given a struct pointer that we are accessing some number of byte...
static llvm::Value * emitAutoreleaseOfResult(CodeGenFunction &CGF, llvm::Value *result)
Emit an ARC autorelease of the result of a function.
static void emitWriteback(CodeGenFunction &CGF, const CallArgList::Writeback &writeback)
Emit the actual writing-back of a writeback.
static bool HasStrictReturn(const CodeGenModule &Module, QualType RetTy, const Decl *TargetDecl)
static CanQualTypeList getArgTypesForDeclaration(ASTContext &ctx, const FunctionArgList &args)
static void addMergableDefaultFunctionAttributes(const CodeGenOptions &CodeGenOpts, llvm::AttrBuilder &FuncAttrs)
Add default attributes to a function, which have merge semantics under -mlink-builtin-bitcode and sho...
static bool CreatePFPCoercedStore(llvm::Value *Src, QualType SrcFETy, Address Dst, CodeGenFunction &CGF)
static llvm::Value * CoerceIntOrPtrToIntOrPtr(llvm::Value *Val, llvm::Type *Ty, CodeGenFunction &CGF)
CoerceIntOrPtrToIntOrPtr - Convert a value Val to the specific Ty where both are either integers or p...
static void AddAttributesFromOMPAssumes(llvm::AttrBuilder &FuncAttrs, const Decl *Callee)
static unsigned getMaxVectorWidth(const llvm::Type *Ty)
CodeGenFunction::ComplexPairTy ComplexPairTy
static void addNoBuiltinAttributes(mlir::MLIRContext &ctx, mlir::NamedAttrList &attrs, const LangOptions &langOpts, const NoBuiltinAttr *nba=nullptr)
static void addDenormalModeAttrs(llvm::DenormalMode fpDenormalMode, llvm::DenormalMode fp32DenormalMode, mlir::NamedAttrList &attrs)
Add denormal-fp-math and denormal-fp-math-f32 as appropriate for the requested denormal behavior,...
static unsigned getNoFPClassTestMask(const LangOptions &langOpts)
Compute the nofpclass mask for FP types based on language options.
static void appendParameterTypes(const CIRGenTypes &cgt, SmallVectorImpl< CanQualType > &prefix, CanQual< FunctionProtoType > fpt)
Adds the formal parameters in FPT to the given prefix.
static const CIRGenFunctionInfo & arrangeFreeFunctionLikeCall(CIRGenTypes &cgt, CIRGenModule &cgm, const CallArgList &args, const FunctionType *fnType)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Result
Implement __builtin_bit_cast and related operations.
#define CC_VLS_CASE(ABI_VLEN)
static bool hasFeature(StringRef Feature, const LangOptions &LangOpts, const TargetInfo &Target)
Determine whether a translation unit built using the current language options has the given feature.
static StringRef getTriple(const Command &Job)
Maps Clang QualType instances to corresponding LLVM ABI type representations.
static QualType getPointeeType(const MemRegion *R)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
CanQualType getCanonicalParamType(QualType T) const
Return the canonical parameter type corresponding to the specific potentially non-canonical one.
CanQualType getCanonicalSizeType() const
const TargetInfo & getTargetInfo() const
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
std::vector< PFPField > findPFPFields(QualType Ty) const
Returns a list of PFP fields for the given type, including subfields in bases or other fields,...
uint64_t getCharWidth() const
Return the size of the character type, in bits.
ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...
uint64_t getFieldOffset(unsigned FieldNo) const
getFieldOffset - Get the offset of the given field index, in bits.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Attr - This represents one attribute.
This class is used for builtin types like 'int'.
QualType getType() const
Retrieves the type of the base class.
Represents a C++ constructor within a class.
Represents a C++ destructor within a class.
Represents a static or instance method of a struct/union/class.
bool isImplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An implicit object member function is a non-static member function without an exp...
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Qualifiers getMethodQualifiers() const
Represents a C++ struct/union/class.
CXXDestructorDecl * getDestructor() const
Returns the destructor decl for this class.
unsigned getNumVBases() const
Retrieves the number of virtual base classes of this class.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
SourceLocation getBeginLoc() const
ConstExprIterator const_arg_iterator
Represents a canonical, potentially-qualified type.
static CanQual< Type > CreateUnsafe(QualType Other)
CanProxy< U > castAs() const
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
CanProxy< U > getAs() const
Retrieve a canonical type pointer with a different static type, upcasting or downcasting as needed.
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
CharUnits - This is an opaque type for sizes expressed in character units.
bool isZero() const
isZero - Test whether the quantity equals zero.
llvm::Align getAsAlign() const
getAsAlign - Returns Quantity as a valid llvm::Align, Beware llvm::Align assumes power of two 8-bit b...
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
static CharUnits Zero()
Zero - Construct a CharUnits quantity of zero.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
llvm::DenormalMode FPDenormalMode
The floating-point denormal mode to use.
static StringRef getFramePointerKindName(FramePointerKind Kind)
std::vector< std::string > Reciprocals
llvm::DenormalMode FP32DenormalMode
The floating-point denormal mode to use, for float.
std::string TrapFuncName
If not an empty string, trap intrinsics are lowered to calls to this function instead of to trap inst...
std::vector< std::string > DefaultFunctionAttrs
std::string PreferVectorWidth
The preferred width for auto-vectorization transforms.
ABIArgInfo - Helper class to encapsulate information about how a specific C type should be passed to ...
static ABIArgInfo getZeroExtend(QualType Ty, llvm::Type *T=nullptr, llvm::Type *Padding=nullptr)
unsigned getInAllocaFieldIndex() const
static ABIArgInfo getSignExtend(QualType Ty, llvm::Type *T=nullptr, llvm::Type *Padding=nullptr)
bool getIndirectByVal() const
llvm::StructType * getCoerceAndExpandType() const
bool getIndirectRealign() const
static ABIArgInfo getIgnore()
void setCoerceToType(llvm::Type *T)
llvm::Type * getUnpaddedCoerceAndExpandType() const
bool getCanBeFlattened() const
unsigned getDirectOffset() const
static bool isPaddingForCoerceAndExpand(llvm::Type *eltType)
bool getInAllocaSRet() const
Return true if this field of an inalloca struct should be returned to implement a struct return calli...
llvm::Type * getPaddingType() const
bool getPaddingInReg() const
unsigned getDirectAlign() const
unsigned getIndirectAddrSpace() const
static ABIArgInfo getDirect(llvm::Type *T=nullptr, unsigned Offset=0, llvm::Type *Padding=nullptr, bool CanBeFlattened=true, unsigned Align=0)
@ Extend
Extend - Valid only for integer argument types.
@ Ignore
Ignore - Ignore the argument (treat as void).
@ IndirectAliased
IndirectAliased - Similar to Indirect, but the pointer may be to an object that is otherwise referenc...
@ Expand
Expand - Only valid for aggregate argument types.
@ TargetSpecific
TargetSpecific - Some argument types are passed as target specific types such as RISC-V's tuple type,...
@ InAlloca
InAlloca - Pass the argument directly using the LLVM inalloca attribute.
@ Indirect
Indirect - Pass the argument indirectly via a hidden pointer with the specified alignment (0 indicate...
@ CoerceAndExpand
CoerceAndExpand - Only valid for aggregate argument types.
@ Direct
Direct - Pass the argument directly using the normal converted LLVM type, or by coercing to another s...
static ABIArgInfo getExtend(QualType Ty, llvm::Type *T=nullptr, llvm::Type *Padding=nullptr)
static ABIArgInfo getIndirect(CharUnits Alignment, unsigned AddrSpace, bool ByVal=true, bool Realign=false, llvm::Type *Padding=nullptr)
ArrayRef< llvm::Type * > getCoerceAndExpandTypeSequence() const
bool isCoerceAndExpand() const
unsigned getInAllocaIndirect() const
llvm::Type * getCoerceToType() const
bool isIndirectAliased() const
bool isSRetAfterThis() const
bool canHaveCoerceToType() const
CharUnits getIndirectAlign() const
Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...
llvm::Value * getBasePointer() const
llvm::Value * emitRawPointer(CodeGenFunction &CGF) const
Return the pointer contained in this class after authenticating it and adding offset to it if necessa...
CharUnits getAlignment() const
llvm::Type * getElementType() const
Return the type of the values stored in this address.
Address withPointer(llvm::Value *NewPointer, KnownNonNull_t IsKnownNonNull) const
Return address with different pointer, but same element type and alignment.
Address withElementType(llvm::Type *ElemTy) const
Return address with different element type, but same pointer and alignment.
unsigned getAddressSpace() const
Return the address space that this address resides in.
KnownNonNull_t isKnownNonNull() const
Whether the pointer is known not to be null.
llvm::StringRef getName() const
Return the IR name of the pointer value.
Address getAddress() const
void setExternallyDestructed(bool destructed=true)
static AggValueSlot forAddr(Address addr, Qualifiers quals, IsDestructed_t isDestructed, NeedsGCBarriers_t needsGC, IsAliased_t isAliased, Overlap_t mayOverlap, IsZeroed_t isZeroed=IsNotZeroed, IsSanitizerChecked_t isChecked=IsNotSanitizerChecked)
forAddr - Make a slot for an aggregate value.
llvm::StoreInst * CreateStore(llvm::Value *Val, Address Addr, bool IsVolatile=false)
Address CreateConstInBoundsByteGEP(Address Addr, CharUnits Offset, const llvm::Twine &Name="")
Given a pointer to i8, adjust it by a given constant offset.
llvm::Value * CreateIsNull(Address Addr, const Twine &Name="")
Address CreateConstGEP2_32(Address Addr, unsigned Idx0, unsigned Idx1, const llvm::Twine &Name="")
Address CreateStructGEP(Address Addr, unsigned Index, const llvm::Twine &Name="")
llvm::LoadInst * CreateLoad(Address Addr, const llvm::Twine &Name="")
llvm::CallInst * CreateMemCpy(Address Dest, Address Src, llvm::Value *Size, bool IsVolatile=false)
llvm::LoadInst * CreateAlignedLoad(llvm::Type *Ty, llvm::Value *Addr, CharUnits Align, const llvm::Twine &Name="")
Implements C++ ABI-specific code generation functions.
virtual bool hasMostDerivedReturn(GlobalDecl GD) const
virtual bool HasThisReturn(GlobalDecl GD) const
Returns true if the given constructor or destructor is one of the kinds that the ABI says returns 'th...
@ RAA_DirectInMemory
Pass it on the stack using its defined layout.
virtual CGCallee getVirtualFunctionPointer(CodeGenFunction &CGF, GlobalDecl GD, Address This, llvm::Type *Ty, SourceLocation Loc)=0
Build a virtual function pointer in the ABI-specific way.
virtual RecordArgABI getRecordArgABI(const CXXRecordDecl *RD) const =0
Returns how an argument of the given record type should be passed.
virtual const CXXRecordDecl * getThisArgumentTypeForMethod(GlobalDecl GD)
Get the type of the implicit "this" parameter used by a method.
virtual AddedStructorArgCounts buildStructorSignature(GlobalDecl GD, SmallVectorImpl< CanQualType > &ArgTys)=0
Build the signature of the given constructor or destructor variant by adding any required parameters.
Abstract information about a function or function prototype.
const GlobalDecl getCalleeDecl() const
const FunctionProtoType * getCalleeFunctionProtoType() const
All available information about a concrete callee.
CGCallee prepareConcreteCallee(CodeGenFunction &CGF) const
If this is a delayed callee computation of some sort, prepare a concrete callee.
Address getThisAddress() const
const CallExpr * getVirtualCallExpr() const
llvm::Value * getFunctionPointer() const
llvm::FunctionType * getVirtualFunctionType() const
const CGPointerAuthInfo & getPointerAuthInfo() const
GlobalDecl getVirtualMethodDecl() const
This class gathers all debug information during compilation and is responsible for emitting to llvm g...
CGFunctionInfo - Class to encapsulate the information about a function definition.
bool usesInAlloca() const
Return true if this function uses inalloca arguments.
FunctionType::ExtInfo getExtInfo() const
bool isInstanceMethod() const
ABIArgInfo & getReturnInfo()
bool isReturnsRetained() const
In ARC, whether this function retains its return value.
unsigned getCallingConvention() const
getCallingConvention - Return the user specified calling convention, which has been translated into a...
void Profile(llvm::FoldingSetNodeID &ID)
const_arg_iterator arg_begin() const
ArrayRef< ExtParameterInfo > getExtParameterInfos() const
CanQualType getReturnType() const
static CGFunctionInfo * create(unsigned llvmCC, bool instanceMethod, bool chainCall, bool delegateCall, unsigned X86ABIAVXLevel, const FunctionType::ExtInfo &extInfo, ArrayRef< ExtParameterInfo > paramInfos, CanQualType resultType, ArrayRef< CanQualType > argTypes, RequiredArgs required)
const ArgInfo * const_arg_iterator
bool isCmseNSCall() const
bool isDelegateCall() const
MutableArrayRef< ArgInfo > arguments()
const_arg_iterator arg_end() const
unsigned getEffectiveCallingConvention() const
getEffectiveCallingConvention - Return the actual calling convention to use, which may depend on the ...
unsigned getX86ABIAVXLevel() const
ExtParameterInfo getExtParameterInfo(unsigned argIndex) const
CharUnits getArgStructAlignment() const
unsigned arg_size() const
RequiredArgs getRequiredArgs() const
unsigned getNumRequiredArgs() const
llvm::StructType * getArgStruct() const
Get the struct type used to represent all the arguments in memory.
CGRecordLayout - This class handles struct and union layout info while lowering AST types to LLVM typ...
const CGBitFieldInfo & getBitFieldInfo(const FieldDecl *FD) const
Return the BitFieldInfo that corresponds to the field FD.
CallArgList - Type for representing both the value and type of arguments in a call.
void addWriteback(LValue srcLV, Address temporary, llvm::Value *toUse, const Expr *writebackExpr=nullptr)
llvm::Instruction * getStackBase() const
void addUncopiedAggregate(LValue LV, QualType type)
void addArgCleanupDeactivation(EHScopeStack::stable_iterator Cleanup, llvm::Instruction *IsActiveIP)
ArrayRef< CallArgCleanup > getCleanupsToDeactivate() const
bool hasWritebacks() const
void add(RValue rvalue, QualType type)
bool isUsingInAlloca() const
Returns if we're using an inalloca struct to pass arguments in memory.
void allocateArgumentMemory(CodeGenFunction &CGF)
void freeArgumentMemory(CodeGenFunction &CGF) const
writeback_const_range writebacks() const
An abstract representation of regular/ObjC call/message targets.
const ParmVarDecl * getParamDecl(unsigned I) const
const Decl * getDecl() const
unsigned getNumParams() const
bool hasFunctionDecl() const
An object to manage conditionally-evaluated expressions.
void begin(CodeGenFunction &CGF)
void end(CodeGenFunction &CGF)
static ParamValue forIndirect(Address addr)
static ParamValue forDirect(llvm::Value *value)
RAII object to set/unset CodeGenFunction::IsSanitizerScope.
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
EHScopeStack::stable_iterator CurrentCleanupScopeDepth
GlobalDecl CurGD
CurGD - The GlobalDecl for the current function being compiled.
llvm::Value * EmitARCRetainAutoreleaseReturnValue(llvm::Value *value)
Do a fused retain/autorelease of the given object.
llvm::Value * performAddrSpaceCast(llvm::Value *Src, llvm::Type *DestTy)
SanitizerSet SanOpts
Sanitizers enabled for this function.
void checkTargetFeatures(const CallExpr *E, const FunctionDecl *TargetDecl)
static bool hasScalarEvaluationKind(QualType T)
llvm::Type * ConvertType(QualType T)
bool isCleanupPadScope() const
Returns true while emitting a cleanuppad.
void addInstToNewSourceAtom(llvm::Instruction *KeyInstruction, llvm::Value *Backup)
Add KeyInstruction and an optional Backup instruction to a new atom group (See ApplyAtomGroup for mor...
llvm::CallBase * EmitCallOrInvoke(llvm::FunctionCallee Callee, ArrayRef< llvm::Value * > Args, const Twine &Name="")
Emits a call or invoke instruction to the given function, depending on the current state of the EH st...
void EmitNoreturnRuntimeCallOrInvoke(llvm::FunctionCallee callee, ArrayRef< llvm::Value * > args)
Emits a call or invoke to the given noreturn runtime function.
llvm::CallBase * EmitRuntimeCallOrInvoke(llvm::FunctionCallee callee, ArrayRef< llvm::Value * > args, const Twine &name="")
Emits a call or invoke instruction to the given runtime function.
void callCStructDestructor(LValue Dst)
ComplexPairTy EmitLoadOfComplex(LValue src, SourceLocation loc)
EmitLoadOfComplex - Load a complex number from the specified l-value.
llvm::Value * EmitARCAutoreleaseReturnValue(llvm::Value *value)
Autorelease the given object.
bool shouldUseFusedARCCalls()
bool CurFuncIsThunk
In C++, whether we are code generating a thunk.
bool isSEHTryScope() const
Returns true inside SEH __try blocks.
RValue convertTempToRValue(Address addr, QualType type, SourceLocation Loc)
Given the address of a temporary variable, produce an r-value of its type.
llvm::Constant * EmitCheckSourceLocation(SourceLocation Loc)
Emit a description of a source location in a format suitable for passing to a runtime sanitizer handl...
void SetSqrtFPAccuracy(llvm::Value *Val)
Set the minimum required accuracy of the given sqrt operation based on CodeGenOpts.
RValue EmitVAArg(VAArgExpr *VE, Address &VAListAddr, AggValueSlot Slot=AggValueSlot::ignored())
Generate code to get an argument from the passed in pointer and update it accordingly.
void EmitReturnValueCheck(llvm::Value *RV)
Emit a test that checks if the return value RV is nonnull.
llvm::Value * getAsNaturalPointerTo(Address Addr, QualType PointeeType)
void EmitDelegateCallArg(CallArgList &args, const VarDecl *param, SourceLocation loc)
EmitDelegateCallArg - We are performing a delegate call; that is, the current function is delegating ...
llvm::BasicBlock * createBasicBlock(const Twine &name="", llvm::Function *parent=nullptr, llvm::BasicBlock *before=nullptr)
createBasicBlock - Create an LLVM basic block.
void addInstToCurrentSourceAtom(llvm::Instruction *KeyInstruction, llvm::Value *Backup)
See CGDebugInfo::addInstToCurrentSourceAtom.
const LangOptions & getLangOpts() const
void addInstToSpecificSourceAtom(llvm::Instruction *KeyInstruction, llvm::Value *Backup, uint64_t Atom)
See CGDebugInfo::addInstToSpecificSourceAtom.
RValue EmitReferenceBindingToExpr(const Expr *E)
Emits a reference binding to the passed in expression.
LValue MakeNaturalAlignAddrLValue(llvm::Value *V, QualType T, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
bool InNoConvergentAttributedStmt
True if the current statement has noconvergent attribute.
void pushDestroy(QualType::DestructionKind dtorKind, Address addr, QualType type)
pushDestroy - Push the standard destructor for the given type as at least a normal cleanup.
const CodeGen::CGBlockInfo * BlockInfo
void EmitKCFIOperandBundle(const CGCallee &Callee, SmallVectorImpl< llvm::OperandBundleDef > &Bundles)
Address makeNaturalAddressForPointer(llvm::Value *Ptr, QualType T, CharUnits Alignment=CharUnits::Zero(), bool ForPointeeType=false, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
Construct an address with the natural alignment of T.
void EmitCXXDestructorCall(const CXXDestructorDecl *D, CXXDtorType Type, bool ForVirtualBase, bool Delegating, Address This, QualType ThisTy)
bool InNoMergeAttributedStmt
True if the current statement has nomerge attribute.
const Decl * CurCodeDecl
CurCodeDecl - This is the inner-most code context, which includes blocks.
llvm::BasicBlock * getUnreachableBlock()
void EmitARCRelease(llvm::Value *value, ARCPreciseLifetime_t precise)
Release the given object.
bool currentFunctionUsesSEHTry() const
JumpDest ReturnBlock
ReturnBlock - Unified return block.
void CreateCoercedStore(llvm::Value *Src, QualType SrcFETy, Address Dst, llvm::TypeSize DstSize, bool DstIsVolatile)
Create a store to.
@ ForceLeftToRight
! Language semantics require left-to-right evaluation.
@ ForceRightToLeft
! Language semantics require right-to-left evaluation.
void EmitNonNullArgCheck(RValue RV, QualType ArgType, SourceLocation ArgLoc, AbstractCallee AC, unsigned ParmNum)
Create a check for a function parameter that may potentially be declared as non-null.
void EmitAggregateCopy(LValue Dest, LValue Src, QualType EltTy, AggValueSlot::Overlap_t MayOverlap, bool isVolatile=false)
EmitAggregateCopy - Emit an aggregate copy.
const TargetInfo & getTarget() const
LValue EmitHLSLOutArgExpr(const HLSLOutArgExpr *E, CallArgList &Args, QualType Ty)
void EmitWritebacks(const CallArgList &Args)
EmitWriteback - Emit callbacks for function.
void EmitIgnoredExpr(const Expr *E)
EmitIgnoredExpr - Emit an expression in a context which ignores the result.
RValue EmitLoadOfLValue(LValue V, SourceLocation Loc)
EmitLoadOfLValue - Given an expression that represents a value lvalue, this method emits the address ...
void DeactivateCleanupBlock(EHScopeStack::stable_iterator Cleanup, llvm::Instruction *DominatingIP)
DeactivateCleanupBlock - Deactivates the given cleanup block.
void pushFullExprCleanup(CleanupKind kind, As... A)
pushFullExprCleanup - Push a cleanup to be run at the end of the current full-expression.
llvm::BasicBlock * getInvokeDest()
void EmitCallArg(CallArgList &args, const Expr *E, QualType ArgType)
EmitCallArg - Emit a single call argument.
void EmitPointerAuthOperandBundle(const CGPointerAuthInfo &Info, SmallVectorImpl< llvm::OperandBundleDef > &Bundles)
void EmitCheck(ArrayRef< std::pair< llvm::Value *, SanitizerKind::SanitizerOrdinal > > Checked, SanitizerHandler Check, ArrayRef< llvm::Constant * > StaticArgs, ArrayRef< llvm::Value * > DynamicArgs, const TrapReason *TR=nullptr)
Create a basic block that will either trap or call a handler function in the UBSan runtime with the p...
AggValueSlot CreateAggTemp(QualType T, const Twine &Name="tmp", RawAddress *Alloca=nullptr)
CreateAggTemp - Create a temporary memory object for the given aggregate type.
llvm::CallInst * EmitIntrinsicCall(llvm::Intrinsic::ID ID, const Twine &Name="")
bool HaveInsertPoint() const
HaveInsertPoint - True if an insertion point is defined.
CGDebugInfo * getDebugInfo()
bool EmitLifetimeStart(llvm::Value *Addr)
Emit a lifetime.begin marker if some criteria are satisfied.
llvm::AllocaInst * CreateTempAlloca(llvm::Type *Ty, const Twine &Name="tmp", llvm::Value *ArraySize=nullptr)
CreateTempAlloca - This creates an alloca and inserts it into the entry block if ArraySize is nullptr...
RValue EmitCall(const CGFunctionInfo &CallInfo, const CGCallee &Callee, ReturnValueSlot ReturnValue, const CallArgList &Args, llvm::CallBase **CallOrInvoke, bool IsMustTail, SourceLocation Loc, bool IsVirtualFunctionPointerThunk=false)
EmitCall - Generate a call of the given function, expecting the given result type,...
void EmitLifetimeEnd(llvm::Value *Addr)
RawAddress CreateMemTempWithoutCast(QualType T, const Twine &Name="tmp")
CreateMemTemp - Create a temporary memory object of the given type, with appropriate alignmen without...
bool InNoInlineAttributedStmt
True if the current statement has noinline attribute.
SmallVector< llvm::OperandBundleDef, 1 > getBundlesForFunclet(llvm::Value *Callee)
RValue EmitAnyExprToTemp(const Expr *E)
EmitAnyExprToTemp - Similarly to EmitAnyExpr(), however, the result will always be accessible even if...
llvm::CallInst * EmitNounwindRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
ASTContext & getContext() const
llvm::Value * EmitLoadOfScalar(Address Addr, bool Volatile, QualType Ty, SourceLocation Loc, AlignmentSource Source=AlignmentSource::Type, bool isNontemporal=false)
EmitLoadOfScalar - Load a scalar value from an address, taking care to appropriately convert from the...
void EmitStoreOfComplex(ComplexPairTy V, LValue dest, bool isInit)
EmitStoreOfComplex - Store a complex number into the specified l-value.
const Decl * CurFuncDecl
CurFuncDecl - Holds the Decl for the current outermost non-closure context.
void EmitFunctionProlog(const CGFunctionInfo &FI, llvm::Function *Fn, const FunctionArgList &Args)
EmitFunctionProlog - Emit the target specific LLVM code to load the arguments for the given function.
Address EmitAddressOfPFPField(Address RecordPtr, const PFPField &Field)
void EmitStoreThroughLValue(RValue Src, LValue Dst, bool isInit=false)
EmitStoreThroughLValue - Store the specified rvalue into the specified lvalue, where both are guarant...
Address EmitVAListRef(const Expr *E)
RValue GetUndefRValue(QualType Ty)
GetUndefRValue - Get an appropriate 'undef' rvalue for the given type.
void EmitParmDecl(const VarDecl &D, ParamValue Arg, unsigned ArgNo)
EmitParmDecl - Emit a ParmVarDecl or an ImplicitParamDecl.
bool AutoreleaseResult
In ARC, whether we should autorelease the return value.
llvm::CallInst * EmitRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
llvm::Value * EmitARCRetainNonBlock(llvm::Value *value)
Retain the given object, with normal retain semantics.
llvm::Type * ConvertTypeForMem(QualType T)
Address EmitZOSVAListRef(const Expr *E)
Emit a "reference" to a __builtin_zos_va_list; this is always the address of the expression,...
CodeGenTypes & getTypes() const
static TypeEvaluationKind getEvaluationKind(QualType T)
getEvaluationKind - Return the TypeEvaluationKind of QualType T.
bool InAlwaysInlineAttributedStmt
True if the current statement has always_inline attribute.
void EmitFunctionEpilog(const CGFunctionInfo &FI, bool EmitRetDbgLoc, SourceLocation EndLoc, uint64_t RetKeyInstructionsSourceAtom)
EmitFunctionEpilog - Emit the target specific LLVM code to return the given temporary.
Address EmitPointerWithAlignment(const Expr *Addr, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
EmitPointerWithAlignment - Given an expression with a pointer type, emit the value and compute our be...
void EmitAggExpr(const Expr *E, AggValueSlot AS)
EmitAggExpr - Emit the computation of the specified expression of aggregate type.
Address EmitMSVAListRef(const Expr *E)
Emit a "reference" to a __builtin_ms_va_list; this is always the value of the expression,...
llvm::Value * EmitScalarExpr(const Expr *E, bool IgnoreResultAssign=false)
EmitScalarExpr - Emit the computation of the specified expression of LLVM scalar type,...
static bool hasAggregateEvaluationKind(QualType T)
void EmitCallArgs(CallArgList &Args, PrototypeWrapper Prototype, llvm::iterator_range< CallExpr::const_arg_iterator > ArgRange, AbstractCallee AC=AbstractCallee(), unsigned ParamsToSkip=0, EvaluationOrder Order=EvaluationOrder::Default)
EmitCallArgs - Emit call arguments for a function.
LValue MakeAddrLValue(Address Addr, QualType T, AlignmentSource Source=AlignmentSource::Type)
const CallExpr * MustTailCall
Address GetAddrOfLocalVar(const VarDecl *VD)
GetAddrOfLocalVar - Return the address of a local variable.
void EmitUnreachable(SourceLocation Loc)
Emit a reached-unreachable diagnostic if Loc is valid and runtime checking is enabled.
std::pair< llvm::Value *, llvm::Value * > ComplexPairTy
Address ReturnValue
ReturnValue - The temporary alloca to hold the return value.
LValue EmitLValue(const Expr *E, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
EmitLValue - Emit code to compute a designator that specifies the location of the expression.
llvm::Instruction * CurrentFuncletPad
void EnsureInsertPoint()
EnsureInsertPoint - Ensure that an insertion point is defined so that emitted IR has a place to go.
llvm::LLVMContext & getLLVMContext()
void emitAlignmentAssumption(llvm::Value *PtrValue, QualType Ty, SourceLocation Loc, SourceLocation AssumptionLoc, llvm::Value *Alignment, llvm::Value *OffsetValue=nullptr)
void EmitVariablyModifiedType(QualType Ty)
EmitVLASize - Capture all the sizes for the VLA expressions in the given variably-modified type and s...
llvm::Value * EmitNonNullRValueCheck(RValue RV, QualType T)
Create a check that a scalar RValue is non-null.
void EmitARCIntrinsicUse(ArrayRef< llvm::Value * > values)
Given a number of pointers, inform the optimizer that they're being intrinsically used up until this ...
llvm::Value * EmitCMSEClearRecord(llvm::Value *V, llvm::IntegerType *ITy, QualType RTy)
void PopCleanupBlock(bool FallThroughIsBranchThrough=false, bool ForDeactivation=false)
PopCleanupBlock - Will pop the cleanup entry on the stack and process all branch fixups.
void EmitStoreOfScalar(llvm::Value *Value, Address Addr, bool Volatile, QualType Ty, AlignmentSource Source=AlignmentSource::Type, bool isInit=false, bool isNontemporal=false)
EmitStoreOfScalar - Store a scalar value to an address, taking care to appropriately convert from the...
void EmitBlock(llvm::BasicBlock *BB, bool IsFinished=false)
EmitBlock - Emit the given block.
QualType BuildFunctionArgList(GlobalDecl GD, FunctionArgList &Args)
This class organizes the cross-function state that is used while generating LLVM code.
const ABIInfo & getABIInfo()
bool ReturnTypeUsesFPRet(QualType ResultType)
Return true iff the given type uses 'fpret' when used as a return type.
const LangOptions & getLangOpts() const
CharUnits getNaturalTypeAlignment(QualType T, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, bool forPointeeType=false)
CodeGenTypes & getTypes()
const TargetInfo & getTarget() const
void computeABIInfoUsingLib(CGFunctionInfo &FI)
Drive the experimental LLVMABI-based lowering path: map argument and return types into the LLVMABI li...
const llvm::DataLayout & getDataLayout() const
ObjCEntrypoints & getObjCEntrypoints() const
CGCXXABI & getCXXABI() const
bool ReturnTypeUsesFP2Ret(QualType ResultType)
Return true iff the given type uses 'fp2ret' when used as a return type.
bool ReturnSlotInterferesWithArgs(const CGFunctionInfo &FI)
Return true iff the given type uses an argument slot when 'sret' is used as a return type.
bool ReturnTypeHasInReg(const CGFunctionInfo &FI)
Return true iff the given type has inreg set.
void AdjustMemoryAttribute(StringRef Name, CGCalleeInfo CalleeInfo, llvm::AttributeList &Attrs)
Adjust Memory attribute to ensure that the BE gets the right attribute.
void ConstructAttributeList(StringRef Name, const CGFunctionInfo &Info, CGCalleeInfo CalleeInfo, llvm::AttributeList &Attrs, unsigned &CallingConv, bool AttrOnCallSite, bool IsThunk)
Get the LLVM attributes and calling convention to use for a particular function type.
const llvm::abi::TargetInfo & getLLVMABITargetInfo(llvm::abi::TypeBuilder &TB)
Lazily build and return the LLVMABI library's TargetInfo for the current target.
ASTContext & getContext() const
bool ReturnTypeUsesSRet(const CGFunctionInfo &FI)
Return true iff the given type uses 'sret' when used as a return type.
const TargetCodeGenInfo & getTargetCodeGenInfo()
const CodeGenOptions & getCodeGenOpts() const
void addDefaultFunctionDefinitionAttributes(llvm::AttrBuilder &attrs)
Like the overload taking a Function &, but intended specifically for frontends that want to build on ...
CharUnits getNaturalPointeeTypeAlignment(QualType T, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
llvm::LLVMContext & getLLVMContext()
CharUnits getMinimumObjectSize(QualType Ty)
Returns the minimum object size for an object of the given type.
bool MayDropFunctionReturn(const ASTContext &Context, QualType ReturnType) const
Whether this function's return type has no side effects, and thus may be trivially discarded if it is...
This class organizes the cross-module state that is used while lowering AST types to LLVM types.
const CGFunctionInfo & arrangeLLVMFunctionInfo(CanQualType returnType, FnInfoOpts opts, ArrayRef< CanQualType > argTypes, FunctionType::ExtInfo info, ArrayRef< FunctionProtoType::ExtParameterInfo > paramInfos, RequiredArgs args, const FunctionDecl *ABIInfoFD)
"Arrange" the LLVM information for a call or type with the given signature.
const CGFunctionInfo & arrangeFreeFunctionCall(const CallArgList &Args, const FunctionType *Ty, bool ChainCall, const FunctionDecl *ABIInfoFD)
Figure out the rules for calling a function with the given formal type using the given arguments.
const CGFunctionInfo & arrangeCXXMethodType(const CXXRecordDecl *RD, const FunctionProtoType *FTP, const CXXMethodDecl *MD)
Arrange the argument and result information for a call to an unknown C++ non-static member function o...
const CGFunctionInfo & arrangeCXXConstructorCall(const CallArgList &Args, const CXXConstructorDecl *D, CXXCtorType CtorKind, unsigned ExtraPrefixArgs, unsigned ExtraSuffixArgs, const FunctionDecl *ABIInfoFD, bool PassProtoArgs=true)
Arrange a call to a C++ method, passing the given arguments.
llvm::Type * ConvertType(QualType T)
ConvertType - Convert type T into a llvm::Type.
CGCXXABI & getCXXABI() const
const CGFunctionInfo & arrangeCXXMethodCall(const CallArgList &args, const FunctionProtoType *type, RequiredArgs required, unsigned numPrefixArgs, const FunctionDecl *ABIInfoFD)
Arrange a call to a C++ method, passing the given arguments.
const CGFunctionInfo & arrangeCXXMethodDeclaration(const CXXMethodDecl *MD)
C++ methods have some special rules and also have implicit parameters.
ASTContext & getContext() const
const CGFunctionInfo & arrangeFreeFunctionType(CanQual< FunctionProtoType > Ty)
Arrange the argument and result information for a value of the given freestanding function type.
CanQualType DeriveThisType(const CXXRecordDecl *RD, const CXXMethodDecl *MD)
Derives the 'this' type for codegen purposes, i.e.
llvm::FunctionType * GetFunctionType(const CGFunctionInfo &Info)
GetFunctionType - Get the LLVM function type for.
bool inheritingCtorHasParams(const InheritedConstructor &Inherited, CXXCtorType Type)
Determine if a C++ inheriting constructor should have parameters matching those of its inherited cons...
bool isFuncTypeConvertible(const FunctionType *FT)
isFuncTypeConvertible - Utility to check whether a function type can be converted to an LLVM type (i....
const CGFunctionInfo & arrangeBlockFunctionCall(const CallArgList &args, const FunctionType *type)
A block function is essentially a free function with an extra implicit argument.
const CGFunctionInfo & arrangeBuiltinFunctionDeclaration(QualType resultType, const FunctionArgList &args)
A builtin function is a freestanding function using the default C conventions.
const CGFunctionInfo & arrangeUnprototypedObjCMessageSend(QualType returnType, const CallArgList &args)
const CGRecordLayout & getCGRecordLayout(const RecordDecl *)
getCGRecordLayout - Return record layout info for the given record decl.
void getExpandedTypes(QualType Ty, SmallVectorImpl< llvm::Type * >::iterator &TI)
getExpandedTypes - Expand the type
llvm::Type * ConvertTypeForMem(QualType T)
ConvertTypeForMem - Convert type T into a llvm::Type.
const CGFunctionInfo & arrangeObjCMethodDeclaration(const ObjCMethodDecl *MD)
Objective-C methods are C functions with some implicit parameters.
llvm::LLVMContext & getLLVMContext()
const CGFunctionInfo & arrangeDeviceKernelCallerDeclaration(QualType resultType, const FunctionArgList &args)
A device kernel caller function is an offload device entry point function with a target device depend...
const CGFunctionInfo & arrangeGlobalDeclaration(GlobalDecl GD)
const CGFunctionInfo & arrangeUnprototypedMustTailThunk(const CXXMethodDecl *MD)
Arrange a thunk that takes 'this' as the first parameter followed by varargs.
const CGFunctionInfo & arrangeBuiltinFunctionCall(QualType resultType, const CallArgList &args)
const CGFunctionInfo & arrangeBlockFunctionDeclaration(const FunctionProtoType *type, const FunctionArgList &args)
Block invocation functions are C functions with an implicit parameter.
unsigned ClangCallConvToLLVMCallConv(CallingConv CC)
Convert clang calling convention to LLVM callilng convention.
llvm::Type * GetFunctionTypeForVTable(GlobalDecl GD)
GetFunctionTypeForVTable - Get the LLVM function type for use in a vtable, given a CXXMethodDecl.
const CGFunctionInfo & arrangeCall(const CGFunctionInfo &declFI, const CallArgList &args, const FunctionDecl *ABIInfoFD)
Given a function info for a declaration, return the function info for a call with the given arguments...
const CGFunctionInfo & arrangeObjCMessageSendSignature(const ObjCMethodDecl *MD, QualType receiverType)
Arrange the argument and result information for the function type through which to perform a send to ...
const CGFunctionInfo & arrangeCXXStructorDeclaration(GlobalDecl GD)
const CGFunctionInfo & arrangeFunctionDeclaration(const GlobalDecl GD)
Free functions are functions that are compatible with an ordinary C function pointer type.
const CGFunctionInfo & arrangeMSCtorClosure(const CXXConstructorDecl *CD, CXXCtorType CT)
const CGFunctionInfo & arrangeNullaryFunction()
A nullary function is a freestanding function of type 'void ()'.
A cleanup scope which generates the cleanup blocks lazily.
A saved depth on the scope stack.
FunctionArgList - Type for representing both the decl and type of parameters to a function.
LValue - This represents an lvalue references.
static LValue MakeAddr(Address Addr, QualType type, ASTContext &Context, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo)
Address getAddress() const
RValue - This trivial value class is used to represent the result of an expression that is evaluated.
static RValue get(llvm::Value *V)
static RValue getAggregate(Address addr, bool isVolatile=false)
Convert an Address to an RValue.
static RValue getComplex(llvm::Value *V1, llvm::Value *V2)
Address getAggregateAddress() const
getAggregateAddr() - Return the Value* of the address of the aggregate.
llvm::Value * getScalarVal() const
getScalarVal() - Return the Value* of this scalar value.
std::pair< llvm::Value *, llvm::Value * > getComplexVal() const
getComplexVal - Return the real/imag components of this complex value.
An abstract representation of an aligned address.
CharUnits getAlignment() const
Return the alignment of this pointer.
llvm::Value * getPointer() const
static RawAddress invalid()
A class for recording the number of arguments that a function signature requires.
bool allowsOptionalArgs() const
unsigned getNumRequiredArgs() const
static RequiredArgs forPrototypePlus(const FunctionProtoType *prototype, unsigned additional)
Compute the arguments required by the given formal prototype, given that there may be some additional...
ReturnValueSlot - Contains the address where the return value of a function can be stored,...
virtual void setCUDAKernelCallingConvention(const FunctionType *&FT) const
static void initPointerAuthFnAttributes(const PointerAuthOptions &Opts, llvm::AttrBuilder &FuncAttrs)
static void initBranchProtectionFnAttributes(const TargetInfo::BranchProtectionInfo &BPI, llvm::AttrBuilder &FuncAttrs)
virtual bool isNoProtoCallVariadic(const CodeGen::CallArgList &args, const FunctionNoProtoType *fnType) const
Determine whether a call to an unprototyped functions under the given calling convention should use t...
Complex values, per C99 6.2.5p11.
Represents the canonical version of C arrays with a specified constant size.
bool constructsVirtualBase() const
Returns true if the constructed base class is a virtual base class subobject of this declaration's cl...
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Decl - This represents one declaration (or definition), e.g.
const FunctionType * getFunctionType(bool BlocksToo=true) const
Looks through the Decl's underlying type to extract a FunctionType when possible.
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
DeclContext * getDeclContext()
SourceLocation getBeginLoc() const LLVM_READONLY
This represents one expression.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
@ NPC_ValueDependentIsNotNull
Specifies that a value-dependent expression should be considered to never be a null pointer constant.
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
Represents a member of a struct/union/class.
bool isBitField() const
Determines whether this field is a bitfield.
bool isUnnamedBitField() const
Determines whether this is an unnamed bitfield.
bool isZeroLengthBitField() const
Is this a zero-length bit-field?
Represents a function declaration or definition.
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
Represents a prototype with parameter type info, e.g.
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
unsigned getNumParams() const
unsigned getAArch64SMEAttributes() const
Return a bitmask describing the SME attributes on the function type, see AArch64SMETypeAttributes for...
bool isNothrow(bool ResultIfDependent=false) const
Determine whether this function type has a non-throwing exception specification.
ArrayRef< ExtParameterInfo > getExtParameterInfos() const
bool hasExtParameterInfos() const
Is there any interesting extra information for any of the parameters of this function type?
Wrapper for source info for functions.
A class which abstracts out some details necessary for making a call.
ExtInfo withCallingConv(CallingConv cc) const
ExtInfo withProducesResult(bool producesResult) const
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
ParameterABI getABI() const
Return the ABI treatment of this parameter.
ExtParameterInfo withIsNoEscape(bool NoEscape) const
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
@ SME_PStateSMEnabledMask
@ SME_PStateSMCompatibleMask
@ SME_AgnosticZAStateMask
static ArmStateValue getArmZT0State(unsigned AttrBits)
static ArmStateValue getArmZAState(unsigned AttrBits)
QualType getReturnType() const
GlobalDecl - represents a global declaration.
CXXCtorType getCtorType() const
KernelReferenceKind getKernelReferenceKind() const
CXXDtorType getDtorType() const
const Decl * getDecl() const
This class represents temporary values used to represent inout and out arguments in HLSL.
Description of a constructor that was inherited from a base class.
ConstructorUsingShadowDecl * getShadowDecl() const
@ FPE_Ignore
Assume that floating-point exceptions are masked.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
std::vector< std::string > NoBuiltinFuncs
A list of all -fno-builtin-* function names (e.g., memset).
FPExceptionModeKind getDefaultExceptionMode() const
bool isNoBuiltinFunc(StringRef Name) const
Is this a libc/libm function that is no longer recognized as a builtin because a -fno-builtin-* optio...
bool assumeFunctionsAreConvergent() const
Represents a point when the lifetime of an automatic object ends.
Represents a matrix type, as defined in the Matrix Types clang extensions.
Describes a module or submodule.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
ObjCCategoryDecl - Represents a category declaration.
ObjCIndirectCopyRestoreExpr - Represents the passing of a function argument by indirect copy-restore ...
bool shouldCopy() const
shouldCopy - True if we should do the 'copy' part of the copy-restore.
Represents an ObjC class declaration.
ObjCMethodDecl - Represents an instance or class method declaration.
ImplicitParamDecl * getSelfDecl() const
ArrayRef< ParmVarDecl * > parameters() const
bool isDirectMethod() const
True if the method is tagged as objc_direct.
QualType getReturnType() const
Represents a parameter to a function.
PointerType - C99 6.7.5.1 - Pointer Declarators.
A (possibly-)qualified type.
bool isRestrictQualified() const
Determine whether this type is restrict-qualified.
bool isTriviallyCopyableType(const ASTContext &Context) const
Return true if this is a trivially copyable type (C++0x [basic.types]p9)
bool isNull() const
Return true if this QualType doesn't point to a type yet.
LangAS getAddressSpace() const
Return the address space of this type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getCanonicalType() const
bool isConstQualified() const
Determine whether this type is const-qualified.
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
LangAS getAddressSpace() const
Represents a struct/union/class.
field_iterator field_end() const
bool isParamDestroyedInCallee() const
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
field_iterator field_begin() const
Base for LValueReferenceType and RValueReferenceType.
Encodes a location in the source.
UIntTy getRawEncoding() const
When a SourceLocation itself cannot be used, this returns an (opaque) 32-bit integer encoding for it.
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
Options for controlling the target.
std::vector< std::string > Features
The list of target specific features to enable or disable – this should be a list of strings starting...
std::string TuneCPU
If given, the name of the target CPU to tune code for.
std::string CPU
If given, the name of the target CPU to generate code for.
llvm::StringMap< bool > FeatureMap
The map of which features have been enabled disabled based on the command line.
The base class of the type hierarchy.
bool isIncompleteArrayType() const
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isConstantSizeType() const
Return true if this is not a variable sized type, according to the rules of C99 6....
bool isPointerType() const
CanQualType getCanonicalTypeUnqualified() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isScalarType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isBitIntType() const
RecordDecl * castAsRecordDecl() const
bool isMemberPointerType() const
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isObjectType() const
Determine whether this type is an object type.
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool hasFloatingRepresentation() const
Determine whether this type has a floating-point representation of some sort, e.g....
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
const T * castAsCanonical() const
Return this type's canonical type cast to the specified type.
const T * getAs() const
Member-template getAs<specific type>'.
bool isNullPtrType() const
bool isRecordType() const
bool isObjCRetainableType() const
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Represents a call to the builtin function __builtin_va_arg.
Represents a variable declaration or definition.
QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const
Would the destruction of this variable have any effect, and if so, what kind?
Represents a GCC generic vector type.
Defines the clang::TargetInfo interface.
void computeABIInfo(CodeGenModule &CGM, CGFunctionInfo &FI)
Compute the ABI information of a swiftcall function.
@ Type
The l-value was considered opaque, so the alignment was determined from a type.
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
void computeSPIRKernelABIInfo(CodeGenModule &CGM, CGFunctionInfo &FI)
@ NormalCleanup
Denotes a cleanup that should run when a scope is exited using normal control flow (falling off the e...
void mergeDefaultFunctionDefinitionAttributes(llvm::Function &F, const CodeGenOptions &CodeGenOpts, const LangOptions &LangOpts, const TargetOptions &TargetOpts, bool WillInternalize)
Adds attributes to F according to our CodeGenOpts and LangOpts, as though we had emitted it ourselves...
QualType useFirstFieldIfTransparentUnion(QualType Ty)
Pass transparent unions as if they were the type of the first element.
bool isEmptyRecord(ASTContext &Context, QualType T, bool AllowArrays, bool AsIfNoUniqueAddr=false)
isEmptyRecord - Return true iff a structure contains only empty fields.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
PRESERVE_NONE bool Ret(InterpState &S)
bool This(InterpState &S, CodePtr OpPC)
@ Address
A pointer to a ValueDecl.
Top level wrappers for InstallAPI frontend operations.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
CXXCtorType
C++ constructor types.
@ Ctor_DefaultClosure
Default closure variant of a ctor.
@ Ctor_CopyingClosure
Copying closure variant of a ctor.
@ Ctor_Complete
Complete object ctor.
bool isa(CodeGen::Address addr)
static bool classof(const OMPClause *T)
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
bool isInstanceMethod(const Decl *D)
@ NonNull
Values of this type can never be null.
@ OK_Ordinary
An ordinary object is located at an address in memory.
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ SwiftAsyncContext
This parameter (which must have pointer type) uses the special Swift asynchronous context-pointer ABI...
@ SwiftErrorResult
This parameter (which must have pointer-to-pointer type) uses the special Swift error-result ABI trea...
@ Ordinary
This parameter uses ordinary ABI rules for its type.
@ SwiftIndirectResult
This parameter (which must have pointer type) is a Swift indirect result parameter.
@ SwiftContext
This parameter (which must have pointer type) uses the special Swift context-pointer ABI treatment.
const FunctionProtoType * T
@ Dtor_VectorDeleting
Vector deleting dtor.
@ Dtor_Complete
Complete object dtor.
@ Dtor_Deleting
Deleting dtor.
@ CanPassInRegs
The argument of this type can be passed directly in registers.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
U cast(CodeGen::Address addr)
@ Struct
The "struct" keyword introduces the elaborated-type-specifier.
__DEVICE__ _Tp arg(const std::complex< _Tp > &__c)
Structure with information about how a bitfield should be accessed.
CharUnits StorageOffset
The offset of the bitfield storage from the start of the struct.
unsigned Offset
The offset within a contiguous run of bitfields that are represented as a single "field" within the L...
unsigned Size
The total size of the bit-field, in bits.
unsigned StorageSize
The storage size in bits which should be used when accessing this bitfield.
Similar to AddedStructorArgs, but only notes the number of additional arguments.
llvm::Value * ToUse
A value to "use" after the writeback, or null.
LValue Source
The original argument.
Address Temporary
The temporary alloca.
const Expr * WritebackExpr
An Expression (optional) that performs the writeback with any required casting.
LValue getKnownLValue() const
RValue getKnownRValue() const
void copyInto(CodeGenFunction &CGF, Address A) const
RValue getRValue(CodeGenFunction &CGF) const
llvm::PointerType * VoidPtrTy
llvm::IntegerType * Int64Ty
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64
llvm::CallingConv::ID getRuntimeCC() const
llvm::IntegerType * SizeTy
llvm::IntegerType * Int32Ty
llvm::IntegerType * IntPtrTy
llvm::PointerType * Int8PtrTy
CharUnits getPointerAlign() const
~DisableDebugLocationUpdates()
DisableDebugLocationUpdates(CodeGenFunction &CGF)
static const EHPersonality & get(CodeGenModule &CGM, const FunctionDecl *FD)
llvm::Function * objc_retainAutoreleasedReturnValue
id objc_retainAutoreleasedReturnValue(id);
llvm::Function * objc_retain
id objc_retain(id);
llvm::InlineAsm * retainAutoreleasedReturnValueMarker
A void(void) inline asm to use to mark that the return value of a call will be immediately retain.
bool has(SanitizerMask K) const
Check if a certain (single) sanitizer is enabled.