38#include "llvm/ABI/FunctionInfo.h"
39#include "llvm/ABI/IRTypeMapper.h"
40#include "llvm/ABI/TargetInfo.h"
41#include "llvm/ABI/Types.h"
42#include "llvm/ADT/STLExtras.h"
43#include "llvm/ADT/StringExtras.h"
44#include "llvm/Analysis/ValueTracking.h"
45#include "llvm/IR/Assumptions.h"
46#include "llvm/IR/AttributeMask.h"
47#include "llvm/IR/Attributes.h"
48#include "llvm/IR/CallingConv.h"
49#include "llvm/IR/DataLayout.h"
50#include "llvm/IR/DebugInfoMetadata.h"
51#include "llvm/IR/InlineAsm.h"
52#include "llvm/IR/IntrinsicInst.h"
53#include "llvm/IR/Intrinsics.h"
54#include "llvm/IR/Type.h"
55#include "llvm/Transforms/Utils/Local.h"
68 if (Target.getTriple().isSPIROrSPIRV())
69 return llvm::CallingConv::SPIR_FUNC;
70 return llvm::CallingConv::C;
72 return llvm::CallingConv::X86_StdCall;
74 return llvm::CallingConv::X86_FastCall;
76 return llvm::CallingConv::X86_RegCall;
78 return llvm::CallingConv::X86_ThisCall;
80 return llvm::CallingConv::Win64;
82 return llvm::CallingConv::X86_64_SysV;
84 return llvm::CallingConv::ARM_AAPCS;
86 return llvm::CallingConv::ARM_AAPCS_VFP;
88 return llvm::CallingConv::Intel_OCL_BI;
91 return llvm::CallingConv::C;
94 return llvm::CallingConv::X86_VectorCall;
96 return llvm::CallingConv::AArch64_VectorCall;
98 return llvm::CallingConv::AArch64_SVE_VectorCall;
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;
133 llvm_unreachable(
"unhandled calling convention");
144 RecTy = Context.getCanonicalTagType(RD);
146 RecTy = Context.VoidTy;
151 return Context.getPointerType(RecTy);
177 assert(paramInfos.size() <= prefixArgs);
178 assert(proto->
getNumParams() + prefixArgs <= totalArgs);
180 paramInfos.reserve(totalArgs);
183 paramInfos.resize(prefixArgs);
187 paramInfos.push_back(ParamInfo);
189 if (ParamInfo.hasPassObjectSize())
190 paramInfos.emplace_back();
193 assert(paramInfos.size() <= totalArgs &&
194 "Did we forget to insert pass_object_size args?");
196 paramInfos.resize(totalArgs);
206 if (!FPT->hasExtParameterInfos()) {
207 assert(paramInfos.empty() &&
208 "We have paramInfos, but the prototype doesn't?");
209 prefix.append(FPT->param_type_begin(), FPT->param_type_end());
213 unsigned PrefixSize = prefix.size();
217 prefix.reserve(prefix.size() + FPT->getNumParams());
219 auto ExtInfos = FPT->getExtParameterInfos();
220 assert(ExtInfos.size() == FPT->getNumParams());
221 for (
unsigned I = 0, E = FPT->getNumParams(); I != E; ++I) {
222 prefix.push_back(FPT->getParamType(I));
223 if (ExtInfos[I].hasPassObjectSize())
248 FTP->getExtInfo(), paramInfos,
Required,
259 return ::arrangeLLVMFunctionInfo(*
this,
false, argTypes,
264 bool IsTargetDefaultMSABI) {
269 if (D->
hasAttr<FastCallAttr>())
275 if (D->
hasAttr<ThisCallAttr>())
278 if (D->
hasAttr<VectorCallAttr>())
284 if (PcsAttr *PCS = D->
getAttr<PcsAttr>())
287 if (D->
hasAttr<AArch64VectorPcsAttr>())
290 if (D->
hasAttr<AArch64SVEPcsAttr>())
293 if (D->
hasAttr<DeviceKernelAttr>())
296 if (D->
hasAttr<IntelOclBiccAttr>())
305 if (D->
hasAttr<PreserveMostAttr>())
308 if (D->
hasAttr<PreserveAllAttr>())
314 if (D->
hasAttr<PreserveNoneAttr>())
317 if (D->
hasAttr<RISCVVectorCCAttr>())
320 if (RISCVVLSCCAttr *PCS = D->
getAttr<RISCVVLSCCAttr>()) {
321 switch (PCS->getVectorWidth()) {
323 llvm_unreachable(
"Invalid RISC-V VLS ABI VLEN");
324#define CC_VLS_CASE(ABI_VLEN) \
326 return CC_RISCVVLSCall_##ABI_VLEN;
364 CanonicalFTP.getTypePtr(), argTypes.size());
367 CanonicalFTP->getReturnType().getUnqualifiedType(),
369 paramInfos, required, MD);
375 if (FD->
hasAttr<CUDAGlobalAttr>()) {
407 argTypes, prototype->getExtInfo(), paramInfos,
417 !Target.getCXXABI().hasConstructorVariants();
430 bool PassParams =
true;
432 if (
auto *CD = dyn_cast<CXXConstructorDecl>(MD)) {
435 if (
auto Inherited = CD->getInheritedConstructor())
447 if (!paramInfos.empty()) {
450 paramInfos.insert(paramInfos.begin() + 1, AddedArgs.
Prefix,
453 paramInfos.append(AddedArgs.
Suffix,
458 (PassParams && MD->isVariadic() ?
RequiredArgs(argTypes.size())
464 ? CGM.getContext().VoidPtrTy
467 argTypes, extInfo, paramInfos, required, MD);
473 for (
auto &arg : args)
481 for (
auto &arg : args)
488 unsigned totalArgs) {
506 unsigned ExtraPrefixArgs,
unsigned ExtraSuffixArgs,
509 for (
const auto &Arg : args)
510 ArgTypes.push_back(Context.getCanonicalParamType(Arg.Ty));
513 unsigned TotalPrefixArgs = 1 + ExtraPrefixArgs;
518 FPT, TotalPrefixArgs + ExtraSuffixArgs)
524 ? CGM.getContext().VoidPtrTy
531 if (PassProtoArgs && FPT->hasExtParameterInfos()) {
538 ArgTypes, Info, ParamInfos,
Required,
548 if (MD->isImplicitObjectMemberFunction())
556 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
559 CGM.getTargetCodeGenInfo().setOCLKernelStubCallingConvention(FT);
567 {}, noProto->getExtInfo(), {},
601 argTys.push_back(Context.getCanonicalParamType(receiverType));
603 argTys.push_back(Context.getCanonicalParamType(Context.getObjCSelType()));
605 argTys.push_back(Context.getCanonicalParamType(I->getType()));
607 I->hasAttr<NoEscapeAttr>());
608 extParamInfos.push_back(extParamInfo);
612 bool IsTargetDefaultMSABI =
618 if (
getContext().getLangOpts().ObjCAutoRefCount &&
619 MD->
hasAttr<NSReturnsRetainedAttr>())
657 assert(MD->
isVirtual() &&
"only methods have thunks");
674 ArgTys.push_back(*FTP->param_type_begin());
676 ArgTys.push_back(Context.IntTy);
677 CallingConv CC = Context.getDefaultCallingConvention(
689 unsigned numExtraRequiredArgs,
bool chainCall,
691 assert(args.size() >= numExtraRequiredArgs);
701 if (proto->isVariadic())
704 if (proto->hasExtParameterInfos())
718 for (
const auto &arg : args)
723 paramInfos, required, ABIInfoFD);
734 chainCall ? 1 : 0, chainCall, ABIInfoFD);
766 for (
const auto &Arg : args)
767 argTypes.push_back(Context.getCanonicalParamType(Arg.Ty));
809 assert(numPrefixArgs + 1 <= args.size() &&
810 "Emitting a call with less args than the required prefix?");
821 paramInfos, required, ABIInfoFD);
833 assert(signature.
arg_size() <= args.size());
834 unsigned X86ABIAVXLevel =
835 CGM.getABIInfo().getX86ABIAVXLevel(ABIInfoFD, signature.
getExtInfo());
836 if (signature.
arg_size() == args.size() &&
842 if (!sigParamInfos.empty()) {
843 paramInfos.append(sigParamInfos.begin(), sigParamInfos.end());
844 paramInfos.resize(args.size());
882 return "IndirectAliased";
888 return "CoerceAndExpand";
890 return "TargetSpecific";
894 llvm_unreachable(
"Unknown kind");
900 MappedArgTypes.reserve(FI.
arg_size());
902 MappedArgTypes.push_back(AbiMapper->convertType(Arg.type));
905 llvm::abi::RequiredArgs AbiRequired = llvm::abi::RequiredArgs::All;
907 AbiRequired = llvm::abi::RequiredArgs(
Required.getNumRequiredArgs());
909 auto AbiFI = llvm::abi::FunctionInfo::create(
911 MappedArgTypes, AbiRequired);
920 auto ConvertABIArgInfo = [&](
ABIArgInfo &Target,
923 auto Check = [&](
bool Cond, llvm::function_ref<void()> MessageFn) {
927 llvm::dbgs() <<
"For return value of type ";
929 llvm::dbgs() <<
"For argument " << ArgNo <<
" of type ";
930 llvm::dbgs() <<
Type <<
": ";
932 llvm::dbgs() <<
"\n";
935 auto CheckSimple = [&](
auto TargetVal,
auto ResVal, StringRef What) {
936 Check(TargetVal == ResVal, [&]() {
937 llvm::dbgs() << What <<
" mismatch (expected: " << TargetVal
938 <<
", given: " << ResVal <<
")";
943 Check(Target.getKind() == Res.
getKind(), [&]() {
944 llvm::dbgs() <<
"Kind mismatch (expected: "
945 << abiKindToString(Target.getKind())
946 <<
", given: " << abiKindToString(Res.getKind()) <<
")";
951 llvm::Type *TargetType = Target.getCoerceToType();
958 Check(TargetType == ResType, [&]() {
959 llvm::dbgs() <<
"CoerceToType mismatch (expected: " << *TargetType
960 <<
", given: " << *ResType <<
")";
966 CheckSimple(Target.isSignExt(), Res.
isSignExt(),
"SignExt");
967 CheckSimple(Target.isZeroExt(), Res.
isZeroExt(),
"ZeroExt");
970 CheckSimple(Target.getDirectAlign(), Res.
getDirectAlign(),
"DirectAlign");
984 "IndirectAddrSpace");
988 llvm::dbgs() <<
"IndirectAlign mismatch (expected: "
989 << Target.getIndirectAlign().getQuantity()
990 <<
", given: " << Res.getIndirectAlign().getQuantity()
995 Check(Target.getUnpaddedCoerceAndExpandType() ==
998 llvm::dbgs() <<
"UnpaddedCoerceAndExpandType mismatch (expected: "
999 << *Target.getUnpaddedCoerceAndExpandType()
1001 << *Res.getUnpaddedCoerceAndExpandType() <<
")";
1011 auto ConvertABIArgInfo =
1013 int ArgNo) { Target = convertABIArgInfo(AbiInfo,
Type); };
1016 ConvertABIArgInfo(FI.
getReturnInfo(), AbiFI->getReturnInfo(),
1020 for (
auto [CGArg, AbiArg] :
1021 llvm::zip_equal(FI.
arguments(), AbiFI->arguments()))
1022 ConvertABIArgInfo(CGArg.info, AbiArg.Info, CGArg.type, ArgNo++);
1025ABIArgInfo CodeGenModule::convertABIArgInfo(
const llvm::abi::ArgInfo &AbiInfo,
1027 switch (AbiInfo.getKind()) {
1028 case llvm::abi::ArgInfo::Direct: {
1029 llvm::Type *CoercedType =
nullptr;
1030 if (AbiInfo.getCoerceToType())
1031 CoercedType = AbiReverseMapper->convertType(AbiInfo.getCoerceToType());
1033 CoercedType = getTypes().ConvertType(
Type);
1034 unsigned DirectAlign = 0;
1035 if (llvm::MaybeAlign Align = AbiInfo.getDirectAlign())
1036 DirectAlign = Align->value();
1041 AbiInfo.getCanBeFlattened(), DirectAlign);
1043 case llvm::abi::ArgInfo::Extend: {
1044 llvm::Type *CoercedType =
nullptr;
1045 if (AbiInfo.getCoerceToType())
1046 CoercedType = AbiReverseMapper->convertType(AbiInfo.getCoerceToType());
1048 CoercedType = getTypes().ConvertType(
Type);
1054 if (AbiInfo.isSignExt())
1056 if (AbiInfo.isZeroExt())
1060 case llvm::abi::ArgInfo::Indirect: {
1064 AbiInfo.getIndirectByVal(),
1065 AbiInfo.getIndirectRealign());
1067 case llvm::abi::ArgInfo::IndirectAliased: {
1069 CharUnits Alignment =
1072 AbiInfo.getIndirectAddrSpace(),
1073 AbiInfo.getIndirectRealign());
1075 case llvm::abi::ArgInfo::Ignore:
1077 case llvm::abi::ArgInfo::CoerceAndExpand: {
1078 llvm::StructType *CoercedType = llvm::cast<llvm::StructType>(
1079 AbiReverseMapper->convertType(AbiInfo.getCoerceToType()));
1080 llvm::Type *UnpaddedType =
1081 AbiReverseMapper->convertType(AbiInfo.getUnpaddedCoerceAndExpandType());
1085 llvm_unreachable(
"Unexpected llvm::abi::ArgInfo kind");
1096 assert(llvm::all_of(argTypes,
1100 llvm::FoldingSetNodeID ID;
1105 bool isDelegateCall =
1107 unsigned X86ABIAVXLevel = CGM.getABIInfo().getX86ABIAVXLevel(ABIInfoFD, info);
1111 paramInfos, required, resultType, argTypes);
1121 llvm::FoldingSetNodeID ID;
1123 X86ABIAVXLevel, info, paramInfos, required,
1124 resultType, argTypes);
1126 llvm::FoldingSetInsertToken InsertToken;
1131 unsigned CC = ClangCallConvToLLVMCallConv(info.getCC());
1135 X86ABIAVXLevel, info, paramInfos, resultType,
1136 argTypes, required);
1137 FunctionInfos.insert(FI, InsertToken);
1139 bool inserted = FunctionsBeingProcessed.insert(FI).second;
1141 assert(inserted &&
"Recursively being processed?");
1145 (CC == llvm::CallingConv::SPIR_KERNEL || CC == llvm::CallingConv::C)) {
1150 assert(CC != llvm::CallingConv::C || getContext().getLangOpts().
OpenCL);
1154 }
else if (CGM.shouldUseLLVMABILowering(CC)) {
1155 CGM.computeABIInfoUsingLib(*FI);
1157 CGM.getABIInfo().computeInfo(*FI);
1168 if (I.info.canHaveCoerceToType() && I.info.getCoerceToType() ==
nullptr)
1169 I.info.setCoerceToType(ConvertType(I.type));
1171 bool erased = FunctionsBeingProcessed.erase(FI);
1173 assert(erased &&
"Not in set?");
1179 unsigned llvmCC,
bool instanceMethod,
bool chainCall,
bool delegateCall,
1183 assert(paramInfos.empty() || paramInfos.size() == argTypes.size());
1187 void *buffer =
operator new(totalSizeToAlloc<ArgInfo, ExtParameterInfo>(
1188 argTypes.size() + 1, paramInfos.size()));
1190 CGFunctionInfo *FI =
new (buffer) CGFunctionInfo();
1191 FI->CallingConvention = llvmCC;
1192 FI->EffectiveCallingConvention = llvmCC;
1193 FI->ASTCallingConvention = info.getCC();
1194 FI->InstanceMethod = instanceMethod;
1195 FI->ChainCall = chainCall;
1196 FI->DelegateCall = delegateCall;
1197 FI->CmseNSCall = info.getCmseNSCall();
1198 FI->NoReturn = info.getNoReturn();
1199 FI->ReturnsRetained = info.getProducesResult();
1200 FI->NoCallerSavedRegs = info.getNoCallerSavedRegs();
1201 FI->NoCfCheck = info.getNoCfCheck();
1202 FI->Required = required;
1203 FI->HasRegParm = info.getHasRegParm();
1204 FI->RegParm = info.getRegParm();
1205 FI->X86ABIAVXLevel = X86ABIAVXLevel;
1206 FI->ArgStruct =
nullptr;
1207 FI->ArgStructAlign = 0;
1208 FI->NumArgs = argTypes.size();
1209 FI->HasExtParameterInfos = !paramInfos.empty();
1210 FI->getArgsBuffer()[0].
type = resultType;
1211 FI->MaxVectorWidth = 0;
1212 for (
unsigned i = 0, e = argTypes.size(); i != e; ++i)
1213 FI->getArgsBuffer()[i + 1].
type = argTypes[i];
1214 for (
unsigned i = 0, e = paramInfos.size(); i != e; ++i)
1215 FI->getExtParameterInfosBuffer()[i] = paramInfos[i];
1225struct TypeExpansion {
1226 enum TypeExpansionKind {
1238 const TypeExpansionKind Kind;
1240 TypeExpansion(TypeExpansionKind K) : Kind(K) {}
1241 virtual ~TypeExpansion() {}
1244struct ConstantArrayExpansion : TypeExpansion {
1248 ConstantArrayExpansion(QualType EltTy, uint64_t NumElts)
1249 : TypeExpansion(TEK_ConstantArray), EltTy(EltTy), NumElts(NumElts) {}
1250 static bool classof(
const TypeExpansion *TE) {
1251 return TE->Kind == TEK_ConstantArray;
1255struct RecordExpansion : TypeExpansion {
1256 SmallVector<const CXXBaseSpecifier *, 1> Bases;
1258 SmallVector<const FieldDecl *, 1> Fields;
1260 RecordExpansion(SmallVector<const CXXBaseSpecifier *, 1> &&Bases,
1261 SmallVector<const FieldDecl *, 1> &&Fields)
1262 : TypeExpansion(TEK_Record), Bases(std::move(Bases)),
1263 Fields(std::move(Fields)) {}
1264 static bool classof(
const TypeExpansion *TE) {
1265 return TE->Kind == TEK_Record;
1269struct ComplexExpansion : TypeExpansion {
1272 ComplexExpansion(QualType EltTy) : TypeExpansion(
TEK_Complex), EltTy(EltTy) {}
1273 static bool classof(
const TypeExpansion *TE) {
1278struct NoExpansion : TypeExpansion {
1279 NoExpansion() : TypeExpansion(TEK_None) {}
1280 static bool classof(
const TypeExpansion *TE) {
return TE->Kind == TEK_None; }
1284static std::unique_ptr<TypeExpansion>
1287 return std::make_unique<ConstantArrayExpansion>(AT->getElementType(),
1293 assert(!RD->hasFlexibleArrayMember() &&
1294 "Cannot expand structure with flexible array.");
1295 if (RD->isUnion()) {
1301 for (
const auto *FD : RD->fields()) {
1302 if (FD->isZeroLengthBitField())
1304 assert(!FD->isBitField() &&
1305 "Cannot expand structure with bit-field members.");
1306 CharUnits FieldSize = Context.getTypeSizeInChars(FD->getType());
1307 if (UnionSize < FieldSize) {
1308 UnionSize = FieldSize;
1313 Fields.push_back(LargestFD);
1315 if (
const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
1316 assert(!CXXRD->isDynamicClass() &&
1317 "cannot expand vtable pointers in dynamic classes");
1318 llvm::append_range(Bases, llvm::make_pointer_range(CXXRD->bases()));
1321 for (
const auto *FD : RD->fields()) {
1322 if (FD->isZeroLengthBitField())
1324 assert(!FD->isBitField() &&
1325 "Cannot expand structure with bit-field members.");
1326 Fields.push_back(FD);
1329 return std::make_unique<RecordExpansion>(std::move(Bases),
1333 return std::make_unique<ComplexExpansion>(CT->getElementType());
1335 return std::make_unique<NoExpansion>();
1340 if (
auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
1343 if (
auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
1345 for (
auto BS : RExp->Bases)
1347 for (
auto FD : RExp->Fields)
1360 if (
auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
1361 for (
int i = 0, n = CAExp->NumElts; i < n; i++) {
1364 }
else if (
auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
1365 for (
auto BS : RExp->Bases)
1367 for (
auto FD : RExp->Fields)
1369 }
else if (
auto CExp = dyn_cast<ComplexExpansion>(Exp.get())) {
1380 ConstantArrayExpansion *CAE,
1382 llvm::function_ref<
void(
Address)> Fn) {
1383 for (
int i = 0, n = CAE->NumElts; i < n; i++) {
1389void CodeGenFunction::ExpandTypeFromArgs(QualType Ty, LValue LV,
1390 llvm::Function::arg_iterator &AI) {
1391 assert(LV.isSimple() &&
1392 "Unexpected non-simple lvalue during struct expansion.");
1395 if (
auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
1397 *
this, CAExp, LV.getAddress(), [&](Address EltAddr) {
1398 LValue LV = MakeAddrLValue(EltAddr, CAExp->EltTy);
1399 ExpandTypeFromArgs(CAExp->EltTy, LV, AI);
1401 }
else if (
auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
1403 for (
const CXXBaseSpecifier *BS : RExp->Bases) {
1407 false, SourceLocation());
1408 LValue SubLV = MakeAddrLValue(Base, BS->
getType());
1411 ExpandTypeFromArgs(BS->
getType(), SubLV, AI);
1413 for (
auto FD : RExp->Fields) {
1415 LValue SubLV = EmitLValueForFieldInitialization(LV, FD);
1416 ExpandTypeFromArgs(FD->getType(), SubLV, AI);
1419 auto realValue = &*AI++;
1420 auto imagValue = &*AI++;
1421 EmitStoreOfComplex(
ComplexPairTy(realValue, imagValue), LV,
true);
1426 llvm::Value *Arg = &*AI++;
1427 if (LV.isBitField()) {
1433 if (Arg->getType()->isPointerTy()) {
1435 Arg = Builder.CreateBitCast(Arg,
Addr.getElementType());
1437 EmitStoreOfScalar(Arg, LV);
1442void CodeGenFunction::ExpandTypeToArgs(
1443 QualType Ty, CallArg Arg, llvm::FunctionType *IRFuncTy,
1444 SmallVectorImpl<llvm::Value *> &IRCallArgs,
unsigned &IRCallArgPos) {
1446 if (
auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
1451 CallArg(convertTempToRValue(EltAddr, CAExp->EltTy, SourceLocation()),
1453 ExpandTypeToArgs(CAExp->EltTy, EltArg, IRFuncTy, IRCallArgs,
1456 }
else if (
auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
1459 for (
const CXXBaseSpecifier *BS : RExp->Bases) {
1463 false, SourceLocation());
1467 ExpandTypeToArgs(BS->
getType(), BaseArg, IRFuncTy, IRCallArgs,
1471 LValue LV = MakeAddrLValue(This, Ty);
1472 for (
auto FD : RExp->Fields) {
1474 CallArg(EmitRValueForField(LV, FD, SourceLocation()), FD->getType());
1475 ExpandTypeToArgs(FD->getType(), FldArg, IRFuncTy, IRCallArgs,
1480 IRCallArgs[IRCallArgPos++] = CV.first;
1481 IRCallArgs[IRCallArgPos++] = CV.second;
1485 assert(RV.isScalar() &&
1486 "Unexpected non-scalar rvalue during struct expansion.");
1489 llvm::Value *
V = RV.getScalarVal();
1490 if (IRCallArgPos < IRFuncTy->getNumParams() &&
1491 V->getType() != IRFuncTy->getParamType(IRCallArgPos))
1492 V = Builder.CreateBitCast(
V, IRFuncTy->getParamType(IRCallArgPos));
1494 IRCallArgs[IRCallArgPos++] =
V;
1502 const Twine &Name =
"tmp") {
1515 llvm::StructType *SrcSTy,
1519 if (SrcSTy->getNumElements() == 0)
1528 uint64_t FirstEltSize = CGF.
CGM.
getDataLayout().getTypeStoreSize(FirstElt);
1529 if (FirstEltSize < DstSize &&
1538 if (llvm::StructType *SrcSTy = dyn_cast<llvm::StructType>(SrcTy))
1553 if (Val->getType() == Ty)
1559 return CGF.
Builder.CreateBitCast(Val, Ty,
"coerce.val");
1565 llvm::Type *DestIntTy = Ty;
1569 if (Val->getType() != DestIntTy) {
1571 if (DL.isBigEndian()) {
1574 uint64_t SrcSize = DL.getTypeSizeInBits(Val->getType());
1575 uint64_t DstSize = DL.getTypeSizeInBits(DestIntTy);
1577 if (SrcSize > DstSize) {
1578 Val = CGF.
Builder.CreateLShr(Val, SrcSize - DstSize,
"coerce.highbits");
1579 Val = CGF.
Builder.CreateTrunc(Val, DestIntTy,
"coerce.val.ii");
1581 Val = CGF.
Builder.CreateZExt(Val, DestIntTy,
"coerce.val.ii");
1582 Val = CGF.
Builder.CreateShl(Val, DstSize - SrcSize,
"coerce.highbits");
1586 Val = CGF.
Builder.CreateIntCast(Val, DestIntTy,
false,
"coerce.val.ii");
1591 Val = CGF.
Builder.CreateIntToPtr(Val, Ty,
"coerce.val.ip");
1598 if (PFPFields.empty())
1601 auto LoadCoercedField = [&](
CharUnits Offset,
1602 llvm::Type *FieldType) -> llvm::Value * {
1607 if (!PFPFields.empty() && PFPFields[0].Offset == Offset) {
1611 FieldVal = CGF.
Builder.CreatePtrToInt(FieldVal, FieldType);
1612 PFPFields.erase(PFPFields.begin());
1629 Val = CGF.
Builder.CreatePtrToInt(Val, Ty);
1633 auto *ET = AT->getElementType();
1637 llvm::Value *Val = llvm::PoisonValue::get(AT);
1638 for (
unsigned Idx = 0; Idx != AT->getNumElements(); ++Idx, Offset += WordSize)
1639 Val = CGF.
Builder.CreateInsertValue(Val, LoadCoercedField(Offset, ET), Idx);
1663 if (llvm::StructType *SrcSTy = dyn_cast<llvm::StructType>(SrcTy)) {
1665 DstSize.getFixedValue(), CGF);
1680 if (!SrcSize.isScalable() && !DstSize.isScalable() &&
1681 SrcSize.getFixedValue() >= DstSize.getFixedValue()) {
1695 if (
auto *ScalableDstTy = dyn_cast<llvm::ScalableVectorType>(Ty)) {
1696 if (
auto *FixedSrcTy = dyn_cast<llvm::FixedVectorType>(SrcTy)) {
1699 if (ScalableDstTy->getElementType()->isIntegerTy(1) &&
1700 FixedSrcTy->getElementType()->isIntegerTy(8)) {
1701 ScalableDstTy = llvm::ScalableVectorType::get(
1702 FixedSrcTy->getElementType(),
1704 ScalableDstTy->getElementCount().getKnownMinValue(), 8));
1706 if (ScalableDstTy->getElementType() == FixedSrcTy->getElementType()) {
1708 auto *PoisonVec = llvm::PoisonValue::get(ScalableDstTy);
1710 ScalableDstTy, PoisonVec, Load, uint64_t(0),
"cast.scalable");
1712 llvm::VectorType::getWithSizeAndScalar(ScalableDstTy, Ty));
1713 if (
Result->getType() != ScalableDstTy)
1715 if (
Result->getType() != Ty)
1728 llvm::ConstantInt::get(CGF.
IntPtrTy, SrcSize.getKnownMinValue()));
1735 if (PFPFields.empty())
1738 llvm::Type *SrcTy = Src->getType();
1739 auto StoreCoercedField = [&](
CharUnits Offset, llvm::Value *FieldVal) {
1740 if (!PFPFields.empty() && PFPFields[0].Offset == Offset) {
1745 PFPFields.erase(PFPFields.begin());
1765 auto *ET = AT->getElementType();
1769 for (
unsigned i = 0; i != AT->getNumElements(); ++i, Offset += WordSize)
1770 StoreCoercedField(Offset, CGF.
Builder.CreateExtractValue(Src, i));
1776 Address Dst, llvm::TypeSize DstSize,
1777 bool DstIsVolatile) {
1781 llvm::Type *SrcTy = Src->getType();
1782 llvm::TypeSize SrcSize =
CGM.getDataLayout().getTypeAllocSize(SrcTy);
1788 if (llvm::StructType *DstSTy =
1790 assert(!SrcSize.isScalable());
1792 SrcSize.getFixedValue(), *
this);
1799 if (SrcSize.isScalable() || SrcSize <= DstSize) {
1800 if (SrcTy->isIntegerTy() && Dst.
getElementType()->isPointerTy() &&
1804 auto *I =
Builder.CreateStore(Src, Dst, DstIsVolatile);
1806 }
else if (llvm::StructType *STy =
1807 dyn_cast<llvm::StructType>(Src->getType())) {
1810 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
1812 llvm::Value *Elt =
Builder.CreateExtractValue(Src, i);
1813 auto *I =
Builder.CreateStore(Elt, EltPtr, DstIsVolatile);
1821 }
else if (SrcTy->isIntegerTy()) {
1823 llvm::Type *DstIntTy =
Builder.getIntNTy(DstSize.getFixedValue() * 8);
1840 Builder.CreateStore(Src, Tmp);
1841 auto *I =
Builder.CreateMemCpy(
1851 if (
unsigned offset = info.getDirectOffset()) {
1860static std::pair<llvm::Value *, bool>
1862 llvm::ScalableVectorType *FromTy, llvm::Value *
V,
1863 StringRef Name =
"") {
1866 if (FromTy->getElementType()->isIntegerTy(1) &&
1867 ToTy->getElementType() == CGF.
Builder.getInt8Ty()) {
1868 if (!FromTy->getElementCount().isKnownMultipleOf(8)) {
1869 FromTy = llvm::ScalableVectorType::get(
1870 FromTy->getElementType(),
1871 llvm::alignTo<8>(FromTy->getElementCount().getKnownMinValue()));
1872 llvm::Value *ZeroVec = llvm::Constant::getNullValue(FromTy);
1873 V = CGF.
Builder.CreateInsertVector(FromTy, ZeroVec,
V, uint64_t(0));
1875 FromTy = llvm::ScalableVectorType::get(
1876 ToTy->getElementType(),
1877 FromTy->getElementCount().getKnownMinValue() / 8);
1878 V = CGF.
Builder.CreateBitCast(
V, FromTy);
1880 if (FromTy->getElementType() == ToTy->getElementType()) {
1881 V->setName(Name +
".coerce");
1882 V = CGF.
Builder.CreateExtractVector(ToTy,
V, uint64_t(0),
"cast.fixed");
1892class ClangToLLVMArgMapping {
1893 static const unsigned InvalidIndex = ~0U;
1894 unsigned InallocaArgNo;
1896 unsigned TotalIRArgs;
1900 unsigned PaddingArgIndex;
1903 unsigned FirstArgIndex;
1904 unsigned NumberOfArgs;
1907 : PaddingArgIndex(InvalidIndex), FirstArgIndex(InvalidIndex),
1911 SmallVector<IRArgs, 8> ArgInfo;
1914 ClangToLLVMArgMapping(
const ASTContext &Context,
const CGFunctionInfo &FI,
1915 bool OnlyRequiredArgs =
false)
1916 : InallocaArgNo(InvalidIndex), SRetArgNo(InvalidIndex), TotalIRArgs(0),
1917 ArgInfo(OnlyRequiredArgs ? FI.getNumRequiredArgs() : FI.arg_size()) {
1918 construct(Context, FI, OnlyRequiredArgs);
1921 bool hasInallocaArg()
const {
return InallocaArgNo != InvalidIndex; }
1922 unsigned getInallocaArgNo()
const {
1923 assert(hasInallocaArg());
1924 return InallocaArgNo;
1927 bool hasSRetArg()
const {
return SRetArgNo != InvalidIndex; }
1928 unsigned getSRetArgNo()
const {
1929 assert(hasSRetArg());
1933 unsigned totalIRArgs()
const {
return TotalIRArgs; }
1935 bool hasPaddingArg(
unsigned ArgNo)
const {
1936 assert(ArgNo < ArgInfo.size());
1937 return ArgInfo[ArgNo].PaddingArgIndex != InvalidIndex;
1939 unsigned getPaddingArgNo(
unsigned ArgNo)
const {
1940 assert(hasPaddingArg(ArgNo));
1941 return ArgInfo[ArgNo].PaddingArgIndex;
1946 std::pair<unsigned, unsigned> getIRArgs(
unsigned ArgNo)
const {
1947 assert(ArgNo < ArgInfo.size());
1948 return std::make_pair(ArgInfo[ArgNo].FirstArgIndex,
1949 ArgInfo[ArgNo].NumberOfArgs);
1953 void construct(
const ASTContext &Context,
const CGFunctionInfo &FI,
1954 bool OnlyRequiredArgs);
1957void ClangToLLVMArgMapping::construct(
const ASTContext &Context,
1958 const CGFunctionInfo &FI,
1959 bool OnlyRequiredArgs) {
1960 unsigned IRArgNo = 0;
1961 bool SwapThisWithSRet =
false;
1966 SRetArgNo = SwapThisWithSRet ? 1 : IRArgNo++;
1974 QualType ArgType = I->type;
1975 const ABIArgInfo &AI = I->info;
1977 auto &IRArgs = ArgInfo[ArgNo];
1980 IRArgs.PaddingArgIndex = IRArgNo++;
1987 llvm::StructType *STy = dyn_cast<llvm::StructType>(AI.
getCoerceToType());
1989 IRArgs.NumberOfArgs = STy->getNumElements();
1991 IRArgs.NumberOfArgs = 1;
1997 IRArgs.NumberOfArgs = 1;
2002 IRArgs.NumberOfArgs = 0;
2012 if (IRArgs.NumberOfArgs > 0) {
2013 IRArgs.FirstArgIndex = IRArgNo;
2014 IRArgNo += IRArgs.NumberOfArgs;
2019 if (IRArgNo == 1 && SwapThisWithSRet)
2022 assert(ArgNo == ArgInfo.size());
2025 InallocaArgNo = IRArgNo++;
2027 TotalIRArgs = IRArgNo;
2035 return RI.
isIndirect() || (RI.isInAlloca() && RI.getInAllocaSRet());
2050 switch (BT->getKind()) {
2053 case BuiltinType::Float:
2055 case BuiltinType::Double:
2057 case BuiltinType::LongDouble:
2068 if (BT->getKind() == BuiltinType::LongDouble)
2069 return getTarget().useObjCFP2RetForComplexLongDouble();
2083 bool Inserted = FunctionsBeingProcessed.insert(&FI).second;
2085 assert(Inserted &&
"Recursively being processed?");
2087 llvm::Type *resultType =
nullptr;
2092 llvm_unreachable(
"Invalid ABI kind for return argument");
2104 unsigned addressSpace = CGM.getTypes().getTargetAddressSpace(ret);
2105 resultType = llvm::PointerType::get(
getLLVMContext(), addressSpace);
2121 ClangToLLVMArgMapping IRFunctionArgs(
getContext(), FI,
true);
2125 if (IRFunctionArgs.hasSRetArg()) {
2126 ArgTypes[IRFunctionArgs.getSRetArgNo()] = llvm::PointerType::get(
2131 if (IRFunctionArgs.hasInallocaArg())
2132 ArgTypes[IRFunctionArgs.getInallocaArgNo()] =
2139 for (; it != ie; ++it, ++ArgNo) {
2143 if (IRFunctionArgs.hasPaddingArg(ArgNo))
2144 ArgTypes[IRFunctionArgs.getPaddingArgNo(ArgNo)] =
2147 unsigned FirstIRArg, NumIRArgs;
2148 std::tie(FirstIRArg, NumIRArgs) = IRFunctionArgs.getIRArgs(ArgNo);
2153 assert(NumIRArgs == 0);
2157 assert(NumIRArgs == 1);
2159 ArgTypes[FirstIRArg] = llvm::PointerType::get(
2163 assert(NumIRArgs == 1);
2164 ArgTypes[FirstIRArg] = llvm::PointerType::get(
2173 llvm::StructType *st = dyn_cast<llvm::StructType>(argType);
2175 assert(NumIRArgs == st->getNumElements());
2176 for (
unsigned i = 0, e = st->getNumElements(); i != e; ++i)
2177 ArgTypes[FirstIRArg + i] = st->getElementType(i);
2179 assert(NumIRArgs == 1);
2180 ArgTypes[FirstIRArg] = argType;
2186 auto ArgTypesIter = ArgTypes.begin() + FirstIRArg;
2188 *ArgTypesIter++ = EltTy;
2190 assert(ArgTypesIter == ArgTypes.begin() + FirstIRArg + NumIRArgs);
2195 auto ArgTypesIter = ArgTypes.begin() + FirstIRArg;
2197 assert(ArgTypesIter == ArgTypes.begin() + FirstIRArg + NumIRArgs);
2202 bool Erased = FunctionsBeingProcessed.erase(&FI);
2204 assert(Erased &&
"Not in set?");
2206 return llvm::FunctionType::get(resultType, ArgTypes, FI.
isVariadic());
2220 llvm::AttrBuilder &FuncAttrs,
2227 FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2231 FuncAttrs.addAttribute(
"aarch64_pstate_sm_enabled");
2233 FuncAttrs.addAttribute(
"aarch64_pstate_sm_compatible");
2235 FuncAttrs.addAttribute(
"aarch64_za_state_agnostic");
2239 FuncAttrs.addAttribute(
"aarch64_preserves_za");
2241 FuncAttrs.addAttribute(
"aarch64_in_za");
2243 FuncAttrs.addAttribute(
"aarch64_out_za");
2245 FuncAttrs.addAttribute(
"aarch64_inout_za");
2249 FuncAttrs.addAttribute(
"aarch64_preserves_zt0");
2251 FuncAttrs.addAttribute(
"aarch64_in_zt0");
2253 FuncAttrs.addAttribute(
"aarch64_out_zt0");
2255 FuncAttrs.addAttribute(
"aarch64_inout_zt0");
2259 const Decl *Callee) {
2265 for (
const OMPAssumeAttr *AA : Callee->specific_attrs<OMPAssumeAttr>())
2266 AA->getAssumption().split(Attrs,
",");
2269 FuncAttrs.addAttribute(llvm::AssumptionAttrKey,
2270 llvm::join(Attrs.begin(), Attrs.end(),
","));
2277 if (
const RecordType *RT =
2279 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl()))
2280 return ClassDecl->hasTrivialDestructor();
2286 const Decl *TargetDecl) {
2292 if (
Module.getLangOpts().Sanitize.has(SanitizerKind::Memory))
2296 if (!
Module.getLangOpts().CPlusPlus)
2299 if (
const FunctionDecl *FDecl = dyn_cast<FunctionDecl>(TargetDecl)) {
2300 if (FDecl->isExternC())
2302 }
else if (
const VarDecl *VDecl = dyn_cast<VarDecl>(TargetDecl)) {
2304 if (VDecl->isExternC())
2312 return Module.getCodeGenOpts().StrictReturn ||
2313 !
Module.MayDropFunctionReturn(
Module.getContext(), RetTy) ||
2314 Module.getLangOpts().Sanitize.has(SanitizerKind::Return);
2321 llvm::DenormalMode FP32DenormalMode,
2322 llvm::AttrBuilder &FuncAttrs) {
2323 llvm::DenormalFPEnv FPEnv(FPDenormalMode, FP32DenormalMode);
2324 if (FPEnv != llvm::DenormalFPEnv::getDefault())
2325 FuncAttrs.addDenormalFPEnvAttr(FPEnv);
2333 llvm::AttrBuilder &FuncAttrs) {
2339 StringRef Name,
bool HasOptnone,
const CodeGenOptions &CodeGenOpts,
2341 llvm::AttrBuilder &FuncAttrs) {
2344 if (CodeGenOpts.OptimizeSize)
2345 FuncAttrs.addAttribute(llvm::Attribute::OptimizeForSize);
2346 if (CodeGenOpts.OptimizeSize == 2)
2347 FuncAttrs.addAttribute(llvm::Attribute::MinSize);
2350 if (CodeGenOpts.DisableRedZone)
2351 FuncAttrs.addAttribute(llvm::Attribute::NoRedZone);
2352 if (CodeGenOpts.IndirectTlsSegRefs)
2353 FuncAttrs.addAttribute(
"indirect-tls-seg-refs");
2354 if (CodeGenOpts.NoImplicitFloat)
2355 FuncAttrs.addAttribute(llvm::Attribute::NoImplicitFloat);
2357 if (AttrOnCallSite) {
2362 FuncAttrs.addAttribute(llvm::Attribute::NoBuiltin);
2364 FuncAttrs.addAttribute(
"trap-func-name", CodeGenOpts.
TrapFuncName);
2366 switch (CodeGenOpts.getFramePointer()) {
2374 FuncAttrs.addAttribute(
"frame-pointer",
2376 CodeGenOpts.getFramePointer()));
2379 if (CodeGenOpts.LessPreciseFPMAD)
2380 FuncAttrs.addAttribute(
"less-precise-fpmad",
"true");
2382 if (CodeGenOpts.NullPointerIsValid)
2383 FuncAttrs.addAttribute(llvm::Attribute::NullPointerIsValid);
2386 FuncAttrs.addAttribute(
"no-trapping-math",
"true");
2390 if (CodeGenOpts.SoftFloat)
2391 FuncAttrs.addAttribute(
"use-soft-float",
"true");
2392 FuncAttrs.addAttribute(
"stack-protector-buffer-size",
2393 llvm::utostr(CodeGenOpts.SSPBufferSize));
2394 if (LangOpts.NoSignedZero)
2395 FuncAttrs.addAttribute(
"no-signed-zeros-fp-math",
"true");
2398 const std::vector<std::string> &Recips = CodeGenOpts.
Reciprocals;
2399 if (!Recips.empty())
2400 FuncAttrs.addAttribute(
"reciprocal-estimates", llvm::join(Recips,
","));
2404 FuncAttrs.addAttribute(
"prefer-vector-width",
2407 if (CodeGenOpts.StackRealignment)
2408 FuncAttrs.addAttribute(
"stackrealign");
2409 if (CodeGenOpts.Backchain)
2410 FuncAttrs.addAttribute(
"backchain");
2411 if (CodeGenOpts.EnableSegmentedStacks)
2412 FuncAttrs.addAttribute(
"split-stack");
2414 if (CodeGenOpts.SpeculativeLoadHardening)
2415 FuncAttrs.addAttribute(llvm::Attribute::SpeculativeLoadHardening);
2418 switch (CodeGenOpts.getZeroCallUsedRegs()) {
2419 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::Skip:
2420 FuncAttrs.removeAttribute(
"zero-call-used-regs");
2422 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::UsedGPRArg:
2423 FuncAttrs.addAttribute(
"zero-call-used-regs",
"used-gpr-arg");
2425 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::UsedGPR:
2426 FuncAttrs.addAttribute(
"zero-call-used-regs",
"used-gpr");
2428 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::UsedArg:
2429 FuncAttrs.addAttribute(
"zero-call-used-regs",
"used-arg");
2431 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::Used:
2432 FuncAttrs.addAttribute(
"zero-call-used-regs",
"used");
2434 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::AllGPRArg:
2435 FuncAttrs.addAttribute(
"zero-call-used-regs",
"all-gpr-arg");
2437 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::AllGPR:
2438 FuncAttrs.addAttribute(
"zero-call-used-regs",
"all-gpr");
2440 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::AllArg:
2441 FuncAttrs.addAttribute(
"zero-call-used-regs",
"all-arg");
2443 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::All:
2444 FuncAttrs.addAttribute(
"zero-call-used-regs",
"all");
2455 FuncAttrs.addAttribute(llvm::Attribute::Convergent);
2460 if ((LangOpts.CUDA && LangOpts.CUDAIsDevice) || LangOpts.OpenCL ||
2461 LangOpts.SYCLIsDevice) {
2462 FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2465 if (CodeGenOpts.SaveRegParams && !AttrOnCallSite)
2466 FuncAttrs.addAttribute(
"save-reg-params");
2469 StringRef Var,
Value;
2471 FuncAttrs.addAttribute(Var,
Value);
2474 if (!AttrOnCallSite) {
2487 const llvm::Function &F,
2489 auto FFeatures = F.getFnAttribute(
"target-features");
2491 llvm::StringSet<> MergedNames;
2493 MergedFeatures.reserve(TargetOpts.
Features.size());
2495 auto AddUnmergedFeatures = [&](
auto &&FeatureRange) {
2496 for (StringRef
Feature : FeatureRange) {
2500 StringRef Name =
Feature.drop_front(1);
2501 bool Merged = !MergedNames.insert(Name).second;
2503 MergedFeatures.push_back(
Feature);
2507 if (FFeatures.isValid())
2508 AddUnmergedFeatures(llvm::split(FFeatures.getValueAsString(),
','));
2509 AddUnmergedFeatures(TargetOpts.
Features);
2511 if (!MergedFeatures.empty()) {
2512 llvm::sort(MergedFeatures);
2513 FuncAttr.addAttribute(
"target-features", llvm::join(MergedFeatures,
","));
2520 bool WillInternalize) {
2522 llvm::AttrBuilder FuncAttrs(F.getContext());
2525 if (!TargetOpts.
CPU.empty())
2526 FuncAttrs.addAttribute(
"target-cpu", TargetOpts.
CPU);
2527 if (!TargetOpts.
TuneCPU.empty())
2528 FuncAttrs.addAttribute(
"tune-cpu", TargetOpts.
TuneCPU);
2531 CodeGenOpts, LangOpts,
2534 if (!WillInternalize && F.isInterposable()) {
2539 F.addFnAttrs(FuncAttrs);
2543 llvm::AttributeMask AttrsToRemove;
2547 llvm::DenormalFPEnv MergedFPEnv =
2548 OptsFPEnv.mergeCalleeMode(F.getDenormalFPEnv());
2550 if (MergedFPEnv == llvm::DenormalFPEnv::getDefault()) {
2551 AttrsToRemove.addAttribute(llvm::Attribute::DenormalFPEnv);
2554 FuncAttrs.addDenormalFPEnvAttr(MergedFPEnv);
2557 F.removeFnAttrs(AttrsToRemove);
2561 F.addFnAttrs(FuncAttrs);
2564void CodeGenModule::getTrivialDefaultFunctionAttributes(
2565 StringRef Name,
bool HasOptnone,
bool AttrOnCallSite,
2566 llvm::AttrBuilder &FuncAttrs) {
2568 getLangOpts(), AttrOnCallSite,
2572void CodeGenModule::getDefaultFunctionAttributes(StringRef Name,
2574 bool AttrOnCallSite,
2575 llvm::AttrBuilder &FuncAttrs) {
2579 if (!AttrOnCallSite)
2585 if (!AttrOnCallSite)
2590 llvm::AttrBuilder &attrs) {
2591 getDefaultFunctionAttributes(
"",
false,
2593 GetCPUAndFeaturesAttributes(
GlobalDecl(), attrs);
2598 const NoBuiltinAttr *NBA =
nullptr) {
2599 auto AddNoBuiltinAttr = [&FuncAttrs](StringRef BuiltinName) {
2601 AttributeName +=
"no-builtin-";
2602 AttributeName += BuiltinName;
2603 FuncAttrs.addAttribute(AttributeName);
2607 if (LangOpts.NoBuiltin) {
2609 FuncAttrs.addAttribute(
"no-builtins");
2623 if (llvm::is_contained(NBA->builtinNames(),
"*")) {
2624 FuncAttrs.addAttribute(
"no-builtins");
2629 llvm::for_each(NBA->builtinNames(), AddNoBuiltinAttr);
2633 const llvm::DataLayout &DL,
const ABIArgInfo &AI,
2634 bool CheckCoerce =
true) {
2641 if (!DL.typeSizeEqualsStoreSize(Ty))
2648 if (llvm::TypeSize::isKnownGT(DL.getTypeSizeInBits(CoerceTy),
2649 DL.getTypeSizeInBits(Ty)))
2673 if (
const MatrixType *Matrix = dyn_cast<MatrixType>(QTy))
2684 unsigned NumRequiredArgs,
unsigned ArgNo) {
2685 const auto *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl);
2690 if (ArgNo >= NumRequiredArgs)
2694 if (ArgNo < FD->getNumParams()) {
2695 const ParmVarDecl *Param = FD->getParamDecl(ArgNo);
2696 if (Param && Param->hasAttr<MaybeUndefAttr>())
2713 if (llvm::AttributeFuncs::isNoFPClassCompatibleType(IRTy))
2716 if (llvm::StructType *ST = dyn_cast<llvm::StructType>(IRTy)) {
2718 llvm::all_of(ST->elements(),
2719 llvm::AttributeFuncs::isNoFPClassCompatibleType);
2727 llvm::AttributeList &Attrs) {
2728 if (Attrs.getMemoryEffects().getModRef() == llvm::ModRefInfo::NoModRef) {
2729 Attrs = Attrs.removeFnAttribute(
getLLVMContext(), llvm::Attribute::Memory);
2730 llvm::Attribute MemoryAttr = llvm::Attribute::getWithMemoryEffects(
2756 llvm::AttributeList &AttrList,
2758 bool AttrOnCallSite,
bool IsThunk) {
2766 FuncAttrs.addAttribute(llvm::Attribute::NoReturn);
2768 FuncAttrs.addAttribute(
"cmse_nonsecure_call");
2779 bool HasOptnone =
false;
2781 const NoBuiltinAttr *NBA =
nullptr;
2785 std::optional<llvm::Attribute::AttrKind> MemAttrForPtrArgs;
2786 bool AddedPotentialArgAccess =
false;
2787 auto AddPotentialArgAccess = [&]() {
2788 AddedPotentialArgAccess =
true;
2789 llvm::Attribute A = FuncAttrs.getAttribute(llvm::Attribute::Memory);
2791 FuncAttrs.addMemoryAttr(A.getMemoryEffects() |
2792 llvm::MemoryEffects::argMemOnly());
2799 if (TargetDecl->
hasAttr<ReturnsTwiceAttr>())
2800 FuncAttrs.addAttribute(llvm::Attribute::ReturnsTwice);
2801 if (TargetDecl->
hasAttr<NoThrowAttr>())
2802 FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2803 if (TargetDecl->
hasAttr<NoReturnAttr>())
2804 FuncAttrs.addAttribute(llvm::Attribute::NoReturn);
2805 if (TargetDecl->
hasAttr<ColdAttr>())
2806 FuncAttrs.addAttribute(llvm::Attribute::Cold);
2807 if (TargetDecl->
hasAttr<HotAttr>())
2808 FuncAttrs.addAttribute(llvm::Attribute::Hot);
2809 if (TargetDecl->
hasAttr<NoDuplicateAttr>())
2810 FuncAttrs.addAttribute(llvm::Attribute::NoDuplicate);
2811 if (TargetDecl->
hasAttr<ConvergentAttr>())
2812 FuncAttrs.addAttribute(llvm::Attribute::Convergent);
2814 if (
const FunctionDecl *Fn = dyn_cast<FunctionDecl>(TargetDecl)) {
2817 if (AttrOnCallSite && Fn->isReplaceableGlobalAllocationFunction()) {
2820 Fn->getDeclName().isAnyOperatorNew())
2821 RetAttrs.addAttribute(llvm::Attribute::NoAlias);
2824 const bool IsVirtualCall = MD && MD->
isVirtual();
2827 if (!(AttrOnCallSite && IsVirtualCall)) {
2828 if (Fn->isNoReturn())
2829 FuncAttrs.addAttribute(llvm::Attribute::NoReturn);
2830 NBA = Fn->getAttr<NoBuiltinAttr>();
2837 if (AttrOnCallSite && TargetDecl->
hasAttr<NoMergeAttr>())
2838 FuncAttrs.addAttribute(llvm::Attribute::NoMerge);
2842 if (TargetDecl->
hasAttr<ConstAttr>()) {
2843 FuncAttrs.addMemoryAttr(llvm::MemoryEffects::none());
2844 FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2847 FuncAttrs.addAttribute(llvm::Attribute::WillReturn);
2848 MemAttrForPtrArgs = llvm::Attribute::ReadNone;
2849 }
else if (TargetDecl->
hasAttr<PureAttr>()) {
2850 FuncAttrs.addMemoryAttr(llvm::MemoryEffects::readOnly());
2851 FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2853 FuncAttrs.addAttribute(llvm::Attribute::WillReturn);
2854 MemAttrForPtrArgs = llvm::Attribute::ReadOnly;
2855 }
else if (TargetDecl->
hasAttr<NoAliasAttr>()) {
2856 FuncAttrs.addMemoryAttr(llvm::MemoryEffects::inaccessibleOrArgMemOnly());
2857 FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2859 if (
const auto *RA = TargetDecl->
getAttr<RestrictAttr>();
2860 RA && RA->getDeallocator() ==
nullptr)
2861 RetAttrs.addAttribute(llvm::Attribute::NoAlias);
2862 if (TargetDecl->
hasAttr<ReturnsNonNullAttr>() &&
2863 !CodeGenOpts.NullPointerIsValid)
2864 RetAttrs.addAttribute(llvm::Attribute::NonNull);
2865 if (TargetDecl->
hasAttr<AnyX86NoCallerSavedRegistersAttr>())
2866 FuncAttrs.addAttribute(
"no_caller_saved_registers");
2867 if (TargetDecl->
hasAttr<AnyX86NoCfCheckAttr>())
2868 FuncAttrs.addAttribute(llvm::Attribute::NoCfCheck);
2869 if (TargetDecl->
hasAttr<LeafAttr>())
2870 FuncAttrs.addAttribute(llvm::Attribute::NoCallback);
2871 if (TargetDecl->
hasAttr<BPFFastCallAttr>())
2872 FuncAttrs.addAttribute(
"bpf_fastcall");
2874 HasOptnone = TargetDecl->
hasAttr<OptimizeNoneAttr>();
2875 if (
auto *AllocSize = TargetDecl->
getAttr<AllocSizeAttr>()) {
2876 std::optional<unsigned> NumElemsParam;
2877 if (AllocSize->getNumElemsParam().isValid())
2878 NumElemsParam = AllocSize->getNumElemsParam().getLLVMIndex();
2879 FuncAttrs.addAllocSizeAttr(AllocSize->getElemSizeParam().getLLVMIndex(),
2889 FuncAttrs.addAttribute(
"uniform-work-group-size");
2891 if (TargetDecl->
hasAttr<ArmLocallyStreamingAttr>())
2892 FuncAttrs.addAttribute(
"aarch64_pstate_sm_body");
2894 if (
auto *ModularFormat = TargetDecl->
getAttr<ModularFormatAttr>()) {
2895 FormatAttr *Format = TargetDecl->
getAttr<FormatAttr>();
2896 StringRef
Type = Format->getType()->getName();
2897 std::string FormatIdx = std::to_string(Format->getFormatIdx());
2898 std::string FirstArg = std::to_string(Format->getFirstArg());
2900 Type, FormatIdx, FirstArg,
2901 ModularFormat->getModularImplFn()->getName(),
2902 ModularFormat->getImplName()};
2903 llvm::append_range(Args, ModularFormat->aspects());
2904 FuncAttrs.addAttribute(
"modular-format", llvm::join(Args,
","));
2917 getDefaultFunctionAttributes(Name, HasOptnone, AttrOnCallSite, FuncAttrs);
2922 if (TargetDecl->
hasAttr<NoSpeculativeLoadHardeningAttr>())
2923 FuncAttrs.removeAttribute(llvm::Attribute::SpeculativeLoadHardening);
2924 if (TargetDecl->
hasAttr<SpeculativeLoadHardeningAttr>())
2925 FuncAttrs.addAttribute(llvm::Attribute::SpeculativeLoadHardening);
2926 if (TargetDecl->
hasAttr<NoSplitStackAttr>())
2927 FuncAttrs.removeAttribute(
"split-stack");
2928 if (TargetDecl->
hasAttr<ZeroCallUsedRegsAttr>()) {
2931 TargetDecl->
getAttr<ZeroCallUsedRegsAttr>()->getZeroCallUsedRegs();
2932 FuncAttrs.removeAttribute(
"zero-call-used-regs");
2933 FuncAttrs.addAttribute(
2934 "zero-call-used-regs",
2935 ZeroCallUsedRegsAttr::ConvertZeroCallUsedRegsKindToStr(Kind));
2942 if (CodeGenOpts.NoPLT) {
2943 if (
auto *Fn = dyn_cast<FunctionDecl>(TargetDecl)) {
2944 if (!Fn->isDefined() && !AttrOnCallSite) {
2945 FuncAttrs.addAttribute(llvm::Attribute::NonLazyBind);
2950 if (TargetDecl->
hasAttr<NoConvergentAttr>())
2951 FuncAttrs.removeAttribute(llvm::Attribute::Convergent);
2956 if (TargetDecl && CodeGenOpts.UniqueInternalLinkageNames) {
2957 if (
const auto *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl)) {
2958 if (!FD->isExternallyVisible())
2959 FuncAttrs.addAttribute(
"sample-profile-suffix-elision-policy",
2966 if (!AttrOnCallSite) {
2967 if (TargetDecl && TargetDecl->
hasAttr<CmseNSEntryAttr>())
2968 FuncAttrs.addAttribute(
"cmse_nonsecure_entry");
2971 auto shouldDisableTailCalls = [&] {
2973 if (CodeGenOpts.DisableTailCalls)
2979 if (TargetDecl->
hasAttr<DisableTailCallsAttr>() ||
2980 TargetDecl->
hasAttr<AnyX86InterruptAttr>())
2983 if (CodeGenOpts.NoEscapingBlockTailCalls) {
2984 if (
const auto *BD = dyn_cast<BlockDecl>(TargetDecl))
2985 if (!BD->doesNotEscape())
2991 if (shouldDisableTailCalls())
2992 FuncAttrs.addAttribute(
"disable-tail-calls",
"true");
2997 static const llvm::StringSet<> ReturnsTwiceFn{
2998 "_setjmpex",
"setjmp",
"_setjmp",
"vfork",
2999 "sigsetjmp",
"__sigsetjmp",
"savectx",
"getcontext"};
3000 if (ReturnsTwiceFn.contains(Name))
3001 FuncAttrs.addAttribute(llvm::Attribute::ReturnsTwice);
3005 GetCPUAndFeaturesAttributes(CalleeInfo.
getCalleeDecl(), FuncAttrs);
3008 if (!MSHotPatchFunctions.empty()) {
3009 bool IsHotPatched = llvm::binary_search(MSHotPatchFunctions, Name);
3011 FuncAttrs.addAttribute(
"marked_for_windows_hot_patching");
3016 if (CodeGenOpts.isLoaderReplaceableFunctionName(Name))
3017 FuncAttrs.addAttribute(
"loader-replaceable");
3020 ClangToLLVMArgMapping IRFunctionArgs(
getContext(), FI);
3027 if (CodeGenOpts.EnableNoundefAttrs &&
3031 RetAttrs.addAttribute(llvm::Attribute::NoUndef);
3037 RetAttrs.addAttribute(llvm::Attribute::SExt);
3039 RetAttrs.addAttribute(llvm::Attribute::ZExt);
3041 RetAttrs.addAttribute(llvm::Attribute::NoExt);
3046 RetAttrs.addAttribute(llvm::Attribute::InReg);
3049 RetAttrs.addNoFPClassAttr(
3059 AddPotentialArgAccess();
3068 llvm_unreachable(
"Invalid ABI kind for return argument");
3076 RetAttrs.addDereferenceableAttr(
3078 if (
getTypes().getTargetAddressSpace(PTy) == 0 &&
3079 !CodeGenOpts.NullPointerIsValid)
3080 RetAttrs.addAttribute(llvm::Attribute::NonNull);
3082 llvm::Align Alignment =
3084 RetAttrs.addAlignmentAttr(Alignment);
3089 bool hasUsedSRet =
false;
3091 for (
unsigned I = 0; I < IRFunctionArgs.totalIRArgs(); ++I)
3095 if (IRFunctionArgs.hasSRetArg()) {
3096 llvm::AttrBuilder &SRETAttrs = ArgAttrs[IRFunctionArgs.getSRetArgNo()];
3097 SRETAttrs.addStructRetAttr(
getTypes().ConvertTypeForMem(RetTy));
3098 SRETAttrs.addAttribute(llvm::Attribute::Writable);
3099 SRETAttrs.addAttribute(llvm::Attribute::DeadOnUnwind);
3102 SRETAttrs.addAttribute(llvm::Attribute::InReg);
3107 if (IRFunctionArgs.hasInallocaArg()) {
3108 ArgAttrs[IRFunctionArgs.getInallocaArgNo()].addInAllocaAttr(
3118 auto IRArgs = IRFunctionArgs.getIRArgs(0);
3120 assert(IRArgs.second == 1 &&
"Expected only a single `this` pointer.");
3122 llvm::AttrBuilder &Attrs = ArgAttrs[IRArgs.first];
3127 if (!CodeGenOpts.NullPointerIsValid &&
3129 Attrs.addAttribute(llvm::Attribute::NonNull);
3130 Attrs.addDereferenceableAttr(ThisSz);
3136 Attrs.addDereferenceableOrNullAttr(ThisSz);
3139 llvm::Align Alignment =
3143 Attrs.addAlignmentAttr(Alignment);
3145 const auto *DD = dyn_cast_if_present<CXXDestructorDecl>(
3159 CodeGenOpts.StrictLifetimes) {
3161 dyn_cast<CXXRecordDecl>(DD->getDeclContext());
3165 Attrs.addDeadOnReturnAttr(llvm::DeadOnReturnInfo(
3166 Context.getASTRecordLayout(ClassDecl).getDataSize().getQuantity()));
3172 I != E; ++I, ++ArgNo) {
3178 if (IRFunctionArgs.hasPaddingArg(ArgNo)) {
3180 ArgAttrs[IRFunctionArgs.getPaddingArgNo(ArgNo)].addAttribute(
3181 llvm::Attribute::InReg);
3186 if (CodeGenOpts.EnableNoundefAttrs &&
3188 Attrs.addAttribute(llvm::Attribute::NoUndef);
3197 Attrs.addAttribute(llvm::Attribute::SExt);
3199 Attrs.addAttribute(llvm::Attribute::ZExt);
3201 Attrs.addAttribute(llvm::Attribute::NoExt);
3206 Attrs.addAttribute(llvm::Attribute::Nest);
3208 Attrs.addAttribute(llvm::Attribute::InReg);
3209 Attrs.addStackAlignmentAttr(llvm::MaybeAlign(AI.
getDirectAlign()));
3212 Attrs.addNoFPClassAttr(
3217 "Pass-by-value parameter has incomplete definition?");
3220 Attrs.addAttribute(llvm::Attribute::InReg);
3232 Attrs.addByValAttr(
getTypes().ConvertTypeForMem(ParamType));
3240 Attrs.addDeadOnReturnAttr(llvm::DeadOnReturnInfo());
3245 if (CodeGenOpts.PassByValueIsNoAlias &&
Decl &&
3246 Decl->getArgPassingRestrictions() ==
3250 Attrs.addAttribute(llvm::Attribute::NoAlias);
3280 Attrs.addAttribute(llvm::Attribute::NoFreeObj);
3281 Attrs.addDereferenceableAttr(
3282 Context.getTypeSizeInChars(ParamType).getQuantity());
3286 AddPotentialArgAccess();
3291 Attrs.addByRefAttr(
getTypes().ConvertTypeForMem(ParamType));
3302 AddPotentialArgAccess();
3310 if (
getTypes().getTargetAddressSpace(PTy) == 0 &&
3311 !CodeGenOpts.NullPointerIsValid)
3312 Attrs.addAttribute(llvm::Attribute::NonNull);
3314 llvm::Align Alignment =
3316 Attrs.addAlignmentAttr(Alignment);
3325 DeviceKernelAttr::isOpenCLSpelling(
3326 TargetDecl->
getAttr<DeviceKernelAttr>()) &&
3330 llvm::Align Alignment =
3332 Attrs.addAlignmentAttr(Alignment);
3339 Attrs.addAttribute(llvm::Attribute::NoAlias);
3348 Attrs.addStructRetAttr(
getTypes().ConvertTypeForMem(ParamType));
3353 Attrs.addAttribute(llvm::Attribute::NoAlias);
3357 if (!PTy->isIncompleteType() && PTy->isConstantSizeType()) {
3358 auto info =
getContext().getTypeInfoInChars(PTy);
3359 Attrs.addDereferenceableAttr(info.Width.getQuantity());
3360 Attrs.addAlignmentAttr(info.Align.getAsAlign());
3366 Attrs.addAttribute(llvm::Attribute::SwiftError);
3370 Attrs.addAttribute(llvm::Attribute::SwiftSelf);
3374 Attrs.addAttribute(llvm::Attribute::SwiftAsync);
3379 Attrs.addCapturesAttr(
3380 llvm::CaptureInfo(llvm::CaptureComponents::Address));
3382 if (Attrs.hasAttributes()) {
3383 unsigned FirstIRArg, NumIRArgs;
3384 std::tie(FirstIRArg, NumIRArgs) = IRFunctionArgs.getIRArgs(ArgNo);
3385 for (
unsigned i = 0; i < NumIRArgs; i++)
3386 ArgAttrs[FirstIRArg + i].merge(Attrs);
3394 AddPotentialArgAccess();
3397 if (AddedPotentialArgAccess && MemAttrForPtrArgs) {
3401 I != E; ++I, ++ArgNo) {
3402 if (I->info.isDirect() || I->info.isExpand() ||
3403 I->info.isCoerceAndExpand()) {
3404 unsigned FirstIRArg, NumIRArgs;
3405 std::tie(FirstIRArg, NumIRArgs) = IRFunctionArgs.getIRArgs(ArgNo);
3406 for (
unsigned i = FirstIRArg; i < FirstIRArg + NumIRArgs; ++i) {
3413 if (i < FunctionType->getNumParams() &&
3415 ArgAttrs[i].addAttribute(*MemAttrForPtrArgs);
3423 for (
const llvm::AttrBuilder &Attrs : ArgAttrs)
3424 ArgAttrSets.push_back(llvm::AttributeSet::get(
getLLVMContext(), Attrs));
3426 AttrList = llvm::AttributeList::get(
3428 llvm::AttributeSet::get(
getLLVMContext(), RetAttrs), ArgAttrSets);
3435 llvm::Value *value) {
3436 llvm::Type *varType = CGF.
ConvertType(var->getType());
3440 if (value->getType() == varType)
3443 assert((varType->isIntegerTy() || varType->isFloatingPointTy()) &&
3444 "unexpected promotion type");
3447 return CGF.
Builder.CreateTrunc(value, varType,
"arg.unpromote");
3449 return CGF.
Builder.CreateFPCast(value, varType,
"arg.unpromote");
3455 QualType ArgType,
unsigned ArgNo) {
3463 if (!ArgType->isAnyPointerType() && !ArgType->isBlockPointerType())
3467 if (
auto ParmNNAttr = PVD->
getAttr<NonNullAttr>())
3474 if (NNAttr->isNonNull(ArgNo))
3481struct CopyBackSwiftError final : EHScopeStack::Cleanup {
3484 CopyBackSwiftError(Address temp, Address arg) : Temp(temp), Arg(
arg) {}
3485 void Emit(CodeGenFunction &CGF, Flags flags)
override {
3504 if (FD->hasImplicitReturnZero()) {
3505 QualType RetTy = FD->getReturnType().getUnqualifiedType();
3506 llvm::Type *LLVMTy =
CGM.getTypes().ConvertType(RetTy);
3507 llvm::Constant *
Zero = llvm::Constant::getNullValue(LLVMTy);
3515 ClangToLLVMArgMapping IRFunctionArgs(
CGM.getContext(), FI);
3516 assert(Fn->arg_size() == IRFunctionArgs.totalIRArgs());
3521 if (IRFunctionArgs.hasInallocaArg())
3522 ArgStruct =
Address(Fn->getArg(IRFunctionArgs.getInallocaArgNo()),
3526 if (IRFunctionArgs.hasSRetArg()) {
3527 auto AI = Fn->getArg(IRFunctionArgs.getSRetArgNo());
3528 AI->setName(
"agg.result");
3529 AI->addAttr(llvm::Attribute::NoAlias);
3536 ArgVals.reserve(Args.size());
3542 assert(FI.
arg_size() == Args.size() &&
3543 "Mismatch between function signature & arguments.");
3546 for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end(); i != e;
3547 ++i, ++info_it, ++ArgNo) {
3560 unsigned FirstIRArg, NumIRArgs;
3561 std::tie(FirstIRArg, NumIRArgs) = IRFunctionArgs.getIRArgs(ArgNo);
3565 assert(NumIRArgs == 0);
3578 assert(NumIRArgs == 1);
3601 llvm::ConstantInt::get(
IntPtrTy, Size.getQuantity()));
3602 ParamAddr = AlignedTemp;
3619 auto AI = Fn->getArg(FirstIRArg);
3627 assert(NumIRArgs == 1);
3629 if (
const ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(Arg)) {
3632 PVD->getFunctionScopeIndex()) &&
3633 !
CGM.getCodeGenOpts().NullPointerIsValid)
3634 AI->addAttr(llvm::Attribute::NonNull);
3636 QualType OTy = PVD->getOriginalType();
3637 if (
const auto *ArrTy =
getContext().getAsConstantArrayType(OTy)) {
3643 QualType ETy = ArrTy->getElementType();
3644 llvm::Align Alignment =
3645 CGM.getNaturalTypeAlignment(ETy).getAsAlign();
3647 .addAlignmentAttr(Alignment));
3648 uint64_t ArrSize = ArrTy->getZExtSize();
3652 Attrs.addDereferenceableAttr(
3653 getContext().getTypeSizeInChars(ETy).getQuantity() *
3655 AI->addAttrs(Attrs);
3656 }
else if (
getContext().getTargetInfo().getNullPointerValue(
3658 !
CGM.getCodeGenOpts().NullPointerIsValid) {
3659 AI->addAttr(llvm::Attribute::NonNull);
3662 }
else if (
const auto *ArrTy =
3668 QualType ETy = ArrTy->getElementType();
3669 llvm::Align Alignment =
3670 CGM.getNaturalTypeAlignment(ETy).getAsAlign();
3672 .addAlignmentAttr(Alignment));
3673 if (!
getTypes().getTargetAddressSpace(ETy) &&
3674 !
CGM.getCodeGenOpts().NullPointerIsValid)
3675 AI->addAttr(llvm::Attribute::NonNull);
3680 const auto *AVAttr = PVD->getAttr<AlignValueAttr>();
3683 AVAttr = TOTy->getDecl()->getAttr<AlignValueAttr>();
3684 if (AVAttr && !
SanOpts.has(SanitizerKind::Alignment)) {
3688 llvm::ConstantInt *AlignmentCI =
3690 uint64_t AlignmentInt =
3691 AlignmentCI->getLimitedValue(llvm::Value::MaximumAlignment);
3692 if (AI->getParamAlign().valueOrOne() < AlignmentInt) {
3693 AI->removeAttr(llvm::Attribute::AttrKind::Alignment);
3695 .addAlignmentAttr(llvm::Align(AlignmentInt)));
3702 AI->addAttr(llvm::Attribute::NoAlias);
3710 assert(NumIRArgs == 1);
3714 llvm::Value *
V = AI;
3722 V, pointeeTy,
getContext().getTypeAlignInChars(pointeeTy));
3723 llvm::Value *incomingErrorValue =
Builder.CreateLoad(arg);
3724 Builder.CreateStore(incomingErrorValue, temp);
3745 if (
V->getType() != LTy)
3756 if (
auto *VecTyTo = dyn_cast<llvm::FixedVectorType>(
ConvertType(Ty))) {
3757 llvm::Value *ArgVal = Fn->getArg(FirstIRArg);
3758 if (
auto *VecTyFrom =
3759 dyn_cast<llvm::ScalableVectorType>(ArgVal->getType())) {
3761 *
this, VecTyTo, VecTyFrom, ArgVal, Arg->
getName());
3763 assert(NumIRArgs == 1);
3770 llvm::StructType *STy =
3781 STy->getNumElements() > 1) {
3782 llvm::TypeSize StructSize =
CGM.getDataLayout().getTypeAllocSize(STy);
3783 llvm::TypeSize PtrElementSize =
3784 CGM.getDataLayout().getTypeAllocSize(Ptr.getElementType());
3785 if (StructSize.isScalable()) {
3786 assert(STy->containsHomogeneousScalableVectorTypes() &&
3787 "ABI only supports structure with homogeneous scalable vector "
3789 assert(StructSize == PtrElementSize &&
3790 "Only allow non-fractional movement of structure with"
3791 "homogeneous scalable vector type");
3792 assert(STy->getNumElements() == NumIRArgs);
3794 llvm::Value *LoadedStructValue = llvm::PoisonValue::get(STy);
3795 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
3796 auto *AI = Fn->getArg(FirstIRArg + i);
3797 AI->setName(Arg->
getName() +
".coerce" + Twine(i));
3799 Builder.CreateInsertValue(LoadedStructValue, AI, i);
3802 Builder.CreateStore(LoadedStructValue, Ptr);
3804 uint64_t SrcSize = StructSize.getFixedValue();
3805 uint64_t DstSize = PtrElementSize.getFixedValue();
3808 if (SrcSize <= DstSize) {
3809 AddrToStoreInto = Ptr.withElementType(STy);
3815 assert(STy->getNumElements() == NumIRArgs);
3816 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
3817 auto AI = Fn->getArg(FirstIRArg + i);
3818 AI->setName(Arg->
getName() +
".coerce" + Twine(i));
3820 Builder.CreateStore(AI, EltPtr);
3823 if (SrcSize > DstSize) {
3824 Builder.CreateMemCpy(Ptr, AddrToStoreInto, DstSize);
3836 assert(NumIRArgs == 1);
3837 auto AI = Fn->getArg(FirstIRArg);
3838 AI->setName(Arg->
getName() +
".coerce");
3841 llvm::TypeSize::getFixed(
3842 getContext().getTypeSizeInChars(Ty).getQuantity() -
3868 auto *unpaddedStruct = dyn_cast<llvm::StructType>(unpaddedCoercionType);
3872 unsigned argIndex = FirstIRArg;
3873 unsigned unpaddedIndex = 0;
3874 for (
unsigned i = 0, e = coercionType->getNumElements(); i != e; ++i) {
3875 llvm::Type *eltType = coercionType->getElementType(i);
3879 auto eltAddr =
Builder.CreateStructGEP(alloca, i);
3880 llvm::Value *elt = Fn->getArg(argIndex++);
3882 auto paramType = unpaddedStruct
3883 ? unpaddedStruct->getElementType(unpaddedIndex++)
3884 : unpaddedCoercionType;
3886 if (
auto *VecTyTo = dyn_cast<llvm::FixedVectorType>(eltType)) {
3887 if (
auto *VecTyFrom = dyn_cast<llvm::ScalableVectorType>(paramType)) {
3890 *
this, VecTyTo, VecTyFrom, elt, elt->getName());
3891 assert(Extracted &&
"Unexpected scalable to fixed vector coercion");
3894 Builder.CreateStore(elt, eltAddr);
3896 assert(argIndex == FirstIRArg + NumIRArgs);
3909 auto FnArgIter = Fn->arg_begin() + FirstIRArg;
3910 ExpandTypeFromArgs(Ty, LV, FnArgIter);
3911 assert(FnArgIter == Fn->arg_begin() + FirstIRArg + NumIRArgs);
3912 for (
unsigned i = 0, e = NumIRArgs; i != e; ++i) {
3913 auto AI = Fn->getArg(FirstIRArg + i);
3914 AI->setName(Arg->
getName() +
"." + Twine(i));
3920 auto *AI = Fn->getArg(FirstIRArg);
3921 AI->setName(Arg->
getName() +
".target_coerce");
3925 CGM.getABIInfo().createCoercedStore(AI, Ptr, ArgI,
false, *
this);
3939 assert(NumIRArgs == 0);
3952 if (
getTarget().getCXXABI().areArgsDestroyedLeftToRightInCallee()) {
3953 for (
int I = Args.size() - 1; I >= 0; --I)
3956 for (
unsigned I = 0, E = Args.size(); I != E; ++I)
3962 while (insn->use_empty()) {
3963 llvm::BitCastInst *bitcast = dyn_cast<llvm::BitCastInst>(insn);
3969 bitcast->eraseFromParent();
3975 llvm::Value *result) {
3977 llvm::BasicBlock *BB = CGF.
Builder.GetInsertBlock();
3980 if (&BB->back() != result)
3983 llvm::Type *resultType = result->getType();
3992 while (llvm::BitCastInst *bitcast = dyn_cast<llvm::BitCastInst>(generator)) {
3998 if (generator->getNextNode() != bitcast)
4001 InstsToKill.push_back(bitcast);
4008 llvm::CallInst *call = dyn_cast<llvm::CallInst>(generator);
4012 bool doRetainAutorelease;
4015 doRetainAutorelease =
true;
4016 }
else if (call->getCalledOperand() ==
4018 doRetainAutorelease =
false;
4026 llvm::Instruction *prev = call->getPrevNode();
4029 prev = prev->getPrevNode();
4035 InstsToKill.push_back(prev);
4041 result = call->getArgOperand(0);
4042 InstsToKill.push_back(call);
4046 while (llvm::BitCastInst *bitcast = dyn_cast<llvm::BitCastInst>(result)) {
4047 if (!bitcast->hasOneUse())
4049 InstsToKill.push_back(bitcast);
4050 result = bitcast->getOperand(0);
4054 for (
auto *I : InstsToKill)
4055 I->eraseFromParent();
4058 if (doRetainAutorelease)
4062 return CGF.
Builder.CreateBitCast(result, resultType);
4067 llvm::Value *result) {
4070 dyn_cast_or_null<ObjCMethodDecl>(CGF.
CurCodeDecl);
4079 llvm::CallInst *retainCall = dyn_cast<llvm::CallInst>(result);
4080 if (!retainCall || retainCall->getCalledOperand() !=
4085 llvm::Value *retainedValue = retainCall->getArgOperand(0);
4086 llvm::LoadInst *load =
4087 dyn_cast<llvm::LoadInst>(retainedValue->stripPointerCasts());
4088 if (!load || load->isAtomic() || load->isVolatile() ||
4095 llvm::Type *resultType = result->getType();
4097 assert(retainCall->use_empty());
4098 retainCall->eraseFromParent();
4101 return CGF.
Builder.CreateBitCast(load, resultType);
4108 llvm::Value *result) {
4131 auto GetStoreIfValid = [&CGF,
4132 ReturnValuePtr](llvm::User *
U) -> llvm::StoreInst * {
4133 auto *SI = dyn_cast<llvm::StoreInst>(
U);
4134 if (!SI || SI->getPointerOperand() != ReturnValuePtr ||
4140 assert(!SI->isAtomic() &&
4148 if (!ReturnValuePtr->hasOneUse()) {
4149 llvm::BasicBlock *IP = CGF.
Builder.GetInsertBlock();
4155 const llvm::Instruction *LoadIntoFakeUse =
nullptr;
4156 for (llvm::Instruction &I : llvm::reverse(*IP)) {
4160 if (LoadIntoFakeUse == &I)
4164 if (
auto *II = dyn_cast<llvm::IntrinsicInst>(&I)) {
4165 if (II->getIntrinsicID() == llvm::Intrinsic::lifetime_end)
4168 if (II->getIntrinsicID() == llvm::Intrinsic::fake_use) {
4169 LoadIntoFakeUse = dyn_cast<llvm::Instruction>(II->getArgOperand(0));
4173 return GetStoreIfValid(&I);
4178 llvm::StoreInst *store = GetStoreIfValid(ReturnValuePtr->user_back());
4184 llvm::BasicBlock *StoreBB = store->getParent();
4185 llvm::BasicBlock *IP = CGF.
Builder.GetInsertBlock();
4187 while (IP != StoreBB) {
4188 if (!SeenBBs.insert(IP).second || !(IP = IP->getSinglePredecessor()))
4204 int BitWidth,
int CharWidth) {
4205 assert(CharWidth <= 64);
4206 assert(
static_cast<unsigned>(BitWidth) <= Bits.size() * CharWidth);
4209 if (BitOffset >= CharWidth) {
4210 Pos += BitOffset / CharWidth;
4211 BitOffset = BitOffset % CharWidth;
4214 const uint64_t
Used = (uint64_t(1) << CharWidth) - 1;
4215 if (BitOffset + BitWidth >= CharWidth) {
4216 Bits[Pos++] |= (
Used << BitOffset) &
Used;
4217 BitWidth -= CharWidth - BitOffset;
4221 while (BitWidth >= CharWidth) {
4223 BitWidth -= CharWidth;
4227 Bits[Pos++] |= (
Used >> (CharWidth - BitWidth)) << BitOffset;
4235 int StorageSize,
int BitOffset,
int BitWidth,
4236 int CharWidth,
bool BigEndian) {
4239 setBitRange(TmpBits, BitOffset, BitWidth, CharWidth);
4242 std::reverse(TmpBits.begin(), TmpBits.end());
4244 for (uint64_t
V : TmpBits)
4245 Bits[StorageOffset++] |=
V;
4248static void setUsedBits(CodeGenModule &, QualType,
int,
4249 SmallVectorImpl<uint64_t> &);
4291 QualType ETy = Context.getBaseElementType(ATy);
4292 int Size = Context.getTypeSizeInChars(ETy).getQuantity();
4296 for (
int I = 0, N = Context.getConstantArrayElementCount(ATy); I < N; ++I) {
4297 auto Src = TmpBits.begin();
4298 auto Dst = Bits.begin() + Offset + I * Size;
4299 for (
int J = 0; J < Size; ++J)
4312 if (
const auto *ATy = Context.getAsConstantArrayType(QTy))
4315 int Size = Context.getTypeSizeInChars(QTy).getQuantity();
4319 std::fill_n(Bits.begin() + Offset, Size,
4320 (uint64_t(1) << Context.getCharWidth()) - 1);
4324 int Pos,
int Size,
int CharWidth,
4329 for (
auto P = Bits.begin() + Pos, E = Bits.begin() + Pos + Size; P != E;
4331 Mask = (Mask << CharWidth) | *P;
4333 auto P = Bits.begin() + Pos + Size, End = Bits.begin() + Pos;
4335 Mask = (Mask << CharWidth) | *--P;
4344 llvm::IntegerType *ITy,
4346 assert(Src->getType() == ITy);
4347 assert(ITy->getScalarSizeInBits() <= 64);
4349 const llvm::DataLayout &DataLayout =
CGM.getDataLayout();
4350 int Size = DataLayout.getTypeStoreSize(ITy);
4354 int CharWidth =
CGM.getContext().getCharWidth();
4358 return Builder.CreateAnd(Src, Mask,
"cmse.clear");
4364 llvm::ArrayType *ATy,
4366 const llvm::DataLayout &DataLayout =
CGM.getDataLayout();
4367 int Size = DataLayout.getTypeStoreSize(ATy);
4372 int CharWidth =
CGM.getContext().getCharWidth();
4374 ATy->getArrayElementType()->getScalarSizeInBits() / CharWidth;
4376 llvm::Value *R = llvm::PoisonValue::get(ATy);
4377 for (
int I = 0, N = ATy->getArrayNumElements(); I != N; ++I) {
4379 DataLayout.isBigEndian());
4380 MaskIndex += CharsPerElt;
4381 llvm::Value *T0 =
Builder.CreateExtractValue(Src, I);
4382 llvm::Value *T1 =
Builder.CreateAnd(T0, Mask,
"cmse.clear");
4383 R =
Builder.CreateInsertValue(R, T1, I);
4391 uint64_t RetKeyInstructionsSourceAtom) {
4406 auto *I =
Builder.CreateRetVoid();
4407 if (RetKeyInstructionsSourceAtom)
4414 llvm::DebugLoc RetDbgLoc;
4415 llvm::Value *RV =
nullptr;
4425 llvm::Function::arg_iterator EI =
CurFn->arg_end();
4427 llvm::Value *ArgStruct = &*EI;
4428 llvm::Value *SRet =
Builder.CreateStructGEP(
4437 auto AI =
CurFn->arg_begin();
4455 CGM.getNaturalTypeAlignment(RetTy, &BaseInfo, &TBAAInfo);
4482 RetDbgLoc = SI->getDebugLoc();
4484 RV = SI->getValueOperand();
4485 SI->eraseFromParent();
4508 if (
auto *FD = dyn_cast<FunctionDecl>(
CurCodeDecl))
4509 RT = FD->getReturnType();
4510 else if (
auto *MD = dyn_cast<ObjCMethodDecl>(
CurCodeDecl))
4511 RT = MD->getReturnType();
4513 RT =
BlockInfo->BlockExpression->getFunctionType()->getReturnType();
4515 llvm_unreachable(
"Unexpected function/method type");
4531 auto *unpaddedStruct = dyn_cast<llvm::StructType>(unpaddedCoercionType);
4536 unsigned unpaddedIndex = 0;
4537 for (
unsigned i = 0, e = coercionType->getNumElements(); i != e; ++i) {
4538 auto coercedEltType = coercionType->getElementType(i);
4542 auto eltAddr =
Builder.CreateStructGEP(addr, i);
4545 unpaddedStruct ? unpaddedStruct->getElementType(unpaddedIndex++)
4546 : unpaddedCoercionType,
4548 results.push_back(elt);
4552 if (results.size() == 1) {
4560 RV = llvm::PoisonValue::get(returnType);
4561 for (
unsigned i = 0, e = results.size(); i != e; ++i) {
4562 RV =
Builder.CreateInsertValue(RV, results[i], i);
4569 RV =
CGM.getABIInfo().createCoercedLoad(
V, RetAI, *
this);
4574 llvm_unreachable(
"Invalid ABI kind for return argument");
4577 llvm::Instruction *Ret;
4583 auto *ITy = dyn_cast<llvm::IntegerType>(RV->getType());
4590 Ret =
Builder.CreateRetVoid();
4594 Ret->setDebugLoc(std::move(RetDbgLoc));
4596 llvm::Value *Backup = RV ? Ret->getOperand(0) :
nullptr;
4597 if (RetKeyInstructionsSourceAtom)
4613 ReturnsNonNullAttr *RetNNAttr =
nullptr;
4614 if (
SanOpts.has(SanitizerKind::ReturnsNonnullAttribute))
4615 RetNNAttr =
CurCodeDecl->getAttr<ReturnsNonNullAttr>();
4617 if (!RetNNAttr && !requiresReturnValueNullabilityCheck())
4625 assert(!requiresReturnValueNullabilityCheck() &&
4626 "Cannot check nullability and the nonnull attribute");
4627 AttrLoc = RetNNAttr->getLocation();
4628 CheckKind = SanitizerKind::SO_ReturnsNonnullAttribute;
4629 Handler = SanitizerHandler::NonnullReturn;
4631 if (
auto *DD = dyn_cast<DeclaratorDecl>(
CurCodeDecl))
4632 if (
auto *TSI = DD->getTypeSourceInfo())
4634 AttrLoc = FTL.getReturnLoc().findNullabilityLoc();
4635 CheckKind = SanitizerKind::SO_NullabilityReturn;
4636 Handler = SanitizerHandler::NullabilityReturn;
4645 llvm::Value *SLocPtr =
Builder.CreateLoad(ReturnLocation,
"return.sloc.load");
4646 llvm::Value *CanNullCheck =
Builder.CreateIsNotNull(SLocPtr);
4647 if (requiresReturnValueNullabilityCheck())
4649 Builder.CreateAnd(CanNullCheck, RetValNullabilityPrecondition);
4650 Builder.CreateCondBr(CanNullCheck, Check, NoCheck);
4654 llvm::Value *Cond =
Builder.CreateIsNotNull(RV);
4656 llvm::Value *DynamicData[] = {SLocPtr};
4657 EmitCheck(std::make_pair(Cond, CheckKind), Handler, StaticData, DynamicData);
4676 llvm::Type *IRPtrTy = llvm::PointerType::getUnqual(CGF.
getLLVMContext());
4677 llvm::Value *Placeholder = llvm::PoisonValue::get(IRPtrTy);
4702 if (
type->isReferenceType()) {
4711 param->
hasAttr<NSConsumedAttr>() &&
type->isObjCRetainableType()) {
4712 llvm::Value *ptr =
Builder.CreateLoad(local);
4715 Builder.CreateStore(null, local);
4726 type->castAsRecordDecl()->isParamDestroyedInCallee() &&
4730 assert(cleanup.isValid() &&
4731 "cleanup for callee-destructed param not recorded");
4733 llvm::Instruction *isActive =
Builder.CreateUnreachable();
4739 return llvm::isa_and_nonnull<llvm::ConstantPointerNull>(addr);
4749 const LValue &srcLV = writeback.
Source;
4750 Address srcAddr = srcLV.getAddress();
4752 "shouldn't have writeback for provably null argument");
4760 llvm::BasicBlock *contBB =
nullptr;
4766 if (!provablyNonNull) {
4771 CGF.
Builder.CreateCondBr(isNull, contBB, writebackBB);
4780 "icr.writeback-cast");
4789 if (writeback.
ToUse) {
4814 if (!provablyNonNull)
4823 for (
const auto &I : llvm::reverse(Cleanups)) {
4825 I.IsActiveIP->eraseFromParent();
4831 if (uop->getOpcode() == UO_AddrOf)
4832 return uop->getSubExpr();
4857 Address srcAddr = srcLV.getAddress();
4862 llvm::PointerType *destType =
4864 llvm::Type *destElemType =
4891 llvm::BasicBlock *contBB =
nullptr;
4892 llvm::BasicBlock *originBB =
nullptr;
4895 llvm::Value *finalArgument;
4899 if (provablyNonNull) {
4904 finalArgument = CGF.
Builder.CreateSelect(
4905 isNull, llvm::ConstantPointerNull::get(destType),
4911 originBB = CGF.
Builder.GetInsertBlock();
4914 CGF.
Builder.CreateCondBr(isNull, contBB, copyBB);
4916 condEval.
begin(CGF);
4920 llvm::Value *valueToUse =
nullptr;
4928 src = CGF.
Builder.CreateBitCast(src, destElemType,
"icr.cast");
4945 if (shouldCopy && !provablyNonNull) {
4946 llvm::BasicBlock *copyBB = CGF.
Builder.GetInsertBlock();
4951 llvm::PHINode *phiToUse =
4952 CGF.
Builder.CreatePHI(valueToUse->getType(), 2,
"icr.to-use");
4953 phiToUse->addIncoming(valueToUse, copyBB);
4954 phiToUse->addIncoming(llvm::PoisonValue::get(valueToUse->getType()),
4956 valueToUse = phiToUse;
4970 StackBase = CGF.
Builder.CreateStackSave(
"inalloca.save");
4976 CGF.
Builder.CreateStackRestore(StackBase);
4983 if (!AC.
getDecl() || !(
SanOpts.has(SanitizerKind::NonnullAttribute) ||
4984 SanOpts.has(SanitizerKind::NullabilityArg)))
4989 unsigned ArgNo = PVD ? PVD->getFunctionScopeIndex() : ParmNum;
4992 const NonNullAttr *NNAttr =
nullptr;
4993 if (
SanOpts.has(SanitizerKind::NonnullAttribute))
4996 bool CanCheckNullability =
false;
4997 if (
SanOpts.has(SanitizerKind::NullabilityArg) && !NNAttr && PVD &&
4998 !PVD->getType()->isRecordType()) {
4999 auto Nullability = PVD->getType()->getNullability();
5000 CanCheckNullability = Nullability &&
5002 PVD->getTypeSourceInfo();
5005 if (!NNAttr && !CanCheckNullability)
5012 AttrLoc = NNAttr->getLocation();
5013 CheckKind = SanitizerKind::SO_NonnullAttribute;
5014 Handler = SanitizerHandler::NonnullArg;
5016 AttrLoc = PVD->getTypeSourceInfo()->getTypeLoc().findNullabilityLoc();
5017 CheckKind = SanitizerKind::SO_NullabilityArg;
5018 Handler = SanitizerHandler::NullabilityArg;
5023 llvm::Constant *StaticData[] = {
5026 llvm::ConstantInt::get(
Int32Ty, ArgNo + 1),
5028 EmitCheck(std::make_pair(Cond, CheckKind), Handler, StaticData, {});
5034 if (!AC.
getDecl() || !(
SanOpts.has(SanitizerKind::NonnullAttribute) ||
5035 SanOpts.has(SanitizerKind::NullabilityArg)))
5054 return llvm::any_of(ArgTypes, [&](
QualType Ty) {
5065 return classDecl->getTypeParamListAsWritten();
5069 return catDecl->getTypeParamList();
5079 llvm::iterator_range<CallExpr::const_arg_iterator> ArgRange,
5083 assert((ParamsToSkip == 0 ||
Prototype.P) &&
5084 "Can't skip parameters if type info is not provided");
5094 bool IsVariadic =
false;
5096 const auto *MD = dyn_cast<const ObjCMethodDecl *>(
Prototype.P);
5098 IsVariadic = MD->isVariadic();
5100 MD,
CGM.getTarget().getTriple().isOSWindows());
5101 ArgTypes.assign(MD->param_type_begin() + ParamsToSkip,
5102 MD->param_type_end());
5105 IsVariadic = FPT->isVariadic();
5106 ExplicitCC = FPT->getExtInfo().getCC();
5107 ArgTypes.assign(FPT->param_type_begin() + ParamsToSkip,
5108 FPT->param_type_end());
5116 assert(Arg != ArgRange.end() &&
"Running over edge of argument list!");
5118 QualType ArgTy = (*Arg)->getType();
5119 if (
const auto *OBT = ParamTy->
getAs<OverflowBehaviorType>())
5120 ParamTy = OBT->getUnderlyingType();
5121 if (
const auto *OBT = ArgTy->
getAs<OverflowBehaviorType>())
5122 ArgTy = OBT->getUnderlyingType();
5125 getContext().getCanonicalType(ParamTy).getTypePtr() ==
5126 getContext().getCanonicalType(ArgTy).getTypePtr()) &&
5127 "type mismatch in call argument!");
5133 assert((Arg == ArgRange.end() || IsVariadic) &&
5134 "Extra arguments in non-variadic function!");
5139 for (
auto *A : llvm::drop_begin(ArgRange, ArgTypes.size()))
5140 ArgTypes.push_back(IsVariadic ? getVarArgType(A) : A->getType());
5141 assert((
int)ArgTypes.size() == (ArgRange.end() - ArgRange.begin()));
5149 CGM.getTarget().getCXXABI().areArgsDestroyedLeftToRightInCallee()
5153 auto MaybeEmitImplicitObjectSize = [&](
unsigned I,
const Expr *Arg,
5162 auto SizeTy = Context.getSizeType();
5164 assert(EmittedArg.getScalarVal() &&
"We emitted nothing for the arg?");
5165 llvm::Value *
V = evaluateOrEmitBuiltinObjectSize(
5166 Arg, PS->getType(),
T, EmittedArg.getScalarVal(), PS->isDynamic());
5171 std::swap(Args.back(), *(&Args.back() - 1));
5177 "inalloca only supported on x86");
5182 size_t CallArgsStart = Args.size();
5183 for (
unsigned I = 0, E = ArgTypes.size(); I != E; ++I) {
5184 unsigned Idx = LeftToRight ? I : E - I - 1;
5186 unsigned InitialArgSize = Args.size();
5190 getContext().hasSameUnqualifiedType((*Arg)->getType(),
5194 "Argument and parameter types don't match");
5198 assert(InitialArgSize + 1 == Args.size() &&
5199 "The code below depends on only adding one arg per EmitCallArg");
5200 (void)InitialArgSize;
5203 if (!Args.back().hasLValue()) {
5204 RValue RVArg = Args.back().getKnownRValue();
5206 ParamsToSkip + Idx);
5210 MaybeEmitImplicitObjectSize(Idx, *Arg, RVArg);
5217 std::reverse(Args.begin() + CallArgsStart, Args.end());
5226struct DestroyUnpassedArg final : EHScopeStack::Cleanup {
5236 assert(!Dtor->isTrivial());
5259 if (!HasLV &&
RV.isScalar())
5261 else if (!HasLV &&
RV.isComplex())
5264 auto Addr = HasLV ?
LV.getAddress() :
RV.getAggregateAddress();
5268 HasLV ?
LV.isVolatileQualified()
5269 :
RV.isVolatileQualified());
5281 std::optional<DisableDebugLocationUpdates> Dis;
5285 dyn_cast<ObjCIndirectCopyRestoreExpr>(E)) {
5299 "reference binding to unmaterialized r-value!");
5311 if (
type->isRecordType() &&
5312 type->castAsRecordDecl()->isParamDestroyedInCallee()) {
5319 bool DestroyedInCallee =
true, NeedsCleanup =
true;
5320 if (
const auto *RD =
type->getAsCXXRecordDecl())
5321 DestroyedInCallee = RD->hasNonTrivialDestructor();
5323 NeedsCleanup =
type.isDestructedType();
5325 if (DestroyedInCallee)
5332 if (DestroyedInCallee && NeedsCleanup) {
5339 llvm::Instruction *IsActive =
5346 if (HasAggregateEvalKind) {
5347 auto *ICE = dyn_cast<ImplicitCastExpr>(E);
5348 if (ICE && ICE->getCastKind() == CK_LValueToRValue &&
5349 ICE->getSubExpr()->getType().getAddressSpace() !=
5351 !
type->isArrayParameterType() && !
type.isNonTrivialToPrimitiveCopy()) {
5362QualType CodeGenFunction::getVarArgType(
const Expr *Arg) {
5366 if (!getTarget().
getTriple().isOSWindows())
5370 getContext().getTypeSize(Arg->
getType()) <
5374 return getContext().getIntPtrType();
5382void CodeGenFunction::AddObjCARCExceptionMetadata(llvm::Instruction *Inst) {
5383 if (CGM.getCodeGenOpts().OptimizationLevel != 0 &&
5384 !CGM.getCodeGenOpts().ObjCAutoRefCountExceptions)
5385 Inst->setMetadata(
"clang.arc.no_objc_arc_exceptions",
5386 CGM.getNoObjCARCExceptionsMetadata());
5392 const llvm::Twine &name) {
5393 return EmitNounwindRuntimeCall(callee, ArrayRef<llvm::Value *>(), name);
5399 ArrayRef<Address> args,
5400 const llvm::Twine &name) {
5401 SmallVector<llvm::Value *, 3> values;
5402 for (
auto arg : args)
5403 values.push_back(
arg.emitRawPointer(*
this));
5404 return EmitNounwindRuntimeCall(callee, values, name);
5409 ArrayRef<llvm::Value *> args,
5410 const llvm::Twine &name) {
5411 llvm::CallInst *call = EmitRuntimeCall(callee, args, name);
5412 call->setDoesNotThrow();
5419 const llvm::Twine &name) {
5420 return EmitRuntimeCall(callee, {},
name);
5425SmallVector<llvm::OperandBundleDef, 1>
5434 if (
auto *CalleeFn = dyn_cast<llvm::Function>(Callee->stripPointerCasts())) {
5435 if (CalleeFn->isIntrinsic() && CalleeFn->doesNotThrow()) {
5436 auto IID = CalleeFn->getIntrinsicID();
5437 if (!llvm::IntrinsicInst::mayLowerToFunctionCall(IID))
5448 assert(F->isIntrinsic() &&
"expected an intrinsic declaration");
5449 return F->isConvergent();
5454 ArrayRef<llvm::Value *> args,
5455 const llvm::Twine &name,
5456 bool IsConvergent) {
5457 SmallVector<llvm::OperandBundleDef> BundleList =
5458 getBundlesForFunclet(callee.getCallee());
5460 addConvergenceControlBundle(BundleList);
5462 llvm::CallInst *call = Builder.CreateCall(callee, args, BundleList, name);
5463 call->setCallingConv(getRuntimeCC());
5464 assert((IsConvergent == call->isConvergent() ||
5465 (!IsConvergent && !CGM.shouldEmitConvergenceTokens())) &&
5466 "runtime call convergence doesn't match its declaration");
5471 const llvm::Twine &Name) {
5472 return EmitIntrinsicCall(ID, {}, {}, Name);
5476 ArrayRef<llvm::Value *> Args,
5477 const llvm::Twine &Name) {
5478 return EmitIntrinsicCall(ID, {}, Args, Name);
5482 ArrayRef<llvm::Type *> Types,
5483 ArrayRef<llvm::Value *> Args,
5484 const llvm::Twine &Name) {
5486 llvm::Intrinsic::getOrInsertDeclaration(&CGM.getModule(), ID, Types);
5487 SmallVector<llvm::OperandBundleDef> BundleList = getBundlesForFunclet(F);
5489 addConvergenceControlBundle(BundleList);
5490 return Builder.CreateCall(F, Args, BundleList, Name);
5494 ArrayRef<llvm::Value *> Args,
5496 const llvm::Twine &Name) {
5497 SmallVector<llvm::Type *> ArgTys;
5498 ArgTys.reserve(Args.size());
5499 for (llvm::Value *Arg : Args)
5500 ArgTys.push_back(Arg->
getType());
5501 llvm::Function *F = llvm::Intrinsic::getOrInsertDeclaration(
5502 &CGM.getModule(), ID, RetTy, ArgTys);
5503 SmallVector<llvm::OperandBundleDef> BundleList = getBundlesForFunclet(F);
5505 addConvergenceControlBundle(BundleList);
5506 return Builder.CreateCall(F, Args, BundleList, Name);
5516 llvm::InvokeInst *invoke =
Builder.CreateInvoke(
5518 invoke->setDoesNotReturn();
5521 llvm::CallInst *call =
Builder.CreateCall(callee, args, BundleList);
5522 call->setDoesNotReturn();
5531 const Twine &name) {
5539 const Twine &name) {
5549 const Twine &Name) {
5554 llvm::CallBase *Inst;
5556 Inst =
Builder.CreateCall(Callee, Args, BundleList, Name);
5559 Inst =
Builder.CreateInvoke(Callee, ContBB, InvokeDest, Args, BundleList,
5566 if (
CGM.getLangOpts().ObjCAutoRefCount)
5567 AddObjCARCExceptionMetadata(Inst);
5572void CodeGenFunction::deferPlaceholderReplacement(llvm::Instruction *Old,
5574 DeferredReplacements.push_back(
5575 std::make_pair(llvm::WeakTrackingVH(Old),
New));
5582[[nodiscard]] llvm::AttributeList
5583maybeRaiseRetAlignmentAttribute(llvm::LLVMContext &Ctx,
5584 const llvm::AttributeList &Attrs,
5585 llvm::Align NewAlign) {
5586 llvm::Align CurAlign = Attrs.getRetAlignment().valueOrOne();
5587 if (CurAlign >= NewAlign)
5589 llvm::Attribute AlignAttr = llvm::Attribute::getWithAlignment(Ctx, NewAlign);
5590 return Attrs.removeRetAttribute(Ctx, llvm::Attribute::AttrKind::Alignment)
5591 .addRetAttribute(Ctx, AlignAttr);
5594template <
typename AlignedAttrTy>
class AbstractAssumeAlignedAttrEmitter {
5599 const AlignedAttrTy *AA =
nullptr;
5601 llvm::Value *Alignment =
nullptr;
5602 llvm::ConstantInt *OffsetCI =
nullptr;
5608 AA = FuncDecl->
getAttr<AlignedAttrTy>();
5613 [[nodiscard]] llvm::AttributeList
5614 TryEmitAsCallSiteAttribute(
const llvm::AttributeList &Attrs) {
5615 if (!AA || OffsetCI || CGF.
SanOpts.
has(SanitizerKind::Alignment))
5617 const auto *AlignmentCI = dyn_cast<llvm::ConstantInt>(Alignment);
5622 if (!AlignmentCI->getValue().isPowerOf2())
5624 llvm::AttributeList NewAttrs = maybeRaiseRetAlignmentAttribute(
5627 AlignmentCI->getLimitedValue(llvm::Value::MaximumAlignment)));
5635 void EmitAsAnAssumption(SourceLocation Loc, QualType RetTy, RValue &Ret) {
5639 AA->getLocation(), Alignment, OffsetCI);
5645class AssumeAlignedAttrEmitter final
5646 :
public AbstractAssumeAlignedAttrEmitter<AssumeAlignedAttr> {
5648 AssumeAlignedAttrEmitter(CodeGenFunction &CGF_,
const Decl *FuncDecl)
5649 : AbstractAssumeAlignedAttrEmitter(CGF_, FuncDecl) {
5654 if (Expr *Offset = AA->getOffset()) {
5656 if (OffsetCI->isNullValue())
5663class AllocAlignAttrEmitter final
5664 :
public AbstractAssumeAlignedAttrEmitter<AllocAlignAttr> {
5666 AllocAlignAttrEmitter(CodeGenFunction &CGF_,
const Decl *FuncDecl,
5667 const CallArgList &CallArgs)
5668 : AbstractAssumeAlignedAttrEmitter(CGF_, FuncDecl) {
5672 Alignment = CallArgs[AA->getParamIndex().getLLVMIndex()]
5681 if (
auto *VT = dyn_cast<llvm::VectorType>(Ty))
5682 return VT->getPrimitiveSizeInBits().getKnownMinValue();
5683 if (
auto *AT = dyn_cast<llvm::ArrayType>(Ty))
5686 unsigned MaxVectorWidth = 0;
5687 if (
auto *ST = dyn_cast<llvm::StructType>(Ty))
5688 for (
auto *I : ST->elements())
5690 return MaxVectorWidth;
5697 llvm::CallBase **callOrInvoke,
bool IsMustTail,
5699 bool IsVirtualFunctionPointerThunk) {
5702 assert(Callee.isOrdinary() || Callee.isVirtual());
5709 llvm::FunctionType *IRFuncTy =
getTypes().GetFunctionType(CallInfo);
5711 const Decl *TargetDecl = Callee.getAbstractInfo().getCalleeDecl().getDecl();
5712 if (
const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl)) {
5719 if ((TargetDecl->
hasAttr<AlwaysInlineAttr>() &&
5720 (TargetDecl->
hasAttr<TargetAttr>() ||
5724 TargetDecl->
hasAttr<TargetAttr>())))
5731 const FunctionDecl *CalleeDecl = dyn_cast_or_null<FunctionDecl>(TargetDecl);
5732 CGM.getTargetCodeGenInfo().checkFunctionCallABI(
CGM, Loc, CallerDecl,
5733 CalleeDecl, CallArgs, RetTy);
5740 if (llvm::StructType *ArgStruct = CallInfo.
getArgStruct()) {
5741 const llvm::DataLayout &DL =
CGM.getDataLayout();
5743 llvm::AllocaInst *AI;
5745 IP = IP->getNextNode();
5746 AI =
new llvm::AllocaInst(ArgStruct, DL.getAllocaAddrSpace(),
"argmem",
5752 AI->setAlignment(Align.getAsAlign());
5753 AI->setUsedWithInAlloca(
true);
5754 assert(AI->isUsedWithInAlloca() && !AI->isStaticAlloca());
5755 ArgMemory =
RawAddress(AI, ArgStruct, Align);
5758 ClangToLLVMArgMapping IRFunctionArgs(
CGM.getContext(), CallInfo);
5766 bool NeedSRetLifetimeEnd =
false;
5772 if ((IsVirtualFunctionPointerThunk || IsMustTail) && RetAI.
isIndirect()) {
5774 IRFunctionArgs.getSRetArgNo(),
5782 if (NeedSRetLifetimeEnd)
5783 SRetAlloca = SRetPtr;
5786 if (IRFunctionArgs.hasSRetArg()) {
5799 IRCallArgs[IRFunctionArgs.getSRetArgNo()] =
5817 assert(CallInfo.
arg_size() == CallArgs.size() &&
5818 "Mismatch between function signature & arguments.");
5821 for (CallArgList::const_iterator I = CallArgs.begin(), E = CallArgs.end();
5822 I != E; ++I, ++info_it, ++ArgNo) {
5826 if (IRFunctionArgs.hasPaddingArg(ArgNo))
5827 IRCallArgs[IRFunctionArgs.getPaddingArgNo(ArgNo)] =
5830 unsigned FirstIRArg, NumIRArgs;
5831 std::tie(FirstIRArg, NumIRArgs) = IRFunctionArgs.getIRArgs(ArgNo);
5833 bool ArgHasMaybeUndefAttr =
5838 assert(NumIRArgs == 0);
5840 if (I->isAggregate()) {
5842 ? I->getKnownLValue().getAddress()
5843 : I->getKnownRValue().getAggregateAddress();
5844 llvm::Instruction *Placeholder =
5849 CGBuilderTy::InsertPoint IP =
Builder.saveIP();
5850 Builder.SetInsertPoint(Placeholder);
5864 deferPlaceholderReplacement(Placeholder,
Addr.getPointer());
5869 I->Ty,
getContext().getTypeAlignInChars(I->Ty),
5870 "indirect-arg-temp");
5871 I->copyInto(*
this,
Addr);
5880 I->copyInto(*
this,
Addr);
5887 assert(NumIRArgs == 1);
5888 if (I->isAggregate()) {
5898 ? I->getKnownLValue().getAddress()
5899 : I->getKnownRValue().getAggregateAddress();
5901 const llvm::DataLayout *TD = &
CGM.getDataLayout();
5903 assert((FirstIRArg >= IRFuncTy->getNumParams() ||
5904 IRFuncTy->getParamType(FirstIRArg)->getPointerAddressSpace() ==
5905 TD->getAllocaAddrSpace()) &&
5906 "indirect argument must be in alloca address space");
5908 bool NeedCopy =
false;
5909 if (
Addr.getAlignment() < Align &&
5910 llvm::getOrEnforceKnownAlignment(
Addr.emitRawPointer(*
this),
5914 }
else if (I->hasLValue()) {
5915 auto LV = I->getKnownLValue();
5920 if (!isByValOrRef ||
5921 (LV.getAlignment() <
getContext().getTypeAlignInChars(I->Ty))) {
5925 if (isByValOrRef &&
Addr.getType()->getAddressSpace() !=
5934 auto *
T = llvm::PointerType::get(
CGM.getLLVMContext(),
5942 if (ArgHasMaybeUndefAttr)
5943 Val =
Builder.CreateFreeze(Val);
5944 IRCallArgs[FirstIRArg] = Val;
5947 }
else if (I->getType()->isArrayParameterType()) {
5953 IRCallArgs[FirstIRArg] = I->getKnownRValue().getScalarVal();
5962 if (ArgHasMaybeUndefAttr)
5963 Val =
Builder.CreateFreeze(Val);
5964 IRCallArgs[FirstIRArg] = Val;
5969 CallLifetimeEndAfterCall.emplace_back(AI);
5972 I->copyInto(*
this, AI);
5977 assert(NumIRArgs == 0);
5985 assert(NumIRArgs == 1);
5987 if (!I->isAggregate())
5988 V = I->getKnownRValue().getScalarVal();
5991 I->hasLValue() ? I->getKnownLValue().getAddress()
5992 : I->getKnownRValue().getAggregateAddress());
5998 assert(!swiftErrorTemp.
isValid() &&
"multiple swifterror args");
6002 V, pointeeTy,
getContext().getTypeAlignInChars(pointeeTy));
6009 llvm::Value *errorValue =
Builder.CreateLoad(swiftErrorArg);
6010 Builder.CreateStore(errorValue, swiftErrorTemp);
6015 V->getType()->isIntegerTy())
6022 if (FirstIRArg < IRFuncTy->getNumParams() &&
6023 V->getType() != IRFuncTy->getParamType(FirstIRArg)) {
6024 assert(
V->getType()->isPointerTy() &&
"Only pointers can mismatch!");
6028 if (ArgHasMaybeUndefAttr)
6030 IRCallArgs[FirstIRArg] =
V;
6034 llvm::StructType *STy =
6039 if (!I->isAggregate()) {
6041 I->copyInto(*
this, Src);
6043 Src = I->hasLValue() ? I->getKnownLValue().getAddress()
6044 : I->getKnownRValue().getAggregateAddress();
6054 llvm::TypeSize SrcTypeSize =
6055 CGM.getDataLayout().getTypeAllocSize(SrcTy);
6056 llvm::TypeSize DstTypeSize =
CGM.getDataLayout().getTypeAllocSize(STy);
6057 if (SrcTypeSize.isScalable()) {
6058 assert(STy->containsHomogeneousScalableVectorTypes() &&
6059 "ABI only supports structure with homogeneous scalable vector "
6061 assert(SrcTypeSize == DstTypeSize &&
6062 "Only allow non-fractional movement of structure with "
6063 "homogeneous scalable vector type");
6064 assert(NumIRArgs == STy->getNumElements());
6066 llvm::Value *StoredStructValue =
6068 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
6069 llvm::Value *Extract =
Builder.CreateExtractValue(
6070 StoredStructValue, i, Src.
getName() +
".extract" + Twine(i));
6071 IRCallArgs[FirstIRArg + i] = Extract;
6074 uint64_t SrcSize = SrcTypeSize.getFixedValue();
6075 uint64_t DstSize = DstTypeSize.getFixedValue();
6076 bool HasPFPFields =
getContext().hasPFPFields(I->Ty);
6082 if (HasPFPFields || SrcSize < DstSize) {
6093 Builder.CreateMemCpy(TempAlloca, Src, SrcSize);
6099 assert(NumIRArgs == STy->getNumElements());
6100 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
6102 llvm::Value *LI =
Builder.CreateLoad(EltPtr);
6103 if (ArgHasMaybeUndefAttr)
6104 LI =
Builder.CreateFreeze(LI);
6105 IRCallArgs[FirstIRArg + i] = LI;
6110 assert(NumIRArgs == 1);
6118 auto *ATy = dyn_cast<llvm::ArrayType>(Load->getType());
6123 if (ArgHasMaybeUndefAttr)
6124 Load =
Builder.CreateFreeze(Load);
6125 IRCallArgs[FirstIRArg] = Load;
6133 auto layout =
CGM.getDataLayout().getStructLayout(coercionType);
6135 auto *unpaddedStruct = dyn_cast<llvm::StructType>(unpaddedCoercionType);
6139 bool NeedLifetimeEnd =
false;
6140 if (I->isAggregate()) {
6141 addr = I->hasLValue() ? I->getKnownLValue().getAddress()
6142 : I->getKnownRValue().getAggregateAddress();
6145 RValue RV = I->getKnownRValue();
6149 auto scalarAlign =
CGM.getDataLayout().getPrefTypeAlign(scalarType);
6154 layout->getAlignment(), scalarAlign)),
6156 nullptr, &AllocaAddr);
6164 unsigned IRArgPos = FirstIRArg;
6165 unsigned unpaddedIndex = 0;
6166 for (
unsigned i = 0, e = coercionType->getNumElements(); i != e; ++i) {
6167 llvm::Type *eltType = coercionType->getElementType(i);
6174 : unpaddedCoercionType,
6176 if (ArgHasMaybeUndefAttr)
6177 elt =
Builder.CreateFreeze(elt);
6178 IRCallArgs[IRArgPos++] = elt;
6180 assert(IRArgPos == FirstIRArg + NumIRArgs);
6182 if (NeedLifetimeEnd)
6188 unsigned IRArgPos = FirstIRArg;
6189 ExpandTypeToArgs(I->Ty, *I, IRFuncTy, IRCallArgs, IRArgPos);
6190 assert(IRArgPos == FirstIRArg + NumIRArgs);
6196 if (!I->isAggregate()) {
6198 I->copyInto(*
this, Src);
6200 Src = I->hasLValue() ? I->getKnownLValue().getAddress()
6201 : I->getKnownRValue().getAggregateAddress();
6207 CGM.getABIInfo().createCoercedLoad(Src, ArgInfo, *
this);
6208 IRCallArgs[FirstIRArg] = Load;
6214 const CGCallee &ConcreteCallee = Callee.prepareConcreteCallee(*
this);
6220 assert(IRFunctionArgs.hasInallocaArg());
6221 IRCallArgs[IRFunctionArgs.getInallocaArgNo()] = Arg;
6232 auto simplifyVariadicCallee = [](llvm::FunctionType *CalleeFT,
6233 llvm::Value *Ptr) -> llvm::Function * {
6234 if (!CalleeFT->isVarArg())
6238 if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(Ptr)) {
6239 if (CE->getOpcode() == llvm::Instruction::BitCast)
6240 Ptr = CE->getOperand(0);
6243 llvm::Function *OrigFn = dyn_cast<llvm::Function>(Ptr);
6247 llvm::FunctionType *OrigFT = OrigFn->getFunctionType();
6251 if (OrigFT->isVarArg() ||
6252 OrigFT->getNumParams() != CalleeFT->getNumParams() ||
6253 OrigFT->getReturnType() != CalleeFT->getReturnType())
6256 for (
unsigned i = 0, e = OrigFT->getNumParams(); i != e; ++i)
6257 if (OrigFT->getParamType(i) != CalleeFT->getParamType(i))
6263 if (llvm::Function *OrigFn = simplifyVariadicCallee(IRFuncTy, CalleePtr)) {
6265 IRFuncTy = OrigFn->getFunctionType();
6276 for (
unsigned i = 0; i < IRCallArgs.size(); ++i)
6277 LargestVectorWidth = std::max(LargestVectorWidth,
6282 llvm::AttributeList Attrs;
6283 CGM.ConstructAttributeList(CalleePtr->getName(), CallInfo,
6288 if (
CallingConv == llvm::CallingConv::X86_VectorCall &&
6290 CGM.Error(Loc,
"__vectorcall calling convention is not currently "
6295 if (FD->hasAttr<StrictFPAttr>())
6297 Attrs = Attrs.addFnAttribute(
getLLVMContext(), llvm::Attribute::StrictFP);
6302 if (FD->hasAttr<OptimizeNoneAttr>() &&
getLangOpts().FastMath)
6303 CGM.AdjustMemoryAttribute(CalleePtr->getName(), Callee.getAbstractInfo(),
6308 Attrs = Attrs.addFnAttribute(
getLLVMContext(), llvm::Attribute::NoMerge);
6312 Attrs = Attrs.addFnAttribute(
getLLVMContext(), llvm::Attribute::NoInline);
6317 !
CGM.getTargetCodeGenInfo().wouldInliningViolateFunctionCallABI(
6318 CallerDecl, CalleeDecl))
6320 Attrs.addFnAttribute(
getLLVMContext(), llvm::Attribute::AlwaysInline);
6329 !(TargetDecl && TargetDecl->
hasAttr<NoInlineAttr>()) &&
6330 !
CGM.getTargetCodeGenInfo().wouldInliningViolateFunctionCallABI(
6331 CallerDecl, CalleeDecl)) {
6333 Attrs.addFnAttribute(
getLLVMContext(), llvm::Attribute::AlwaysInline);
6338 Attrs = Attrs.addFnAttribute(
getLLVMContext(), llvm::Attribute::NoInline);
6345 CannotThrow =
false;
6354 CannotThrow = Attrs.hasFnAttr(llvm::Attribute::NoUnwind);
6356 if (
auto *FPtr = dyn_cast<llvm::Function>(CalleePtr))
6357 if (FPtr->hasFnAttribute(llvm::Attribute::NoUnwind))
6368 if (NeedSRetLifetimeEnd)
6376 if (
SanOpts.has(SanitizerKind::KCFI) &&
6377 !isa_and_nonnull<FunctionDecl>(TargetDecl))
6384 if (FD->hasAttr<StrictFPAttr>())
6386 Attrs = Attrs.addFnAttribute(
getLLVMContext(), llvm::Attribute::StrictFP);
6388 AssumeAlignedAttrEmitter AssumeAlignedAttrEmitter(*
this, TargetDecl);
6389 Attrs = AssumeAlignedAttrEmitter.TryEmitAsCallSiteAttribute(Attrs);
6391 AllocAlignAttrEmitter AllocAlignAttrEmitter(*
this, TargetDecl, CallArgs);
6392 Attrs = AllocAlignAttrEmitter.TryEmitAsCallSiteAttribute(Attrs);
6394 if (Attrs.hasFnAttr(llvm::Attribute::Convergent)) {
6395 addConvergenceControlBundle(BundleList);
6405 auto *CalleeFn = dyn_cast<llvm::Function>(CalleePtr);
6407 (!
CGM.shouldEmitConvergenceTokens() ||
6408 (CalleeFn && CalleeFn->isConvergent()))) {
6410 llvm::Attribute::Convergent);
6417 CI =
Builder.CreateCall(IRFuncTy, CalleePtr, IRCallArgs, BundleList);
6420 CI =
Builder.CreateInvoke(IRFuncTy, CalleePtr, Cont, InvokeDest, IRCallArgs,
6424 if (CI->getCalledFunction() && CI->getCalledFunction()->hasName() &&
6425 CI->getCalledFunction()->getName().starts_with(
"_Z4sqrt")) {
6430 if (
CGM.getCodeGenOpts().CallGraphSection) {
6434 else if (
const auto *FPT =
6435 Callee.getAbstractInfo().getCalleeFunctionProtoType())
6437 else if (
const auto *FT =
6438 Callee.getAbstractInfo().getCalleeFunctionType())
6442 "Cannot find the callee type to generate callee_type metadata.");
6485 for (
const CallArg &Arg : CallArgs)
6486 ParamTypes.push_back(Arg.
getType());
6487 CST =
CGM.ReconstructCallGraphPrototype(FNPT, ParamTypes);
6490 llvm::Metadata *MD =
6491 CGM.CreateMetadataIdentifierForCallGraphType(CST);
6493 if (
auto *MDS = dyn_cast_or_null<llvm::MDString>(MD))
6494 TypeStr = MDS->getString();
6496 CGM.getDiags().Report(Loc, diag::warn_cgs_no_proto) << CST << TypeStr;
6498 CGM.createCalleeTypeMetadataForIcall(CST, *callOrInvoke);
6506 if (
const auto *FD = dyn_cast_or_null<FunctionDecl>(
CurFuncDecl)) {
6507 if (
const auto *A = FD->getAttr<CFGuardAttr>()) {
6508 if (A->getGuard() == CFGuardAttr::GuardArg::nocf &&
6509 !CI->getCalledFunction())
6515 CI->setAttributes(Attrs);
6516 CI->setCallingConv(
static_cast<llvm::CallingConv::ID
>(
CallingConv));
6520 if (!CI->getType()->isVoidTy())
6521 CI->setName(
"call");
6524 LargestVectorWidth =
6530 if (!CI->getCalledFunction())
6531 PGO->valueProfile(
Builder, llvm::IPVK_IndirectCallTarget, CI, CalleePtr);
6535 if (
CGM.getLangOpts().ObjCAutoRefCount)
6536 AddObjCARCExceptionMetadata(CI);
6539 bool IsPPC =
getTarget().getTriple().isPPC();
6540 bool IsMIPS =
getTarget().getTriple().isMIPS();
6541 bool HasMips16 =
false;
6544 HasMips16 = TargetOpts.
FeatureMap.lookup(
"mips16");
6546 HasMips16 = llvm::is_contained(TargetOpts.
Features,
"+mips16");
6548 if (llvm::CallInst *
Call = dyn_cast<llvm::CallInst>(CI)) {
6549 if (TargetDecl && TargetDecl->
hasAttr<NotTailCalledAttr>())
6550 Call->setTailCallKind(llvm::CallInst::TCK_NoTail);
6551 else if (IsMustTail) {
6554 CGM.getDiags().Report(Loc, diag::err_aix_musttail_unsupported);
6557 CGM.getDiags().Report(Loc, diag::err_ppc_impossible_musttail) << 0;
6558 else if (
Call->isIndirectCall())
6559 CGM.getDiags().Report(Loc, diag::err_ppc_impossible_musttail) << 1;
6560 else if (isa_and_nonnull<FunctionDecl>(TargetDecl)) {
6565 CGM.addUndefinedGlobalForTailCall(
6568 llvm::GlobalValue::LinkageTypes
Linkage =
CGM.getFunctionLinkage(
6570 if (llvm::GlobalValue::isWeakForLinker(
Linkage) ||
6571 llvm::GlobalValue::isDiscardableIfUnused(
Linkage))
6572 CGM.getDiags().Report(Loc, diag::err_ppc_impossible_musttail)
6580 CGM.getDiags().Report(Loc, diag::err_mips_impossible_musttail) << 0;
6581 else if (
const auto *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl))
6582 CGM.addUndefinedGlobalForTailCall({FD, Loc});
6584 Call->setTailCallKind(llvm::CallInst::TCK_MustTail);
6598 bool NeedSrcLoc = TargetDecl->
hasAttr<ErrorAttr>();
6599 if (!NeedSrcLoc &&
CGM.getCodeGenOpts().ShowInliningChain) {
6600 if (
const auto *FD = dyn_cast<FunctionDecl>(TargetDecl))
6601 NeedSrcLoc = FD->isInlined() || FD->hasAttr<AlwaysInlineAttr>() ||
6603 FD->isInAnonymousNamespace();
6607 auto *MD = llvm::ConstantAsMetadata::get(
Line);
6608 CI->setMetadata(
"srcloc", llvm::MDNode::get(
getLLVMContext(), {MD}));
6617 if (CI->doesNotReturn()) {
6618 if (NeedSRetLifetimeEnd)
6622 if (
SanOpts.has(SanitizerKind::Unreachable)) {
6625 if (
auto *F = CI->getCalledFunction())
6626 F->removeFnAttr(llvm::Attribute::NoReturn);
6627 CI->removeFnAttr(llvm::Attribute::NoReturn);
6631 if (
SanOpts.hasOneOf(SanitizerKind::Address |
6632 SanitizerKind::KernelAddress)) {
6634 llvm::IRBuilder<>::InsertPointGuard IPGuard(
Builder);
6636 auto *FnType = llvm::FunctionType::get(
CGM.VoidTy,
false);
6637 llvm::FunctionCallee Fn =
6638 CGM.CreateRuntimeFunction(FnType,
"__asan_handle_no_return");
6644 Builder.ClearInsertionPoint();
6666 if (CI->doesNotThrow())
6669 diag::err_musttail_noexcept_mismatch);
6672 if (
auto *Cleanup = dyn_cast<EHCleanupScope>(&*it)) {
6675 if (Cleanup->isFakeUse()) {
6676 CGBuilderTy::InsertPointGuard IPG(
Builder);
6678 Cleanup->getCleanup()->Emit(*
this, EHScopeStack::Cleanup::Flags());
6681 if (Cleanup->isRedundantBeforeReturn())
6684 CGM.ErrorUnsupported(
MustTailCall,
"tail call skipping over cleanups");
6686 if (CI->getType()->isVoidTy())
6690 Builder.ClearInsertionPoint();
6696 if (swiftErrorTemp.
isValid()) {
6697 llvm::Value *errorResult =
Builder.CreateLoad(swiftErrorTemp);
6698 Builder.CreateStore(errorResult, swiftErrorArg);
6715 if (IsVirtualFunctionPointerThunk) {
6728 unsigned unpaddedIndex = 0;
6729 for (
unsigned i = 0, e = coercionType->getNumElements(); i != e; ++i) {
6730 llvm::Type *eltType = coercionType->getElementType(i);
6734 llvm::Value *elt = CI;
6735 if (requiresExtract)
6736 elt =
Builder.CreateExtractValue(elt, unpaddedIndex++);
6738 assert(unpaddedIndex == 0);
6739 Builder.CreateStore(elt, eltAddr);
6747 if (NeedSRetLifetimeEnd)
6764 llvm::Value *Real =
Builder.CreateExtractValue(CI, 0);
6765 llvm::Value *Imag =
Builder.CreateExtractValue(CI, 1);
6773 llvm::Value *
V = CI;
6774 if (
V->getType() != RetIRTy)
6784 if (
auto *FixedDstTy = dyn_cast<llvm::FixedVectorType>(RetIRTy)) {
6785 llvm::Value *
V = CI;
6786 if (
auto *ScalableSrcTy =
6787 dyn_cast<llvm::ScalableVectorType>(
V->getType())) {
6788 if (FixedDstTy->getElementType() ==
6789 ScalableSrcTy->getElementType()) {
6790 V =
Builder.CreateExtractVector(FixedDstTy,
V, uint64_t(0),
6800 getContext().getTypeInfoDataSizeInChars(RetTy).Width.getQuantity();
6804 DestIsVolatile =
false;
6805 DestSize =
getContext().getTypeSizeInChars(RetTy).getQuantity();
6815 CI, RetTy, StorePtr,
6829 DestIsVolatile =
false;
6831 CGM.getABIInfo().createCoercedStore(CI, StorePtr, RetAI, DestIsVolatile,
6838 llvm_unreachable(
"Invalid ABI kind for return argument");
6841 llvm_unreachable(
"Unhandled ABIArgInfo::Kind");
6846 if (Ret.isScalar() && TargetDecl) {
6847 AssumeAlignedAttrEmitter.EmitAsAnAssumption(Loc, RetTy, Ret);
6848 AllocAlignAttrEmitter.EmitAsAnAssumption(Loc, RetTy, Ret);
6866 if (CalleeDecl && !CalleeDecl->
hasAttr<NoDebugAttr>() &&
6867 DI->getCallSiteRelatedAttrs() != llvm::DINode::FlagZero) {
6868 CodeGenFunction CalleeCGF(
CGM);
6870 Callee.getAbstractInfo().getCalleeDecl();
6871 CalleeCGF.
CurGD = CalleeGlobalDecl;
6874 DI->EmitFuncDeclForCallSite(
6875 CI, DI->getFunctionType(CalleeDecl, ResTy, Args), CalleeGlobalDecl);
6878 DI->addCallTargetIfVirtual(CalleeDecl, CI);
6899 VAListAddr =
VE->isMicrosoftABI()
6906 if (
VE->isMicrosoftABI())
6907 return CGM.getABIInfo().EmitMSVAArg(*
this, VAListAddr, Ty, Slot);
6909 return CGM.getABIInfo().EmitZOSVAArg(*
this, VAListAddr, Ty, Slot);
6910 return CGM.getABIInfo().EmitVAArg(*
this, VAListAddr, Ty, Slot);
6915 CGF.disableDebugInfo();
6919 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 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 bool isConvergentIntrinsic(const llvm::Function *F)
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 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 setCUDAKernelCallingConvention(CanQualType &funcTy, CIRGenModule &cgm, const FunctionDecl *fd)
Set calling convention for CUDA/HIP kernel.
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 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.
This is an opaque type for sizes expressed in character units.
bool isZero() const
Test whether the quantity equals zero.
llvm::Align getAsAlign() const
Returns Quantity as a valid llvm::Align, Beware llvm::Align assumes power of two 8-bit bytes.
QuantityType getQuantity() const
Get the raw integer representation of this quantity.
static CharUnits fromQuantity(QuantityType Quantity)
Construct a CharUnits quantity from a raw integer type.
static CharUnits 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
static ABIArgInfo getIndirectAliased(CharUnits Alignment, unsigned AddrSpace, bool Realign=false, llvm::Type *Padding=nullptr)
Pass this in memory using the IR byref attribute.
bool isCoerceAndExpand() const
static ABIArgInfo getCoerceAndExpand(llvm::StructType *coerceToType, llvm::Type *unpaddedCoerceToType)
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 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 isFunctionProtoType() 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.
CanQual< FunctionProtoType > getFormalType(const CXXMethodDecl *MD)
Returns the canonical formal type of the given C++ method.
llvm::FPClassTest getNoFPClassTestMask(const LangOptions &LangOpts)
Returns the set of floating-point value kinds that the language options promise never reach a functio...
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)
const EHPersonality & getEHPersonality(CodeGenModule &CGM, const FunctionDecl *FD)
Selects the personality function to use for FD, or for the translation unit as a whole when FD is nul...
@ 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)
bool isMSVCXXPersonality() const
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)
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.