xref: /freebsd/contrib/llvm-project/clang/lib/CodeGen/CGCall.cpp (revision 5deeebd8c6ca991269e72902a7a62cada57947f6)
1  //===--- CGCall.cpp - Encapsulate calling convention details --------------===//
2  //
3  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4  // See https://llvm.org/LICENSE.txt for license information.
5  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6  //
7  //===----------------------------------------------------------------------===//
8  //
9  // These classes wrap the information about a call or function
10  // definition used to handle ABI compliancy.
11  //
12  //===----------------------------------------------------------------------===//
13  
14  #include "CGCall.h"
15  #include "ABIInfo.h"
16  #include "ABIInfoImpl.h"
17  #include "CGBlocks.h"
18  #include "CGCXXABI.h"
19  #include "CGCleanup.h"
20  #include "CGRecordLayout.h"
21  #include "CodeGenFunction.h"
22  #include "CodeGenModule.h"
23  #include "TargetInfo.h"
24  #include "clang/AST/Attr.h"
25  #include "clang/AST/Decl.h"
26  #include "clang/AST/DeclCXX.h"
27  #include "clang/AST/DeclObjC.h"
28  #include "clang/Basic/CodeGenOptions.h"
29  #include "clang/Basic/TargetInfo.h"
30  #include "clang/CodeGen/CGFunctionInfo.h"
31  #include "clang/CodeGen/SwiftCallingConv.h"
32  #include "llvm/ADT/StringExtras.h"
33  #include "llvm/Analysis/ValueTracking.h"
34  #include "llvm/IR/Assumptions.h"
35  #include "llvm/IR/AttributeMask.h"
36  #include "llvm/IR/Attributes.h"
37  #include "llvm/IR/CallingConv.h"
38  #include "llvm/IR/DataLayout.h"
39  #include "llvm/IR/InlineAsm.h"
40  #include "llvm/IR/IntrinsicInst.h"
41  #include "llvm/IR/Intrinsics.h"
42  #include "llvm/IR/Type.h"
43  #include "llvm/Transforms/Utils/Local.h"
44  #include <optional>
45  using namespace clang;
46  using namespace CodeGen;
47  
48  /***/
49  
ClangCallConvToLLVMCallConv(CallingConv CC)50  unsigned CodeGenTypes::ClangCallConvToLLVMCallConv(CallingConv CC) {
51    switch (CC) {
52    default: return llvm::CallingConv::C;
53    case CC_X86StdCall: return llvm::CallingConv::X86_StdCall;
54    case CC_X86FastCall: return llvm::CallingConv::X86_FastCall;
55    case CC_X86RegCall: return llvm::CallingConv::X86_RegCall;
56    case CC_X86ThisCall: return llvm::CallingConv::X86_ThisCall;
57    case CC_Win64: return llvm::CallingConv::Win64;
58    case CC_X86_64SysV: return llvm::CallingConv::X86_64_SysV;
59    case CC_AAPCS: return llvm::CallingConv::ARM_AAPCS;
60    case CC_AAPCS_VFP: return llvm::CallingConv::ARM_AAPCS_VFP;
61    case CC_IntelOclBicc: return llvm::CallingConv::Intel_OCL_BI;
62    // TODO: Add support for __pascal to LLVM.
63    case CC_X86Pascal: return llvm::CallingConv::C;
64    // TODO: Add support for __vectorcall to LLVM.
65    case CC_X86VectorCall: return llvm::CallingConv::X86_VectorCall;
66    case CC_AArch64VectorCall: return llvm::CallingConv::AArch64_VectorCall;
67    case CC_AArch64SVEPCS: return llvm::CallingConv::AArch64_SVE_VectorCall;
68    case CC_AMDGPUKernelCall: return llvm::CallingConv::AMDGPU_KERNEL;
69    case CC_SpirFunction: return llvm::CallingConv::SPIR_FUNC;
70    case CC_OpenCLKernel: return CGM.getTargetCodeGenInfo().getOpenCLKernelCallingConv();
71    case CC_PreserveMost: return llvm::CallingConv::PreserveMost;
72    case CC_PreserveAll: return llvm::CallingConv::PreserveAll;
73    case CC_Swift: return llvm::CallingConv::Swift;
74    case CC_SwiftAsync: return llvm::CallingConv::SwiftTail;
75    case CC_M68kRTD: return llvm::CallingConv::M68k_RTD;
76    case CC_PreserveNone: return llvm::CallingConv::PreserveNone;
77      // clang-format off
78    case CC_RISCVVectorCall: return llvm::CallingConv::RISCV_VectorCall;
79      // clang-format on
80    }
81  }
82  
83  /// Derives the 'this' type for codegen purposes, i.e. ignoring method CVR
84  /// qualification. Either or both of RD and MD may be null. A null RD indicates
85  /// that there is no meaningful 'this' type, and a null MD can occur when
86  /// calling a method pointer.
DeriveThisType(const CXXRecordDecl * RD,const CXXMethodDecl * MD)87  CanQualType CodeGenTypes::DeriveThisType(const CXXRecordDecl *RD,
88                                           const CXXMethodDecl *MD) {
89    QualType RecTy;
90    if (RD)
91      RecTy = Context.getTagDeclType(RD)->getCanonicalTypeInternal();
92    else
93      RecTy = Context.VoidTy;
94  
95    if (MD)
96      RecTy = Context.getAddrSpaceQualType(RecTy, MD->getMethodQualifiers().getAddressSpace());
97    return Context.getPointerType(CanQualType::CreateUnsafe(RecTy));
98  }
99  
100  /// Returns the canonical formal type of the given C++ method.
GetFormalType(const CXXMethodDecl * MD)101  static CanQual<FunctionProtoType> GetFormalType(const CXXMethodDecl *MD) {
102    return MD->getType()->getCanonicalTypeUnqualified()
103             .getAs<FunctionProtoType>();
104  }
105  
106  /// Returns the "extra-canonicalized" return type, which discards
107  /// qualifiers on the return type.  Codegen doesn't care about them,
108  /// and it makes ABI code a little easier to be able to assume that
109  /// all parameter and return types are top-level unqualified.
GetReturnType(QualType RetTy)110  static CanQualType GetReturnType(QualType RetTy) {
111    return RetTy->getCanonicalTypeUnqualified().getUnqualifiedType();
112  }
113  
114  /// Arrange the argument and result information for a value of the given
115  /// unprototyped freestanding function type.
116  const CGFunctionInfo &
arrangeFreeFunctionType(CanQual<FunctionNoProtoType> FTNP)117  CodeGenTypes::arrangeFreeFunctionType(CanQual<FunctionNoProtoType> FTNP) {
118    // When translating an unprototyped function type, always use a
119    // variadic type.
120    return arrangeLLVMFunctionInfo(FTNP->getReturnType().getUnqualifiedType(),
121                                   FnInfoOpts::None, std::nullopt,
122                                   FTNP->getExtInfo(), {}, RequiredArgs(0));
123  }
124  
addExtParameterInfosForCall(llvm::SmallVectorImpl<FunctionProtoType::ExtParameterInfo> & paramInfos,const FunctionProtoType * proto,unsigned prefixArgs,unsigned totalArgs)125  static void addExtParameterInfosForCall(
126           llvm::SmallVectorImpl<FunctionProtoType::ExtParameterInfo> &paramInfos,
127                                          const FunctionProtoType *proto,
128                                          unsigned prefixArgs,
129                                          unsigned totalArgs) {
130    assert(proto->hasExtParameterInfos());
131    assert(paramInfos.size() <= prefixArgs);
132    assert(proto->getNumParams() + prefixArgs <= totalArgs);
133  
134    paramInfos.reserve(totalArgs);
135  
136    // Add default infos for any prefix args that don't already have infos.
137    paramInfos.resize(prefixArgs);
138  
139    // Add infos for the prototype.
140    for (const auto &ParamInfo : proto->getExtParameterInfos()) {
141      paramInfos.push_back(ParamInfo);
142      // pass_object_size params have no parameter info.
143      if (ParamInfo.hasPassObjectSize())
144        paramInfos.emplace_back();
145    }
146  
147    assert(paramInfos.size() <= totalArgs &&
148           "Did we forget to insert pass_object_size args?");
149    // Add default infos for the variadic and/or suffix arguments.
150    paramInfos.resize(totalArgs);
151  }
152  
153  /// Adds the formal parameters in FPT to the given prefix. If any parameter in
154  /// FPT has pass_object_size attrs, then we'll add parameters for those, too.
appendParameterTypes(const CodeGenTypes & CGT,SmallVectorImpl<CanQualType> & prefix,SmallVectorImpl<FunctionProtoType::ExtParameterInfo> & paramInfos,CanQual<FunctionProtoType> FPT)155  static void appendParameterTypes(const CodeGenTypes &CGT,
156                                   SmallVectorImpl<CanQualType> &prefix,
157                SmallVectorImpl<FunctionProtoType::ExtParameterInfo> &paramInfos,
158                                   CanQual<FunctionProtoType> FPT) {
159    // Fast path: don't touch param info if we don't need to.
160    if (!FPT->hasExtParameterInfos()) {
161      assert(paramInfos.empty() &&
162             "We have paramInfos, but the prototype doesn't?");
163      prefix.append(FPT->param_type_begin(), FPT->param_type_end());
164      return;
165    }
166  
167    unsigned PrefixSize = prefix.size();
168    // In the vast majority of cases, we'll have precisely FPT->getNumParams()
169    // parameters; the only thing that can change this is the presence of
170    // pass_object_size. So, we preallocate for the common case.
171    prefix.reserve(prefix.size() + FPT->getNumParams());
172  
173    auto ExtInfos = FPT->getExtParameterInfos();
174    assert(ExtInfos.size() == FPT->getNumParams());
175    for (unsigned I = 0, E = FPT->getNumParams(); I != E; ++I) {
176      prefix.push_back(FPT->getParamType(I));
177      if (ExtInfos[I].hasPassObjectSize())
178        prefix.push_back(CGT.getContext().getSizeType());
179    }
180  
181    addExtParameterInfosForCall(paramInfos, FPT.getTypePtr(), PrefixSize,
182                                prefix.size());
183  }
184  
185  /// Arrange the LLVM function layout for a value of the given function
186  /// type, on top of any implicit parameters already stored.
187  static const CGFunctionInfo &
arrangeLLVMFunctionInfo(CodeGenTypes & CGT,bool instanceMethod,SmallVectorImpl<CanQualType> & prefix,CanQual<FunctionProtoType> FTP)188  arrangeLLVMFunctionInfo(CodeGenTypes &CGT, bool instanceMethod,
189                          SmallVectorImpl<CanQualType> &prefix,
190                          CanQual<FunctionProtoType> FTP) {
191    SmallVector<FunctionProtoType::ExtParameterInfo, 16> paramInfos;
192    RequiredArgs Required = RequiredArgs::forPrototypePlus(FTP, prefix.size());
193    // FIXME: Kill copy.
194    appendParameterTypes(CGT, prefix, paramInfos, FTP);
195    CanQualType resultType = FTP->getReturnType().getUnqualifiedType();
196  
197    FnInfoOpts opts =
198        instanceMethod ? FnInfoOpts::IsInstanceMethod : FnInfoOpts::None;
199    return CGT.arrangeLLVMFunctionInfo(resultType, opts, prefix,
200                                       FTP->getExtInfo(), paramInfos, Required);
201  }
202  
203  /// Arrange the argument and result information for a value of the
204  /// given freestanding function type.
205  const CGFunctionInfo &
arrangeFreeFunctionType(CanQual<FunctionProtoType> FTP)206  CodeGenTypes::arrangeFreeFunctionType(CanQual<FunctionProtoType> FTP) {
207    SmallVector<CanQualType, 16> argTypes;
208    return ::arrangeLLVMFunctionInfo(*this, /*instanceMethod=*/false, argTypes,
209                                     FTP);
210  }
211  
getCallingConventionForDecl(const ObjCMethodDecl * D,bool IsWindows)212  static CallingConv getCallingConventionForDecl(const ObjCMethodDecl *D,
213                                                 bool IsWindows) {
214    // Set the appropriate calling convention for the Function.
215    if (D->hasAttr<StdCallAttr>())
216      return CC_X86StdCall;
217  
218    if (D->hasAttr<FastCallAttr>())
219      return CC_X86FastCall;
220  
221    if (D->hasAttr<RegCallAttr>())
222      return CC_X86RegCall;
223  
224    if (D->hasAttr<ThisCallAttr>())
225      return CC_X86ThisCall;
226  
227    if (D->hasAttr<VectorCallAttr>())
228      return CC_X86VectorCall;
229  
230    if (D->hasAttr<PascalAttr>())
231      return CC_X86Pascal;
232  
233    if (PcsAttr *PCS = D->getAttr<PcsAttr>())
234      return (PCS->getPCS() == PcsAttr::AAPCS ? CC_AAPCS : CC_AAPCS_VFP);
235  
236    if (D->hasAttr<AArch64VectorPcsAttr>())
237      return CC_AArch64VectorCall;
238  
239    if (D->hasAttr<AArch64SVEPcsAttr>())
240      return CC_AArch64SVEPCS;
241  
242    if (D->hasAttr<AMDGPUKernelCallAttr>())
243      return CC_AMDGPUKernelCall;
244  
245    if (D->hasAttr<IntelOclBiccAttr>())
246      return CC_IntelOclBicc;
247  
248    if (D->hasAttr<MSABIAttr>())
249      return IsWindows ? CC_C : CC_Win64;
250  
251    if (D->hasAttr<SysVABIAttr>())
252      return IsWindows ? CC_X86_64SysV : CC_C;
253  
254    if (D->hasAttr<PreserveMostAttr>())
255      return CC_PreserveMost;
256  
257    if (D->hasAttr<PreserveAllAttr>())
258      return CC_PreserveAll;
259  
260    if (D->hasAttr<M68kRTDAttr>())
261      return CC_M68kRTD;
262  
263    if (D->hasAttr<PreserveNoneAttr>())
264      return CC_PreserveNone;
265  
266    if (D->hasAttr<RISCVVectorCCAttr>())
267      return CC_RISCVVectorCall;
268  
269    return CC_C;
270  }
271  
272  /// Arrange the argument and result information for a call to an
273  /// unknown C++ non-static member function of the given abstract type.
274  /// (A null RD means we don't have any meaningful "this" argument type,
275  ///  so fall back to a generic pointer type).
276  /// The member function must be an ordinary function, i.e. not a
277  /// constructor or destructor.
278  const CGFunctionInfo &
arrangeCXXMethodType(const CXXRecordDecl * RD,const FunctionProtoType * FTP,const CXXMethodDecl * MD)279  CodeGenTypes::arrangeCXXMethodType(const CXXRecordDecl *RD,
280                                     const FunctionProtoType *FTP,
281                                     const CXXMethodDecl *MD) {
282    SmallVector<CanQualType, 16> argTypes;
283  
284    // Add the 'this' pointer.
285    argTypes.push_back(DeriveThisType(RD, MD));
286  
287    return ::arrangeLLVMFunctionInfo(
288        *this, /*instanceMethod=*/true, argTypes,
289        FTP->getCanonicalTypeUnqualified().getAs<FunctionProtoType>());
290  }
291  
292  /// Set calling convention for CUDA/HIP kernel.
setCUDAKernelCallingConvention(CanQualType & FTy,CodeGenModule & CGM,const FunctionDecl * FD)293  static void setCUDAKernelCallingConvention(CanQualType &FTy, CodeGenModule &CGM,
294                                             const FunctionDecl *FD) {
295    if (FD->hasAttr<CUDAGlobalAttr>()) {
296      const FunctionType *FT = FTy->getAs<FunctionType>();
297      CGM.getTargetCodeGenInfo().setCUDAKernelCallingConvention(FT);
298      FTy = FT->getCanonicalTypeUnqualified();
299    }
300  }
301  
302  /// Arrange the argument and result information for a declaration or
303  /// definition of the given C++ non-static member function.  The
304  /// member function must be an ordinary function, i.e. not a
305  /// constructor or destructor.
306  const CGFunctionInfo &
arrangeCXXMethodDeclaration(const CXXMethodDecl * MD)307  CodeGenTypes::arrangeCXXMethodDeclaration(const CXXMethodDecl *MD) {
308    assert(!isa<CXXConstructorDecl>(MD) && "wrong method for constructors!");
309    assert(!isa<CXXDestructorDecl>(MD) && "wrong method for destructors!");
310  
311    CanQualType FT = GetFormalType(MD).getAs<Type>();
312    setCUDAKernelCallingConvention(FT, CGM, MD);
313    auto prototype = FT.getAs<FunctionProtoType>();
314  
315    if (MD->isImplicitObjectMemberFunction()) {
316      // The abstract case is perfectly fine.
317      const CXXRecordDecl *ThisType =
318          getCXXABI().getThisArgumentTypeForMethod(MD);
319      return arrangeCXXMethodType(ThisType, prototype.getTypePtr(), MD);
320    }
321  
322    return arrangeFreeFunctionType(prototype);
323  }
324  
inheritingCtorHasParams(const InheritedConstructor & Inherited,CXXCtorType Type)325  bool CodeGenTypes::inheritingCtorHasParams(
326      const InheritedConstructor &Inherited, CXXCtorType Type) {
327    // Parameters are unnecessary if we're constructing a base class subobject
328    // and the inherited constructor lives in a virtual base.
329    return Type == Ctor_Complete ||
330           !Inherited.getShadowDecl()->constructsVirtualBase() ||
331           !Target.getCXXABI().hasConstructorVariants();
332  }
333  
334  const CGFunctionInfo &
arrangeCXXStructorDeclaration(GlobalDecl GD)335  CodeGenTypes::arrangeCXXStructorDeclaration(GlobalDecl GD) {
336    auto *MD = cast<CXXMethodDecl>(GD.getDecl());
337  
338    SmallVector<CanQualType, 16> argTypes;
339    SmallVector<FunctionProtoType::ExtParameterInfo, 16> paramInfos;
340  
341    const CXXRecordDecl *ThisType = getCXXABI().getThisArgumentTypeForMethod(GD);
342    argTypes.push_back(DeriveThisType(ThisType, MD));
343  
344    bool PassParams = true;
345  
346    if (auto *CD = dyn_cast<CXXConstructorDecl>(MD)) {
347      // A base class inheriting constructor doesn't get forwarded arguments
348      // needed to construct a virtual base (or base class thereof).
349      if (auto Inherited = CD->getInheritedConstructor())
350        PassParams = inheritingCtorHasParams(Inherited, GD.getCtorType());
351    }
352  
353    CanQual<FunctionProtoType> FTP = GetFormalType(MD);
354  
355    // Add the formal parameters.
356    if (PassParams)
357      appendParameterTypes(*this, argTypes, paramInfos, FTP);
358  
359    CGCXXABI::AddedStructorArgCounts AddedArgs =
360        getCXXABI().buildStructorSignature(GD, argTypes);
361    if (!paramInfos.empty()) {
362      // Note: prefix implies after the first param.
363      if (AddedArgs.Prefix)
364        paramInfos.insert(paramInfos.begin() + 1, AddedArgs.Prefix,
365                          FunctionProtoType::ExtParameterInfo{});
366      if (AddedArgs.Suffix)
367        paramInfos.append(AddedArgs.Suffix,
368                          FunctionProtoType::ExtParameterInfo{});
369    }
370  
371    RequiredArgs required =
372        (PassParams && MD->isVariadic() ? RequiredArgs(argTypes.size())
373                                        : RequiredArgs::All);
374  
375    FunctionType::ExtInfo extInfo = FTP->getExtInfo();
376    CanQualType resultType = getCXXABI().HasThisReturn(GD) ? argTypes.front()
377                             : getCXXABI().hasMostDerivedReturn(GD)
378                                 ? CGM.getContext().VoidPtrTy
379                                 : Context.VoidTy;
380    return arrangeLLVMFunctionInfo(resultType, FnInfoOpts::IsInstanceMethod,
381                                   argTypes, extInfo, paramInfos, required);
382  }
383  
384  static SmallVector<CanQualType, 16>
getArgTypesForCall(ASTContext & ctx,const CallArgList & args)385  getArgTypesForCall(ASTContext &ctx, const CallArgList &args) {
386    SmallVector<CanQualType, 16> argTypes;
387    for (auto &arg : args)
388      argTypes.push_back(ctx.getCanonicalParamType(arg.Ty));
389    return argTypes;
390  }
391  
392  static SmallVector<CanQualType, 16>
getArgTypesForDeclaration(ASTContext & ctx,const FunctionArgList & args)393  getArgTypesForDeclaration(ASTContext &ctx, const FunctionArgList &args) {
394    SmallVector<CanQualType, 16> argTypes;
395    for (auto &arg : args)
396      argTypes.push_back(ctx.getCanonicalParamType(arg->getType()));
397    return argTypes;
398  }
399  
400  static llvm::SmallVector<FunctionProtoType::ExtParameterInfo, 16>
getExtParameterInfosForCall(const FunctionProtoType * proto,unsigned prefixArgs,unsigned totalArgs)401  getExtParameterInfosForCall(const FunctionProtoType *proto,
402                              unsigned prefixArgs, unsigned totalArgs) {
403    llvm::SmallVector<FunctionProtoType::ExtParameterInfo, 16> result;
404    if (proto->hasExtParameterInfos()) {
405      addExtParameterInfosForCall(result, proto, prefixArgs, totalArgs);
406    }
407    return result;
408  }
409  
410  /// Arrange a call to a C++ method, passing the given arguments.
411  ///
412  /// ExtraPrefixArgs is the number of ABI-specific args passed after the `this`
413  /// parameter.
414  /// ExtraSuffixArgs is the number of ABI-specific args passed at the end of
415  /// args.
416  /// PassProtoArgs indicates whether `args` has args for the parameters in the
417  /// given CXXConstructorDecl.
418  const CGFunctionInfo &
arrangeCXXConstructorCall(const CallArgList & args,const CXXConstructorDecl * D,CXXCtorType CtorKind,unsigned ExtraPrefixArgs,unsigned ExtraSuffixArgs,bool PassProtoArgs)419  CodeGenTypes::arrangeCXXConstructorCall(const CallArgList &args,
420                                          const CXXConstructorDecl *D,
421                                          CXXCtorType CtorKind,
422                                          unsigned ExtraPrefixArgs,
423                                          unsigned ExtraSuffixArgs,
424                                          bool PassProtoArgs) {
425    // FIXME: Kill copy.
426    SmallVector<CanQualType, 16> ArgTypes;
427    for (const auto &Arg : args)
428      ArgTypes.push_back(Context.getCanonicalParamType(Arg.Ty));
429  
430    // +1 for implicit this, which should always be args[0].
431    unsigned TotalPrefixArgs = 1 + ExtraPrefixArgs;
432  
433    CanQual<FunctionProtoType> FPT = GetFormalType(D);
434    RequiredArgs Required = PassProtoArgs
435                                ? RequiredArgs::forPrototypePlus(
436                                      FPT, TotalPrefixArgs + ExtraSuffixArgs)
437                                : RequiredArgs::All;
438  
439    GlobalDecl GD(D, CtorKind);
440    CanQualType ResultType = getCXXABI().HasThisReturn(GD) ? ArgTypes.front()
441                             : getCXXABI().hasMostDerivedReturn(GD)
442                                 ? CGM.getContext().VoidPtrTy
443                                 : Context.VoidTy;
444  
445    FunctionType::ExtInfo Info = FPT->getExtInfo();
446    llvm::SmallVector<FunctionProtoType::ExtParameterInfo, 16> ParamInfos;
447    // If the prototype args are elided, we should only have ABI-specific args,
448    // which never have param info.
449    if (PassProtoArgs && FPT->hasExtParameterInfos()) {
450      // ABI-specific suffix arguments are treated the same as variadic arguments.
451      addExtParameterInfosForCall(ParamInfos, FPT.getTypePtr(), TotalPrefixArgs,
452                                  ArgTypes.size());
453    }
454  
455    return arrangeLLVMFunctionInfo(ResultType, FnInfoOpts::IsInstanceMethod,
456                                   ArgTypes, Info, ParamInfos, Required);
457  }
458  
459  /// Arrange the argument and result information for the declaration or
460  /// definition of the given function.
461  const CGFunctionInfo &
arrangeFunctionDeclaration(const FunctionDecl * FD)462  CodeGenTypes::arrangeFunctionDeclaration(const FunctionDecl *FD) {
463    if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD))
464      if (MD->isImplicitObjectMemberFunction())
465        return arrangeCXXMethodDeclaration(MD);
466  
467    CanQualType FTy = FD->getType()->getCanonicalTypeUnqualified();
468  
469    assert(isa<FunctionType>(FTy));
470    setCUDAKernelCallingConvention(FTy, CGM, FD);
471  
472    // When declaring a function without a prototype, always use a
473    // non-variadic type.
474    if (CanQual<FunctionNoProtoType> noProto = FTy.getAs<FunctionNoProtoType>()) {
475      return arrangeLLVMFunctionInfo(noProto->getReturnType(), FnInfoOpts::None,
476                                     std::nullopt, noProto->getExtInfo(), {},
477                                     RequiredArgs::All);
478    }
479  
480    return arrangeFreeFunctionType(FTy.castAs<FunctionProtoType>());
481  }
482  
483  /// Arrange the argument and result information for the declaration or
484  /// definition of an Objective-C method.
485  const CGFunctionInfo &
arrangeObjCMethodDeclaration(const ObjCMethodDecl * MD)486  CodeGenTypes::arrangeObjCMethodDeclaration(const ObjCMethodDecl *MD) {
487    // It happens that this is the same as a call with no optional
488    // arguments, except also using the formal 'self' type.
489    return arrangeObjCMessageSendSignature(MD, MD->getSelfDecl()->getType());
490  }
491  
492  /// Arrange the argument and result information for the function type
493  /// through which to perform a send to the given Objective-C method,
494  /// using the given receiver type.  The receiver type is not always
495  /// the 'self' type of the method or even an Objective-C pointer type.
496  /// This is *not* the right method for actually performing such a
497  /// message send, due to the possibility of optional arguments.
498  const CGFunctionInfo &
arrangeObjCMessageSendSignature(const ObjCMethodDecl * MD,QualType receiverType)499  CodeGenTypes::arrangeObjCMessageSendSignature(const ObjCMethodDecl *MD,
500                                                QualType receiverType) {
501    SmallVector<CanQualType, 16> argTys;
502    SmallVector<FunctionProtoType::ExtParameterInfo, 4> extParamInfos(
503        MD->isDirectMethod() ? 1 : 2);
504    argTys.push_back(Context.getCanonicalParamType(receiverType));
505    if (!MD->isDirectMethod())
506      argTys.push_back(Context.getCanonicalParamType(Context.getObjCSelType()));
507    // FIXME: Kill copy?
508    for (const auto *I : MD->parameters()) {
509      argTys.push_back(Context.getCanonicalParamType(I->getType()));
510      auto extParamInfo = FunctionProtoType::ExtParameterInfo().withIsNoEscape(
511          I->hasAttr<NoEscapeAttr>());
512      extParamInfos.push_back(extParamInfo);
513    }
514  
515    FunctionType::ExtInfo einfo;
516    bool IsWindows = getContext().getTargetInfo().getTriple().isOSWindows();
517    einfo = einfo.withCallingConv(getCallingConventionForDecl(MD, IsWindows));
518  
519    if (getContext().getLangOpts().ObjCAutoRefCount &&
520        MD->hasAttr<NSReturnsRetainedAttr>())
521      einfo = einfo.withProducesResult(true);
522  
523    RequiredArgs required =
524      (MD->isVariadic() ? RequiredArgs(argTys.size()) : RequiredArgs::All);
525  
526    return arrangeLLVMFunctionInfo(GetReturnType(MD->getReturnType()),
527                                   FnInfoOpts::None, argTys, einfo, extParamInfos,
528                                   required);
529  }
530  
531  const CGFunctionInfo &
arrangeUnprototypedObjCMessageSend(QualType returnType,const CallArgList & args)532  CodeGenTypes::arrangeUnprototypedObjCMessageSend(QualType returnType,
533                                                   const CallArgList &args) {
534    auto argTypes = getArgTypesForCall(Context, args);
535    FunctionType::ExtInfo einfo;
536  
537    return arrangeLLVMFunctionInfo(GetReturnType(returnType), FnInfoOpts::None,
538                                   argTypes, einfo, {}, RequiredArgs::All);
539  }
540  
541  const CGFunctionInfo &
arrangeGlobalDeclaration(GlobalDecl GD)542  CodeGenTypes::arrangeGlobalDeclaration(GlobalDecl GD) {
543    // FIXME: Do we need to handle ObjCMethodDecl?
544    const FunctionDecl *FD = cast<FunctionDecl>(GD.getDecl());
545  
546    if (isa<CXXConstructorDecl>(GD.getDecl()) ||
547        isa<CXXDestructorDecl>(GD.getDecl()))
548      return arrangeCXXStructorDeclaration(GD);
549  
550    return arrangeFunctionDeclaration(FD);
551  }
552  
553  /// Arrange a thunk that takes 'this' as the first parameter followed by
554  /// varargs.  Return a void pointer, regardless of the actual return type.
555  /// The body of the thunk will end in a musttail call to a function of the
556  /// correct type, and the caller will bitcast the function to the correct
557  /// prototype.
558  const CGFunctionInfo &
arrangeUnprototypedMustTailThunk(const CXXMethodDecl * MD)559  CodeGenTypes::arrangeUnprototypedMustTailThunk(const CXXMethodDecl *MD) {
560    assert(MD->isVirtual() && "only methods have thunks");
561    CanQual<FunctionProtoType> FTP = GetFormalType(MD);
562    CanQualType ArgTys[] = {DeriveThisType(MD->getParent(), MD)};
563    return arrangeLLVMFunctionInfo(Context.VoidTy, FnInfoOpts::None, ArgTys,
564                                   FTP->getExtInfo(), {}, RequiredArgs(1));
565  }
566  
567  const CGFunctionInfo &
arrangeMSCtorClosure(const CXXConstructorDecl * CD,CXXCtorType CT)568  CodeGenTypes::arrangeMSCtorClosure(const CXXConstructorDecl *CD,
569                                     CXXCtorType CT) {
570    assert(CT == Ctor_CopyingClosure || CT == Ctor_DefaultClosure);
571  
572    CanQual<FunctionProtoType> FTP = GetFormalType(CD);
573    SmallVector<CanQualType, 2> ArgTys;
574    const CXXRecordDecl *RD = CD->getParent();
575    ArgTys.push_back(DeriveThisType(RD, CD));
576    if (CT == Ctor_CopyingClosure)
577      ArgTys.push_back(*FTP->param_type_begin());
578    if (RD->getNumVBases() > 0)
579      ArgTys.push_back(Context.IntTy);
580    CallingConv CC = Context.getDefaultCallingConvention(
581        /*IsVariadic=*/false, /*IsCXXMethod=*/true);
582    return arrangeLLVMFunctionInfo(Context.VoidTy, FnInfoOpts::IsInstanceMethod,
583                                   ArgTys, FunctionType::ExtInfo(CC), {},
584                                   RequiredArgs::All);
585  }
586  
587  /// Arrange a call as unto a free function, except possibly with an
588  /// additional number of formal parameters considered required.
589  static const CGFunctionInfo &
arrangeFreeFunctionLikeCall(CodeGenTypes & CGT,CodeGenModule & CGM,const CallArgList & args,const FunctionType * fnType,unsigned numExtraRequiredArgs,bool chainCall)590  arrangeFreeFunctionLikeCall(CodeGenTypes &CGT,
591                              CodeGenModule &CGM,
592                              const CallArgList &args,
593                              const FunctionType *fnType,
594                              unsigned numExtraRequiredArgs,
595                              bool chainCall) {
596    assert(args.size() >= numExtraRequiredArgs);
597  
598    llvm::SmallVector<FunctionProtoType::ExtParameterInfo, 16> paramInfos;
599  
600    // In most cases, there are no optional arguments.
601    RequiredArgs required = RequiredArgs::All;
602  
603    // If we have a variadic prototype, the required arguments are the
604    // extra prefix plus the arguments in the prototype.
605    if (const FunctionProtoType *proto = dyn_cast<FunctionProtoType>(fnType)) {
606      if (proto->isVariadic())
607        required = RequiredArgs::forPrototypePlus(proto, numExtraRequiredArgs);
608  
609      if (proto->hasExtParameterInfos())
610        addExtParameterInfosForCall(paramInfos, proto, numExtraRequiredArgs,
611                                    args.size());
612  
613    // If we don't have a prototype at all, but we're supposed to
614    // explicitly use the variadic convention for unprototyped calls,
615    // treat all of the arguments as required but preserve the nominal
616    // possibility of variadics.
617    } else if (CGM.getTargetCodeGenInfo()
618                  .isNoProtoCallVariadic(args,
619                                         cast<FunctionNoProtoType>(fnType))) {
620      required = RequiredArgs(args.size());
621    }
622  
623    // FIXME: Kill copy.
624    SmallVector<CanQualType, 16> argTypes;
625    for (const auto &arg : args)
626      argTypes.push_back(CGT.getContext().getCanonicalParamType(arg.Ty));
627    FnInfoOpts opts = chainCall ? FnInfoOpts::IsChainCall : FnInfoOpts::None;
628    return CGT.arrangeLLVMFunctionInfo(GetReturnType(fnType->getReturnType()),
629                                       opts, argTypes, fnType->getExtInfo(),
630                                       paramInfos, required);
631  }
632  
633  /// Figure out the rules for calling a function with the given formal
634  /// type using the given arguments.  The arguments are necessary
635  /// because the function might be unprototyped, in which case it's
636  /// target-dependent in crazy ways.
637  const CGFunctionInfo &
arrangeFreeFunctionCall(const CallArgList & args,const FunctionType * fnType,bool chainCall)638  CodeGenTypes::arrangeFreeFunctionCall(const CallArgList &args,
639                                        const FunctionType *fnType,
640                                        bool chainCall) {
641    return arrangeFreeFunctionLikeCall(*this, CGM, args, fnType,
642                                       chainCall ? 1 : 0, chainCall);
643  }
644  
645  /// A block function is essentially a free function with an
646  /// extra implicit argument.
647  const CGFunctionInfo &
arrangeBlockFunctionCall(const CallArgList & args,const FunctionType * fnType)648  CodeGenTypes::arrangeBlockFunctionCall(const CallArgList &args,
649                                         const FunctionType *fnType) {
650    return arrangeFreeFunctionLikeCall(*this, CGM, args, fnType, 1,
651                                       /*chainCall=*/false);
652  }
653  
654  const CGFunctionInfo &
arrangeBlockFunctionDeclaration(const FunctionProtoType * proto,const FunctionArgList & params)655  CodeGenTypes::arrangeBlockFunctionDeclaration(const FunctionProtoType *proto,
656                                                const FunctionArgList &params) {
657    auto paramInfos = getExtParameterInfosForCall(proto, 1, params.size());
658    auto argTypes = getArgTypesForDeclaration(Context, params);
659  
660    return arrangeLLVMFunctionInfo(GetReturnType(proto->getReturnType()),
661                                   FnInfoOpts::None, argTypes,
662                                   proto->getExtInfo(), paramInfos,
663                                   RequiredArgs::forPrototypePlus(proto, 1));
664  }
665  
666  const CGFunctionInfo &
arrangeBuiltinFunctionCall(QualType resultType,const CallArgList & args)667  CodeGenTypes::arrangeBuiltinFunctionCall(QualType resultType,
668                                           const CallArgList &args) {
669    // FIXME: Kill copy.
670    SmallVector<CanQualType, 16> argTypes;
671    for (const auto &Arg : args)
672      argTypes.push_back(Context.getCanonicalParamType(Arg.Ty));
673    return arrangeLLVMFunctionInfo(GetReturnType(resultType), FnInfoOpts::None,
674                                   argTypes, FunctionType::ExtInfo(),
675                                   /*paramInfos=*/{}, RequiredArgs::All);
676  }
677  
678  const CGFunctionInfo &
arrangeBuiltinFunctionDeclaration(QualType resultType,const FunctionArgList & args)679  CodeGenTypes::arrangeBuiltinFunctionDeclaration(QualType resultType,
680                                                  const FunctionArgList &args) {
681    auto argTypes = getArgTypesForDeclaration(Context, args);
682  
683    return arrangeLLVMFunctionInfo(GetReturnType(resultType), FnInfoOpts::None,
684                                   argTypes, FunctionType::ExtInfo(), {},
685                                   RequiredArgs::All);
686  }
687  
688  const CGFunctionInfo &
arrangeBuiltinFunctionDeclaration(CanQualType resultType,ArrayRef<CanQualType> argTypes)689  CodeGenTypes::arrangeBuiltinFunctionDeclaration(CanQualType resultType,
690                                                ArrayRef<CanQualType> argTypes) {
691    return arrangeLLVMFunctionInfo(resultType, FnInfoOpts::None, argTypes,
692                                   FunctionType::ExtInfo(), {},
693                                   RequiredArgs::All);
694  }
695  
696  /// Arrange a call to a C++ method, passing the given arguments.
697  ///
698  /// numPrefixArgs is the number of ABI-specific prefix arguments we have. It
699  /// does not count `this`.
700  const CGFunctionInfo &
arrangeCXXMethodCall(const CallArgList & args,const FunctionProtoType * proto,RequiredArgs required,unsigned numPrefixArgs)701  CodeGenTypes::arrangeCXXMethodCall(const CallArgList &args,
702                                     const FunctionProtoType *proto,
703                                     RequiredArgs required,
704                                     unsigned numPrefixArgs) {
705    assert(numPrefixArgs + 1 <= args.size() &&
706           "Emitting a call with less args than the required prefix?");
707    // Add one to account for `this`. It's a bit awkward here, but we don't count
708    // `this` in similar places elsewhere.
709    auto paramInfos =
710      getExtParameterInfosForCall(proto, numPrefixArgs + 1, args.size());
711  
712    // FIXME: Kill copy.
713    auto argTypes = getArgTypesForCall(Context, args);
714  
715    FunctionType::ExtInfo info = proto->getExtInfo();
716    return arrangeLLVMFunctionInfo(GetReturnType(proto->getReturnType()),
717                                   FnInfoOpts::IsInstanceMethod, argTypes, info,
718                                   paramInfos, required);
719  }
720  
arrangeNullaryFunction()721  const CGFunctionInfo &CodeGenTypes::arrangeNullaryFunction() {
722    return arrangeLLVMFunctionInfo(getContext().VoidTy, FnInfoOpts::None,
723                                   std::nullopt, FunctionType::ExtInfo(), {},
724                                   RequiredArgs::All);
725  }
726  
727  const CGFunctionInfo &
arrangeCall(const CGFunctionInfo & signature,const CallArgList & args)728  CodeGenTypes::arrangeCall(const CGFunctionInfo &signature,
729                            const CallArgList &args) {
730    assert(signature.arg_size() <= args.size());
731    if (signature.arg_size() == args.size())
732      return signature;
733  
734    SmallVector<FunctionProtoType::ExtParameterInfo, 16> paramInfos;
735    auto sigParamInfos = signature.getExtParameterInfos();
736    if (!sigParamInfos.empty()) {
737      paramInfos.append(sigParamInfos.begin(), sigParamInfos.end());
738      paramInfos.resize(args.size());
739    }
740  
741    auto argTypes = getArgTypesForCall(Context, args);
742  
743    assert(signature.getRequiredArgs().allowsOptionalArgs());
744    FnInfoOpts opts = FnInfoOpts::None;
745    if (signature.isInstanceMethod())
746      opts |= FnInfoOpts::IsInstanceMethod;
747    if (signature.isChainCall())
748      opts |= FnInfoOpts::IsChainCall;
749    if (signature.isDelegateCall())
750      opts |= FnInfoOpts::IsDelegateCall;
751    return arrangeLLVMFunctionInfo(signature.getReturnType(), opts, argTypes,
752                                   signature.getExtInfo(), paramInfos,
753                                   signature.getRequiredArgs());
754  }
755  
756  namespace clang {
757  namespace CodeGen {
758  void computeSPIRKernelABIInfo(CodeGenModule &CGM, CGFunctionInfo &FI);
759  }
760  }
761  
762  /// Arrange the argument and result information for an abstract value
763  /// of a given function type.  This is the method which all of the
764  /// above functions ultimately defer to.
arrangeLLVMFunctionInfo(CanQualType resultType,FnInfoOpts opts,ArrayRef<CanQualType> argTypes,FunctionType::ExtInfo info,ArrayRef<FunctionProtoType::ExtParameterInfo> paramInfos,RequiredArgs required)765  const CGFunctionInfo &CodeGenTypes::arrangeLLVMFunctionInfo(
766      CanQualType resultType, FnInfoOpts opts, ArrayRef<CanQualType> argTypes,
767      FunctionType::ExtInfo info,
768      ArrayRef<FunctionProtoType::ExtParameterInfo> paramInfos,
769      RequiredArgs required) {
770    assert(llvm::all_of(argTypes,
771                        [](CanQualType T) { return T.isCanonicalAsParam(); }));
772  
773    // Lookup or create unique function info.
774    llvm::FoldingSetNodeID ID;
775    bool isInstanceMethod =
776        (opts & FnInfoOpts::IsInstanceMethod) == FnInfoOpts::IsInstanceMethod;
777    bool isChainCall =
778        (opts & FnInfoOpts::IsChainCall) == FnInfoOpts::IsChainCall;
779    bool isDelegateCall =
780        (opts & FnInfoOpts::IsDelegateCall) == FnInfoOpts::IsDelegateCall;
781    CGFunctionInfo::Profile(ID, isInstanceMethod, isChainCall, isDelegateCall,
782                            info, paramInfos, required, resultType, argTypes);
783  
784    void *insertPos = nullptr;
785    CGFunctionInfo *FI = FunctionInfos.FindNodeOrInsertPos(ID, insertPos);
786    if (FI)
787      return *FI;
788  
789    unsigned CC = ClangCallConvToLLVMCallConv(info.getCC());
790  
791    // Construct the function info.  We co-allocate the ArgInfos.
792    FI = CGFunctionInfo::create(CC, isInstanceMethod, isChainCall, isDelegateCall,
793                                info, paramInfos, resultType, argTypes, required);
794    FunctionInfos.InsertNode(FI, insertPos);
795  
796    bool inserted = FunctionsBeingProcessed.insert(FI).second;
797    (void)inserted;
798    assert(inserted && "Recursively being processed?");
799  
800    // Compute ABI information.
801    if (CC == llvm::CallingConv::SPIR_KERNEL) {
802      // Force target independent argument handling for the host visible
803      // kernel functions.
804      computeSPIRKernelABIInfo(CGM, *FI);
805    } else if (info.getCC() == CC_Swift || info.getCC() == CC_SwiftAsync) {
806      swiftcall::computeABIInfo(CGM, *FI);
807    } else {
808      CGM.getABIInfo().computeInfo(*FI);
809    }
810  
811    // Loop over all of the computed argument and return value info.  If any of
812    // them are direct or extend without a specified coerce type, specify the
813    // default now.
814    ABIArgInfo &retInfo = FI->getReturnInfo();
815    if (retInfo.canHaveCoerceToType() && retInfo.getCoerceToType() == nullptr)
816      retInfo.setCoerceToType(ConvertType(FI->getReturnType()));
817  
818    for (auto &I : FI->arguments())
819      if (I.info.canHaveCoerceToType() && I.info.getCoerceToType() == nullptr)
820        I.info.setCoerceToType(ConvertType(I.type));
821  
822    bool erased = FunctionsBeingProcessed.erase(FI); (void)erased;
823    assert(erased && "Not in set?");
824  
825    return *FI;
826  }
827  
create(unsigned llvmCC,bool instanceMethod,bool chainCall,bool delegateCall,const FunctionType::ExtInfo & info,ArrayRef<ExtParameterInfo> paramInfos,CanQualType resultType,ArrayRef<CanQualType> argTypes,RequiredArgs required)828  CGFunctionInfo *CGFunctionInfo::create(unsigned llvmCC, bool instanceMethod,
829                                         bool chainCall, bool delegateCall,
830                                         const FunctionType::ExtInfo &info,
831                                         ArrayRef<ExtParameterInfo> paramInfos,
832                                         CanQualType resultType,
833                                         ArrayRef<CanQualType> argTypes,
834                                         RequiredArgs required) {
835    assert(paramInfos.empty() || paramInfos.size() == argTypes.size());
836    assert(!required.allowsOptionalArgs() ||
837           required.getNumRequiredArgs() <= argTypes.size());
838  
839    void *buffer =
840      operator new(totalSizeToAlloc<ArgInfo,             ExtParameterInfo>(
841                                    argTypes.size() + 1, paramInfos.size()));
842  
843    CGFunctionInfo *FI = new(buffer) CGFunctionInfo();
844    FI->CallingConvention = llvmCC;
845    FI->EffectiveCallingConvention = llvmCC;
846    FI->ASTCallingConvention = info.getCC();
847    FI->InstanceMethod = instanceMethod;
848    FI->ChainCall = chainCall;
849    FI->DelegateCall = delegateCall;
850    FI->CmseNSCall = info.getCmseNSCall();
851    FI->NoReturn = info.getNoReturn();
852    FI->ReturnsRetained = info.getProducesResult();
853    FI->NoCallerSavedRegs = info.getNoCallerSavedRegs();
854    FI->NoCfCheck = info.getNoCfCheck();
855    FI->Required = required;
856    FI->HasRegParm = info.getHasRegParm();
857    FI->RegParm = info.getRegParm();
858    FI->ArgStruct = nullptr;
859    FI->ArgStructAlign = 0;
860    FI->NumArgs = argTypes.size();
861    FI->HasExtParameterInfos = !paramInfos.empty();
862    FI->getArgsBuffer()[0].type = resultType;
863    FI->MaxVectorWidth = 0;
864    for (unsigned i = 0, e = argTypes.size(); i != e; ++i)
865      FI->getArgsBuffer()[i + 1].type = argTypes[i];
866    for (unsigned i = 0, e = paramInfos.size(); i != e; ++i)
867      FI->getExtParameterInfosBuffer()[i] = paramInfos[i];
868    return FI;
869  }
870  
871  /***/
872  
873  namespace {
874  // ABIArgInfo::Expand implementation.
875  
876  // Specifies the way QualType passed as ABIArgInfo::Expand is expanded.
877  struct TypeExpansion {
878    enum TypeExpansionKind {
879      // Elements of constant arrays are expanded recursively.
880      TEK_ConstantArray,
881      // Record fields are expanded recursively (but if record is a union, only
882      // the field with the largest size is expanded).
883      TEK_Record,
884      // For complex types, real and imaginary parts are expanded recursively.
885      TEK_Complex,
886      // All other types are not expandable.
887      TEK_None
888    };
889  
890    const TypeExpansionKind Kind;
891  
TypeExpansion__anonf4c048640211::TypeExpansion892    TypeExpansion(TypeExpansionKind K) : Kind(K) {}
~TypeExpansion__anonf4c048640211::TypeExpansion893    virtual ~TypeExpansion() {}
894  };
895  
896  struct ConstantArrayExpansion : TypeExpansion {
897    QualType EltTy;
898    uint64_t NumElts;
899  
ConstantArrayExpansion__anonf4c048640211::ConstantArrayExpansion900    ConstantArrayExpansion(QualType EltTy, uint64_t NumElts)
901        : TypeExpansion(TEK_ConstantArray), EltTy(EltTy), NumElts(NumElts) {}
classof__anonf4c048640211::ConstantArrayExpansion902    static bool classof(const TypeExpansion *TE) {
903      return TE->Kind == TEK_ConstantArray;
904    }
905  };
906  
907  struct RecordExpansion : TypeExpansion {
908    SmallVector<const CXXBaseSpecifier *, 1> Bases;
909  
910    SmallVector<const FieldDecl *, 1> Fields;
911  
RecordExpansion__anonf4c048640211::RecordExpansion912    RecordExpansion(SmallVector<const CXXBaseSpecifier *, 1> &&Bases,
913                    SmallVector<const FieldDecl *, 1> &&Fields)
914        : TypeExpansion(TEK_Record), Bases(std::move(Bases)),
915          Fields(std::move(Fields)) {}
classof__anonf4c048640211::RecordExpansion916    static bool classof(const TypeExpansion *TE) {
917      return TE->Kind == TEK_Record;
918    }
919  };
920  
921  struct ComplexExpansion : TypeExpansion {
922    QualType EltTy;
923  
ComplexExpansion__anonf4c048640211::ComplexExpansion924    ComplexExpansion(QualType EltTy) : TypeExpansion(TEK_Complex), EltTy(EltTy) {}
classof__anonf4c048640211::ComplexExpansion925    static bool classof(const TypeExpansion *TE) {
926      return TE->Kind == TEK_Complex;
927    }
928  };
929  
930  struct NoExpansion : TypeExpansion {
NoExpansion__anonf4c048640211::NoExpansion931    NoExpansion() : TypeExpansion(TEK_None) {}
classof__anonf4c048640211::NoExpansion932    static bool classof(const TypeExpansion *TE) {
933      return TE->Kind == TEK_None;
934    }
935  };
936  }  // namespace
937  
938  static std::unique_ptr<TypeExpansion>
getTypeExpansion(QualType Ty,const ASTContext & Context)939  getTypeExpansion(QualType Ty, const ASTContext &Context) {
940    if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty)) {
941      return std::make_unique<ConstantArrayExpansion>(AT->getElementType(),
942                                                      AT->getZExtSize());
943    }
944    if (const RecordType *RT = Ty->getAs<RecordType>()) {
945      SmallVector<const CXXBaseSpecifier *, 1> Bases;
946      SmallVector<const FieldDecl *, 1> Fields;
947      const RecordDecl *RD = RT->getDecl();
948      assert(!RD->hasFlexibleArrayMember() &&
949             "Cannot expand structure with flexible array.");
950      if (RD->isUnion()) {
951        // Unions can be here only in degenerative cases - all the fields are same
952        // after flattening. Thus we have to use the "largest" field.
953        const FieldDecl *LargestFD = nullptr;
954        CharUnits UnionSize = CharUnits::Zero();
955  
956        for (const auto *FD : RD->fields()) {
957          if (FD->isZeroLengthBitField(Context))
958            continue;
959          assert(!FD->isBitField() &&
960                 "Cannot expand structure with bit-field members.");
961          CharUnits FieldSize = Context.getTypeSizeInChars(FD->getType());
962          if (UnionSize < FieldSize) {
963            UnionSize = FieldSize;
964            LargestFD = FD;
965          }
966        }
967        if (LargestFD)
968          Fields.push_back(LargestFD);
969      } else {
970        if (const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
971          assert(!CXXRD->isDynamicClass() &&
972                 "cannot expand vtable pointers in dynamic classes");
973          llvm::append_range(Bases, llvm::make_pointer_range(CXXRD->bases()));
974        }
975  
976        for (const auto *FD : RD->fields()) {
977          if (FD->isZeroLengthBitField(Context))
978            continue;
979          assert(!FD->isBitField() &&
980                 "Cannot expand structure with bit-field members.");
981          Fields.push_back(FD);
982        }
983      }
984      return std::make_unique<RecordExpansion>(std::move(Bases),
985                                                std::move(Fields));
986    }
987    if (const ComplexType *CT = Ty->getAs<ComplexType>()) {
988      return std::make_unique<ComplexExpansion>(CT->getElementType());
989    }
990    return std::make_unique<NoExpansion>();
991  }
992  
getExpansionSize(QualType Ty,const ASTContext & Context)993  static int getExpansionSize(QualType Ty, const ASTContext &Context) {
994    auto Exp = getTypeExpansion(Ty, Context);
995    if (auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
996      return CAExp->NumElts * getExpansionSize(CAExp->EltTy, Context);
997    }
998    if (auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
999      int Res = 0;
1000      for (auto BS : RExp->Bases)
1001        Res += getExpansionSize(BS->getType(), Context);
1002      for (auto FD : RExp->Fields)
1003        Res += getExpansionSize(FD->getType(), Context);
1004      return Res;
1005    }
1006    if (isa<ComplexExpansion>(Exp.get()))
1007      return 2;
1008    assert(isa<NoExpansion>(Exp.get()));
1009    return 1;
1010  }
1011  
1012  void
getExpandedTypes(QualType Ty,SmallVectorImpl<llvm::Type * >::iterator & TI)1013  CodeGenTypes::getExpandedTypes(QualType Ty,
1014                                 SmallVectorImpl<llvm::Type *>::iterator &TI) {
1015    auto Exp = getTypeExpansion(Ty, Context);
1016    if (auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
1017      for (int i = 0, n = CAExp->NumElts; i < n; i++) {
1018        getExpandedTypes(CAExp->EltTy, TI);
1019      }
1020    } else if (auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
1021      for (auto BS : RExp->Bases)
1022        getExpandedTypes(BS->getType(), TI);
1023      for (auto FD : RExp->Fields)
1024        getExpandedTypes(FD->getType(), TI);
1025    } else if (auto CExp = dyn_cast<ComplexExpansion>(Exp.get())) {
1026      llvm::Type *EltTy = ConvertType(CExp->EltTy);
1027      *TI++ = EltTy;
1028      *TI++ = EltTy;
1029    } else {
1030      assert(isa<NoExpansion>(Exp.get()));
1031      *TI++ = ConvertType(Ty);
1032    }
1033  }
1034  
forConstantArrayExpansion(CodeGenFunction & CGF,ConstantArrayExpansion * CAE,Address BaseAddr,llvm::function_ref<void (Address)> Fn)1035  static void forConstantArrayExpansion(CodeGenFunction &CGF,
1036                                        ConstantArrayExpansion *CAE,
1037                                        Address BaseAddr,
1038                                        llvm::function_ref<void(Address)> Fn) {
1039    for (int i = 0, n = CAE->NumElts; i < n; i++) {
1040      Address EltAddr = CGF.Builder.CreateConstGEP2_32(BaseAddr, 0, i);
1041      Fn(EltAddr);
1042    }
1043  }
1044  
ExpandTypeFromArgs(QualType Ty,LValue LV,llvm::Function::arg_iterator & AI)1045  void CodeGenFunction::ExpandTypeFromArgs(QualType Ty, LValue LV,
1046                                           llvm::Function::arg_iterator &AI) {
1047    assert(LV.isSimple() &&
1048           "Unexpected non-simple lvalue during struct expansion.");
1049  
1050    auto Exp = getTypeExpansion(Ty, getContext());
1051    if (auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
1052      forConstantArrayExpansion(
1053          *this, CAExp, LV.getAddress(), [&](Address EltAddr) {
1054            LValue LV = MakeAddrLValue(EltAddr, CAExp->EltTy);
1055            ExpandTypeFromArgs(CAExp->EltTy, LV, AI);
1056          });
1057    } else if (auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
1058      Address This = LV.getAddress();
1059      for (const CXXBaseSpecifier *BS : RExp->Bases) {
1060        // Perform a single step derived-to-base conversion.
1061        Address Base =
1062            GetAddressOfBaseClass(This, Ty->getAsCXXRecordDecl(), &BS, &BS + 1,
1063                                  /*NullCheckValue=*/false, SourceLocation());
1064        LValue SubLV = MakeAddrLValue(Base, BS->getType());
1065  
1066        // Recurse onto bases.
1067        ExpandTypeFromArgs(BS->getType(), SubLV, AI);
1068      }
1069      for (auto FD : RExp->Fields) {
1070        // FIXME: What are the right qualifiers here?
1071        LValue SubLV = EmitLValueForFieldInitialization(LV, FD);
1072        ExpandTypeFromArgs(FD->getType(), SubLV, AI);
1073      }
1074    } else if (isa<ComplexExpansion>(Exp.get())) {
1075      auto realValue = &*AI++;
1076      auto imagValue = &*AI++;
1077      EmitStoreOfComplex(ComplexPairTy(realValue, imagValue), LV, /*init*/ true);
1078    } else {
1079      // Call EmitStoreOfScalar except when the lvalue is a bitfield to emit a
1080      // primitive store.
1081      assert(isa<NoExpansion>(Exp.get()));
1082      llvm::Value *Arg = &*AI++;
1083      if (LV.isBitField()) {
1084        EmitStoreThroughLValue(RValue::get(Arg), LV);
1085      } else {
1086        // TODO: currently there are some places are inconsistent in what LLVM
1087        // pointer type they use (see D118744). Once clang uses opaque pointers
1088        // all LLVM pointer types will be the same and we can remove this check.
1089        if (Arg->getType()->isPointerTy()) {
1090          Address Addr = LV.getAddress();
1091          Arg = Builder.CreateBitCast(Arg, Addr.getElementType());
1092        }
1093        EmitStoreOfScalar(Arg, LV);
1094      }
1095    }
1096  }
1097  
ExpandTypeToArgs(QualType Ty,CallArg Arg,llvm::FunctionType * IRFuncTy,SmallVectorImpl<llvm::Value * > & IRCallArgs,unsigned & IRCallArgPos)1098  void CodeGenFunction::ExpandTypeToArgs(
1099      QualType Ty, CallArg Arg, llvm::FunctionType *IRFuncTy,
1100      SmallVectorImpl<llvm::Value *> &IRCallArgs, unsigned &IRCallArgPos) {
1101    auto Exp = getTypeExpansion(Ty, getContext());
1102    if (auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
1103      Address Addr = Arg.hasLValue() ? Arg.getKnownLValue().getAddress()
1104                                     : Arg.getKnownRValue().getAggregateAddress();
1105      forConstantArrayExpansion(
1106          *this, CAExp, Addr, [&](Address EltAddr) {
1107            CallArg EltArg = CallArg(
1108                convertTempToRValue(EltAddr, CAExp->EltTy, SourceLocation()),
1109                CAExp->EltTy);
1110            ExpandTypeToArgs(CAExp->EltTy, EltArg, IRFuncTy, IRCallArgs,
1111                             IRCallArgPos);
1112          });
1113    } else if (auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
1114      Address This = Arg.hasLValue() ? Arg.getKnownLValue().getAddress()
1115                                     : Arg.getKnownRValue().getAggregateAddress();
1116      for (const CXXBaseSpecifier *BS : RExp->Bases) {
1117        // Perform a single step derived-to-base conversion.
1118        Address Base =
1119            GetAddressOfBaseClass(This, Ty->getAsCXXRecordDecl(), &BS, &BS + 1,
1120                                  /*NullCheckValue=*/false, SourceLocation());
1121        CallArg BaseArg = CallArg(RValue::getAggregate(Base), BS->getType());
1122  
1123        // Recurse onto bases.
1124        ExpandTypeToArgs(BS->getType(), BaseArg, IRFuncTy, IRCallArgs,
1125                         IRCallArgPos);
1126      }
1127  
1128      LValue LV = MakeAddrLValue(This, Ty);
1129      for (auto FD : RExp->Fields) {
1130        CallArg FldArg =
1131            CallArg(EmitRValueForField(LV, FD, SourceLocation()), FD->getType());
1132        ExpandTypeToArgs(FD->getType(), FldArg, IRFuncTy, IRCallArgs,
1133                         IRCallArgPos);
1134      }
1135    } else if (isa<ComplexExpansion>(Exp.get())) {
1136      ComplexPairTy CV = Arg.getKnownRValue().getComplexVal();
1137      IRCallArgs[IRCallArgPos++] = CV.first;
1138      IRCallArgs[IRCallArgPos++] = CV.second;
1139    } else {
1140      assert(isa<NoExpansion>(Exp.get()));
1141      auto RV = Arg.getKnownRValue();
1142      assert(RV.isScalar() &&
1143             "Unexpected non-scalar rvalue during struct expansion.");
1144  
1145      // Insert a bitcast as needed.
1146      llvm::Value *V = RV.getScalarVal();
1147      if (IRCallArgPos < IRFuncTy->getNumParams() &&
1148          V->getType() != IRFuncTy->getParamType(IRCallArgPos))
1149        V = Builder.CreateBitCast(V, IRFuncTy->getParamType(IRCallArgPos));
1150  
1151      IRCallArgs[IRCallArgPos++] = V;
1152    }
1153  }
1154  
1155  /// Create a temporary allocation for the purposes of coercion.
CreateTempAllocaForCoercion(CodeGenFunction & CGF,llvm::Type * Ty,CharUnits MinAlign,const Twine & Name="tmp")1156  static RawAddress CreateTempAllocaForCoercion(CodeGenFunction &CGF,
1157                                                llvm::Type *Ty,
1158                                                CharUnits MinAlign,
1159                                                const Twine &Name = "tmp") {
1160    // Don't use an alignment that's worse than what LLVM would prefer.
1161    auto PrefAlign = CGF.CGM.getDataLayout().getPrefTypeAlign(Ty);
1162    CharUnits Align = std::max(MinAlign, CharUnits::fromQuantity(PrefAlign));
1163  
1164    return CGF.CreateTempAlloca(Ty, Align, Name + ".coerce");
1165  }
1166  
1167  /// EnterStructPointerForCoercedAccess - Given a struct pointer that we are
1168  /// accessing some number of bytes out of it, try to gep into the struct to get
1169  /// at its inner goodness.  Dive as deep as possible without entering an element
1170  /// with an in-memory size smaller than DstSize.
1171  static Address
EnterStructPointerForCoercedAccess(Address SrcPtr,llvm::StructType * SrcSTy,uint64_t DstSize,CodeGenFunction & CGF)1172  EnterStructPointerForCoercedAccess(Address SrcPtr,
1173                                     llvm::StructType *SrcSTy,
1174                                     uint64_t DstSize, CodeGenFunction &CGF) {
1175    // We can't dive into a zero-element struct.
1176    if (SrcSTy->getNumElements() == 0) return SrcPtr;
1177  
1178    llvm::Type *FirstElt = SrcSTy->getElementType(0);
1179  
1180    // If the first elt is at least as large as what we're looking for, or if the
1181    // first element is the same size as the whole struct, we can enter it. The
1182    // comparison must be made on the store size and not the alloca size. Using
1183    // the alloca size may overstate the size of the load.
1184    uint64_t FirstEltSize =
1185      CGF.CGM.getDataLayout().getTypeStoreSize(FirstElt);
1186    if (FirstEltSize < DstSize &&
1187        FirstEltSize < CGF.CGM.getDataLayout().getTypeStoreSize(SrcSTy))
1188      return SrcPtr;
1189  
1190    // GEP into the first element.
1191    SrcPtr = CGF.Builder.CreateStructGEP(SrcPtr, 0, "coerce.dive");
1192  
1193    // If the first element is a struct, recurse.
1194    llvm::Type *SrcTy = SrcPtr.getElementType();
1195    if (llvm::StructType *SrcSTy = dyn_cast<llvm::StructType>(SrcTy))
1196      return EnterStructPointerForCoercedAccess(SrcPtr, SrcSTy, DstSize, CGF);
1197  
1198    return SrcPtr;
1199  }
1200  
1201  /// CoerceIntOrPtrToIntOrPtr - Convert a value Val to the specific Ty where both
1202  /// are either integers or pointers.  This does a truncation of the value if it
1203  /// is too large or a zero extension if it is too small.
1204  ///
1205  /// This behaves as if the value were coerced through memory, so on big-endian
1206  /// targets the high bits are preserved in a truncation, while little-endian
1207  /// targets preserve the low bits.
CoerceIntOrPtrToIntOrPtr(llvm::Value * Val,llvm::Type * Ty,CodeGenFunction & CGF)1208  static llvm::Value *CoerceIntOrPtrToIntOrPtr(llvm::Value *Val,
1209                                               llvm::Type *Ty,
1210                                               CodeGenFunction &CGF) {
1211    if (Val->getType() == Ty)
1212      return Val;
1213  
1214    if (isa<llvm::PointerType>(Val->getType())) {
1215      // If this is Pointer->Pointer avoid conversion to and from int.
1216      if (isa<llvm::PointerType>(Ty))
1217        return CGF.Builder.CreateBitCast(Val, Ty, "coerce.val");
1218  
1219      // Convert the pointer to an integer so we can play with its width.
1220      Val = CGF.Builder.CreatePtrToInt(Val, CGF.IntPtrTy, "coerce.val.pi");
1221    }
1222  
1223    llvm::Type *DestIntTy = Ty;
1224    if (isa<llvm::PointerType>(DestIntTy))
1225      DestIntTy = CGF.IntPtrTy;
1226  
1227    if (Val->getType() != DestIntTy) {
1228      const llvm::DataLayout &DL = CGF.CGM.getDataLayout();
1229      if (DL.isBigEndian()) {
1230        // Preserve the high bits on big-endian targets.
1231        // That is what memory coercion does.
1232        uint64_t SrcSize = DL.getTypeSizeInBits(Val->getType());
1233        uint64_t DstSize = DL.getTypeSizeInBits(DestIntTy);
1234  
1235        if (SrcSize > DstSize) {
1236          Val = CGF.Builder.CreateLShr(Val, SrcSize - DstSize, "coerce.highbits");
1237          Val = CGF.Builder.CreateTrunc(Val, DestIntTy, "coerce.val.ii");
1238        } else {
1239          Val = CGF.Builder.CreateZExt(Val, DestIntTy, "coerce.val.ii");
1240          Val = CGF.Builder.CreateShl(Val, DstSize - SrcSize, "coerce.highbits");
1241        }
1242      } else {
1243        // Little-endian targets preserve the low bits. No shifts required.
1244        Val = CGF.Builder.CreateIntCast(Val, DestIntTy, false, "coerce.val.ii");
1245      }
1246    }
1247  
1248    if (isa<llvm::PointerType>(Ty))
1249      Val = CGF.Builder.CreateIntToPtr(Val, Ty, "coerce.val.ip");
1250    return Val;
1251  }
1252  
1253  
1254  
1255  /// CreateCoercedLoad - Create a load from \arg SrcPtr interpreted as
1256  /// a pointer to an object of type \arg Ty, known to be aligned to
1257  /// \arg SrcAlign bytes.
1258  ///
1259  /// This safely handles the case when the src type is smaller than the
1260  /// destination type; in this situation the values of bits which not
1261  /// present in the src are undefined.
CreateCoercedLoad(Address Src,llvm::Type * Ty,CodeGenFunction & CGF)1262  static llvm::Value *CreateCoercedLoad(Address Src, llvm::Type *Ty,
1263                                        CodeGenFunction &CGF) {
1264    llvm::Type *SrcTy = Src.getElementType();
1265  
1266    // If SrcTy and Ty are the same, just do a load.
1267    if (SrcTy == Ty)
1268      return CGF.Builder.CreateLoad(Src);
1269  
1270    llvm::TypeSize DstSize = CGF.CGM.getDataLayout().getTypeAllocSize(Ty);
1271  
1272    if (llvm::StructType *SrcSTy = dyn_cast<llvm::StructType>(SrcTy)) {
1273      Src = EnterStructPointerForCoercedAccess(Src, SrcSTy,
1274                                               DstSize.getFixedValue(), CGF);
1275      SrcTy = Src.getElementType();
1276    }
1277  
1278    llvm::TypeSize SrcSize = CGF.CGM.getDataLayout().getTypeAllocSize(SrcTy);
1279  
1280    // If the source and destination are integer or pointer types, just do an
1281    // extension or truncation to the desired type.
1282    if ((isa<llvm::IntegerType>(Ty) || isa<llvm::PointerType>(Ty)) &&
1283        (isa<llvm::IntegerType>(SrcTy) || isa<llvm::PointerType>(SrcTy))) {
1284      llvm::Value *Load = CGF.Builder.CreateLoad(Src);
1285      return CoerceIntOrPtrToIntOrPtr(Load, Ty, CGF);
1286    }
1287  
1288    // If load is legal, just bitcast the src pointer.
1289    if (!SrcSize.isScalable() && !DstSize.isScalable() &&
1290        SrcSize.getFixedValue() >= DstSize.getFixedValue()) {
1291      // Generally SrcSize is never greater than DstSize, since this means we are
1292      // losing bits. However, this can happen in cases where the structure has
1293      // additional padding, for example due to a user specified alignment.
1294      //
1295      // FIXME: Assert that we aren't truncating non-padding bits when have access
1296      // to that information.
1297      Src = Src.withElementType(Ty);
1298      return CGF.Builder.CreateLoad(Src);
1299    }
1300  
1301    // If coercing a fixed vector to a scalable vector for ABI compatibility, and
1302    // the types match, use the llvm.vector.insert intrinsic to perform the
1303    // conversion.
1304    if (auto *ScalableDstTy = dyn_cast<llvm::ScalableVectorType>(Ty)) {
1305      if (auto *FixedSrcTy = dyn_cast<llvm::FixedVectorType>(SrcTy)) {
1306        // If we are casting a fixed i8 vector to a scalable i1 predicate
1307        // vector, use a vector insert and bitcast the result.
1308        if (ScalableDstTy->getElementType()->isIntegerTy(1) &&
1309            ScalableDstTy->getElementCount().isKnownMultipleOf(8) &&
1310            FixedSrcTy->getElementType()->isIntegerTy(8)) {
1311          ScalableDstTy = llvm::ScalableVectorType::get(
1312              FixedSrcTy->getElementType(),
1313              ScalableDstTy->getElementCount().getKnownMinValue() / 8);
1314        }
1315        if (ScalableDstTy->getElementType() == FixedSrcTy->getElementType()) {
1316          auto *Load = CGF.Builder.CreateLoad(Src);
1317          auto *UndefVec = llvm::UndefValue::get(ScalableDstTy);
1318          auto *Zero = llvm::Constant::getNullValue(CGF.CGM.Int64Ty);
1319          llvm::Value *Result = CGF.Builder.CreateInsertVector(
1320              ScalableDstTy, UndefVec, Load, Zero, "cast.scalable");
1321          if (ScalableDstTy != Ty)
1322            Result = CGF.Builder.CreateBitCast(Result, Ty);
1323          return Result;
1324        }
1325      }
1326    }
1327  
1328    // Otherwise do coercion through memory. This is stupid, but simple.
1329    RawAddress Tmp =
1330        CreateTempAllocaForCoercion(CGF, Ty, Src.getAlignment(), Src.getName());
1331    CGF.Builder.CreateMemCpy(
1332        Tmp.getPointer(), Tmp.getAlignment().getAsAlign(),
1333        Src.emitRawPointer(CGF), Src.getAlignment().getAsAlign(),
1334        llvm::ConstantInt::get(CGF.IntPtrTy, SrcSize.getKnownMinValue()));
1335    return CGF.Builder.CreateLoad(Tmp);
1336  }
1337  
CreateCoercedStore(llvm::Value * Src,Address Dst,llvm::TypeSize DstSize,bool DstIsVolatile)1338  void CodeGenFunction::CreateCoercedStore(llvm::Value *Src, Address Dst,
1339                                           llvm::TypeSize DstSize,
1340                                           bool DstIsVolatile) {
1341    if (!DstSize)
1342      return;
1343  
1344    llvm::Type *SrcTy = Src->getType();
1345    llvm::TypeSize SrcSize = CGM.getDataLayout().getTypeAllocSize(SrcTy);
1346  
1347    // GEP into structs to try to make types match.
1348    // FIXME: This isn't really that useful with opaque types, but it impacts a
1349    // lot of regression tests.
1350    if (SrcTy != Dst.getElementType()) {
1351      if (llvm::StructType *DstSTy =
1352              dyn_cast<llvm::StructType>(Dst.getElementType())) {
1353        assert(!SrcSize.isScalable());
1354        Dst = EnterStructPointerForCoercedAccess(Dst, DstSTy,
1355                                                 SrcSize.getFixedValue(), *this);
1356      }
1357    }
1358  
1359    if (SrcSize.isScalable() || SrcSize <= DstSize) {
1360      if (SrcTy->isIntegerTy() && Dst.getElementType()->isPointerTy() &&
1361          SrcSize == CGM.getDataLayout().getTypeAllocSize(Dst.getElementType())) {
1362        // If the value is supposed to be a pointer, convert it before storing it.
1363        Src = CoerceIntOrPtrToIntOrPtr(Src, Dst.getElementType(), *this);
1364        Builder.CreateStore(Src, Dst, DstIsVolatile);
1365      } else if (llvm::StructType *STy =
1366                     dyn_cast<llvm::StructType>(Src->getType())) {
1367        // Prefer scalar stores to first-class aggregate stores.
1368        Dst = Dst.withElementType(SrcTy);
1369        for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
1370          Address EltPtr = Builder.CreateStructGEP(Dst, i);
1371          llvm::Value *Elt = Builder.CreateExtractValue(Src, i);
1372          Builder.CreateStore(Elt, EltPtr, DstIsVolatile);
1373        }
1374      } else {
1375        Builder.CreateStore(Src, Dst.withElementType(SrcTy), DstIsVolatile);
1376      }
1377    } else if (SrcTy->isIntegerTy()) {
1378      // If the source is a simple integer, coerce it directly.
1379      llvm::Type *DstIntTy = Builder.getIntNTy(DstSize.getFixedValue() * 8);
1380      Src = CoerceIntOrPtrToIntOrPtr(Src, DstIntTy, *this);
1381      Builder.CreateStore(Src, Dst.withElementType(DstIntTy), DstIsVolatile);
1382    } else {
1383      // Otherwise do coercion through memory. This is stupid, but
1384      // simple.
1385  
1386      // Generally SrcSize is never greater than DstSize, since this means we are
1387      // losing bits. However, this can happen in cases where the structure has
1388      // additional padding, for example due to a user specified alignment.
1389      //
1390      // FIXME: Assert that we aren't truncating non-padding bits when have access
1391      // to that information.
1392      RawAddress Tmp =
1393          CreateTempAllocaForCoercion(*this, SrcTy, Dst.getAlignment());
1394      Builder.CreateStore(Src, Tmp);
1395      Builder.CreateMemCpy(Dst.emitRawPointer(*this),
1396                           Dst.getAlignment().getAsAlign(), Tmp.getPointer(),
1397                           Tmp.getAlignment().getAsAlign(),
1398                           Builder.CreateTypeSize(IntPtrTy, DstSize));
1399    }
1400  }
1401  
emitAddressAtOffset(CodeGenFunction & CGF,Address addr,const ABIArgInfo & info)1402  static Address emitAddressAtOffset(CodeGenFunction &CGF, Address addr,
1403                                     const ABIArgInfo &info) {
1404    if (unsigned offset = info.getDirectOffset()) {
1405      addr = addr.withElementType(CGF.Int8Ty);
1406      addr = CGF.Builder.CreateConstInBoundsByteGEP(addr,
1407                                               CharUnits::fromQuantity(offset));
1408      addr = addr.withElementType(info.getCoerceToType());
1409    }
1410    return addr;
1411  }
1412  
1413  namespace {
1414  
1415  /// Encapsulates information about the way function arguments from
1416  /// CGFunctionInfo should be passed to actual LLVM IR function.
1417  class ClangToLLVMArgMapping {
1418    static const unsigned InvalidIndex = ~0U;
1419    unsigned InallocaArgNo;
1420    unsigned SRetArgNo;
1421    unsigned TotalIRArgs;
1422  
1423    /// Arguments of LLVM IR function corresponding to single Clang argument.
1424    struct IRArgs {
1425      unsigned PaddingArgIndex;
1426      // Argument is expanded to IR arguments at positions
1427      // [FirstArgIndex, FirstArgIndex + NumberOfArgs).
1428      unsigned FirstArgIndex;
1429      unsigned NumberOfArgs;
1430  
IRArgs__anonf4c048640511::ClangToLLVMArgMapping::IRArgs1431      IRArgs()
1432          : PaddingArgIndex(InvalidIndex), FirstArgIndex(InvalidIndex),
1433            NumberOfArgs(0) {}
1434    };
1435  
1436    SmallVector<IRArgs, 8> ArgInfo;
1437  
1438  public:
ClangToLLVMArgMapping(const ASTContext & Context,const CGFunctionInfo & FI,bool OnlyRequiredArgs=false)1439    ClangToLLVMArgMapping(const ASTContext &Context, const CGFunctionInfo &FI,
1440                          bool OnlyRequiredArgs = false)
1441        : InallocaArgNo(InvalidIndex), SRetArgNo(InvalidIndex), TotalIRArgs(0),
1442          ArgInfo(OnlyRequiredArgs ? FI.getNumRequiredArgs() : FI.arg_size()) {
1443      construct(Context, FI, OnlyRequiredArgs);
1444    }
1445  
hasInallocaArg() const1446    bool hasInallocaArg() const { return InallocaArgNo != InvalidIndex; }
getInallocaArgNo() const1447    unsigned getInallocaArgNo() const {
1448      assert(hasInallocaArg());
1449      return InallocaArgNo;
1450    }
1451  
hasSRetArg() const1452    bool hasSRetArg() const { return SRetArgNo != InvalidIndex; }
getSRetArgNo() const1453    unsigned getSRetArgNo() const {
1454      assert(hasSRetArg());
1455      return SRetArgNo;
1456    }
1457  
totalIRArgs() const1458    unsigned totalIRArgs() const { return TotalIRArgs; }
1459  
hasPaddingArg(unsigned ArgNo) const1460    bool hasPaddingArg(unsigned ArgNo) const {
1461      assert(ArgNo < ArgInfo.size());
1462      return ArgInfo[ArgNo].PaddingArgIndex != InvalidIndex;
1463    }
getPaddingArgNo(unsigned ArgNo) const1464    unsigned getPaddingArgNo(unsigned ArgNo) const {
1465      assert(hasPaddingArg(ArgNo));
1466      return ArgInfo[ArgNo].PaddingArgIndex;
1467    }
1468  
1469    /// Returns index of first IR argument corresponding to ArgNo, and their
1470    /// quantity.
getIRArgs(unsigned ArgNo) const1471    std::pair<unsigned, unsigned> getIRArgs(unsigned ArgNo) const {
1472      assert(ArgNo < ArgInfo.size());
1473      return std::make_pair(ArgInfo[ArgNo].FirstArgIndex,
1474                            ArgInfo[ArgNo].NumberOfArgs);
1475    }
1476  
1477  private:
1478    void construct(const ASTContext &Context, const CGFunctionInfo &FI,
1479                   bool OnlyRequiredArgs);
1480  };
1481  
construct(const ASTContext & Context,const CGFunctionInfo & FI,bool OnlyRequiredArgs)1482  void ClangToLLVMArgMapping::construct(const ASTContext &Context,
1483                                        const CGFunctionInfo &FI,
1484                                        bool OnlyRequiredArgs) {
1485    unsigned IRArgNo = 0;
1486    bool SwapThisWithSRet = false;
1487    const ABIArgInfo &RetAI = FI.getReturnInfo();
1488  
1489    if (RetAI.getKind() == ABIArgInfo::Indirect) {
1490      SwapThisWithSRet = RetAI.isSRetAfterThis();
1491      SRetArgNo = SwapThisWithSRet ? 1 : IRArgNo++;
1492    }
1493  
1494    unsigned ArgNo = 0;
1495    unsigned NumArgs = OnlyRequiredArgs ? FI.getNumRequiredArgs() : FI.arg_size();
1496    for (CGFunctionInfo::const_arg_iterator I = FI.arg_begin(); ArgNo < NumArgs;
1497         ++I, ++ArgNo) {
1498      assert(I != FI.arg_end());
1499      QualType ArgType = I->type;
1500      const ABIArgInfo &AI = I->info;
1501      // Collect data about IR arguments corresponding to Clang argument ArgNo.
1502      auto &IRArgs = ArgInfo[ArgNo];
1503  
1504      if (AI.getPaddingType())
1505        IRArgs.PaddingArgIndex = IRArgNo++;
1506  
1507      switch (AI.getKind()) {
1508      case ABIArgInfo::Extend:
1509      case ABIArgInfo::Direct: {
1510        // FIXME: handle sseregparm someday...
1511        llvm::StructType *STy = dyn_cast<llvm::StructType>(AI.getCoerceToType());
1512        if (AI.isDirect() && AI.getCanBeFlattened() && STy) {
1513          IRArgs.NumberOfArgs = STy->getNumElements();
1514        } else {
1515          IRArgs.NumberOfArgs = 1;
1516        }
1517        break;
1518      }
1519      case ABIArgInfo::Indirect:
1520      case ABIArgInfo::IndirectAliased:
1521        IRArgs.NumberOfArgs = 1;
1522        break;
1523      case ABIArgInfo::Ignore:
1524      case ABIArgInfo::InAlloca:
1525        // ignore and inalloca doesn't have matching LLVM parameters.
1526        IRArgs.NumberOfArgs = 0;
1527        break;
1528      case ABIArgInfo::CoerceAndExpand:
1529        IRArgs.NumberOfArgs = AI.getCoerceAndExpandTypeSequence().size();
1530        break;
1531      case ABIArgInfo::Expand:
1532        IRArgs.NumberOfArgs = getExpansionSize(ArgType, Context);
1533        break;
1534      }
1535  
1536      if (IRArgs.NumberOfArgs > 0) {
1537        IRArgs.FirstArgIndex = IRArgNo;
1538        IRArgNo += IRArgs.NumberOfArgs;
1539      }
1540  
1541      // Skip over the sret parameter when it comes second.  We already handled it
1542      // above.
1543      if (IRArgNo == 1 && SwapThisWithSRet)
1544        IRArgNo++;
1545    }
1546    assert(ArgNo == ArgInfo.size());
1547  
1548    if (FI.usesInAlloca())
1549      InallocaArgNo = IRArgNo++;
1550  
1551    TotalIRArgs = IRArgNo;
1552  }
1553  }  // namespace
1554  
1555  /***/
1556  
ReturnTypeUsesSRet(const CGFunctionInfo & FI)1557  bool CodeGenModule::ReturnTypeUsesSRet(const CGFunctionInfo &FI) {
1558    const auto &RI = FI.getReturnInfo();
1559    return RI.isIndirect() || (RI.isInAlloca() && RI.getInAllocaSRet());
1560  }
1561  
ReturnTypeHasInReg(const CGFunctionInfo & FI)1562  bool CodeGenModule::ReturnTypeHasInReg(const CGFunctionInfo &FI) {
1563    const auto &RI = FI.getReturnInfo();
1564    return RI.getInReg();
1565  }
1566  
ReturnSlotInterferesWithArgs(const CGFunctionInfo & FI)1567  bool CodeGenModule::ReturnSlotInterferesWithArgs(const CGFunctionInfo &FI) {
1568    return ReturnTypeUsesSRet(FI) &&
1569           getTargetCodeGenInfo().doesReturnSlotInterfereWithArgs();
1570  }
1571  
ReturnTypeUsesFPRet(QualType ResultType)1572  bool CodeGenModule::ReturnTypeUsesFPRet(QualType ResultType) {
1573    if (const BuiltinType *BT = ResultType->getAs<BuiltinType>()) {
1574      switch (BT->getKind()) {
1575      default:
1576        return false;
1577      case BuiltinType::Float:
1578        return getTarget().useObjCFPRetForRealType(FloatModeKind::Float);
1579      case BuiltinType::Double:
1580        return getTarget().useObjCFPRetForRealType(FloatModeKind::Double);
1581      case BuiltinType::LongDouble:
1582        return getTarget().useObjCFPRetForRealType(FloatModeKind::LongDouble);
1583      }
1584    }
1585  
1586    return false;
1587  }
1588  
ReturnTypeUsesFP2Ret(QualType ResultType)1589  bool CodeGenModule::ReturnTypeUsesFP2Ret(QualType ResultType) {
1590    if (const ComplexType *CT = ResultType->getAs<ComplexType>()) {
1591      if (const BuiltinType *BT = CT->getElementType()->getAs<BuiltinType>()) {
1592        if (BT->getKind() == BuiltinType::LongDouble)
1593          return getTarget().useObjCFP2RetForComplexLongDouble();
1594      }
1595    }
1596  
1597    return false;
1598  }
1599  
GetFunctionType(GlobalDecl GD)1600  llvm::FunctionType *CodeGenTypes::GetFunctionType(GlobalDecl GD) {
1601    const CGFunctionInfo &FI = arrangeGlobalDeclaration(GD);
1602    return GetFunctionType(FI);
1603  }
1604  
1605  llvm::FunctionType *
GetFunctionType(const CGFunctionInfo & FI)1606  CodeGenTypes::GetFunctionType(const CGFunctionInfo &FI) {
1607  
1608    bool Inserted = FunctionsBeingProcessed.insert(&FI).second;
1609    (void)Inserted;
1610    assert(Inserted && "Recursively being processed?");
1611  
1612    llvm::Type *resultType = nullptr;
1613    const ABIArgInfo &retAI = FI.getReturnInfo();
1614    switch (retAI.getKind()) {
1615    case ABIArgInfo::Expand:
1616    case ABIArgInfo::IndirectAliased:
1617      llvm_unreachable("Invalid ABI kind for return argument");
1618  
1619    case ABIArgInfo::Extend:
1620    case ABIArgInfo::Direct:
1621      resultType = retAI.getCoerceToType();
1622      break;
1623  
1624    case ABIArgInfo::InAlloca:
1625      if (retAI.getInAllocaSRet()) {
1626        // sret things on win32 aren't void, they return the sret pointer.
1627        QualType ret = FI.getReturnType();
1628        unsigned addressSpace = CGM.getTypes().getTargetAddressSpace(ret);
1629        resultType = llvm::PointerType::get(getLLVMContext(), addressSpace);
1630      } else {
1631        resultType = llvm::Type::getVoidTy(getLLVMContext());
1632      }
1633      break;
1634  
1635    case ABIArgInfo::Indirect:
1636    case ABIArgInfo::Ignore:
1637      resultType = llvm::Type::getVoidTy(getLLVMContext());
1638      break;
1639  
1640    case ABIArgInfo::CoerceAndExpand:
1641      resultType = retAI.getUnpaddedCoerceAndExpandType();
1642      break;
1643    }
1644  
1645    ClangToLLVMArgMapping IRFunctionArgs(getContext(), FI, true);
1646    SmallVector<llvm::Type*, 8> ArgTypes(IRFunctionArgs.totalIRArgs());
1647  
1648    // Add type for sret argument.
1649    if (IRFunctionArgs.hasSRetArg()) {
1650      QualType Ret = FI.getReturnType();
1651      unsigned AddressSpace = CGM.getTypes().getTargetAddressSpace(Ret);
1652      ArgTypes[IRFunctionArgs.getSRetArgNo()] =
1653          llvm::PointerType::get(getLLVMContext(), AddressSpace);
1654    }
1655  
1656    // Add type for inalloca argument.
1657    if (IRFunctionArgs.hasInallocaArg())
1658      ArgTypes[IRFunctionArgs.getInallocaArgNo()] =
1659          llvm::PointerType::getUnqual(getLLVMContext());
1660  
1661    // Add in all of the required arguments.
1662    unsigned ArgNo = 0;
1663    CGFunctionInfo::const_arg_iterator it = FI.arg_begin(),
1664                                       ie = it + FI.getNumRequiredArgs();
1665    for (; it != ie; ++it, ++ArgNo) {
1666      const ABIArgInfo &ArgInfo = it->info;
1667  
1668      // Insert a padding type to ensure proper alignment.
1669      if (IRFunctionArgs.hasPaddingArg(ArgNo))
1670        ArgTypes[IRFunctionArgs.getPaddingArgNo(ArgNo)] =
1671            ArgInfo.getPaddingType();
1672  
1673      unsigned FirstIRArg, NumIRArgs;
1674      std::tie(FirstIRArg, NumIRArgs) = IRFunctionArgs.getIRArgs(ArgNo);
1675  
1676      switch (ArgInfo.getKind()) {
1677      case ABIArgInfo::Ignore:
1678      case ABIArgInfo::InAlloca:
1679        assert(NumIRArgs == 0);
1680        break;
1681  
1682      case ABIArgInfo::Indirect:
1683        assert(NumIRArgs == 1);
1684        // indirect arguments are always on the stack, which is alloca addr space.
1685        ArgTypes[FirstIRArg] = llvm::PointerType::get(
1686            getLLVMContext(), CGM.getDataLayout().getAllocaAddrSpace());
1687        break;
1688      case ABIArgInfo::IndirectAliased:
1689        assert(NumIRArgs == 1);
1690        ArgTypes[FirstIRArg] = llvm::PointerType::get(
1691            getLLVMContext(), ArgInfo.getIndirectAddrSpace());
1692        break;
1693      case ABIArgInfo::Extend:
1694      case ABIArgInfo::Direct: {
1695        // Fast-isel and the optimizer generally like scalar values better than
1696        // FCAs, so we flatten them if this is safe to do for this argument.
1697        llvm::Type *argType = ArgInfo.getCoerceToType();
1698        llvm::StructType *st = dyn_cast<llvm::StructType>(argType);
1699        if (st && ArgInfo.isDirect() && ArgInfo.getCanBeFlattened()) {
1700          assert(NumIRArgs == st->getNumElements());
1701          for (unsigned i = 0, e = st->getNumElements(); i != e; ++i)
1702            ArgTypes[FirstIRArg + i] = st->getElementType(i);
1703        } else {
1704          assert(NumIRArgs == 1);
1705          ArgTypes[FirstIRArg] = argType;
1706        }
1707        break;
1708      }
1709  
1710      case ABIArgInfo::CoerceAndExpand: {
1711        auto ArgTypesIter = ArgTypes.begin() + FirstIRArg;
1712        for (auto *EltTy : ArgInfo.getCoerceAndExpandTypeSequence()) {
1713          *ArgTypesIter++ = EltTy;
1714        }
1715        assert(ArgTypesIter == ArgTypes.begin() + FirstIRArg + NumIRArgs);
1716        break;
1717      }
1718  
1719      case ABIArgInfo::Expand:
1720        auto ArgTypesIter = ArgTypes.begin() + FirstIRArg;
1721        getExpandedTypes(it->type, ArgTypesIter);
1722        assert(ArgTypesIter == ArgTypes.begin() + FirstIRArg + NumIRArgs);
1723        break;
1724      }
1725    }
1726  
1727    bool Erased = FunctionsBeingProcessed.erase(&FI); (void)Erased;
1728    assert(Erased && "Not in set?");
1729  
1730    return llvm::FunctionType::get(resultType, ArgTypes, FI.isVariadic());
1731  }
1732  
GetFunctionTypeForVTable(GlobalDecl GD)1733  llvm::Type *CodeGenTypes::GetFunctionTypeForVTable(GlobalDecl GD) {
1734    const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
1735    const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
1736  
1737    if (!isFuncTypeConvertible(FPT))
1738      return llvm::StructType::get(getLLVMContext());
1739  
1740    return GetFunctionType(GD);
1741  }
1742  
AddAttributesFromFunctionProtoType(ASTContext & Ctx,llvm::AttrBuilder & FuncAttrs,const FunctionProtoType * FPT)1743  static void AddAttributesFromFunctionProtoType(ASTContext &Ctx,
1744                                                 llvm::AttrBuilder &FuncAttrs,
1745                                                 const FunctionProtoType *FPT) {
1746    if (!FPT)
1747      return;
1748  
1749    if (!isUnresolvedExceptionSpec(FPT->getExceptionSpecType()) &&
1750        FPT->isNothrow())
1751      FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
1752  
1753    unsigned SMEBits = FPT->getAArch64SMEAttributes();
1754    if (SMEBits & FunctionType::SME_PStateSMEnabledMask)
1755      FuncAttrs.addAttribute("aarch64_pstate_sm_enabled");
1756    if (SMEBits & FunctionType::SME_PStateSMCompatibleMask)
1757      FuncAttrs.addAttribute("aarch64_pstate_sm_compatible");
1758  
1759    // ZA
1760    if (FunctionType::getArmZAState(SMEBits) == FunctionType::ARM_Preserves)
1761      FuncAttrs.addAttribute("aarch64_preserves_za");
1762    if (FunctionType::getArmZAState(SMEBits) == FunctionType::ARM_In)
1763      FuncAttrs.addAttribute("aarch64_in_za");
1764    if (FunctionType::getArmZAState(SMEBits) == FunctionType::ARM_Out)
1765      FuncAttrs.addAttribute("aarch64_out_za");
1766    if (FunctionType::getArmZAState(SMEBits) == FunctionType::ARM_InOut)
1767      FuncAttrs.addAttribute("aarch64_inout_za");
1768  
1769    // ZT0
1770    if (FunctionType::getArmZT0State(SMEBits) == FunctionType::ARM_Preserves)
1771      FuncAttrs.addAttribute("aarch64_preserves_zt0");
1772    if (FunctionType::getArmZT0State(SMEBits) == FunctionType::ARM_In)
1773      FuncAttrs.addAttribute("aarch64_in_zt0");
1774    if (FunctionType::getArmZT0State(SMEBits) == FunctionType::ARM_Out)
1775      FuncAttrs.addAttribute("aarch64_out_zt0");
1776    if (FunctionType::getArmZT0State(SMEBits) == FunctionType::ARM_InOut)
1777      FuncAttrs.addAttribute("aarch64_inout_zt0");
1778  }
1779  
AddAttributesFromOMPAssumes(llvm::AttrBuilder & FuncAttrs,const Decl * Callee)1780  static void AddAttributesFromOMPAssumes(llvm::AttrBuilder &FuncAttrs,
1781                                          const Decl *Callee) {
1782    if (!Callee)
1783      return;
1784  
1785    SmallVector<StringRef, 4> Attrs;
1786  
1787    for (const OMPAssumeAttr *AA : Callee->specific_attrs<OMPAssumeAttr>())
1788      AA->getAssumption().split(Attrs, ",");
1789  
1790    if (!Attrs.empty())
1791      FuncAttrs.addAttribute(llvm::AssumptionAttrKey,
1792                             llvm::join(Attrs.begin(), Attrs.end(), ","));
1793  }
1794  
MayDropFunctionReturn(const ASTContext & Context,QualType ReturnType) const1795  bool CodeGenModule::MayDropFunctionReturn(const ASTContext &Context,
1796                                            QualType ReturnType) const {
1797    // We can't just discard the return value for a record type with a
1798    // complex destructor or a non-trivially copyable type.
1799    if (const RecordType *RT =
1800            ReturnType.getCanonicalType()->getAs<RecordType>()) {
1801      if (const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl()))
1802        return ClassDecl->hasTrivialDestructor();
1803    }
1804    return ReturnType.isTriviallyCopyableType(Context);
1805  }
1806  
HasStrictReturn(const CodeGenModule & Module,QualType RetTy,const Decl * TargetDecl)1807  static bool HasStrictReturn(const CodeGenModule &Module, QualType RetTy,
1808                              const Decl *TargetDecl) {
1809    // As-is msan can not tolerate noundef mismatch between caller and
1810    // implementation. Mismatch is possible for e.g. indirect calls from C-caller
1811    // into C++. Such mismatches lead to confusing false reports. To avoid
1812    // expensive workaround on msan we enforce initialization event in uncommon
1813    // cases where it's allowed.
1814    if (Module.getLangOpts().Sanitize.has(SanitizerKind::Memory))
1815      return true;
1816    // C++ explicitly makes returning undefined values UB. C's rule only applies
1817    // to used values, so we never mark them noundef for now.
1818    if (!Module.getLangOpts().CPlusPlus)
1819      return false;
1820    if (TargetDecl) {
1821      if (const FunctionDecl *FDecl = dyn_cast<FunctionDecl>(TargetDecl)) {
1822        if (FDecl->isExternC())
1823          return false;
1824      } else if (const VarDecl *VDecl = dyn_cast<VarDecl>(TargetDecl)) {
1825        // Function pointer.
1826        if (VDecl->isExternC())
1827          return false;
1828      }
1829    }
1830  
1831    // We don't want to be too aggressive with the return checking, unless
1832    // it's explicit in the code opts or we're using an appropriate sanitizer.
1833    // Try to respect what the programmer intended.
1834    return Module.getCodeGenOpts().StrictReturn ||
1835           !Module.MayDropFunctionReturn(Module.getContext(), RetTy) ||
1836           Module.getLangOpts().Sanitize.has(SanitizerKind::Return);
1837  }
1838  
1839  /// Add denormal-fp-math and denormal-fp-math-f32 as appropriate for the
1840  /// requested denormal behavior, accounting for the overriding behavior of the
1841  /// -f32 case.
addDenormalModeAttrs(llvm::DenormalMode FPDenormalMode,llvm::DenormalMode FP32DenormalMode,llvm::AttrBuilder & FuncAttrs)1842  static void addDenormalModeAttrs(llvm::DenormalMode FPDenormalMode,
1843                                   llvm::DenormalMode FP32DenormalMode,
1844                                   llvm::AttrBuilder &FuncAttrs) {
1845    if (FPDenormalMode != llvm::DenormalMode::getDefault())
1846      FuncAttrs.addAttribute("denormal-fp-math", FPDenormalMode.str());
1847  
1848    if (FP32DenormalMode != FPDenormalMode && FP32DenormalMode.isValid())
1849      FuncAttrs.addAttribute("denormal-fp-math-f32", FP32DenormalMode.str());
1850  }
1851  
1852  /// Add default attributes to a function, which have merge semantics under
1853  /// -mlink-builtin-bitcode and should not simply overwrite any existing
1854  /// attributes in the linked library.
1855  static void
addMergableDefaultFunctionAttributes(const CodeGenOptions & CodeGenOpts,llvm::AttrBuilder & FuncAttrs)1856  addMergableDefaultFunctionAttributes(const CodeGenOptions &CodeGenOpts,
1857                                       llvm::AttrBuilder &FuncAttrs) {
1858    addDenormalModeAttrs(CodeGenOpts.FPDenormalMode, CodeGenOpts.FP32DenormalMode,
1859                         FuncAttrs);
1860  }
1861  
getTrivialDefaultFunctionAttributes(StringRef Name,bool HasOptnone,const CodeGenOptions & CodeGenOpts,const LangOptions & LangOpts,bool AttrOnCallSite,llvm::AttrBuilder & FuncAttrs)1862  static void getTrivialDefaultFunctionAttributes(
1863      StringRef Name, bool HasOptnone, const CodeGenOptions &CodeGenOpts,
1864      const LangOptions &LangOpts, bool AttrOnCallSite,
1865      llvm::AttrBuilder &FuncAttrs) {
1866    // OptimizeNoneAttr takes precedence over -Os or -Oz. No warning needed.
1867    if (!HasOptnone) {
1868      if (CodeGenOpts.OptimizeSize)
1869        FuncAttrs.addAttribute(llvm::Attribute::OptimizeForSize);
1870      if (CodeGenOpts.OptimizeSize == 2)
1871        FuncAttrs.addAttribute(llvm::Attribute::MinSize);
1872    }
1873  
1874    if (CodeGenOpts.DisableRedZone)
1875      FuncAttrs.addAttribute(llvm::Attribute::NoRedZone);
1876    if (CodeGenOpts.IndirectTlsSegRefs)
1877      FuncAttrs.addAttribute("indirect-tls-seg-refs");
1878    if (CodeGenOpts.NoImplicitFloat)
1879      FuncAttrs.addAttribute(llvm::Attribute::NoImplicitFloat);
1880  
1881    if (AttrOnCallSite) {
1882      // Attributes that should go on the call site only.
1883      // FIXME: Look for 'BuiltinAttr' on the function rather than re-checking
1884      // the -fno-builtin-foo list.
1885      if (!CodeGenOpts.SimplifyLibCalls || LangOpts.isNoBuiltinFunc(Name))
1886        FuncAttrs.addAttribute(llvm::Attribute::NoBuiltin);
1887      if (!CodeGenOpts.TrapFuncName.empty())
1888        FuncAttrs.addAttribute("trap-func-name", CodeGenOpts.TrapFuncName);
1889    } else {
1890      switch (CodeGenOpts.getFramePointer()) {
1891      case CodeGenOptions::FramePointerKind::None:
1892        // This is the default behavior.
1893        break;
1894      case CodeGenOptions::FramePointerKind::Reserved:
1895      case CodeGenOptions::FramePointerKind::NonLeaf:
1896      case CodeGenOptions::FramePointerKind::All:
1897        FuncAttrs.addAttribute("frame-pointer",
1898                               CodeGenOptions::getFramePointerKindName(
1899                                   CodeGenOpts.getFramePointer()));
1900      }
1901  
1902      if (CodeGenOpts.LessPreciseFPMAD)
1903        FuncAttrs.addAttribute("less-precise-fpmad", "true");
1904  
1905      if (CodeGenOpts.NullPointerIsValid)
1906        FuncAttrs.addAttribute(llvm::Attribute::NullPointerIsValid);
1907  
1908      if (LangOpts.getDefaultExceptionMode() == LangOptions::FPE_Ignore)
1909        FuncAttrs.addAttribute("no-trapping-math", "true");
1910  
1911      // TODO: Are these all needed?
1912      // unsafe/inf/nan/nsz are handled by instruction-level FastMathFlags.
1913      if (LangOpts.NoHonorInfs)
1914        FuncAttrs.addAttribute("no-infs-fp-math", "true");
1915      if (LangOpts.NoHonorNaNs)
1916        FuncAttrs.addAttribute("no-nans-fp-math", "true");
1917      if (LangOpts.ApproxFunc)
1918        FuncAttrs.addAttribute("approx-func-fp-math", "true");
1919      if (LangOpts.AllowFPReassoc && LangOpts.AllowRecip &&
1920          LangOpts.NoSignedZero && LangOpts.ApproxFunc &&
1921          (LangOpts.getDefaultFPContractMode() ==
1922               LangOptions::FPModeKind::FPM_Fast ||
1923           LangOpts.getDefaultFPContractMode() ==
1924               LangOptions::FPModeKind::FPM_FastHonorPragmas))
1925        FuncAttrs.addAttribute("unsafe-fp-math", "true");
1926      if (CodeGenOpts.SoftFloat)
1927        FuncAttrs.addAttribute("use-soft-float", "true");
1928      FuncAttrs.addAttribute("stack-protector-buffer-size",
1929                             llvm::utostr(CodeGenOpts.SSPBufferSize));
1930      if (LangOpts.NoSignedZero)
1931        FuncAttrs.addAttribute("no-signed-zeros-fp-math", "true");
1932  
1933      // TODO: Reciprocal estimate codegen options should apply to instructions?
1934      const std::vector<std::string> &Recips = CodeGenOpts.Reciprocals;
1935      if (!Recips.empty())
1936        FuncAttrs.addAttribute("reciprocal-estimates",
1937                               llvm::join(Recips, ","));
1938  
1939      if (!CodeGenOpts.PreferVectorWidth.empty() &&
1940          CodeGenOpts.PreferVectorWidth != "none")
1941        FuncAttrs.addAttribute("prefer-vector-width",
1942                               CodeGenOpts.PreferVectorWidth);
1943  
1944      if (CodeGenOpts.StackRealignment)
1945        FuncAttrs.addAttribute("stackrealign");
1946      if (CodeGenOpts.Backchain)
1947        FuncAttrs.addAttribute("backchain");
1948      if (CodeGenOpts.EnableSegmentedStacks)
1949        FuncAttrs.addAttribute("split-stack");
1950  
1951      if (CodeGenOpts.SpeculativeLoadHardening)
1952        FuncAttrs.addAttribute(llvm::Attribute::SpeculativeLoadHardening);
1953  
1954      // Add zero-call-used-regs attribute.
1955      switch (CodeGenOpts.getZeroCallUsedRegs()) {
1956      case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::Skip:
1957        FuncAttrs.removeAttribute("zero-call-used-regs");
1958        break;
1959      case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::UsedGPRArg:
1960        FuncAttrs.addAttribute("zero-call-used-regs", "used-gpr-arg");
1961        break;
1962      case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::UsedGPR:
1963        FuncAttrs.addAttribute("zero-call-used-regs", "used-gpr");
1964        break;
1965      case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::UsedArg:
1966        FuncAttrs.addAttribute("zero-call-used-regs", "used-arg");
1967        break;
1968      case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::Used:
1969        FuncAttrs.addAttribute("zero-call-used-regs", "used");
1970        break;
1971      case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::AllGPRArg:
1972        FuncAttrs.addAttribute("zero-call-used-regs", "all-gpr-arg");
1973        break;
1974      case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::AllGPR:
1975        FuncAttrs.addAttribute("zero-call-used-regs", "all-gpr");
1976        break;
1977      case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::AllArg:
1978        FuncAttrs.addAttribute("zero-call-used-regs", "all-arg");
1979        break;
1980      case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::All:
1981        FuncAttrs.addAttribute("zero-call-used-regs", "all");
1982        break;
1983      }
1984    }
1985  
1986    if (LangOpts.assumeFunctionsAreConvergent()) {
1987      // Conservatively, mark all functions and calls in CUDA and OpenCL as
1988      // convergent (meaning, they may call an intrinsically convergent op, such
1989      // as __syncthreads() / barrier(), and so can't have certain optimizations
1990      // applied around them).  LLVM will remove this attribute where it safely
1991      // can.
1992      FuncAttrs.addAttribute(llvm::Attribute::Convergent);
1993    }
1994  
1995    // TODO: NoUnwind attribute should be added for other GPU modes HIP,
1996    // OpenMP offload. AFAIK, neither of them support exceptions in device code.
1997    if ((LangOpts.CUDA && LangOpts.CUDAIsDevice) || LangOpts.OpenCL ||
1998        LangOpts.SYCLIsDevice) {
1999      FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2000    }
2001  
2002    for (StringRef Attr : CodeGenOpts.DefaultFunctionAttrs) {
2003      StringRef Var, Value;
2004      std::tie(Var, Value) = Attr.split('=');
2005      FuncAttrs.addAttribute(Var, Value);
2006    }
2007  
2008    TargetInfo::BranchProtectionInfo BPI(LangOpts);
2009    TargetCodeGenInfo::initBranchProtectionFnAttributes(BPI, FuncAttrs);
2010  }
2011  
2012  /// Merges `target-features` from \TargetOpts and \F, and sets the result in
2013  /// \FuncAttr
2014  /// * features from \F are always kept
2015  /// * a feature from \TargetOpts is kept if itself and its opposite are absent
2016  /// from \F
2017  static void
overrideFunctionFeaturesWithTargetFeatures(llvm::AttrBuilder & FuncAttr,const llvm::Function & F,const TargetOptions & TargetOpts)2018  overrideFunctionFeaturesWithTargetFeatures(llvm::AttrBuilder &FuncAttr,
2019                                             const llvm::Function &F,
2020                                             const TargetOptions &TargetOpts) {
2021    auto FFeatures = F.getFnAttribute("target-features");
2022  
2023    llvm::StringSet<> MergedNames;
2024    SmallVector<StringRef> MergedFeatures;
2025    MergedFeatures.reserve(TargetOpts.Features.size());
2026  
2027    auto AddUnmergedFeatures = [&](auto &&FeatureRange) {
2028      for (StringRef Feature : FeatureRange) {
2029        if (Feature.empty())
2030          continue;
2031        assert(Feature[0] == '+' || Feature[0] == '-');
2032        StringRef Name = Feature.drop_front(1);
2033        bool Merged = !MergedNames.insert(Name).second;
2034        if (!Merged)
2035          MergedFeatures.push_back(Feature);
2036      }
2037    };
2038  
2039    if (FFeatures.isValid())
2040      AddUnmergedFeatures(llvm::split(FFeatures.getValueAsString(), ','));
2041    AddUnmergedFeatures(TargetOpts.Features);
2042  
2043    if (!MergedFeatures.empty()) {
2044      llvm::sort(MergedFeatures);
2045      FuncAttr.addAttribute("target-features", llvm::join(MergedFeatures, ","));
2046    }
2047  }
2048  
mergeDefaultFunctionDefinitionAttributes(llvm::Function & F,const CodeGenOptions & CodeGenOpts,const LangOptions & LangOpts,const TargetOptions & TargetOpts,bool WillInternalize)2049  void CodeGen::mergeDefaultFunctionDefinitionAttributes(
2050      llvm::Function &F, const CodeGenOptions &CodeGenOpts,
2051      const LangOptions &LangOpts, const TargetOptions &TargetOpts,
2052      bool WillInternalize) {
2053  
2054    llvm::AttrBuilder FuncAttrs(F.getContext());
2055    // Here we only extract the options that are relevant compared to the version
2056    // from GetCPUAndFeaturesAttributes.
2057    if (!TargetOpts.CPU.empty())
2058      FuncAttrs.addAttribute("target-cpu", TargetOpts.CPU);
2059    if (!TargetOpts.TuneCPU.empty())
2060      FuncAttrs.addAttribute("tune-cpu", TargetOpts.TuneCPU);
2061  
2062    ::getTrivialDefaultFunctionAttributes(F.getName(), F.hasOptNone(),
2063                                          CodeGenOpts, LangOpts,
2064                                          /*AttrOnCallSite=*/false, FuncAttrs);
2065  
2066    if (!WillInternalize && F.isInterposable()) {
2067      // Do not promote "dynamic" denormal-fp-math to this translation unit's
2068      // setting for weak functions that won't be internalized. The user has no
2069      // real control for how builtin bitcode is linked, so we shouldn't assume
2070      // later copies will use a consistent mode.
2071      F.addFnAttrs(FuncAttrs);
2072      return;
2073    }
2074  
2075    llvm::AttributeMask AttrsToRemove;
2076  
2077    llvm::DenormalMode DenormModeToMerge = F.getDenormalModeRaw();
2078    llvm::DenormalMode DenormModeToMergeF32 = F.getDenormalModeF32Raw();
2079    llvm::DenormalMode Merged =
2080        CodeGenOpts.FPDenormalMode.mergeCalleeMode(DenormModeToMerge);
2081    llvm::DenormalMode MergedF32 = CodeGenOpts.FP32DenormalMode;
2082  
2083    if (DenormModeToMergeF32.isValid()) {
2084      MergedF32 =
2085          CodeGenOpts.FP32DenormalMode.mergeCalleeMode(DenormModeToMergeF32);
2086    }
2087  
2088    if (Merged == llvm::DenormalMode::getDefault()) {
2089      AttrsToRemove.addAttribute("denormal-fp-math");
2090    } else if (Merged != DenormModeToMerge) {
2091      // Overwrite existing attribute
2092      FuncAttrs.addAttribute("denormal-fp-math",
2093                             CodeGenOpts.FPDenormalMode.str());
2094    }
2095  
2096    if (MergedF32 == llvm::DenormalMode::getDefault()) {
2097      AttrsToRemove.addAttribute("denormal-fp-math-f32");
2098    } else if (MergedF32 != DenormModeToMergeF32) {
2099      // Overwrite existing attribute
2100      FuncAttrs.addAttribute("denormal-fp-math-f32",
2101                             CodeGenOpts.FP32DenormalMode.str());
2102    }
2103  
2104    F.removeFnAttrs(AttrsToRemove);
2105    addDenormalModeAttrs(Merged, MergedF32, FuncAttrs);
2106  
2107    overrideFunctionFeaturesWithTargetFeatures(FuncAttrs, F, TargetOpts);
2108  
2109    F.addFnAttrs(FuncAttrs);
2110  }
2111  
getTrivialDefaultFunctionAttributes(StringRef Name,bool HasOptnone,bool AttrOnCallSite,llvm::AttrBuilder & FuncAttrs)2112  void CodeGenModule::getTrivialDefaultFunctionAttributes(
2113      StringRef Name, bool HasOptnone, bool AttrOnCallSite,
2114      llvm::AttrBuilder &FuncAttrs) {
2115    ::getTrivialDefaultFunctionAttributes(Name, HasOptnone, getCodeGenOpts(),
2116                                          getLangOpts(), AttrOnCallSite,
2117                                          FuncAttrs);
2118  }
2119  
getDefaultFunctionAttributes(StringRef Name,bool HasOptnone,bool AttrOnCallSite,llvm::AttrBuilder & FuncAttrs)2120  void CodeGenModule::getDefaultFunctionAttributes(StringRef Name,
2121                                                   bool HasOptnone,
2122                                                   bool AttrOnCallSite,
2123                                                   llvm::AttrBuilder &FuncAttrs) {
2124    getTrivialDefaultFunctionAttributes(Name, HasOptnone, AttrOnCallSite,
2125                                        FuncAttrs);
2126    // If we're just getting the default, get the default values for mergeable
2127    // attributes.
2128    if (!AttrOnCallSite)
2129      addMergableDefaultFunctionAttributes(CodeGenOpts, FuncAttrs);
2130  }
2131  
addDefaultFunctionDefinitionAttributes(llvm::AttrBuilder & attrs)2132  void CodeGenModule::addDefaultFunctionDefinitionAttributes(
2133      llvm::AttrBuilder &attrs) {
2134    getDefaultFunctionAttributes(/*function name*/ "", /*optnone*/ false,
2135                                 /*for call*/ false, attrs);
2136    GetCPUAndFeaturesAttributes(GlobalDecl(), attrs);
2137  }
2138  
addNoBuiltinAttributes(llvm::AttrBuilder & FuncAttrs,const LangOptions & LangOpts,const NoBuiltinAttr * NBA=nullptr)2139  static void addNoBuiltinAttributes(llvm::AttrBuilder &FuncAttrs,
2140                                     const LangOptions &LangOpts,
2141                                     const NoBuiltinAttr *NBA = nullptr) {
2142    auto AddNoBuiltinAttr = [&FuncAttrs](StringRef BuiltinName) {
2143      SmallString<32> AttributeName;
2144      AttributeName += "no-builtin-";
2145      AttributeName += BuiltinName;
2146      FuncAttrs.addAttribute(AttributeName);
2147    };
2148  
2149    // First, handle the language options passed through -fno-builtin.
2150    if (LangOpts.NoBuiltin) {
2151      // -fno-builtin disables them all.
2152      FuncAttrs.addAttribute("no-builtins");
2153      return;
2154    }
2155  
2156    // Then, add attributes for builtins specified through -fno-builtin-<name>.
2157    llvm::for_each(LangOpts.NoBuiltinFuncs, AddNoBuiltinAttr);
2158  
2159    // Now, let's check the __attribute__((no_builtin("...")) attribute added to
2160    // the source.
2161    if (!NBA)
2162      return;
2163  
2164    // If there is a wildcard in the builtin names specified through the
2165    // attribute, disable them all.
2166    if (llvm::is_contained(NBA->builtinNames(), "*")) {
2167      FuncAttrs.addAttribute("no-builtins");
2168      return;
2169    }
2170  
2171    // And last, add the rest of the builtin names.
2172    llvm::for_each(NBA->builtinNames(), AddNoBuiltinAttr);
2173  }
2174  
DetermineNoUndef(QualType QTy,CodeGenTypes & Types,const llvm::DataLayout & DL,const ABIArgInfo & AI,bool CheckCoerce=true)2175  static bool DetermineNoUndef(QualType QTy, CodeGenTypes &Types,
2176                               const llvm::DataLayout &DL, const ABIArgInfo &AI,
2177                               bool CheckCoerce = true) {
2178    llvm::Type *Ty = Types.ConvertTypeForMem(QTy);
2179    if (AI.getKind() == ABIArgInfo::Indirect ||
2180        AI.getKind() == ABIArgInfo::IndirectAliased)
2181      return true;
2182    if (AI.getKind() == ABIArgInfo::Extend)
2183      return true;
2184    if (!DL.typeSizeEqualsStoreSize(Ty))
2185      // TODO: This will result in a modest amount of values not marked noundef
2186      // when they could be. We care about values that *invisibly* contain undef
2187      // bits from the perspective of LLVM IR.
2188      return false;
2189    if (CheckCoerce && AI.canHaveCoerceToType()) {
2190      llvm::Type *CoerceTy = AI.getCoerceToType();
2191      if (llvm::TypeSize::isKnownGT(DL.getTypeSizeInBits(CoerceTy),
2192                                    DL.getTypeSizeInBits(Ty)))
2193        // If we're coercing to a type with a greater size than the canonical one,
2194        // we're introducing new undef bits.
2195        // Coercing to a type of smaller or equal size is ok, as we know that
2196        // there's no internal padding (typeSizeEqualsStoreSize).
2197        return false;
2198    }
2199    if (QTy->isBitIntType())
2200      return true;
2201    if (QTy->isReferenceType())
2202      return true;
2203    if (QTy->isNullPtrType())
2204      return false;
2205    if (QTy->isMemberPointerType())
2206      // TODO: Some member pointers are `noundef`, but it depends on the ABI. For
2207      // now, never mark them.
2208      return false;
2209    if (QTy->isScalarType()) {
2210      if (const ComplexType *Complex = dyn_cast<ComplexType>(QTy))
2211        return DetermineNoUndef(Complex->getElementType(), Types, DL, AI, false);
2212      return true;
2213    }
2214    if (const VectorType *Vector = dyn_cast<VectorType>(QTy))
2215      return DetermineNoUndef(Vector->getElementType(), Types, DL, AI, false);
2216    if (const MatrixType *Matrix = dyn_cast<MatrixType>(QTy))
2217      return DetermineNoUndef(Matrix->getElementType(), Types, DL, AI, false);
2218    if (const ArrayType *Array = dyn_cast<ArrayType>(QTy))
2219      return DetermineNoUndef(Array->getElementType(), Types, DL, AI, false);
2220  
2221    // TODO: Some structs may be `noundef`, in specific situations.
2222    return false;
2223  }
2224  
2225  /// Check if the argument of a function has maybe_undef attribute.
IsArgumentMaybeUndef(const Decl * TargetDecl,unsigned NumRequiredArgs,unsigned ArgNo)2226  static bool IsArgumentMaybeUndef(const Decl *TargetDecl,
2227                                   unsigned NumRequiredArgs, unsigned ArgNo) {
2228    const auto *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl);
2229    if (!FD)
2230      return false;
2231  
2232    // Assume variadic arguments do not have maybe_undef attribute.
2233    if (ArgNo >= NumRequiredArgs)
2234      return false;
2235  
2236    // Check if argument has maybe_undef attribute.
2237    if (ArgNo < FD->getNumParams()) {
2238      const ParmVarDecl *Param = FD->getParamDecl(ArgNo);
2239      if (Param && Param->hasAttr<MaybeUndefAttr>())
2240        return true;
2241    }
2242  
2243    return false;
2244  }
2245  
2246  /// Test if it's legal to apply nofpclass for the given parameter type and it's
2247  /// lowered IR type.
canApplyNoFPClass(const ABIArgInfo & AI,QualType ParamType,bool IsReturn)2248  static bool canApplyNoFPClass(const ABIArgInfo &AI, QualType ParamType,
2249                                bool IsReturn) {
2250    // Should only apply to FP types in the source, not ABI promoted.
2251    if (!ParamType->hasFloatingRepresentation())
2252      return false;
2253  
2254    // The promoted-to IR type also needs to support nofpclass.
2255    llvm::Type *IRTy = AI.getCoerceToType();
2256    if (llvm::AttributeFuncs::isNoFPClassCompatibleType(IRTy))
2257      return true;
2258  
2259    if (llvm::StructType *ST = dyn_cast<llvm::StructType>(IRTy)) {
2260      return !IsReturn && AI.getCanBeFlattened() &&
2261             llvm::all_of(ST->elements(), [](llvm::Type *Ty) {
2262               return llvm::AttributeFuncs::isNoFPClassCompatibleType(Ty);
2263             });
2264    }
2265  
2266    return false;
2267  }
2268  
2269  /// Return the nofpclass mask that can be applied to floating-point parameters.
getNoFPClassTestMask(const LangOptions & LangOpts)2270  static llvm::FPClassTest getNoFPClassTestMask(const LangOptions &LangOpts) {
2271    llvm::FPClassTest Mask = llvm::fcNone;
2272    if (LangOpts.NoHonorInfs)
2273      Mask |= llvm::fcInf;
2274    if (LangOpts.NoHonorNaNs)
2275      Mask |= llvm::fcNan;
2276    return Mask;
2277  }
2278  
AdjustMemoryAttribute(StringRef Name,CGCalleeInfo CalleeInfo,llvm::AttributeList & Attrs)2279  void CodeGenModule::AdjustMemoryAttribute(StringRef Name,
2280                                            CGCalleeInfo CalleeInfo,
2281                                            llvm::AttributeList &Attrs) {
2282    if (Attrs.getMemoryEffects().getModRef() == llvm::ModRefInfo::NoModRef) {
2283      Attrs = Attrs.removeFnAttribute(getLLVMContext(), llvm::Attribute::Memory);
2284      llvm::Attribute MemoryAttr = llvm::Attribute::getWithMemoryEffects(
2285          getLLVMContext(), llvm::MemoryEffects::writeOnly());
2286      Attrs = Attrs.addFnAttribute(getLLVMContext(), MemoryAttr);
2287    }
2288  }
2289  
2290  /// Construct the IR attribute list of a function or call.
2291  ///
2292  /// When adding an attribute, please consider where it should be handled:
2293  ///
2294  ///   - getDefaultFunctionAttributes is for attributes that are essentially
2295  ///     part of the global target configuration (but perhaps can be
2296  ///     overridden on a per-function basis).  Adding attributes there
2297  ///     will cause them to also be set in frontends that build on Clang's
2298  ///     target-configuration logic, as well as for code defined in library
2299  ///     modules such as CUDA's libdevice.
2300  ///
2301  ///   - ConstructAttributeList builds on top of getDefaultFunctionAttributes
2302  ///     and adds declaration-specific, convention-specific, and
2303  ///     frontend-specific logic.  The last is of particular importance:
2304  ///     attributes that restrict how the frontend generates code must be
2305  ///     added here rather than getDefaultFunctionAttributes.
2306  ///
ConstructAttributeList(StringRef Name,const CGFunctionInfo & FI,CGCalleeInfo CalleeInfo,llvm::AttributeList & AttrList,unsigned & CallingConv,bool AttrOnCallSite,bool IsThunk)2307  void CodeGenModule::ConstructAttributeList(StringRef Name,
2308                                             const CGFunctionInfo &FI,
2309                                             CGCalleeInfo CalleeInfo,
2310                                             llvm::AttributeList &AttrList,
2311                                             unsigned &CallingConv,
2312                                             bool AttrOnCallSite, bool IsThunk) {
2313    llvm::AttrBuilder FuncAttrs(getLLVMContext());
2314    llvm::AttrBuilder RetAttrs(getLLVMContext());
2315  
2316    // Collect function IR attributes from the CC lowering.
2317    // We'll collect the paramete and result attributes later.
2318    CallingConv = FI.getEffectiveCallingConvention();
2319    if (FI.isNoReturn())
2320      FuncAttrs.addAttribute(llvm::Attribute::NoReturn);
2321    if (FI.isCmseNSCall())
2322      FuncAttrs.addAttribute("cmse_nonsecure_call");
2323  
2324    // Collect function IR attributes from the callee prototype if we have one.
2325    AddAttributesFromFunctionProtoType(getContext(), FuncAttrs,
2326                                       CalleeInfo.getCalleeFunctionProtoType());
2327  
2328    const Decl *TargetDecl = CalleeInfo.getCalleeDecl().getDecl();
2329  
2330    // Attach assumption attributes to the declaration. If this is a call
2331    // site, attach assumptions from the caller to the call as well.
2332    AddAttributesFromOMPAssumes(FuncAttrs, TargetDecl);
2333  
2334    bool HasOptnone = false;
2335    // The NoBuiltinAttr attached to the target FunctionDecl.
2336    const NoBuiltinAttr *NBA = nullptr;
2337  
2338    // Some ABIs may result in additional accesses to arguments that may
2339    // otherwise not be present.
2340    auto AddPotentialArgAccess = [&]() {
2341      llvm::Attribute A = FuncAttrs.getAttribute(llvm::Attribute::Memory);
2342      if (A.isValid())
2343        FuncAttrs.addMemoryAttr(A.getMemoryEffects() |
2344                                llvm::MemoryEffects::argMemOnly());
2345    };
2346  
2347    // Collect function IR attributes based on declaration-specific
2348    // information.
2349    // FIXME: handle sseregparm someday...
2350    if (TargetDecl) {
2351      if (TargetDecl->hasAttr<ReturnsTwiceAttr>())
2352        FuncAttrs.addAttribute(llvm::Attribute::ReturnsTwice);
2353      if (TargetDecl->hasAttr<NoThrowAttr>())
2354        FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2355      if (TargetDecl->hasAttr<NoReturnAttr>())
2356        FuncAttrs.addAttribute(llvm::Attribute::NoReturn);
2357      if (TargetDecl->hasAttr<ColdAttr>())
2358        FuncAttrs.addAttribute(llvm::Attribute::Cold);
2359      if (TargetDecl->hasAttr<HotAttr>())
2360        FuncAttrs.addAttribute(llvm::Attribute::Hot);
2361      if (TargetDecl->hasAttr<NoDuplicateAttr>())
2362        FuncAttrs.addAttribute(llvm::Attribute::NoDuplicate);
2363      if (TargetDecl->hasAttr<ConvergentAttr>())
2364        FuncAttrs.addAttribute(llvm::Attribute::Convergent);
2365  
2366      if (const FunctionDecl *Fn = dyn_cast<FunctionDecl>(TargetDecl)) {
2367        AddAttributesFromFunctionProtoType(
2368            getContext(), FuncAttrs, Fn->getType()->getAs<FunctionProtoType>());
2369        if (AttrOnCallSite && Fn->isReplaceableGlobalAllocationFunction()) {
2370          // A sane operator new returns a non-aliasing pointer.
2371          auto Kind = Fn->getDeclName().getCXXOverloadedOperator();
2372          if (getCodeGenOpts().AssumeSaneOperatorNew &&
2373              (Kind == OO_New || Kind == OO_Array_New))
2374            RetAttrs.addAttribute(llvm::Attribute::NoAlias);
2375        }
2376        const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(Fn);
2377        const bool IsVirtualCall = MD && MD->isVirtual();
2378        // Don't use [[noreturn]], _Noreturn or [[no_builtin]] for a call to a
2379        // virtual function. These attributes are not inherited by overloads.
2380        if (!(AttrOnCallSite && IsVirtualCall)) {
2381          if (Fn->isNoReturn())
2382            FuncAttrs.addAttribute(llvm::Attribute::NoReturn);
2383          NBA = Fn->getAttr<NoBuiltinAttr>();
2384        }
2385      }
2386  
2387      if (isa<FunctionDecl>(TargetDecl) || isa<VarDecl>(TargetDecl)) {
2388        // Only place nomerge attribute on call sites, never functions. This
2389        // allows it to work on indirect virtual function calls.
2390        if (AttrOnCallSite && TargetDecl->hasAttr<NoMergeAttr>())
2391          FuncAttrs.addAttribute(llvm::Attribute::NoMerge);
2392      }
2393  
2394      // 'const', 'pure' and 'noalias' attributed functions are also nounwind.
2395      if (TargetDecl->hasAttr<ConstAttr>()) {
2396        FuncAttrs.addMemoryAttr(llvm::MemoryEffects::none());
2397        FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2398        // gcc specifies that 'const' functions have greater restrictions than
2399        // 'pure' functions, so they also cannot have infinite loops.
2400        FuncAttrs.addAttribute(llvm::Attribute::WillReturn);
2401      } else if (TargetDecl->hasAttr<PureAttr>()) {
2402        FuncAttrs.addMemoryAttr(llvm::MemoryEffects::readOnly());
2403        FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2404        // gcc specifies that 'pure' functions cannot have infinite loops.
2405        FuncAttrs.addAttribute(llvm::Attribute::WillReturn);
2406      } else if (TargetDecl->hasAttr<NoAliasAttr>()) {
2407        FuncAttrs.addMemoryAttr(llvm::MemoryEffects::inaccessibleOrArgMemOnly());
2408        FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
2409      }
2410      if (TargetDecl->hasAttr<RestrictAttr>())
2411        RetAttrs.addAttribute(llvm::Attribute::NoAlias);
2412      if (TargetDecl->hasAttr<ReturnsNonNullAttr>() &&
2413          !CodeGenOpts.NullPointerIsValid)
2414        RetAttrs.addAttribute(llvm::Attribute::NonNull);
2415      if (TargetDecl->hasAttr<AnyX86NoCallerSavedRegistersAttr>())
2416        FuncAttrs.addAttribute("no_caller_saved_registers");
2417      if (TargetDecl->hasAttr<AnyX86NoCfCheckAttr>())
2418        FuncAttrs.addAttribute(llvm::Attribute::NoCfCheck);
2419      if (TargetDecl->hasAttr<LeafAttr>())
2420        FuncAttrs.addAttribute(llvm::Attribute::NoCallback);
2421  
2422      HasOptnone = TargetDecl->hasAttr<OptimizeNoneAttr>();
2423      if (auto *AllocSize = TargetDecl->getAttr<AllocSizeAttr>()) {
2424        std::optional<unsigned> NumElemsParam;
2425        if (AllocSize->getNumElemsParam().isValid())
2426          NumElemsParam = AllocSize->getNumElemsParam().getLLVMIndex();
2427        FuncAttrs.addAllocSizeAttr(AllocSize->getElemSizeParam().getLLVMIndex(),
2428                                   NumElemsParam);
2429      }
2430  
2431      if (TargetDecl->hasAttr<OpenCLKernelAttr>()) {
2432        if (getLangOpts().OpenCLVersion <= 120) {
2433          // OpenCL v1.2 Work groups are always uniform
2434          FuncAttrs.addAttribute("uniform-work-group-size", "true");
2435        } else {
2436          // OpenCL v2.0 Work groups may be whether uniform or not.
2437          // '-cl-uniform-work-group-size' compile option gets a hint
2438          // to the compiler that the global work-size be a multiple of
2439          // the work-group size specified to clEnqueueNDRangeKernel
2440          // (i.e. work groups are uniform).
2441          FuncAttrs.addAttribute(
2442              "uniform-work-group-size",
2443              llvm::toStringRef(getLangOpts().OffloadUniformBlock));
2444        }
2445      }
2446  
2447      if (TargetDecl->hasAttr<CUDAGlobalAttr>() &&
2448          getLangOpts().OffloadUniformBlock)
2449        FuncAttrs.addAttribute("uniform-work-group-size", "true");
2450  
2451      if (TargetDecl->hasAttr<ArmLocallyStreamingAttr>())
2452        FuncAttrs.addAttribute("aarch64_pstate_sm_body");
2453    }
2454  
2455    // Attach "no-builtins" attributes to:
2456    // * call sites: both `nobuiltin` and "no-builtins" or "no-builtin-<name>".
2457    // * definitions: "no-builtins" or "no-builtin-<name>" only.
2458    // The attributes can come from:
2459    // * LangOpts: -ffreestanding, -fno-builtin, -fno-builtin-<name>
2460    // * FunctionDecl attributes: __attribute__((no_builtin(...)))
2461    addNoBuiltinAttributes(FuncAttrs, getLangOpts(), NBA);
2462  
2463    // Collect function IR attributes based on global settiings.
2464    getDefaultFunctionAttributes(Name, HasOptnone, AttrOnCallSite, FuncAttrs);
2465  
2466    // Override some default IR attributes based on declaration-specific
2467    // information.
2468    if (TargetDecl) {
2469      if (TargetDecl->hasAttr<NoSpeculativeLoadHardeningAttr>())
2470        FuncAttrs.removeAttribute(llvm::Attribute::SpeculativeLoadHardening);
2471      if (TargetDecl->hasAttr<SpeculativeLoadHardeningAttr>())
2472        FuncAttrs.addAttribute(llvm::Attribute::SpeculativeLoadHardening);
2473      if (TargetDecl->hasAttr<NoSplitStackAttr>())
2474        FuncAttrs.removeAttribute("split-stack");
2475      if (TargetDecl->hasAttr<ZeroCallUsedRegsAttr>()) {
2476        // A function "__attribute__((...))" overrides the command-line flag.
2477        auto Kind =
2478            TargetDecl->getAttr<ZeroCallUsedRegsAttr>()->getZeroCallUsedRegs();
2479        FuncAttrs.removeAttribute("zero-call-used-regs");
2480        FuncAttrs.addAttribute(
2481            "zero-call-used-regs",
2482            ZeroCallUsedRegsAttr::ConvertZeroCallUsedRegsKindToStr(Kind));
2483      }
2484  
2485      // Add NonLazyBind attribute to function declarations when -fno-plt
2486      // is used.
2487      // FIXME: what if we just haven't processed the function definition
2488      // yet, or if it's an external definition like C99 inline?
2489      if (CodeGenOpts.NoPLT) {
2490        if (auto *Fn = dyn_cast<FunctionDecl>(TargetDecl)) {
2491          if (!Fn->isDefined() && !AttrOnCallSite) {
2492            FuncAttrs.addAttribute(llvm::Attribute::NonLazyBind);
2493          }
2494        }
2495      }
2496    }
2497  
2498    // Add "sample-profile-suffix-elision-policy" attribute for internal linkage
2499    // functions with -funique-internal-linkage-names.
2500    if (TargetDecl && CodeGenOpts.UniqueInternalLinkageNames) {
2501      if (const auto *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl)) {
2502        if (!FD->isExternallyVisible())
2503          FuncAttrs.addAttribute("sample-profile-suffix-elision-policy",
2504                                 "selected");
2505      }
2506    }
2507  
2508    // Collect non-call-site function IR attributes from declaration-specific
2509    // information.
2510    if (!AttrOnCallSite) {
2511      if (TargetDecl && TargetDecl->hasAttr<CmseNSEntryAttr>())
2512        FuncAttrs.addAttribute("cmse_nonsecure_entry");
2513  
2514      // Whether tail calls are enabled.
2515      auto shouldDisableTailCalls = [&] {
2516        // Should this be honored in getDefaultFunctionAttributes?
2517        if (CodeGenOpts.DisableTailCalls)
2518          return true;
2519  
2520        if (!TargetDecl)
2521          return false;
2522  
2523        if (TargetDecl->hasAttr<DisableTailCallsAttr>() ||
2524            TargetDecl->hasAttr<AnyX86InterruptAttr>())
2525          return true;
2526  
2527        if (CodeGenOpts.NoEscapingBlockTailCalls) {
2528          if (const auto *BD = dyn_cast<BlockDecl>(TargetDecl))
2529            if (!BD->doesNotEscape())
2530              return true;
2531        }
2532  
2533        return false;
2534      };
2535      if (shouldDisableTailCalls())
2536        FuncAttrs.addAttribute("disable-tail-calls", "true");
2537  
2538      // CPU/feature overrides.  addDefaultFunctionDefinitionAttributes
2539      // handles these separately to set them based on the global defaults.
2540      GetCPUAndFeaturesAttributes(CalleeInfo.getCalleeDecl(), FuncAttrs);
2541    }
2542  
2543    // Collect attributes from arguments and return values.
2544    ClangToLLVMArgMapping IRFunctionArgs(getContext(), FI);
2545  
2546    QualType RetTy = FI.getReturnType();
2547    const ABIArgInfo &RetAI = FI.getReturnInfo();
2548    const llvm::DataLayout &DL = getDataLayout();
2549  
2550    // Determine if the return type could be partially undef
2551    if (CodeGenOpts.EnableNoundefAttrs &&
2552        HasStrictReturn(*this, RetTy, TargetDecl)) {
2553      if (!RetTy->isVoidType() && RetAI.getKind() != ABIArgInfo::Indirect &&
2554          DetermineNoUndef(RetTy, getTypes(), DL, RetAI))
2555        RetAttrs.addAttribute(llvm::Attribute::NoUndef);
2556    }
2557  
2558    switch (RetAI.getKind()) {
2559    case ABIArgInfo::Extend:
2560      if (RetAI.isSignExt())
2561        RetAttrs.addAttribute(llvm::Attribute::SExt);
2562      else
2563        RetAttrs.addAttribute(llvm::Attribute::ZExt);
2564      [[fallthrough]];
2565    case ABIArgInfo::Direct:
2566      if (RetAI.getInReg())
2567        RetAttrs.addAttribute(llvm::Attribute::InReg);
2568  
2569      if (canApplyNoFPClass(RetAI, RetTy, true))
2570        RetAttrs.addNoFPClassAttr(getNoFPClassTestMask(getLangOpts()));
2571  
2572      break;
2573    case ABIArgInfo::Ignore:
2574      break;
2575  
2576    case ABIArgInfo::InAlloca:
2577    case ABIArgInfo::Indirect: {
2578      // inalloca and sret disable readnone and readonly
2579      AddPotentialArgAccess();
2580      break;
2581    }
2582  
2583    case ABIArgInfo::CoerceAndExpand:
2584      break;
2585  
2586    case ABIArgInfo::Expand:
2587    case ABIArgInfo::IndirectAliased:
2588      llvm_unreachable("Invalid ABI kind for return argument");
2589    }
2590  
2591    if (!IsThunk) {
2592      // FIXME: fix this properly, https://reviews.llvm.org/D100388
2593      if (const auto *RefTy = RetTy->getAs<ReferenceType>()) {
2594        QualType PTy = RefTy->getPointeeType();
2595        if (!PTy->isIncompleteType() && PTy->isConstantSizeType())
2596          RetAttrs.addDereferenceableAttr(
2597              getMinimumObjectSize(PTy).getQuantity());
2598        if (getTypes().getTargetAddressSpace(PTy) == 0 &&
2599            !CodeGenOpts.NullPointerIsValid)
2600          RetAttrs.addAttribute(llvm::Attribute::NonNull);
2601        if (PTy->isObjectType()) {
2602          llvm::Align Alignment =
2603              getNaturalPointeeTypeAlignment(RetTy).getAsAlign();
2604          RetAttrs.addAlignmentAttr(Alignment);
2605        }
2606      }
2607    }
2608  
2609    bool hasUsedSRet = false;
2610    SmallVector<llvm::AttributeSet, 4> ArgAttrs(IRFunctionArgs.totalIRArgs());
2611  
2612    // Attach attributes to sret.
2613    if (IRFunctionArgs.hasSRetArg()) {
2614      llvm::AttrBuilder SRETAttrs(getLLVMContext());
2615      SRETAttrs.addStructRetAttr(getTypes().ConvertTypeForMem(RetTy));
2616      SRETAttrs.addAttribute(llvm::Attribute::Writable);
2617      SRETAttrs.addAttribute(llvm::Attribute::DeadOnUnwind);
2618      hasUsedSRet = true;
2619      if (RetAI.getInReg())
2620        SRETAttrs.addAttribute(llvm::Attribute::InReg);
2621      SRETAttrs.addAlignmentAttr(RetAI.getIndirectAlign().getQuantity());
2622      ArgAttrs[IRFunctionArgs.getSRetArgNo()] =
2623          llvm::AttributeSet::get(getLLVMContext(), SRETAttrs);
2624    }
2625  
2626    // Attach attributes to inalloca argument.
2627    if (IRFunctionArgs.hasInallocaArg()) {
2628      llvm::AttrBuilder Attrs(getLLVMContext());
2629      Attrs.addInAllocaAttr(FI.getArgStruct());
2630      ArgAttrs[IRFunctionArgs.getInallocaArgNo()] =
2631          llvm::AttributeSet::get(getLLVMContext(), Attrs);
2632    }
2633  
2634    // Apply `nonnull`, `dereferencable(N)` and `align N` to the `this` argument,
2635    // unless this is a thunk function.
2636    // FIXME: fix this properly, https://reviews.llvm.org/D100388
2637    if (FI.isInstanceMethod() && !IRFunctionArgs.hasInallocaArg() &&
2638        !FI.arg_begin()->type->isVoidPointerType() && !IsThunk) {
2639      auto IRArgs = IRFunctionArgs.getIRArgs(0);
2640  
2641      assert(IRArgs.second == 1 && "Expected only a single `this` pointer.");
2642  
2643      llvm::AttrBuilder Attrs(getLLVMContext());
2644  
2645      QualType ThisTy =
2646          FI.arg_begin()->type.getTypePtr()->getPointeeType();
2647  
2648      if (!CodeGenOpts.NullPointerIsValid &&
2649          getTypes().getTargetAddressSpace(FI.arg_begin()->type) == 0) {
2650        Attrs.addAttribute(llvm::Attribute::NonNull);
2651        Attrs.addDereferenceableAttr(getMinimumObjectSize(ThisTy).getQuantity());
2652      } else {
2653        // FIXME dereferenceable should be correct here, regardless of
2654        // NullPointerIsValid. However, dereferenceable currently does not always
2655        // respect NullPointerIsValid and may imply nonnull and break the program.
2656        // See https://reviews.llvm.org/D66618 for discussions.
2657        Attrs.addDereferenceableOrNullAttr(
2658            getMinimumObjectSize(
2659                FI.arg_begin()->type.castAs<PointerType>()->getPointeeType())
2660                .getQuantity());
2661      }
2662  
2663      llvm::Align Alignment =
2664          getNaturalTypeAlignment(ThisTy, /*BaseInfo=*/nullptr,
2665                                  /*TBAAInfo=*/nullptr, /*forPointeeType=*/true)
2666              .getAsAlign();
2667      Attrs.addAlignmentAttr(Alignment);
2668  
2669      ArgAttrs[IRArgs.first] = llvm::AttributeSet::get(getLLVMContext(), Attrs);
2670    }
2671  
2672    unsigned ArgNo = 0;
2673    for (CGFunctionInfo::const_arg_iterator I = FI.arg_begin(),
2674                                            E = FI.arg_end();
2675         I != E; ++I, ++ArgNo) {
2676      QualType ParamType = I->type;
2677      const ABIArgInfo &AI = I->info;
2678      llvm::AttrBuilder Attrs(getLLVMContext());
2679  
2680      // Add attribute for padding argument, if necessary.
2681      if (IRFunctionArgs.hasPaddingArg(ArgNo)) {
2682        if (AI.getPaddingInReg()) {
2683          ArgAttrs[IRFunctionArgs.getPaddingArgNo(ArgNo)] =
2684              llvm::AttributeSet::get(
2685                  getLLVMContext(),
2686                  llvm::AttrBuilder(getLLVMContext()).addAttribute(llvm::Attribute::InReg));
2687        }
2688      }
2689  
2690      // Decide whether the argument we're handling could be partially undef
2691      if (CodeGenOpts.EnableNoundefAttrs &&
2692          DetermineNoUndef(ParamType, getTypes(), DL, AI)) {
2693        Attrs.addAttribute(llvm::Attribute::NoUndef);
2694      }
2695  
2696      // 'restrict' -> 'noalias' is done in EmitFunctionProlog when we
2697      // have the corresponding parameter variable.  It doesn't make
2698      // sense to do it here because parameters are so messed up.
2699      switch (AI.getKind()) {
2700      case ABIArgInfo::Extend:
2701        if (AI.isSignExt())
2702          Attrs.addAttribute(llvm::Attribute::SExt);
2703        else
2704          Attrs.addAttribute(llvm::Attribute::ZExt);
2705        [[fallthrough]];
2706      case ABIArgInfo::Direct:
2707        if (ArgNo == 0 && FI.isChainCall())
2708          Attrs.addAttribute(llvm::Attribute::Nest);
2709        else if (AI.getInReg())
2710          Attrs.addAttribute(llvm::Attribute::InReg);
2711        Attrs.addStackAlignmentAttr(llvm::MaybeAlign(AI.getDirectAlign()));
2712  
2713        if (canApplyNoFPClass(AI, ParamType, false))
2714          Attrs.addNoFPClassAttr(getNoFPClassTestMask(getLangOpts()));
2715        break;
2716      case ABIArgInfo::Indirect: {
2717        if (AI.getInReg())
2718          Attrs.addAttribute(llvm::Attribute::InReg);
2719  
2720        if (AI.getIndirectByVal())
2721          Attrs.addByValAttr(getTypes().ConvertTypeForMem(ParamType));
2722  
2723        auto *Decl = ParamType->getAsRecordDecl();
2724        if (CodeGenOpts.PassByValueIsNoAlias && Decl &&
2725            Decl->getArgPassingRestrictions() ==
2726                RecordArgPassingKind::CanPassInRegs)
2727          // When calling the function, the pointer passed in will be the only
2728          // reference to the underlying object. Mark it accordingly.
2729          Attrs.addAttribute(llvm::Attribute::NoAlias);
2730  
2731        // TODO: We could add the byref attribute if not byval, but it would
2732        // require updating many testcases.
2733  
2734        CharUnits Align = AI.getIndirectAlign();
2735  
2736        // In a byval argument, it is important that the required
2737        // alignment of the type is honored, as LLVM might be creating a
2738        // *new* stack object, and needs to know what alignment to give
2739        // it. (Sometimes it can deduce a sensible alignment on its own,
2740        // but not if clang decides it must emit a packed struct, or the
2741        // user specifies increased alignment requirements.)
2742        //
2743        // This is different from indirect *not* byval, where the object
2744        // exists already, and the align attribute is purely
2745        // informative.
2746        assert(!Align.isZero());
2747  
2748        // For now, only add this when we have a byval argument.
2749        // TODO: be less lazy about updating test cases.
2750        if (AI.getIndirectByVal())
2751          Attrs.addAlignmentAttr(Align.getQuantity());
2752  
2753        // byval disables readnone and readonly.
2754        AddPotentialArgAccess();
2755        break;
2756      }
2757      case ABIArgInfo::IndirectAliased: {
2758        CharUnits Align = AI.getIndirectAlign();
2759        Attrs.addByRefAttr(getTypes().ConvertTypeForMem(ParamType));
2760        Attrs.addAlignmentAttr(Align.getQuantity());
2761        break;
2762      }
2763      case ABIArgInfo::Ignore:
2764      case ABIArgInfo::Expand:
2765      case ABIArgInfo::CoerceAndExpand:
2766        break;
2767  
2768      case ABIArgInfo::InAlloca:
2769        // inalloca disables readnone and readonly.
2770        AddPotentialArgAccess();
2771        continue;
2772      }
2773  
2774      if (const auto *RefTy = ParamType->getAs<ReferenceType>()) {
2775        QualType PTy = RefTy->getPointeeType();
2776        if (!PTy->isIncompleteType() && PTy->isConstantSizeType())
2777          Attrs.addDereferenceableAttr(
2778              getMinimumObjectSize(PTy).getQuantity());
2779        if (getTypes().getTargetAddressSpace(PTy) == 0 &&
2780            !CodeGenOpts.NullPointerIsValid)
2781          Attrs.addAttribute(llvm::Attribute::NonNull);
2782        if (PTy->isObjectType()) {
2783          llvm::Align Alignment =
2784              getNaturalPointeeTypeAlignment(ParamType).getAsAlign();
2785          Attrs.addAlignmentAttr(Alignment);
2786        }
2787      }
2788  
2789      // From OpenCL spec v3.0.10 section 6.3.5 Alignment of Types:
2790      // > For arguments to a __kernel function declared to be a pointer to a
2791      // > data type, the OpenCL compiler can assume that the pointee is always
2792      // > appropriately aligned as required by the data type.
2793      if (TargetDecl && TargetDecl->hasAttr<OpenCLKernelAttr>() &&
2794          ParamType->isPointerType()) {
2795        QualType PTy = ParamType->getPointeeType();
2796        if (!PTy->isIncompleteType() && PTy->isConstantSizeType()) {
2797          llvm::Align Alignment =
2798              getNaturalPointeeTypeAlignment(ParamType).getAsAlign();
2799          Attrs.addAlignmentAttr(Alignment);
2800        }
2801      }
2802  
2803      switch (FI.getExtParameterInfo(ArgNo).getABI()) {
2804      case ParameterABI::Ordinary:
2805        break;
2806  
2807      case ParameterABI::SwiftIndirectResult: {
2808        // Add 'sret' if we haven't already used it for something, but
2809        // only if the result is void.
2810        if (!hasUsedSRet && RetTy->isVoidType()) {
2811          Attrs.addStructRetAttr(getTypes().ConvertTypeForMem(ParamType));
2812          hasUsedSRet = true;
2813        }
2814  
2815        // Add 'noalias' in either case.
2816        Attrs.addAttribute(llvm::Attribute::NoAlias);
2817  
2818        // Add 'dereferenceable' and 'alignment'.
2819        auto PTy = ParamType->getPointeeType();
2820        if (!PTy->isIncompleteType() && PTy->isConstantSizeType()) {
2821          auto info = getContext().getTypeInfoInChars(PTy);
2822          Attrs.addDereferenceableAttr(info.Width.getQuantity());
2823          Attrs.addAlignmentAttr(info.Align.getAsAlign());
2824        }
2825        break;
2826      }
2827  
2828      case ParameterABI::SwiftErrorResult:
2829        Attrs.addAttribute(llvm::Attribute::SwiftError);
2830        break;
2831  
2832      case ParameterABI::SwiftContext:
2833        Attrs.addAttribute(llvm::Attribute::SwiftSelf);
2834        break;
2835  
2836      case ParameterABI::SwiftAsyncContext:
2837        Attrs.addAttribute(llvm::Attribute::SwiftAsync);
2838        break;
2839      }
2840  
2841      if (FI.getExtParameterInfo(ArgNo).isNoEscape())
2842        Attrs.addAttribute(llvm::Attribute::NoCapture);
2843  
2844      if (Attrs.hasAttributes()) {
2845        unsigned FirstIRArg, NumIRArgs;
2846        std::tie(FirstIRArg, NumIRArgs) = IRFunctionArgs.getIRArgs(ArgNo);
2847        for (unsigned i = 0; i < NumIRArgs; i++)
2848          ArgAttrs[FirstIRArg + i] = ArgAttrs[FirstIRArg + i].addAttributes(
2849              getLLVMContext(), llvm::AttributeSet::get(getLLVMContext(), Attrs));
2850      }
2851    }
2852    assert(ArgNo == FI.arg_size());
2853  
2854    AttrList = llvm::AttributeList::get(
2855        getLLVMContext(), llvm::AttributeSet::get(getLLVMContext(), FuncAttrs),
2856        llvm::AttributeSet::get(getLLVMContext(), RetAttrs), ArgAttrs);
2857  }
2858  
2859  /// An argument came in as a promoted argument; demote it back to its
2860  /// declared type.
emitArgumentDemotion(CodeGenFunction & CGF,const VarDecl * var,llvm::Value * value)2861  static llvm::Value *emitArgumentDemotion(CodeGenFunction &CGF,
2862                                           const VarDecl *var,
2863                                           llvm::Value *value) {
2864    llvm::Type *varType = CGF.ConvertType(var->getType());
2865  
2866    // This can happen with promotions that actually don't change the
2867    // underlying type, like the enum promotions.
2868    if (value->getType() == varType) return value;
2869  
2870    assert((varType->isIntegerTy() || varType->isFloatingPointTy())
2871           && "unexpected promotion type");
2872  
2873    if (isa<llvm::IntegerType>(varType))
2874      return CGF.Builder.CreateTrunc(value, varType, "arg.unpromote");
2875  
2876    return CGF.Builder.CreateFPCast(value, varType, "arg.unpromote");
2877  }
2878  
2879  /// Returns the attribute (either parameter attribute, or function
2880  /// attribute), which declares argument ArgNo to be non-null.
getNonNullAttr(const Decl * FD,const ParmVarDecl * PVD,QualType ArgType,unsigned ArgNo)2881  static const NonNullAttr *getNonNullAttr(const Decl *FD, const ParmVarDecl *PVD,
2882                                           QualType ArgType, unsigned ArgNo) {
2883    // FIXME: __attribute__((nonnull)) can also be applied to:
2884    //   - references to pointers, where the pointee is known to be
2885    //     nonnull (apparently a Clang extension)
2886    //   - transparent unions containing pointers
2887    // In the former case, LLVM IR cannot represent the constraint. In
2888    // the latter case, we have no guarantee that the transparent union
2889    // is in fact passed as a pointer.
2890    if (!ArgType->isAnyPointerType() && !ArgType->isBlockPointerType())
2891      return nullptr;
2892    // First, check attribute on parameter itself.
2893    if (PVD) {
2894      if (auto ParmNNAttr = PVD->getAttr<NonNullAttr>())
2895        return ParmNNAttr;
2896    }
2897    // Check function attributes.
2898    if (!FD)
2899      return nullptr;
2900    for (const auto *NNAttr : FD->specific_attrs<NonNullAttr>()) {
2901      if (NNAttr->isNonNull(ArgNo))
2902        return NNAttr;
2903    }
2904    return nullptr;
2905  }
2906  
2907  namespace {
2908    struct CopyBackSwiftError final : EHScopeStack::Cleanup {
2909      Address Temp;
2910      Address Arg;
CopyBackSwiftError__anonf4c048640b11::CopyBackSwiftError2911      CopyBackSwiftError(Address temp, Address arg) : Temp(temp), Arg(arg) {}
Emit__anonf4c048640b11::CopyBackSwiftError2912      void Emit(CodeGenFunction &CGF, Flags flags) override {
2913        llvm::Value *errorValue = CGF.Builder.CreateLoad(Temp);
2914        CGF.Builder.CreateStore(errorValue, Arg);
2915      }
2916    };
2917  }
2918  
EmitFunctionProlog(const CGFunctionInfo & FI,llvm::Function * Fn,const FunctionArgList & Args)2919  void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
2920                                           llvm::Function *Fn,
2921                                           const FunctionArgList &Args) {
2922    if (CurCodeDecl && CurCodeDecl->hasAttr<NakedAttr>())
2923      // Naked functions don't have prologues.
2924      return;
2925  
2926    // If this is an implicit-return-zero function, go ahead and
2927    // initialize the return value.  TODO: it might be nice to have
2928    // a more general mechanism for this that didn't require synthesized
2929    // return statements.
2930    if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(CurCodeDecl)) {
2931      if (FD->hasImplicitReturnZero()) {
2932        QualType RetTy = FD->getReturnType().getUnqualifiedType();
2933        llvm::Type* LLVMTy = CGM.getTypes().ConvertType(RetTy);
2934        llvm::Constant* Zero = llvm::Constant::getNullValue(LLVMTy);
2935        Builder.CreateStore(Zero, ReturnValue);
2936      }
2937    }
2938  
2939    // FIXME: We no longer need the types from FunctionArgList; lift up and
2940    // simplify.
2941  
2942    ClangToLLVMArgMapping IRFunctionArgs(CGM.getContext(), FI);
2943    assert(Fn->arg_size() == IRFunctionArgs.totalIRArgs());
2944  
2945    // If we're using inalloca, all the memory arguments are GEPs off of the last
2946    // parameter, which is a pointer to the complete memory area.
2947    Address ArgStruct = Address::invalid();
2948    if (IRFunctionArgs.hasInallocaArg())
2949      ArgStruct = Address(Fn->getArg(IRFunctionArgs.getInallocaArgNo()),
2950                          FI.getArgStruct(), FI.getArgStructAlignment());
2951  
2952    // Name the struct return parameter.
2953    if (IRFunctionArgs.hasSRetArg()) {
2954      auto AI = Fn->getArg(IRFunctionArgs.getSRetArgNo());
2955      AI->setName("agg.result");
2956      AI->addAttr(llvm::Attribute::NoAlias);
2957    }
2958  
2959    // Track if we received the parameter as a pointer (indirect, byval, or
2960    // inalloca).  If already have a pointer, EmitParmDecl doesn't need to copy it
2961    // into a local alloca for us.
2962    SmallVector<ParamValue, 16> ArgVals;
2963    ArgVals.reserve(Args.size());
2964  
2965    // Create a pointer value for every parameter declaration.  This usually
2966    // entails copying one or more LLVM IR arguments into an alloca.  Don't push
2967    // any cleanups or do anything that might unwind.  We do that separately, so
2968    // we can push the cleanups in the correct order for the ABI.
2969    assert(FI.arg_size() == Args.size() &&
2970           "Mismatch between function signature & arguments.");
2971    unsigned ArgNo = 0;
2972    CGFunctionInfo::const_arg_iterator info_it = FI.arg_begin();
2973    for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end();
2974         i != e; ++i, ++info_it, ++ArgNo) {
2975      const VarDecl *Arg = *i;
2976      const ABIArgInfo &ArgI = info_it->info;
2977  
2978      bool isPromoted =
2979        isa<ParmVarDecl>(Arg) && cast<ParmVarDecl>(Arg)->isKNRPromoted();
2980      // We are converting from ABIArgInfo type to VarDecl type directly, unless
2981      // the parameter is promoted. In this case we convert to
2982      // CGFunctionInfo::ArgInfo type with subsequent argument demotion.
2983      QualType Ty = isPromoted ? info_it->type : Arg->getType();
2984      assert(hasScalarEvaluationKind(Ty) ==
2985             hasScalarEvaluationKind(Arg->getType()));
2986  
2987      unsigned FirstIRArg, NumIRArgs;
2988      std::tie(FirstIRArg, NumIRArgs) = IRFunctionArgs.getIRArgs(ArgNo);
2989  
2990      switch (ArgI.getKind()) {
2991      case ABIArgInfo::InAlloca: {
2992        assert(NumIRArgs == 0);
2993        auto FieldIndex = ArgI.getInAllocaFieldIndex();
2994        Address V =
2995            Builder.CreateStructGEP(ArgStruct, FieldIndex, Arg->getName());
2996        if (ArgI.getInAllocaIndirect())
2997          V = Address(Builder.CreateLoad(V), ConvertTypeForMem(Ty),
2998                      getContext().getTypeAlignInChars(Ty));
2999        ArgVals.push_back(ParamValue::forIndirect(V));
3000        break;
3001      }
3002  
3003      case ABIArgInfo::Indirect:
3004      case ABIArgInfo::IndirectAliased: {
3005        assert(NumIRArgs == 1);
3006        Address ParamAddr = makeNaturalAddressForPointer(
3007            Fn->getArg(FirstIRArg), Ty, ArgI.getIndirectAlign(), false, nullptr,
3008            nullptr, KnownNonNull);
3009  
3010        if (!hasScalarEvaluationKind(Ty)) {
3011          // Aggregates and complex variables are accessed by reference. All we
3012          // need to do is realign the value, if requested. Also, if the address
3013          // may be aliased, copy it to ensure that the parameter variable is
3014          // mutable and has a unique adress, as C requires.
3015          if (ArgI.getIndirectRealign() || ArgI.isIndirectAliased()) {
3016            RawAddress AlignedTemp = CreateMemTemp(Ty, "coerce");
3017  
3018            // Copy from the incoming argument pointer to the temporary with the
3019            // appropriate alignment.
3020            //
3021            // FIXME: We should have a common utility for generating an aggregate
3022            // copy.
3023            CharUnits Size = getContext().getTypeSizeInChars(Ty);
3024            Builder.CreateMemCpy(
3025                AlignedTemp.getPointer(), AlignedTemp.getAlignment().getAsAlign(),
3026                ParamAddr.emitRawPointer(*this),
3027                ParamAddr.getAlignment().getAsAlign(),
3028                llvm::ConstantInt::get(IntPtrTy, Size.getQuantity()));
3029            ParamAddr = AlignedTemp;
3030          }
3031          ArgVals.push_back(ParamValue::forIndirect(ParamAddr));
3032        } else {
3033          // Load scalar value from indirect argument.
3034          llvm::Value *V =
3035              EmitLoadOfScalar(ParamAddr, false, Ty, Arg->getBeginLoc());
3036  
3037          if (isPromoted)
3038            V = emitArgumentDemotion(*this, Arg, V);
3039          ArgVals.push_back(ParamValue::forDirect(V));
3040        }
3041        break;
3042      }
3043  
3044      case ABIArgInfo::Extend:
3045      case ABIArgInfo::Direct: {
3046        auto AI = Fn->getArg(FirstIRArg);
3047        llvm::Type *LTy = ConvertType(Arg->getType());
3048  
3049        // Prepare parameter attributes. So far, only attributes for pointer
3050        // parameters are prepared. See
3051        // http://llvm.org/docs/LangRef.html#paramattrs.
3052        if (ArgI.getDirectOffset() == 0 && LTy->isPointerTy() &&
3053            ArgI.getCoerceToType()->isPointerTy()) {
3054          assert(NumIRArgs == 1);
3055  
3056          if (const ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(Arg)) {
3057            // Set `nonnull` attribute if any.
3058            if (getNonNullAttr(CurCodeDecl, PVD, PVD->getType(),
3059                               PVD->getFunctionScopeIndex()) &&
3060                !CGM.getCodeGenOpts().NullPointerIsValid)
3061              AI->addAttr(llvm::Attribute::NonNull);
3062  
3063            QualType OTy = PVD->getOriginalType();
3064            if (const auto *ArrTy =
3065                getContext().getAsConstantArrayType(OTy)) {
3066              // A C99 array parameter declaration with the static keyword also
3067              // indicates dereferenceability, and if the size is constant we can
3068              // use the dereferenceable attribute (which requires the size in
3069              // bytes).
3070              if (ArrTy->getSizeModifier() == ArraySizeModifier::Static) {
3071                QualType ETy = ArrTy->getElementType();
3072                llvm::Align Alignment =
3073                    CGM.getNaturalTypeAlignment(ETy).getAsAlign();
3074                AI->addAttrs(llvm::AttrBuilder(getLLVMContext()).addAlignmentAttr(Alignment));
3075                uint64_t ArrSize = ArrTy->getZExtSize();
3076                if (!ETy->isIncompleteType() && ETy->isConstantSizeType() &&
3077                    ArrSize) {
3078                  llvm::AttrBuilder Attrs(getLLVMContext());
3079                  Attrs.addDereferenceableAttr(
3080                      getContext().getTypeSizeInChars(ETy).getQuantity() *
3081                      ArrSize);
3082                  AI->addAttrs(Attrs);
3083                } else if (getContext().getTargetInfo().getNullPointerValue(
3084                               ETy.getAddressSpace()) == 0 &&
3085                           !CGM.getCodeGenOpts().NullPointerIsValid) {
3086                  AI->addAttr(llvm::Attribute::NonNull);
3087                }
3088              }
3089            } else if (const auto *ArrTy =
3090                       getContext().getAsVariableArrayType(OTy)) {
3091              // For C99 VLAs with the static keyword, we don't know the size so
3092              // we can't use the dereferenceable attribute, but in addrspace(0)
3093              // we know that it must be nonnull.
3094              if (ArrTy->getSizeModifier() == ArraySizeModifier::Static) {
3095                QualType ETy = ArrTy->getElementType();
3096                llvm::Align Alignment =
3097                    CGM.getNaturalTypeAlignment(ETy).getAsAlign();
3098                AI->addAttrs(llvm::AttrBuilder(getLLVMContext()).addAlignmentAttr(Alignment));
3099                if (!getTypes().getTargetAddressSpace(ETy) &&
3100                    !CGM.getCodeGenOpts().NullPointerIsValid)
3101                  AI->addAttr(llvm::Attribute::NonNull);
3102              }
3103            }
3104  
3105            // Set `align` attribute if any.
3106            const auto *AVAttr = PVD->getAttr<AlignValueAttr>();
3107            if (!AVAttr)
3108              if (const auto *TOTy = OTy->getAs<TypedefType>())
3109                AVAttr = TOTy->getDecl()->getAttr<AlignValueAttr>();
3110            if (AVAttr && !SanOpts.has(SanitizerKind::Alignment)) {
3111              // If alignment-assumption sanitizer is enabled, we do *not* add
3112              // alignment attribute here, but emit normal alignment assumption,
3113              // so the UBSAN check could function.
3114              llvm::ConstantInt *AlignmentCI =
3115                  cast<llvm::ConstantInt>(EmitScalarExpr(AVAttr->getAlignment()));
3116              uint64_t AlignmentInt =
3117                  AlignmentCI->getLimitedValue(llvm::Value::MaximumAlignment);
3118              if (AI->getParamAlign().valueOrOne() < AlignmentInt) {
3119                AI->removeAttr(llvm::Attribute::AttrKind::Alignment);
3120                AI->addAttrs(llvm::AttrBuilder(getLLVMContext()).addAlignmentAttr(
3121                    llvm::Align(AlignmentInt)));
3122              }
3123            }
3124          }
3125  
3126          // Set 'noalias' if an argument type has the `restrict` qualifier.
3127          if (Arg->getType().isRestrictQualified())
3128            AI->addAttr(llvm::Attribute::NoAlias);
3129        }
3130  
3131        // Prepare the argument value. If we have the trivial case, handle it
3132        // with no muss and fuss.
3133        if (!isa<llvm::StructType>(ArgI.getCoerceToType()) &&
3134            ArgI.getCoerceToType() == ConvertType(Ty) &&
3135            ArgI.getDirectOffset() == 0) {
3136          assert(NumIRArgs == 1);
3137  
3138          // LLVM expects swifterror parameters to be used in very restricted
3139          // ways.  Copy the value into a less-restricted temporary.
3140          llvm::Value *V = AI;
3141          if (FI.getExtParameterInfo(ArgNo).getABI()
3142                == ParameterABI::SwiftErrorResult) {
3143            QualType pointeeTy = Ty->getPointeeType();
3144            assert(pointeeTy->isPointerType());
3145            RawAddress temp =
3146                CreateMemTemp(pointeeTy, getPointerAlign(), "swifterror.temp");
3147            Address arg = makeNaturalAddressForPointer(
3148                V, pointeeTy, getContext().getTypeAlignInChars(pointeeTy));
3149            llvm::Value *incomingErrorValue = Builder.CreateLoad(arg);
3150            Builder.CreateStore(incomingErrorValue, temp);
3151            V = temp.getPointer();
3152  
3153            // Push a cleanup to copy the value back at the end of the function.
3154            // The convention does not guarantee that the value will be written
3155            // back if the function exits with an unwind exception.
3156            EHStack.pushCleanup<CopyBackSwiftError>(NormalCleanup, temp, arg);
3157          }
3158  
3159          // Ensure the argument is the correct type.
3160          if (V->getType() != ArgI.getCoerceToType())
3161            V = Builder.CreateBitCast(V, ArgI.getCoerceToType());
3162  
3163          if (isPromoted)
3164            V = emitArgumentDemotion(*this, Arg, V);
3165  
3166          // Because of merging of function types from multiple decls it is
3167          // possible for the type of an argument to not match the corresponding
3168          // type in the function type. Since we are codegening the callee
3169          // in here, add a cast to the argument type.
3170          llvm::Type *LTy = ConvertType(Arg->getType());
3171          if (V->getType() != LTy)
3172            V = Builder.CreateBitCast(V, LTy);
3173  
3174          ArgVals.push_back(ParamValue::forDirect(V));
3175          break;
3176        }
3177  
3178        // VLST arguments are coerced to VLATs at the function boundary for
3179        // ABI consistency. If this is a VLST that was coerced to
3180        // a VLAT at the function boundary and the types match up, use
3181        // llvm.vector.extract to convert back to the original VLST.
3182        if (auto *VecTyTo = dyn_cast<llvm::FixedVectorType>(ConvertType(Ty))) {
3183          llvm::Value *Coerced = Fn->getArg(FirstIRArg);
3184          if (auto *VecTyFrom =
3185                  dyn_cast<llvm::ScalableVectorType>(Coerced->getType())) {
3186            // If we are casting a scalable i1 predicate vector to a fixed i8
3187            // vector, bitcast the source and use a vector extract.
3188            if (VecTyFrom->getElementType()->isIntegerTy(1) &&
3189                VecTyFrom->getElementCount().isKnownMultipleOf(8) &&
3190                VecTyTo->getElementType() == Builder.getInt8Ty()) {
3191              VecTyFrom = llvm::ScalableVectorType::get(
3192                  VecTyTo->getElementType(),
3193                  VecTyFrom->getElementCount().getKnownMinValue() / 8);
3194              Coerced = Builder.CreateBitCast(Coerced, VecTyFrom);
3195            }
3196            if (VecTyFrom->getElementType() == VecTyTo->getElementType()) {
3197              llvm::Value *Zero = llvm::Constant::getNullValue(CGM.Int64Ty);
3198  
3199              assert(NumIRArgs == 1);
3200              Coerced->setName(Arg->getName() + ".coerce");
3201              ArgVals.push_back(ParamValue::forDirect(Builder.CreateExtractVector(
3202                  VecTyTo, Coerced, Zero, "cast.fixed")));
3203              break;
3204            }
3205          }
3206        }
3207  
3208        llvm::StructType *STy =
3209            dyn_cast<llvm::StructType>(ArgI.getCoerceToType());
3210        if (ArgI.isDirect() && !ArgI.getCanBeFlattened() && STy &&
3211            STy->getNumElements() > 1) {
3212          [[maybe_unused]] llvm::TypeSize StructSize =
3213              CGM.getDataLayout().getTypeAllocSize(STy);
3214          [[maybe_unused]] llvm::TypeSize PtrElementSize =
3215              CGM.getDataLayout().getTypeAllocSize(ConvertTypeForMem(Ty));
3216          if (STy->containsHomogeneousScalableVectorTypes()) {
3217            assert(StructSize == PtrElementSize &&
3218                   "Only allow non-fractional movement of structure with"
3219                   "homogeneous scalable vector type");
3220  
3221            ArgVals.push_back(ParamValue::forDirect(AI));
3222            break;
3223          }
3224        }
3225  
3226        Address Alloca = CreateMemTemp(Ty, getContext().getDeclAlign(Arg),
3227                                       Arg->getName());
3228  
3229        // Pointer to store into.
3230        Address Ptr = emitAddressAtOffset(*this, Alloca, ArgI);
3231  
3232        // Fast-isel and the optimizer generally like scalar values better than
3233        // FCAs, so we flatten them if this is safe to do for this argument.
3234        if (ArgI.isDirect() && ArgI.getCanBeFlattened() && STy &&
3235            STy->getNumElements() > 1) {
3236          llvm::TypeSize StructSize = CGM.getDataLayout().getTypeAllocSize(STy);
3237          llvm::TypeSize PtrElementSize =
3238              CGM.getDataLayout().getTypeAllocSize(Ptr.getElementType());
3239          if (StructSize.isScalable()) {
3240            assert(STy->containsHomogeneousScalableVectorTypes() &&
3241                   "ABI only supports structure with homogeneous scalable vector "
3242                   "type");
3243            assert(StructSize == PtrElementSize &&
3244                   "Only allow non-fractional movement of structure with"
3245                   "homogeneous scalable vector type");
3246            assert(STy->getNumElements() == NumIRArgs);
3247  
3248            llvm::Value *LoadedStructValue = llvm::PoisonValue::get(STy);
3249            for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
3250              auto *AI = Fn->getArg(FirstIRArg + i);
3251              AI->setName(Arg->getName() + ".coerce" + Twine(i));
3252              LoadedStructValue =
3253                  Builder.CreateInsertValue(LoadedStructValue, AI, i);
3254            }
3255  
3256            Builder.CreateStore(LoadedStructValue, Ptr);
3257          } else {
3258            uint64_t SrcSize = StructSize.getFixedValue();
3259            uint64_t DstSize = PtrElementSize.getFixedValue();
3260  
3261            Address AddrToStoreInto = Address::invalid();
3262            if (SrcSize <= DstSize) {
3263              AddrToStoreInto = Ptr.withElementType(STy);
3264            } else {
3265              AddrToStoreInto =
3266                  CreateTempAlloca(STy, Alloca.getAlignment(), "coerce");
3267            }
3268  
3269            assert(STy->getNumElements() == NumIRArgs);
3270            for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
3271              auto AI = Fn->getArg(FirstIRArg + i);
3272              AI->setName(Arg->getName() + ".coerce" + Twine(i));
3273              Address EltPtr = Builder.CreateStructGEP(AddrToStoreInto, i);
3274              Builder.CreateStore(AI, EltPtr);
3275            }
3276  
3277            if (SrcSize > DstSize) {
3278              Builder.CreateMemCpy(Ptr, AddrToStoreInto, DstSize);
3279            }
3280          }
3281        } else {
3282          // Simple case, just do a coerced store of the argument into the alloca.
3283          assert(NumIRArgs == 1);
3284          auto AI = Fn->getArg(FirstIRArg);
3285          AI->setName(Arg->getName() + ".coerce");
3286          CreateCoercedStore(
3287              AI, Ptr,
3288              llvm::TypeSize::getFixed(
3289                  getContext().getTypeSizeInChars(Ty).getQuantity() -
3290                  ArgI.getDirectOffset()),
3291              /*DstIsVolatile=*/false);
3292        }
3293  
3294        // Match to what EmitParmDecl is expecting for this type.
3295        if (CodeGenFunction::hasScalarEvaluationKind(Ty)) {
3296          llvm::Value *V =
3297              EmitLoadOfScalar(Alloca, false, Ty, Arg->getBeginLoc());
3298          if (isPromoted)
3299            V = emitArgumentDemotion(*this, Arg, V);
3300          ArgVals.push_back(ParamValue::forDirect(V));
3301        } else {
3302          ArgVals.push_back(ParamValue::forIndirect(Alloca));
3303        }
3304        break;
3305      }
3306  
3307      case ABIArgInfo::CoerceAndExpand: {
3308        // Reconstruct into a temporary.
3309        Address alloca = CreateMemTemp(Ty, getContext().getDeclAlign(Arg));
3310        ArgVals.push_back(ParamValue::forIndirect(alloca));
3311  
3312        auto coercionType = ArgI.getCoerceAndExpandType();
3313        alloca = alloca.withElementType(coercionType);
3314  
3315        unsigned argIndex = FirstIRArg;
3316        for (unsigned i = 0, e = coercionType->getNumElements(); i != e; ++i) {
3317          llvm::Type *eltType = coercionType->getElementType(i);
3318          if (ABIArgInfo::isPaddingForCoerceAndExpand(eltType))
3319            continue;
3320  
3321          auto eltAddr = Builder.CreateStructGEP(alloca, i);
3322          auto elt = Fn->getArg(argIndex++);
3323          Builder.CreateStore(elt, eltAddr);
3324        }
3325        assert(argIndex == FirstIRArg + NumIRArgs);
3326        break;
3327      }
3328  
3329      case ABIArgInfo::Expand: {
3330        // If this structure was expanded into multiple arguments then
3331        // we need to create a temporary and reconstruct it from the
3332        // arguments.
3333        Address Alloca = CreateMemTemp(Ty, getContext().getDeclAlign(Arg));
3334        LValue LV = MakeAddrLValue(Alloca, Ty);
3335        ArgVals.push_back(ParamValue::forIndirect(Alloca));
3336  
3337        auto FnArgIter = Fn->arg_begin() + FirstIRArg;
3338        ExpandTypeFromArgs(Ty, LV, FnArgIter);
3339        assert(FnArgIter == Fn->arg_begin() + FirstIRArg + NumIRArgs);
3340        for (unsigned i = 0, e = NumIRArgs; i != e; ++i) {
3341          auto AI = Fn->getArg(FirstIRArg + i);
3342          AI->setName(Arg->getName() + "." + Twine(i));
3343        }
3344        break;
3345      }
3346  
3347      case ABIArgInfo::Ignore:
3348        assert(NumIRArgs == 0);
3349        // Initialize the local variable appropriately.
3350        if (!hasScalarEvaluationKind(Ty)) {
3351          ArgVals.push_back(ParamValue::forIndirect(CreateMemTemp(Ty)));
3352        } else {
3353          llvm::Value *U = llvm::UndefValue::get(ConvertType(Arg->getType()));
3354          ArgVals.push_back(ParamValue::forDirect(U));
3355        }
3356        break;
3357      }
3358    }
3359  
3360    if (getTarget().getCXXABI().areArgsDestroyedLeftToRightInCallee()) {
3361      for (int I = Args.size() - 1; I >= 0; --I)
3362        EmitParmDecl(*Args[I], ArgVals[I], I + 1);
3363    } else {
3364      for (unsigned I = 0, E = Args.size(); I != E; ++I)
3365        EmitParmDecl(*Args[I], ArgVals[I], I + 1);
3366    }
3367  }
3368  
eraseUnusedBitCasts(llvm::Instruction * insn)3369  static void eraseUnusedBitCasts(llvm::Instruction *insn) {
3370    while (insn->use_empty()) {
3371      llvm::BitCastInst *bitcast = dyn_cast<llvm::BitCastInst>(insn);
3372      if (!bitcast) return;
3373  
3374      // This is "safe" because we would have used a ConstantExpr otherwise.
3375      insn = cast<llvm::Instruction>(bitcast->getOperand(0));
3376      bitcast->eraseFromParent();
3377    }
3378  }
3379  
3380  /// Try to emit a fused autorelease of a return result.
tryEmitFusedAutoreleaseOfResult(CodeGenFunction & CGF,llvm::Value * result)3381  static llvm::Value *tryEmitFusedAutoreleaseOfResult(CodeGenFunction &CGF,
3382                                                      llvm::Value *result) {
3383    // We must be immediately followed the cast.
3384    llvm::BasicBlock *BB = CGF.Builder.GetInsertBlock();
3385    if (BB->empty()) return nullptr;
3386    if (&BB->back() != result) return nullptr;
3387  
3388    llvm::Type *resultType = result->getType();
3389  
3390    // result is in a BasicBlock and is therefore an Instruction.
3391    llvm::Instruction *generator = cast<llvm::Instruction>(result);
3392  
3393    SmallVector<llvm::Instruction *, 4> InstsToKill;
3394  
3395    // Look for:
3396    //  %generator = bitcast %type1* %generator2 to %type2*
3397    while (llvm::BitCastInst *bitcast = dyn_cast<llvm::BitCastInst>(generator)) {
3398      // We would have emitted this as a constant if the operand weren't
3399      // an Instruction.
3400      generator = cast<llvm::Instruction>(bitcast->getOperand(0));
3401  
3402      // Require the generator to be immediately followed by the cast.
3403      if (generator->getNextNode() != bitcast)
3404        return nullptr;
3405  
3406      InstsToKill.push_back(bitcast);
3407    }
3408  
3409    // Look for:
3410    //   %generator = call i8* @objc_retain(i8* %originalResult)
3411    // or
3412    //   %generator = call i8* @objc_retainAutoreleasedReturnValue(i8* %originalResult)
3413    llvm::CallInst *call = dyn_cast<llvm::CallInst>(generator);
3414    if (!call) return nullptr;
3415  
3416    bool doRetainAutorelease;
3417  
3418    if (call->getCalledOperand() == CGF.CGM.getObjCEntrypoints().objc_retain) {
3419      doRetainAutorelease = true;
3420    } else if (call->getCalledOperand() ==
3421               CGF.CGM.getObjCEntrypoints().objc_retainAutoreleasedReturnValue) {
3422      doRetainAutorelease = false;
3423  
3424      // If we emitted an assembly marker for this call (and the
3425      // ARCEntrypoints field should have been set if so), go looking
3426      // for that call.  If we can't find it, we can't do this
3427      // optimization.  But it should always be the immediately previous
3428      // instruction, unless we needed bitcasts around the call.
3429      if (CGF.CGM.getObjCEntrypoints().retainAutoreleasedReturnValueMarker) {
3430        llvm::Instruction *prev = call->getPrevNode();
3431        assert(prev);
3432        if (isa<llvm::BitCastInst>(prev)) {
3433          prev = prev->getPrevNode();
3434          assert(prev);
3435        }
3436        assert(isa<llvm::CallInst>(prev));
3437        assert(cast<llvm::CallInst>(prev)->getCalledOperand() ==
3438               CGF.CGM.getObjCEntrypoints().retainAutoreleasedReturnValueMarker);
3439        InstsToKill.push_back(prev);
3440      }
3441    } else {
3442      return nullptr;
3443    }
3444  
3445    result = call->getArgOperand(0);
3446    InstsToKill.push_back(call);
3447  
3448    // Keep killing bitcasts, for sanity.  Note that we no longer care
3449    // about precise ordering as long as there's exactly one use.
3450    while (llvm::BitCastInst *bitcast = dyn_cast<llvm::BitCastInst>(result)) {
3451      if (!bitcast->hasOneUse()) break;
3452      InstsToKill.push_back(bitcast);
3453      result = bitcast->getOperand(0);
3454    }
3455  
3456    // Delete all the unnecessary instructions, from latest to earliest.
3457    for (auto *I : InstsToKill)
3458      I->eraseFromParent();
3459  
3460    // Do the fused retain/autorelease if we were asked to.
3461    if (doRetainAutorelease)
3462      result = CGF.EmitARCRetainAutoreleaseReturnValue(result);
3463  
3464    // Cast back to the result type.
3465    return CGF.Builder.CreateBitCast(result, resultType);
3466  }
3467  
3468  /// If this is a +1 of the value of an immutable 'self', remove it.
tryRemoveRetainOfSelf(CodeGenFunction & CGF,llvm::Value * result)3469  static llvm::Value *tryRemoveRetainOfSelf(CodeGenFunction &CGF,
3470                                            llvm::Value *result) {
3471    // This is only applicable to a method with an immutable 'self'.
3472    const ObjCMethodDecl *method =
3473      dyn_cast_or_null<ObjCMethodDecl>(CGF.CurCodeDecl);
3474    if (!method) return nullptr;
3475    const VarDecl *self = method->getSelfDecl();
3476    if (!self->getType().isConstQualified()) return nullptr;
3477  
3478    // Look for a retain call. Note: stripPointerCasts looks through returned arg
3479    // functions, which would cause us to miss the retain.
3480    llvm::CallInst *retainCall = dyn_cast<llvm::CallInst>(result);
3481    if (!retainCall || retainCall->getCalledOperand() !=
3482                           CGF.CGM.getObjCEntrypoints().objc_retain)
3483      return nullptr;
3484  
3485    // Look for an ordinary load of 'self'.
3486    llvm::Value *retainedValue = retainCall->getArgOperand(0);
3487    llvm::LoadInst *load =
3488      dyn_cast<llvm::LoadInst>(retainedValue->stripPointerCasts());
3489    if (!load || load->isAtomic() || load->isVolatile() ||
3490        load->getPointerOperand() != CGF.GetAddrOfLocalVar(self).getBasePointer())
3491      return nullptr;
3492  
3493    // Okay!  Burn it all down.  This relies for correctness on the
3494    // assumption that the retain is emitted as part of the return and
3495    // that thereafter everything is used "linearly".
3496    llvm::Type *resultType = result->getType();
3497    eraseUnusedBitCasts(cast<llvm::Instruction>(result));
3498    assert(retainCall->use_empty());
3499    retainCall->eraseFromParent();
3500    eraseUnusedBitCasts(cast<llvm::Instruction>(retainedValue));
3501  
3502    return CGF.Builder.CreateBitCast(load, resultType);
3503  }
3504  
3505  /// Emit an ARC autorelease of the result of a function.
3506  ///
3507  /// \return the value to actually return from the function
emitAutoreleaseOfResult(CodeGenFunction & CGF,llvm::Value * result)3508  static llvm::Value *emitAutoreleaseOfResult(CodeGenFunction &CGF,
3509                                              llvm::Value *result) {
3510    // If we're returning 'self', kill the initial retain.  This is a
3511    // heuristic attempt to "encourage correctness" in the really unfortunate
3512    // case where we have a return of self during a dealloc and we desperately
3513    // need to avoid the possible autorelease.
3514    if (llvm::Value *self = tryRemoveRetainOfSelf(CGF, result))
3515      return self;
3516  
3517    // At -O0, try to emit a fused retain/autorelease.
3518    if (CGF.shouldUseFusedARCCalls())
3519      if (llvm::Value *fused = tryEmitFusedAutoreleaseOfResult(CGF, result))
3520        return fused;
3521  
3522    return CGF.EmitARCAutoreleaseReturnValue(result);
3523  }
3524  
3525  /// Heuristically search for a dominating store to the return-value slot.
findDominatingStoreToReturnValue(CodeGenFunction & CGF)3526  static llvm::StoreInst *findDominatingStoreToReturnValue(CodeGenFunction &CGF) {
3527    llvm::Value *ReturnValuePtr = CGF.ReturnValue.getBasePointer();
3528  
3529    // Check if a User is a store which pointerOperand is the ReturnValue.
3530    // We are looking for stores to the ReturnValue, not for stores of the
3531    // ReturnValue to some other location.
3532    auto GetStoreIfValid = [&CGF,
3533                            ReturnValuePtr](llvm::User *U) -> llvm::StoreInst * {
3534      auto *SI = dyn_cast<llvm::StoreInst>(U);
3535      if (!SI || SI->getPointerOperand() != ReturnValuePtr ||
3536          SI->getValueOperand()->getType() != CGF.ReturnValue.getElementType())
3537        return nullptr;
3538      // These aren't actually possible for non-coerced returns, and we
3539      // only care about non-coerced returns on this code path.
3540      // All memory instructions inside __try block are volatile.
3541      assert(!SI->isAtomic() &&
3542             (!SI->isVolatile() || CGF.currentFunctionUsesSEHTry()));
3543      return SI;
3544    };
3545    // If there are multiple uses of the return-value slot, just check
3546    // for something immediately preceding the IP.  Sometimes this can
3547    // happen with how we generate implicit-returns; it can also happen
3548    // with noreturn cleanups.
3549    if (!ReturnValuePtr->hasOneUse()) {
3550      llvm::BasicBlock *IP = CGF.Builder.GetInsertBlock();
3551      if (IP->empty()) return nullptr;
3552  
3553      // Look at directly preceding instruction, skipping bitcasts and lifetime
3554      // markers.
3555      for (llvm::Instruction &I : make_range(IP->rbegin(), IP->rend())) {
3556        if (isa<llvm::BitCastInst>(&I))
3557          continue;
3558        if (auto *II = dyn_cast<llvm::IntrinsicInst>(&I))
3559          if (II->getIntrinsicID() == llvm::Intrinsic::lifetime_end)
3560            continue;
3561  
3562        return GetStoreIfValid(&I);
3563      }
3564      return nullptr;
3565    }
3566  
3567    llvm::StoreInst *store = GetStoreIfValid(ReturnValuePtr->user_back());
3568    if (!store) return nullptr;
3569  
3570    // Now do a first-and-dirty dominance check: just walk up the
3571    // single-predecessors chain from the current insertion point.
3572    llvm::BasicBlock *StoreBB = store->getParent();
3573    llvm::BasicBlock *IP = CGF.Builder.GetInsertBlock();
3574    llvm::SmallPtrSet<llvm::BasicBlock *, 4> SeenBBs;
3575    while (IP != StoreBB) {
3576      if (!SeenBBs.insert(IP).second || !(IP = IP->getSinglePredecessor()))
3577        return nullptr;
3578    }
3579  
3580    // Okay, the store's basic block dominates the insertion point; we
3581    // can do our thing.
3582    return store;
3583  }
3584  
3585  // Helper functions for EmitCMSEClearRecord
3586  
3587  // Set the bits corresponding to a field having width `BitWidth` and located at
3588  // offset `BitOffset` (from the least significant bit) within a storage unit of
3589  // `Bits.size()` bytes. Each element of `Bits` corresponds to one target byte.
3590  // Use little-endian layout, i.e.`Bits[0]` is the LSB.
setBitRange(SmallVectorImpl<uint64_t> & Bits,int BitOffset,int BitWidth,int CharWidth)3591  static void setBitRange(SmallVectorImpl<uint64_t> &Bits, int BitOffset,
3592                          int BitWidth, int CharWidth) {
3593    assert(CharWidth <= 64);
3594    assert(static_cast<unsigned>(BitWidth) <= Bits.size() * CharWidth);
3595  
3596    int Pos = 0;
3597    if (BitOffset >= CharWidth) {
3598      Pos += BitOffset / CharWidth;
3599      BitOffset = BitOffset % CharWidth;
3600    }
3601  
3602    const uint64_t Used = (uint64_t(1) << CharWidth) - 1;
3603    if (BitOffset + BitWidth >= CharWidth) {
3604      Bits[Pos++] |= (Used << BitOffset) & Used;
3605      BitWidth -= CharWidth - BitOffset;
3606      BitOffset = 0;
3607    }
3608  
3609    while (BitWidth >= CharWidth) {
3610      Bits[Pos++] = Used;
3611      BitWidth -= CharWidth;
3612    }
3613  
3614    if (BitWidth > 0)
3615      Bits[Pos++] |= (Used >> (CharWidth - BitWidth)) << BitOffset;
3616  }
3617  
3618  // Set the bits corresponding to a field having width `BitWidth` and located at
3619  // offset `BitOffset` (from the least significant bit) within a storage unit of
3620  // `StorageSize` bytes, located at `StorageOffset` in `Bits`. Each element of
3621  // `Bits` corresponds to one target byte. Use target endian layout.
setBitRange(SmallVectorImpl<uint64_t> & Bits,int StorageOffset,int StorageSize,int BitOffset,int BitWidth,int CharWidth,bool BigEndian)3622  static void setBitRange(SmallVectorImpl<uint64_t> &Bits, int StorageOffset,
3623                          int StorageSize, int BitOffset, int BitWidth,
3624                          int CharWidth, bool BigEndian) {
3625  
3626    SmallVector<uint64_t, 8> TmpBits(StorageSize);
3627    setBitRange(TmpBits, BitOffset, BitWidth, CharWidth);
3628  
3629    if (BigEndian)
3630      std::reverse(TmpBits.begin(), TmpBits.end());
3631  
3632    for (uint64_t V : TmpBits)
3633      Bits[StorageOffset++] |= V;
3634  }
3635  
3636  static void setUsedBits(CodeGenModule &, QualType, int,
3637                          SmallVectorImpl<uint64_t> &);
3638  
3639  // Set the bits in `Bits`, which correspond to the value representations of
3640  // the actual members of the record type `RTy`. Note that this function does
3641  // not handle base classes, virtual tables, etc, since they cannot happen in
3642  // CMSE function arguments or return. The bit mask corresponds to the target
3643  // memory layout, i.e. it's endian dependent.
setUsedBits(CodeGenModule & CGM,const RecordType * RTy,int Offset,SmallVectorImpl<uint64_t> & Bits)3644  static void setUsedBits(CodeGenModule &CGM, const RecordType *RTy, int Offset,
3645                          SmallVectorImpl<uint64_t> &Bits) {
3646    ASTContext &Context = CGM.getContext();
3647    int CharWidth = Context.getCharWidth();
3648    const RecordDecl *RD = RTy->getDecl()->getDefinition();
3649    const ASTRecordLayout &ASTLayout = Context.getASTRecordLayout(RD);
3650    const CGRecordLayout &Layout = CGM.getTypes().getCGRecordLayout(RD);
3651  
3652    int Idx = 0;
3653    for (auto I = RD->field_begin(), E = RD->field_end(); I != E; ++I, ++Idx) {
3654      const FieldDecl *F = *I;
3655  
3656      if (F->isUnnamedBitField() || F->isZeroLengthBitField(Context) ||
3657          F->getType()->isIncompleteArrayType())
3658        continue;
3659  
3660      if (F->isBitField()) {
3661        const CGBitFieldInfo &BFI = Layout.getBitFieldInfo(F);
3662        setBitRange(Bits, Offset + BFI.StorageOffset.getQuantity(),
3663                    BFI.StorageSize / CharWidth, BFI.Offset,
3664                    BFI.Size, CharWidth,
3665                    CGM.getDataLayout().isBigEndian());
3666        continue;
3667      }
3668  
3669      setUsedBits(CGM, F->getType(),
3670                  Offset + ASTLayout.getFieldOffset(Idx) / CharWidth, Bits);
3671    }
3672  }
3673  
3674  // Set the bits in `Bits`, which correspond to the value representations of
3675  // the elements of an array type `ATy`.
setUsedBits(CodeGenModule & CGM,const ConstantArrayType * ATy,int Offset,SmallVectorImpl<uint64_t> & Bits)3676  static void setUsedBits(CodeGenModule &CGM, const ConstantArrayType *ATy,
3677                          int Offset, SmallVectorImpl<uint64_t> &Bits) {
3678    const ASTContext &Context = CGM.getContext();
3679  
3680    QualType ETy = Context.getBaseElementType(ATy);
3681    int Size = Context.getTypeSizeInChars(ETy).getQuantity();
3682    SmallVector<uint64_t, 4> TmpBits(Size);
3683    setUsedBits(CGM, ETy, 0, TmpBits);
3684  
3685    for (int I = 0, N = Context.getConstantArrayElementCount(ATy); I < N; ++I) {
3686      auto Src = TmpBits.begin();
3687      auto Dst = Bits.begin() + Offset + I * Size;
3688      for (int J = 0; J < Size; ++J)
3689        *Dst++ |= *Src++;
3690    }
3691  }
3692  
3693  // Set the bits in `Bits`, which correspond to the value representations of
3694  // the type `QTy`.
setUsedBits(CodeGenModule & CGM,QualType QTy,int Offset,SmallVectorImpl<uint64_t> & Bits)3695  static void setUsedBits(CodeGenModule &CGM, QualType QTy, int Offset,
3696                          SmallVectorImpl<uint64_t> &Bits) {
3697    if (const auto *RTy = QTy->getAs<RecordType>())
3698      return setUsedBits(CGM, RTy, Offset, Bits);
3699  
3700    ASTContext &Context = CGM.getContext();
3701    if (const auto *ATy = Context.getAsConstantArrayType(QTy))
3702      return setUsedBits(CGM, ATy, Offset, Bits);
3703  
3704    int Size = Context.getTypeSizeInChars(QTy).getQuantity();
3705    if (Size <= 0)
3706      return;
3707  
3708    std::fill_n(Bits.begin() + Offset, Size,
3709                (uint64_t(1) << Context.getCharWidth()) - 1);
3710  }
3711  
buildMultiCharMask(const SmallVectorImpl<uint64_t> & Bits,int Pos,int Size,int CharWidth,bool BigEndian)3712  static uint64_t buildMultiCharMask(const SmallVectorImpl<uint64_t> &Bits,
3713                                     int Pos, int Size, int CharWidth,
3714                                     bool BigEndian) {
3715    assert(Size > 0);
3716    uint64_t Mask = 0;
3717    if (BigEndian) {
3718      for (auto P = Bits.begin() + Pos, E = Bits.begin() + Pos + Size; P != E;
3719           ++P)
3720        Mask = (Mask << CharWidth) | *P;
3721    } else {
3722      auto P = Bits.begin() + Pos + Size, End = Bits.begin() + Pos;
3723      do
3724        Mask = (Mask << CharWidth) | *--P;
3725      while (P != End);
3726    }
3727    return Mask;
3728  }
3729  
3730  // Emit code to clear the bits in a record, which aren't a part of any user
3731  // declared member, when the record is a function return.
EmitCMSEClearRecord(llvm::Value * Src,llvm::IntegerType * ITy,QualType QTy)3732  llvm::Value *CodeGenFunction::EmitCMSEClearRecord(llvm::Value *Src,
3733                                                    llvm::IntegerType *ITy,
3734                                                    QualType QTy) {
3735    assert(Src->getType() == ITy);
3736    assert(ITy->getScalarSizeInBits() <= 64);
3737  
3738    const llvm::DataLayout &DataLayout = CGM.getDataLayout();
3739    int Size = DataLayout.getTypeStoreSize(ITy);
3740    SmallVector<uint64_t, 4> Bits(Size);
3741    setUsedBits(CGM, QTy->castAs<RecordType>(), 0, Bits);
3742  
3743    int CharWidth = CGM.getContext().getCharWidth();
3744    uint64_t Mask =
3745        buildMultiCharMask(Bits, 0, Size, CharWidth, DataLayout.isBigEndian());
3746  
3747    return Builder.CreateAnd(Src, Mask, "cmse.clear");
3748  }
3749  
3750  // Emit code to clear the bits in a record, which aren't a part of any user
3751  // declared member, when the record is a function argument.
EmitCMSEClearRecord(llvm::Value * Src,llvm::ArrayType * ATy,QualType QTy)3752  llvm::Value *CodeGenFunction::EmitCMSEClearRecord(llvm::Value *Src,
3753                                                    llvm::ArrayType *ATy,
3754                                                    QualType QTy) {
3755    const llvm::DataLayout &DataLayout = CGM.getDataLayout();
3756    int Size = DataLayout.getTypeStoreSize(ATy);
3757    SmallVector<uint64_t, 16> Bits(Size);
3758    setUsedBits(CGM, QTy->castAs<RecordType>(), 0, Bits);
3759  
3760    // Clear each element of the LLVM array.
3761    int CharWidth = CGM.getContext().getCharWidth();
3762    int CharsPerElt =
3763        ATy->getArrayElementType()->getScalarSizeInBits() / CharWidth;
3764    int MaskIndex = 0;
3765    llvm::Value *R = llvm::PoisonValue::get(ATy);
3766    for (int I = 0, N = ATy->getArrayNumElements(); I != N; ++I) {
3767      uint64_t Mask = buildMultiCharMask(Bits, MaskIndex, CharsPerElt, CharWidth,
3768                                         DataLayout.isBigEndian());
3769      MaskIndex += CharsPerElt;
3770      llvm::Value *T0 = Builder.CreateExtractValue(Src, I);
3771      llvm::Value *T1 = Builder.CreateAnd(T0, Mask, "cmse.clear");
3772      R = Builder.CreateInsertValue(R, T1, I);
3773    }
3774  
3775    return R;
3776  }
3777  
EmitFunctionEpilog(const CGFunctionInfo & FI,bool EmitRetDbgLoc,SourceLocation EndLoc)3778  void CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI,
3779                                           bool EmitRetDbgLoc,
3780                                           SourceLocation EndLoc) {
3781    if (FI.isNoReturn()) {
3782      // Noreturn functions don't return.
3783      EmitUnreachable(EndLoc);
3784      return;
3785    }
3786  
3787    if (CurCodeDecl && CurCodeDecl->hasAttr<NakedAttr>()) {
3788      // Naked functions don't have epilogues.
3789      Builder.CreateUnreachable();
3790      return;
3791    }
3792  
3793    // Functions with no result always return void.
3794    if (!ReturnValue.isValid()) {
3795      Builder.CreateRetVoid();
3796      return;
3797    }
3798  
3799    llvm::DebugLoc RetDbgLoc;
3800    llvm::Value *RV = nullptr;
3801    QualType RetTy = FI.getReturnType();
3802    const ABIArgInfo &RetAI = FI.getReturnInfo();
3803  
3804    switch (RetAI.getKind()) {
3805    case ABIArgInfo::InAlloca:
3806      // Aggregates get evaluated directly into the destination.  Sometimes we
3807      // need to return the sret value in a register, though.
3808      assert(hasAggregateEvaluationKind(RetTy));
3809      if (RetAI.getInAllocaSRet()) {
3810        llvm::Function::arg_iterator EI = CurFn->arg_end();
3811        --EI;
3812        llvm::Value *ArgStruct = &*EI;
3813        llvm::Value *SRet = Builder.CreateStructGEP(
3814            FI.getArgStruct(), ArgStruct, RetAI.getInAllocaFieldIndex());
3815        llvm::Type *Ty =
3816            cast<llvm::GetElementPtrInst>(SRet)->getResultElementType();
3817        RV = Builder.CreateAlignedLoad(Ty, SRet, getPointerAlign(), "sret");
3818      }
3819      break;
3820  
3821    case ABIArgInfo::Indirect: {
3822      auto AI = CurFn->arg_begin();
3823      if (RetAI.isSRetAfterThis())
3824        ++AI;
3825      switch (getEvaluationKind(RetTy)) {
3826      case TEK_Complex: {
3827        ComplexPairTy RT =
3828          EmitLoadOfComplex(MakeAddrLValue(ReturnValue, RetTy), EndLoc);
3829        EmitStoreOfComplex(RT, MakeNaturalAlignAddrLValue(&*AI, RetTy),
3830                           /*isInit*/ true);
3831        break;
3832      }
3833      case TEK_Aggregate:
3834        // Do nothing; aggregates get evaluated directly into the destination.
3835        break;
3836      case TEK_Scalar: {
3837        LValueBaseInfo BaseInfo;
3838        TBAAAccessInfo TBAAInfo;
3839        CharUnits Alignment =
3840            CGM.getNaturalTypeAlignment(RetTy, &BaseInfo, &TBAAInfo);
3841        Address ArgAddr(&*AI, ConvertType(RetTy), Alignment);
3842        LValue ArgVal =
3843            LValue::MakeAddr(ArgAddr, RetTy, getContext(), BaseInfo, TBAAInfo);
3844        EmitStoreOfScalar(
3845            EmitLoadOfScalar(MakeAddrLValue(ReturnValue, RetTy), EndLoc), ArgVal,
3846            /*isInit*/ true);
3847        break;
3848      }
3849      }
3850      break;
3851    }
3852  
3853    case ABIArgInfo::Extend:
3854    case ABIArgInfo::Direct:
3855      if (RetAI.getCoerceToType() == ConvertType(RetTy) &&
3856          RetAI.getDirectOffset() == 0) {
3857        // The internal return value temp always will have pointer-to-return-type
3858        // type, just do a load.
3859  
3860        // If there is a dominating store to ReturnValue, we can elide
3861        // the load, zap the store, and usually zap the alloca.
3862        if (llvm::StoreInst *SI =
3863                findDominatingStoreToReturnValue(*this)) {
3864          // Reuse the debug location from the store unless there is
3865          // cleanup code to be emitted between the store and return
3866          // instruction.
3867          if (EmitRetDbgLoc && !AutoreleaseResult)
3868            RetDbgLoc = SI->getDebugLoc();
3869          // Get the stored value and nuke the now-dead store.
3870          RV = SI->getValueOperand();
3871          SI->eraseFromParent();
3872  
3873        // Otherwise, we have to do a simple load.
3874        } else {
3875          RV = Builder.CreateLoad(ReturnValue);
3876        }
3877      } else {
3878        // If the value is offset in memory, apply the offset now.
3879        Address V = emitAddressAtOffset(*this, ReturnValue, RetAI);
3880  
3881        RV = CreateCoercedLoad(V, RetAI.getCoerceToType(), *this);
3882      }
3883  
3884      // In ARC, end functions that return a retainable type with a call
3885      // to objc_autoreleaseReturnValue.
3886      if (AutoreleaseResult) {
3887  #ifndef NDEBUG
3888        // Type::isObjCRetainabletype has to be called on a QualType that hasn't
3889        // been stripped of the typedefs, so we cannot use RetTy here. Get the
3890        // original return type of FunctionDecl, CurCodeDecl, and BlockDecl from
3891        // CurCodeDecl or BlockInfo.
3892        QualType RT;
3893  
3894        if (auto *FD = dyn_cast<FunctionDecl>(CurCodeDecl))
3895          RT = FD->getReturnType();
3896        else if (auto *MD = dyn_cast<ObjCMethodDecl>(CurCodeDecl))
3897          RT = MD->getReturnType();
3898        else if (isa<BlockDecl>(CurCodeDecl))
3899          RT = BlockInfo->BlockExpression->getFunctionType()->getReturnType();
3900        else
3901          llvm_unreachable("Unexpected function/method type");
3902  
3903        assert(getLangOpts().ObjCAutoRefCount &&
3904               !FI.isReturnsRetained() &&
3905               RT->isObjCRetainableType());
3906  #endif
3907        RV = emitAutoreleaseOfResult(*this, RV);
3908      }
3909  
3910      break;
3911  
3912    case ABIArgInfo::Ignore:
3913      break;
3914  
3915    case ABIArgInfo::CoerceAndExpand: {
3916      auto coercionType = RetAI.getCoerceAndExpandType();
3917  
3918      // Load all of the coerced elements out into results.
3919      llvm::SmallVector<llvm::Value*, 4> results;
3920      Address addr = ReturnValue.withElementType(coercionType);
3921      for (unsigned i = 0, e = coercionType->getNumElements(); i != e; ++i) {
3922        auto coercedEltType = coercionType->getElementType(i);
3923        if (ABIArgInfo::isPaddingForCoerceAndExpand(coercedEltType))
3924          continue;
3925  
3926        auto eltAddr = Builder.CreateStructGEP(addr, i);
3927        auto elt = Builder.CreateLoad(eltAddr);
3928        results.push_back(elt);
3929      }
3930  
3931      // If we have one result, it's the single direct result type.
3932      if (results.size() == 1) {
3933        RV = results[0];
3934  
3935      // Otherwise, we need to make a first-class aggregate.
3936      } else {
3937        // Construct a return type that lacks padding elements.
3938        llvm::Type *returnType = RetAI.getUnpaddedCoerceAndExpandType();
3939  
3940        RV = llvm::PoisonValue::get(returnType);
3941        for (unsigned i = 0, e = results.size(); i != e; ++i) {
3942          RV = Builder.CreateInsertValue(RV, results[i], i);
3943        }
3944      }
3945      break;
3946    }
3947    case ABIArgInfo::Expand:
3948    case ABIArgInfo::IndirectAliased:
3949      llvm_unreachable("Invalid ABI kind for return argument");
3950    }
3951  
3952    llvm::Instruction *Ret;
3953    if (RV) {
3954      if (CurFuncDecl && CurFuncDecl->hasAttr<CmseNSEntryAttr>()) {
3955        // For certain return types, clear padding bits, as they may reveal
3956        // sensitive information.
3957        // Small struct/union types are passed as integers.
3958        auto *ITy = dyn_cast<llvm::IntegerType>(RV->getType());
3959        if (ITy != nullptr && isa<RecordType>(RetTy.getCanonicalType()))
3960          RV = EmitCMSEClearRecord(RV, ITy, RetTy);
3961      }
3962      EmitReturnValueCheck(RV);
3963      Ret = Builder.CreateRet(RV);
3964    } else {
3965      Ret = Builder.CreateRetVoid();
3966    }
3967  
3968    if (RetDbgLoc)
3969      Ret->setDebugLoc(std::move(RetDbgLoc));
3970  }
3971  
EmitReturnValueCheck(llvm::Value * RV)3972  void CodeGenFunction::EmitReturnValueCheck(llvm::Value *RV) {
3973    // A current decl may not be available when emitting vtable thunks.
3974    if (!CurCodeDecl)
3975      return;
3976  
3977    // If the return block isn't reachable, neither is this check, so don't emit
3978    // it.
3979    if (ReturnBlock.isValid() && ReturnBlock.getBlock()->use_empty())
3980      return;
3981  
3982    ReturnsNonNullAttr *RetNNAttr = nullptr;
3983    if (SanOpts.has(SanitizerKind::ReturnsNonnullAttribute))
3984      RetNNAttr = CurCodeDecl->getAttr<ReturnsNonNullAttr>();
3985  
3986    if (!RetNNAttr && !requiresReturnValueNullabilityCheck())
3987      return;
3988  
3989    // Prefer the returns_nonnull attribute if it's present.
3990    SourceLocation AttrLoc;
3991    SanitizerMask CheckKind;
3992    SanitizerHandler Handler;
3993    if (RetNNAttr) {
3994      assert(!requiresReturnValueNullabilityCheck() &&
3995             "Cannot check nullability and the nonnull attribute");
3996      AttrLoc = RetNNAttr->getLocation();
3997      CheckKind = SanitizerKind::ReturnsNonnullAttribute;
3998      Handler = SanitizerHandler::NonnullReturn;
3999    } else {
4000      if (auto *DD = dyn_cast<DeclaratorDecl>(CurCodeDecl))
4001        if (auto *TSI = DD->getTypeSourceInfo())
4002          if (auto FTL = TSI->getTypeLoc().getAsAdjusted<FunctionTypeLoc>())
4003            AttrLoc = FTL.getReturnLoc().findNullabilityLoc();
4004      CheckKind = SanitizerKind::NullabilityReturn;
4005      Handler = SanitizerHandler::NullabilityReturn;
4006    }
4007  
4008    SanitizerScope SanScope(this);
4009  
4010    // Make sure the "return" source location is valid. If we're checking a
4011    // nullability annotation, make sure the preconditions for the check are met.
4012    llvm::BasicBlock *Check = createBasicBlock("nullcheck");
4013    llvm::BasicBlock *NoCheck = createBasicBlock("no.nullcheck");
4014    llvm::Value *SLocPtr = Builder.CreateLoad(ReturnLocation, "return.sloc.load");
4015    llvm::Value *CanNullCheck = Builder.CreateIsNotNull(SLocPtr);
4016    if (requiresReturnValueNullabilityCheck())
4017      CanNullCheck =
4018          Builder.CreateAnd(CanNullCheck, RetValNullabilityPrecondition);
4019    Builder.CreateCondBr(CanNullCheck, Check, NoCheck);
4020    EmitBlock(Check);
4021  
4022    // Now do the null check.
4023    llvm::Value *Cond = Builder.CreateIsNotNull(RV);
4024    llvm::Constant *StaticData[] = {EmitCheckSourceLocation(AttrLoc)};
4025    llvm::Value *DynamicData[] = {SLocPtr};
4026    EmitCheck(std::make_pair(Cond, CheckKind), Handler, StaticData, DynamicData);
4027  
4028    EmitBlock(NoCheck);
4029  
4030  #ifndef NDEBUG
4031    // The return location should not be used after the check has been emitted.
4032    ReturnLocation = Address::invalid();
4033  #endif
4034  }
4035  
isInAllocaArgument(CGCXXABI & ABI,QualType type)4036  static bool isInAllocaArgument(CGCXXABI &ABI, QualType type) {
4037    const CXXRecordDecl *RD = type->getAsCXXRecordDecl();
4038    return RD && ABI.getRecordArgABI(RD) == CGCXXABI::RAA_DirectInMemory;
4039  }
4040  
createPlaceholderSlot(CodeGenFunction & CGF,QualType Ty)4041  static AggValueSlot createPlaceholderSlot(CodeGenFunction &CGF,
4042                                            QualType Ty) {
4043    // FIXME: Generate IR in one pass, rather than going back and fixing up these
4044    // placeholders.
4045    llvm::Type *IRTy = CGF.ConvertTypeForMem(Ty);
4046    llvm::Type *IRPtrTy = llvm::PointerType::getUnqual(CGF.getLLVMContext());
4047    llvm::Value *Placeholder = llvm::PoisonValue::get(IRPtrTy);
4048  
4049    // FIXME: When we generate this IR in one pass, we shouldn't need
4050    // this win32-specific alignment hack.
4051    CharUnits Align = CharUnits::fromQuantity(4);
4052    Placeholder = CGF.Builder.CreateAlignedLoad(IRPtrTy, Placeholder, Align);
4053  
4054    return AggValueSlot::forAddr(Address(Placeholder, IRTy, Align),
4055                                 Ty.getQualifiers(),
4056                                 AggValueSlot::IsNotDestructed,
4057                                 AggValueSlot::DoesNotNeedGCBarriers,
4058                                 AggValueSlot::IsNotAliased,
4059                                 AggValueSlot::DoesNotOverlap);
4060  }
4061  
EmitDelegateCallArg(CallArgList & args,const VarDecl * param,SourceLocation loc)4062  void CodeGenFunction::EmitDelegateCallArg(CallArgList &args,
4063                                            const VarDecl *param,
4064                                            SourceLocation loc) {
4065    // StartFunction converted the ABI-lowered parameter(s) into a
4066    // local alloca.  We need to turn that into an r-value suitable
4067    // for EmitCall.
4068    Address local = GetAddrOfLocalVar(param);
4069  
4070    QualType type = param->getType();
4071  
4072    // GetAddrOfLocalVar returns a pointer-to-pointer for references,
4073    // but the argument needs to be the original pointer.
4074    if (type->isReferenceType()) {
4075      args.add(RValue::get(Builder.CreateLoad(local)), type);
4076  
4077    // In ARC, move out of consumed arguments so that the release cleanup
4078    // entered by StartFunction doesn't cause an over-release.  This isn't
4079    // optimal -O0 code generation, but it should get cleaned up when
4080    // optimization is enabled.  This also assumes that delegate calls are
4081    // performed exactly once for a set of arguments, but that should be safe.
4082    } else if (getLangOpts().ObjCAutoRefCount &&
4083               param->hasAttr<NSConsumedAttr>() &&
4084               type->isObjCRetainableType()) {
4085      llvm::Value *ptr = Builder.CreateLoad(local);
4086      auto null =
4087        llvm::ConstantPointerNull::get(cast<llvm::PointerType>(ptr->getType()));
4088      Builder.CreateStore(null, local);
4089      args.add(RValue::get(ptr), type);
4090  
4091    // For the most part, we just need to load the alloca, except that
4092    // aggregate r-values are actually pointers to temporaries.
4093    } else {
4094      args.add(convertTempToRValue(local, type, loc), type);
4095    }
4096  
4097    // Deactivate the cleanup for the callee-destructed param that was pushed.
4098    if (type->isRecordType() && !CurFuncIsThunk &&
4099        type->castAs<RecordType>()->getDecl()->isParamDestroyedInCallee() &&
4100        param->needsDestruction(getContext())) {
4101      EHScopeStack::stable_iterator cleanup =
4102          CalleeDestructedParamCleanups.lookup(cast<ParmVarDecl>(param));
4103      assert(cleanup.isValid() &&
4104             "cleanup for callee-destructed param not recorded");
4105      // This unreachable is a temporary marker which will be removed later.
4106      llvm::Instruction *isActive = Builder.CreateUnreachable();
4107      args.addArgCleanupDeactivation(cleanup, isActive);
4108    }
4109  }
4110  
isProvablyNull(llvm::Value * addr)4111  static bool isProvablyNull(llvm::Value *addr) {
4112    return llvm::isa_and_nonnull<llvm::ConstantPointerNull>(addr);
4113  }
4114  
isProvablyNonNull(Address Addr,CodeGenFunction & CGF)4115  static bool isProvablyNonNull(Address Addr, CodeGenFunction &CGF) {
4116    return llvm::isKnownNonZero(Addr.getBasePointer(), CGF.CGM.getDataLayout());
4117  }
4118  
4119  /// Emit the actual writing-back of a writeback.
emitWriteback(CodeGenFunction & CGF,const CallArgList::Writeback & writeback)4120  static void emitWriteback(CodeGenFunction &CGF,
4121                            const CallArgList::Writeback &writeback) {
4122    const LValue &srcLV = writeback.Source;
4123    Address srcAddr = srcLV.getAddress();
4124    assert(!isProvablyNull(srcAddr.getBasePointer()) &&
4125           "shouldn't have writeback for provably null argument");
4126  
4127    llvm::BasicBlock *contBB = nullptr;
4128  
4129    // If the argument wasn't provably non-null, we need to null check
4130    // before doing the store.
4131    bool provablyNonNull = isProvablyNonNull(srcAddr, CGF);
4132  
4133    if (!provablyNonNull) {
4134      llvm::BasicBlock *writebackBB = CGF.createBasicBlock("icr.writeback");
4135      contBB = CGF.createBasicBlock("icr.done");
4136  
4137      llvm::Value *isNull = CGF.Builder.CreateIsNull(srcAddr, "icr.isnull");
4138      CGF.Builder.CreateCondBr(isNull, contBB, writebackBB);
4139      CGF.EmitBlock(writebackBB);
4140    }
4141  
4142    // Load the value to writeback.
4143    llvm::Value *value = CGF.Builder.CreateLoad(writeback.Temporary);
4144  
4145    // Cast it back, in case we're writing an id to a Foo* or something.
4146    value = CGF.Builder.CreateBitCast(value, srcAddr.getElementType(),
4147                                      "icr.writeback-cast");
4148  
4149    // Perform the writeback.
4150  
4151    // If we have a "to use" value, it's something we need to emit a use
4152    // of.  This has to be carefully threaded in: if it's done after the
4153    // release it's potentially undefined behavior (and the optimizer
4154    // will ignore it), and if it happens before the retain then the
4155    // optimizer could move the release there.
4156    if (writeback.ToUse) {
4157      assert(srcLV.getObjCLifetime() == Qualifiers::OCL_Strong);
4158  
4159      // Retain the new value.  No need to block-copy here:  the block's
4160      // being passed up the stack.
4161      value = CGF.EmitARCRetainNonBlock(value);
4162  
4163      // Emit the intrinsic use here.
4164      CGF.EmitARCIntrinsicUse(writeback.ToUse);
4165  
4166      // Load the old value (primitively).
4167      llvm::Value *oldValue = CGF.EmitLoadOfScalar(srcLV, SourceLocation());
4168  
4169      // Put the new value in place (primitively).
4170      CGF.EmitStoreOfScalar(value, srcLV, /*init*/ false);
4171  
4172      // Release the old value.
4173      CGF.EmitARCRelease(oldValue, srcLV.isARCPreciseLifetime());
4174  
4175    // Otherwise, we can just do a normal lvalue store.
4176    } else {
4177      CGF.EmitStoreThroughLValue(RValue::get(value), srcLV);
4178    }
4179  
4180    // Jump to the continuation block.
4181    if (!provablyNonNull)
4182      CGF.EmitBlock(contBB);
4183  }
4184  
emitWritebacks(CodeGenFunction & CGF,const CallArgList & args)4185  static void emitWritebacks(CodeGenFunction &CGF,
4186                             const CallArgList &args) {
4187    for (const auto &I : args.writebacks())
4188      emitWriteback(CGF, I);
4189  }
4190  
deactivateArgCleanupsBeforeCall(CodeGenFunction & CGF,const CallArgList & CallArgs)4191  static void deactivateArgCleanupsBeforeCall(CodeGenFunction &CGF,
4192                                              const CallArgList &CallArgs) {
4193    ArrayRef<CallArgList::CallArgCleanup> Cleanups =
4194      CallArgs.getCleanupsToDeactivate();
4195    // Iterate in reverse to increase the likelihood of popping the cleanup.
4196    for (const auto &I : llvm::reverse(Cleanups)) {
4197      CGF.DeactivateCleanupBlock(I.Cleanup, I.IsActiveIP);
4198      I.IsActiveIP->eraseFromParent();
4199    }
4200  }
4201  
maybeGetUnaryAddrOfOperand(const Expr * E)4202  static const Expr *maybeGetUnaryAddrOfOperand(const Expr *E) {
4203    if (const UnaryOperator *uop = dyn_cast<UnaryOperator>(E->IgnoreParens()))
4204      if (uop->getOpcode() == UO_AddrOf)
4205        return uop->getSubExpr();
4206    return nullptr;
4207  }
4208  
4209  /// Emit an argument that's being passed call-by-writeback.  That is,
4210  /// we are passing the address of an __autoreleased temporary; it
4211  /// might be copy-initialized with the current value of the given
4212  /// address, but it will definitely be copied out of after the call.
emitWritebackArg(CodeGenFunction & CGF,CallArgList & args,const ObjCIndirectCopyRestoreExpr * CRE)4213  static void emitWritebackArg(CodeGenFunction &CGF, CallArgList &args,
4214                               const ObjCIndirectCopyRestoreExpr *CRE) {
4215    LValue srcLV;
4216  
4217    // Make an optimistic effort to emit the address as an l-value.
4218    // This can fail if the argument expression is more complicated.
4219    if (const Expr *lvExpr = maybeGetUnaryAddrOfOperand(CRE->getSubExpr())) {
4220      srcLV = CGF.EmitLValue(lvExpr);
4221  
4222    // Otherwise, just emit it as a scalar.
4223    } else {
4224      Address srcAddr = CGF.EmitPointerWithAlignment(CRE->getSubExpr());
4225  
4226      QualType srcAddrType =
4227        CRE->getSubExpr()->getType()->castAs<PointerType>()->getPointeeType();
4228      srcLV = CGF.MakeAddrLValue(srcAddr, srcAddrType);
4229    }
4230    Address srcAddr = srcLV.getAddress();
4231  
4232    // The dest and src types don't necessarily match in LLVM terms
4233    // because of the crazy ObjC compatibility rules.
4234  
4235    llvm::PointerType *destType =
4236        cast<llvm::PointerType>(CGF.ConvertType(CRE->getType()));
4237    llvm::Type *destElemType =
4238        CGF.ConvertTypeForMem(CRE->getType()->getPointeeType());
4239  
4240    // If the address is a constant null, just pass the appropriate null.
4241    if (isProvablyNull(srcAddr.getBasePointer())) {
4242      args.add(RValue::get(llvm::ConstantPointerNull::get(destType)),
4243               CRE->getType());
4244      return;
4245    }
4246  
4247    // Create the temporary.
4248    Address temp =
4249        CGF.CreateTempAlloca(destElemType, CGF.getPointerAlign(), "icr.temp");
4250    // Loading an l-value can introduce a cleanup if the l-value is __weak,
4251    // and that cleanup will be conditional if we can't prove that the l-value
4252    // isn't null, so we need to register a dominating point so that the cleanups
4253    // system will make valid IR.
4254    CodeGenFunction::ConditionalEvaluation condEval(CGF);
4255  
4256    // Zero-initialize it if we're not doing a copy-initialization.
4257    bool shouldCopy = CRE->shouldCopy();
4258    if (!shouldCopy) {
4259      llvm::Value *null =
4260          llvm::ConstantPointerNull::get(cast<llvm::PointerType>(destElemType));
4261      CGF.Builder.CreateStore(null, temp);
4262    }
4263  
4264    llvm::BasicBlock *contBB = nullptr;
4265    llvm::BasicBlock *originBB = nullptr;
4266  
4267    // If the address is *not* known to be non-null, we need to switch.
4268    llvm::Value *finalArgument;
4269  
4270    bool provablyNonNull = isProvablyNonNull(srcAddr, CGF);
4271  
4272    if (provablyNonNull) {
4273      finalArgument = temp.emitRawPointer(CGF);
4274    } else {
4275      llvm::Value *isNull = CGF.Builder.CreateIsNull(srcAddr, "icr.isnull");
4276  
4277      finalArgument = CGF.Builder.CreateSelect(
4278          isNull, llvm::ConstantPointerNull::get(destType),
4279          temp.emitRawPointer(CGF), "icr.argument");
4280  
4281      // If we need to copy, then the load has to be conditional, which
4282      // means we need control flow.
4283      if (shouldCopy) {
4284        originBB = CGF.Builder.GetInsertBlock();
4285        contBB = CGF.createBasicBlock("icr.cont");
4286        llvm::BasicBlock *copyBB = CGF.createBasicBlock("icr.copy");
4287        CGF.Builder.CreateCondBr(isNull, contBB, copyBB);
4288        CGF.EmitBlock(copyBB);
4289        condEval.begin(CGF);
4290      }
4291    }
4292  
4293    llvm::Value *valueToUse = nullptr;
4294  
4295    // Perform a copy if necessary.
4296    if (shouldCopy) {
4297      RValue srcRV = CGF.EmitLoadOfLValue(srcLV, SourceLocation());
4298      assert(srcRV.isScalar());
4299  
4300      llvm::Value *src = srcRV.getScalarVal();
4301      src = CGF.Builder.CreateBitCast(src, destElemType, "icr.cast");
4302  
4303      // Use an ordinary store, not a store-to-lvalue.
4304      CGF.Builder.CreateStore(src, temp);
4305  
4306      // If optimization is enabled, and the value was held in a
4307      // __strong variable, we need to tell the optimizer that this
4308      // value has to stay alive until we're doing the store back.
4309      // This is because the temporary is effectively unretained,
4310      // and so otherwise we can violate the high-level semantics.
4311      if (CGF.CGM.getCodeGenOpts().OptimizationLevel != 0 &&
4312          srcLV.getObjCLifetime() == Qualifiers::OCL_Strong) {
4313        valueToUse = src;
4314      }
4315    }
4316  
4317    // Finish the control flow if we needed it.
4318    if (shouldCopy && !provablyNonNull) {
4319      llvm::BasicBlock *copyBB = CGF.Builder.GetInsertBlock();
4320      CGF.EmitBlock(contBB);
4321  
4322      // Make a phi for the value to intrinsically use.
4323      if (valueToUse) {
4324        llvm::PHINode *phiToUse = CGF.Builder.CreatePHI(valueToUse->getType(), 2,
4325                                                        "icr.to-use");
4326        phiToUse->addIncoming(valueToUse, copyBB);
4327        phiToUse->addIncoming(llvm::UndefValue::get(valueToUse->getType()),
4328                              originBB);
4329        valueToUse = phiToUse;
4330      }
4331  
4332      condEval.end(CGF);
4333    }
4334  
4335    args.addWriteback(srcLV, temp, valueToUse);
4336    args.add(RValue::get(finalArgument), CRE->getType());
4337  }
4338  
allocateArgumentMemory(CodeGenFunction & CGF)4339  void CallArgList::allocateArgumentMemory(CodeGenFunction &CGF) {
4340    assert(!StackBase);
4341  
4342    // Save the stack.
4343    StackBase = CGF.Builder.CreateStackSave("inalloca.save");
4344  }
4345  
freeArgumentMemory(CodeGenFunction & CGF) const4346  void CallArgList::freeArgumentMemory(CodeGenFunction &CGF) const {
4347    if (StackBase) {
4348      // Restore the stack after the call.
4349      CGF.Builder.CreateStackRestore(StackBase);
4350    }
4351  }
4352  
EmitNonNullArgCheck(RValue RV,QualType ArgType,SourceLocation ArgLoc,AbstractCallee AC,unsigned ParmNum)4353  void CodeGenFunction::EmitNonNullArgCheck(RValue RV, QualType ArgType,
4354                                            SourceLocation ArgLoc,
4355                                            AbstractCallee AC,
4356                                            unsigned ParmNum) {
4357    if (!AC.getDecl() || !(SanOpts.has(SanitizerKind::NonnullAttribute) ||
4358                           SanOpts.has(SanitizerKind::NullabilityArg)))
4359      return;
4360  
4361    // The param decl may be missing in a variadic function.
4362    auto PVD = ParmNum < AC.getNumParams() ? AC.getParamDecl(ParmNum) : nullptr;
4363    unsigned ArgNo = PVD ? PVD->getFunctionScopeIndex() : ParmNum;
4364  
4365    // Prefer the nonnull attribute if it's present.
4366    const NonNullAttr *NNAttr = nullptr;
4367    if (SanOpts.has(SanitizerKind::NonnullAttribute))
4368      NNAttr = getNonNullAttr(AC.getDecl(), PVD, ArgType, ArgNo);
4369  
4370    bool CanCheckNullability = false;
4371    if (SanOpts.has(SanitizerKind::NullabilityArg) && !NNAttr && PVD &&
4372        !PVD->getType()->isRecordType()) {
4373      auto Nullability = PVD->getType()->getNullability();
4374      CanCheckNullability = Nullability &&
4375                            *Nullability == NullabilityKind::NonNull &&
4376                            PVD->getTypeSourceInfo();
4377    }
4378  
4379    if (!NNAttr && !CanCheckNullability)
4380      return;
4381  
4382    SourceLocation AttrLoc;
4383    SanitizerMask CheckKind;
4384    SanitizerHandler Handler;
4385    if (NNAttr) {
4386      AttrLoc = NNAttr->getLocation();
4387      CheckKind = SanitizerKind::NonnullAttribute;
4388      Handler = SanitizerHandler::NonnullArg;
4389    } else {
4390      AttrLoc = PVD->getTypeSourceInfo()->getTypeLoc().findNullabilityLoc();
4391      CheckKind = SanitizerKind::NullabilityArg;
4392      Handler = SanitizerHandler::NullabilityArg;
4393    }
4394  
4395    SanitizerScope SanScope(this);
4396    llvm::Value *Cond = EmitNonNullRValueCheck(RV, ArgType);
4397    llvm::Constant *StaticData[] = {
4398        EmitCheckSourceLocation(ArgLoc), EmitCheckSourceLocation(AttrLoc),
4399        llvm::ConstantInt::get(Int32Ty, ArgNo + 1),
4400    };
4401    EmitCheck(std::make_pair(Cond, CheckKind), Handler, StaticData, std::nullopt);
4402  }
4403  
EmitNonNullArgCheck(Address Addr,QualType ArgType,SourceLocation ArgLoc,AbstractCallee AC,unsigned ParmNum)4404  void CodeGenFunction::EmitNonNullArgCheck(Address Addr, QualType ArgType,
4405                                            SourceLocation ArgLoc,
4406                                            AbstractCallee AC, unsigned ParmNum) {
4407    if (!AC.getDecl() || !(SanOpts.has(SanitizerKind::NonnullAttribute) ||
4408                           SanOpts.has(SanitizerKind::NullabilityArg)))
4409      return;
4410  
4411    EmitNonNullArgCheck(RValue::get(Addr, *this), ArgType, ArgLoc, AC, ParmNum);
4412  }
4413  
4414  // Check if the call is going to use the inalloca convention. This needs to
4415  // agree with CGFunctionInfo::usesInAlloca. The CGFunctionInfo is arranged
4416  // later, so we can't check it directly.
hasInAllocaArgs(CodeGenModule & CGM,CallingConv ExplicitCC,ArrayRef<QualType> ArgTypes)4417  static bool hasInAllocaArgs(CodeGenModule &CGM, CallingConv ExplicitCC,
4418                              ArrayRef<QualType> ArgTypes) {
4419    // The Swift calling conventions don't go through the target-specific
4420    // argument classification, they never use inalloca.
4421    // TODO: Consider limiting inalloca use to only calling conventions supported
4422    // by MSVC.
4423    if (ExplicitCC == CC_Swift || ExplicitCC == CC_SwiftAsync)
4424      return false;
4425    if (!CGM.getTarget().getCXXABI().isMicrosoft())
4426      return false;
4427    return llvm::any_of(ArgTypes, [&](QualType Ty) {
4428      return isInAllocaArgument(CGM.getCXXABI(), Ty);
4429    });
4430  }
4431  
4432  #ifndef NDEBUG
4433  // Determine whether the given argument is an Objective-C method
4434  // that may have type parameters in its signature.
isObjCMethodWithTypeParams(const ObjCMethodDecl * method)4435  static bool isObjCMethodWithTypeParams(const ObjCMethodDecl *method) {
4436    const DeclContext *dc = method->getDeclContext();
4437    if (const ObjCInterfaceDecl *classDecl = dyn_cast<ObjCInterfaceDecl>(dc)) {
4438      return classDecl->getTypeParamListAsWritten();
4439    }
4440  
4441    if (const ObjCCategoryDecl *catDecl = dyn_cast<ObjCCategoryDecl>(dc)) {
4442      return catDecl->getTypeParamList();
4443    }
4444  
4445    return false;
4446  }
4447  #endif
4448  
4449  /// EmitCallArgs - Emit call arguments for a function.
EmitCallArgs(CallArgList & Args,PrototypeWrapper Prototype,llvm::iterator_range<CallExpr::const_arg_iterator> ArgRange,AbstractCallee AC,unsigned ParamsToSkip,EvaluationOrder Order)4450  void CodeGenFunction::EmitCallArgs(
4451      CallArgList &Args, PrototypeWrapper Prototype,
4452      llvm::iterator_range<CallExpr::const_arg_iterator> ArgRange,
4453      AbstractCallee AC, unsigned ParamsToSkip, EvaluationOrder Order) {
4454    SmallVector<QualType, 16> ArgTypes;
4455  
4456    assert((ParamsToSkip == 0 || Prototype.P) &&
4457           "Can't skip parameters if type info is not provided");
4458  
4459    // This variable only captures *explicitly* written conventions, not those
4460    // applied by default via command line flags or target defaults, such as
4461    // thiscall, aapcs, stdcall via -mrtd, etc. Computing that correctly would
4462    // require knowing if this is a C++ instance method or being able to see
4463    // unprototyped FunctionTypes.
4464    CallingConv ExplicitCC = CC_C;
4465  
4466    // First, if a prototype was provided, use those argument types.
4467    bool IsVariadic = false;
4468    if (Prototype.P) {
4469      const auto *MD = Prototype.P.dyn_cast<const ObjCMethodDecl *>();
4470      if (MD) {
4471        IsVariadic = MD->isVariadic();
4472        ExplicitCC = getCallingConventionForDecl(
4473            MD, CGM.getTarget().getTriple().isOSWindows());
4474        ArgTypes.assign(MD->param_type_begin() + ParamsToSkip,
4475                        MD->param_type_end());
4476      } else {
4477        const auto *FPT = Prototype.P.get<const FunctionProtoType *>();
4478        IsVariadic = FPT->isVariadic();
4479        ExplicitCC = FPT->getExtInfo().getCC();
4480        ArgTypes.assign(FPT->param_type_begin() + ParamsToSkip,
4481                        FPT->param_type_end());
4482      }
4483  
4484  #ifndef NDEBUG
4485      // Check that the prototyped types match the argument expression types.
4486      bool isGenericMethod = MD && isObjCMethodWithTypeParams(MD);
4487      CallExpr::const_arg_iterator Arg = ArgRange.begin();
4488      for (QualType Ty : ArgTypes) {
4489        assert(Arg != ArgRange.end() && "Running over edge of argument list!");
4490        assert(
4491            (isGenericMethod || Ty->isVariablyModifiedType() ||
4492             Ty.getNonReferenceType()->isObjCRetainableType() ||
4493             getContext()
4494                     .getCanonicalType(Ty.getNonReferenceType())
4495                     .getTypePtr() ==
4496                 getContext().getCanonicalType((*Arg)->getType()).getTypePtr()) &&
4497            "type mismatch in call argument!");
4498        ++Arg;
4499      }
4500  
4501      // Either we've emitted all the call args, or we have a call to variadic
4502      // function.
4503      assert((Arg == ArgRange.end() || IsVariadic) &&
4504             "Extra arguments in non-variadic function!");
4505  #endif
4506    }
4507  
4508    // If we still have any arguments, emit them using the type of the argument.
4509    for (auto *A : llvm::drop_begin(ArgRange, ArgTypes.size()))
4510      ArgTypes.push_back(IsVariadic ? getVarArgType(A) : A->getType());
4511    assert((int)ArgTypes.size() == (ArgRange.end() - ArgRange.begin()));
4512  
4513    // We must evaluate arguments from right to left in the MS C++ ABI,
4514    // because arguments are destroyed left to right in the callee. As a special
4515    // case, there are certain language constructs that require left-to-right
4516    // evaluation, and in those cases we consider the evaluation order requirement
4517    // to trump the "destruction order is reverse construction order" guarantee.
4518    bool LeftToRight =
4519        CGM.getTarget().getCXXABI().areArgsDestroyedLeftToRightInCallee()
4520            ? Order == EvaluationOrder::ForceLeftToRight
4521            : Order != EvaluationOrder::ForceRightToLeft;
4522  
4523    auto MaybeEmitImplicitObjectSize = [&](unsigned I, const Expr *Arg,
4524                                           RValue EmittedArg) {
4525      if (!AC.hasFunctionDecl() || I >= AC.getNumParams())
4526        return;
4527      auto *PS = AC.getParamDecl(I)->getAttr<PassObjectSizeAttr>();
4528      if (PS == nullptr)
4529        return;
4530  
4531      const auto &Context = getContext();
4532      auto SizeTy = Context.getSizeType();
4533      auto T = Builder.getIntNTy(Context.getTypeSize(SizeTy));
4534      assert(EmittedArg.getScalarVal() && "We emitted nothing for the arg?");
4535      llvm::Value *V = evaluateOrEmitBuiltinObjectSize(Arg, PS->getType(), T,
4536                                                       EmittedArg.getScalarVal(),
4537                                                       PS->isDynamic());
4538      Args.add(RValue::get(V), SizeTy);
4539      // If we're emitting args in reverse, be sure to do so with
4540      // pass_object_size, as well.
4541      if (!LeftToRight)
4542        std::swap(Args.back(), *(&Args.back() - 1));
4543    };
4544  
4545    // Insert a stack save if we're going to need any inalloca args.
4546    if (hasInAllocaArgs(CGM, ExplicitCC, ArgTypes)) {
4547      assert(getTarget().getTriple().getArch() == llvm::Triple::x86 &&
4548             "inalloca only supported on x86");
4549      Args.allocateArgumentMemory(*this);
4550    }
4551  
4552    // Evaluate each argument in the appropriate order.
4553    size_t CallArgsStart = Args.size();
4554    for (unsigned I = 0, E = ArgTypes.size(); I != E; ++I) {
4555      unsigned Idx = LeftToRight ? I : E - I - 1;
4556      CallExpr::const_arg_iterator Arg = ArgRange.begin() + Idx;
4557      unsigned InitialArgSize = Args.size();
4558      // If *Arg is an ObjCIndirectCopyRestoreExpr, check that either the types of
4559      // the argument and parameter match or the objc method is parameterized.
4560      assert((!isa<ObjCIndirectCopyRestoreExpr>(*Arg) ||
4561              getContext().hasSameUnqualifiedType((*Arg)->getType(),
4562                                                  ArgTypes[Idx]) ||
4563              (isa<ObjCMethodDecl>(AC.getDecl()) &&
4564               isObjCMethodWithTypeParams(cast<ObjCMethodDecl>(AC.getDecl())))) &&
4565             "Argument and parameter types don't match");
4566      EmitCallArg(Args, *Arg, ArgTypes[Idx]);
4567      // In particular, we depend on it being the last arg in Args, and the
4568      // objectsize bits depend on there only being one arg if !LeftToRight.
4569      assert(InitialArgSize + 1 == Args.size() &&
4570             "The code below depends on only adding one arg per EmitCallArg");
4571      (void)InitialArgSize;
4572      // Since pointer argument are never emitted as LValue, it is safe to emit
4573      // non-null argument check for r-value only.
4574      if (!Args.back().hasLValue()) {
4575        RValue RVArg = Args.back().getKnownRValue();
4576        EmitNonNullArgCheck(RVArg, ArgTypes[Idx], (*Arg)->getExprLoc(), AC,
4577                            ParamsToSkip + Idx);
4578        // @llvm.objectsize should never have side-effects and shouldn't need
4579        // destruction/cleanups, so we can safely "emit" it after its arg,
4580        // regardless of right-to-leftness
4581        MaybeEmitImplicitObjectSize(Idx, *Arg, RVArg);
4582      }
4583    }
4584  
4585    if (!LeftToRight) {
4586      // Un-reverse the arguments we just evaluated so they match up with the LLVM
4587      // IR function.
4588      std::reverse(Args.begin() + CallArgsStart, Args.end());
4589    }
4590  }
4591  
4592  namespace {
4593  
4594  struct DestroyUnpassedArg final : EHScopeStack::Cleanup {
DestroyUnpassedArg__anonf4c048640f11::DestroyUnpassedArg4595    DestroyUnpassedArg(Address Addr, QualType Ty)
4596        : Addr(Addr), Ty(Ty) {}
4597  
4598    Address Addr;
4599    QualType Ty;
4600  
Emit__anonf4c048640f11::DestroyUnpassedArg4601    void Emit(CodeGenFunction &CGF, Flags flags) override {
4602      QualType::DestructionKind DtorKind = Ty.isDestructedType();
4603      if (DtorKind == QualType::DK_cxx_destructor) {
4604        const CXXDestructorDecl *Dtor = Ty->getAsCXXRecordDecl()->getDestructor();
4605        assert(!Dtor->isTrivial());
4606        CGF.EmitCXXDestructorCall(Dtor, Dtor_Complete, /*for vbase*/ false,
4607                                  /*Delegating=*/false, Addr, Ty);
4608      } else {
4609        CGF.callCStructDestructor(CGF.MakeAddrLValue(Addr, Ty));
4610      }
4611    }
4612  };
4613  
4614  struct DisableDebugLocationUpdates {
4615    CodeGenFunction &CGF;
4616    bool disabledDebugInfo;
DisableDebugLocationUpdates__anonf4c048640f11::DisableDebugLocationUpdates4617    DisableDebugLocationUpdates(CodeGenFunction &CGF, const Expr *E) : CGF(CGF) {
4618      if ((disabledDebugInfo = isa<CXXDefaultArgExpr>(E) && CGF.getDebugInfo()))
4619        CGF.disableDebugInfo();
4620    }
~DisableDebugLocationUpdates__anonf4c048640f11::DisableDebugLocationUpdates4621    ~DisableDebugLocationUpdates() {
4622      if (disabledDebugInfo)
4623        CGF.enableDebugInfo();
4624    }
4625  };
4626  
4627  } // end anonymous namespace
4628  
getRValue(CodeGenFunction & CGF) const4629  RValue CallArg::getRValue(CodeGenFunction &CGF) const {
4630    if (!HasLV)
4631      return RV;
4632    LValue Copy = CGF.MakeAddrLValue(CGF.CreateMemTemp(Ty), Ty);
4633    CGF.EmitAggregateCopy(Copy, LV, Ty, AggValueSlot::DoesNotOverlap,
4634                          LV.isVolatile());
4635    IsUsed = true;
4636    return RValue::getAggregate(Copy.getAddress());
4637  }
4638  
copyInto(CodeGenFunction & CGF,Address Addr) const4639  void CallArg::copyInto(CodeGenFunction &CGF, Address Addr) const {
4640    LValue Dst = CGF.MakeAddrLValue(Addr, Ty);
4641    if (!HasLV && RV.isScalar())
4642      CGF.EmitStoreOfScalar(RV.getScalarVal(), Dst, /*isInit=*/true);
4643    else if (!HasLV && RV.isComplex())
4644      CGF.EmitStoreOfComplex(RV.getComplexVal(), Dst, /*init=*/true);
4645    else {
4646      auto Addr = HasLV ? LV.getAddress() : RV.getAggregateAddress();
4647      LValue SrcLV = CGF.MakeAddrLValue(Addr, Ty);
4648      // We assume that call args are never copied into subobjects.
4649      CGF.EmitAggregateCopy(Dst, SrcLV, Ty, AggValueSlot::DoesNotOverlap,
4650                            HasLV ? LV.isVolatileQualified()
4651                                  : RV.isVolatileQualified());
4652    }
4653    IsUsed = true;
4654  }
4655  
EmitCallArg(CallArgList & args,const Expr * E,QualType type)4656  void CodeGenFunction::EmitCallArg(CallArgList &args, const Expr *E,
4657                                    QualType type) {
4658    DisableDebugLocationUpdates Dis(*this, E);
4659    if (const ObjCIndirectCopyRestoreExpr *CRE
4660          = dyn_cast<ObjCIndirectCopyRestoreExpr>(E)) {
4661      assert(getLangOpts().ObjCAutoRefCount);
4662      return emitWritebackArg(*this, args, CRE);
4663    }
4664  
4665    assert(type->isReferenceType() == E->isGLValue() &&
4666           "reference binding to unmaterialized r-value!");
4667  
4668    if (E->isGLValue()) {
4669      assert(E->getObjectKind() == OK_Ordinary);
4670      return args.add(EmitReferenceBindingToExpr(E), type);
4671    }
4672  
4673    bool HasAggregateEvalKind = hasAggregateEvaluationKind(type);
4674  
4675    // In the Microsoft C++ ABI, aggregate arguments are destructed by the callee.
4676    // However, we still have to push an EH-only cleanup in case we unwind before
4677    // we make it to the call.
4678    if (type->isRecordType() &&
4679        type->castAs<RecordType>()->getDecl()->isParamDestroyedInCallee()) {
4680      // If we're using inalloca, use the argument memory.  Otherwise, use a
4681      // temporary.
4682      AggValueSlot Slot = args.isUsingInAlloca()
4683          ? createPlaceholderSlot(*this, type) : CreateAggTemp(type, "agg.tmp");
4684  
4685      bool DestroyedInCallee = true, NeedsCleanup = true;
4686      if (const auto *RD = type->getAsCXXRecordDecl())
4687        DestroyedInCallee = RD->hasNonTrivialDestructor();
4688      else
4689        NeedsCleanup = type.isDestructedType();
4690  
4691      if (DestroyedInCallee)
4692        Slot.setExternallyDestructed();
4693  
4694      EmitAggExpr(E, Slot);
4695      RValue RV = Slot.asRValue();
4696      args.add(RV, type);
4697  
4698      if (DestroyedInCallee && NeedsCleanup) {
4699        // Create a no-op GEP between the placeholder and the cleanup so we can
4700        // RAUW it successfully.  It also serves as a marker of the first
4701        // instruction where the cleanup is active.
4702        pushFullExprCleanup<DestroyUnpassedArg>(NormalAndEHCleanup,
4703                                                Slot.getAddress(), type);
4704        // This unreachable is a temporary marker which will be removed later.
4705        llvm::Instruction *IsActive =
4706            Builder.CreateFlagLoad(llvm::Constant::getNullValue(Int8PtrTy));
4707        args.addArgCleanupDeactivation(EHStack.stable_begin(), IsActive);
4708      }
4709      return;
4710    }
4711  
4712    if (HasAggregateEvalKind && isa<ImplicitCastExpr>(E) &&
4713        cast<CastExpr>(E)->getCastKind() == CK_LValueToRValue &&
4714        !type->isArrayParameterType()) {
4715      LValue L = EmitLValue(cast<CastExpr>(E)->getSubExpr());
4716      assert(L.isSimple());
4717      args.addUncopiedAggregate(L, type);
4718      return;
4719    }
4720  
4721    args.add(EmitAnyExprToTemp(E), type);
4722  }
4723  
getVarArgType(const Expr * Arg)4724  QualType CodeGenFunction::getVarArgType(const Expr *Arg) {
4725    // System headers on Windows define NULL to 0 instead of 0LL on Win64. MSVC
4726    // implicitly widens null pointer constants that are arguments to varargs
4727    // functions to pointer-sized ints.
4728    if (!getTarget().getTriple().isOSWindows())
4729      return Arg->getType();
4730  
4731    if (Arg->getType()->isIntegerType() &&
4732        getContext().getTypeSize(Arg->getType()) <
4733            getContext().getTargetInfo().getPointerWidth(LangAS::Default) &&
4734        Arg->isNullPointerConstant(getContext(),
4735                                   Expr::NPC_ValueDependentIsNotNull)) {
4736      return getContext().getIntPtrType();
4737    }
4738  
4739    return Arg->getType();
4740  }
4741  
4742  // In ObjC ARC mode with no ObjC ARC exception safety, tell the ARC
4743  // optimizer it can aggressively ignore unwind edges.
4744  void
AddObjCARCExceptionMetadata(llvm::Instruction * Inst)4745  CodeGenFunction::AddObjCARCExceptionMetadata(llvm::Instruction *Inst) {
4746    if (CGM.getCodeGenOpts().OptimizationLevel != 0 &&
4747        !CGM.getCodeGenOpts().ObjCAutoRefCountExceptions)
4748      Inst->setMetadata("clang.arc.no_objc_arc_exceptions",
4749                        CGM.getNoObjCARCExceptionsMetadata());
4750  }
4751  
4752  /// Emits a call to the given no-arguments nounwind runtime function.
4753  llvm::CallInst *
EmitNounwindRuntimeCall(llvm::FunctionCallee callee,const llvm::Twine & name)4754  CodeGenFunction::EmitNounwindRuntimeCall(llvm::FunctionCallee callee,
4755                                           const llvm::Twine &name) {
4756    return EmitNounwindRuntimeCall(callee, ArrayRef<llvm::Value *>(), name);
4757  }
4758  
4759  /// Emits a call to the given nounwind runtime function.
4760  llvm::CallInst *
EmitNounwindRuntimeCall(llvm::FunctionCallee callee,ArrayRef<Address> args,const llvm::Twine & name)4761  CodeGenFunction::EmitNounwindRuntimeCall(llvm::FunctionCallee callee,
4762                                           ArrayRef<Address> args,
4763                                           const llvm::Twine &name) {
4764    SmallVector<llvm::Value *, 3> values;
4765    for (auto arg : args)
4766      values.push_back(arg.emitRawPointer(*this));
4767    return EmitNounwindRuntimeCall(callee, values, name);
4768  }
4769  
4770  llvm::CallInst *
EmitNounwindRuntimeCall(llvm::FunctionCallee callee,ArrayRef<llvm::Value * > args,const llvm::Twine & name)4771  CodeGenFunction::EmitNounwindRuntimeCall(llvm::FunctionCallee callee,
4772                                           ArrayRef<llvm::Value *> args,
4773                                           const llvm::Twine &name) {
4774    llvm::CallInst *call = EmitRuntimeCall(callee, args, name);
4775    call->setDoesNotThrow();
4776    return call;
4777  }
4778  
4779  /// Emits a simple call (never an invoke) to the given no-arguments
4780  /// runtime function.
EmitRuntimeCall(llvm::FunctionCallee callee,const llvm::Twine & name)4781  llvm::CallInst *CodeGenFunction::EmitRuntimeCall(llvm::FunctionCallee callee,
4782                                                   const llvm::Twine &name) {
4783    return EmitRuntimeCall(callee, std::nullopt, name);
4784  }
4785  
4786  // Calls which may throw must have operand bundles indicating which funclet
4787  // they are nested within.
4788  SmallVector<llvm::OperandBundleDef, 1>
getBundlesForFunclet(llvm::Value * Callee)4789  CodeGenFunction::getBundlesForFunclet(llvm::Value *Callee) {
4790    // There is no need for a funclet operand bundle if we aren't inside a
4791    // funclet.
4792    if (!CurrentFuncletPad)
4793      return (SmallVector<llvm::OperandBundleDef, 1>());
4794  
4795    // Skip intrinsics which cannot throw (as long as they don't lower into
4796    // regular function calls in the course of IR transformations).
4797    if (auto *CalleeFn = dyn_cast<llvm::Function>(Callee->stripPointerCasts())) {
4798      if (CalleeFn->isIntrinsic() && CalleeFn->doesNotThrow()) {
4799        auto IID = CalleeFn->getIntrinsicID();
4800        if (!llvm::IntrinsicInst::mayLowerToFunctionCall(IID))
4801          return (SmallVector<llvm::OperandBundleDef, 1>());
4802      }
4803    }
4804  
4805    SmallVector<llvm::OperandBundleDef, 1> BundleList;
4806    BundleList.emplace_back("funclet", CurrentFuncletPad);
4807    return BundleList;
4808  }
4809  
4810  /// Emits a simple call (never an invoke) to the given runtime function.
EmitRuntimeCall(llvm::FunctionCallee callee,ArrayRef<llvm::Value * > args,const llvm::Twine & name)4811  llvm::CallInst *CodeGenFunction::EmitRuntimeCall(llvm::FunctionCallee callee,
4812                                                   ArrayRef<llvm::Value *> args,
4813                                                   const llvm::Twine &name) {
4814    llvm::CallInst *call = Builder.CreateCall(
4815        callee, args, getBundlesForFunclet(callee.getCallee()), name);
4816    call->setCallingConv(getRuntimeCC());
4817  
4818    if (CGM.shouldEmitConvergenceTokens() && call->isConvergent())
4819      return addControlledConvergenceToken(call);
4820    return call;
4821  }
4822  
4823  /// Emits a call or invoke to the given noreturn runtime function.
EmitNoreturnRuntimeCallOrInvoke(llvm::FunctionCallee callee,ArrayRef<llvm::Value * > args)4824  void CodeGenFunction::EmitNoreturnRuntimeCallOrInvoke(
4825      llvm::FunctionCallee callee, ArrayRef<llvm::Value *> args) {
4826    SmallVector<llvm::OperandBundleDef, 1> BundleList =
4827        getBundlesForFunclet(callee.getCallee());
4828  
4829    if (getInvokeDest()) {
4830      llvm::InvokeInst *invoke =
4831        Builder.CreateInvoke(callee,
4832                             getUnreachableBlock(),
4833                             getInvokeDest(),
4834                             args,
4835                             BundleList);
4836      invoke->setDoesNotReturn();
4837      invoke->setCallingConv(getRuntimeCC());
4838    } else {
4839      llvm::CallInst *call = Builder.CreateCall(callee, args, BundleList);
4840      call->setDoesNotReturn();
4841      call->setCallingConv(getRuntimeCC());
4842      Builder.CreateUnreachable();
4843    }
4844  }
4845  
4846  /// Emits a call or invoke instruction to the given nullary runtime function.
4847  llvm::CallBase *
EmitRuntimeCallOrInvoke(llvm::FunctionCallee callee,const Twine & name)4848  CodeGenFunction::EmitRuntimeCallOrInvoke(llvm::FunctionCallee callee,
4849                                           const Twine &name) {
4850    return EmitRuntimeCallOrInvoke(callee, std::nullopt, name);
4851  }
4852  
4853  /// Emits a call or invoke instruction to the given runtime function.
4854  llvm::CallBase *
EmitRuntimeCallOrInvoke(llvm::FunctionCallee callee,ArrayRef<llvm::Value * > args,const Twine & name)4855  CodeGenFunction::EmitRuntimeCallOrInvoke(llvm::FunctionCallee callee,
4856                                           ArrayRef<llvm::Value *> args,
4857                                           const Twine &name) {
4858    llvm::CallBase *call = EmitCallOrInvoke(callee, args, name);
4859    call->setCallingConv(getRuntimeCC());
4860    return call;
4861  }
4862  
4863  /// Emits a call or invoke instruction to the given function, depending
4864  /// on the current state of the EH stack.
EmitCallOrInvoke(llvm::FunctionCallee Callee,ArrayRef<llvm::Value * > Args,const Twine & Name)4865  llvm::CallBase *CodeGenFunction::EmitCallOrInvoke(llvm::FunctionCallee Callee,
4866                                                    ArrayRef<llvm::Value *> Args,
4867                                                    const Twine &Name) {
4868    llvm::BasicBlock *InvokeDest = getInvokeDest();
4869    SmallVector<llvm::OperandBundleDef, 1> BundleList =
4870        getBundlesForFunclet(Callee.getCallee());
4871  
4872    llvm::CallBase *Inst;
4873    if (!InvokeDest)
4874      Inst = Builder.CreateCall(Callee, Args, BundleList, Name);
4875    else {
4876      llvm::BasicBlock *ContBB = createBasicBlock("invoke.cont");
4877      Inst = Builder.CreateInvoke(Callee, ContBB, InvokeDest, Args, BundleList,
4878                                  Name);
4879      EmitBlock(ContBB);
4880    }
4881  
4882    // In ObjC ARC mode with no ObjC ARC exception safety, tell the ARC
4883    // optimizer it can aggressively ignore unwind edges.
4884    if (CGM.getLangOpts().ObjCAutoRefCount)
4885      AddObjCARCExceptionMetadata(Inst);
4886  
4887    return Inst;
4888  }
4889  
deferPlaceholderReplacement(llvm::Instruction * Old,llvm::Value * New)4890  void CodeGenFunction::deferPlaceholderReplacement(llvm::Instruction *Old,
4891                                                    llvm::Value *New) {
4892    DeferredReplacements.push_back(
4893        std::make_pair(llvm::WeakTrackingVH(Old), New));
4894  }
4895  
4896  namespace {
4897  
4898  /// Specify given \p NewAlign as the alignment of return value attribute. If
4899  /// such attribute already exists, re-set it to the maximal one of two options.
4900  [[nodiscard]] llvm::AttributeList
maybeRaiseRetAlignmentAttribute(llvm::LLVMContext & Ctx,const llvm::AttributeList & Attrs,llvm::Align NewAlign)4901  maybeRaiseRetAlignmentAttribute(llvm::LLVMContext &Ctx,
4902                                  const llvm::AttributeList &Attrs,
4903                                  llvm::Align NewAlign) {
4904    llvm::Align CurAlign = Attrs.getRetAlignment().valueOrOne();
4905    if (CurAlign >= NewAlign)
4906      return Attrs;
4907    llvm::Attribute AlignAttr = llvm::Attribute::getWithAlignment(Ctx, NewAlign);
4908    return Attrs.removeRetAttribute(Ctx, llvm::Attribute::AttrKind::Alignment)
4909        .addRetAttribute(Ctx, AlignAttr);
4910  }
4911  
4912  template <typename AlignedAttrTy> class AbstractAssumeAlignedAttrEmitter {
4913  protected:
4914    CodeGenFunction &CGF;
4915  
4916    /// We do nothing if this is, or becomes, nullptr.
4917    const AlignedAttrTy *AA = nullptr;
4918  
4919    llvm::Value *Alignment = nullptr;      // May or may not be a constant.
4920    llvm::ConstantInt *OffsetCI = nullptr; // Constant, hopefully zero.
4921  
AbstractAssumeAlignedAttrEmitter(CodeGenFunction & CGF_,const Decl * FuncDecl)4922    AbstractAssumeAlignedAttrEmitter(CodeGenFunction &CGF_, const Decl *FuncDecl)
4923        : CGF(CGF_) {
4924      if (!FuncDecl)
4925        return;
4926      AA = FuncDecl->getAttr<AlignedAttrTy>();
4927    }
4928  
4929  public:
4930    /// If we can, materialize the alignment as an attribute on return value.
4931    [[nodiscard]] llvm::AttributeList
TryEmitAsCallSiteAttribute(const llvm::AttributeList & Attrs)4932    TryEmitAsCallSiteAttribute(const llvm::AttributeList &Attrs) {
4933      if (!AA || OffsetCI || CGF.SanOpts.has(SanitizerKind::Alignment))
4934        return Attrs;
4935      const auto *AlignmentCI = dyn_cast<llvm::ConstantInt>(Alignment);
4936      if (!AlignmentCI)
4937        return Attrs;
4938      // We may legitimately have non-power-of-2 alignment here.
4939      // If so, this is UB land, emit it via `@llvm.assume` instead.
4940      if (!AlignmentCI->getValue().isPowerOf2())
4941        return Attrs;
4942      llvm::AttributeList NewAttrs = maybeRaiseRetAlignmentAttribute(
4943          CGF.getLLVMContext(), Attrs,
4944          llvm::Align(
4945              AlignmentCI->getLimitedValue(llvm::Value::MaximumAlignment)));
4946      AA = nullptr; // We're done. Disallow doing anything else.
4947      return NewAttrs;
4948    }
4949  
4950    /// Emit alignment assumption.
4951    /// This is a general fallback that we take if either there is an offset,
4952    /// or the alignment is variable or we are sanitizing for alignment.
EmitAsAnAssumption(SourceLocation Loc,QualType RetTy,RValue & Ret)4953    void EmitAsAnAssumption(SourceLocation Loc, QualType RetTy, RValue &Ret) {
4954      if (!AA)
4955        return;
4956      CGF.emitAlignmentAssumption(Ret.getScalarVal(), RetTy, Loc,
4957                                  AA->getLocation(), Alignment, OffsetCI);
4958      AA = nullptr; // We're done. Disallow doing anything else.
4959    }
4960  };
4961  
4962  /// Helper data structure to emit `AssumeAlignedAttr`.
4963  class AssumeAlignedAttrEmitter final
4964      : public AbstractAssumeAlignedAttrEmitter<AssumeAlignedAttr> {
4965  public:
AssumeAlignedAttrEmitter(CodeGenFunction & CGF_,const Decl * FuncDecl)4966    AssumeAlignedAttrEmitter(CodeGenFunction &CGF_, const Decl *FuncDecl)
4967        : AbstractAssumeAlignedAttrEmitter(CGF_, FuncDecl) {
4968      if (!AA)
4969        return;
4970      // It is guaranteed that the alignment/offset are constants.
4971      Alignment = cast<llvm::ConstantInt>(CGF.EmitScalarExpr(AA->getAlignment()));
4972      if (Expr *Offset = AA->getOffset()) {
4973        OffsetCI = cast<llvm::ConstantInt>(CGF.EmitScalarExpr(Offset));
4974        if (OffsetCI->isNullValue()) // Canonicalize zero offset to no offset.
4975          OffsetCI = nullptr;
4976      }
4977    }
4978  };
4979  
4980  /// Helper data structure to emit `AllocAlignAttr`.
4981  class AllocAlignAttrEmitter final
4982      : public AbstractAssumeAlignedAttrEmitter<AllocAlignAttr> {
4983  public:
AllocAlignAttrEmitter(CodeGenFunction & CGF_,const Decl * FuncDecl,const CallArgList & CallArgs)4984    AllocAlignAttrEmitter(CodeGenFunction &CGF_, const Decl *FuncDecl,
4985                          const CallArgList &CallArgs)
4986        : AbstractAssumeAlignedAttrEmitter(CGF_, FuncDecl) {
4987      if (!AA)
4988        return;
4989      // Alignment may or may not be a constant, and that is okay.
4990      Alignment = CallArgs[AA->getParamIndex().getLLVMIndex()]
4991                      .getRValue(CGF)
4992                      .getScalarVal();
4993    }
4994  };
4995  
4996  } // namespace
4997  
getMaxVectorWidth(const llvm::Type * Ty)4998  static unsigned getMaxVectorWidth(const llvm::Type *Ty) {
4999    if (auto *VT = dyn_cast<llvm::VectorType>(Ty))
5000      return VT->getPrimitiveSizeInBits().getKnownMinValue();
5001    if (auto *AT = dyn_cast<llvm::ArrayType>(Ty))
5002      return getMaxVectorWidth(AT->getElementType());
5003  
5004    unsigned MaxVectorWidth = 0;
5005    if (auto *ST = dyn_cast<llvm::StructType>(Ty))
5006      for (auto *I : ST->elements())
5007        MaxVectorWidth = std::max(MaxVectorWidth, getMaxVectorWidth(I));
5008    return MaxVectorWidth;
5009  }
5010  
EmitCall(const CGFunctionInfo & CallInfo,const CGCallee & Callee,ReturnValueSlot ReturnValue,const CallArgList & CallArgs,llvm::CallBase ** callOrInvoke,bool IsMustTail,SourceLocation Loc,bool IsVirtualFunctionPointerThunk)5011  RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
5012                                   const CGCallee &Callee,
5013                                   ReturnValueSlot ReturnValue,
5014                                   const CallArgList &CallArgs,
5015                                   llvm::CallBase **callOrInvoke, bool IsMustTail,
5016                                   SourceLocation Loc,
5017                                   bool IsVirtualFunctionPointerThunk) {
5018    // FIXME: We no longer need the types from CallArgs; lift up and simplify.
5019  
5020    assert(Callee.isOrdinary() || Callee.isVirtual());
5021  
5022    // Handle struct-return functions by passing a pointer to the
5023    // location that we would like to return into.
5024    QualType RetTy = CallInfo.getReturnType();
5025    const ABIArgInfo &RetAI = CallInfo.getReturnInfo();
5026  
5027    llvm::FunctionType *IRFuncTy = getTypes().GetFunctionType(CallInfo);
5028  
5029    const Decl *TargetDecl = Callee.getAbstractInfo().getCalleeDecl().getDecl();
5030    if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl)) {
5031      // We can only guarantee that a function is called from the correct
5032      // context/function based on the appropriate target attributes,
5033      // so only check in the case where we have both always_inline and target
5034      // since otherwise we could be making a conditional call after a check for
5035      // the proper cpu features (and it won't cause code generation issues due to
5036      // function based code generation).
5037      if (TargetDecl->hasAttr<AlwaysInlineAttr>() &&
5038          (TargetDecl->hasAttr<TargetAttr>() ||
5039           (CurFuncDecl && CurFuncDecl->hasAttr<TargetAttr>())))
5040        checkTargetFeatures(Loc, FD);
5041    }
5042  
5043    // Some architectures (such as x86-64) have the ABI changed based on
5044    // attribute-target/features. Give them a chance to diagnose.
5045    CGM.getTargetCodeGenInfo().checkFunctionCallABI(
5046        CGM, Loc, dyn_cast_or_null<FunctionDecl>(CurCodeDecl),
5047        dyn_cast_or_null<FunctionDecl>(TargetDecl), CallArgs, RetTy);
5048  
5049    // 1. Set up the arguments.
5050  
5051    // If we're using inalloca, insert the allocation after the stack save.
5052    // FIXME: Do this earlier rather than hacking it in here!
5053    RawAddress ArgMemory = RawAddress::invalid();
5054    if (llvm::StructType *ArgStruct = CallInfo.getArgStruct()) {
5055      const llvm::DataLayout &DL = CGM.getDataLayout();
5056      llvm::Instruction *IP = CallArgs.getStackBase();
5057      llvm::AllocaInst *AI;
5058      if (IP) {
5059        IP = IP->getNextNode();
5060        AI = new llvm::AllocaInst(ArgStruct, DL.getAllocaAddrSpace(),
5061                                  "argmem", IP);
5062      } else {
5063        AI = CreateTempAlloca(ArgStruct, "argmem");
5064      }
5065      auto Align = CallInfo.getArgStructAlignment();
5066      AI->setAlignment(Align.getAsAlign());
5067      AI->setUsedWithInAlloca(true);
5068      assert(AI->isUsedWithInAlloca() && !AI->isStaticAlloca());
5069      ArgMemory = RawAddress(AI, ArgStruct, Align);
5070    }
5071  
5072    ClangToLLVMArgMapping IRFunctionArgs(CGM.getContext(), CallInfo);
5073    SmallVector<llvm::Value *, 16> IRCallArgs(IRFunctionArgs.totalIRArgs());
5074  
5075    // If the call returns a temporary with struct return, create a temporary
5076    // alloca to hold the result, unless one is given to us.
5077    Address SRetPtr = Address::invalid();
5078    RawAddress SRetAlloca = RawAddress::invalid();
5079    llvm::Value *UnusedReturnSizePtr = nullptr;
5080    if (RetAI.isIndirect() || RetAI.isInAlloca() || RetAI.isCoerceAndExpand()) {
5081      if (IsVirtualFunctionPointerThunk && RetAI.isIndirect()) {
5082        SRetPtr = makeNaturalAddressForPointer(CurFn->arg_begin() +
5083                                                   IRFunctionArgs.getSRetArgNo(),
5084                                               RetTy, CharUnits::fromQuantity(1));
5085      } else if (!ReturnValue.isNull()) {
5086        SRetPtr = ReturnValue.getAddress();
5087      } else {
5088        SRetPtr = CreateMemTemp(RetTy, "tmp", &SRetAlloca);
5089        if (HaveInsertPoint() && ReturnValue.isUnused()) {
5090          llvm::TypeSize size =
5091              CGM.getDataLayout().getTypeAllocSize(ConvertTypeForMem(RetTy));
5092          UnusedReturnSizePtr = EmitLifetimeStart(size, SRetAlloca.getPointer());
5093        }
5094      }
5095      if (IRFunctionArgs.hasSRetArg()) {
5096        IRCallArgs[IRFunctionArgs.getSRetArgNo()] =
5097            getAsNaturalPointerTo(SRetPtr, RetTy);
5098      } else if (RetAI.isInAlloca()) {
5099        Address Addr =
5100            Builder.CreateStructGEP(ArgMemory, RetAI.getInAllocaFieldIndex());
5101        Builder.CreateStore(getAsNaturalPointerTo(SRetPtr, RetTy), Addr);
5102      }
5103    }
5104  
5105    RawAddress swiftErrorTemp = RawAddress::invalid();
5106    Address swiftErrorArg = Address::invalid();
5107  
5108    // When passing arguments using temporary allocas, we need to add the
5109    // appropriate lifetime markers. This vector keeps track of all the lifetime
5110    // markers that need to be ended right after the call.
5111    SmallVector<CallLifetimeEnd, 2> CallLifetimeEndAfterCall;
5112  
5113    // Translate all of the arguments as necessary to match the IR lowering.
5114    assert(CallInfo.arg_size() == CallArgs.size() &&
5115           "Mismatch between function signature & arguments.");
5116    unsigned ArgNo = 0;
5117    CGFunctionInfo::const_arg_iterator info_it = CallInfo.arg_begin();
5118    for (CallArgList::const_iterator I = CallArgs.begin(), E = CallArgs.end();
5119         I != E; ++I, ++info_it, ++ArgNo) {
5120      const ABIArgInfo &ArgInfo = info_it->info;
5121  
5122      // Insert a padding argument to ensure proper alignment.
5123      if (IRFunctionArgs.hasPaddingArg(ArgNo))
5124        IRCallArgs[IRFunctionArgs.getPaddingArgNo(ArgNo)] =
5125            llvm::UndefValue::get(ArgInfo.getPaddingType());
5126  
5127      unsigned FirstIRArg, NumIRArgs;
5128      std::tie(FirstIRArg, NumIRArgs) = IRFunctionArgs.getIRArgs(ArgNo);
5129  
5130      bool ArgHasMaybeUndefAttr =
5131          IsArgumentMaybeUndef(TargetDecl, CallInfo.getNumRequiredArgs(), ArgNo);
5132  
5133      switch (ArgInfo.getKind()) {
5134      case ABIArgInfo::InAlloca: {
5135        assert(NumIRArgs == 0);
5136        assert(getTarget().getTriple().getArch() == llvm::Triple::x86);
5137        if (I->isAggregate()) {
5138          RawAddress Addr = I->hasLValue()
5139                                ? I->getKnownLValue().getAddress()
5140                                : I->getKnownRValue().getAggregateAddress();
5141          llvm::Instruction *Placeholder =
5142              cast<llvm::Instruction>(Addr.getPointer());
5143  
5144          if (!ArgInfo.getInAllocaIndirect()) {
5145            // Replace the placeholder with the appropriate argument slot GEP.
5146            CGBuilderTy::InsertPoint IP = Builder.saveIP();
5147            Builder.SetInsertPoint(Placeholder);
5148            Addr = Builder.CreateStructGEP(ArgMemory,
5149                                           ArgInfo.getInAllocaFieldIndex());
5150            Builder.restoreIP(IP);
5151          } else {
5152            // For indirect things such as overaligned structs, replace the
5153            // placeholder with a regular aggregate temporary alloca. Store the
5154            // address of this alloca into the struct.
5155            Addr = CreateMemTemp(info_it->type, "inalloca.indirect.tmp");
5156            Address ArgSlot = Builder.CreateStructGEP(
5157                ArgMemory, ArgInfo.getInAllocaFieldIndex());
5158            Builder.CreateStore(Addr.getPointer(), ArgSlot);
5159          }
5160          deferPlaceholderReplacement(Placeholder, Addr.getPointer());
5161        } else if (ArgInfo.getInAllocaIndirect()) {
5162          // Make a temporary alloca and store the address of it into the argument
5163          // struct.
5164          RawAddress Addr = CreateMemTempWithoutCast(
5165              I->Ty, getContext().getTypeAlignInChars(I->Ty),
5166              "indirect-arg-temp");
5167          I->copyInto(*this, Addr);
5168          Address ArgSlot =
5169              Builder.CreateStructGEP(ArgMemory, ArgInfo.getInAllocaFieldIndex());
5170          Builder.CreateStore(Addr.getPointer(), ArgSlot);
5171        } else {
5172          // Store the RValue into the argument struct.
5173          Address Addr =
5174              Builder.CreateStructGEP(ArgMemory, ArgInfo.getInAllocaFieldIndex());
5175          Addr = Addr.withElementType(ConvertTypeForMem(I->Ty));
5176          I->copyInto(*this, Addr);
5177        }
5178        break;
5179      }
5180  
5181      case ABIArgInfo::Indirect:
5182      case ABIArgInfo::IndirectAliased: {
5183        assert(NumIRArgs == 1);
5184        if (I->isAggregate()) {
5185          // We want to avoid creating an unnecessary temporary+copy here;
5186          // however, we need one in three cases:
5187          // 1. If the argument is not byval, and we are required to copy the
5188          //    source.  (This case doesn't occur on any common architecture.)
5189          // 2. If the argument is byval, RV is not sufficiently aligned, and
5190          //    we cannot force it to be sufficiently aligned.
5191          // 3. If the argument is byval, but RV is not located in default
5192          //    or alloca address space.
5193          Address Addr = I->hasLValue()
5194                             ? I->getKnownLValue().getAddress()
5195                             : I->getKnownRValue().getAggregateAddress();
5196          CharUnits Align = ArgInfo.getIndirectAlign();
5197          const llvm::DataLayout *TD = &CGM.getDataLayout();
5198  
5199          assert((FirstIRArg >= IRFuncTy->getNumParams() ||
5200                  IRFuncTy->getParamType(FirstIRArg)->getPointerAddressSpace() ==
5201                      TD->getAllocaAddrSpace()) &&
5202                 "indirect argument must be in alloca address space");
5203  
5204          bool NeedCopy = false;
5205          if (Addr.getAlignment() < Align &&
5206              llvm::getOrEnforceKnownAlignment(Addr.emitRawPointer(*this),
5207                                               Align.getAsAlign(),
5208                                               *TD) < Align.getAsAlign()) {
5209            NeedCopy = true;
5210          } else if (I->hasLValue()) {
5211            auto LV = I->getKnownLValue();
5212            auto AS = LV.getAddressSpace();
5213  
5214            bool isByValOrRef =
5215                ArgInfo.isIndirectAliased() || ArgInfo.getIndirectByVal();
5216  
5217            if (!isByValOrRef ||
5218                (LV.getAlignment() < getContext().getTypeAlignInChars(I->Ty))) {
5219              NeedCopy = true;
5220            }
5221            if (!getLangOpts().OpenCL) {
5222              if ((isByValOrRef &&
5223                  (AS != LangAS::Default &&
5224                   AS != CGM.getASTAllocaAddressSpace()))) {
5225                NeedCopy = true;
5226              }
5227            }
5228            // For OpenCL even if RV is located in default or alloca address space
5229            // we don't want to perform address space cast for it.
5230            else if ((isByValOrRef &&
5231                      Addr.getType()->getAddressSpace() != IRFuncTy->
5232                        getParamType(FirstIRArg)->getPointerAddressSpace())) {
5233              NeedCopy = true;
5234            }
5235          }
5236  
5237          if (!NeedCopy) {
5238            // Skip the extra memcpy call.
5239            llvm::Value *V = getAsNaturalPointerTo(Addr, I->Ty);
5240            auto *T = llvm::PointerType::get(
5241                CGM.getLLVMContext(), CGM.getDataLayout().getAllocaAddrSpace());
5242  
5243            llvm::Value *Val = getTargetHooks().performAddrSpaceCast(
5244                *this, V, LangAS::Default, CGM.getASTAllocaAddressSpace(), T,
5245                true);
5246            if (ArgHasMaybeUndefAttr)
5247              Val = Builder.CreateFreeze(Val);
5248            IRCallArgs[FirstIRArg] = Val;
5249            break;
5250          }
5251        }
5252  
5253        // For non-aggregate args and aggregate args meeting conditions above
5254        // we need to create an aligned temporary, and copy to it.
5255        RawAddress AI = CreateMemTempWithoutCast(
5256            I->Ty, ArgInfo.getIndirectAlign(), "byval-temp");
5257        llvm::Value *Val = getAsNaturalPointerTo(AI, I->Ty);
5258        if (ArgHasMaybeUndefAttr)
5259          Val = Builder.CreateFreeze(Val);
5260        IRCallArgs[FirstIRArg] = Val;
5261  
5262        // Emit lifetime markers for the temporary alloca.
5263        llvm::TypeSize ByvalTempElementSize =
5264            CGM.getDataLayout().getTypeAllocSize(AI.getElementType());
5265        llvm::Value *LifetimeSize =
5266            EmitLifetimeStart(ByvalTempElementSize, AI.getPointer());
5267  
5268        // Add cleanup code to emit the end lifetime marker after the call.
5269        if (LifetimeSize) // In case we disabled lifetime markers.
5270          CallLifetimeEndAfterCall.emplace_back(AI, LifetimeSize);
5271  
5272        // Generate the copy.
5273        I->copyInto(*this, AI);
5274        break;
5275      }
5276  
5277      case ABIArgInfo::Ignore:
5278        assert(NumIRArgs == 0);
5279        break;
5280  
5281      case ABIArgInfo::Extend:
5282      case ABIArgInfo::Direct: {
5283        if (!isa<llvm::StructType>(ArgInfo.getCoerceToType()) &&
5284            ArgInfo.getCoerceToType() == ConvertType(info_it->type) &&
5285            ArgInfo.getDirectOffset() == 0) {
5286          assert(NumIRArgs == 1);
5287          llvm::Value *V;
5288          if (!I->isAggregate())
5289            V = I->getKnownRValue().getScalarVal();
5290          else
5291            V = Builder.CreateLoad(
5292                I->hasLValue() ? I->getKnownLValue().getAddress()
5293                               : I->getKnownRValue().getAggregateAddress());
5294  
5295          // Implement swifterror by copying into a new swifterror argument.
5296          // We'll write back in the normal path out of the call.
5297          if (CallInfo.getExtParameterInfo(ArgNo).getABI()
5298                == ParameterABI::SwiftErrorResult) {
5299            assert(!swiftErrorTemp.isValid() && "multiple swifterror args");
5300  
5301            QualType pointeeTy = I->Ty->getPointeeType();
5302            swiftErrorArg = makeNaturalAddressForPointer(
5303                V, pointeeTy, getContext().getTypeAlignInChars(pointeeTy));
5304  
5305            swiftErrorTemp =
5306              CreateMemTemp(pointeeTy, getPointerAlign(), "swifterror.temp");
5307            V = swiftErrorTemp.getPointer();
5308            cast<llvm::AllocaInst>(V)->setSwiftError(true);
5309  
5310            llvm::Value *errorValue = Builder.CreateLoad(swiftErrorArg);
5311            Builder.CreateStore(errorValue, swiftErrorTemp);
5312          }
5313  
5314          // We might have to widen integers, but we should never truncate.
5315          if (ArgInfo.getCoerceToType() != V->getType() &&
5316              V->getType()->isIntegerTy())
5317            V = Builder.CreateZExt(V, ArgInfo.getCoerceToType());
5318  
5319          // If the argument doesn't match, perform a bitcast to coerce it.  This
5320          // can happen due to trivial type mismatches.
5321          if (FirstIRArg < IRFuncTy->getNumParams() &&
5322              V->getType() != IRFuncTy->getParamType(FirstIRArg))
5323            V = Builder.CreateBitCast(V, IRFuncTy->getParamType(FirstIRArg));
5324  
5325          if (ArgHasMaybeUndefAttr)
5326            V = Builder.CreateFreeze(V);
5327          IRCallArgs[FirstIRArg] = V;
5328          break;
5329        }
5330  
5331        llvm::StructType *STy =
5332            dyn_cast<llvm::StructType>(ArgInfo.getCoerceToType());
5333        if (STy && ArgInfo.isDirect() && !ArgInfo.getCanBeFlattened()) {
5334          llvm::Type *SrcTy = ConvertTypeForMem(I->Ty);
5335          [[maybe_unused]] llvm::TypeSize SrcTypeSize =
5336              CGM.getDataLayout().getTypeAllocSize(SrcTy);
5337          [[maybe_unused]] llvm::TypeSize DstTypeSize =
5338              CGM.getDataLayout().getTypeAllocSize(STy);
5339          if (STy->containsHomogeneousScalableVectorTypes()) {
5340            assert(SrcTypeSize == DstTypeSize &&
5341                   "Only allow non-fractional movement of structure with "
5342                   "homogeneous scalable vector type");
5343  
5344            IRCallArgs[FirstIRArg] = I->getKnownRValue().getScalarVal();
5345            break;
5346          }
5347        }
5348  
5349        // FIXME: Avoid the conversion through memory if possible.
5350        Address Src = Address::invalid();
5351        if (!I->isAggregate()) {
5352          Src = CreateMemTemp(I->Ty, "coerce");
5353          I->copyInto(*this, Src);
5354        } else {
5355          Src = I->hasLValue() ? I->getKnownLValue().getAddress()
5356                               : I->getKnownRValue().getAggregateAddress();
5357        }
5358  
5359        // If the value is offset in memory, apply the offset now.
5360        Src = emitAddressAtOffset(*this, Src, ArgInfo);
5361  
5362        // Fast-isel and the optimizer generally like scalar values better than
5363        // FCAs, so we flatten them if this is safe to do for this argument.
5364        if (STy && ArgInfo.isDirect() && ArgInfo.getCanBeFlattened()) {
5365          llvm::Type *SrcTy = Src.getElementType();
5366          llvm::TypeSize SrcTypeSize =
5367              CGM.getDataLayout().getTypeAllocSize(SrcTy);
5368          llvm::TypeSize DstTypeSize = CGM.getDataLayout().getTypeAllocSize(STy);
5369          if (SrcTypeSize.isScalable()) {
5370            assert(STy->containsHomogeneousScalableVectorTypes() &&
5371                   "ABI only supports structure with homogeneous scalable vector "
5372                   "type");
5373            assert(SrcTypeSize == DstTypeSize &&
5374                   "Only allow non-fractional movement of structure with "
5375                   "homogeneous scalable vector type");
5376            assert(NumIRArgs == STy->getNumElements());
5377  
5378            llvm::Value *StoredStructValue =
5379                Builder.CreateLoad(Src, Src.getName() + ".tuple");
5380            for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
5381              llvm::Value *Extract = Builder.CreateExtractValue(
5382                  StoredStructValue, i, Src.getName() + ".extract" + Twine(i));
5383              IRCallArgs[FirstIRArg + i] = Extract;
5384            }
5385          } else {
5386            uint64_t SrcSize = SrcTypeSize.getFixedValue();
5387            uint64_t DstSize = DstTypeSize.getFixedValue();
5388  
5389            // If the source type is smaller than the destination type of the
5390            // coerce-to logic, copy the source value into a temp alloca the size
5391            // of the destination type to allow loading all of it. The bits past
5392            // the source value are left undef.
5393            if (SrcSize < DstSize) {
5394              Address TempAlloca = CreateTempAlloca(STy, Src.getAlignment(),
5395                                                    Src.getName() + ".coerce");
5396              Builder.CreateMemCpy(TempAlloca, Src, SrcSize);
5397              Src = TempAlloca;
5398            } else {
5399              Src = Src.withElementType(STy);
5400            }
5401  
5402            assert(NumIRArgs == STy->getNumElements());
5403            for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
5404              Address EltPtr = Builder.CreateStructGEP(Src, i);
5405              llvm::Value *LI = Builder.CreateLoad(EltPtr);
5406              if (ArgHasMaybeUndefAttr)
5407                LI = Builder.CreateFreeze(LI);
5408              IRCallArgs[FirstIRArg + i] = LI;
5409            }
5410          }
5411        } else {
5412          // In the simple case, just pass the coerced loaded value.
5413          assert(NumIRArgs == 1);
5414          llvm::Value *Load =
5415              CreateCoercedLoad(Src, ArgInfo.getCoerceToType(), *this);
5416  
5417          if (CallInfo.isCmseNSCall()) {
5418            // For certain parameter types, clear padding bits, as they may reveal
5419            // sensitive information.
5420            // Small struct/union types are passed as integer arrays.
5421            auto *ATy = dyn_cast<llvm::ArrayType>(Load->getType());
5422            if (ATy != nullptr && isa<RecordType>(I->Ty.getCanonicalType()))
5423              Load = EmitCMSEClearRecord(Load, ATy, I->Ty);
5424          }
5425  
5426          if (ArgHasMaybeUndefAttr)
5427            Load = Builder.CreateFreeze(Load);
5428          IRCallArgs[FirstIRArg] = Load;
5429        }
5430  
5431        break;
5432      }
5433  
5434      case ABIArgInfo::CoerceAndExpand: {
5435        auto coercionType = ArgInfo.getCoerceAndExpandType();
5436        auto layout = CGM.getDataLayout().getStructLayout(coercionType);
5437  
5438        llvm::Value *tempSize = nullptr;
5439        Address addr = Address::invalid();
5440        RawAddress AllocaAddr = RawAddress::invalid();
5441        if (I->isAggregate()) {
5442          addr = I->hasLValue() ? I->getKnownLValue().getAddress()
5443                                : I->getKnownRValue().getAggregateAddress();
5444  
5445        } else {
5446          RValue RV = I->getKnownRValue();
5447          assert(RV.isScalar()); // complex should always just be direct
5448  
5449          llvm::Type *scalarType = RV.getScalarVal()->getType();
5450          auto scalarSize = CGM.getDataLayout().getTypeAllocSize(scalarType);
5451          auto scalarAlign = CGM.getDataLayout().getPrefTypeAlign(scalarType);
5452  
5453          // Materialize to a temporary.
5454          addr = CreateTempAlloca(
5455              RV.getScalarVal()->getType(),
5456              CharUnits::fromQuantity(std::max(layout->getAlignment(), scalarAlign)),
5457              "tmp",
5458              /*ArraySize=*/nullptr, &AllocaAddr);
5459          tempSize = EmitLifetimeStart(scalarSize, AllocaAddr.getPointer());
5460  
5461          Builder.CreateStore(RV.getScalarVal(), addr);
5462        }
5463  
5464        addr = addr.withElementType(coercionType);
5465  
5466        unsigned IRArgPos = FirstIRArg;
5467        for (unsigned i = 0, e = coercionType->getNumElements(); i != e; ++i) {
5468          llvm::Type *eltType = coercionType->getElementType(i);
5469          if (ABIArgInfo::isPaddingForCoerceAndExpand(eltType)) continue;
5470          Address eltAddr = Builder.CreateStructGEP(addr, i);
5471          llvm::Value *elt = Builder.CreateLoad(eltAddr);
5472          if (ArgHasMaybeUndefAttr)
5473            elt = Builder.CreateFreeze(elt);
5474          IRCallArgs[IRArgPos++] = elt;
5475        }
5476        assert(IRArgPos == FirstIRArg + NumIRArgs);
5477  
5478        if (tempSize) {
5479          EmitLifetimeEnd(tempSize, AllocaAddr.getPointer());
5480        }
5481  
5482        break;
5483      }
5484  
5485      case ABIArgInfo::Expand: {
5486        unsigned IRArgPos = FirstIRArg;
5487        ExpandTypeToArgs(I->Ty, *I, IRFuncTy, IRCallArgs, IRArgPos);
5488        assert(IRArgPos == FirstIRArg + NumIRArgs);
5489        break;
5490      }
5491      }
5492    }
5493  
5494    const CGCallee &ConcreteCallee = Callee.prepareConcreteCallee(*this);
5495    llvm::Value *CalleePtr = ConcreteCallee.getFunctionPointer();
5496  
5497    // If we're using inalloca, set up that argument.
5498    if (ArgMemory.isValid()) {
5499      llvm::Value *Arg = ArgMemory.getPointer();
5500      assert(IRFunctionArgs.hasInallocaArg());
5501      IRCallArgs[IRFunctionArgs.getInallocaArgNo()] = Arg;
5502    }
5503  
5504    // 2. Prepare the function pointer.
5505  
5506    // If the callee is a bitcast of a non-variadic function to have a
5507    // variadic function pointer type, check to see if we can remove the
5508    // bitcast.  This comes up with unprototyped functions.
5509    //
5510    // This makes the IR nicer, but more importantly it ensures that we
5511    // can inline the function at -O0 if it is marked always_inline.
5512    auto simplifyVariadicCallee = [](llvm::FunctionType *CalleeFT,
5513                                     llvm::Value *Ptr) -> llvm::Function * {
5514      if (!CalleeFT->isVarArg())
5515        return nullptr;
5516  
5517      // Get underlying value if it's a bitcast
5518      if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(Ptr)) {
5519        if (CE->getOpcode() == llvm::Instruction::BitCast)
5520          Ptr = CE->getOperand(0);
5521      }
5522  
5523      llvm::Function *OrigFn = dyn_cast<llvm::Function>(Ptr);
5524      if (!OrigFn)
5525        return nullptr;
5526  
5527      llvm::FunctionType *OrigFT = OrigFn->getFunctionType();
5528  
5529      // If the original type is variadic, or if any of the component types
5530      // disagree, we cannot remove the cast.
5531      if (OrigFT->isVarArg() ||
5532          OrigFT->getNumParams() != CalleeFT->getNumParams() ||
5533          OrigFT->getReturnType() != CalleeFT->getReturnType())
5534        return nullptr;
5535  
5536      for (unsigned i = 0, e = OrigFT->getNumParams(); i != e; ++i)
5537        if (OrigFT->getParamType(i) != CalleeFT->getParamType(i))
5538          return nullptr;
5539  
5540      return OrigFn;
5541    };
5542  
5543    if (llvm::Function *OrigFn = simplifyVariadicCallee(IRFuncTy, CalleePtr)) {
5544      CalleePtr = OrigFn;
5545      IRFuncTy = OrigFn->getFunctionType();
5546    }
5547  
5548    // 3. Perform the actual call.
5549  
5550    // Deactivate any cleanups that we're supposed to do immediately before
5551    // the call.
5552    if (!CallArgs.getCleanupsToDeactivate().empty())
5553      deactivateArgCleanupsBeforeCall(*this, CallArgs);
5554  
5555    // Assert that the arguments we computed match up.  The IR verifier
5556    // will catch this, but this is a common enough source of problems
5557    // during IRGen changes that it's way better for debugging to catch
5558    // it ourselves here.
5559  #ifndef NDEBUG
5560    assert(IRCallArgs.size() == IRFuncTy->getNumParams() || IRFuncTy->isVarArg());
5561    for (unsigned i = 0; i < IRCallArgs.size(); ++i) {
5562      // Inalloca argument can have different type.
5563      if (IRFunctionArgs.hasInallocaArg() &&
5564          i == IRFunctionArgs.getInallocaArgNo())
5565        continue;
5566      if (i < IRFuncTy->getNumParams())
5567        assert(IRCallArgs[i]->getType() == IRFuncTy->getParamType(i));
5568    }
5569  #endif
5570  
5571    // Update the largest vector width if any arguments have vector types.
5572    for (unsigned i = 0; i < IRCallArgs.size(); ++i)
5573      LargestVectorWidth = std::max(LargestVectorWidth,
5574                                    getMaxVectorWidth(IRCallArgs[i]->getType()));
5575  
5576    // Compute the calling convention and attributes.
5577    unsigned CallingConv;
5578    llvm::AttributeList Attrs;
5579    CGM.ConstructAttributeList(CalleePtr->getName(), CallInfo,
5580                               Callee.getAbstractInfo(), Attrs, CallingConv,
5581                               /*AttrOnCallSite=*/true,
5582                               /*IsThunk=*/false);
5583  
5584    if (CallingConv == llvm::CallingConv::X86_VectorCall &&
5585        getTarget().getTriple().isWindowsArm64EC()) {
5586      CGM.Error(Loc, "__vectorcall calling convention is not currently "
5587                     "supported");
5588    }
5589  
5590    if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(CurFuncDecl)) {
5591      if (FD->hasAttr<StrictFPAttr>())
5592        // All calls within a strictfp function are marked strictfp
5593        Attrs = Attrs.addFnAttribute(getLLVMContext(), llvm::Attribute::StrictFP);
5594  
5595      // If -ffast-math is enabled and the function is guarded by an
5596      // '__attribute__((optnone)) adjust the memory attribute so the BE emits the
5597      // library call instead of the intrinsic.
5598      if (FD->hasAttr<OptimizeNoneAttr>() && getLangOpts().FastMath)
5599        CGM.AdjustMemoryAttribute(CalleePtr->getName(), Callee.getAbstractInfo(),
5600                                  Attrs);
5601    }
5602    // Add call-site nomerge attribute if exists.
5603    if (InNoMergeAttributedStmt)
5604      Attrs = Attrs.addFnAttribute(getLLVMContext(), llvm::Attribute::NoMerge);
5605  
5606    // Add call-site noinline attribute if exists.
5607    if (InNoInlineAttributedStmt)
5608      Attrs = Attrs.addFnAttribute(getLLVMContext(), llvm::Attribute::NoInline);
5609  
5610    // Add call-site always_inline attribute if exists.
5611    if (InAlwaysInlineAttributedStmt)
5612      Attrs =
5613          Attrs.addFnAttribute(getLLVMContext(), llvm::Attribute::AlwaysInline);
5614  
5615    // Apply some call-site-specific attributes.
5616    // TODO: work this into building the attribute set.
5617  
5618    // Apply always_inline to all calls within flatten functions.
5619    // FIXME: should this really take priority over __try, below?
5620    if (CurCodeDecl && CurCodeDecl->hasAttr<FlattenAttr>() &&
5621        !InNoInlineAttributedStmt &&
5622        !(TargetDecl && TargetDecl->hasAttr<NoInlineAttr>())) {
5623      Attrs =
5624          Attrs.addFnAttribute(getLLVMContext(), llvm::Attribute::AlwaysInline);
5625    }
5626  
5627    // Disable inlining inside SEH __try blocks.
5628    if (isSEHTryScope()) {
5629      Attrs = Attrs.addFnAttribute(getLLVMContext(), llvm::Attribute::NoInline);
5630    }
5631  
5632    // Decide whether to use a call or an invoke.
5633    bool CannotThrow;
5634    if (currentFunctionUsesSEHTry()) {
5635      // SEH cares about asynchronous exceptions, so everything can "throw."
5636      CannotThrow = false;
5637    } else if (isCleanupPadScope() &&
5638               EHPersonality::get(*this).isMSVCXXPersonality()) {
5639      // The MSVC++ personality will implicitly terminate the program if an
5640      // exception is thrown during a cleanup outside of a try/catch.
5641      // We don't need to model anything in IR to get this behavior.
5642      CannotThrow = true;
5643    } else {
5644      // Otherwise, nounwind call sites will never throw.
5645      CannotThrow = Attrs.hasFnAttr(llvm::Attribute::NoUnwind);
5646  
5647      if (auto *FPtr = dyn_cast<llvm::Function>(CalleePtr))
5648        if (FPtr->hasFnAttribute(llvm::Attribute::NoUnwind))
5649          CannotThrow = true;
5650    }
5651  
5652    // If we made a temporary, be sure to clean up after ourselves. Note that we
5653    // can't depend on being inside of an ExprWithCleanups, so we need to manually
5654    // pop this cleanup later on. Being eager about this is OK, since this
5655    // temporary is 'invisible' outside of the callee.
5656    if (UnusedReturnSizePtr)
5657      pushFullExprCleanup<CallLifetimeEnd>(NormalEHLifetimeMarker, SRetAlloca,
5658                                           UnusedReturnSizePtr);
5659  
5660    llvm::BasicBlock *InvokeDest = CannotThrow ? nullptr : getInvokeDest();
5661  
5662    SmallVector<llvm::OperandBundleDef, 1> BundleList =
5663        getBundlesForFunclet(CalleePtr);
5664  
5665    if (SanOpts.has(SanitizerKind::KCFI) &&
5666        !isa_and_nonnull<FunctionDecl>(TargetDecl))
5667      EmitKCFIOperandBundle(ConcreteCallee, BundleList);
5668  
5669    // Add the pointer-authentication bundle.
5670    EmitPointerAuthOperandBundle(ConcreteCallee.getPointerAuthInfo(), BundleList);
5671  
5672    if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(CurFuncDecl))
5673      if (FD->hasAttr<StrictFPAttr>())
5674        // All calls within a strictfp function are marked strictfp
5675        Attrs = Attrs.addFnAttribute(getLLVMContext(), llvm::Attribute::StrictFP);
5676  
5677    AssumeAlignedAttrEmitter AssumeAlignedAttrEmitter(*this, TargetDecl);
5678    Attrs = AssumeAlignedAttrEmitter.TryEmitAsCallSiteAttribute(Attrs);
5679  
5680    AllocAlignAttrEmitter AllocAlignAttrEmitter(*this, TargetDecl, CallArgs);
5681    Attrs = AllocAlignAttrEmitter.TryEmitAsCallSiteAttribute(Attrs);
5682  
5683    // Emit the actual call/invoke instruction.
5684    llvm::CallBase *CI;
5685    if (!InvokeDest) {
5686      CI = Builder.CreateCall(IRFuncTy, CalleePtr, IRCallArgs, BundleList);
5687    } else {
5688      llvm::BasicBlock *Cont = createBasicBlock("invoke.cont");
5689      CI = Builder.CreateInvoke(IRFuncTy, CalleePtr, Cont, InvokeDest, IRCallArgs,
5690                                BundleList);
5691      EmitBlock(Cont);
5692    }
5693    if (CI->getCalledFunction() && CI->getCalledFunction()->hasName() &&
5694        CI->getCalledFunction()->getName().starts_with("_Z4sqrt")) {
5695      SetSqrtFPAccuracy(CI);
5696    }
5697    if (callOrInvoke)
5698      *callOrInvoke = CI;
5699  
5700    // If this is within a function that has the guard(nocf) attribute and is an
5701    // indirect call, add the "guard_nocf" attribute to this call to indicate that
5702    // Control Flow Guard checks should not be added, even if the call is inlined.
5703    if (const auto *FD = dyn_cast_or_null<FunctionDecl>(CurFuncDecl)) {
5704      if (const auto *A = FD->getAttr<CFGuardAttr>()) {
5705        if (A->getGuard() == CFGuardAttr::GuardArg::nocf && !CI->getCalledFunction())
5706          Attrs = Attrs.addFnAttribute(getLLVMContext(), "guard_nocf");
5707      }
5708    }
5709  
5710    // Apply the attributes and calling convention.
5711    CI->setAttributes(Attrs);
5712    CI->setCallingConv(static_cast<llvm::CallingConv::ID>(CallingConv));
5713  
5714    // Apply various metadata.
5715  
5716    if (!CI->getType()->isVoidTy())
5717      CI->setName("call");
5718  
5719    if (CGM.shouldEmitConvergenceTokens() && CI->isConvergent())
5720      CI = addControlledConvergenceToken(CI);
5721  
5722    // Update largest vector width from the return type.
5723    LargestVectorWidth =
5724        std::max(LargestVectorWidth, getMaxVectorWidth(CI->getType()));
5725  
5726    // Insert instrumentation or attach profile metadata at indirect call sites.
5727    // For more details, see the comment before the definition of
5728    // IPVK_IndirectCallTarget in InstrProfData.inc.
5729    if (!CI->getCalledFunction())
5730      PGO.valueProfile(Builder, llvm::IPVK_IndirectCallTarget,
5731                       CI, CalleePtr);
5732  
5733    // In ObjC ARC mode with no ObjC ARC exception safety, tell the ARC
5734    // optimizer it can aggressively ignore unwind edges.
5735    if (CGM.getLangOpts().ObjCAutoRefCount)
5736      AddObjCARCExceptionMetadata(CI);
5737  
5738    // Set tail call kind if necessary.
5739    if (llvm::CallInst *Call = dyn_cast<llvm::CallInst>(CI)) {
5740      if (TargetDecl && TargetDecl->hasAttr<NotTailCalledAttr>())
5741        Call->setTailCallKind(llvm::CallInst::TCK_NoTail);
5742      else if (IsMustTail) {
5743        if (getTarget().getTriple().isPPC()) {
5744          if (getTarget().getTriple().isOSAIX())
5745            CGM.getDiags().Report(Loc, diag::err_aix_musttail_unsupported);
5746          else if (!getTarget().hasFeature("pcrelative-memops")) {
5747            if (getTarget().hasFeature("longcall"))
5748              CGM.getDiags().Report(Loc, diag::err_ppc_impossible_musttail) << 0;
5749            else if (Call->isIndirectCall())
5750              CGM.getDiags().Report(Loc, diag::err_ppc_impossible_musttail) << 1;
5751            else if (isa_and_nonnull<FunctionDecl>(TargetDecl)) {
5752              if (!cast<FunctionDecl>(TargetDecl)->isDefined())
5753                // The undefined callee may be a forward declaration. Without
5754                // knowning all symbols in the module, we won't know the symbol is
5755                // defined or not. Collect all these symbols for later diagnosing.
5756                CGM.addUndefinedGlobalForTailCall(
5757                    {cast<FunctionDecl>(TargetDecl), Loc});
5758              else {
5759                llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(
5760                    GlobalDecl(cast<FunctionDecl>(TargetDecl)));
5761                if (llvm::GlobalValue::isWeakForLinker(Linkage) ||
5762                    llvm::GlobalValue::isDiscardableIfUnused(Linkage))
5763                  CGM.getDiags().Report(Loc, diag::err_ppc_impossible_musttail)
5764                      << 2;
5765              }
5766            }
5767          }
5768        }
5769        Call->setTailCallKind(llvm::CallInst::TCK_MustTail);
5770      }
5771    }
5772  
5773    // Add metadata for calls to MSAllocator functions
5774    if (getDebugInfo() && TargetDecl &&
5775        TargetDecl->hasAttr<MSAllocatorAttr>())
5776      getDebugInfo()->addHeapAllocSiteMetadata(CI, RetTy->getPointeeType(), Loc);
5777  
5778    // Add metadata if calling an __attribute__((error(""))) or warning fn.
5779    if (TargetDecl && TargetDecl->hasAttr<ErrorAttr>()) {
5780      llvm::ConstantInt *Line =
5781          llvm::ConstantInt::get(Int64Ty, Loc.getRawEncoding());
5782      llvm::ConstantAsMetadata *MD = llvm::ConstantAsMetadata::get(Line);
5783      llvm::MDTuple *MDT = llvm::MDNode::get(getLLVMContext(), {MD});
5784      CI->setMetadata("srcloc", MDT);
5785    }
5786  
5787    // 4. Finish the call.
5788  
5789    // If the call doesn't return, finish the basic block and clear the
5790    // insertion point; this allows the rest of IRGen to discard
5791    // unreachable code.
5792    if (CI->doesNotReturn()) {
5793      if (UnusedReturnSizePtr)
5794        PopCleanupBlock();
5795  
5796      // Strip away the noreturn attribute to better diagnose unreachable UB.
5797      if (SanOpts.has(SanitizerKind::Unreachable)) {
5798        // Also remove from function since CallBase::hasFnAttr additionally checks
5799        // attributes of the called function.
5800        if (auto *F = CI->getCalledFunction())
5801          F->removeFnAttr(llvm::Attribute::NoReturn);
5802        CI->removeFnAttr(llvm::Attribute::NoReturn);
5803  
5804        // Avoid incompatibility with ASan which relies on the `noreturn`
5805        // attribute to insert handler calls.
5806        if (SanOpts.hasOneOf(SanitizerKind::Address |
5807                             SanitizerKind::KernelAddress)) {
5808          SanitizerScope SanScope(this);
5809          llvm::IRBuilder<>::InsertPointGuard IPGuard(Builder);
5810          Builder.SetInsertPoint(CI);
5811          auto *FnType = llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
5812          llvm::FunctionCallee Fn =
5813              CGM.CreateRuntimeFunction(FnType, "__asan_handle_no_return");
5814          EmitNounwindRuntimeCall(Fn);
5815        }
5816      }
5817  
5818      EmitUnreachable(Loc);
5819      Builder.ClearInsertionPoint();
5820  
5821      // FIXME: For now, emit a dummy basic block because expr emitters in
5822      // generally are not ready to handle emitting expressions at unreachable
5823      // points.
5824      EnsureInsertPoint();
5825  
5826      // Return a reasonable RValue.
5827      return GetUndefRValue(RetTy);
5828    }
5829  
5830    // If this is a musttail call, return immediately. We do not branch to the
5831    // epilogue in this case.
5832    if (IsMustTail) {
5833      for (auto it = EHStack.find(CurrentCleanupScopeDepth); it != EHStack.end();
5834           ++it) {
5835        EHCleanupScope *Cleanup = dyn_cast<EHCleanupScope>(&*it);
5836        if (!(Cleanup && Cleanup->getCleanup()->isRedundantBeforeReturn()))
5837          CGM.ErrorUnsupported(MustTailCall, "tail call skipping over cleanups");
5838      }
5839      if (CI->getType()->isVoidTy())
5840        Builder.CreateRetVoid();
5841      else
5842        Builder.CreateRet(CI);
5843      Builder.ClearInsertionPoint();
5844      EnsureInsertPoint();
5845      return GetUndefRValue(RetTy);
5846    }
5847  
5848    // Perform the swifterror writeback.
5849    if (swiftErrorTemp.isValid()) {
5850      llvm::Value *errorResult = Builder.CreateLoad(swiftErrorTemp);
5851      Builder.CreateStore(errorResult, swiftErrorArg);
5852    }
5853  
5854    // Emit any call-associated writebacks immediately.  Arguably this
5855    // should happen after any return-value munging.
5856    if (CallArgs.hasWritebacks())
5857      emitWritebacks(*this, CallArgs);
5858  
5859    // The stack cleanup for inalloca arguments has to run out of the normal
5860    // lexical order, so deactivate it and run it manually here.
5861    CallArgs.freeArgumentMemory(*this);
5862  
5863    // Extract the return value.
5864    RValue Ret;
5865  
5866    // If the current function is a virtual function pointer thunk, avoid copying
5867    // the return value of the musttail call to a temporary.
5868    if (IsVirtualFunctionPointerThunk) {
5869      Ret = RValue::get(CI);
5870    } else {
5871      Ret = [&] {
5872        switch (RetAI.getKind()) {
5873        case ABIArgInfo::CoerceAndExpand: {
5874          auto coercionType = RetAI.getCoerceAndExpandType();
5875  
5876          Address addr = SRetPtr.withElementType(coercionType);
5877  
5878          assert(CI->getType() == RetAI.getUnpaddedCoerceAndExpandType());
5879          bool requiresExtract = isa<llvm::StructType>(CI->getType());
5880  
5881          unsigned unpaddedIndex = 0;
5882          for (unsigned i = 0, e = coercionType->getNumElements(); i != e; ++i) {
5883            llvm::Type *eltType = coercionType->getElementType(i);
5884            if (ABIArgInfo::isPaddingForCoerceAndExpand(eltType))
5885              continue;
5886            Address eltAddr = Builder.CreateStructGEP(addr, i);
5887            llvm::Value *elt = CI;
5888            if (requiresExtract)
5889              elt = Builder.CreateExtractValue(elt, unpaddedIndex++);
5890            else
5891              assert(unpaddedIndex == 0);
5892            Builder.CreateStore(elt, eltAddr);
5893          }
5894          [[fallthrough]];
5895        }
5896  
5897        case ABIArgInfo::InAlloca:
5898        case ABIArgInfo::Indirect: {
5899          RValue ret = convertTempToRValue(SRetPtr, RetTy, SourceLocation());
5900          if (UnusedReturnSizePtr)
5901            PopCleanupBlock();
5902          return ret;
5903        }
5904  
5905        case ABIArgInfo::Ignore:
5906          // If we are ignoring an argument that had a result, make sure to
5907          // construct the appropriate return value for our caller.
5908          return GetUndefRValue(RetTy);
5909  
5910        case ABIArgInfo::Extend:
5911        case ABIArgInfo::Direct: {
5912          llvm::Type *RetIRTy = ConvertType(RetTy);
5913          if (RetAI.getCoerceToType() == RetIRTy &&
5914              RetAI.getDirectOffset() == 0) {
5915            switch (getEvaluationKind(RetTy)) {
5916            case TEK_Complex: {
5917              llvm::Value *Real = Builder.CreateExtractValue(CI, 0);
5918              llvm::Value *Imag = Builder.CreateExtractValue(CI, 1);
5919              return RValue::getComplex(std::make_pair(Real, Imag));
5920            }
5921            case TEK_Aggregate:
5922              break;
5923            case TEK_Scalar: {
5924              // If the argument doesn't match, perform a bitcast to coerce it.
5925              // This can happen due to trivial type mismatches.
5926              llvm::Value *V = CI;
5927              if (V->getType() != RetIRTy)
5928                V = Builder.CreateBitCast(V, RetIRTy);
5929              return RValue::get(V);
5930            }
5931            }
5932          }
5933  
5934          // If coercing a fixed vector from a scalable vector for ABI
5935          // compatibility, and the types match, use the llvm.vector.extract
5936          // intrinsic to perform the conversion.
5937          if (auto *FixedDstTy = dyn_cast<llvm::FixedVectorType>(RetIRTy)) {
5938            llvm::Value *V = CI;
5939            if (auto *ScalableSrcTy =
5940                    dyn_cast<llvm::ScalableVectorType>(V->getType())) {
5941              if (FixedDstTy->getElementType() ==
5942                  ScalableSrcTy->getElementType()) {
5943                llvm::Value *Zero = llvm::Constant::getNullValue(CGM.Int64Ty);
5944                V = Builder.CreateExtractVector(FixedDstTy, V, Zero,
5945                                                "cast.fixed");
5946                return RValue::get(V);
5947              }
5948            }
5949          }
5950  
5951          Address DestPtr = ReturnValue.getValue();
5952          bool DestIsVolatile = ReturnValue.isVolatile();
5953          uint64_t DestSize =
5954              getContext().getTypeInfoDataSizeInChars(RetTy).Width.getQuantity();
5955  
5956          if (!DestPtr.isValid()) {
5957            DestPtr = CreateMemTemp(RetTy, "coerce");
5958            DestIsVolatile = false;
5959            DestSize = getContext().getTypeSizeInChars(RetTy).getQuantity();
5960          }
5961  
5962          // An empty record can overlap other data (if declared with
5963          // no_unique_address); omit the store for such types - as there is no
5964          // actual data to store.
5965          if (!isEmptyRecord(getContext(), RetTy, true)) {
5966            // If the value is offset in memory, apply the offset now.
5967            Address StorePtr = emitAddressAtOffset(*this, DestPtr, RetAI);
5968            CreateCoercedStore(
5969                CI, StorePtr,
5970                llvm::TypeSize::getFixed(DestSize - RetAI.getDirectOffset()),
5971                DestIsVolatile);
5972          }
5973  
5974          return convertTempToRValue(DestPtr, RetTy, SourceLocation());
5975        }
5976  
5977        case ABIArgInfo::Expand:
5978        case ABIArgInfo::IndirectAliased:
5979          llvm_unreachable("Invalid ABI kind for return argument");
5980        }
5981  
5982        llvm_unreachable("Unhandled ABIArgInfo::Kind");
5983      }();
5984    }
5985  
5986    // Emit the assume_aligned check on the return value.
5987    if (Ret.isScalar() && TargetDecl) {
5988      AssumeAlignedAttrEmitter.EmitAsAnAssumption(Loc, RetTy, Ret);
5989      AllocAlignAttrEmitter.EmitAsAnAssumption(Loc, RetTy, Ret);
5990    }
5991  
5992    // Explicitly call CallLifetimeEnd::Emit just to re-use the code even though
5993    // we can't use the full cleanup mechanism.
5994    for (CallLifetimeEnd &LifetimeEnd : CallLifetimeEndAfterCall)
5995      LifetimeEnd.Emit(*this, /*Flags=*/{});
5996  
5997    if (!ReturnValue.isExternallyDestructed() &&
5998        RetTy.isDestructedType() == QualType::DK_nontrivial_c_struct)
5999      pushDestroy(QualType::DK_nontrivial_c_struct, Ret.getAggregateAddress(),
6000                  RetTy);
6001  
6002    return Ret;
6003  }
6004  
prepareConcreteCallee(CodeGenFunction & CGF) const6005  CGCallee CGCallee::prepareConcreteCallee(CodeGenFunction &CGF) const {
6006    if (isVirtual()) {
6007      const CallExpr *CE = getVirtualCallExpr();
6008      return CGF.CGM.getCXXABI().getVirtualFunctionPointer(
6009          CGF, getVirtualMethodDecl(), getThisAddress(), getVirtualFunctionType(),
6010          CE ? CE->getBeginLoc() : SourceLocation());
6011    }
6012  
6013    return *this;
6014  }
6015  
6016  /* VarArg handling */
6017  
EmitVAArg(VAArgExpr * VE,Address & VAListAddr,AggValueSlot Slot)6018  RValue CodeGenFunction::EmitVAArg(VAArgExpr *VE, Address &VAListAddr,
6019                                    AggValueSlot Slot) {
6020    VAListAddr = VE->isMicrosoftABI() ? EmitMSVAListRef(VE->getSubExpr())
6021                                      : EmitVAListRef(VE->getSubExpr());
6022    QualType Ty = VE->getType();
6023    if (VE->isMicrosoftABI())
6024      return CGM.getABIInfo().EmitMSVAArg(*this, VAListAddr, Ty, Slot);
6025    return CGM.getABIInfo().EmitVAArg(*this, VAListAddr, Ty, Slot);
6026  }
6027