36#include "llvm/ABI/FunctionInfo.h"
37#include "llvm/ABI/IRTypeMapper.h"
38#include "llvm/ABI/TargetInfo.h"
39#include "llvm/ABI/Types.h"
40#include "llvm/ADT/STLExtras.h"
41#include "llvm/ADT/StringExtras.h"
42#include "llvm/Analysis/ValueTracking.h"
43#include "llvm/IR/Assumptions.h"
44#include "llvm/IR/AttributeMask.h"
45#include "llvm/IR/Attributes.h"
46#include "llvm/IR/CallingConv.h"
47#include "llvm/IR/DataLayout.h"
48#include "llvm/IR/DebugInfoMetadata.h"
49#include "llvm/IR/InlineAsm.h"
50#include "llvm/IR/IntrinsicInst.h"
51#include "llvm/IR/Intrinsics.h"
52#include "llvm/IR/Type.h"
53#include "llvm/Transforms/Utils/Local.h"
63 return llvm::CallingConv::C;
65 return llvm::CallingConv::X86_StdCall;
67 return llvm::CallingConv::X86_FastCall;
69 return llvm::CallingConv::X86_RegCall;
71 return llvm::CallingConv::X86_ThisCall;
73 return llvm::CallingConv::Win64;
75 return llvm::CallingConv::X86_64_SysV;
77 return llvm::CallingConv::ARM_AAPCS;
79 return llvm::CallingConv::ARM_AAPCS_VFP;
81 return llvm::CallingConv::Intel_OCL_BI;
84 return llvm::CallingConv::C;
87 return llvm::CallingConv::X86_VectorCall;
89 return llvm::CallingConv::AArch64_VectorCall;
91 return llvm::CallingConv::AArch64_SVE_VectorCall;
93 return llvm::CallingConv::SPIR_FUNC;
95 return CGM.getTargetCodeGenInfo().getDeviceKernelCallingConv();
97 return llvm::CallingConv::PreserveMost;
99 return llvm::CallingConv::PreserveAll;
101 return llvm::CallingConv::Swift;
103 return llvm::CallingConv::SwiftTail;
105 return llvm::CallingConv::M68k_RTD;
107 return llvm::CallingConv::PreserveNone;
111#define CC_VLS_CASE(ABI_VLEN) \
112 case CC_RISCVVLSCall_##ABI_VLEN: \
113 return llvm::CallingConv::RISCV_VLSCall_##ABI_VLEN;
138 RecTy = Context.getCanonicalTagType(RD);
140 RecTy = Context.VoidTy;
145 return Context.getPointerType(RecTy);
178 assert(paramInfos.size() <= prefixArgs);
179 assert(proto->
getNumParams() + prefixArgs <= totalArgs);
181 paramInfos.reserve(totalArgs);
184 paramInfos.resize(prefixArgs);
188 paramInfos.push_back(ParamInfo);
190 if (ParamInfo.hasPassObjectSize())
191 paramInfos.emplace_back();
194 assert(paramInfos.size() <= totalArgs &&
195 "Did we forget to insert pass_object_size args?");
197 paramInfos.resize(totalArgs);
207 if (!FPT->hasExtParameterInfos()) {
208 assert(paramInfos.empty() &&
209 "We have paramInfos, but the prototype doesn't?");
210 prefix.append(FPT->param_type_begin(), FPT->param_type_end());
214 unsigned PrefixSize = prefix.size();
218 prefix.reserve(prefix.size() + FPT->getNumParams());
220 auto ExtInfos = FPT->getExtParameterInfos();
221 assert(ExtInfos.size() == FPT->getNumParams());
222 for (
unsigned I = 0, E = FPT->getNumParams(); I != E; ++I) {
223 prefix.push_back(FPT->getParamType(I));
224 if (ExtInfos[I].hasPassObjectSize())
249 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;
361 return ::arrangeLLVMFunctionInfo(
362 *
this,
true, argTypes,
369 if (FD->
hasAttr<CUDAGlobalAttr>()) {
405 !Target.getCXXABI().hasConstructorVariants();
418 bool PassParams =
true;
420 if (
auto *CD = dyn_cast<CXXConstructorDecl>(MD)) {
423 if (
auto Inherited = CD->getInheritedConstructor())
435 if (!paramInfos.empty()) {
438 paramInfos.insert(paramInfos.begin() + 1, AddedArgs.
Prefix,
441 paramInfos.append(AddedArgs.
Suffix,
446 (PassParams && MD->isVariadic() ?
RequiredArgs(argTypes.size())
452 ? CGM.getContext().VoidPtrTy
455 argTypes, extInfo, paramInfos, required);
461 for (
auto &arg : args)
469 for (
auto &arg : args)
476 unsigned totalArgs) {
494 unsigned ExtraPrefixArgs,
unsigned ExtraSuffixArgs,
bool PassProtoArgs) {
496 for (
const auto &Arg : args)
497 ArgTypes.push_back(Context.getCanonicalParamType(Arg.Ty));
500 unsigned TotalPrefixArgs = 1 + ExtraPrefixArgs;
505 FPT, TotalPrefixArgs + ExtraSuffixArgs)
511 ? CGM.getContext().VoidPtrTy
518 if (PassProtoArgs && FPT->hasExtParameterInfos()) {
525 ArgTypes, Info, ParamInfos,
Required);
534 if (MD->isImplicitObjectMemberFunction())
542 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
545 CGM.getTargetCodeGenInfo().setOCLKernelStubCallingConvention(FT);
553 {}, noProto->getExtInfo(), {},
580 argTys.push_back(Context.getCanonicalParamType(receiverType));
582 argTys.push_back(Context.getCanonicalParamType(Context.getObjCSelType()));
584 argTys.push_back(Context.getCanonicalParamType(I->getType()));
586 I->hasAttr<NoEscapeAttr>());
587 extParamInfos.push_back(extParamInfo);
591 bool IsTargetDefaultMSABI =
597 if (
getContext().getLangOpts().ObjCAutoRefCount &&
598 MD->
hasAttr<NSReturnsRetainedAttr>())
635 assert(MD->
isVirtual() &&
"only methods have thunks");
652 ArgTys.push_back(*FTP->param_type_begin());
654 ArgTys.push_back(Context.IntTy);
655 CallingConv CC = Context.getDefaultCallingConvention(
667 unsigned numExtraRequiredArgs,
bool chainCall) {
668 assert(args.size() >= numExtraRequiredArgs);
678 if (proto->isVariadic())
681 if (proto->hasExtParameterInfos())
695 for (
const auto &arg : args)
700 paramInfos, required);
710 chainCall ? 1 : 0, chainCall);
739 for (
const auto &Arg : args)
740 argTypes.push_back(Context.getCanonicalParamType(Arg.Ty));
780 assert(numPrefixArgs + 1 <= args.size() &&
781 "Emitting a call with less args than the required prefix?");
792 paramInfos, required);
803 assert(signature.
arg_size() <= args.size());
804 if (signature.
arg_size() == args.size())
809 if (!sigParamInfos.empty()) {
810 paramInfos.append(sigParamInfos.begin(), sigParamInfos.end());
811 paramInfos.resize(args.size());
845 return "IndirectAliased";
851 return "CoerceAndExpand";
853 return "TargetSpecific";
857 llvm_unreachable(
"Unknown kind");
863 MappedArgTypes.reserve(FI.
arg_size());
865 MappedArgTypes.push_back(AbiMapper->convertType(Arg.type));
867 std::optional<unsigned> NumRequired;
870 NumRequired =
Required.getNumRequiredArgs();
872 auto AbiFI = llvm::abi::FunctionInfo::create(
874 MappedArgTypes, NumRequired);
883 auto ConvertABIArgInfo = [&](
ABIArgInfo &Target,
886 auto Check = [&](
bool Cond, llvm::function_ref<void()> MessageFn) {
890 llvm::dbgs() <<
"For return value of type ";
892 llvm::dbgs() <<
"For argument " << ArgNo <<
" of type ";
893 llvm::dbgs() <<
Type <<
": ";
895 llvm::dbgs() <<
"\n";
898 auto CheckSimple = [&](
auto TargetVal,
auto ResVal, StringRef What) {
899 Check(TargetVal == ResVal, [&]() {
900 llvm::dbgs() << What <<
" mismatch (expected: " << TargetVal
901 <<
", given: " << ResVal <<
")";
906 Check(Target.getKind() == Res.
getKind(), [&]() {
907 llvm::dbgs() <<
"Kind mismatch (expected: "
908 << abiKindToString(Target.getKind())
909 <<
", given: " << abiKindToString(Res.getKind()) <<
")";
914 llvm::Type *TargetType = Target.getCoerceToType();
921 Check(TargetType == ResType, [&]() {
922 llvm::dbgs() <<
"CoerceToType mismatch (expected: " << *TargetType
923 <<
", given: " << *ResType <<
")";
929 CheckSimple(Target.isSignExt(), Res.
isSignExt(),
"SignExt");
930 CheckSimple(Target.isZeroExt(), Res.
isZeroExt(),
"ZeroExt");
933 CheckSimple(Target.getDirectAlign(), Res.
getDirectAlign(),
"DirectAlign");
943 "IndirectAddrSpace");
947 llvm::dbgs() <<
"IndirectAlign mismatch (expected: "
948 << Target.getIndirectAlign().getQuantity()
949 <<
", given: " << Res.getIndirectAlign().getQuantity()
960 auto ConvertABIArgInfo =
962 int ArgNo) { Target = convertABIArgInfo(AbiInfo,
Type); };
965 ConvertABIArgInfo(FI.
getReturnInfo(), AbiFI->getReturnInfo(),
969 for (
auto [CGArg, AbiArg] :
970 llvm::zip_equal(FI.
arguments(), AbiFI->arguments()))
971 ConvertABIArgInfo(CGArg.info, AbiArg.Info, CGArg.type, ArgNo++);
974ABIArgInfo CodeGenModule::convertABIArgInfo(
const llvm::abi::ArgInfo &AbiInfo,
976 switch (AbiInfo.getKind()) {
977 case llvm::abi::ArgInfo::Direct: {
978 llvm::Type *CoercedType =
nullptr;
979 if (AbiInfo.getCoerceToType())
980 CoercedType = AbiReverseMapper->convertType(AbiInfo.getCoerceToType());
982 CoercedType = getTypes().ConvertType(
Type);
985 case llvm::abi::ArgInfo::Extend: {
986 llvm::Type *CoercedType =
nullptr;
987 if (AbiInfo.getCoerceToType())
988 CoercedType = AbiReverseMapper->convertType(AbiInfo.getCoerceToType());
990 CoercedType = getTypes().ConvertType(
Type);
991 if (AbiInfo.isSignExt())
993 if (AbiInfo.isZeroExt())
997 case llvm::abi::ArgInfo::Indirect: {
1001 AbiInfo.getIndirectByVal(),
1002 AbiInfo.getIndirectRealign());
1004 case llvm::abi::ArgInfo::Ignore:
1007 llvm_unreachable(
"Unexpected llvm::abi::ArgInfo kind");
1018 assert(llvm::all_of(argTypes,
1019 [](
CanQualType T) {
return T.isCanonicalAsParam(); }));
1022 llvm::FoldingSetNodeID ID;
1027 bool isDelegateCall =
1030 info, paramInfos, required, resultType, argTypes);
1032 void *insertPos =
nullptr;
1033 CGFunctionInfo *FI = FunctionInfos.FindNodeOrInsertPos(ID, insertPos);
1041 info, paramInfos, resultType, argTypes, required);
1042 FunctionInfos.InsertNode(FI, insertPos);
1044 bool inserted = FunctionsBeingProcessed.insert(FI).second;
1046 assert(inserted &&
"Recursively being processed?");
1050 (CC == llvm::CallingConv::SPIR_KERNEL || CC == llvm::CallingConv::C)) {
1059 }
else if (CGM.shouldUseLLVMABILowering()) {
1060 CGM.computeABIInfoUsingLib(*FI);
1062 CGM.getABIInfo().computeInfo(*FI);
1073 if (I.info.canHaveCoerceToType() && I.info.getCoerceToType() ==
nullptr)
1076 bool erased = FunctionsBeingProcessed.erase(FI);
1078 assert(erased &&
"Not in set?");
1084 bool chainCall,
bool delegateCall,
1090 assert(paramInfos.empty() || paramInfos.size() == argTypes.size());
1094 void *buffer =
operator new(totalSizeToAlloc<ArgInfo, ExtParameterInfo>(
1095 argTypes.size() + 1, paramInfos.size()));
1097 CGFunctionInfo *FI =
new (buffer) CGFunctionInfo();
1098 FI->CallingConvention = llvmCC;
1099 FI->EffectiveCallingConvention = llvmCC;
1100 FI->ASTCallingConvention = info.
getCC();
1101 FI->InstanceMethod = instanceMethod;
1102 FI->ChainCall = chainCall;
1103 FI->DelegateCall = delegateCall;
1109 FI->Required = required;
1112 FI->ArgStruct =
nullptr;
1113 FI->ArgStructAlign = 0;
1114 FI->NumArgs = argTypes.size();
1115 FI->HasExtParameterInfos = !paramInfos.empty();
1116 FI->getArgsBuffer()[0].
type = resultType;
1117 FI->MaxVectorWidth = 0;
1118 for (
unsigned i = 0, e = argTypes.size(); i != e; ++i)
1119 FI->getArgsBuffer()[i + 1].
type = argTypes[i];
1120 for (
unsigned i = 0, e = paramInfos.size(); i != e; ++i)
1121 FI->getExtParameterInfosBuffer()[i] = paramInfos[i];
1131struct TypeExpansion {
1132 enum TypeExpansionKind {
1144 const TypeExpansionKind Kind;
1146 TypeExpansion(TypeExpansionKind K) : Kind(K) {}
1147 virtual ~TypeExpansion() {}
1150struct ConstantArrayExpansion : TypeExpansion {
1154 ConstantArrayExpansion(QualType EltTy, uint64_t NumElts)
1155 : TypeExpansion(TEK_ConstantArray), EltTy(EltTy), NumElts(NumElts) {}
1156 static bool classof(
const TypeExpansion *TE) {
1157 return TE->Kind == TEK_ConstantArray;
1161struct RecordExpansion : TypeExpansion {
1162 SmallVector<const CXXBaseSpecifier *, 1> Bases;
1164 SmallVector<const FieldDecl *, 1> Fields;
1166 RecordExpansion(SmallVector<const CXXBaseSpecifier *, 1> &&Bases,
1167 SmallVector<const FieldDecl *, 1> &&Fields)
1168 : TypeExpansion(TEK_Record), Bases(std::move(Bases)),
1169 Fields(std::move(Fields)) {}
1170 static bool classof(
const TypeExpansion *TE) {
1171 return TE->Kind == TEK_Record;
1175struct ComplexExpansion : TypeExpansion {
1178 ComplexExpansion(QualType EltTy) : TypeExpansion(
TEK_Complex), EltTy(EltTy) {}
1179 static bool classof(
const TypeExpansion *TE) {
1184struct NoExpansion : TypeExpansion {
1185 NoExpansion() : TypeExpansion(TEK_None) {}
1186 static bool classof(
const TypeExpansion *TE) {
return TE->Kind == TEK_None; }
1190static std::unique_ptr<TypeExpansion>
1193 return std::make_unique<ConstantArrayExpansion>(AT->getElementType(),
1199 assert(!RD->hasFlexibleArrayMember() &&
1200 "Cannot expand structure with flexible array.");
1201 if (RD->isUnion()) {
1207 for (
const auto *FD : RD->fields()) {
1208 if (FD->isZeroLengthBitField())
1210 assert(!FD->isBitField() &&
1211 "Cannot expand structure with bit-field members.");
1212 CharUnits FieldSize = Context.getTypeSizeInChars(FD->getType());
1213 if (UnionSize < FieldSize) {
1214 UnionSize = FieldSize;
1219 Fields.push_back(LargestFD);
1221 if (
const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
1222 assert(!CXXRD->isDynamicClass() &&
1223 "cannot expand vtable pointers in dynamic classes");
1224 llvm::append_range(Bases, llvm::make_pointer_range(CXXRD->bases()));
1227 for (
const auto *FD : RD->fields()) {
1228 if (FD->isZeroLengthBitField())
1230 assert(!FD->isBitField() &&
1231 "Cannot expand structure with bit-field members.");
1232 Fields.push_back(FD);
1235 return std::make_unique<RecordExpansion>(std::move(Bases),
1239 return std::make_unique<ComplexExpansion>(CT->getElementType());
1241 return std::make_unique<NoExpansion>();
1246 if (
auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
1249 if (
auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
1251 for (
auto BS : RExp->Bases)
1253 for (
auto FD : RExp->Fields)
1266 if (
auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
1267 for (
int i = 0, n = CAExp->NumElts; i < n; i++) {
1270 }
else if (
auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
1271 for (
auto BS : RExp->Bases)
1273 for (
auto FD : RExp->Fields)
1275 }
else if (
auto CExp = dyn_cast<ComplexExpansion>(Exp.get())) {
1286 ConstantArrayExpansion *CAE,
1288 llvm::function_ref<
void(
Address)> Fn) {
1289 for (
int i = 0, n = CAE->NumElts; i < n; i++) {
1295void CodeGenFunction::ExpandTypeFromArgs(QualType Ty, LValue LV,
1296 llvm::Function::arg_iterator &AI) {
1297 assert(LV.isSimple() &&
1298 "Unexpected non-simple lvalue during struct expansion.");
1301 if (
auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
1303 *
this, CAExp, LV.getAddress(), [&](Address EltAddr) {
1304 LValue LV = MakeAddrLValue(EltAddr, CAExp->EltTy);
1305 ExpandTypeFromArgs(CAExp->EltTy, LV, AI);
1307 }
else if (
auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
1309 for (
const CXXBaseSpecifier *BS : RExp->Bases) {
1313 false, SourceLocation());
1314 LValue SubLV = MakeAddrLValue(Base, BS->
getType());
1317 ExpandTypeFromArgs(BS->
getType(), SubLV, AI);
1319 for (
auto FD : RExp->Fields) {
1321 LValue SubLV = EmitLValueForFieldInitialization(LV, FD);
1322 ExpandTypeFromArgs(FD->getType(), SubLV, AI);
1325 auto realValue = &*AI++;
1326 auto imagValue = &*AI++;
1327 EmitStoreOfComplex(
ComplexPairTy(realValue, imagValue), LV,
true);
1332 llvm::Value *Arg = &*AI++;
1333 if (LV.isBitField()) {
1339 if (Arg->getType()->isPointerTy()) {
1341 Arg = Builder.CreateBitCast(Arg,
Addr.getElementType());
1343 EmitStoreOfScalar(Arg, LV);
1348void CodeGenFunction::ExpandTypeToArgs(
1349 QualType Ty, CallArg Arg, llvm::FunctionType *IRFuncTy,
1350 SmallVectorImpl<llvm::Value *> &IRCallArgs,
unsigned &IRCallArgPos) {
1352 if (
auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
1357 CallArg(convertTempToRValue(EltAddr, CAExp->EltTy, SourceLocation()),
1359 ExpandTypeToArgs(CAExp->EltTy, EltArg, IRFuncTy, IRCallArgs,
1362 }
else if (
auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
1365 for (
const CXXBaseSpecifier *BS : RExp->Bases) {
1369 false, SourceLocation());
1373 ExpandTypeToArgs(BS->
getType(), BaseArg, IRFuncTy, IRCallArgs,
1377 LValue LV = MakeAddrLValue(This, Ty);
1378 for (
auto FD : RExp->Fields) {
1380 CallArg(EmitRValueForField(LV, FD, SourceLocation()), FD->getType());
1381 ExpandTypeToArgs(FD->getType(), FldArg, IRFuncTy, IRCallArgs,
1386 IRCallArgs[IRCallArgPos++] = CV.first;
1387 IRCallArgs[IRCallArgPos++] = CV.second;
1391 assert(RV.isScalar() &&
1392 "Unexpected non-scalar rvalue during struct expansion.");
1395 llvm::Value *
V = RV.getScalarVal();
1396 if (IRCallArgPos < IRFuncTy->getNumParams() &&
1397 V->getType() != IRFuncTy->getParamType(IRCallArgPos))
1398 V = Builder.CreateBitCast(
V, IRFuncTy->getParamType(IRCallArgPos));
1400 IRCallArgs[IRCallArgPos++] =
V;
1408 const Twine &Name =
"tmp") {
1421 llvm::StructType *SrcSTy,
1425 if (SrcSTy->getNumElements() == 0)
1434 uint64_t FirstEltSize = CGF.
CGM.
getDataLayout().getTypeStoreSize(FirstElt);
1435 if (FirstEltSize < DstSize &&
1444 if (llvm::StructType *SrcSTy = dyn_cast<llvm::StructType>(SrcTy))
1459 if (Val->getType() == Ty)
1465 return CGF.
Builder.CreateBitCast(Val, Ty,
"coerce.val");
1471 llvm::Type *DestIntTy = Ty;
1475 if (Val->getType() != DestIntTy) {
1477 if (DL.isBigEndian()) {
1480 uint64_t SrcSize = DL.getTypeSizeInBits(Val->getType());
1481 uint64_t DstSize = DL.getTypeSizeInBits(DestIntTy);
1483 if (SrcSize > DstSize) {
1484 Val = CGF.
Builder.CreateLShr(Val, SrcSize - DstSize,
"coerce.highbits");
1485 Val = CGF.
Builder.CreateTrunc(Val, DestIntTy,
"coerce.val.ii");
1487 Val = CGF.
Builder.CreateZExt(Val, DestIntTy,
"coerce.val.ii");
1488 Val = CGF.
Builder.CreateShl(Val, DstSize - SrcSize,
"coerce.highbits");
1492 Val = CGF.
Builder.CreateIntCast(Val, DestIntTy,
false,
"coerce.val.ii");
1497 Val = CGF.
Builder.CreateIntToPtr(Val, Ty,
"coerce.val.ip");
1504 if (PFPFields.empty())
1507 auto LoadCoercedField = [&](
CharUnits Offset,
1508 llvm::Type *FieldType) -> llvm::Value * {
1513 if (!PFPFields.empty() && PFPFields[0].Offset == Offset) {
1517 FieldVal = CGF.
Builder.CreatePtrToInt(FieldVal, FieldType);
1518 PFPFields.erase(PFPFields.begin());
1535 Val = CGF.
Builder.CreatePtrToInt(Val, Ty);
1539 auto *ET = AT->getElementType();
1543 llvm::Value *Val = llvm::PoisonValue::get(AT);
1544 for (
unsigned Idx = 0; Idx != AT->getNumElements(); ++Idx, Offset += WordSize)
1545 Val = CGF.
Builder.CreateInsertValue(Val, LoadCoercedField(Offset, ET), Idx);
1569 if (llvm::StructType *SrcSTy = dyn_cast<llvm::StructType>(SrcTy)) {
1571 DstSize.getFixedValue(), CGF);
1586 if (!SrcSize.isScalable() && !DstSize.isScalable() &&
1587 SrcSize.getFixedValue() >= DstSize.getFixedValue()) {
1601 if (
auto *ScalableDstTy = dyn_cast<llvm::ScalableVectorType>(Ty)) {
1602 if (
auto *FixedSrcTy = dyn_cast<llvm::FixedVectorType>(SrcTy)) {
1605 if (ScalableDstTy->getElementType()->isIntegerTy(1) &&
1606 FixedSrcTy->getElementType()->isIntegerTy(8)) {
1607 ScalableDstTy = llvm::ScalableVectorType::get(
1608 FixedSrcTy->getElementType(),
1610 ScalableDstTy->getElementCount().getKnownMinValue(), 8));
1612 if (ScalableDstTy->getElementType() == FixedSrcTy->getElementType()) {
1614 auto *PoisonVec = llvm::PoisonValue::get(ScalableDstTy);
1616 ScalableDstTy, PoisonVec, Load, uint64_t(0),
"cast.scalable");
1618 llvm::VectorType::getWithSizeAndScalar(ScalableDstTy, Ty));
1619 if (
Result->getType() != ScalableDstTy)
1621 if (
Result->getType() != Ty)
1634 llvm::ConstantInt::get(CGF.
IntPtrTy, SrcSize.getKnownMinValue()));
1641 if (PFPFields.empty())
1644 llvm::Type *SrcTy = Src->getType();
1645 auto StoreCoercedField = [&](
CharUnits Offset, llvm::Value *FieldVal) {
1646 if (!PFPFields.empty() && PFPFields[0].Offset == Offset) {
1651 PFPFields.erase(PFPFields.begin());
1671 auto *ET = AT->getElementType();
1675 for (
unsigned i = 0; i != AT->getNumElements(); ++i, Offset += WordSize)
1676 StoreCoercedField(Offset, CGF.
Builder.CreateExtractValue(Src, i));
1682 Address Dst, llvm::TypeSize DstSize,
1683 bool DstIsVolatile) {
1687 llvm::Type *SrcTy = Src->getType();
1688 llvm::TypeSize SrcSize =
CGM.getDataLayout().getTypeAllocSize(SrcTy);
1694 if (llvm::StructType *DstSTy =
1696 assert(!SrcSize.isScalable());
1698 SrcSize.getFixedValue(), *
this);
1705 if (SrcSize.isScalable() || SrcSize <= DstSize) {
1706 if (SrcTy->isIntegerTy() && Dst.
getElementType()->isPointerTy() &&
1710 auto *I =
Builder.CreateStore(Src, Dst, DstIsVolatile);
1712 }
else if (llvm::StructType *STy =
1713 dyn_cast<llvm::StructType>(Src->getType())) {
1716 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
1718 llvm::Value *Elt =
Builder.CreateExtractValue(Src, i);
1719 auto *I =
Builder.CreateStore(Elt, EltPtr, DstIsVolatile);
1727 }
else if (SrcTy->isIntegerTy()) {
1729 llvm::Type *DstIntTy =
Builder.getIntNTy(DstSize.getFixedValue() * 8);
1746 Builder.CreateStore(Src, Tmp);
1747 auto *I =
Builder.CreateMemCpy(
1766static std::pair<llvm::Value *, bool>
1768 llvm::ScalableVectorType *FromTy, llvm::Value *
V,
1769 StringRef Name =
"") {
1772 if (FromTy->getElementType()->isIntegerTy(1) &&
1773 ToTy->getElementType() == CGF.
Builder.getInt8Ty()) {
1774 if (!FromTy->getElementCount().isKnownMultipleOf(8)) {
1775 FromTy = llvm::ScalableVectorType::get(
1776 FromTy->getElementType(),
1777 llvm::alignTo<8>(FromTy->getElementCount().getKnownMinValue()));
1778 llvm::Value *ZeroVec = llvm::Constant::getNullValue(FromTy);
1779 V = CGF.
Builder.CreateInsertVector(FromTy, ZeroVec,
V, uint64_t(0));
1781 FromTy = llvm::ScalableVectorType::get(
1782 ToTy->getElementType(),
1783 FromTy->getElementCount().getKnownMinValue() / 8);
1784 V = CGF.
Builder.CreateBitCast(
V, FromTy);
1786 if (FromTy->getElementType() == ToTy->getElementType()) {
1787 V->setName(Name +
".coerce");
1788 V = CGF.
Builder.CreateExtractVector(ToTy,
V, uint64_t(0),
"cast.fixed");
1798class ClangToLLVMArgMapping {
1799 static const unsigned InvalidIndex = ~0U;
1800 unsigned InallocaArgNo;
1802 unsigned TotalIRArgs;
1806 unsigned PaddingArgIndex;
1809 unsigned FirstArgIndex;
1810 unsigned NumberOfArgs;
1813 : PaddingArgIndex(InvalidIndex), FirstArgIndex(InvalidIndex),
1817 SmallVector<IRArgs, 8> ArgInfo;
1820 ClangToLLVMArgMapping(
const ASTContext &Context,
const CGFunctionInfo &FI,
1821 bool OnlyRequiredArgs =
false)
1822 : InallocaArgNo(InvalidIndex), SRetArgNo(InvalidIndex), TotalIRArgs(0),
1823 ArgInfo(OnlyRequiredArgs ? FI.getNumRequiredArgs() : FI.arg_size()) {
1824 construct(Context, FI, OnlyRequiredArgs);
1827 bool hasInallocaArg()
const {
return InallocaArgNo != InvalidIndex; }
1828 unsigned getInallocaArgNo()
const {
1829 assert(hasInallocaArg());
1830 return InallocaArgNo;
1833 bool hasSRetArg()
const {
return SRetArgNo != InvalidIndex; }
1834 unsigned getSRetArgNo()
const {
1835 assert(hasSRetArg());
1839 unsigned totalIRArgs()
const {
return TotalIRArgs; }
1841 bool hasPaddingArg(
unsigned ArgNo)
const {
1842 assert(ArgNo < ArgInfo.size());
1843 return ArgInfo[ArgNo].PaddingArgIndex != InvalidIndex;
1845 unsigned getPaddingArgNo(
unsigned ArgNo)
const {
1846 assert(hasPaddingArg(ArgNo));
1847 return ArgInfo[ArgNo].PaddingArgIndex;
1852 std::pair<unsigned, unsigned> getIRArgs(
unsigned ArgNo)
const {
1853 assert(ArgNo < ArgInfo.size());
1854 return std::make_pair(ArgInfo[ArgNo].FirstArgIndex,
1855 ArgInfo[ArgNo].NumberOfArgs);
1859 void construct(
const ASTContext &Context,
const CGFunctionInfo &FI,
1860 bool OnlyRequiredArgs);
1863void ClangToLLVMArgMapping::construct(
const ASTContext &Context,
1864 const CGFunctionInfo &FI,
1865 bool OnlyRequiredArgs) {
1866 unsigned IRArgNo = 0;
1867 bool SwapThisWithSRet =
false;
1872 SRetArgNo = SwapThisWithSRet ? 1 : IRArgNo++;
1880 QualType ArgType = I->type;
1881 const ABIArgInfo &AI = I->info;
1883 auto &IRArgs = ArgInfo[ArgNo];
1886 IRArgs.PaddingArgIndex = IRArgNo++;
1893 llvm::StructType *STy = dyn_cast<llvm::StructType>(AI.
getCoerceToType());
1895 IRArgs.NumberOfArgs = STy->getNumElements();
1897 IRArgs.NumberOfArgs = 1;
1903 IRArgs.NumberOfArgs = 1;
1908 IRArgs.NumberOfArgs = 0;
1918 if (IRArgs.NumberOfArgs > 0) {
1919 IRArgs.FirstArgIndex = IRArgNo;
1920 IRArgNo += IRArgs.NumberOfArgs;
1925 if (IRArgNo == 1 && SwapThisWithSRet)
1928 assert(ArgNo == ArgInfo.size());
1931 InallocaArgNo = IRArgNo++;
1933 TotalIRArgs = IRArgNo;
1941 return RI.
isIndirect() || (RI.isInAlloca() && RI.getInAllocaSRet());
1956 switch (BT->getKind()) {
1959 case BuiltinType::Float:
1961 case BuiltinType::Double:
1963 case BuiltinType::LongDouble:
1974 if (BT->getKind() == BuiltinType::LongDouble)
1975 return getTarget().useObjCFP2RetForComplexLongDouble();
1989 bool Inserted = FunctionsBeingProcessed.insert(&FI).second;
1991 assert(Inserted &&
"Recursively being processed?");
1993 llvm::Type *resultType =
nullptr;
1998 llvm_unreachable(
"Invalid ABI kind for return argument");
2010 unsigned addressSpace = CGM.getTypes().getTargetAddressSpace(ret);
2011 resultType = llvm::PointerType::get(
getLLVMContext(), addressSpace);
2027 ClangToLLVMArgMapping IRFunctionArgs(
getContext(), FI,
true);
2031 if (IRFunctionArgs.hasSRetArg()) {
2032 ArgTypes[IRFunctionArgs.getSRetArgNo()] = llvm::PointerType::get(
2037 if (IRFunctionArgs.hasInallocaArg())
2038 ArgTypes[IRFunctionArgs.getInallocaArgNo()] =
2045 for (; it != ie; ++it, ++ArgNo) {
2049 if (IRFunctionArgs.hasPaddingArg(ArgNo))
2050 ArgTypes[IRFunctionArgs.getPaddingArgNo(ArgNo)] =
2053 unsigned FirstIRArg, NumIRArgs;
2054 std::tie(FirstIRArg, NumIRArgs) = IRFunctionArgs.getIRArgs(ArgNo);
2059 assert(NumIRArgs == 0);
2063 assert(NumIRArgs == 1);
2065 ArgTypes[FirstIRArg] = llvm::PointerType::get(
2069 assert(NumIRArgs == 1);
2070 ArgTypes[FirstIRArg] = llvm::PointerType::get(
2079 llvm::StructType *st = dyn_cast<llvm::StructType>(argType);
2081 assert(NumIRArgs == st->getNumElements());
2082 for (
unsigned i = 0, e = st->getNumElements(); i != e; ++i)
2083 ArgTypes[FirstIRArg + i] = st->getElementType(i);
2085 assert(NumIRArgs == 1);
2086 ArgTypes[FirstIRArg] = argType;
2092 auto ArgTypesIter = ArgTypes.begin() + FirstIRArg;
2094 *ArgTypesIter++ = EltTy;
2096 assert(ArgTypesIter == ArgTypes.begin() + FirstIRArg + NumIRArgs);
2101 auto ArgTypesIter = ArgTypes.begin() + FirstIRArg;
2103 assert(ArgTypesIter == ArgTypes.begin() + FirstIRArg + NumIRArgs);
2108 bool Erased = FunctionsBeingProcessed.erase(&FI);
2110 assert(Erased &&
"Not in set?");
2112 return llvm::FunctionType::get(resultType, ArgTypes, FI.
isVariadic());
2126 llvm::AttrBuilder &FuncAttrs,
2133 FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2137 FuncAttrs.addAttribute(
"aarch64_pstate_sm_enabled");
2139 FuncAttrs.addAttribute(
"aarch64_pstate_sm_compatible");
2141 FuncAttrs.addAttribute(
"aarch64_za_state_agnostic");
2145 FuncAttrs.addAttribute(
"aarch64_preserves_za");
2147 FuncAttrs.addAttribute(
"aarch64_in_za");
2149 FuncAttrs.addAttribute(
"aarch64_out_za");
2151 FuncAttrs.addAttribute(
"aarch64_inout_za");
2155 FuncAttrs.addAttribute(
"aarch64_preserves_zt0");
2157 FuncAttrs.addAttribute(
"aarch64_in_zt0");
2159 FuncAttrs.addAttribute(
"aarch64_out_zt0");
2161 FuncAttrs.addAttribute(
"aarch64_inout_zt0");
2165 const Decl *Callee) {
2171 for (
const OMPAssumeAttr *AA : Callee->specific_attrs<OMPAssumeAttr>())
2172 AA->getAssumption().split(Attrs,
",");
2175 FuncAttrs.addAttribute(llvm::AssumptionAttrKey,
2176 llvm::join(Attrs.begin(), Attrs.end(),
","));
2183 if (
const RecordType *RT =
2185 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl()))
2186 return ClassDecl->hasTrivialDestructor();
2192 const Decl *TargetDecl) {
2198 if (
Module.getLangOpts().Sanitize.has(SanitizerKind::Memory))
2202 if (!
Module.getLangOpts().CPlusPlus)
2205 if (
const FunctionDecl *FDecl = dyn_cast<FunctionDecl>(TargetDecl)) {
2206 if (FDecl->isExternC())
2208 }
else if (
const VarDecl *VDecl = dyn_cast<VarDecl>(TargetDecl)) {
2210 if (VDecl->isExternC())
2218 return Module.getCodeGenOpts().StrictReturn ||
2219 !
Module.MayDropFunctionReturn(
Module.getContext(), RetTy) ||
2220 Module.getLangOpts().Sanitize.has(SanitizerKind::Return);
2227 llvm::DenormalMode FP32DenormalMode,
2228 llvm::AttrBuilder &FuncAttrs) {
2229 llvm::DenormalFPEnv FPEnv(FPDenormalMode, FP32DenormalMode);
2230 if (FPEnv != llvm::DenormalFPEnv::getDefault())
2231 FuncAttrs.addDenormalFPEnvAttr(FPEnv);
2239 llvm::AttrBuilder &FuncAttrs) {
2245 StringRef Name,
bool HasOptnone,
const CodeGenOptions &CodeGenOpts,
2247 llvm::AttrBuilder &FuncAttrs) {
2250 if (CodeGenOpts.OptimizeSize)
2251 FuncAttrs.addAttribute(llvm::Attribute::OptimizeForSize);
2252 if (CodeGenOpts.OptimizeSize == 2)
2253 FuncAttrs.addAttribute(llvm::Attribute::MinSize);
2256 if (CodeGenOpts.DisableRedZone)
2257 FuncAttrs.addAttribute(llvm::Attribute::NoRedZone);
2258 if (CodeGenOpts.IndirectTlsSegRefs)
2259 FuncAttrs.addAttribute(
"indirect-tls-seg-refs");
2260 if (CodeGenOpts.NoImplicitFloat)
2261 FuncAttrs.addAttribute(llvm::Attribute::NoImplicitFloat);
2263 if (AttrOnCallSite) {
2268 FuncAttrs.addAttribute(llvm::Attribute::NoBuiltin);
2270 FuncAttrs.addAttribute(
"trap-func-name", CodeGenOpts.
TrapFuncName);
2272 switch (CodeGenOpts.getFramePointer()) {
2280 FuncAttrs.addAttribute(
"frame-pointer",
2282 CodeGenOpts.getFramePointer()));
2285 if (CodeGenOpts.LessPreciseFPMAD)
2286 FuncAttrs.addAttribute(
"less-precise-fpmad",
"true");
2288 if (CodeGenOpts.NullPointerIsValid)
2289 FuncAttrs.addAttribute(llvm::Attribute::NullPointerIsValid);
2292 FuncAttrs.addAttribute(
"no-trapping-math",
"true");
2296 if (CodeGenOpts.SoftFloat)
2297 FuncAttrs.addAttribute(
"use-soft-float",
"true");
2298 FuncAttrs.addAttribute(
"stack-protector-buffer-size",
2299 llvm::utostr(CodeGenOpts.SSPBufferSize));
2300 if (LangOpts.NoSignedZero)
2301 FuncAttrs.addAttribute(
"no-signed-zeros-fp-math",
"true");
2304 const std::vector<std::string> &Recips = CodeGenOpts.
Reciprocals;
2305 if (!Recips.empty())
2306 FuncAttrs.addAttribute(
"reciprocal-estimates", llvm::join(Recips,
","));
2310 FuncAttrs.addAttribute(
"prefer-vector-width",
2313 if (CodeGenOpts.StackRealignment)
2314 FuncAttrs.addAttribute(
"stackrealign");
2315 if (CodeGenOpts.Backchain)
2316 FuncAttrs.addAttribute(
"backchain");
2317 if (CodeGenOpts.EnableSegmentedStacks)
2318 FuncAttrs.addAttribute(
"split-stack");
2320 if (CodeGenOpts.SpeculativeLoadHardening)
2321 FuncAttrs.addAttribute(llvm::Attribute::SpeculativeLoadHardening);
2324 switch (CodeGenOpts.getZeroCallUsedRegs()) {
2325 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::Skip:
2326 FuncAttrs.removeAttribute(
"zero-call-used-regs");
2328 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::UsedGPRArg:
2329 FuncAttrs.addAttribute(
"zero-call-used-regs",
"used-gpr-arg");
2331 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::UsedGPR:
2332 FuncAttrs.addAttribute(
"zero-call-used-regs",
"used-gpr");
2334 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::UsedArg:
2335 FuncAttrs.addAttribute(
"zero-call-used-regs",
"used-arg");
2337 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::Used:
2338 FuncAttrs.addAttribute(
"zero-call-used-regs",
"used");
2340 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::AllGPRArg:
2341 FuncAttrs.addAttribute(
"zero-call-used-regs",
"all-gpr-arg");
2343 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::AllGPR:
2344 FuncAttrs.addAttribute(
"zero-call-used-regs",
"all-gpr");
2346 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::AllArg:
2347 FuncAttrs.addAttribute(
"zero-call-used-regs",
"all-arg");
2349 case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::All:
2350 FuncAttrs.addAttribute(
"zero-call-used-regs",
"all");
2361 FuncAttrs.addAttribute(llvm::Attribute::Convergent);
2366 if ((LangOpts.CUDA && LangOpts.CUDAIsDevice) || LangOpts.OpenCL ||
2367 LangOpts.SYCLIsDevice) {
2368 FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2371 if (CodeGenOpts.SaveRegParams && !AttrOnCallSite)
2372 FuncAttrs.addAttribute(
"save-reg-params");
2375 StringRef Var,
Value;
2377 FuncAttrs.addAttribute(Var,
Value);
2391 const llvm::Function &F,
2393 auto FFeatures = F.getFnAttribute(
"target-features");
2395 llvm::StringSet<> MergedNames;
2397 MergedFeatures.reserve(TargetOpts.
Features.size());
2399 auto AddUnmergedFeatures = [&](
auto &&FeatureRange) {
2400 for (StringRef
Feature : FeatureRange) {
2404 StringRef Name =
Feature.drop_front(1);
2405 bool Merged = !MergedNames.insert(Name).second;
2407 MergedFeatures.push_back(
Feature);
2411 if (FFeatures.isValid())
2412 AddUnmergedFeatures(llvm::split(FFeatures.getValueAsString(),
','));
2413 AddUnmergedFeatures(TargetOpts.
Features);
2415 if (!MergedFeatures.empty()) {
2416 llvm::sort(MergedFeatures);
2417 FuncAttr.addAttribute(
"target-features", llvm::join(MergedFeatures,
","));
2424 bool WillInternalize) {
2426 llvm::AttrBuilder FuncAttrs(F.getContext());
2429 if (!TargetOpts.
CPU.empty())
2430 FuncAttrs.addAttribute(
"target-cpu", TargetOpts.
CPU);
2431 if (!TargetOpts.
TuneCPU.empty())
2432 FuncAttrs.addAttribute(
"tune-cpu", TargetOpts.
TuneCPU);
2435 CodeGenOpts, LangOpts,
2438 if (!WillInternalize && F.isInterposable()) {
2443 F.addFnAttrs(FuncAttrs);
2447 llvm::AttributeMask AttrsToRemove;
2451 llvm::DenormalFPEnv MergedFPEnv =
2452 OptsFPEnv.mergeCalleeMode(F.getDenormalFPEnv());
2454 if (MergedFPEnv == llvm::DenormalFPEnv::getDefault()) {
2455 AttrsToRemove.addAttribute(llvm::Attribute::DenormalFPEnv);
2458 FuncAttrs.addDenormalFPEnvAttr(MergedFPEnv);
2461 F.removeFnAttrs(AttrsToRemove);
2465 F.addFnAttrs(FuncAttrs);
2468void CodeGenModule::getTrivialDefaultFunctionAttributes(
2469 StringRef Name,
bool HasOptnone,
bool AttrOnCallSite,
2470 llvm::AttrBuilder &FuncAttrs) {
2472 getLangOpts(), AttrOnCallSite,
2476void CodeGenModule::getDefaultFunctionAttributes(StringRef Name,
2478 bool AttrOnCallSite,
2479 llvm::AttrBuilder &FuncAttrs) {
2483 if (!AttrOnCallSite)
2489 if (!AttrOnCallSite)
2494 llvm::AttrBuilder &attrs) {
2495 getDefaultFunctionAttributes(
"",
false,
2497 GetCPUAndFeaturesAttributes(
GlobalDecl(), attrs);
2502 const NoBuiltinAttr *NBA =
nullptr) {
2503 auto AddNoBuiltinAttr = [&FuncAttrs](StringRef BuiltinName) {
2505 AttributeName +=
"no-builtin-";
2506 AttributeName += BuiltinName;
2507 FuncAttrs.addAttribute(AttributeName);
2511 if (LangOpts.NoBuiltin) {
2513 FuncAttrs.addAttribute(
"no-builtins");
2527 if (llvm::is_contained(NBA->builtinNames(),
"*")) {
2528 FuncAttrs.addAttribute(
"no-builtins");
2533 llvm::for_each(NBA->builtinNames(), AddNoBuiltinAttr);
2537 const llvm::DataLayout &DL,
const ABIArgInfo &AI,
2538 bool CheckCoerce =
true) {
2545 if (!DL.typeSizeEqualsStoreSize(Ty))
2552 if (llvm::TypeSize::isKnownGT(DL.getTypeSizeInBits(CoerceTy),
2553 DL.getTypeSizeInBits(Ty)))
2577 if (
const MatrixType *Matrix = dyn_cast<MatrixType>(QTy))
2588 unsigned NumRequiredArgs,
unsigned ArgNo) {
2589 const auto *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl);
2594 if (ArgNo >= NumRequiredArgs)
2598 if (ArgNo < FD->getNumParams()) {
2599 const ParmVarDecl *Param = FD->getParamDecl(ArgNo);
2600 if (Param && Param->hasAttr<MaybeUndefAttr>())
2617 if (llvm::AttributeFuncs::isNoFPClassCompatibleType(IRTy))
2620 if (llvm::StructType *ST = dyn_cast<llvm::StructType>(IRTy)) {
2622 llvm::all_of(ST->elements(),
2623 llvm::AttributeFuncs::isNoFPClassCompatibleType);
2631 llvm::FPClassTest Mask = llvm::fcNone;
2632 if (LangOpts.NoHonorInfs)
2633 Mask |= llvm::fcInf;
2634 if (LangOpts.NoHonorNaNs)
2635 Mask |= llvm::fcNan;
2641 llvm::AttributeList &Attrs) {
2642 if (Attrs.getMemoryEffects().getModRef() == llvm::ModRefInfo::NoModRef) {
2643 Attrs = Attrs.removeFnAttribute(
getLLVMContext(), llvm::Attribute::Memory);
2644 llvm::Attribute MemoryAttr = llvm::Attribute::getWithMemoryEffects(
2670 llvm::AttributeList &AttrList,
2672 bool AttrOnCallSite,
bool IsThunk) {
2680 FuncAttrs.addAttribute(llvm::Attribute::NoReturn);
2682 FuncAttrs.addAttribute(
"cmse_nonsecure_call");
2693 bool HasOptnone =
false;
2695 const NoBuiltinAttr *NBA =
nullptr;
2699 std::optional<llvm::Attribute::AttrKind> MemAttrForPtrArgs;
2700 bool AddedPotentialArgAccess =
false;
2701 auto AddPotentialArgAccess = [&]() {
2702 AddedPotentialArgAccess =
true;
2703 llvm::Attribute A = FuncAttrs.getAttribute(llvm::Attribute::Memory);
2705 FuncAttrs.addMemoryAttr(A.getMemoryEffects() |
2706 llvm::MemoryEffects::argMemOnly());
2713 if (TargetDecl->
hasAttr<ReturnsTwiceAttr>())
2714 FuncAttrs.addAttribute(llvm::Attribute::ReturnsTwice);
2715 if (TargetDecl->
hasAttr<NoThrowAttr>())
2716 FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2717 if (TargetDecl->
hasAttr<NoReturnAttr>())
2718 FuncAttrs.addAttribute(llvm::Attribute::NoReturn);
2719 if (TargetDecl->
hasAttr<ColdAttr>())
2720 FuncAttrs.addAttribute(llvm::Attribute::Cold);
2721 if (TargetDecl->
hasAttr<HotAttr>())
2722 FuncAttrs.addAttribute(llvm::Attribute::Hot);
2723 if (TargetDecl->
hasAttr<NoDuplicateAttr>())
2724 FuncAttrs.addAttribute(llvm::Attribute::NoDuplicate);
2725 if (TargetDecl->
hasAttr<ConvergentAttr>())
2726 FuncAttrs.addAttribute(llvm::Attribute::Convergent);
2728 if (
const FunctionDecl *Fn = dyn_cast<FunctionDecl>(TargetDecl)) {
2731 if (AttrOnCallSite && Fn->isReplaceableGlobalAllocationFunction()) {
2733 auto Kind = Fn->getDeclName().getCXXOverloadedOperator();
2735 (Kind == OO_New || Kind == OO_Array_New))
2736 RetAttrs.addAttribute(llvm::Attribute::NoAlias);
2739 const bool IsVirtualCall = MD && MD->
isVirtual();
2742 if (!(AttrOnCallSite && IsVirtualCall)) {
2743 if (Fn->isNoReturn())
2744 FuncAttrs.addAttribute(llvm::Attribute::NoReturn);
2745 NBA = Fn->getAttr<NoBuiltinAttr>();
2752 if (AttrOnCallSite && TargetDecl->
hasAttr<NoMergeAttr>())
2753 FuncAttrs.addAttribute(llvm::Attribute::NoMerge);
2757 if (TargetDecl->
hasAttr<ConstAttr>()) {
2758 FuncAttrs.addMemoryAttr(llvm::MemoryEffects::none());
2759 FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2762 FuncAttrs.addAttribute(llvm::Attribute::WillReturn);
2763 MemAttrForPtrArgs = llvm::Attribute::ReadNone;
2764 }
else if (TargetDecl->
hasAttr<PureAttr>()) {
2765 FuncAttrs.addMemoryAttr(llvm::MemoryEffects::readOnly());
2766 FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2768 FuncAttrs.addAttribute(llvm::Attribute::WillReturn);
2769 MemAttrForPtrArgs = llvm::Attribute::ReadOnly;
2770 }
else if (TargetDecl->
hasAttr<NoAliasAttr>()) {
2771 FuncAttrs.addMemoryAttr(llvm::MemoryEffects::inaccessibleOrArgMemOnly());
2772 FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2774 if (
const auto *RA = TargetDecl->
getAttr<RestrictAttr>();
2775 RA && RA->getDeallocator() ==
nullptr)
2776 RetAttrs.addAttribute(llvm::Attribute::NoAlias);
2777 if (TargetDecl->
hasAttr<ReturnsNonNullAttr>() &&
2778 !CodeGenOpts.NullPointerIsValid)
2779 RetAttrs.addAttribute(llvm::Attribute::NonNull);
2780 if (TargetDecl->
hasAttr<AnyX86NoCallerSavedRegistersAttr>())
2781 FuncAttrs.addAttribute(
"no_caller_saved_registers");
2782 if (TargetDecl->
hasAttr<AnyX86NoCfCheckAttr>())
2783 FuncAttrs.addAttribute(llvm::Attribute::NoCfCheck);
2784 if (TargetDecl->
hasAttr<LeafAttr>())
2785 FuncAttrs.addAttribute(llvm::Attribute::NoCallback);
2786 if (TargetDecl->
hasAttr<BPFFastCallAttr>())
2787 FuncAttrs.addAttribute(
"bpf_fastcall");
2789 HasOptnone = TargetDecl->
hasAttr<OptimizeNoneAttr>();
2790 if (
auto *AllocSize = TargetDecl->
getAttr<AllocSizeAttr>()) {
2791 std::optional<unsigned> NumElemsParam;
2792 if (AllocSize->getNumElemsParam().isValid())
2793 NumElemsParam = AllocSize->getNumElemsParam().getLLVMIndex();
2794 FuncAttrs.addAllocSizeAttr(AllocSize->getElemSizeParam().getLLVMIndex(),
2804 FuncAttrs.addAttribute(
"uniform-work-group-size");
2806 if (TargetDecl->
hasAttr<ArmLocallyStreamingAttr>())
2807 FuncAttrs.addAttribute(
"aarch64_pstate_sm_body");
2809 if (
auto *ModularFormat = TargetDecl->
getAttr<ModularFormatAttr>()) {
2810 FormatAttr *Format = TargetDecl->
getAttr<FormatAttr>();
2811 StringRef
Type = Format->getType()->getName();
2812 std::string FormatIdx = std::to_string(Format->getFormatIdx());
2813 std::string FirstArg = std::to_string(Format->getFirstArg());
2815 Type, FormatIdx, FirstArg,
2816 ModularFormat->getModularImplFn()->getName(),
2817 ModularFormat->getImplName()};
2818 llvm::append_range(Args, ModularFormat->aspects());
2819 FuncAttrs.addAttribute(
"modular-format", llvm::join(Args,
","));
2832 getDefaultFunctionAttributes(Name, HasOptnone, AttrOnCallSite, FuncAttrs);
2837 if (TargetDecl->
hasAttr<NoSpeculativeLoadHardeningAttr>())
2838 FuncAttrs.removeAttribute(llvm::Attribute::SpeculativeLoadHardening);
2839 if (TargetDecl->
hasAttr<SpeculativeLoadHardeningAttr>())
2840 FuncAttrs.addAttribute(llvm::Attribute::SpeculativeLoadHardening);
2841 if (TargetDecl->
hasAttr<NoSplitStackAttr>())
2842 FuncAttrs.removeAttribute(
"split-stack");
2843 if (TargetDecl->
hasAttr<ZeroCallUsedRegsAttr>()) {
2846 TargetDecl->
getAttr<ZeroCallUsedRegsAttr>()->getZeroCallUsedRegs();
2847 FuncAttrs.removeAttribute(
"zero-call-used-regs");
2848 FuncAttrs.addAttribute(
2849 "zero-call-used-regs",
2850 ZeroCallUsedRegsAttr::ConvertZeroCallUsedRegsKindToStr(Kind));
2857 if (CodeGenOpts.NoPLT) {
2858 if (
auto *Fn = dyn_cast<FunctionDecl>(TargetDecl)) {
2859 if (!Fn->isDefined() && !AttrOnCallSite) {
2860 FuncAttrs.addAttribute(llvm::Attribute::NonLazyBind);
2865 if (TargetDecl->
hasAttr<NoConvergentAttr>())
2866 FuncAttrs.removeAttribute(llvm::Attribute::Convergent);
2871 if (TargetDecl && CodeGenOpts.UniqueInternalLinkageNames) {
2872 if (
const auto *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl)) {
2873 if (!FD->isExternallyVisible())
2874 FuncAttrs.addAttribute(
"sample-profile-suffix-elision-policy",
2881 if (!AttrOnCallSite) {
2882 if (TargetDecl && TargetDecl->
hasAttr<CmseNSEntryAttr>())
2883 FuncAttrs.addAttribute(
"cmse_nonsecure_entry");
2886 auto shouldDisableTailCalls = [&] {
2888 if (CodeGenOpts.DisableTailCalls)
2894 if (TargetDecl->
hasAttr<DisableTailCallsAttr>() ||
2895 TargetDecl->
hasAttr<AnyX86InterruptAttr>())
2898 if (CodeGenOpts.NoEscapingBlockTailCalls) {
2899 if (
const auto *BD = dyn_cast<BlockDecl>(TargetDecl))
2900 if (!BD->doesNotEscape())
2906 if (shouldDisableTailCalls())
2907 FuncAttrs.addAttribute(
"disable-tail-calls",
"true");
2912 static const llvm::StringSet<> ReturnsTwiceFn{
2913 "_setjmpex",
"setjmp",
"_setjmp",
"vfork",
2914 "sigsetjmp",
"__sigsetjmp",
"savectx",
"getcontext"};
2915 if (ReturnsTwiceFn.contains(Name))
2916 FuncAttrs.addAttribute(llvm::Attribute::ReturnsTwice);
2920 GetCPUAndFeaturesAttributes(CalleeInfo.
getCalleeDecl(), FuncAttrs);
2923 if (!MSHotPatchFunctions.empty()) {
2924 bool IsHotPatched = llvm::binary_search(MSHotPatchFunctions, Name);
2926 FuncAttrs.addAttribute(
"marked_for_windows_hot_patching");
2931 if (CodeGenOpts.isLoaderReplaceableFunctionName(Name))
2932 FuncAttrs.addAttribute(
"loader-replaceable");
2935 ClangToLLVMArgMapping IRFunctionArgs(
getContext(), FI);
2942 if (CodeGenOpts.EnableNoundefAttrs &&
2946 RetAttrs.addAttribute(llvm::Attribute::NoUndef);
2952 RetAttrs.addAttribute(llvm::Attribute::SExt);
2954 RetAttrs.addAttribute(llvm::Attribute::ZExt);
2956 RetAttrs.addAttribute(llvm::Attribute::NoExt);
2961 RetAttrs.addAttribute(llvm::Attribute::InReg);
2973 AddPotentialArgAccess();
2982 llvm_unreachable(
"Invalid ABI kind for return argument");
2990 RetAttrs.addDereferenceableAttr(
2992 if (
getTypes().getTargetAddressSpace(PTy) == 0 &&
2993 !CodeGenOpts.NullPointerIsValid)
2994 RetAttrs.addAttribute(llvm::Attribute::NonNull);
2996 llvm::Align Alignment =
2998 RetAttrs.addAlignmentAttr(Alignment);
3003 bool hasUsedSRet =
false;
3005 for (
unsigned I = 0; I < IRFunctionArgs.totalIRArgs(); ++I)
3009 if (IRFunctionArgs.hasSRetArg()) {
3010 llvm::AttrBuilder &SRETAttrs = ArgAttrs[IRFunctionArgs.getSRetArgNo()];
3011 SRETAttrs.addStructRetAttr(
getTypes().ConvertTypeForMem(RetTy));
3012 SRETAttrs.addAttribute(llvm::Attribute::Writable);
3013 SRETAttrs.addAttribute(llvm::Attribute::DeadOnUnwind);
3016 SRETAttrs.addAttribute(llvm::Attribute::InReg);
3021 if (IRFunctionArgs.hasInallocaArg()) {
3022 ArgAttrs[IRFunctionArgs.getInallocaArgNo()].addInAllocaAttr(
3032 auto IRArgs = IRFunctionArgs.getIRArgs(0);
3034 assert(IRArgs.second == 1 &&
"Expected only a single `this` pointer.");
3036 llvm::AttrBuilder &Attrs = ArgAttrs[IRArgs.first];
3041 if (!CodeGenOpts.NullPointerIsValid &&
3043 Attrs.addAttribute(llvm::Attribute::NonNull);
3044 Attrs.addDereferenceableAttr(ThisSz);
3050 Attrs.addDereferenceableOrNullAttr(ThisSz);
3053 llvm::Align Alignment =
3057 Attrs.addAlignmentAttr(Alignment);
3059 const auto *DD = dyn_cast_if_present<CXXDestructorDecl>(
3073 CodeGenOpts.StrictLifetimes) {
3075 dyn_cast<CXXRecordDecl>(DD->getDeclContext());
3079 Attrs.addDeadOnReturnAttr(llvm::DeadOnReturnInfo(
3080 Context.getASTRecordLayout(ClassDecl).getDataSize().getQuantity()));
3086 I != E; ++I, ++ArgNo) {
3092 if (IRFunctionArgs.hasPaddingArg(ArgNo)) {
3094 ArgAttrs[IRFunctionArgs.getPaddingArgNo(ArgNo)].addAttribute(
3095 llvm::Attribute::InReg);
3100 if (CodeGenOpts.EnableNoundefAttrs &&
3102 Attrs.addAttribute(llvm::Attribute::NoUndef);
3111 Attrs.addAttribute(llvm::Attribute::SExt);
3113 Attrs.addAttribute(llvm::Attribute::ZExt);
3115 Attrs.addAttribute(llvm::Attribute::NoExt);
3120 Attrs.addAttribute(llvm::Attribute::Nest);
3122 Attrs.addAttribute(llvm::Attribute::InReg);
3123 Attrs.addStackAlignmentAttr(llvm::MaybeAlign(AI.
getDirectAlign()));
3130 Attrs.addAttribute(llvm::Attribute::InReg);
3142 Attrs.addByValAttr(
getTypes().ConvertTypeForMem(ParamType));
3150 Attrs.addDeadOnReturnAttr(llvm::DeadOnReturnInfo());
3155 if (CodeGenOpts.PassByValueIsNoAlias &&
Decl &&
3156 Decl->getArgPassingRestrictions() ==
3160 Attrs.addAttribute(llvm::Attribute::NoAlias);
3183 AddPotentialArgAccess();
3188 Attrs.addByRefAttr(
getTypes().ConvertTypeForMem(ParamType));
3199 AddPotentialArgAccess();
3207 if (
getTypes().getTargetAddressSpace(PTy) == 0 &&
3208 !CodeGenOpts.NullPointerIsValid)
3209 Attrs.addAttribute(llvm::Attribute::NonNull);
3211 llvm::Align Alignment =
3213 Attrs.addAlignmentAttr(Alignment);
3222 DeviceKernelAttr::isOpenCLSpelling(
3223 TargetDecl->
getAttr<DeviceKernelAttr>()) &&
3227 llvm::Align Alignment =
3229 Attrs.addAlignmentAttr(Alignment);
3236 Attrs.addAttribute(llvm::Attribute::NoAlias);
3245 Attrs.addStructRetAttr(
getTypes().ConvertTypeForMem(ParamType));
3250 Attrs.addAttribute(llvm::Attribute::NoAlias);
3254 if (!PTy->isIncompleteType() && PTy->isConstantSizeType()) {
3255 auto info =
getContext().getTypeInfoInChars(PTy);
3256 Attrs.addDereferenceableAttr(info.Width.getQuantity());
3257 Attrs.addAlignmentAttr(info.Align.getAsAlign());
3263 Attrs.addAttribute(llvm::Attribute::SwiftError);
3267 Attrs.addAttribute(llvm::Attribute::SwiftSelf);
3271 Attrs.addAttribute(llvm::Attribute::SwiftAsync);
3276 Attrs.addCapturesAttr(
3277 llvm::CaptureInfo(llvm::CaptureComponents::Address));
3279 if (Attrs.hasAttributes()) {
3280 unsigned FirstIRArg, NumIRArgs;
3281 std::tie(FirstIRArg, NumIRArgs) = IRFunctionArgs.getIRArgs(ArgNo);
3282 for (
unsigned i = 0; i < NumIRArgs; i++)
3283 ArgAttrs[FirstIRArg + i].merge(Attrs);
3291 AddPotentialArgAccess();
3294 if (AddedPotentialArgAccess && MemAttrForPtrArgs) {
3298 I != E; ++I, ++ArgNo) {
3299 if (I->info.isDirect() || I->info.isExpand() ||
3300 I->info.isCoerceAndExpand()) {
3301 unsigned FirstIRArg, NumIRArgs;
3302 std::tie(FirstIRArg, NumIRArgs) = IRFunctionArgs.getIRArgs(ArgNo);
3303 for (
unsigned i = FirstIRArg; i < FirstIRArg + NumIRArgs; ++i) {
3310 if (i < FunctionType->getNumParams() &&
3312 ArgAttrs[i].addAttribute(*MemAttrForPtrArgs);
3320 for (
const llvm::AttrBuilder &Attrs : ArgAttrs)
3321 ArgAttrSets.push_back(llvm::AttributeSet::get(
getLLVMContext(), Attrs));
3323 AttrList = llvm::AttributeList::get(
3325 llvm::AttributeSet::get(
getLLVMContext(), RetAttrs), ArgAttrSets);
3332 llvm::Value *value) {
3333 llvm::Type *varType = CGF.
ConvertType(var->getType());
3337 if (value->getType() == varType)
3340 assert((varType->isIntegerTy() || varType->isFloatingPointTy()) &&
3341 "unexpected promotion type");
3344 return CGF.
Builder.CreateTrunc(value, varType,
"arg.unpromote");
3346 return CGF.
Builder.CreateFPCast(value, varType,
"arg.unpromote");
3352 QualType ArgType,
unsigned ArgNo) {
3360 if (!ArgType->isAnyPointerType() && !ArgType->isBlockPointerType())
3364 if (
auto ParmNNAttr = PVD->
getAttr<NonNullAttr>())
3371 if (NNAttr->isNonNull(ArgNo))
3378struct CopyBackSwiftError final : EHScopeStack::Cleanup {
3381 CopyBackSwiftError(Address temp, Address arg) : Temp(temp), Arg(
arg) {}
3382 void Emit(CodeGenFunction &CGF, Flags flags)
override {
3401 if (FD->hasImplicitReturnZero()) {
3402 QualType RetTy = FD->getReturnType().getUnqualifiedType();
3403 llvm::Type *LLVMTy =
CGM.getTypes().ConvertType(RetTy);
3404 llvm::Constant *
Zero = llvm::Constant::getNullValue(LLVMTy);
3412 ClangToLLVMArgMapping IRFunctionArgs(
CGM.getContext(), FI);
3413 assert(Fn->arg_size() == IRFunctionArgs.totalIRArgs());
3418 if (IRFunctionArgs.hasInallocaArg())
3419 ArgStruct =
Address(Fn->getArg(IRFunctionArgs.getInallocaArgNo()),
3423 if (IRFunctionArgs.hasSRetArg()) {
3424 auto AI = Fn->getArg(IRFunctionArgs.getSRetArgNo());
3425 AI->setName(
"agg.result");
3426 AI->addAttr(llvm::Attribute::NoAlias);
3433 ArgVals.reserve(Args.size());
3439 assert(FI.
arg_size() == Args.size() &&
3440 "Mismatch between function signature & arguments.");
3443 for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end(); i != e;
3444 ++i, ++info_it, ++ArgNo) {
3457 unsigned FirstIRArg, NumIRArgs;
3458 std::tie(FirstIRArg, NumIRArgs) = IRFunctionArgs.getIRArgs(ArgNo);
3462 assert(NumIRArgs == 0);
3475 assert(NumIRArgs == 1);
3498 llvm::ConstantInt::get(
IntPtrTy, Size.getQuantity()));
3499 ParamAddr = AlignedTemp;
3516 auto AI = Fn->getArg(FirstIRArg);
3524 assert(NumIRArgs == 1);
3526 if (
const ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(Arg)) {
3529 PVD->getFunctionScopeIndex()) &&
3530 !
CGM.getCodeGenOpts().NullPointerIsValid)
3531 AI->addAttr(llvm::Attribute::NonNull);
3533 QualType OTy = PVD->getOriginalType();
3534 if (
const auto *ArrTy =
getContext().getAsConstantArrayType(OTy)) {
3540 QualType ETy = ArrTy->getElementType();
3541 llvm::Align Alignment =
3542 CGM.getNaturalTypeAlignment(ETy).getAsAlign();
3544 .addAlignmentAttr(Alignment));
3545 uint64_t ArrSize = ArrTy->getZExtSize();
3549 Attrs.addDereferenceableAttr(
3550 getContext().getTypeSizeInChars(ETy).getQuantity() *
3552 AI->addAttrs(Attrs);
3553 }
else if (
getContext().getTargetInfo().getNullPointerValue(
3555 !
CGM.getCodeGenOpts().NullPointerIsValid) {
3556 AI->addAttr(llvm::Attribute::NonNull);
3559 }
else if (
const auto *ArrTy =
3565 QualType ETy = ArrTy->getElementType();
3566 llvm::Align Alignment =
3567 CGM.getNaturalTypeAlignment(ETy).getAsAlign();
3569 .addAlignmentAttr(Alignment));
3570 if (!
getTypes().getTargetAddressSpace(ETy) &&
3571 !
CGM.getCodeGenOpts().NullPointerIsValid)
3572 AI->addAttr(llvm::Attribute::NonNull);
3577 const auto *AVAttr = PVD->getAttr<AlignValueAttr>();
3580 AVAttr = TOTy->getDecl()->getAttr<AlignValueAttr>();
3581 if (AVAttr && !
SanOpts.has(SanitizerKind::Alignment)) {
3585 llvm::ConstantInt *AlignmentCI =
3587 uint64_t AlignmentInt =
3588 AlignmentCI->getLimitedValue(llvm::Value::MaximumAlignment);
3589 if (AI->getParamAlign().valueOrOne() < AlignmentInt) {
3590 AI->removeAttr(llvm::Attribute::AttrKind::Alignment);
3592 .addAlignmentAttr(llvm::Align(AlignmentInt)));
3599 AI->addAttr(llvm::Attribute::NoAlias);
3607 assert(NumIRArgs == 1);
3611 llvm::Value *
V = AI;
3619 V, pointeeTy,
getContext().getTypeAlignInChars(pointeeTy));
3620 llvm::Value *incomingErrorValue =
Builder.CreateLoad(arg);
3621 Builder.CreateStore(incomingErrorValue, temp);
3642 if (
V->getType() != LTy)
3653 if (
auto *VecTyTo = dyn_cast<llvm::FixedVectorType>(
ConvertType(Ty))) {
3654 llvm::Value *ArgVal = Fn->getArg(FirstIRArg);
3655 if (
auto *VecTyFrom =
3656 dyn_cast<llvm::ScalableVectorType>(ArgVal->getType())) {
3658 *
this, VecTyTo, VecTyFrom, ArgVal, Arg->
getName());
3660 assert(NumIRArgs == 1);
3667 llvm::StructType *STy =
3678 STy->getNumElements() > 1) {
3679 llvm::TypeSize StructSize =
CGM.getDataLayout().getTypeAllocSize(STy);
3680 llvm::TypeSize PtrElementSize =
3682 if (StructSize.isScalable()) {
3683 assert(STy->containsHomogeneousScalableVectorTypes() &&
3684 "ABI only supports structure with homogeneous scalable vector "
3686 assert(StructSize == PtrElementSize &&
3687 "Only allow non-fractional movement of structure with"
3688 "homogeneous scalable vector type");
3689 assert(STy->getNumElements() == NumIRArgs);
3691 llvm::Value *LoadedStructValue = llvm::PoisonValue::get(STy);
3692 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
3693 auto *AI = Fn->getArg(FirstIRArg + i);
3694 AI->setName(Arg->
getName() +
".coerce" + Twine(i));
3696 Builder.CreateInsertValue(LoadedStructValue, AI, i);
3699 Builder.CreateStore(LoadedStructValue, Ptr);
3701 uint64_t SrcSize = StructSize.getFixedValue();
3702 uint64_t DstSize = PtrElementSize.getFixedValue();
3705 if (SrcSize <= DstSize) {
3712 assert(STy->getNumElements() == NumIRArgs);
3713 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
3714 auto AI = Fn->getArg(FirstIRArg + i);
3715 AI->setName(Arg->
getName() +
".coerce" + Twine(i));
3717 Builder.CreateStore(AI, EltPtr);
3720 if (SrcSize > DstSize) {
3721 Builder.CreateMemCpy(Ptr, AddrToStoreInto, DstSize);
3733 assert(NumIRArgs == 1);
3734 auto AI = Fn->getArg(FirstIRArg);
3735 AI->setName(Arg->
getName() +
".coerce");
3738 llvm::TypeSize::getFixed(
3739 getContext().getTypeSizeInChars(Ty).getQuantity() -
3765 auto *unpaddedStruct = dyn_cast<llvm::StructType>(unpaddedCoercionType);
3769 unsigned argIndex = FirstIRArg;
3770 unsigned unpaddedIndex = 0;
3771 for (
unsigned i = 0, e = coercionType->getNumElements(); i != e; ++i) {
3772 llvm::Type *eltType = coercionType->getElementType(i);
3776 auto eltAddr =
Builder.CreateStructGEP(alloca, i);
3777 llvm::Value *elt = Fn->getArg(argIndex++);
3779 auto paramType = unpaddedStruct
3780 ? unpaddedStruct->getElementType(unpaddedIndex++)
3781 : unpaddedCoercionType;
3783 if (
auto *VecTyTo = dyn_cast<llvm::FixedVectorType>(eltType)) {
3784 if (
auto *VecTyFrom = dyn_cast<llvm::ScalableVectorType>(paramType)) {
3787 *
this, VecTyTo, VecTyFrom, elt, elt->getName());
3788 assert(Extracted &&
"Unexpected scalable to fixed vector coercion");
3791 Builder.CreateStore(elt, eltAddr);
3793 assert(argIndex == FirstIRArg + NumIRArgs);
3806 auto FnArgIter = Fn->arg_begin() + FirstIRArg;
3807 ExpandTypeFromArgs(Ty, LV, FnArgIter);
3808 assert(FnArgIter == Fn->arg_begin() + FirstIRArg + NumIRArgs);
3809 for (
unsigned i = 0, e = NumIRArgs; i != e; ++i) {
3810 auto AI = Fn->getArg(FirstIRArg + i);
3811 AI->setName(Arg->
getName() +
"." + Twine(i));
3817 auto *AI = Fn->getArg(FirstIRArg);
3818 AI->setName(Arg->
getName() +
".target_coerce");
3822 CGM.getABIInfo().createCoercedStore(AI, Ptr, ArgI,
false, *
this);
3836 assert(NumIRArgs == 0);
3849 if (
getTarget().getCXXABI().areArgsDestroyedLeftToRightInCallee()) {
3850 for (
int I = Args.size() - 1; I >= 0; --I)
3853 for (
unsigned I = 0, E = Args.size(); I != E; ++I)
3859 while (insn->use_empty()) {
3860 llvm::BitCastInst *bitcast = dyn_cast<llvm::BitCastInst>(insn);
3866 bitcast->eraseFromParent();
3872 llvm::Value *result) {
3874 llvm::BasicBlock *BB = CGF.
Builder.GetInsertBlock();
3877 if (&BB->back() != result)
3880 llvm::Type *resultType = result->getType();
3889 while (llvm::BitCastInst *bitcast = dyn_cast<llvm::BitCastInst>(generator)) {
3895 if (generator->getNextNode() != bitcast)
3898 InstsToKill.push_back(bitcast);
3905 llvm::CallInst *call = dyn_cast<llvm::CallInst>(generator);
3909 bool doRetainAutorelease;
3912 doRetainAutorelease =
true;
3913 }
else if (call->getCalledOperand() ==
3915 doRetainAutorelease =
false;
3923 llvm::Instruction *prev = call->getPrevNode();
3926 prev = prev->getPrevNode();
3932 InstsToKill.push_back(prev);
3938 result = call->getArgOperand(0);
3939 InstsToKill.push_back(call);
3943 while (llvm::BitCastInst *bitcast = dyn_cast<llvm::BitCastInst>(result)) {
3944 if (!bitcast->hasOneUse())
3946 InstsToKill.push_back(bitcast);
3947 result = bitcast->getOperand(0);
3951 for (
auto *I : InstsToKill)
3952 I->eraseFromParent();
3955 if (doRetainAutorelease)
3959 return CGF.
Builder.CreateBitCast(result, resultType);
3964 llvm::Value *result) {
3967 dyn_cast_or_null<ObjCMethodDecl>(CGF.
CurCodeDecl);
3976 llvm::CallInst *retainCall = dyn_cast<llvm::CallInst>(result);
3977 if (!retainCall || retainCall->getCalledOperand() !=
3982 llvm::Value *retainedValue = retainCall->getArgOperand(0);
3983 llvm::LoadInst *load =
3984 dyn_cast<llvm::LoadInst>(retainedValue->stripPointerCasts());
3985 if (!load || load->isAtomic() || load->isVolatile() ||
3992 llvm::Type *resultType = result->getType();
3994 assert(retainCall->use_empty());
3995 retainCall->eraseFromParent();
3998 return CGF.
Builder.CreateBitCast(load, resultType);
4005 llvm::Value *result) {
4028 auto GetStoreIfValid = [&CGF,
4029 ReturnValuePtr](llvm::User *
U) -> llvm::StoreInst * {
4030 auto *SI = dyn_cast<llvm::StoreInst>(
U);
4031 if (!SI || SI->getPointerOperand() != ReturnValuePtr ||
4037 assert(!SI->isAtomic() &&
4045 if (!ReturnValuePtr->hasOneUse()) {
4046 llvm::BasicBlock *IP = CGF.
Builder.GetInsertBlock();
4052 const llvm::Instruction *LoadIntoFakeUse =
nullptr;
4053 for (llvm::Instruction &I : llvm::reverse(*IP)) {
4057 if (LoadIntoFakeUse == &I)
4061 if (
auto *II = dyn_cast<llvm::IntrinsicInst>(&I)) {
4062 if (II->getIntrinsicID() == llvm::Intrinsic::lifetime_end)
4065 if (II->getIntrinsicID() == llvm::Intrinsic::fake_use) {
4066 LoadIntoFakeUse = dyn_cast<llvm::Instruction>(II->getArgOperand(0));
4070 return GetStoreIfValid(&I);
4075 llvm::StoreInst *store = GetStoreIfValid(ReturnValuePtr->user_back());
4081 llvm::BasicBlock *StoreBB = store->getParent();
4082 llvm::BasicBlock *IP = CGF.
Builder.GetInsertBlock();
4084 while (IP != StoreBB) {
4085 if (!SeenBBs.insert(IP).second || !(IP = IP->getSinglePredecessor()))
4101 int BitWidth,
int CharWidth) {
4102 assert(CharWidth <= 64);
4103 assert(
static_cast<unsigned>(BitWidth) <= Bits.size() * CharWidth);
4106 if (BitOffset >= CharWidth) {
4107 Pos += BitOffset / CharWidth;
4108 BitOffset = BitOffset % CharWidth;
4111 const uint64_t
Used = (uint64_t(1) << CharWidth) - 1;
4112 if (BitOffset + BitWidth >= CharWidth) {
4113 Bits[Pos++] |= (
Used << BitOffset) &
Used;
4114 BitWidth -= CharWidth - BitOffset;
4118 while (BitWidth >= CharWidth) {
4120 BitWidth -= CharWidth;
4124 Bits[Pos++] |= (
Used >> (CharWidth - BitWidth)) << BitOffset;
4132 int StorageSize,
int BitOffset,
int BitWidth,
4133 int CharWidth,
bool BigEndian) {
4136 setBitRange(TmpBits, BitOffset, BitWidth, CharWidth);
4139 std::reverse(TmpBits.begin(), TmpBits.end());
4141 for (uint64_t
V : TmpBits)
4142 Bits[StorageOffset++] |=
V;
4145static void setUsedBits(CodeGenModule &, QualType,
int,
4146 SmallVectorImpl<uint64_t> &);
4188 QualType ETy = Context.getBaseElementType(ATy);
4189 int Size = Context.getTypeSizeInChars(ETy).getQuantity();
4193 for (
int I = 0, N = Context.getConstantArrayElementCount(ATy); I < N; ++I) {
4194 auto Src = TmpBits.begin();
4195 auto Dst = Bits.begin() + Offset + I * Size;
4196 for (
int J = 0; J < Size; ++J)
4209 if (
const auto *ATy = Context.getAsConstantArrayType(QTy))
4212 int Size = Context.getTypeSizeInChars(QTy).getQuantity();
4216 std::fill_n(Bits.begin() + Offset, Size,
4217 (uint64_t(1) << Context.getCharWidth()) - 1);
4221 int Pos,
int Size,
int CharWidth,
4226 for (
auto P = Bits.begin() + Pos, E = Bits.begin() + Pos + Size; P != E;
4228 Mask = (Mask << CharWidth) | *P;
4230 auto P = Bits.begin() + Pos + Size, End = Bits.begin() + Pos;
4232 Mask = (Mask << CharWidth) | *--P;
4241 llvm::IntegerType *ITy,
4243 assert(Src->getType() == ITy);
4244 assert(ITy->getScalarSizeInBits() <= 64);
4246 const llvm::DataLayout &DataLayout =
CGM.getDataLayout();
4247 int Size = DataLayout.getTypeStoreSize(ITy);
4251 int CharWidth =
CGM.getContext().getCharWidth();
4255 return Builder.CreateAnd(Src, Mask,
"cmse.clear");
4261 llvm::ArrayType *ATy,
4263 const llvm::DataLayout &DataLayout =
CGM.getDataLayout();
4264 int Size = DataLayout.getTypeStoreSize(ATy);
4269 int CharWidth =
CGM.getContext().getCharWidth();
4271 ATy->getArrayElementType()->getScalarSizeInBits() / CharWidth;
4273 llvm::Value *R = llvm::PoisonValue::get(ATy);
4274 for (
int I = 0, N = ATy->getArrayNumElements(); I != N; ++I) {
4276 DataLayout.isBigEndian());
4277 MaskIndex += CharsPerElt;
4278 llvm::Value *T0 =
Builder.CreateExtractValue(Src, I);
4279 llvm::Value *T1 =
Builder.CreateAnd(T0, Mask,
"cmse.clear");
4280 R =
Builder.CreateInsertValue(R, T1, I);
4288 uint64_t RetKeyInstructionsSourceAtom) {
4303 auto *I =
Builder.CreateRetVoid();
4304 if (RetKeyInstructionsSourceAtom)
4311 llvm::DebugLoc RetDbgLoc;
4312 llvm::Value *RV =
nullptr;
4322 llvm::Function::arg_iterator EI =
CurFn->arg_end();
4324 llvm::Value *ArgStruct = &*EI;
4325 llvm::Value *SRet =
Builder.CreateStructGEP(
4334 auto AI =
CurFn->arg_begin();
4352 CGM.getNaturalTypeAlignment(RetTy, &BaseInfo, &TBAAInfo);
4379 RetDbgLoc = SI->getDebugLoc();
4381 RV = SI->getValueOperand();
4382 SI->eraseFromParent();
4405 if (
auto *FD = dyn_cast<FunctionDecl>(
CurCodeDecl))
4406 RT = FD->getReturnType();
4407 else if (
auto *MD = dyn_cast<ObjCMethodDecl>(
CurCodeDecl))
4408 RT = MD->getReturnType();
4410 RT =
BlockInfo->BlockExpression->getFunctionType()->getReturnType();
4412 llvm_unreachable(
"Unexpected function/method type");
4428 auto *unpaddedStruct = dyn_cast<llvm::StructType>(unpaddedCoercionType);
4433 unsigned unpaddedIndex = 0;
4434 for (
unsigned i = 0, e = coercionType->getNumElements(); i != e; ++i) {
4435 auto coercedEltType = coercionType->getElementType(i);
4439 auto eltAddr =
Builder.CreateStructGEP(addr, i);
4442 unpaddedStruct ? unpaddedStruct->getElementType(unpaddedIndex++)
4443 : unpaddedCoercionType,
4445 results.push_back(elt);
4449 if (results.size() == 1) {
4457 RV = llvm::PoisonValue::get(returnType);
4458 for (
unsigned i = 0, e = results.size(); i != e; ++i) {
4459 RV =
Builder.CreateInsertValue(RV, results[i], i);
4466 RV =
CGM.getABIInfo().createCoercedLoad(
V, RetAI, *
this);
4471 llvm_unreachable(
"Invalid ABI kind for return argument");
4474 llvm::Instruction *Ret;
4480 auto *ITy = dyn_cast<llvm::IntegerType>(RV->getType());
4487 Ret =
Builder.CreateRetVoid();
4491 Ret->setDebugLoc(std::move(RetDbgLoc));
4493 llvm::Value *Backup = RV ? Ret->getOperand(0) :
nullptr;
4494 if (RetKeyInstructionsSourceAtom)
4510 ReturnsNonNullAttr *RetNNAttr =
nullptr;
4511 if (
SanOpts.has(SanitizerKind::ReturnsNonnullAttribute))
4512 RetNNAttr =
CurCodeDecl->getAttr<ReturnsNonNullAttr>();
4514 if (!RetNNAttr && !requiresReturnValueNullabilityCheck())
4522 assert(!requiresReturnValueNullabilityCheck() &&
4523 "Cannot check nullability and the nonnull attribute");
4524 AttrLoc = RetNNAttr->getLocation();
4525 CheckKind = SanitizerKind::SO_ReturnsNonnullAttribute;
4526 Handler = SanitizerHandler::NonnullReturn;
4528 if (
auto *DD = dyn_cast<DeclaratorDecl>(
CurCodeDecl))
4529 if (
auto *TSI = DD->getTypeSourceInfo())
4531 AttrLoc = FTL.getReturnLoc().findNullabilityLoc();
4532 CheckKind = SanitizerKind::SO_NullabilityReturn;
4533 Handler = SanitizerHandler::NullabilityReturn;
4542 llvm::Value *SLocPtr =
Builder.CreateLoad(ReturnLocation,
"return.sloc.load");
4543 llvm::Value *CanNullCheck =
Builder.CreateIsNotNull(SLocPtr);
4544 if (requiresReturnValueNullabilityCheck())
4546 Builder.CreateAnd(CanNullCheck, RetValNullabilityPrecondition);
4547 Builder.CreateCondBr(CanNullCheck, Check, NoCheck);
4553 llvm::Value *DynamicData[] = {SLocPtr};
4554 EmitCheck(std::make_pair(
Cond, CheckKind), Handler, StaticData, DynamicData);
4573 llvm::Type *IRPtrTy = llvm::PointerType::getUnqual(CGF.
getLLVMContext());
4574 llvm::Value *Placeholder = llvm::PoisonValue::get(IRPtrTy);
4599 if (
type->isReferenceType()) {
4608 param->
hasAttr<NSConsumedAttr>() &&
type->isObjCRetainableType()) {
4609 llvm::Value *ptr =
Builder.CreateLoad(local);
4612 Builder.CreateStore(null, local);
4623 type->castAsRecordDecl()->isParamDestroyedInCallee() &&
4628 "cleanup for callee-destructed param not recorded");
4630 llvm::Instruction *isActive =
Builder.CreateUnreachable();
4636 return llvm::isa_and_nonnull<llvm::ConstantPointerNull>(addr);
4646 const LValue &srcLV = writeback.
Source;
4647 Address srcAddr = srcLV.getAddress();
4649 "shouldn't have writeback for provably null argument");
4657 llvm::BasicBlock *contBB =
nullptr;
4663 if (!provablyNonNull) {
4668 CGF.
Builder.CreateCondBr(isNull, contBB, writebackBB);
4677 "icr.writeback-cast");
4686 if (writeback.
ToUse) {
4711 if (!provablyNonNull)
4720 for (
const auto &I : llvm::reverse(Cleanups)) {
4722 I.IsActiveIP->eraseFromParent();
4728 if (uop->getOpcode() == UO_AddrOf)
4729 return uop->getSubExpr();
4754 Address srcAddr = srcLV.getAddress();
4759 llvm::PointerType *destType =
4761 llvm::Type *destElemType =
4788 llvm::BasicBlock *contBB =
nullptr;
4789 llvm::BasicBlock *originBB =
nullptr;
4792 llvm::Value *finalArgument;
4796 if (provablyNonNull) {
4801 finalArgument = CGF.
Builder.CreateSelect(
4802 isNull, llvm::ConstantPointerNull::get(destType),
4808 originBB = CGF.
Builder.GetInsertBlock();
4811 CGF.
Builder.CreateCondBr(isNull, contBB, copyBB);
4813 condEval.
begin(CGF);
4817 llvm::Value *valueToUse =
nullptr;
4825 src = CGF.
Builder.CreateBitCast(src, destElemType,
"icr.cast");
4842 if (shouldCopy && !provablyNonNull) {
4843 llvm::BasicBlock *copyBB = CGF.
Builder.GetInsertBlock();
4848 llvm::PHINode *phiToUse =
4849 CGF.
Builder.CreatePHI(valueToUse->getType(), 2,
"icr.to-use");
4850 phiToUse->addIncoming(valueToUse, copyBB);
4851 phiToUse->addIncoming(llvm::PoisonValue::get(valueToUse->getType()),
4853 valueToUse = phiToUse;
4867 StackBase = CGF.
Builder.CreateStackSave(
"inalloca.save");
4873 CGF.
Builder.CreateStackRestore(StackBase);
4880 if (!AC.
getDecl() || !(
SanOpts.has(SanitizerKind::NonnullAttribute) ||
4881 SanOpts.has(SanitizerKind::NullabilityArg)))
4886 unsigned ArgNo = PVD ? PVD->getFunctionScopeIndex() : ParmNum;
4889 const NonNullAttr *NNAttr =
nullptr;
4890 if (
SanOpts.has(SanitizerKind::NonnullAttribute))
4893 bool CanCheckNullability =
false;
4894 if (
SanOpts.has(SanitizerKind::NullabilityArg) && !NNAttr && PVD &&
4895 !PVD->getType()->isRecordType()) {
4896 auto Nullability = PVD->getType()->getNullability();
4897 CanCheckNullability = Nullability &&
4899 PVD->getTypeSourceInfo();
4902 if (!NNAttr && !CanCheckNullability)
4909 AttrLoc = NNAttr->getLocation();
4910 CheckKind = SanitizerKind::SO_NonnullAttribute;
4911 Handler = SanitizerHandler::NonnullArg;
4913 AttrLoc = PVD->getTypeSourceInfo()->getTypeLoc().findNullabilityLoc();
4914 CheckKind = SanitizerKind::SO_NullabilityArg;
4915 Handler = SanitizerHandler::NullabilityArg;
4920 llvm::Constant *StaticData[] = {
4923 llvm::ConstantInt::get(
Int32Ty, ArgNo + 1),
4925 EmitCheck(std::make_pair(
Cond, CheckKind), Handler, StaticData, {});
4931 if (!AC.
getDecl() || !(
SanOpts.has(SanitizerKind::NonnullAttribute) ||
4932 SanOpts.has(SanitizerKind::NullabilityArg)))
4951 return llvm::any_of(ArgTypes, [&](
QualType Ty) {
4962 return classDecl->getTypeParamListAsWritten();
4966 return catDecl->getTypeParamList();
4976 llvm::iterator_range<CallExpr::const_arg_iterator> ArgRange,
4980 assert((ParamsToSkip == 0 ||
Prototype.P) &&
4981 "Can't skip parameters if type info is not provided");
4991 bool IsVariadic =
false;
4993 const auto *MD = dyn_cast<const ObjCMethodDecl *>(
Prototype.P);
4995 IsVariadic = MD->isVariadic();
4997 MD,
CGM.getTarget().getTriple().isOSWindows());
4998 ArgTypes.assign(MD->param_type_begin() + ParamsToSkip,
4999 MD->param_type_end());
5002 IsVariadic = FPT->isVariadic();
5003 ExplicitCC = FPT->getExtInfo().getCC();
5004 ArgTypes.assign(FPT->param_type_begin() + ParamsToSkip,
5005 FPT->param_type_end());
5013 assert(Arg != ArgRange.end() &&
"Running over edge of argument list!");
5015 QualType ArgTy = (*Arg)->getType();
5016 if (
const auto *OBT = ParamTy->
getAs<OverflowBehaviorType>())
5017 ParamTy = OBT->getUnderlyingType();
5018 if (
const auto *OBT = ArgTy->
getAs<OverflowBehaviorType>())
5019 ArgTy = OBT->getUnderlyingType();
5022 getContext().getCanonicalType(ParamTy).getTypePtr() ==
5023 getContext().getCanonicalType(ArgTy).getTypePtr()) &&
5024 "type mismatch in call argument!");
5030 assert((Arg == ArgRange.end() || IsVariadic) &&
5031 "Extra arguments in non-variadic function!");
5036 for (
auto *A : llvm::drop_begin(ArgRange, ArgTypes.size()))
5037 ArgTypes.push_back(IsVariadic ? getVarArgType(A) : A->getType());
5038 assert((
int)ArgTypes.size() == (ArgRange.end() - ArgRange.begin()));
5046 CGM.getTarget().getCXXABI().areArgsDestroyedLeftToRightInCallee()
5050 auto MaybeEmitImplicitObjectSize = [&](
unsigned I,
const Expr *Arg,
5059 auto SizeTy = Context.getSizeType();
5061 assert(EmittedArg.getScalarVal() &&
"We emitted nothing for the arg?");
5062 llvm::Value *
V = evaluateOrEmitBuiltinObjectSize(
5063 Arg, PS->getType(), T, EmittedArg.getScalarVal(), PS->isDynamic());
5068 std::swap(Args.back(), *(&Args.back() - 1));
5074 "inalloca only supported on x86");
5079 size_t CallArgsStart = Args.size();
5080 for (
unsigned I = 0, E = ArgTypes.size(); I != E; ++I) {
5081 unsigned Idx = LeftToRight ? I : E - I - 1;
5083 unsigned InitialArgSize = Args.size();
5087 getContext().hasSameUnqualifiedType((*Arg)->getType(),
5091 "Argument and parameter types don't match");
5095 assert(InitialArgSize + 1 == Args.size() &&
5096 "The code below depends on only adding one arg per EmitCallArg");
5097 (void)InitialArgSize;
5100 if (!Args.back().hasLValue()) {
5101 RValue RVArg = Args.back().getKnownRValue();
5103 ParamsToSkip + Idx);
5107 MaybeEmitImplicitObjectSize(Idx, *Arg, RVArg);
5114 std::reverse(Args.begin() + CallArgsStart, Args.end());
5123struct DestroyUnpassedArg final : EHScopeStack::Cleanup {
5133 assert(!Dtor->isTrivial());
5156 if (!HasLV &&
RV.isScalar())
5158 else if (!HasLV &&
RV.isComplex())
5161 auto Addr = HasLV ?
LV.getAddress() :
RV.getAggregateAddress();
5165 HasLV ?
LV.isVolatileQualified()
5166 :
RV.isVolatileQualified());
5178 std::optional<DisableDebugLocationUpdates> Dis;
5182 dyn_cast<ObjCIndirectCopyRestoreExpr>(E)) {
5196 "reference binding to unmaterialized r-value!");
5208 if (
type->isRecordType() &&
5209 type->castAsRecordDecl()->isParamDestroyedInCallee()) {
5216 bool DestroyedInCallee =
true, NeedsCleanup =
true;
5217 if (
const auto *RD =
type->getAsCXXRecordDecl())
5218 DestroyedInCallee = RD->hasNonTrivialDestructor();
5220 NeedsCleanup =
type.isDestructedType();
5222 if (DestroyedInCallee)
5229 if (DestroyedInCallee && NeedsCleanup) {
5236 llvm::Instruction *IsActive =
5243 if (HasAggregateEvalKind) {
5244 auto *ICE = dyn_cast<ImplicitCastExpr>(E);
5245 if (ICE && ICE->getCastKind() == CK_LValueToRValue &&
5246 ICE->getSubExpr()->getType().getAddressSpace() !=
5248 !
type->isArrayParameterType() && !
type.isNonTrivialToPrimitiveCopy()) {
5259QualType CodeGenFunction::getVarArgType(
const Expr *Arg) {
5263 if (!getTarget().
getTriple().isOSWindows())
5267 getContext().getTypeSize(Arg->
getType()) <
5271 return getContext().getIntPtrType();
5279void CodeGenFunction::AddObjCARCExceptionMetadata(llvm::Instruction *Inst) {
5280 if (CGM.getCodeGenOpts().OptimizationLevel != 0 &&
5281 !CGM.getCodeGenOpts().ObjCAutoRefCountExceptions)
5282 Inst->setMetadata(
"clang.arc.no_objc_arc_exceptions",
5283 CGM.getNoObjCARCExceptionsMetadata());
5289 const llvm::Twine &name) {
5290 return EmitNounwindRuntimeCall(callee, ArrayRef<llvm::Value *>(), name);
5296 ArrayRef<Address> args,
5297 const llvm::Twine &name) {
5298 SmallVector<llvm::Value *, 3> values;
5299 for (
auto arg : args)
5300 values.push_back(
arg.emitRawPointer(*
this));
5301 return EmitNounwindRuntimeCall(callee, values, name);
5306 ArrayRef<llvm::Value *> args,
5307 const llvm::Twine &name) {
5308 llvm::CallInst *call = EmitRuntimeCall(callee, args, name);
5309 call->setDoesNotThrow();
5316 const llvm::Twine &name) {
5317 return EmitRuntimeCall(callee, {},
name);
5322SmallVector<llvm::OperandBundleDef, 1>
5331 if (
auto *CalleeFn = dyn_cast<llvm::Function>(Callee->stripPointerCasts())) {
5332 if (CalleeFn->isIntrinsic() && CalleeFn->doesNotThrow()) {
5333 auto IID = CalleeFn->getIntrinsicID();
5334 if (!llvm::IntrinsicInst::mayLowerToFunctionCall(IID))
5347 const llvm::Twine &name) {
5348 llvm::CallInst *call = Builder.CreateCall(
5349 callee, args, getBundlesForFunclet(callee.getCallee()), name);
5350 call->setCallingConv(getRuntimeCC());
5352 if (CGM.shouldEmitConvergenceTokens() && call->isConvergent())
5358 const llvm::Twine &Name) {
5359 return EmitIntrinsicCall(ID, {}, {}, Name);
5363 ArrayRef<llvm::Value *> Args,
5364 const llvm::Twine &Name) {
5365 return EmitIntrinsicCall(ID, {}, Args, Name);
5369 ArrayRef<llvm::Type *> Types,
5370 ArrayRef<llvm::Value *> Args,
5371 const llvm::Twine &Name) {
5373 llvm::Intrinsic::getOrInsertDeclaration(&CGM.getModule(), ID, Types);
5374 llvm::CallInst *
Call =
5375 Builder.CreateCall(F, Args, getBundlesForFunclet(F), Name);
5376 if (CGM.shouldEmitConvergenceTokens() &&
Call->isConvergent())
5388 llvm::InvokeInst *invoke =
Builder.CreateInvoke(
5390 invoke->setDoesNotReturn();
5393 llvm::CallInst *call =
Builder.CreateCall(callee, args, BundleList);
5394 call->setDoesNotReturn();
5403 const Twine &name) {
5411 const Twine &name) {
5421 const Twine &Name) {
5426 llvm::CallBase *Inst;
5428 Inst =
Builder.CreateCall(Callee, Args, BundleList, Name);
5431 Inst =
Builder.CreateInvoke(Callee, ContBB, InvokeDest, Args, BundleList,
5438 if (
CGM.getLangOpts().ObjCAutoRefCount)
5439 AddObjCARCExceptionMetadata(Inst);
5444void CodeGenFunction::deferPlaceholderReplacement(llvm::Instruction *Old,
5446 DeferredReplacements.push_back(
5447 std::make_pair(llvm::WeakTrackingVH(Old),
New));
5454[[nodiscard]] llvm::AttributeList
5455maybeRaiseRetAlignmentAttribute(llvm::LLVMContext &Ctx,
5456 const llvm::AttributeList &Attrs,
5457 llvm::Align NewAlign) {
5458 llvm::Align CurAlign = Attrs.getRetAlignment().valueOrOne();
5459 if (CurAlign >= NewAlign)
5461 llvm::Attribute AlignAttr = llvm::Attribute::getWithAlignment(Ctx, NewAlign);
5462 return Attrs.removeRetAttribute(Ctx, llvm::Attribute::AttrKind::Alignment)
5463 .addRetAttribute(Ctx, AlignAttr);
5466template <
typename AlignedAttrTy>
class AbstractAssumeAlignedAttrEmitter {
5471 const AlignedAttrTy *AA =
nullptr;
5473 llvm::Value *Alignment =
nullptr;
5474 llvm::ConstantInt *OffsetCI =
nullptr;
5480 AA = FuncDecl->
getAttr<AlignedAttrTy>();
5485 [[nodiscard]] llvm::AttributeList
5486 TryEmitAsCallSiteAttribute(
const llvm::AttributeList &Attrs) {
5487 if (!AA || OffsetCI || CGF.
SanOpts.
has(SanitizerKind::Alignment))
5489 const auto *AlignmentCI = dyn_cast<llvm::ConstantInt>(Alignment);
5494 if (!AlignmentCI->getValue().isPowerOf2())
5496 llvm::AttributeList NewAttrs = maybeRaiseRetAlignmentAttribute(
5499 AlignmentCI->getLimitedValue(llvm::Value::MaximumAlignment)));
5507 void EmitAsAnAssumption(SourceLocation Loc, QualType RetTy, RValue &Ret) {
5511 AA->getLocation(), Alignment, OffsetCI);
5517class AssumeAlignedAttrEmitter final
5518 :
public AbstractAssumeAlignedAttrEmitter<AssumeAlignedAttr> {
5520 AssumeAlignedAttrEmitter(CodeGenFunction &CGF_,
const Decl *FuncDecl)
5521 : AbstractAssumeAlignedAttrEmitter(CGF_, FuncDecl) {
5526 if (Expr *Offset = AA->getOffset()) {
5528 if (OffsetCI->isNullValue())
5535class AllocAlignAttrEmitter final
5536 :
public AbstractAssumeAlignedAttrEmitter<AllocAlignAttr> {
5538 AllocAlignAttrEmitter(CodeGenFunction &CGF_,
const Decl *FuncDecl,
5539 const CallArgList &CallArgs)
5540 : AbstractAssumeAlignedAttrEmitter(CGF_, FuncDecl) {
5544 Alignment = CallArgs[AA->getParamIndex().getLLVMIndex()]
5553 if (
auto *VT = dyn_cast<llvm::VectorType>(Ty))
5554 return VT->getPrimitiveSizeInBits().getKnownMinValue();
5555 if (
auto *AT = dyn_cast<llvm::ArrayType>(Ty))
5558 unsigned MaxVectorWidth = 0;
5559 if (
auto *ST = dyn_cast<llvm::StructType>(Ty))
5560 for (
auto *I : ST->elements())
5562 return MaxVectorWidth;
5569 llvm::CallBase **callOrInvoke,
bool IsMustTail,
5571 bool IsVirtualFunctionPointerThunk) {
5574 assert(Callee.isOrdinary() || Callee.isVirtual());
5581 llvm::FunctionType *IRFuncTy =
getTypes().GetFunctionType(CallInfo);
5583 const Decl *TargetDecl = Callee.getAbstractInfo().getCalleeDecl().getDecl();
5584 if (
const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl)) {
5591 if ((TargetDecl->
hasAttr<AlwaysInlineAttr>() &&
5592 (TargetDecl->
hasAttr<TargetAttr>() ||
5596 TargetDecl->
hasAttr<TargetAttr>())))
5603 const FunctionDecl *CalleeDecl = dyn_cast_or_null<FunctionDecl>(TargetDecl);
5604 CGM.getTargetCodeGenInfo().checkFunctionCallABI(
CGM, Loc, CallerDecl,
5605 CalleeDecl, CallArgs, RetTy);
5612 if (llvm::StructType *ArgStruct = CallInfo.
getArgStruct()) {
5613 const llvm::DataLayout &DL =
CGM.getDataLayout();
5615 llvm::AllocaInst *AI;
5617 IP = IP->getNextNode();
5618 AI =
new llvm::AllocaInst(ArgStruct, DL.getAllocaAddrSpace(),
"argmem",
5624 AI->setAlignment(Align.getAsAlign());
5625 AI->setUsedWithInAlloca(
true);
5626 assert(AI->isUsedWithInAlloca() && !AI->isStaticAlloca());
5627 ArgMemory =
RawAddress(AI, ArgStruct, Align);
5630 ClangToLLVMArgMapping IRFunctionArgs(
CGM.getContext(), CallInfo);
5638 bool NeedSRetLifetimeEnd =
false;
5644 if ((IsVirtualFunctionPointerThunk || IsMustTail) && RetAI.
isIndirect()) {
5646 IRFunctionArgs.getSRetArgNo(),
5654 if (NeedSRetLifetimeEnd)
5655 SRetAlloca = SRetPtr;
5658 if (IRFunctionArgs.hasSRetArg()) {
5671 IRCallArgs[IRFunctionArgs.getSRetArgNo()] =
5689 assert(CallInfo.
arg_size() == CallArgs.size() &&
5690 "Mismatch between function signature & arguments.");
5693 for (CallArgList::const_iterator I = CallArgs.begin(), E = CallArgs.end();
5694 I != E; ++I, ++info_it, ++ArgNo) {
5698 if (IRFunctionArgs.hasPaddingArg(ArgNo))
5699 IRCallArgs[IRFunctionArgs.getPaddingArgNo(ArgNo)] =
5702 unsigned FirstIRArg, NumIRArgs;
5703 std::tie(FirstIRArg, NumIRArgs) = IRFunctionArgs.getIRArgs(ArgNo);
5705 bool ArgHasMaybeUndefAttr =
5710 assert(NumIRArgs == 0);
5712 if (I->isAggregate()) {
5714 ? I->getKnownLValue().getAddress()
5715 : I->getKnownRValue().getAggregateAddress();
5716 llvm::Instruction *Placeholder =
5721 CGBuilderTy::InsertPoint IP =
Builder.saveIP();
5722 Builder.SetInsertPoint(Placeholder);
5736 deferPlaceholderReplacement(Placeholder,
Addr.getPointer());
5741 I->Ty,
getContext().getTypeAlignInChars(I->Ty),
5742 "indirect-arg-temp");
5743 I->copyInto(*
this,
Addr);
5752 I->copyInto(*
this,
Addr);
5759 assert(NumIRArgs == 1);
5760 if (I->isAggregate()) {
5770 ? I->getKnownLValue().getAddress()
5771 : I->getKnownRValue().getAggregateAddress();
5773 const llvm::DataLayout *TD = &
CGM.getDataLayout();
5775 assert((FirstIRArg >= IRFuncTy->getNumParams() ||
5776 IRFuncTy->getParamType(FirstIRArg)->getPointerAddressSpace() ==
5777 TD->getAllocaAddrSpace()) &&
5778 "indirect argument must be in alloca address space");
5780 bool NeedCopy =
false;
5781 if (
Addr.getAlignment() < Align &&
5782 llvm::getOrEnforceKnownAlignment(
Addr.emitRawPointer(*
this),
5786 }
else if (I->hasLValue()) {
5787 auto LV = I->getKnownLValue();
5792 if (!isByValOrRef ||
5793 (LV.getAlignment() <
getContext().getTypeAlignInChars(I->Ty))) {
5797 if (isByValOrRef &&
Addr.getType()->getAddressSpace() !=
5806 auto *T = llvm::PointerType::get(
CGM.getLLVMContext(),
5814 if (ArgHasMaybeUndefAttr)
5815 Val =
Builder.CreateFreeze(Val);
5816 IRCallArgs[FirstIRArg] = Val;
5819 }
else if (I->getType()->isArrayParameterType()) {
5825 IRCallArgs[FirstIRArg] = I->getKnownRValue().getScalarVal();
5834 if (ArgHasMaybeUndefAttr)
5835 Val =
Builder.CreateFreeze(Val);
5836 IRCallArgs[FirstIRArg] = Val;
5841 CallLifetimeEndAfterCall.emplace_back(AI);
5844 I->copyInto(*
this, AI);
5849 assert(NumIRArgs == 0);
5857 assert(NumIRArgs == 1);
5859 if (!I->isAggregate())
5860 V = I->getKnownRValue().getScalarVal();
5863 I->hasLValue() ? I->getKnownLValue().getAddress()
5864 : I->getKnownRValue().getAggregateAddress());
5870 assert(!swiftErrorTemp.
isValid() &&
"multiple swifterror args");
5874 V, pointeeTy,
getContext().getTypeAlignInChars(pointeeTy));
5881 llvm::Value *errorValue =
Builder.CreateLoad(swiftErrorArg);
5882 Builder.CreateStore(errorValue, swiftErrorTemp);
5887 V->getType()->isIntegerTy())
5894 if (FirstIRArg < IRFuncTy->getNumParams() &&
5895 V->getType() != IRFuncTy->getParamType(FirstIRArg)) {
5896 assert(
V->getType()->isPointerTy() &&
"Only pointers can mismatch!");
5900 if (ArgHasMaybeUndefAttr)
5902 IRCallArgs[FirstIRArg] =
V;
5906 llvm::StructType *STy =
5911 if (!I->isAggregate()) {
5913 I->copyInto(*
this, Src);
5915 Src = I->hasLValue() ? I->getKnownLValue().getAddress()
5916 : I->getKnownRValue().getAggregateAddress();
5926 llvm::TypeSize SrcTypeSize =
5927 CGM.getDataLayout().getTypeAllocSize(SrcTy);
5928 llvm::TypeSize DstTypeSize =
CGM.getDataLayout().getTypeAllocSize(STy);
5929 if (SrcTypeSize.isScalable()) {
5930 assert(STy->containsHomogeneousScalableVectorTypes() &&
5931 "ABI only supports structure with homogeneous scalable vector "
5933 assert(SrcTypeSize == DstTypeSize &&
5934 "Only allow non-fractional movement of structure with "
5935 "homogeneous scalable vector type");
5936 assert(NumIRArgs == STy->getNumElements());
5938 llvm::Value *StoredStructValue =
5940 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
5941 llvm::Value *Extract =
Builder.CreateExtractValue(
5942 StoredStructValue, i, Src.
getName() +
".extract" + Twine(i));
5943 IRCallArgs[FirstIRArg + i] = Extract;
5946 uint64_t SrcSize = SrcTypeSize.getFixedValue();
5947 uint64_t DstSize = DstTypeSize.getFixedValue();
5948 bool HasPFPFields =
getContext().hasPFPFields(I->Ty);
5954 if (HasPFPFields || SrcSize < DstSize) {
5965 Builder.CreateMemCpy(TempAlloca, Src, SrcSize);
5971 assert(NumIRArgs == STy->getNumElements());
5972 for (
unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
5974 llvm::Value *LI =
Builder.CreateLoad(EltPtr);
5975 if (ArgHasMaybeUndefAttr)
5976 LI =
Builder.CreateFreeze(LI);
5977 IRCallArgs[FirstIRArg + i] = LI;
5982 assert(NumIRArgs == 1);
5990 auto *ATy = dyn_cast<llvm::ArrayType>(Load->getType());
5995 if (ArgHasMaybeUndefAttr)
5996 Load =
Builder.CreateFreeze(Load);
5997 IRCallArgs[FirstIRArg] = Load;
6005 auto layout =
CGM.getDataLayout().getStructLayout(coercionType);
6007 auto *unpaddedStruct = dyn_cast<llvm::StructType>(unpaddedCoercionType);
6011 bool NeedLifetimeEnd =
false;
6012 if (I->isAggregate()) {
6013 addr = I->hasLValue() ? I->getKnownLValue().getAddress()
6014 : I->getKnownRValue().getAggregateAddress();
6017 RValue RV = I->getKnownRValue();
6021 auto scalarAlign =
CGM.getDataLayout().getPrefTypeAlign(scalarType);
6026 layout->getAlignment(), scalarAlign)),
6028 nullptr, &AllocaAddr);
6036 unsigned IRArgPos = FirstIRArg;
6037 unsigned unpaddedIndex = 0;
6038 for (
unsigned i = 0, e = coercionType->getNumElements(); i != e; ++i) {
6039 llvm::Type *eltType = coercionType->getElementType(i);
6046 : unpaddedCoercionType,
6048 if (ArgHasMaybeUndefAttr)
6049 elt =
Builder.CreateFreeze(elt);
6050 IRCallArgs[IRArgPos++] = elt;
6052 assert(IRArgPos == FirstIRArg + NumIRArgs);
6054 if (NeedLifetimeEnd)
6060 unsigned IRArgPos = FirstIRArg;
6061 ExpandTypeToArgs(I->Ty, *I, IRFuncTy, IRCallArgs, IRArgPos);
6062 assert(IRArgPos == FirstIRArg + NumIRArgs);
6068 if (!I->isAggregate()) {
6070 I->copyInto(*
this, Src);
6072 Src = I->hasLValue() ? I->getKnownLValue().getAddress()
6073 : I->getKnownRValue().getAggregateAddress();
6079 CGM.getABIInfo().createCoercedLoad(Src, ArgInfo, *
this);
6080 IRCallArgs[FirstIRArg] = Load;
6086 const CGCallee &ConcreteCallee = Callee.prepareConcreteCallee(*
this);
6092 assert(IRFunctionArgs.hasInallocaArg());
6093 IRCallArgs[IRFunctionArgs.getInallocaArgNo()] = Arg;
6104 auto simplifyVariadicCallee = [](llvm::FunctionType *CalleeFT,
6105 llvm::Value *Ptr) -> llvm::Function * {
6106 if (!CalleeFT->isVarArg())
6110 if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(Ptr)) {
6111 if (CE->getOpcode() == llvm::Instruction::BitCast)
6112 Ptr = CE->getOperand(0);
6115 llvm::Function *OrigFn = dyn_cast<llvm::Function>(Ptr);
6119 llvm::FunctionType *OrigFT = OrigFn->getFunctionType();
6123 if (OrigFT->isVarArg() ||
6124 OrigFT->getNumParams() != CalleeFT->getNumParams() ||
6125 OrigFT->getReturnType() != CalleeFT->getReturnType())
6128 for (
unsigned i = 0, e = OrigFT->getNumParams(); i != e; ++i)
6129 if (OrigFT->getParamType(i) != CalleeFT->getParamType(i))
6135 if (llvm::Function *OrigFn = simplifyVariadicCallee(IRFuncTy, CalleePtr)) {
6137 IRFuncTy = OrigFn->getFunctionType();
6148 for (
unsigned i = 0; i < IRCallArgs.size(); ++i)
6149 LargestVectorWidth = std::max(LargestVectorWidth,
6154 llvm::AttributeList Attrs;
6155 CGM.ConstructAttributeList(CalleePtr->getName(), CallInfo,
6160 if (
CallingConv == llvm::CallingConv::X86_VectorCall &&
6162 CGM.Error(Loc,
"__vectorcall calling convention is not currently "
6167 if (FD->hasAttr<StrictFPAttr>())
6169 Attrs = Attrs.addFnAttribute(
getLLVMContext(), llvm::Attribute::StrictFP);
6174 if (FD->hasAttr<OptimizeNoneAttr>() &&
getLangOpts().FastMath)
6175 CGM.AdjustMemoryAttribute(CalleePtr->getName(), Callee.getAbstractInfo(),
6180 Attrs = Attrs.addFnAttribute(
getLLVMContext(), llvm::Attribute::NoMerge);
6184 Attrs = Attrs.addFnAttribute(
getLLVMContext(), llvm::Attribute::NoInline);
6189 !
CGM.getTargetCodeGenInfo().wouldInliningViolateFunctionCallABI(
6190 CallerDecl, CalleeDecl))
6192 Attrs.addFnAttribute(
getLLVMContext(), llvm::Attribute::AlwaysInline);
6197 Attrs.removeFnAttribute(
getLLVMContext(), llvm::Attribute::Convergent);
6206 !(TargetDecl && TargetDecl->
hasAttr<NoInlineAttr>()) &&
6207 !
CGM.getTargetCodeGenInfo().wouldInliningViolateFunctionCallABI(
6208 CallerDecl, CalleeDecl)) {
6210 Attrs.addFnAttribute(
getLLVMContext(), llvm::Attribute::AlwaysInline);
6215 Attrs = Attrs.addFnAttribute(
getLLVMContext(), llvm::Attribute::NoInline);
6222 CannotThrow =
false;
6231 CannotThrow = Attrs.hasFnAttr(llvm::Attribute::NoUnwind);
6233 if (
auto *FPtr = dyn_cast<llvm::Function>(CalleePtr))
6234 if (FPtr->hasFnAttribute(llvm::Attribute::NoUnwind))
6245 if (NeedSRetLifetimeEnd)
6253 if (
SanOpts.has(SanitizerKind::KCFI) &&
6254 !isa_and_nonnull<FunctionDecl>(TargetDecl))
6261 if (FD->hasAttr<StrictFPAttr>())
6263 Attrs = Attrs.addFnAttribute(
getLLVMContext(), llvm::Attribute::StrictFP);
6265 AssumeAlignedAttrEmitter AssumeAlignedAttrEmitter(*
this, TargetDecl);
6266 Attrs = AssumeAlignedAttrEmitter.TryEmitAsCallSiteAttribute(Attrs);
6268 AllocAlignAttrEmitter AllocAlignAttrEmitter(*
this, TargetDecl, CallArgs);
6269 Attrs = AllocAlignAttrEmitter.TryEmitAsCallSiteAttribute(Attrs);
6274 CI =
Builder.CreateCall(IRFuncTy, CalleePtr, IRCallArgs, BundleList);
6277 CI =
Builder.CreateInvoke(IRFuncTy, CalleePtr, Cont, InvokeDest, IRCallArgs,
6281 if (CI->getCalledFunction() && CI->getCalledFunction()->hasName() &&
6282 CI->getCalledFunction()->getName().starts_with(
"_Z4sqrt")) {
6287 if (
CGM.getCodeGenOpts().CallGraphSection) {
6291 else if (
const auto *FPT =
6292 Callee.getAbstractInfo().getCalleeFunctionProtoType())
6296 "Cannot find the callee type to generate callee_type metadata.");
6300 CGM.createCalleeTypeMetadataForIcall(CST, *callOrInvoke);
6307 if (
const auto *FD = dyn_cast_or_null<FunctionDecl>(
CurFuncDecl)) {
6308 if (
const auto *A = FD->getAttr<CFGuardAttr>()) {
6309 if (A->getGuard() == CFGuardAttr::GuardArg::nocf &&
6310 !CI->getCalledFunction())
6316 CI->setAttributes(Attrs);
6317 CI->setCallingConv(
static_cast<llvm::CallingConv::ID
>(
CallingConv));
6321 if (!CI->getType()->isVoidTy())
6322 CI->setName(
"call");
6324 if (
CGM.shouldEmitConvergenceTokens() && CI->isConvergent())
6325 CI = addConvergenceControlToken(CI);
6328 LargestVectorWidth =
6334 if (!CI->getCalledFunction())
6335 PGO->valueProfile(
Builder, llvm::IPVK_IndirectCallTarget, CI, CalleePtr);
6339 if (
CGM.getLangOpts().ObjCAutoRefCount)
6340 AddObjCARCExceptionMetadata(CI);
6343 bool IsPPC =
getTarget().getTriple().isPPC();
6344 bool IsMIPS =
getTarget().getTriple().isMIPS();
6345 bool HasMips16 =
false;
6348 HasMips16 = TargetOpts.
FeatureMap.lookup(
"mips16");
6350 HasMips16 = llvm::is_contained(TargetOpts.
Features,
"+mips16");
6352 if (llvm::CallInst *
Call = dyn_cast<llvm::CallInst>(CI)) {
6353 if (TargetDecl && TargetDecl->
hasAttr<NotTailCalledAttr>())
6354 Call->setTailCallKind(llvm::CallInst::TCK_NoTail);
6355 else if (IsMustTail) {
6358 CGM.getDiags().Report(Loc, diag::err_aix_musttail_unsupported);
6361 CGM.getDiags().Report(Loc, diag::err_ppc_impossible_musttail) << 0;
6362 else if (
Call->isIndirectCall())
6363 CGM.getDiags().Report(Loc, diag::err_ppc_impossible_musttail) << 1;
6364 else if (isa_and_nonnull<FunctionDecl>(TargetDecl)) {
6369 CGM.addUndefinedGlobalForTailCall(
6372 llvm::GlobalValue::LinkageTypes
Linkage =
CGM.getFunctionLinkage(
6374 if (llvm::GlobalValue::isWeakForLinker(
Linkage) ||
6375 llvm::GlobalValue::isDiscardableIfUnused(
Linkage))
6376 CGM.getDiags().Report(Loc, diag::err_ppc_impossible_musttail)
6384 CGM.getDiags().Report(Loc, diag::err_mips_impossible_musttail) << 0;
6385 else if (
const auto *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl))
6386 CGM.addUndefinedGlobalForTailCall({FD, Loc});
6388 Call->setTailCallKind(llvm::CallInst::TCK_MustTail);
6402 bool NeedSrcLoc = TargetDecl->
hasAttr<ErrorAttr>();
6403 if (!NeedSrcLoc &&
CGM.getCodeGenOpts().ShowInliningChain) {
6404 if (
const auto *FD = dyn_cast<FunctionDecl>(TargetDecl))
6405 NeedSrcLoc = FD->isInlined() || FD->hasAttr<AlwaysInlineAttr>() ||
6407 FD->isInAnonymousNamespace();
6411 auto *MD = llvm::ConstantAsMetadata::get(
Line);
6412 CI->setMetadata(
"srcloc", llvm::MDNode::get(
getLLVMContext(), {MD}));
6421 if (CI->doesNotReturn()) {
6422 if (NeedSRetLifetimeEnd)
6426 if (
SanOpts.has(SanitizerKind::Unreachable)) {
6429 if (
auto *F = CI->getCalledFunction())
6430 F->removeFnAttr(llvm::Attribute::NoReturn);
6431 CI->removeFnAttr(llvm::Attribute::NoReturn);
6435 if (
SanOpts.hasOneOf(SanitizerKind::Address |
6436 SanitizerKind::KernelAddress)) {
6438 llvm::IRBuilder<>::InsertPointGuard IPGuard(
Builder);
6440 auto *FnType = llvm::FunctionType::get(
CGM.VoidTy,
false);
6441 llvm::FunctionCallee Fn =
6442 CGM.CreateRuntimeFunction(FnType,
"__asan_handle_no_return");
6448 Builder.ClearInsertionPoint();
6470 if (CI->doesNotThrow())
6473 diag::err_musttail_noexcept_mismatch);
6479 if (Cleanup && Cleanup->isFakeUse()) {
6480 CGBuilderTy::InsertPointGuard IPG(
Builder);
6482 Cleanup->getCleanup()->Emit(*
this, EHScopeStack::Cleanup::Flags());
6483 }
else if (!(Cleanup &&
6484 Cleanup->getCleanup()->isRedundantBeforeReturn())) {
6485 CGM.ErrorUnsupported(
MustTailCall,
"tail call skipping over cleanups");
6488 if (CI->getType()->isVoidTy())
6492 Builder.ClearInsertionPoint();
6498 if (swiftErrorTemp.
isValid()) {
6499 llvm::Value *errorResult =
Builder.CreateLoad(swiftErrorTemp);
6500 Builder.CreateStore(errorResult, swiftErrorArg);
6517 if (IsVirtualFunctionPointerThunk) {
6530 unsigned unpaddedIndex = 0;
6531 for (
unsigned i = 0, e = coercionType->getNumElements(); i != e; ++i) {
6532 llvm::Type *eltType = coercionType->getElementType(i);
6536 llvm::Value *elt = CI;
6537 if (requiresExtract)
6538 elt =
Builder.CreateExtractValue(elt, unpaddedIndex++);
6540 assert(unpaddedIndex == 0);
6541 Builder.CreateStore(elt, eltAddr);
6549 if (NeedSRetLifetimeEnd)
6566 llvm::Value *Real =
Builder.CreateExtractValue(CI, 0);
6567 llvm::Value *Imag =
Builder.CreateExtractValue(CI, 1);
6575 llvm::Value *
V = CI;
6576 if (
V->getType() != RetIRTy)
6586 if (
auto *FixedDstTy = dyn_cast<llvm::FixedVectorType>(RetIRTy)) {
6587 llvm::Value *
V = CI;
6588 if (
auto *ScalableSrcTy =
6589 dyn_cast<llvm::ScalableVectorType>(
V->getType())) {
6590 if (FixedDstTy->getElementType() ==
6591 ScalableSrcTy->getElementType()) {
6592 V =
Builder.CreateExtractVector(FixedDstTy,
V, uint64_t(0),
6602 getContext().getTypeInfoDataSizeInChars(RetTy).Width.getQuantity();
6606 DestIsVolatile =
false;
6607 DestSize =
getContext().getTypeSizeInChars(RetTy).getQuantity();
6617 CI, RetTy, StorePtr,
6631 DestIsVolatile =
false;
6633 CGM.getABIInfo().createCoercedStore(CI, StorePtr, RetAI, DestIsVolatile,
6640 llvm_unreachable(
"Invalid ABI kind for return argument");
6643 llvm_unreachable(
"Unhandled ABIArgInfo::Kind");
6648 if (Ret.isScalar() && TargetDecl) {
6649 AssumeAlignedAttrEmitter.EmitAsAnAssumption(Loc, RetTy, Ret);
6650 AllocAlignAttrEmitter.EmitAsAnAssumption(Loc, RetTy, Ret);
6668 if (CalleeDecl && !CalleeDecl->
hasAttr<NoDebugAttr>() &&
6669 DI->getCallSiteRelatedAttrs() != llvm::DINode::FlagZero) {
6670 CodeGenFunction CalleeCGF(
CGM);
6672 Callee.getAbstractInfo().getCalleeDecl();
6673 CalleeCGF.
CurGD = CalleeGlobalDecl;
6676 DI->EmitFuncDeclForCallSite(
6677 CI, DI->getFunctionType(CalleeDecl, ResTy, Args), CalleeGlobalDecl);
6680 DI->addCallTargetIfVirtual(CalleeDecl, CI);
6706 if (
VE->isMicrosoftABI())
6707 return CGM.getABIInfo().EmitMSVAArg(*
this, VAListAddr, Ty, Slot);
6708 return CGM.getABIInfo().EmitVAArg(*
this, VAListAddr, Ty, Slot);
6713 CGF.disableDebugInfo();
6717 CGF.enableDebugInfo();
static ExtParameterInfoList getExtParameterInfosForCall(const FunctionProtoType *proto, unsigned prefixArgs, unsigned totalArgs)
static bool isInAllocaArgument(CGCXXABI &ABI, QualType type)
static uint64_t buildMultiCharMask(const SmallVectorImpl< uint64_t > &Bits, int Pos, int Size, int CharWidth, bool BigEndian)
static llvm::Value * tryRemoveRetainOfSelf(CodeGenFunction &CGF, llvm::Value *result)
If this is a +1 of the value of an immutable 'self', remove it.
static CanQualType GetReturnType(QualType RetTy)
Returns the "extra-canonicalized" return type, which discards qualifiers on the return type.
static const NonNullAttr * getNonNullAttr(const Decl *FD, const ParmVarDecl *PVD, QualType ArgType, unsigned ArgNo)
Returns the attribute (either parameter attribute, or function attribute), which declares argument Ar...
static CanQualTypeList getArgTypesForCall(ASTContext &ctx, const CallArgList &args)
static Address emitAddressAtOffset(CodeGenFunction &CGF, Address addr, const ABIArgInfo &info)
static const char * abiKindToString(ABIArgInfo::Kind K)
static AggValueSlot createPlaceholderSlot(CodeGenFunction &CGF, QualType Ty)
static CallingConv getCallingConventionForDecl(const ObjCMethodDecl *D, bool IsTargetDefaultMSABI)
static void setBitRange(SmallVectorImpl< uint64_t > &Bits, int BitOffset, int BitWidth, int CharWidth)
static bool isProvablyNull(llvm::Value *addr)
static void AddAttributesFromFunctionProtoType(ASTContext &Ctx, llvm::AttrBuilder &FuncAttrs, const FunctionProtoType *FPT)
static void eraseUnusedBitCasts(llvm::Instruction *insn)
static bool isObjCMethodWithTypeParams(const ObjCMethodDecl *method)
static void emitWritebackArg(CodeGenFunction &CGF, CallArgList &args, const ObjCIndirectCopyRestoreExpr *CRE)
Emit an argument that's being passed call-by-writeback.
static void overrideFunctionFeaturesWithTargetFeatures(llvm::AttrBuilder &FuncAttr, const llvm::Function &F, const TargetOptions &TargetOpts)
Merges target-features from \TargetOpts and \F, and sets the result in \FuncAttr.
static llvm::Value * CreatePFPCoercedLoad(Address Src, QualType SrcFETy, llvm::Type *Ty, CodeGenFunction &CGF)
static int getExpansionSize(QualType Ty, const ASTContext &Context)
static CanQual< FunctionProtoType > GetFormalType(const CXXMethodDecl *MD)
Returns the canonical formal type of the given C++ method.
static bool DetermineNoUndef(QualType QTy, CodeGenTypes &Types, const llvm::DataLayout &DL, const ABIArgInfo &AI, bool CheckCoerce=true)
static const Expr * maybeGetUnaryAddrOfOperand(const Expr *E)
static void deactivateArgCleanupsBeforeCall(CodeGenFunction &CGF, const CallArgList &CallArgs)
static bool isProvablyNonNull(Address Addr, CodeGenFunction &CGF)
static llvm::Value * emitArgumentDemotion(CodeGenFunction &CGF, const VarDecl *var, llvm::Value *value)
An argument came in as a promoted argument; demote it back to its declared type.
SmallVector< CanQualType, 16 > CanQualTypeList
static std::pair< llvm::Value *, bool > CoerceScalableToFixed(CodeGenFunction &CGF, llvm::FixedVectorType *ToTy, llvm::ScalableVectorType *FromTy, llvm::Value *V, StringRef Name="")
static const CGFunctionInfo & arrangeLLVMFunctionInfo(CodeGenTypes &CGT, bool instanceMethod, SmallVectorImpl< CanQualType > &prefix, CanQual< FunctionProtoType > FTP)
Arrange the LLVM function layout for a value of the given function type, on top of any implicit param...
static llvm::Value * CreateCoercedLoad(Address Src, QualType SrcFETy, llvm::Type *Ty, CodeGenFunction &CGF)
CreateCoercedLoad - Create a load from.
static void addExtParameterInfosForCall(llvm::SmallVectorImpl< FunctionProtoType::ExtParameterInfo > ¶mInfos, const FunctionProtoType *proto, unsigned prefixArgs, unsigned totalArgs)
static bool canApplyNoFPClass(const ABIArgInfo &AI, QualType ParamType, bool IsReturn)
Test if it's legal to apply nofpclass for the given parameter type and it's lowered IR type.
static void getTrivialDefaultFunctionAttributes(StringRef Name, bool HasOptnone, const CodeGenOptions &CodeGenOpts, const LangOptions &LangOpts, bool AttrOnCallSite, llvm::AttrBuilder &FuncAttrs)
static void forConstantArrayExpansion(CodeGenFunction &CGF, ConstantArrayExpansion *CAE, Address BaseAddr, llvm::function_ref< void(Address)> Fn)
static bool IsArgumentMaybeUndef(const Decl *TargetDecl, unsigned NumRequiredArgs, unsigned ArgNo)
Check if the argument of a function has maybe_undef attribute.
static bool hasInAllocaArgs(CodeGenModule &CGM, CallingConv ExplicitCC, ArrayRef< QualType > ArgTypes)
static std::unique_ptr< TypeExpansion > getTypeExpansion(QualType Ty, const ASTContext &Context)
SmallVector< FunctionProtoType::ExtParameterInfo, 16 > ExtParameterInfoList
static RawAddress CreateTempAllocaForCoercion(CodeGenFunction &CGF, llvm::Type *Ty, CharUnits MinAlign, const Twine &Name="tmp")
Create a temporary allocation for the purposes of coercion.
static void setUsedBits(CodeGenModule &, QualType, int, SmallVectorImpl< uint64_t > &)
static llvm::StoreInst * findDominatingStoreToReturnValue(CodeGenFunction &CGF)
Heuristically search for a dominating store to the return-value slot.
static void setCUDAKernelCallingConvention(CanQualType &FTy, CodeGenModule &CGM, const FunctionDecl *FD)
Set calling convention for CUDA/HIP kernel.
static llvm::Value * tryEmitFusedAutoreleaseOfResult(CodeGenFunction &CGF, llvm::Value *result)
Try to emit a fused autorelease of a return result.
static Address EnterStructPointerForCoercedAccess(Address SrcPtr, llvm::StructType *SrcSTy, uint64_t DstSize, CodeGenFunction &CGF)
EnterStructPointerForCoercedAccess - Given a struct pointer that we are accessing some number of byte...
static llvm::Value * emitAutoreleaseOfResult(CodeGenFunction &CGF, llvm::Value *result)
Emit an ARC autorelease of the result of a function.
static void emitWriteback(CodeGenFunction &CGF, const CallArgList::Writeback &writeback)
Emit the actual writing-back of a writeback.
static bool HasStrictReturn(const CodeGenModule &Module, QualType RetTy, const Decl *TargetDecl)
static CanQualTypeList getArgTypesForDeclaration(ASTContext &ctx, const FunctionArgList &args)
static void addMergableDefaultFunctionAttributes(const CodeGenOptions &CodeGenOpts, llvm::AttrBuilder &FuncAttrs)
Add default attributes to a function, which have merge semantics under -mlink-builtin-bitcode and sho...
static bool CreatePFPCoercedStore(llvm::Value *Src, QualType SrcFETy, Address Dst, CodeGenFunction &CGF)
static llvm::Value * CoerceIntOrPtrToIntOrPtr(llvm::Value *Val, llvm::Type *Ty, CodeGenFunction &CGF)
CoerceIntOrPtrToIntOrPtr - Convert a value Val to the specific Ty where both are either integers or p...
static void AddAttributesFromOMPAssumes(llvm::AttrBuilder &FuncAttrs, const Decl *Callee)
static unsigned getMaxVectorWidth(const llvm::Type *Ty)
CodeGenFunction::ComplexPairTy ComplexPairTy
static void addNoBuiltinAttributes(mlir::MLIRContext &ctx, mlir::NamedAttrList &attrs, const LangOptions &langOpts, const NoBuiltinAttr *nba=nullptr)
static void addDenormalModeAttrs(llvm::DenormalMode fpDenormalMode, llvm::DenormalMode fp32DenormalMode, mlir::NamedAttrList &attrs)
Add denormal-fp-math and denormal-fp-math-f32 as appropriate for the requested denormal behavior,...
static unsigned getNoFPClassTestMask(const LangOptions &langOpts)
Compute the nofpclass mask for FP types based on language options.
static void appendParameterTypes(const CIRGenTypes &cgt, SmallVectorImpl< CanQualType > &prefix, CanQual< FunctionProtoType > fpt)
Adds the formal parameters in FPT to the given prefix.
static const CIRGenFunctionInfo & arrangeFreeFunctionLikeCall(CIRGenTypes &cgt, CIRGenModule &cgm, const CallArgList &args, const FunctionType *fnType)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Result
Implement __builtin_bit_cast and related operations.
#define CC_VLS_CASE(ABI_VLEN)
static bool hasFeature(StringRef Feature, const LangOptions &LangOpts, const TargetInfo &Target)
Determine whether a translation unit built using the current language options has the given feature.
static StringRef getTriple(const Command &Job)
Maps Clang QualType instances to corresponding LLVM ABI type representations.
static QualType getPointeeType(const MemRegion *R)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
CanQualType getCanonicalParamType(QualType T) const
Return the canonical parameter type corresponding to the specific potentially non-canonical one.
CanQualType getCanonicalSizeType() const
const TargetInfo & getTargetInfo() const
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
std::vector< PFPField > findPFPFields(QualType Ty) const
Returns a list of PFP fields for the given type, including subfields in bases or other fields,...
uint64_t getCharWidth() const
Return the size of the character type, in bits.
ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...
uint64_t getFieldOffset(unsigned FieldNo) const
getFieldOffset - Get the offset of the given field index, in bits.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Attr - This represents one attribute.
This class is used for builtin types like 'int'.
QualType getType() const
Retrieves the type of the base class.
Represents a C++ constructor within a class.
Represents a C++ destructor within a class.
Represents a static or instance method of a struct/union/class.
bool isImplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An implicit object member function is a non-static member function without an exp...
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Qualifiers getMethodQualifiers() const
Represents a C++ struct/union/class.
CXXDestructorDecl * getDestructor() const
Returns the destructor decl for this class.
unsigned getNumVBases() const
Retrieves the number of virtual base classes of this class.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
SourceLocation getBeginLoc() const
ConstExprIterator const_arg_iterator
Represents a canonical, potentially-qualified type.
static CanQual< Type > CreateUnsafe(QualType Other)
CanProxy< U > castAs() const
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
CanProxy< U > getAs() const
Retrieve a canonical type pointer with a different static type, upcasting or downcasting as needed.
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
CharUnits - This is an opaque type for sizes expressed in character units.
bool isZero() const
isZero - Test whether the quantity equals zero.
llvm::Align getAsAlign() const
getAsAlign - Returns Quantity as a valid llvm::Align, Beware llvm::Align assumes power of two 8-bit b...
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
static CharUnits Zero()
Zero - Construct a CharUnits quantity of zero.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
llvm::DenormalMode FPDenormalMode
The floating-point denormal mode to use.
static StringRef getFramePointerKindName(FramePointerKind Kind)
std::vector< std::string > Reciprocals
llvm::DenormalMode FP32DenormalMode
The floating-point denormal mode to use, for float.
std::string TrapFuncName
If not an empty string, trap intrinsics are lowered to calls to this function instead of to trap inst...
std::vector< std::string > DefaultFunctionAttrs
std::string PreferVectorWidth
The preferred width for auto-vectorization transforms.
ABIArgInfo - Helper class to encapsulate information about how a specific C type should be passed to ...
unsigned getInAllocaFieldIndex() const
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 getIndirect(CharUnits Alignment, unsigned AddrSpace, bool ByVal=true, bool Realign=false, llvm::Type *Padding=nullptr)
ArrayRef< llvm::Type * > getCoerceAndExpandTypeSequence() const
bool isCoerceAndExpand() const
static ABIArgInfo getZeroExtend(QualType Ty, llvm::Type *T=nullptr)
static ABIArgInfo getExtend(QualType Ty, llvm::Type *T=nullptr)
unsigned getInAllocaIndirect() const
llvm::Type * getCoerceToType() const
bool isIndirectAliased() const
bool isSRetAfterThis() const
bool canHaveCoerceToType() const
static ABIArgInfo getSignExtend(QualType Ty, llvm::Type *T=nullptr)
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
const ArgInfo * const_arg_iterator
static CGFunctionInfo * create(unsigned llvmCC, bool instanceMethod, bool chainCall, bool delegateCall, const FunctionType::ExtInfo &extInfo, ArrayRef< ExtParameterInfo > paramInfos, CanQualType resultType, ArrayRef< CanQualType > argTypes, RequiredArgs required)
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 ...
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)
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 & 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...
llvm::Type * ConvertType(QualType T)
ConvertType - Convert type T into a llvm::Type.
CGCXXABI & getCXXABI() const
const CGFunctionInfo & arrangeCXXMethodDeclaration(const CXXMethodDecl *MD)
C++ methods have some special rules and also have implicit parameters.
ASTContext & getContext() const
const CGFunctionInfo & arrangeLLVMFunctionInfo(CanQualType returnType, FnInfoOpts opts, ArrayRef< CanQualType > argTypes, FunctionType::ExtInfo info, ArrayRef< FunctionProtoType::ExtParameterInfo > paramInfos, RequiredArgs args)
"Arrange" the LLVM information for a call or type with the given signature.
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 & arrangeCXXMethodCall(const CallArgList &args, const FunctionProtoType *type, RequiredArgs required, unsigned numPrefixArgs)
Arrange a call to a C++ method, passing the given arguments.
const CGFunctionInfo & arrangeFreeFunctionCall(const CallArgList &Args, const FunctionType *Ty, bool ChainCall)
Figure out the rules for calling a function with the given formal type using the given arguments.
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 & arrangeCXXConstructorCall(const CallArgList &Args, const CXXConstructorDecl *D, CXXCtorType CtorKind, unsigned ExtraPrefixArgs, unsigned ExtraSuffixArgs, bool PassProtoArgs=true)
Arrange a call to a C++ method, passing 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 & arrangeCall(const CGFunctionInfo &declFI, const CallArgList &args)
Given a function info for a declaration, return the function info for a call with the given arguments...
const CGFunctionInfo & arrangeNullaryFunction()
A nullary function is a freestanding function of type 'void ()'.
A cleanup scope which generates the cleanup blocks lazily.
A saved depth on the scope stack.
FunctionArgList - Type for representing both the decl and type of parameters to a function.
LValue - This represents an lvalue references.
static LValue MakeAddr(Address Addr, QualType type, ASTContext &Context, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo)
Address getAddress() const
RValue - This trivial value class is used to represent the result of an expression that is evaluated.
static RValue get(llvm::Value *V)
static RValue getAggregate(Address addr, bool isVolatile=false)
Convert an Address to an RValue.
static RValue getComplex(llvm::Value *V1, llvm::Value *V2)
Address getAggregateAddress() const
getAggregateAddr() - Return the Value* of the address of the aggregate.
llvm::Value * getScalarVal() const
getScalarVal() - Return the Value* of this scalar value.
std::pair< llvm::Value *, llvm::Value * > getComplexVal() const
getComplexVal - Return the real/imag components of this complex value.
An abstract representation of an aligned address.
CharUnits getAlignment() const
Return the alignment of this pointer.
llvm::Value * getPointer() const
static RawAddress invalid()
A class for recording the number of arguments that a function signature requires.
bool allowsOptionalArgs() const
unsigned getNumRequiredArgs() const
static RequiredArgs forPrototypePlus(const FunctionProtoType *prototype, unsigned additional)
Compute the arguments required by the given formal prototype, given that there may be some additional...
ReturnValueSlot - Contains the address where the return value of a function can be stored,...
virtual void setCUDAKernelCallingConvention(const FunctionType *&FT) const
static void initPointerAuthFnAttributes(const PointerAuthOptions &Opts, llvm::AttrBuilder &FuncAttrs)
static void initBranchProtectionFnAttributes(const TargetInfo::BranchProtectionInfo &BPI, llvm::AttrBuilder &FuncAttrs)
virtual bool isNoProtoCallVariadic(const CodeGen::CallArgList &args, const FunctionNoProtoType *fnType) const
Determine whether a call to an unprototyped functions under the given calling convention should use t...
Complex values, per C99 6.2.5p11.
Represents the canonical version of C arrays with a specified constant size.
bool constructsVirtualBase() const
Returns true if the constructed base class is a virtual base class subobject of this declaration's cl...
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Decl - This represents one declaration (or definition), e.g.
const FunctionType * getFunctionType(bool BlocksToo=true) const
Looks through the Decl's underlying type to extract a FunctionType when possible.
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
DeclContext * getDeclContext()
SourceLocation getBeginLoc() const LLVM_READONLY
This represents one expression.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
@ NPC_ValueDependentIsNotNull
Specifies that a value-dependent expression should be considered to never be a null pointer constant.
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
Represents a member of a struct/union/class.
bool isBitField() const
Determines whether this field is a bitfield.
bool isUnnamedBitField() const
Determines whether this is an unnamed bitfield.
bool isZeroLengthBitField() const
Is this a zero-length bit-field?
Represents a function declaration or definition.
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
Represents a prototype with parameter type info, e.g.
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
unsigned getNumParams() const
unsigned getAArch64SMEAttributes() const
Return a bitmask describing the SME attributes on the function type, see AArch64SMETypeAttributes for...
bool isNothrow(bool ResultIfDependent=false) const
Determine whether this function type has a non-throwing exception specification.
ArrayRef< ExtParameterInfo > getExtParameterInfos() const
bool hasExtParameterInfos() const
Is there any interesting extra information for any of the parameters of this function type?
Wrapper for source info for functions.
A class which abstracts out some details necessary for making a call.
ExtInfo withCallingConv(CallingConv cc) const
CallingConv getCC() const
ExtInfo withProducesResult(bool producesResult) const
bool getCmseNSCall() const
bool getNoCfCheck() const
unsigned getRegParm() const
bool getNoCallerSavedRegs() const
bool getHasRegParm() const
bool getProducesResult() const
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
ParameterABI getABI() const
Return the ABI treatment of this parameter.
ExtParameterInfo withIsNoEscape(bool NoEscape) const
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
@ SME_PStateSMEnabledMask
@ SME_PStateSMCompatibleMask
@ SME_AgnosticZAStateMask
static ArmStateValue getArmZT0State(unsigned AttrBits)
static ArmStateValue getArmZAState(unsigned AttrBits)
QualType getReturnType() const
GlobalDecl - represents a global declaration.
CXXCtorType getCtorType() const
KernelReferenceKind getKernelReferenceKind() const
CXXDtorType getDtorType() const
const Decl * getDecl() const
This class represents temporary values used to represent inout and out arguments in HLSL.
Description of a constructor that was inherited from a base class.
ConstructorUsingShadowDecl * getShadowDecl() const
@ FPE_Ignore
Assume that floating-point exceptions are masked.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
std::vector< std::string > NoBuiltinFuncs
A list of all -fno-builtin-* function names (e.g., memset).
FPExceptionModeKind getDefaultExceptionMode() const
bool isNoBuiltinFunc(StringRef Name) const
Is this a libc/libm function that is no longer recognized as a builtin because a -fno-builtin-* optio...
bool assumeFunctionsAreConvergent() const
Represents a point when the lifetime of an automatic object ends.
Represents a matrix type, as defined in the Matrix Types clang extensions.
Describes a module or submodule.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
ObjCCategoryDecl - Represents a category declaration.
ObjCIndirectCopyRestoreExpr - Represents the passing of a function argument by indirect copy-restore ...
bool shouldCopy() const
shouldCopy - True if we should do the 'copy' part of the copy-restore.
Represents an ObjC class declaration.
ObjCMethodDecl - Represents an instance or class method declaration.
ImplicitParamDecl * getSelfDecl() const
ArrayRef< ParmVarDecl * > parameters() const
bool isDirectMethod() const
True if the method is tagged as objc_direct.
QualType getReturnType() const
Represents a parameter to a function.
PointerType - C99 6.7.5.1 - Pointer Declarators.
A (possibly-)qualified type.
bool isRestrictQualified() const
Determine whether this type is restrict-qualified.
bool isTriviallyCopyableType(const ASTContext &Context) const
Return true if this is a trivially copyable type (C++0x [basic.types]p9)
bool isNull() const
Return true if this QualType doesn't point to a type yet.
LangAS getAddressSpace() const
Return the address space of this type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getCanonicalType() const
bool isConstQualified() const
Determine whether this type is const-qualified.
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
LangAS getAddressSpace() const
Represents a struct/union/class.
field_iterator field_end() const
bool isParamDestroyedInCallee() const
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
field_iterator field_begin() const
Base for LValueReferenceType and RValueReferenceType.
Encodes a location in the source.
UIntTy getRawEncoding() const
When a SourceLocation itself cannot be used, this returns an (opaque) 32-bit integer encoding for it.
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
Options for controlling the target.
std::vector< std::string > Features
The list of target specific features to enable or disable – this should be a list of strings starting...
std::string TuneCPU
If given, the name of the target CPU to tune code for.
std::string CPU
If given, the name of the target CPU to generate code for.
llvm::StringMap< bool > FeatureMap
The map of which features have been enabled disabled based on the command line.
The base class of the type hierarchy.
bool isIncompleteArrayType() const
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isConstantSizeType() const
Return true if this is not a variable sized type, according to the rules of C99 6....
bool isPointerType() const
CanQualType getCanonicalTypeUnqualified() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isScalarType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isBitIntType() const
RecordDecl * castAsRecordDecl() const
bool isMemberPointerType() const
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isObjectType() const
Determine whether this type is an object type.
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool hasFloatingRepresentation() const
Determine whether this type has a floating-point representation of some sort, e.g....
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
const T * castAsCanonical() const
Return this type's canonical type cast to the specified type.
const T * getAs() const
Member-template getAs<specific type>'.
bool isNullPtrType() const
bool isRecordType() const
bool isObjCRetainableType() const
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Represents a call to the builtin function __builtin_va_arg.
Represents a variable declaration or definition.
QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const
Would the destruction of this variable have any effect, and if so, what kind?
Represents a GCC generic vector type.
Defines the clang::TargetInfo interface.
void computeABIInfo(CodeGenModule &CGM, CGFunctionInfo &FI)
Compute the ABI information of a swiftcall function.
@ Type
The l-value was considered opaque, so the alignment was determined from a type.
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
void computeSPIRKernelABIInfo(CodeGenModule &CGM, CGFunctionInfo &FI)
@ NormalCleanup
Denotes a cleanup that should run when a scope is exited using normal control flow (falling off the e...
void mergeDefaultFunctionDefinitionAttributes(llvm::Function &F, const CodeGenOptions &CodeGenOpts, const LangOptions &LangOpts, const TargetOptions &TargetOpts, bool WillInternalize)
Adds attributes to F according to our CodeGenOpts and LangOpts, as though we had emitted it ourselves...
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.
The JSON file list parser is used to communicate input to InstallAPI.
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.
@ Dtor_VectorDeleting
Vector deleting dtor.
@ Dtor_Complete
Complete object dtor.
@ Dtor_Deleting
Deleting dtor.
@ CanPassInRegs
The argument of this type can be passed directly in registers.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
U cast(CodeGen::Address addr)
@ Struct
The "struct" keyword introduces the elaborated-type-specifier.
__DEVICE__ _Tp arg(const std::complex< _Tp > &__c)
Structure with information about how a bitfield should be accessed.
CharUnits StorageOffset
The offset of the bitfield storage from the start of the struct.
unsigned Offset
The offset within a contiguous run of bitfields that are represented as a single "field" within the L...
unsigned Size
The total size of the bit-field, in bits.
unsigned StorageSize
The storage size in bits which should be used when accessing this bitfield.
Similar to AddedStructorArgs, but only notes the number of additional arguments.
llvm::Value * ToUse
A value to "use" after the writeback, or null.
LValue Source
The original argument.
Address Temporary
The temporary alloca.
const Expr * WritebackExpr
An Expression (optional) that performs the writeback with any required casting.
LValue getKnownLValue() const
RValue getKnownRValue() const
void copyInto(CodeGenFunction &CGF, Address A) const
RValue getRValue(CodeGenFunction &CGF) const
llvm::PointerType * VoidPtrTy
llvm::IntegerType * Int64Ty
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64
llvm::CallingConv::ID getRuntimeCC() const
llvm::IntegerType * SizeTy
llvm::IntegerType * Int32Ty
llvm::IntegerType * IntPtrTy
llvm::PointerType * Int8PtrTy
CharUnits getPointerAlign() const
~DisableDebugLocationUpdates()
DisableDebugLocationUpdates(CodeGenFunction &CGF)
static const EHPersonality & get(CodeGenModule &CGM, const FunctionDecl *FD)
llvm::Function * objc_retainAutoreleasedReturnValue
id objc_retainAutoreleasedReturnValue(id);
llvm::Function * objc_retain
id objc_retain(id);
llvm::InlineAsm * retainAutoreleasedReturnValueMarker
A void(void) inline asm to use to mark that the return value of a call will be immediately retain.
bool has(SanitizerMask K) const
Check if a certain (single) sanitizer is enabled.