brintos

brintos / llvm-project-archived public Read only

0
0
Text · 157.1 KiB · 10aad2e Raw
4130 lines · cpp
1//===---- CGObjC.cpp - Emit LLVM Code for Objective-C ---------------------===//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-exception6//7//===----------------------------------------------------------------------===//8//9// This contains code to emit Objective-C code as LLVM code.10//11//===----------------------------------------------------------------------===//12 13#include "CGDebugInfo.h"14#include "CGObjCRuntime.h"15#include "CodeGenFunction.h"16#include "CodeGenModule.h"17#include "CodeGenPGO.h"18#include "ConstantEmitter.h"19#include "TargetInfo.h"20#include "clang/AST/ASTContext.h"21#include "clang/AST/Attr.h"22#include "clang/AST/DeclObjC.h"23#include "clang/AST/StmtObjC.h"24#include "clang/Basic/Diagnostic.h"25#include "clang/CodeGen/CGFunctionInfo.h"26#include "clang/CodeGen/CodeGenABITypes.h"27#include "llvm/Analysis/ObjCARCUtil.h"28#include "llvm/BinaryFormat/MachO.h"29#include "llvm/IR/Constants.h"30#include "llvm/IR/DataLayout.h"31#include "llvm/IR/InlineAsm.h"32#include <optional>33using namespace clang;34using namespace CodeGen;35 36typedef llvm::PointerIntPair<llvm::Value*,1,bool> TryEmitResult;37static TryEmitResult38tryEmitARCRetainScalarExpr(CodeGenFunction &CGF, const Expr *e);39static RValue AdjustObjCObjectType(CodeGenFunction &CGF,40                                   QualType ET,41                                   RValue Result);42 43/// Given the address of a variable of pointer type, find the correct44/// null to store into it.45static llvm::Constant *getNullForVariable(Address addr) {46  llvm::Type *type = addr.getElementType();47  return llvm::ConstantPointerNull::get(cast<llvm::PointerType>(type));48}49 50/// Emits an instance of NSConstantString representing the object.51llvm::Value *CodeGenFunction::EmitObjCStringLiteral(const ObjCStringLiteral *E)52{53  llvm::Constant *C =54      CGM.getObjCRuntime().GenerateConstantString(E->getString()).getPointer();55  return C;56}57 58/// EmitObjCBoxedExpr - This routine generates code to call59/// the appropriate expression boxing method. This will either be60/// one of +[NSNumber numberWith<Type>:], or +[NSString stringWithUTF8String:],61/// or [NSValue valueWithBytes:objCType:].62///63llvm::Value *64CodeGenFunction::EmitObjCBoxedExpr(const ObjCBoxedExpr *E) {65  // Generate the correct selector for this literal's concrete type.66  // Get the method.67  const ObjCMethodDecl *BoxingMethod = E->getBoxingMethod();68  const Expr *SubExpr = E->getSubExpr();69 70  if (E->isExpressibleAsConstantInitializer()) {71    ConstantEmitter ConstEmitter(CGM);72    return ConstEmitter.tryEmitAbstract(E, E->getType());73  }74 75  assert(BoxingMethod->isClassMethod() && "BoxingMethod must be a class method");76  Selector Sel = BoxingMethod->getSelector();77 78  // Generate a reference to the class pointer, which will be the receiver.79  // Assumes that the method was introduced in the class that should be80  // messaged (avoids pulling it out of the result type).81  CGObjCRuntime &Runtime = CGM.getObjCRuntime();82  const ObjCInterfaceDecl *ClassDecl = BoxingMethod->getClassInterface();83  llvm::Value *Receiver = Runtime.GetClass(*this, ClassDecl);84 85  CallArgList Args;86  const ParmVarDecl *ArgDecl = *BoxingMethod->param_begin();87  QualType ArgQT = ArgDecl->getType().getUnqualifiedType();88 89  // ObjCBoxedExpr supports boxing of structs and unions90  // via [NSValue valueWithBytes:objCType:]91  const QualType ValueType(SubExpr->getType().getCanonicalType());92  if (ValueType->isObjCBoxableRecordType()) {93    // Emit CodeGen for first parameter94    // and cast value to correct type95    Address Temporary = CreateMemTemp(SubExpr->getType());96    EmitAnyExprToMem(SubExpr, Temporary, Qualifiers(), /*isInit*/ true);97    llvm::Value *BitCast = Builder.CreateBitCast(98        Temporary.emitRawPointer(*this), ConvertType(ArgQT));99    Args.add(RValue::get(BitCast), ArgQT);100 101    // Create char array to store type encoding102    std::string Str;103    getContext().getObjCEncodingForType(ValueType, Str);104    llvm::Constant *GV = CGM.GetAddrOfConstantCString(Str).getPointer();105 106    // Cast type encoding to correct type107    const ParmVarDecl *EncodingDecl = BoxingMethod->parameters()[1];108    QualType EncodingQT = EncodingDecl->getType().getUnqualifiedType();109    llvm::Value *Cast = Builder.CreateBitCast(GV, ConvertType(EncodingQT));110 111    Args.add(RValue::get(Cast), EncodingQT);112  } else {113    Args.add(EmitAnyExpr(SubExpr), ArgQT);114  }115 116  RValue result = Runtime.GenerateMessageSend(117      *this, ReturnValueSlot(), BoxingMethod->getReturnType(), Sel, Receiver,118      Args, ClassDecl, BoxingMethod);119  return Builder.CreateBitCast(result.getScalarVal(),120                               ConvertType(E->getType()));121}122 123llvm::Value *CodeGenFunction::EmitObjCCollectionLiteral(const Expr *E,124                                    const ObjCMethodDecl *MethodWithObjects) {125  ASTContext &Context = CGM.getContext();126  const ObjCDictionaryLiteral *DLE = nullptr;127  const ObjCArrayLiteral *ALE = dyn_cast<ObjCArrayLiteral>(E);128  if (!ALE)129    DLE = cast<ObjCDictionaryLiteral>(E);130 131  // Optimize empty collections by referencing constants, when available.132  uint64_t NumElements =133    ALE ? ALE->getNumElements() : DLE->getNumElements();134  if (NumElements == 0 && CGM.getLangOpts().ObjCRuntime.hasEmptyCollections()) {135    StringRef ConstantName = ALE ? "__NSArray0__" : "__NSDictionary0__";136    QualType IdTy(CGM.getContext().getObjCIdType());137    llvm::Constant *Constant =138        CGM.CreateRuntimeVariable(ConvertType(IdTy), ConstantName);139    LValue LV = MakeNaturalAlignAddrLValue(Constant, IdTy);140    llvm::Value *Ptr = EmitLoadOfScalar(LV, E->getBeginLoc());141    cast<llvm::LoadInst>(Ptr)->setMetadata(142        llvm::LLVMContext::MD_invariant_load,143        llvm::MDNode::get(getLLVMContext(), {}));144    return Builder.CreateBitCast(Ptr, ConvertType(E->getType()));145  }146 147  // Compute the type of the array we're initializing.148  llvm::APInt APNumElements(Context.getTypeSize(Context.getSizeType()),149                            NumElements);150  QualType ElementType = Context.getObjCIdType().withConst();151  QualType ElementArrayType = Context.getConstantArrayType(152      ElementType, APNumElements, nullptr, ArraySizeModifier::Normal,153      /*IndexTypeQuals=*/0);154 155  // Allocate the temporary array(s).156  Address Objects = CreateMemTemp(ElementArrayType, "objects");157  Address Keys = Address::invalid();158  if (DLE)159    Keys = CreateMemTemp(ElementArrayType, "keys");160 161  // In ARC, we may need to do extra work to keep all the keys and162  // values alive until after the call.163  SmallVector<llvm::Value *, 16> NeededObjects;164  bool TrackNeededObjects =165    (getLangOpts().ObjCAutoRefCount &&166    CGM.getCodeGenOpts().OptimizationLevel != 0);167 168  // Perform the actual initialialization of the array(s).169  for (uint64_t i = 0; i < NumElements; i++) {170    if (ALE) {171      // Emit the element and store it to the appropriate array slot.172      const Expr *Rhs = ALE->getElement(i);173      LValue LV = MakeAddrLValue(Builder.CreateConstArrayGEP(Objects, i),174                                 ElementType, AlignmentSource::Decl);175 176      llvm::Value *value = EmitScalarExpr(Rhs);177      EmitStoreThroughLValue(RValue::get(value), LV, true);178      if (TrackNeededObjects) {179        NeededObjects.push_back(value);180      }181    } else {182      // Emit the key and store it to the appropriate array slot.183      const Expr *Key = DLE->getKeyValueElement(i).Key;184      LValue KeyLV = MakeAddrLValue(Builder.CreateConstArrayGEP(Keys, i),185                                    ElementType, AlignmentSource::Decl);186      llvm::Value *keyValue = EmitScalarExpr(Key);187      EmitStoreThroughLValue(RValue::get(keyValue), KeyLV, /*isInit=*/true);188 189      // Emit the value and store it to the appropriate array slot.190      const Expr *Value = DLE->getKeyValueElement(i).Value;191      LValue ValueLV = MakeAddrLValue(Builder.CreateConstArrayGEP(Objects, i),192                                      ElementType, AlignmentSource::Decl);193      llvm::Value *valueValue = EmitScalarExpr(Value);194      EmitStoreThroughLValue(RValue::get(valueValue), ValueLV, /*isInit=*/true);195      if (TrackNeededObjects) {196        NeededObjects.push_back(keyValue);197        NeededObjects.push_back(valueValue);198      }199    }200  }201 202  // Generate the argument list.203  CallArgList Args;204  ObjCMethodDecl::param_const_iterator PI = MethodWithObjects->param_begin();205  const ParmVarDecl *argDecl = *PI++;206  QualType ArgQT = argDecl->getType().getUnqualifiedType();207  Args.add(RValue::get(Objects, *this), ArgQT);208  if (DLE) {209    argDecl = *PI++;210    ArgQT = argDecl->getType().getUnqualifiedType();211    Args.add(RValue::get(Keys, *this), ArgQT);212  }213  argDecl = *PI;214  ArgQT = argDecl->getType().getUnqualifiedType();215  llvm::Value *Count =216    llvm::ConstantInt::get(CGM.getTypes().ConvertType(ArgQT), NumElements);217  Args.add(RValue::get(Count), ArgQT);218 219  // Generate a reference to the class pointer, which will be the receiver.220  Selector Sel = MethodWithObjects->getSelector();221  QualType ResultType = E->getType();222  const ObjCObjectPointerType *InterfacePointerType223    = ResultType->getAsObjCInterfacePointerType();224  assert(InterfacePointerType && "Unexpected InterfacePointerType - null");225  ObjCInterfaceDecl *Class226    = InterfacePointerType->getObjectType()->getInterface();227  CGObjCRuntime &Runtime = CGM.getObjCRuntime();228  llvm::Value *Receiver = Runtime.GetClass(*this, Class);229 230  // Generate the message send.231  RValue result = Runtime.GenerateMessageSend(232      *this, ReturnValueSlot(), MethodWithObjects->getReturnType(), Sel,233      Receiver, Args, Class, MethodWithObjects);234 235  // The above message send needs these objects, but in ARC they are236  // passed in a buffer that is essentially __unsafe_unretained.237  // Therefore we must prevent the optimizer from releasing them until238  // after the call.239  if (TrackNeededObjects) {240    EmitARCIntrinsicUse(NeededObjects);241  }242 243  return Builder.CreateBitCast(result.getScalarVal(),244                               ConvertType(E->getType()));245}246 247llvm::Value *CodeGenFunction::EmitObjCArrayLiteral(const ObjCArrayLiteral *E) {248  return EmitObjCCollectionLiteral(E, E->getArrayWithObjectsMethod());249}250 251llvm::Value *CodeGenFunction::EmitObjCDictionaryLiteral(252                                            const ObjCDictionaryLiteral *E) {253  return EmitObjCCollectionLiteral(E, E->getDictWithObjectsMethod());254}255 256/// Emit a selector.257llvm::Value *CodeGenFunction::EmitObjCSelectorExpr(const ObjCSelectorExpr *E) {258  // Untyped selector.259  // Note that this implementation allows for non-constant strings to be passed260  // as arguments to @selector().  Currently, the only thing preventing this261  // behaviour is the type checking in the front end.262  return CGM.getObjCRuntime().GetSelector(*this, E->getSelector());263}264 265llvm::Value *CodeGenFunction::EmitObjCProtocolExpr(const ObjCProtocolExpr *E) {266  // FIXME: This should pass the Decl not the name.267  return CGM.getObjCRuntime().GenerateProtocolRef(*this, E->getProtocol());268}269 270/// Adjust the type of an Objective-C object that doesn't match up due271/// to type erasure at various points, e.g., related result types or the use272/// of parameterized classes.273static RValue AdjustObjCObjectType(CodeGenFunction &CGF, QualType ExpT,274                                   RValue Result) {275  if (!ExpT->isObjCRetainableType())276    return Result;277 278  // If the converted types are the same, we're done.279  llvm::Type *ExpLLVMTy = CGF.ConvertType(ExpT);280  if (ExpLLVMTy == Result.getScalarVal()->getType())281    return Result;282 283  // We have applied a substitution. Cast the rvalue appropriately.284  return RValue::get(CGF.Builder.CreateBitCast(Result.getScalarVal(),285                                               ExpLLVMTy));286}287 288/// Decide whether to extend the lifetime of the receiver of a289/// returns-inner-pointer message.290static bool291shouldExtendReceiverForInnerPointerMessage(const ObjCMessageExpr *message) {292  switch (message->getReceiverKind()) {293 294  // For a normal instance message, we should extend unless the295  // receiver is loaded from a variable with precise lifetime.296  case ObjCMessageExpr::Instance: {297    const Expr *receiver = message->getInstanceReceiver();298 299    // Look through OVEs.300    if (auto opaque = dyn_cast<OpaqueValueExpr>(receiver)) {301      if (opaque->getSourceExpr())302        receiver = opaque->getSourceExpr()->IgnoreParens();303    }304 305    const ImplicitCastExpr *ice = dyn_cast<ImplicitCastExpr>(receiver);306    if (!ice || ice->getCastKind() != CK_LValueToRValue) return true;307    receiver = ice->getSubExpr()->IgnoreParens();308 309    // Look through OVEs.310    if (auto opaque = dyn_cast<OpaqueValueExpr>(receiver)) {311      if (opaque->getSourceExpr())312        receiver = opaque->getSourceExpr()->IgnoreParens();313    }314 315    // Only __strong variables.316    if (receiver->getType().getObjCLifetime() != Qualifiers::OCL_Strong)317      return true;318 319    // All ivars and fields have precise lifetime.320    if (isa<MemberExpr>(receiver) || isa<ObjCIvarRefExpr>(receiver))321      return false;322 323    // Otherwise, check for variables.324    const DeclRefExpr *declRef = dyn_cast<DeclRefExpr>(ice->getSubExpr());325    if (!declRef) return true;326    const VarDecl *var = dyn_cast<VarDecl>(declRef->getDecl());327    if (!var) return true;328 329    // All variables have precise lifetime except local variables with330    // automatic storage duration that aren't specially marked.331    return (var->hasLocalStorage() &&332            !var->hasAttr<ObjCPreciseLifetimeAttr>());333  }334 335  case ObjCMessageExpr::Class:336  case ObjCMessageExpr::SuperClass:337    // It's never necessary for class objects.338    return false;339 340  case ObjCMessageExpr::SuperInstance:341    // We generally assume that 'self' lives throughout a method call.342    return false;343  }344 345  llvm_unreachable("invalid receiver kind");346}347 348/// Given an expression of ObjC pointer type, check whether it was349/// immediately loaded from an ARC __weak l-value.350static const Expr *findWeakLValue(const Expr *E) {351  assert(E->getType()->isObjCRetainableType());352  E = E->IgnoreParens();353  if (auto CE = dyn_cast<CastExpr>(E)) {354    if (CE->getCastKind() == CK_LValueToRValue) {355      if (CE->getSubExpr()->getType().getObjCLifetime() == Qualifiers::OCL_Weak)356        return CE->getSubExpr();357    }358  }359 360  return nullptr;361}362 363/// The ObjC runtime may provide entrypoints that are likely to be faster364/// than an ordinary message send of the appropriate selector.365///366/// The entrypoints are guaranteed to be equivalent to just sending the367/// corresponding message.  If the entrypoint is implemented naively as just a368/// message send, using it is a trade-off: it sacrifices a few cycles of369/// overhead to save a small amount of code.  However, it's possible for370/// runtimes to detect and special-case classes that use "standard"371/// behavior; if that's dynamically a large proportion of all objects, using372/// the entrypoint will also be faster than using a message send.373///374/// If the runtime does support a required entrypoint, then this method will375/// generate a call and return the resulting value.  Otherwise it will return376/// std::nullopt and the caller can generate a msgSend instead.377static std::optional<llvm::Value *> tryGenerateSpecializedMessageSend(378    CodeGenFunction &CGF, QualType ResultType, llvm::Value *Receiver,379    const CallArgList &Args, Selector Sel, const ObjCMethodDecl *method,380    bool isClassMessage) {381  auto &CGM = CGF.CGM;382  if (!CGM.getCodeGenOpts().ObjCConvertMessagesToRuntimeCalls)383    return std::nullopt;384 385  auto &Runtime = CGM.getLangOpts().ObjCRuntime;386  switch (Sel.getMethodFamily()) {387  case OMF_alloc:388    if (isClassMessage &&389        Runtime.shouldUseRuntimeFunctionsForAlloc() &&390        ResultType->isObjCObjectPointerType()) {391        // [Foo alloc] -> objc_alloc(Foo) or392        // [self alloc] -> objc_alloc(self)393        if (Sel.isUnarySelector() && Sel.getNameForSlot(0) == "alloc")394          return CGF.EmitObjCAlloc(Receiver, CGF.ConvertType(ResultType));395        // [Foo allocWithZone:nil] -> objc_allocWithZone(Foo) or396        // [self allocWithZone:nil] -> objc_allocWithZone(self)397        if (Sel.isKeywordSelector() && Sel.getNumArgs() == 1 &&398            Args.size() == 1 && Args.front().getType()->isPointerType() &&399            Sel.getNameForSlot(0) == "allocWithZone") {400          const llvm::Value* arg = Args.front().getKnownRValue().getScalarVal();401          if (isa<llvm::ConstantPointerNull>(arg))402            return CGF.EmitObjCAllocWithZone(Receiver,403                                             CGF.ConvertType(ResultType));404          return std::nullopt;405        }406    }407    break;408 409  case OMF_autorelease:410    if (ResultType->isObjCObjectPointerType() &&411        CGM.getLangOpts().getGC() == LangOptions::NonGC &&412        Runtime.shouldUseARCFunctionsForRetainRelease())413      return CGF.EmitObjCAutorelease(Receiver, CGF.ConvertType(ResultType));414    break;415 416  case OMF_retain:417    if (ResultType->isObjCObjectPointerType() &&418        CGM.getLangOpts().getGC() == LangOptions::NonGC &&419        Runtime.shouldUseARCFunctionsForRetainRelease())420      return CGF.EmitObjCRetainNonBlock(Receiver, CGF.ConvertType(ResultType));421    break;422 423  case OMF_release:424    if (ResultType->isVoidType() &&425        CGM.getLangOpts().getGC() == LangOptions::NonGC &&426        Runtime.shouldUseARCFunctionsForRetainRelease()) {427      CGF.EmitObjCRelease(Receiver, ARCPreciseLifetime);428      return nullptr;429    }430    break;431 432  default:433    break;434  }435  return std::nullopt;436}437 438CodeGen::RValue CGObjCRuntime::GeneratePossiblySpecializedMessageSend(439    CodeGenFunction &CGF, ReturnValueSlot Return, QualType ResultType,440    Selector Sel, llvm::Value *Receiver, const CallArgList &Args,441    const ObjCInterfaceDecl *OID, const ObjCMethodDecl *Method,442    bool isClassMessage) {443  if (std::optional<llvm::Value *> SpecializedResult =444          tryGenerateSpecializedMessageSend(CGF, ResultType, Receiver, Args,445                                            Sel, Method, isClassMessage)) {446    return RValue::get(*SpecializedResult);447  }448  return GenerateMessageSend(CGF, Return, ResultType, Sel, Receiver, Args, OID,449                             Method);450}451 452static void AppendFirstImpliedRuntimeProtocols(453    const ObjCProtocolDecl *PD,454    llvm::UniqueVector<const ObjCProtocolDecl *> &PDs) {455  if (!PD->isNonRuntimeProtocol()) {456    const auto *Can = PD->getCanonicalDecl();457    PDs.insert(Can);458    return;459  }460 461  for (const auto *ParentPD : PD->protocols())462    AppendFirstImpliedRuntimeProtocols(ParentPD, PDs);463}464 465std::vector<const ObjCProtocolDecl *>466CGObjCRuntime::GetRuntimeProtocolList(ObjCProtocolDecl::protocol_iterator begin,467                                      ObjCProtocolDecl::protocol_iterator end) {468  std::vector<const ObjCProtocolDecl *> RuntimePds;469  llvm::DenseSet<const ObjCProtocolDecl *> NonRuntimePDs;470 471  for (; begin != end; ++begin) {472    const auto *It = *begin;473    const auto *Can = It->getCanonicalDecl();474    if (Can->isNonRuntimeProtocol())475      NonRuntimePDs.insert(Can);476    else477      RuntimePds.push_back(Can);478  }479 480  // If there are no non-runtime protocols then we can just stop now.481  if (NonRuntimePDs.empty())482    return RuntimePds;483 484  // Else we have to search through the non-runtime protocol's inheritancy485  // hierarchy DAG stopping whenever a branch either finds a runtime protocol or486  // a non-runtime protocol without any parents. These are the "first-implied"487  // protocols from a non-runtime protocol.488  llvm::UniqueVector<const ObjCProtocolDecl *> FirstImpliedProtos;489  for (const auto *PD : NonRuntimePDs)490    AppendFirstImpliedRuntimeProtocols(PD, FirstImpliedProtos);491 492  // Walk the Runtime list to get all protocols implied via the inclusion of493  // this protocol, e.g. all protocols it inherits from including itself.494  llvm::DenseSet<const ObjCProtocolDecl *> AllImpliedProtocols;495  for (const auto *PD : RuntimePds) {496    const auto *Can = PD->getCanonicalDecl();497    AllImpliedProtocols.insert(Can);498    Can->getImpliedProtocols(AllImpliedProtocols);499  }500 501  // Similar to above, walk the list of first-implied protocols to find the set502  // all the protocols implied excluding the listed protocols themselves since503  // they are not yet a part of the `RuntimePds` list.504  for (const auto *PD : FirstImpliedProtos) {505    PD->getImpliedProtocols(AllImpliedProtocols);506  }507 508  // From the first-implied list we have to finish building the final protocol509  // list. If a protocol in the first-implied list was already implied via some510  // inheritance path through some other protocols then it would be redundant to511  // add it here and so we skip over it.512  for (const auto *PD : FirstImpliedProtos) {513    if (!AllImpliedProtocols.contains(PD)) {514      RuntimePds.push_back(PD);515    }516  }517 518  return RuntimePds;519}520 521/// Instead of '[[MyClass alloc] init]', try to generate522/// 'objc_alloc_init(MyClass)'. This provides a code size improvement on the523/// caller side, as well as the optimized objc_alloc.524static std::optional<llvm::Value *>525tryEmitSpecializedAllocInit(CodeGenFunction &CGF, const ObjCMessageExpr *OME) {526  auto &Runtime = CGF.getLangOpts().ObjCRuntime;527  if (!Runtime.shouldUseRuntimeFunctionForCombinedAllocInit())528    return std::nullopt;529 530  // Match the exact pattern '[[MyClass alloc] init]'.531  Selector Sel = OME->getSelector();532  if (OME->getReceiverKind() != ObjCMessageExpr::Instance ||533      !OME->getType()->isObjCObjectPointerType() || !Sel.isUnarySelector() ||534      Sel.getNameForSlot(0) != "init")535    return std::nullopt;536 537  // Okay, this is '[receiver init]', check if 'receiver' is '[cls alloc]'538  // with 'cls' a Class.539  auto *SubOME =540      dyn_cast<ObjCMessageExpr>(OME->getInstanceReceiver()->IgnoreParenCasts());541  if (!SubOME)542    return std::nullopt;543  Selector SubSel = SubOME->getSelector();544 545  if (!SubOME->getType()->isObjCObjectPointerType() ||546      !SubSel.isUnarySelector() || SubSel.getNameForSlot(0) != "alloc")547    return std::nullopt;548 549  llvm::Value *Receiver = nullptr;550  switch (SubOME->getReceiverKind()) {551  case ObjCMessageExpr::Instance:552    if (!SubOME->getInstanceReceiver()->getType()->isObjCClassType())553      return std::nullopt;554    Receiver = CGF.EmitScalarExpr(SubOME->getInstanceReceiver());555    break;556 557  case ObjCMessageExpr::Class: {558    QualType ReceiverType = SubOME->getClassReceiver();559    const ObjCObjectType *ObjTy = ReceiverType->castAs<ObjCObjectType>();560    const ObjCInterfaceDecl *ID = ObjTy->getInterface();561    assert(ID && "null interface should be impossible here");562    Receiver = CGF.CGM.getObjCRuntime().GetClass(CGF, ID);563    break;564  }565  case ObjCMessageExpr::SuperInstance:566  case ObjCMessageExpr::SuperClass:567    return std::nullopt;568  }569 570  return CGF.EmitObjCAllocInit(Receiver, CGF.ConvertType(OME->getType()));571}572 573RValue CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E,574                                            ReturnValueSlot Return) {575  // Only the lookup mechanism and first two arguments of the method576  // implementation vary between runtimes.  We can get the receiver and577  // arguments in generic code.578 579  bool isDelegateInit = E->isDelegateInitCall();580 581  const ObjCMethodDecl *method = E->getMethodDecl();582 583  // If the method is -retain, and the receiver's being loaded from584  // a __weak variable, peephole the entire operation to objc_loadWeakRetained.585  if (method && E->getReceiverKind() == ObjCMessageExpr::Instance &&586      method->getMethodFamily() == OMF_retain) {587    if (auto lvalueExpr = findWeakLValue(E->getInstanceReceiver())) {588      LValue lvalue = EmitLValue(lvalueExpr);589      llvm::Value *result = EmitARCLoadWeakRetained(lvalue.getAddress());590      return AdjustObjCObjectType(*this, E->getType(), RValue::get(result));591    }592  }593 594  if (std::optional<llvm::Value *> Val = tryEmitSpecializedAllocInit(*this, E))595    return AdjustObjCObjectType(*this, E->getType(), RValue::get(*Val));596 597  // We don't retain the receiver in delegate init calls, and this is598  // safe because the receiver value is always loaded from 'self',599  // which we zero out.  We don't want to Block_copy block receivers,600  // though.601  bool retainSelf =602    (!isDelegateInit &&603     CGM.getLangOpts().ObjCAutoRefCount &&604     method &&605     method->hasAttr<NSConsumesSelfAttr>());606 607  CGObjCRuntime &Runtime = CGM.getObjCRuntime();608  bool isSuperMessage = false;609  bool isClassMessage = false;610  ObjCInterfaceDecl *OID = nullptr;611  // Find the receiver612  QualType ReceiverType;613  llvm::Value *Receiver = nullptr;614  switch (E->getReceiverKind()) {615  case ObjCMessageExpr::Instance:616    ReceiverType = E->getInstanceReceiver()->getType();617    isClassMessage = ReceiverType->isObjCClassType();618    if (retainSelf) {619      TryEmitResult ter = tryEmitARCRetainScalarExpr(*this,620                                                   E->getInstanceReceiver());621      Receiver = ter.getPointer();622      if (ter.getInt()) retainSelf = false;623    } else624      Receiver = EmitScalarExpr(E->getInstanceReceiver());625    break;626 627  case ObjCMessageExpr::Class: {628    ReceiverType = E->getClassReceiver();629    OID = ReceiverType->castAs<ObjCObjectType>()->getInterface();630    assert(OID && "Invalid Objective-C class message send");631    Receiver = Runtime.GetClass(*this, OID);632    isClassMessage = true;633    break;634  }635 636  case ObjCMessageExpr::SuperInstance:637    ReceiverType = E->getSuperType();638    Receiver = LoadObjCSelf();639    isSuperMessage = true;640    break;641 642  case ObjCMessageExpr::SuperClass:643    ReceiverType = E->getSuperType();644    Receiver = LoadObjCSelf();645    isSuperMessage = true;646    isClassMessage = true;647    break;648  }649 650  if (retainSelf)651    Receiver = EmitARCRetainNonBlock(Receiver);652 653  // In ARC, we sometimes want to "extend the lifetime"654  // (i.e. retain+autorelease) of receivers of returns-inner-pointer655  // messages.656  if (getLangOpts().ObjCAutoRefCount && method &&657      method->hasAttr<ObjCReturnsInnerPointerAttr>() &&658      shouldExtendReceiverForInnerPointerMessage(E))659    Receiver = EmitARCRetainAutorelease(ReceiverType, Receiver);660 661  QualType ResultType = method ? method->getReturnType() : E->getType();662 663  CallArgList Args;664  EmitCallArgs(Args, method, E->arguments(), /*AC*/AbstractCallee(method));665 666  // For delegate init calls in ARC, do an unsafe store of null into667  // self.  This represents the call taking direct ownership of that668  // value.  We have to do this after emitting the other call669  // arguments because they might also reference self, but we don't670  // have to worry about any of them modifying self because that would671  // be an undefined read and write of an object in unordered672  // expressions.673  if (isDelegateInit) {674    assert(getLangOpts().ObjCAutoRefCount &&675           "delegate init calls should only be marked in ARC");676 677    // Do an unsafe store of null into self.678    Address selfAddr =679      GetAddrOfLocalVar(cast<ObjCMethodDecl>(CurCodeDecl)->getSelfDecl());680    Builder.CreateStore(getNullForVariable(selfAddr), selfAddr);681  }682 683  RValue result;684  if (isSuperMessage) {685    // super is only valid in an Objective-C method686    const ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(CurFuncDecl);687    bool isCategoryImpl = isa<ObjCCategoryImplDecl>(OMD->getDeclContext());688    result = Runtime.GenerateMessageSendSuper(*this, Return, ResultType,689                                              E->getSelector(),690                                              OMD->getClassInterface(),691                                              isCategoryImpl,692                                              Receiver,693                                              isClassMessage,694                                              Args,695                                              method);696  } else {697    // Call runtime methods directly if we can.698    result = Runtime.GeneratePossiblySpecializedMessageSend(699        *this, Return, ResultType, E->getSelector(), Receiver, Args, OID,700        method, isClassMessage);701  }702 703  // For delegate init calls in ARC, implicitly store the result of704  // the call back into self.  This takes ownership of the value.705  if (isDelegateInit) {706    Address selfAddr =707      GetAddrOfLocalVar(cast<ObjCMethodDecl>(CurCodeDecl)->getSelfDecl());708    llvm::Value *newSelf = result.getScalarVal();709 710    // The delegate return type isn't necessarily a matching type; in711    // fact, it's quite likely to be 'id'.712    llvm::Type *selfTy = selfAddr.getElementType();713    newSelf = Builder.CreateBitCast(newSelf, selfTy);714 715    Builder.CreateStore(newSelf, selfAddr);716  }717 718  return AdjustObjCObjectType(*this, E->getType(), result);719}720 721namespace {722struct FinishARCDealloc final : EHScopeStack::Cleanup {723  void Emit(CodeGenFunction &CGF, Flags flags) override {724    const ObjCMethodDecl *method = cast<ObjCMethodDecl>(CGF.CurCodeDecl);725 726    const ObjCImplDecl *impl = cast<ObjCImplDecl>(method->getDeclContext());727    const ObjCInterfaceDecl *iface = impl->getClassInterface();728    if (!iface->getSuperClass()) return;729 730    bool isCategory = isa<ObjCCategoryImplDecl>(impl);731 732    // Call [super dealloc] if we have a superclass.733    llvm::Value *self = CGF.LoadObjCSelf();734 735    CallArgList args;736    CGF.CGM.getObjCRuntime().GenerateMessageSendSuper(CGF, ReturnValueSlot(),737                                                      CGF.getContext().VoidTy,738                                                      method->getSelector(),739                                                      iface,740                                                      isCategory,741                                                      self,742                                                      /*is class msg*/ false,743                                                      args,744                                                      method);745  }746};747}748 749/// StartObjCMethod - Begin emission of an ObjCMethod. This generates750/// the LLVM function and sets the other context used by751/// CodeGenFunction.752void CodeGenFunction::StartObjCMethod(const ObjCMethodDecl *OMD,753                                      const ObjCContainerDecl *CD) {754  SourceLocation StartLoc = OMD->getBeginLoc();755  FunctionArgList args;756  // Check if we should generate debug info for this method.757  if (OMD->hasAttr<NoDebugAttr>())758    DebugInfo = nullptr; // disable debug info indefinitely for this function759 760  llvm::Function *Fn = CGM.getObjCRuntime().GenerateMethod(OMD, CD);761 762  const CGFunctionInfo &FI = CGM.getTypes().arrangeObjCMethodDeclaration(OMD);763  if (OMD->isDirectMethod()) {764    Fn->setVisibility(llvm::Function::HiddenVisibility);765    CGM.SetLLVMFunctionAttributes(OMD, FI, Fn, /*IsThunk=*/false);766    CGM.SetLLVMFunctionAttributesForDefinition(OMD, Fn);767  } else {768    CGM.SetInternalFunctionAttributes(OMD, Fn, FI);769  }770 771  args.push_back(OMD->getSelfDecl());772  if (!OMD->isDirectMethod())773    args.push_back(OMD->getCmdDecl());774 775  args.append(OMD->param_begin(), OMD->param_end());776 777  CurGD = OMD;778  CurEHLocation = OMD->getEndLoc();779 780  StartFunction(OMD, OMD->getReturnType(), Fn, FI, args,781                OMD->getLocation(), StartLoc);782 783  if (OMD->isDirectMethod()) {784    // This function is a direct call, it has to implement a nil check785    // on entry.786    //787    // TODO: possibly have several entry points to elide the check788    CGM.getObjCRuntime().GenerateDirectMethodPrologue(*this, Fn, OMD, CD);789  }790 791  // In ARC, certain methods get an extra cleanup.792  if (CGM.getLangOpts().ObjCAutoRefCount &&793      OMD->isInstanceMethod() &&794      OMD->getSelector().isUnarySelector()) {795    const IdentifierInfo *ident =796      OMD->getSelector().getIdentifierInfoForSlot(0);797    if (ident->isStr("dealloc"))798      EHStack.pushCleanup<FinishARCDealloc>(getARCCleanupKind());799  }800}801 802static llvm::Value *emitARCRetainLoadOfScalar(CodeGenFunction &CGF,803                                              LValue lvalue, QualType type);804 805/// Generate an Objective-C method.  An Objective-C method is a C function with806/// its pointer, name, and types registered in the class structure.807void CodeGenFunction::GenerateObjCMethod(const ObjCMethodDecl *OMD) {808  StartObjCMethod(OMD, OMD->getClassInterface());809  PGO->assignRegionCounters(GlobalDecl(OMD), CurFn);810  assert(isa<CompoundStmt>(OMD->getBody()));811  incrementProfileCounter(OMD->getBody());812  EmitCompoundStmtWithoutScope(*cast<CompoundStmt>(OMD->getBody()));813  FinishFunction(OMD->getBodyRBrace());814}815 816/// emitStructGetterCall - Call the runtime function to load a property817/// into the return value slot.818static void emitStructGetterCall(CodeGenFunction &CGF, ObjCIvarDecl *ivar,819                                 bool isAtomic, bool hasStrong) {820  ASTContext &Context = CGF.getContext();821 822  llvm::Value *src =823      CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(), CGF.LoadObjCSelf(), ivar, 0)824          .getPointer(CGF);825 826  // objc_copyStruct (ReturnValue, &structIvar,827  //                  sizeof (Type of Ivar), isAtomic, false);828  CallArgList args;829 830  llvm::Value *dest = CGF.ReturnValue.emitRawPointer(CGF);831  args.add(RValue::get(dest), Context.VoidPtrTy);832  args.add(RValue::get(src), Context.VoidPtrTy);833 834  CharUnits size = CGF.getContext().getTypeSizeInChars(ivar->getType());835  args.add(RValue::get(CGF.CGM.getSize(size)), Context.getSizeType());836  args.add(RValue::get(CGF.Builder.getInt1(isAtomic)), Context.BoolTy);837  args.add(RValue::get(CGF.Builder.getInt1(hasStrong)), Context.BoolTy);838 839  llvm::FunctionCallee fn = CGF.CGM.getObjCRuntime().GetGetStructFunction();840  CGCallee callee = CGCallee::forDirect(fn);841  CGF.EmitCall(CGF.getTypes().arrangeBuiltinFunctionCall(Context.VoidTy, args),842               callee, ReturnValueSlot(), args);843}844 845/// Determine whether the given architecture supports unaligned atomic846/// accesses.  They don't have to be fast, just faster than a function847/// call and a mutex.848static bool hasUnalignedAtomics(llvm::Triple::ArchType arch) {849  // FIXME: Allow unaligned atomic load/store on x86.  (It is not850  // currently supported by the backend.)851  return false;852}853 854/// Return the maximum size that permits atomic accesses for the given855/// architecture.856static CharUnits getMaxAtomicAccessSize(CodeGenModule &CGM,857                                        llvm::Triple::ArchType arch) {858  // ARM has 8-byte atomic accesses, but it's not clear whether we859  // want to rely on them here.860 861  // In the default case, just assume that any size up to a pointer is862  // fine given adequate alignment.863  return CharUnits::fromQuantity(CGM.PointerSizeInBytes);864}865 866namespace {867  class PropertyImplStrategy {868  public:869    enum StrategyKind {870      /// The 'native' strategy is to use the architecture's provided871      /// reads and writes.872      Native,873 874      /// Use objc_setProperty and objc_getProperty.875      GetSetProperty,876 877      /// Use objc_setProperty for the setter, but use expression878      /// evaluation for the getter.879      SetPropertyAndExpressionGet,880 881      /// Use objc_copyStruct.882      CopyStruct,883 884      /// The 'expression' strategy is to emit normal assignment or885      /// lvalue-to-rvalue expressions.886      Expression887    };888 889    StrategyKind getKind() const { return StrategyKind(Kind); }890 891    bool hasStrongMember() const { return HasStrong; }892    bool isAtomic() const { return IsAtomic; }893    bool isCopy() const { return IsCopy; }894 895    CharUnits getIvarSize() const { return IvarSize; }896    CharUnits getIvarAlignment() const { return IvarAlignment; }897 898    PropertyImplStrategy(CodeGenModule &CGM,899                         const ObjCPropertyImplDecl *propImpl);900 901  private:902    LLVM_PREFERRED_TYPE(StrategyKind)903    unsigned Kind : 8;904    LLVM_PREFERRED_TYPE(bool)905    unsigned IsAtomic : 1;906    LLVM_PREFERRED_TYPE(bool)907    unsigned IsCopy : 1;908    LLVM_PREFERRED_TYPE(bool)909    unsigned HasStrong : 1;910 911    CharUnits IvarSize;912    CharUnits IvarAlignment;913  };914}915 916/// Pick an implementation strategy for the given property synthesis.917PropertyImplStrategy::PropertyImplStrategy(CodeGenModule &CGM,918                                     const ObjCPropertyImplDecl *propImpl) {919  const ObjCPropertyDecl *prop = propImpl->getPropertyDecl();920  ObjCPropertyDecl::SetterKind setterKind = prop->getSetterKind();921 922  IsCopy = (setterKind == ObjCPropertyDecl::Copy);923  IsAtomic = prop->isAtomic();924  HasStrong = false; // doesn't matter here.925 926  // Evaluate the ivar's size and alignment.927  ObjCIvarDecl *ivar = propImpl->getPropertyIvarDecl();928  QualType ivarType = ivar->getType();929  auto TInfo = CGM.getContext().getTypeInfoInChars(ivarType);930  IvarSize = TInfo.Width;931  IvarAlignment = TInfo.Align;932 933  // If we have a copy property, we always have to use setProperty.934  // If the property is atomic we need to use getProperty, but in935  // the nonatomic case we can just use expression.936  if (IsCopy) {937    Kind = IsAtomic ? GetSetProperty : SetPropertyAndExpressionGet;938    return;939  }940 941  // Handle retain.942  if (setterKind == ObjCPropertyDecl::Retain) {943    // In GC-only, there's nothing special that needs to be done.944    if (CGM.getLangOpts().getGC() == LangOptions::GCOnly) {945      // fallthrough946 947    // In ARC, if the property is non-atomic, use expression emission,948    // which translates to objc_storeStrong.  This isn't required, but949    // it's slightly nicer.950    } else if (CGM.getLangOpts().ObjCAutoRefCount && !IsAtomic) {951      // Using standard expression emission for the setter is only952      // acceptable if the ivar is __strong, which won't be true if953      // the property is annotated with __attribute__((NSObject)).954      // TODO: falling all the way back to objc_setProperty here is955      // just laziness, though;  we could still use objc_storeStrong956      // if we hacked it right.957      if (ivarType.getObjCLifetime() == Qualifiers::OCL_Strong)958        Kind = Expression;959      else960        Kind = SetPropertyAndExpressionGet;961      return;962 963    // Otherwise, we need to at least use setProperty.  However, if964    // the property isn't atomic, we can use normal expression965    // emission for the getter.966    } else if (!IsAtomic) {967      Kind = SetPropertyAndExpressionGet;968      return;969 970    // Otherwise, we have to use both setProperty and getProperty.971    } else {972      Kind = GetSetProperty;973      return;974    }975  }976 977  // If we're not atomic, just use expression accesses.978  if (!IsAtomic) {979    Kind = Expression;980    return;981  }982 983  // Properties on bitfield ivars need to be emitted using expression984  // accesses even if they're nominally atomic.985  if (ivar->isBitField()) {986    Kind = Expression;987    return;988  }989 990  // GC-qualified or ARC-qualified ivars need to be emitted as991  // expressions.  This actually works out to being atomic anyway,992  // except for ARC __strong, but that should trigger the above code.993  if (ivarType.hasNonTrivialObjCLifetime() ||994      (CGM.getLangOpts().getGC() &&995       CGM.getContext().getObjCGCAttrKind(ivarType))) {996    Kind = Expression;997    return;998  }999 1000  // Compute whether the ivar has strong members.1001  if (CGM.getLangOpts().getGC())1002    if (const auto *RD = ivarType->getAsRecordDecl())1003      HasStrong = RD->hasObjectMember();1004 1005  // We can never access structs with object members with a native1006  // access, because we need to use write barriers.  This is what1007  // objc_copyStruct is for.1008  if (HasStrong) {1009    Kind = CopyStruct;1010    return;1011  }1012 1013  // Otherwise, this is target-dependent and based on the size and1014  // alignment of the ivar.1015 1016  // If the size of the ivar is not a power of two, give up.  We don't1017  // want to get into the business of doing compare-and-swaps.1018  if (!IvarSize.isPowerOfTwo()) {1019    Kind = CopyStruct;1020    return;1021  }1022 1023  llvm::Triple::ArchType arch =1024    CGM.getTarget().getTriple().getArch();1025 1026  // Most architectures require memory to fit within a single cache1027  // line, so the alignment has to be at least the size of the access.1028  // Otherwise we have to grab a lock.1029  if (IvarAlignment < IvarSize && !hasUnalignedAtomics(arch)) {1030    Kind = CopyStruct;1031    return;1032  }1033 1034  // If the ivar's size exceeds the architecture's maximum atomic1035  // access size, we have to use CopyStruct.1036  if (IvarSize > getMaxAtomicAccessSize(CGM, arch)) {1037    Kind = CopyStruct;1038    return;1039  }1040 1041  // Otherwise, we can use native loads and stores.1042  Kind = Native;1043}1044 1045/// Generate an Objective-C property getter function.1046///1047/// The given Decl must be an ObjCImplementationDecl. \@synthesize1048/// is illegal within a category.1049void CodeGenFunction::GenerateObjCGetter(ObjCImplementationDecl *IMP,1050                                         const ObjCPropertyImplDecl *PID) {1051  llvm::Constant *AtomicHelperFn =1052      CodeGenFunction(CGM).GenerateObjCAtomicGetterCopyHelperFunction(PID);1053  ObjCMethodDecl *OMD = PID->getGetterMethodDecl();1054  assert(OMD && "Invalid call to generate getter (empty method)");1055  StartObjCMethod(OMD, IMP->getClassInterface());1056 1057  generateObjCGetterBody(IMP, PID, OMD, AtomicHelperFn);1058 1059  FinishFunction(OMD->getEndLoc());1060}1061 1062static bool hasTrivialGetExpr(const ObjCPropertyImplDecl *propImpl) {1063  const Expr *getter = propImpl->getGetterCXXConstructor();1064  if (!getter) return true;1065 1066  // Sema only makes only of these when the ivar has a C++ class type,1067  // so the form is pretty constrained.1068 1069  // If the property has a reference type, we might just be binding a1070  // reference, in which case the result will be a gl-value.  We should1071  // treat this as a non-trivial operation.1072  if (getter->isGLValue())1073    return false;1074 1075  // If we selected a trivial copy-constructor, we're okay.1076  if (const CXXConstructExpr *construct = dyn_cast<CXXConstructExpr>(getter))1077    return (construct->getConstructor()->isTrivial());1078 1079  // The constructor might require cleanups (in which case it's never1080  // trivial).1081  assert(isa<ExprWithCleanups>(getter));1082  return false;1083}1084 1085/// emitCPPObjectAtomicGetterCall - Call the runtime function to1086/// copy the ivar into the resturn slot.1087static void emitCPPObjectAtomicGetterCall(CodeGenFunction &CGF,1088                                          llvm::Value *returnAddr,1089                                          ObjCIvarDecl *ivar,1090                                          llvm::Constant *AtomicHelperFn) {1091  // objc_copyCppObjectAtomic (&returnSlot, &CppObjectIvar,1092  //                           AtomicHelperFn);1093  CallArgList args;1094 1095  // The 1st argument is the return Slot.1096  args.add(RValue::get(returnAddr), CGF.getContext().VoidPtrTy);1097 1098  // The 2nd argument is the address of the ivar.1099  llvm::Value *ivarAddr =1100      CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(), CGF.LoadObjCSelf(), ivar, 0)1101          .getPointer(CGF);1102  args.add(RValue::get(ivarAddr), CGF.getContext().VoidPtrTy);1103 1104  // Third argument is the helper function.1105  args.add(RValue::get(AtomicHelperFn), CGF.getContext().VoidPtrTy);1106 1107  llvm::FunctionCallee copyCppAtomicObjectFn =1108      CGF.CGM.getObjCRuntime().GetCppAtomicObjectGetFunction();1109  CGCallee callee = CGCallee::forDirect(copyCppAtomicObjectFn);1110  CGF.EmitCall(1111      CGF.getTypes().arrangeBuiltinFunctionCall(CGF.getContext().VoidTy, args),1112               callee, ReturnValueSlot(), args);1113}1114 1115// emitCmdValueForGetterSetterBody - Handle emitting the load necessary for1116// the `_cmd` selector argument for getter/setter bodies. For direct methods,1117// this returns an undefined/poison value; this matches behavior prior to `_cmd`1118// being removed from the direct method ABI as the getter/setter caller would1119// never load one. For non-direct methods, this emits a load of the implicit1120// `_cmd` storage.1121static llvm::Value *emitCmdValueForGetterSetterBody(CodeGenFunction &CGF,1122                                                   ObjCMethodDecl *MD) {1123  if (MD->isDirectMethod()) {1124    // Direct methods do not have a `_cmd` argument. Emit an undefined/poison1125    // value. This will be passed to objc_getProperty/objc_setProperty, which1126    // has not appeared bothered by the `_cmd` argument being undefined before.1127    llvm::Type *selType = CGF.ConvertType(CGF.getContext().getObjCSelType());1128    return llvm::PoisonValue::get(selType);1129  }1130 1131  return CGF.Builder.CreateLoad(CGF.GetAddrOfLocalVar(MD->getCmdDecl()), "cmd");1132}1133 1134void1135CodeGenFunction::generateObjCGetterBody(const ObjCImplementationDecl *classImpl,1136                                        const ObjCPropertyImplDecl *propImpl,1137                                        const ObjCMethodDecl *GetterMethodDecl,1138                                        llvm::Constant *AtomicHelperFn) {1139 1140  ObjCIvarDecl *ivar = propImpl->getPropertyIvarDecl();1141 1142  if (ivar->getType().isNonTrivialToPrimitiveCopy() == QualType::PCK_Struct) {1143    if (!AtomicHelperFn) {1144      LValue Src =1145          EmitLValueForIvar(TypeOfSelfObject(), LoadObjCSelf(), ivar, 0);1146      LValue Dst = MakeAddrLValue(ReturnValue, ivar->getType());1147      callCStructCopyConstructor(Dst, Src);1148    } else {1149      ObjCIvarDecl *ivar = propImpl->getPropertyIvarDecl();1150      emitCPPObjectAtomicGetterCall(*this, ReturnValue.emitRawPointer(*this),1151                                    ivar, AtomicHelperFn);1152    }1153    return;1154  }1155 1156  // If there's a non-trivial 'get' expression, we just have to emit that.1157  if (!hasTrivialGetExpr(propImpl)) {1158    if (!AtomicHelperFn) {1159      auto *ret = ReturnStmt::Create(getContext(), SourceLocation(),1160                                     propImpl->getGetterCXXConstructor(),1161                                     /* NRVOCandidate=*/nullptr);1162      EmitReturnStmt(*ret);1163    }1164    else {1165      ObjCIvarDecl *ivar = propImpl->getPropertyIvarDecl();1166      emitCPPObjectAtomicGetterCall(*this, ReturnValue.emitRawPointer(*this),1167                                    ivar, AtomicHelperFn);1168    }1169    return;1170  }1171 1172  const ObjCPropertyDecl *prop = propImpl->getPropertyDecl();1173  QualType propType = prop->getType();1174  ObjCMethodDecl *getterMethod = propImpl->getGetterMethodDecl();1175 1176  // Pick an implementation strategy.1177  PropertyImplStrategy strategy(CGM, propImpl);1178  switch (strategy.getKind()) {1179  case PropertyImplStrategy::Native: {1180    // We don't need to do anything for a zero-size struct.1181    if (strategy.getIvarSize().isZero())1182      return;1183 1184    LValue LV = EmitLValueForIvar(TypeOfSelfObject(), LoadObjCSelf(), ivar, 0);1185 1186    // Currently, all atomic accesses have to be through integer1187    // types, so there's no point in trying to pick a prettier type.1188    uint64_t ivarSize = getContext().toBits(strategy.getIvarSize());1189    llvm::Type *bitcastType = llvm::Type::getIntNTy(getLLVMContext(), ivarSize);1190 1191    // Perform an atomic load.  This does not impose ordering constraints.1192    Address ivarAddr = LV.getAddress();1193    ivarAddr = ivarAddr.withElementType(bitcastType);1194    llvm::LoadInst *load = Builder.CreateLoad(ivarAddr, "load");1195    load->setAtomic(llvm::AtomicOrdering::Unordered);1196    llvm::Value *ivarVal = load;1197    if (PointerAuthQualifier PAQ = ivar->getType().getPointerAuth()) {1198      CGPointerAuthInfo SrcInfo = EmitPointerAuthInfo(PAQ, ivarAddr);1199      CGPointerAuthInfo TargetInfo =1200          CGM.getPointerAuthInfoForType(getterMethod->getReturnType());1201      ivarVal = emitPointerAuthResign(ivarVal, ivar->getType(), SrcInfo,1202                                      TargetInfo, /*isKnownNonNull=*/false);1203    }1204 1205    // Store that value into the return address.  Doing this with a1206    // bitcast is likely to produce some pretty ugly IR, but it's not1207    // the *most* terrible thing in the world.1208    llvm::Type *retTy = ConvertType(getterMethod->getReturnType());1209    uint64_t retTySize = CGM.getDataLayout().getTypeSizeInBits(retTy);1210    if (ivarSize > retTySize) {1211      bitcastType = llvm::Type::getIntNTy(getLLVMContext(), retTySize);1212      ivarVal = Builder.CreateTrunc(ivarVal, bitcastType);1213    }1214    Builder.CreateStore(ivarVal, ReturnValue.withElementType(bitcastType));1215 1216    // Make sure we don't do an autorelease.1217    AutoreleaseResult = false;1218    return;1219  }1220 1221  case PropertyImplStrategy::GetSetProperty: {1222    llvm::FunctionCallee getPropertyFn =1223        CGM.getObjCRuntime().GetPropertyGetFunction();1224 1225    if (ivar->getType().getPointerAuth()) {1226      // This currently cannot be hit, but if we ever allow objc pointers1227      // to be signed, this will become possible. Reaching here would require1228      // a copy, weak, etc property backed by an authenticated pointer.1229      CGM.ErrorUnsupported(propImpl,1230                           "Obj-C getter requiring pointer authentication");1231      return;1232    }1233 1234    if (!getPropertyFn) {1235      CGM.ErrorUnsupported(propImpl, "Obj-C getter requiring atomic copy");1236      return;1237    }1238    CGCallee callee = CGCallee::forDirect(getPropertyFn);1239 1240    // Return (ivar-type) objc_getProperty((id) self, _cmd, offset, true).1241    // FIXME: Can't this be simpler? This might even be worse than the1242    // corresponding gcc code.1243    llvm::Value *cmd = emitCmdValueForGetterSetterBody(*this, getterMethod);1244    llvm::Value *self = Builder.CreateBitCast(LoadObjCSelf(), VoidPtrTy);1245    llvm::Value *ivarOffset =1246        EmitIvarOffsetAsPointerDiff(classImpl->getClassInterface(), ivar);1247 1248    CallArgList args;1249    args.add(RValue::get(self), getContext().getObjCIdType());1250    args.add(RValue::get(cmd), getContext().getObjCSelType());1251    args.add(RValue::get(ivarOffset), getContext().getPointerDiffType());1252    args.add(RValue::get(Builder.getInt1(strategy.isAtomic())),1253             getContext().BoolTy);1254 1255    // FIXME: We shouldn't need to get the function info here, the1256    // runtime already should have computed it to build the function.1257    llvm::CallBase *CallInstruction;1258    RValue RV = EmitCall(getTypes().arrangeBuiltinFunctionCall(1259                             getContext().getObjCIdType(), args),1260                         callee, ReturnValueSlot(), args, &CallInstruction);1261    if (llvm::CallInst *call = dyn_cast<llvm::CallInst>(CallInstruction))1262      call->setTailCall();1263 1264    // We need to fix the type here. Ivars with copy & retain are1265    // always objects so we don't need to worry about complex or1266    // aggregates.1267    RV = RValue::get(Builder.CreateBitCast(1268        RV.getScalarVal(),1269        getTypes().ConvertType(getterMethod->getReturnType())));1270 1271    EmitReturnOfRValue(RV, propType);1272 1273    // objc_getProperty does an autorelease, so we should suppress ours.1274    AutoreleaseResult = false;1275 1276    return;1277  }1278 1279  case PropertyImplStrategy::CopyStruct:1280    emitStructGetterCall(*this, ivar, strategy.isAtomic(),1281                         strategy.hasStrongMember());1282    return;1283 1284  case PropertyImplStrategy::Expression:1285  case PropertyImplStrategy::SetPropertyAndExpressionGet: {1286    LValue LV = EmitLValueForIvar(TypeOfSelfObject(), LoadObjCSelf(), ivar, 0);1287 1288    QualType ivarType = ivar->getType();1289    auto EvaluationKind = getEvaluationKind(ivarType);1290    assert(!ivarType.getPointerAuth() || EvaluationKind == TEK_Scalar);1291    switch (EvaluationKind) {1292    case TEK_Complex: {1293      ComplexPairTy pair = EmitLoadOfComplex(LV, SourceLocation());1294      EmitStoreOfComplex(pair, MakeAddrLValue(ReturnValue, ivarType),1295                         /*init*/ true);1296      return;1297    }1298    case TEK_Aggregate: {1299      // The return value slot is guaranteed to not be aliased, but1300      // that's not necessarily the same as "on the stack", so1301      // we still potentially need objc_memmove_collectable.1302      EmitAggregateCopy(/* Dest= */ MakeAddrLValue(ReturnValue, ivarType),1303                        /* Src= */ LV, ivarType, getOverlapForReturnValue());1304      return;1305    }1306    case TEK_Scalar: {1307      llvm::Value *value;1308      if (propType->isReferenceType()) {1309        if (ivarType.getPointerAuth()) {1310          CGM.ErrorUnsupported(propImpl,1311                               "Obj-C getter for authenticated reference type");1312          return;1313        }1314        value = LV.getAddress().emitRawPointer(*this);1315      } else {1316        // We want to load and autoreleaseReturnValue ARC __weak ivars.1317        if (LV.getQuals().getObjCLifetime() == Qualifiers::OCL_Weak) {1318          if (getLangOpts().ObjCAutoRefCount) {1319            value = emitARCRetainLoadOfScalar(*this, LV, ivarType);1320          } else {1321            value = EmitARCLoadWeak(LV.getAddress());1322          }1323 1324        // Otherwise we want to do a simple load, suppressing the1325        // final autorelease.1326        } else {1327          if (PointerAuthQualifier PAQ = ivar->getType().getPointerAuth()) {1328            Address ivarAddr = LV.getAddress();1329            llvm::LoadInst *LoadInst = Builder.CreateLoad(ivarAddr, "load");1330            llvm::Value *Load = LoadInst;1331            auto SrcInfo = EmitPointerAuthInfo(PAQ, ivarAddr);1332            auto TargetInfo =1333                CGM.getPointerAuthInfoForType(getterMethod->getReturnType());1334            Load = emitPointerAuthResign(Load, ivarType, SrcInfo, TargetInfo,1335                                         /*isKnownNonNull=*/false);1336            value = Load;1337          } else1338            value = EmitLoadOfLValue(LV, SourceLocation()).getScalarVal();1339 1340          AutoreleaseResult = false;1341        }1342 1343        value = Builder.CreateBitCast(1344            value, ConvertType(GetterMethodDecl->getReturnType()));1345      }1346 1347      EmitReturnOfRValue(RValue::get(value), propType);1348      return;1349    }1350    }1351    llvm_unreachable("bad evaluation kind");1352  }1353 1354  }1355  llvm_unreachable("bad @property implementation strategy!");1356}1357 1358/// emitStructSetterCall - Call the runtime function to store the value1359/// from the first formal parameter into the given ivar.1360static void emitStructSetterCall(CodeGenFunction &CGF, ObjCMethodDecl *OMD,1361                                 ObjCIvarDecl *ivar) {1362  // objc_copyStruct (&structIvar, &Arg,1363  //                  sizeof (struct something), true, false);1364  CallArgList args;1365 1366  // The first argument is the address of the ivar.1367  llvm::Value *ivarAddr =1368      CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(), CGF.LoadObjCSelf(), ivar, 0)1369          .getPointer(CGF);1370  ivarAddr = CGF.Builder.CreateBitCast(ivarAddr, CGF.Int8PtrTy);1371  args.add(RValue::get(ivarAddr), CGF.getContext().VoidPtrTy);1372 1373  // The second argument is the address of the parameter variable.1374  ParmVarDecl *argVar = *OMD->param_begin();1375  DeclRefExpr argRef(CGF.getContext(), argVar, false,1376                     argVar->getType().getNonReferenceType(), VK_LValue,1377                     SourceLocation());1378  llvm::Value *argAddr = CGF.EmitLValue(&argRef).getPointer(CGF);1379  args.add(RValue::get(argAddr), CGF.getContext().VoidPtrTy);1380 1381  // The third argument is the sizeof the type.1382  llvm::Value *size =1383    CGF.CGM.getSize(CGF.getContext().getTypeSizeInChars(ivar->getType()));1384  args.add(RValue::get(size), CGF.getContext().getSizeType());1385 1386  // The fourth argument is the 'isAtomic' flag.1387  args.add(RValue::get(CGF.Builder.getTrue()), CGF.getContext().BoolTy);1388 1389  // The fifth argument is the 'hasStrong' flag.1390  // FIXME: should this really always be false?1391  args.add(RValue::get(CGF.Builder.getFalse()), CGF.getContext().BoolTy);1392 1393  llvm::FunctionCallee fn = CGF.CGM.getObjCRuntime().GetSetStructFunction();1394  CGCallee callee = CGCallee::forDirect(fn);1395  CGF.EmitCall(1396      CGF.getTypes().arrangeBuiltinFunctionCall(CGF.getContext().VoidTy, args),1397               callee, ReturnValueSlot(), args);1398}1399 1400/// emitCPPObjectAtomicSetterCall - Call the runtime function to store1401/// the value from the first formal parameter into the given ivar, using1402/// the Cpp API for atomic Cpp objects with non-trivial copy assignment.1403static void emitCPPObjectAtomicSetterCall(CodeGenFunction &CGF,1404                                          ObjCMethodDecl *OMD,1405                                          ObjCIvarDecl *ivar,1406                                          llvm::Constant *AtomicHelperFn) {1407  // objc_copyCppObjectAtomic (&CppObjectIvar, &Arg,1408  //                           AtomicHelperFn);1409  CallArgList args;1410 1411  // The first argument is the address of the ivar.1412  llvm::Value *ivarAddr =1413      CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(), CGF.LoadObjCSelf(), ivar, 0)1414          .getPointer(CGF);1415  args.add(RValue::get(ivarAddr), CGF.getContext().VoidPtrTy);1416 1417  // The second argument is the address of the parameter variable.1418  ParmVarDecl *argVar = *OMD->param_begin();1419  DeclRefExpr argRef(CGF.getContext(), argVar, false,1420                     argVar->getType().getNonReferenceType(), VK_LValue,1421                     SourceLocation());1422  llvm::Value *argAddr = CGF.EmitLValue(&argRef).getPointer(CGF);1423  args.add(RValue::get(argAddr), CGF.getContext().VoidPtrTy);1424 1425  // Third argument is the helper function.1426  args.add(RValue::get(AtomicHelperFn), CGF.getContext().VoidPtrTy);1427 1428  llvm::FunctionCallee fn =1429      CGF.CGM.getObjCRuntime().GetCppAtomicObjectSetFunction();1430  CGCallee callee = CGCallee::forDirect(fn);1431  CGF.EmitCall(1432      CGF.getTypes().arrangeBuiltinFunctionCall(CGF.getContext().VoidTy, args),1433               callee, ReturnValueSlot(), args);1434}1435 1436 1437static bool hasTrivialSetExpr(const ObjCPropertyImplDecl *PID) {1438  Expr *setter = PID->getSetterCXXAssignment();1439  if (!setter) return true;1440 1441  // Sema only makes only of these when the ivar has a C++ class type,1442  // so the form is pretty constrained.1443 1444  // An operator call is trivial if the function it calls is trivial.1445  // This also implies that there's nothing non-trivial going on with1446  // the arguments, because operator= can only be trivial if it's a1447  // synthesized assignment operator and therefore both parameters are1448  // references.1449  if (CallExpr *call = dyn_cast<CallExpr>(setter)) {1450    if (const FunctionDecl *callee1451          = dyn_cast_or_null<FunctionDecl>(call->getCalleeDecl()))1452      if (callee->isTrivial())1453        return true;1454    return false;1455  }1456 1457  assert(isa<ExprWithCleanups>(setter));1458  return false;1459}1460 1461static bool UseOptimizedSetter(CodeGenModule &CGM) {1462  if (CGM.getLangOpts().getGC() != LangOptions::NonGC)1463    return false;1464  return CGM.getLangOpts().ObjCRuntime.hasOptimizedSetter();1465}1466 1467void1468CodeGenFunction::generateObjCSetterBody(const ObjCImplementationDecl *classImpl,1469                                        const ObjCPropertyImplDecl *propImpl,1470                                        llvm::Constant *AtomicHelperFn) {1471  ObjCIvarDecl *ivar = propImpl->getPropertyIvarDecl();1472  ObjCMethodDecl *setterMethod = propImpl->getSetterMethodDecl();1473 1474  if (ivar->getType().isNonTrivialToPrimitiveCopy() == QualType::PCK_Struct) {1475    ParmVarDecl *PVD = *setterMethod->param_begin();1476    if (!AtomicHelperFn) {1477      // Call the move assignment operator instead of calling the copy1478      // assignment operator and destructor.1479      LValue Dst = EmitLValueForIvar(TypeOfSelfObject(), LoadObjCSelf(), ivar,1480                                     /*quals*/ 0);1481      LValue Src = MakeAddrLValue(GetAddrOfLocalVar(PVD), ivar->getType());1482      callCStructMoveAssignmentOperator(Dst, Src);1483    } else {1484      // If atomic, assignment is called via a locking api.1485      emitCPPObjectAtomicSetterCall(*this, setterMethod, ivar, AtomicHelperFn);1486    }1487    // Decativate the destructor for the setter parameter.1488    DeactivateCleanupBlock(CalleeDestructedParamCleanups[PVD], AllocaInsertPt);1489    return;1490  }1491 1492  // Just use the setter expression if Sema gave us one and it's1493  // non-trivial.1494  if (!hasTrivialSetExpr(propImpl)) {1495    if (!AtomicHelperFn)1496      // If non-atomic, assignment is called directly.1497      EmitStmt(propImpl->getSetterCXXAssignment());1498    else1499      // If atomic, assignment is called via a locking api.1500      emitCPPObjectAtomicSetterCall(*this, setterMethod, ivar,1501                                    AtomicHelperFn);1502    return;1503  }1504 1505  PropertyImplStrategy strategy(CGM, propImpl);1506  switch (strategy.getKind()) {1507  case PropertyImplStrategy::Native: {1508    // We don't need to do anything for a zero-size struct.1509    if (strategy.getIvarSize().isZero())1510      return;1511 1512    Address argAddr = GetAddrOfLocalVar(*setterMethod->param_begin());1513 1514    LValue ivarLValue =1515      EmitLValueForIvar(TypeOfSelfObject(), LoadObjCSelf(), ivar, /*quals*/ 0);1516    Address ivarAddr = ivarLValue.getAddress();1517 1518    // Currently, all atomic accesses have to be through integer1519    // types, so there's no point in trying to pick a prettier type.1520    llvm::Type *castType = llvm::Type::getIntNTy(1521        getLLVMContext(), getContext().toBits(strategy.getIvarSize()));1522 1523    // Cast both arguments to the chosen operation type.1524    argAddr = argAddr.withElementType(castType);1525    ivarAddr = ivarAddr.withElementType(castType);1526 1527    llvm::Value *load = Builder.CreateLoad(argAddr);1528 1529    if (PointerAuthQualifier PAQ = ivar->getType().getPointerAuth()) {1530      QualType PropertyType = propImpl->getPropertyDecl()->getType();1531      CGPointerAuthInfo SrcInfo = CGM.getPointerAuthInfoForType(PropertyType);1532      CGPointerAuthInfo TargetInfo = EmitPointerAuthInfo(PAQ, ivarAddr);1533      load = emitPointerAuthResign(load, ivar->getType(), SrcInfo, TargetInfo,1534                                   /*isKnownNonNull=*/false);1535    }1536 1537    // Perform an atomic store.  There are no memory ordering requirements.1538    llvm::StoreInst *store = Builder.CreateStore(load, ivarAddr);1539    store->setAtomic(llvm::AtomicOrdering::Unordered);1540    return;1541  }1542 1543  case PropertyImplStrategy::GetSetProperty:1544  case PropertyImplStrategy::SetPropertyAndExpressionGet: {1545 1546    llvm::FunctionCallee setOptimizedPropertyFn = nullptr;1547    llvm::FunctionCallee setPropertyFn = nullptr;1548    if (UseOptimizedSetter(CGM)) {1549      // 10.8 and iOS 6.0 code and GC is off1550      setOptimizedPropertyFn =1551          CGM.getObjCRuntime().GetOptimizedPropertySetFunction(1552              strategy.isAtomic(), strategy.isCopy());1553      if (!setOptimizedPropertyFn) {1554        CGM.ErrorUnsupported(propImpl, "Obj-C optimized setter - NYI");1555        return;1556      }1557    }1558    else {1559      setPropertyFn = CGM.getObjCRuntime().GetPropertySetFunction();1560      if (!setPropertyFn) {1561        CGM.ErrorUnsupported(propImpl, "Obj-C setter requiring atomic copy");1562        return;1563      }1564    }1565 1566    // Emit objc_setProperty((id) self, _cmd, offset, arg,1567    //                       <is-atomic>, <is-copy>).1568    llvm::Value *cmd = emitCmdValueForGetterSetterBody(*this, setterMethod);1569    llvm::Value *self =1570      Builder.CreateBitCast(LoadObjCSelf(), VoidPtrTy);1571    llvm::Value *ivarOffset =1572        EmitIvarOffsetAsPointerDiff(classImpl->getClassInterface(), ivar);1573    Address argAddr = GetAddrOfLocalVar(*setterMethod->param_begin());1574    llvm::Value *arg = Builder.CreateLoad(argAddr, "arg");1575    arg = Builder.CreateBitCast(arg, VoidPtrTy);1576 1577    CallArgList args;1578    args.add(RValue::get(self), getContext().getObjCIdType());1579    args.add(RValue::get(cmd), getContext().getObjCSelType());1580    if (setOptimizedPropertyFn) {1581      args.add(RValue::get(arg), getContext().getObjCIdType());1582      args.add(RValue::get(ivarOffset), getContext().getPointerDiffType());1583      CGCallee callee = CGCallee::forDirect(setOptimizedPropertyFn);1584      EmitCall(getTypes().arrangeBuiltinFunctionCall(getContext().VoidTy, args),1585               callee, ReturnValueSlot(), args);1586    } else {1587      args.add(RValue::get(ivarOffset), getContext().getPointerDiffType());1588      args.add(RValue::get(arg), getContext().getObjCIdType());1589      args.add(RValue::get(Builder.getInt1(strategy.isAtomic())),1590               getContext().BoolTy);1591      args.add(RValue::get(Builder.getInt1(strategy.isCopy())),1592               getContext().BoolTy);1593      // FIXME: We shouldn't need to get the function info here, the runtime1594      // already should have computed it to build the function.1595      CGCallee callee = CGCallee::forDirect(setPropertyFn);1596      EmitCall(getTypes().arrangeBuiltinFunctionCall(getContext().VoidTy, args),1597               callee, ReturnValueSlot(), args);1598    }1599 1600    return;1601  }1602 1603  case PropertyImplStrategy::CopyStruct:1604    emitStructSetterCall(*this, setterMethod, ivar);1605    return;1606 1607  case PropertyImplStrategy::Expression:1608    break;1609  }1610 1611  // Otherwise, fake up some ASTs and emit a normal assignment.1612  ValueDecl *selfDecl = setterMethod->getSelfDecl();1613  DeclRefExpr self(getContext(), selfDecl, false, selfDecl->getType(),1614                   VK_LValue, SourceLocation());1615  ImplicitCastExpr selfLoad(ImplicitCastExpr::OnStack, selfDecl->getType(),1616                            CK_LValueToRValue, &self, VK_PRValue,1617                            FPOptionsOverride());1618  ObjCIvarRefExpr ivarRef(ivar, ivar->getType().getNonReferenceType(),1619                          SourceLocation(), SourceLocation(),1620                          &selfLoad, true, true);1621 1622  ParmVarDecl *argDecl = *setterMethod->param_begin();1623  QualType argType = argDecl->getType().getNonReferenceType();1624  DeclRefExpr arg(getContext(), argDecl, false, argType, VK_LValue,1625                  SourceLocation());1626  ImplicitCastExpr argLoad(ImplicitCastExpr::OnStack,1627                           argType.getUnqualifiedType(), CK_LValueToRValue,1628                           &arg, VK_PRValue, FPOptionsOverride());1629 1630  // The property type can differ from the ivar type in some situations with1631  // Objective-C pointer types, we can always bit cast the RHS in these cases.1632  // The following absurdity is just to ensure well-formed IR.1633  CastKind argCK = CK_NoOp;1634  if (ivarRef.getType()->isObjCObjectPointerType()) {1635    if (argLoad.getType()->isObjCObjectPointerType())1636      argCK = CK_BitCast;1637    else if (argLoad.getType()->isBlockPointerType())1638      argCK = CK_BlockPointerToObjCPointerCast;1639    else1640      argCK = CK_CPointerToObjCPointerCast;1641  } else if (ivarRef.getType()->isBlockPointerType()) {1642     if (argLoad.getType()->isBlockPointerType())1643      argCK = CK_BitCast;1644    else1645      argCK = CK_AnyPointerToBlockPointerCast;1646  } else if (ivarRef.getType()->isPointerType()) {1647    argCK = CK_BitCast;1648  } else if (argLoad.getType()->isAtomicType() &&1649             !ivarRef.getType()->isAtomicType()) {1650    argCK = CK_AtomicToNonAtomic;1651  } else if (!argLoad.getType()->isAtomicType() &&1652             ivarRef.getType()->isAtomicType()) {1653    argCK = CK_NonAtomicToAtomic;1654  }1655  ImplicitCastExpr argCast(ImplicitCastExpr::OnStack, ivarRef.getType(), argCK,1656                           &argLoad, VK_PRValue, FPOptionsOverride());1657  Expr *finalArg = &argLoad;1658  if (!getContext().hasSameUnqualifiedType(ivarRef.getType(),1659                                           argLoad.getType()))1660    finalArg = &argCast;1661 1662  BinaryOperator *assign = BinaryOperator::Create(1663      getContext(), &ivarRef, finalArg, BO_Assign, ivarRef.getType(),1664      VK_PRValue, OK_Ordinary, SourceLocation(), FPOptionsOverride());1665  EmitStmt(assign);1666}1667 1668/// Generate an Objective-C property setter function.1669///1670/// The given Decl must be an ObjCImplementationDecl. \@synthesize1671/// is illegal within a category.1672void CodeGenFunction::GenerateObjCSetter(ObjCImplementationDecl *IMP,1673                                         const ObjCPropertyImplDecl *PID) {1674  llvm::Constant *AtomicHelperFn =1675      CodeGenFunction(CGM).GenerateObjCAtomicSetterCopyHelperFunction(PID);1676  ObjCMethodDecl *OMD = PID->getSetterMethodDecl();1677  assert(OMD && "Invalid call to generate setter (empty method)");1678  StartObjCMethod(OMD, IMP->getClassInterface());1679 1680  generateObjCSetterBody(IMP, PID, AtomicHelperFn);1681 1682  FinishFunction(OMD->getEndLoc());1683}1684 1685namespace {1686  struct DestroyIvar final : EHScopeStack::Cleanup {1687  private:1688    llvm::Value *addr;1689    const ObjCIvarDecl *ivar;1690    CodeGenFunction::Destroyer *destroyer;1691    bool useEHCleanupForArray;1692  public:1693    DestroyIvar(llvm::Value *addr, const ObjCIvarDecl *ivar,1694                CodeGenFunction::Destroyer *destroyer,1695                bool useEHCleanupForArray)1696      : addr(addr), ivar(ivar), destroyer(destroyer),1697        useEHCleanupForArray(useEHCleanupForArray) {}1698 1699    void Emit(CodeGenFunction &CGF, Flags flags) override {1700      LValue lvalue1701        = CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(), addr, ivar, /*CVR*/ 0);1702      CGF.emitDestroy(lvalue.getAddress(), ivar->getType(), destroyer,1703                      flags.isForNormalCleanup() && useEHCleanupForArray);1704    }1705  };1706}1707 1708/// Like CodeGenFunction::destroyARCStrong, but do it with a call.1709static void destroyARCStrongWithStore(CodeGenFunction &CGF,1710                                      Address addr,1711                                      QualType type) {1712  llvm::Value *null = getNullForVariable(addr);1713  CGF.EmitARCStoreStrongCall(addr, null, /*ignored*/ true);1714}1715 1716static void emitCXXDestructMethod(CodeGenFunction &CGF,1717                                  ObjCImplementationDecl *impl) {1718  CodeGenFunction::RunCleanupsScope scope(CGF);1719 1720  llvm::Value *self = CGF.LoadObjCSelf();1721 1722  const ObjCInterfaceDecl *iface = impl->getClassInterface();1723  for (const ObjCIvarDecl *ivar = iface->all_declared_ivar_begin();1724       ivar; ivar = ivar->getNextIvar()) {1725    QualType type = ivar->getType();1726 1727    // Check whether the ivar is a destructible type.1728    QualType::DestructionKind dtorKind = type.isDestructedType();1729    if (!dtorKind) continue;1730 1731    CodeGenFunction::Destroyer *destroyer = nullptr;1732 1733    // Use a call to objc_storeStrong to destroy strong ivars, for the1734    // general benefit of the tools.1735    if (dtorKind == QualType::DK_objc_strong_lifetime) {1736      destroyer = destroyARCStrongWithStore;1737 1738    // Otherwise use the default for the destruction kind.1739    } else {1740      destroyer = CGF.getDestroyer(dtorKind);1741    }1742 1743    CleanupKind cleanupKind = CGF.getCleanupKind(dtorKind);1744 1745    CGF.EHStack.pushCleanup<DestroyIvar>(cleanupKind, self, ivar, destroyer,1746                                         cleanupKind & EHCleanup);1747  }1748 1749  assert(scope.requiresCleanups() && "nothing to do in .cxx_destruct?");1750}1751 1752void CodeGenFunction::GenerateObjCCtorDtorMethod(ObjCImplementationDecl *IMP,1753                                                 ObjCMethodDecl *MD,1754                                                 bool ctor) {1755  MD->createImplicitParams(CGM.getContext(), IMP->getClassInterface());1756  StartObjCMethod(MD, IMP->getClassInterface());1757 1758  // Emit .cxx_construct.1759  if (ctor) {1760    // Suppress the final autorelease in ARC.1761    AutoreleaseResult = false;1762 1763    for (const auto *IvarInit : IMP->inits()) {1764      FieldDecl *Field = IvarInit->getAnyMember();1765      ObjCIvarDecl *Ivar = cast<ObjCIvarDecl>(Field);1766      LValue LV = EmitLValueForIvar(TypeOfSelfObject(),1767                                    LoadObjCSelf(), Ivar, 0);1768      EmitAggExpr(IvarInit->getInit(),1769                  AggValueSlot::forLValue(LV, AggValueSlot::IsDestructed,1770                                          AggValueSlot::DoesNotNeedGCBarriers,1771                                          AggValueSlot::IsNotAliased,1772                                          AggValueSlot::DoesNotOverlap));1773    }1774    // constructor returns 'self'.1775    CodeGenTypes &Types = CGM.getTypes();1776    QualType IdTy(CGM.getContext().getObjCIdType());1777    llvm::Value *SelfAsId =1778      Builder.CreateBitCast(LoadObjCSelf(), Types.ConvertType(IdTy));1779    EmitReturnOfRValue(RValue::get(SelfAsId), IdTy);1780 1781  // Emit .cxx_destruct.1782  } else {1783    emitCXXDestructMethod(*this, IMP);1784  }1785  FinishFunction();1786}1787 1788llvm::Value *CodeGenFunction::LoadObjCSelf() {1789  VarDecl *Self = cast<ObjCMethodDecl>(CurFuncDecl)->getSelfDecl();1790  DeclRefExpr DRE(getContext(), Self,1791                  /*is enclosing local*/ (CurFuncDecl != CurCodeDecl),1792                  Self->getType(), VK_LValue, SourceLocation());1793  return EmitLoadOfScalar(EmitDeclRefLValue(&DRE), SourceLocation());1794}1795 1796QualType CodeGenFunction::TypeOfSelfObject() {1797  const ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(CurFuncDecl);1798  ImplicitParamDecl *selfDecl = OMD->getSelfDecl();1799  const ObjCObjectPointerType *PTy = cast<ObjCObjectPointerType>(1800    getContext().getCanonicalType(selfDecl->getType()));1801  return PTy->getPointeeType();1802}1803 1804void CodeGenFunction::EmitObjCForCollectionStmt(const ObjCForCollectionStmt &S){1805  llvm::FunctionCallee EnumerationMutationFnPtr =1806      CGM.getObjCRuntime().EnumerationMutationFunction();1807  if (!EnumerationMutationFnPtr) {1808    CGM.ErrorUnsupported(&S, "Obj-C fast enumeration for this runtime");1809    return;1810  }1811  CGCallee EnumerationMutationFn =1812    CGCallee::forDirect(EnumerationMutationFnPtr);1813 1814  CGDebugInfo *DI = getDebugInfo();1815  if (DI)1816    DI->EmitLexicalBlockStart(Builder, S.getSourceRange().getBegin());1817 1818  RunCleanupsScope ForScope(*this);1819 1820  // The local variable comes into scope immediately.1821  AutoVarEmission variable = AutoVarEmission::invalid();1822  if (const DeclStmt *SD = dyn_cast<DeclStmt>(S.getElement()))1823    variable = EmitAutoVarAlloca(*cast<VarDecl>(SD->getSingleDecl()));1824 1825  JumpDest LoopEnd = getJumpDestInCurrentScope("forcoll.end");1826 1827  // Fast enumeration state.1828  QualType StateTy = CGM.getObjCFastEnumerationStateType();1829  Address StatePtr = CreateMemTemp(StateTy, "state.ptr");1830  EmitNullInitialization(StatePtr, StateTy);1831 1832  // Number of elements in the items array.1833  static const unsigned NumItems = 16;1834 1835  // Fetch the countByEnumeratingWithState:objects:count: selector.1836  const IdentifierInfo *II[] = {1837      &CGM.getContext().Idents.get("countByEnumeratingWithState"),1838      &CGM.getContext().Idents.get("objects"),1839      &CGM.getContext().Idents.get("count")};1840  Selector FastEnumSel =1841      CGM.getContext().Selectors.getSelector(std::size(II), &II[0]);1842 1843  QualType ItemsTy = getContext().getConstantArrayType(1844      getContext().getObjCIdType(), llvm::APInt(32, NumItems), nullptr,1845      ArraySizeModifier::Normal, 0);1846  Address ItemsPtr = CreateMemTemp(ItemsTy, "items.ptr");1847 1848  // Emit the collection pointer.  In ARC, we do a retain.1849  llvm::Value *Collection;1850  if (getLangOpts().ObjCAutoRefCount) {1851    Collection = EmitARCRetainScalarExpr(S.getCollection());1852 1853    // Enter a cleanup to do the release.1854    EmitObjCConsumeObject(S.getCollection()->getType(), Collection);1855  } else {1856    Collection = EmitScalarExpr(S.getCollection());1857  }1858 1859  // The 'continue' label needs to appear within the cleanup for the1860  // collection object.1861  JumpDest AfterBody = getJumpDestInCurrentScope("forcoll.next");1862 1863  // Send it our message:1864  CallArgList Args;1865 1866  // The first argument is a temporary of the enumeration-state type.1867  Args.add(RValue::get(StatePtr, *this), getContext().getPointerType(StateTy));1868 1869  // The second argument is a temporary array with space for NumItems1870  // pointers.  We'll actually be loading elements from the array1871  // pointer written into the control state; this buffer is so that1872  // collections that *aren't* backed by arrays can still queue up1873  // batches of elements.1874  Args.add(RValue::get(ItemsPtr, *this), getContext().getPointerType(ItemsTy));1875 1876  // The third argument is the capacity of that temporary array.1877  llvm::Type *NSUIntegerTy = ConvertType(getContext().getNSUIntegerType());1878  llvm::Constant *Count = llvm::ConstantInt::get(NSUIntegerTy, NumItems);1879  Args.add(RValue::get(Count), getContext().getNSUIntegerType());1880 1881  // Start the enumeration.1882  RValue CountRV =1883      CGM.getObjCRuntime().GenerateMessageSend(*this, ReturnValueSlot(),1884                                               getContext().getNSUIntegerType(),1885                                               FastEnumSel, Collection, Args);1886 1887  // The initial number of objects that were returned in the buffer.1888  llvm::Value *initialBufferLimit = CountRV.getScalarVal();1889 1890  llvm::BasicBlock *EmptyBB = createBasicBlock("forcoll.empty");1891  llvm::BasicBlock *LoopInitBB = createBasicBlock("forcoll.loopinit");1892 1893  llvm::Value *zero = llvm::Constant::getNullValue(NSUIntegerTy);1894 1895  // If the limit pointer was zero to begin with, the collection is1896  // empty; skip all this. Set the branch weight assuming this has the same1897  // probability of exiting the loop as any other loop exit.1898  uint64_t EntryCount = getCurrentProfileCount();1899  Builder.CreateCondBr(1900      Builder.CreateICmpEQ(initialBufferLimit, zero, "iszero"), EmptyBB,1901      LoopInitBB,1902      createProfileWeights(EntryCount, getProfileCount(S.getBody())));1903 1904  // Otherwise, initialize the loop.1905  EmitBlock(LoopInitBB);1906 1907  // Save the initial mutations value.  This is the value at an1908  // address that was written into the state object by1909  // countByEnumeratingWithState:objects:count:.1910  Address StateMutationsPtrPtr =1911      Builder.CreateStructGEP(StatePtr, 2, "mutationsptr.ptr");1912  llvm::Value *StateMutationsPtr1913    = Builder.CreateLoad(StateMutationsPtrPtr, "mutationsptr");1914 1915  llvm::Type *UnsignedLongTy = ConvertType(getContext().UnsignedLongTy);1916  llvm::Value *initialMutations =1917    Builder.CreateAlignedLoad(UnsignedLongTy, StateMutationsPtr,1918                              getPointerAlign(), "forcoll.initial-mutations");1919 1920  // Start looping.  This is the point we return to whenever we have a1921  // fresh, non-empty batch of objects.1922  llvm::BasicBlock *LoopBodyBB = createBasicBlock("forcoll.loopbody");1923  EmitBlock(LoopBodyBB);1924 1925  // The current index into the buffer.1926  llvm::PHINode *index = Builder.CreatePHI(NSUIntegerTy, 3, "forcoll.index");1927  index->addIncoming(zero, LoopInitBB);1928 1929  // The current buffer size.1930  llvm::PHINode *count = Builder.CreatePHI(NSUIntegerTy, 3, "forcoll.count");1931  count->addIncoming(initialBufferLimit, LoopInitBB);1932 1933  incrementProfileCounter(&S);1934 1935  // Check whether the mutations value has changed from where it was1936  // at start.  StateMutationsPtr should actually be invariant between1937  // refreshes.1938  StateMutationsPtr = Builder.CreateLoad(StateMutationsPtrPtr, "mutationsptr");1939  llvm::Value *currentMutations1940    = Builder.CreateAlignedLoad(UnsignedLongTy, StateMutationsPtr,1941                                getPointerAlign(), "statemutations");1942 1943  llvm::BasicBlock *WasMutatedBB = createBasicBlock("forcoll.mutated");1944  llvm::BasicBlock *WasNotMutatedBB = createBasicBlock("forcoll.notmutated");1945 1946  Builder.CreateCondBr(Builder.CreateICmpEQ(currentMutations, initialMutations),1947                       WasNotMutatedBB, WasMutatedBB);1948 1949  // If so, call the enumeration-mutation function.1950  EmitBlock(WasMutatedBB);1951  llvm::Type *ObjCIdType = ConvertType(getContext().getObjCIdType());1952  llvm::Value *V =1953    Builder.CreateBitCast(Collection, ObjCIdType);1954  CallArgList Args2;1955  Args2.add(RValue::get(V), getContext().getObjCIdType());1956  // FIXME: We shouldn't need to get the function info here, the runtime already1957  // should have computed it to build the function.1958  EmitCall(1959          CGM.getTypes().arrangeBuiltinFunctionCall(getContext().VoidTy, Args2),1960           EnumerationMutationFn, ReturnValueSlot(), Args2);1961 1962  // Otherwise, or if the mutation function returns, just continue.1963  EmitBlock(WasNotMutatedBB);1964 1965  // Initialize the element variable.1966  RunCleanupsScope elementVariableScope(*this);1967  bool elementIsVariable;1968  LValue elementLValue;1969  QualType elementType;1970  if (const DeclStmt *SD = dyn_cast<DeclStmt>(S.getElement())) {1971    // Initialize the variable, in case it's a __block variable or something.1972    EmitAutoVarInit(variable);1973 1974    const VarDecl *D = cast<VarDecl>(SD->getSingleDecl());1975    DeclRefExpr tempDRE(getContext(), const_cast<VarDecl *>(D), false,1976                        D->getType(), VK_LValue, SourceLocation());1977    elementLValue = EmitLValue(&tempDRE);1978    elementType = D->getType();1979    elementIsVariable = true;1980 1981    if (D->isARCPseudoStrong())1982      elementLValue.getQuals().setObjCLifetime(Qualifiers::OCL_ExplicitNone);1983  } else {1984    elementLValue = LValue(); // suppress warning1985    elementType = cast<Expr>(S.getElement())->getType();1986    elementIsVariable = false;1987  }1988  llvm::Type *convertedElementType = ConvertType(elementType);1989 1990  // Fetch the buffer out of the enumeration state.1991  // TODO: this pointer should actually be invariant between1992  // refreshes, which would help us do certain loop optimizations.1993  Address StateItemsPtr =1994      Builder.CreateStructGEP(StatePtr, 1, "stateitems.ptr");1995  llvm::Value *EnumStateItems =1996    Builder.CreateLoad(StateItemsPtr, "stateitems");1997 1998  // Fetch the value at the current index from the buffer.1999  llvm::Value *CurrentItemPtr = Builder.CreateInBoundsGEP(2000      ObjCIdType, EnumStateItems, index, "currentitem.ptr");2001  llvm::Value *CurrentItem =2002    Builder.CreateAlignedLoad(ObjCIdType, CurrentItemPtr, getPointerAlign());2003 2004  if (SanOpts.has(SanitizerKind::ObjCCast)) {2005    // Before using an item from the collection, check that the implicit cast2006    // from id to the element type is valid. This is done with instrumentation2007    // roughly corresponding to:2008    //2009    //   if (![item isKindOfClass:expectedCls]) { /* emit diagnostic */ }2010    const ObjCObjectPointerType *ObjPtrTy =2011        elementType->getAsObjCInterfacePointerType();2012    const ObjCInterfaceType *InterfaceTy =2013        ObjPtrTy ? ObjPtrTy->getInterfaceType() : nullptr;2014    if (InterfaceTy) {2015      auto CheckOrdinal = SanitizerKind::SO_ObjCCast;2016      auto CheckHandler = SanitizerHandler::InvalidObjCCast;2017      SanitizerDebugLocation SanScope(this, {CheckOrdinal}, CheckHandler);2018      auto &C = CGM.getContext();2019      assert(InterfaceTy->getDecl() && "No decl for ObjC interface type");2020      Selector IsKindOfClassSel = GetUnarySelector("isKindOfClass", C);2021      CallArgList IsKindOfClassArgs;2022      llvm::Value *Cls =2023          CGM.getObjCRuntime().GetClass(*this, InterfaceTy->getDecl());2024      IsKindOfClassArgs.add(RValue::get(Cls), C.getObjCClassType());2025      llvm::Value *IsClass =2026          CGM.getObjCRuntime()2027              .GenerateMessageSend(*this, ReturnValueSlot(), C.BoolTy,2028                                   IsKindOfClassSel, CurrentItem,2029                                   IsKindOfClassArgs)2030              .getScalarVal();2031      llvm::Constant *StaticData[] = {2032          EmitCheckSourceLocation(S.getBeginLoc()),2033          EmitCheckTypeDescriptor(QualType(InterfaceTy, 0))};2034      EmitCheck({{IsClass, CheckOrdinal}}, CheckHandler,2035                ArrayRef<llvm::Constant *>(StaticData), CurrentItem);2036    }2037  }2038 2039  // Cast that value to the right type.2040  CurrentItem = Builder.CreateBitCast(CurrentItem, convertedElementType,2041                                      "currentitem");2042 2043  // Make sure we have an l-value.  Yes, this gets evaluated every2044  // time through the loop.2045  if (!elementIsVariable) {2046    elementLValue = EmitLValue(cast<Expr>(S.getElement()));2047    EmitStoreThroughLValue(RValue::get(CurrentItem), elementLValue);2048  } else {2049    EmitStoreThroughLValue(RValue::get(CurrentItem), elementLValue,2050                           /*isInit*/ true);2051  }2052 2053  // If we do have an element variable, this assignment is the end of2054  // its initialization.2055  if (elementIsVariable)2056    EmitAutoVarCleanups(variable);2057 2058  // Perform the loop body, setting up break and continue labels.2059  BreakContinueStack.push_back(BreakContinue(S, LoopEnd, AfterBody));2060  {2061    RunCleanupsScope Scope(*this);2062    EmitStmt(S.getBody());2063  }2064  BreakContinueStack.pop_back();2065 2066  // Destroy the element variable now.2067  elementVariableScope.ForceCleanup();2068 2069  // Check whether there are more elements.2070  EmitBlock(AfterBody.getBlock());2071 2072  llvm::BasicBlock *FetchMoreBB = createBasicBlock("forcoll.refetch");2073 2074  // First we check in the local buffer.2075  llvm::Value *indexPlusOne =2076      Builder.CreateNUWAdd(index, llvm::ConstantInt::get(NSUIntegerTy, 1));2077 2078  // If we haven't overrun the buffer yet, we can continue.2079  // Set the branch weights based on the simplifying assumption that this is2080  // like a while-loop, i.e., ignoring that the false branch fetches more2081  // elements and then returns to the loop.2082  Builder.CreateCondBr(2083      Builder.CreateICmpULT(indexPlusOne, count), LoopBodyBB, FetchMoreBB,2084      createProfileWeights(getProfileCount(S.getBody()), EntryCount));2085 2086  index->addIncoming(indexPlusOne, AfterBody.getBlock());2087  count->addIncoming(count, AfterBody.getBlock());2088 2089  // Otherwise, we have to fetch more elements.2090  EmitBlock(FetchMoreBB);2091 2092  CountRV =2093      CGM.getObjCRuntime().GenerateMessageSend(*this, ReturnValueSlot(),2094                                               getContext().getNSUIntegerType(),2095                                               FastEnumSel, Collection, Args);2096 2097  // If we got a zero count, we're done.2098  llvm::Value *refetchCount = CountRV.getScalarVal();2099 2100  // (note that the message send might split FetchMoreBB)2101  index->addIncoming(zero, Builder.GetInsertBlock());2102  count->addIncoming(refetchCount, Builder.GetInsertBlock());2103 2104  Builder.CreateCondBr(Builder.CreateICmpEQ(refetchCount, zero),2105                       EmptyBB, LoopBodyBB);2106 2107  // No more elements.2108  EmitBlock(EmptyBB);2109 2110  if (!elementIsVariable) {2111    // If the element was not a declaration, set it to be null.2112 2113    llvm::Value *null = llvm::Constant::getNullValue(convertedElementType);2114    elementLValue = EmitLValue(cast<Expr>(S.getElement()));2115    EmitStoreThroughLValue(RValue::get(null), elementLValue);2116  }2117 2118  if (DI)2119    DI->EmitLexicalBlockEnd(Builder, S.getSourceRange().getEnd());2120 2121  ForScope.ForceCleanup();2122  EmitBlock(LoopEnd.getBlock());2123}2124 2125void CodeGenFunction::EmitObjCAtTryStmt(const ObjCAtTryStmt &S) {2126  CGM.getObjCRuntime().EmitTryStmt(*this, S);2127}2128 2129void CodeGenFunction::EmitObjCAtThrowStmt(const ObjCAtThrowStmt &S) {2130  CGM.getObjCRuntime().EmitThrowStmt(*this, S);2131}2132 2133void CodeGenFunction::EmitObjCAtSynchronizedStmt(2134                                              const ObjCAtSynchronizedStmt &S) {2135  CGM.getObjCRuntime().EmitSynchronizedStmt(*this, S);2136}2137 2138namespace {2139  struct CallObjCRelease final : EHScopeStack::Cleanup {2140    CallObjCRelease(llvm::Value *object) : object(object) {}2141    llvm::Value *object;2142 2143    void Emit(CodeGenFunction &CGF, Flags flags) override {2144      // Releases at the end of the full-expression are imprecise.2145      CGF.EmitARCRelease(object, ARCImpreciseLifetime);2146    }2147  };2148}2149 2150/// Produce the code for a CK_ARCConsumeObject.  Does a primitive2151/// release at the end of the full-expression.2152llvm::Value *CodeGenFunction::EmitObjCConsumeObject(QualType type,2153                                                    llvm::Value *object) {2154  // If we're in a conditional branch, we need to make the cleanup2155  // conditional.2156  pushFullExprCleanup<CallObjCRelease>(getARCCleanupKind(), object);2157  return object;2158}2159 2160llvm::Value *CodeGenFunction::EmitObjCExtendObjectLifetime(QualType type,2161                                                           llvm::Value *value) {2162  return EmitARCRetainAutorelease(type, value);2163}2164 2165/// Given a number of pointers, inform the optimizer that they're2166/// being intrinsically used up until this point in the program.2167void CodeGenFunction::EmitARCIntrinsicUse(ArrayRef<llvm::Value*> values) {2168  llvm::Function *&fn = CGM.getObjCEntrypoints().clang_arc_use;2169  if (!fn)2170    fn = CGM.getIntrinsic(llvm::Intrinsic::objc_clang_arc_use);2171 2172  // This isn't really a "runtime" function, but as an intrinsic it2173  // doesn't really matter as long as we align things up.2174  EmitNounwindRuntimeCall(fn, values);2175}2176 2177/// Emit a call to "clang.arc.noop.use", which consumes the result of a call2178/// that has operand bundle "clang.arc.attachedcall".2179void CodeGenFunction::EmitARCNoopIntrinsicUse(ArrayRef<llvm::Value *> values) {2180  llvm::Function *&fn = CGM.getObjCEntrypoints().clang_arc_noop_use;2181  if (!fn)2182    fn = CGM.getIntrinsic(llvm::Intrinsic::objc_clang_arc_noop_use);2183  EmitNounwindRuntimeCall(fn, values);2184}2185 2186static void setARCRuntimeFunctionLinkage(CodeGenModule &CGM, llvm::Value *RTF) {2187  if (auto *F = dyn_cast<llvm::Function>(RTF)) {2188    // If the target runtime doesn't naturally support ARC, emit weak2189    // references to the runtime support library.  We don't really2190    // permit this to fail, but we need a particular relocation style.2191    if (!CGM.getLangOpts().ObjCRuntime.hasNativeARC() &&2192        !CGM.getTriple().isOSBinFormatCOFF()) {2193      F->setLinkage(llvm::Function::ExternalWeakLinkage);2194    }2195  }2196}2197 2198static void setARCRuntimeFunctionLinkage(CodeGenModule &CGM,2199                                         llvm::FunctionCallee RTF) {2200  setARCRuntimeFunctionLinkage(CGM, RTF.getCallee());2201}2202 2203static llvm::Function *getARCIntrinsic(llvm::Intrinsic::ID IntID,2204                                       CodeGenModule &CGM) {2205  llvm::Function *fn = CGM.getIntrinsic(IntID);2206  setARCRuntimeFunctionLinkage(CGM, fn);2207  return fn;2208}2209 2210/// Perform an operation having the signature2211///   i8* (i8*)2212/// where a null input causes a no-op and returns null.2213static llvm::Value *emitARCValueOperation(2214    CodeGenFunction &CGF, llvm::Value *value, llvm::Type *returnType,2215    llvm::Function *&fn, llvm::Intrinsic::ID IntID,2216    llvm::CallInst::TailCallKind tailKind = llvm::CallInst::TCK_None) {2217  if (isa<llvm::ConstantPointerNull>(value))2218    return value;2219 2220  if (!fn)2221    fn = getARCIntrinsic(IntID, CGF.CGM);2222 2223  // Cast the argument to 'id'.2224  llvm::Type *origType = returnType ? returnType : value->getType();2225  value = CGF.Builder.CreateBitCast(value, CGF.Int8PtrTy);2226 2227  // Call the function.2228  llvm::CallInst *call = CGF.EmitNounwindRuntimeCall(fn, value);2229  call->setTailCallKind(tailKind);2230 2231  // Cast the result back to the original type.2232  return CGF.Builder.CreateBitCast(call, origType);2233}2234 2235/// Perform an operation having the following signature:2236///   i8* (i8**)2237static llvm::Value *emitARCLoadOperation(CodeGenFunction &CGF, Address addr,2238                                         llvm::Function *&fn,2239                                         llvm::Intrinsic::ID IntID) {2240  if (!fn)2241    fn = getARCIntrinsic(IntID, CGF.CGM);2242 2243  return CGF.EmitNounwindRuntimeCall(fn, addr.emitRawPointer(CGF));2244}2245 2246/// Perform an operation having the following signature:2247///   i8* (i8**, i8*)2248static llvm::Value *emitARCStoreOperation(CodeGenFunction &CGF, Address addr,2249                                          llvm::Value *value,2250                                          llvm::Function *&fn,2251                                          llvm::Intrinsic::ID IntID,2252                                          bool ignored) {2253  assert(addr.getElementType() == value->getType());2254 2255  if (!fn)2256    fn = getARCIntrinsic(IntID, CGF.CGM);2257 2258  llvm::Type *origType = value->getType();2259 2260  llvm::Value *args[] = {2261      CGF.Builder.CreateBitCast(addr.emitRawPointer(CGF), CGF.Int8PtrPtrTy),2262      CGF.Builder.CreateBitCast(value, CGF.Int8PtrTy)};2263  llvm::CallInst *result = CGF.EmitNounwindRuntimeCall(fn, args);2264 2265  if (ignored) return nullptr;2266 2267  return CGF.Builder.CreateBitCast(result, origType);2268}2269 2270/// Perform an operation having the following signature:2271///   void (i8**, i8**)2272static void emitARCCopyOperation(CodeGenFunction &CGF, Address dst, Address src,2273                                 llvm::Function *&fn,2274                                 llvm::Intrinsic::ID IntID) {2275  assert(dst.getType() == src.getType());2276 2277  if (!fn)2278    fn = getARCIntrinsic(IntID, CGF.CGM);2279 2280  llvm::Value *args[] = {2281      CGF.Builder.CreateBitCast(dst.emitRawPointer(CGF), CGF.Int8PtrPtrTy),2282      CGF.Builder.CreateBitCast(src.emitRawPointer(CGF), CGF.Int8PtrPtrTy)};2283  CGF.EmitNounwindRuntimeCall(fn, args);2284}2285 2286/// Perform an operation having the signature2287///   i8* (i8*)2288/// where a null input causes a no-op and returns null.2289static llvm::Value *emitObjCValueOperation(CodeGenFunction &CGF,2290                                           llvm::Value *value,2291                                           llvm::Type *returnType,2292                                           llvm::FunctionCallee &fn,2293                                           StringRef fnName) {2294  if (isa<llvm::ConstantPointerNull>(value))2295    return value;2296 2297  if (!fn) {2298    llvm::FunctionType *fnType =2299      llvm::FunctionType::get(CGF.Int8PtrTy, CGF.Int8PtrTy, false);2300    fn = CGF.CGM.CreateRuntimeFunction(fnType, fnName);2301 2302    // We have Native ARC, so set nonlazybind attribute for performance2303    if (llvm::Function *f = dyn_cast<llvm::Function>(fn.getCallee()))2304      if (fnName == "objc_retain")2305        f->addFnAttr(llvm::Attribute::NonLazyBind);2306  }2307 2308  // Cast the argument to 'id'.2309  llvm::Type *origType = returnType ? returnType : value->getType();2310  value = CGF.Builder.CreateBitCast(value, CGF.Int8PtrTy);2311 2312  // Call the function.2313  llvm::CallBase *Inst = CGF.EmitCallOrInvoke(fn, value);2314 2315  // Mark calls to objc_autorelease as tail on the assumption that methods2316  // overriding autorelease do not touch anything on the stack.2317  if (fnName == "objc_autorelease")2318    if (auto *Call = dyn_cast<llvm::CallInst>(Inst))2319      Call->setTailCall();2320 2321  // Cast the result back to the original type.2322  return CGF.Builder.CreateBitCast(Inst, origType);2323}2324 2325/// Produce the code to do a retain.  Based on the type, calls one of:2326///   call i8* \@objc_retain(i8* %value)2327///   call i8* \@objc_retainBlock(i8* %value)2328llvm::Value *CodeGenFunction::EmitARCRetain(QualType type, llvm::Value *value) {2329  if (type->isBlockPointerType())2330    return EmitARCRetainBlock(value, /*mandatory*/ false);2331  else2332    return EmitARCRetainNonBlock(value);2333}2334 2335/// Retain the given object, with normal retain semantics.2336///   call i8* \@objc_retain(i8* %value)2337llvm::Value *CodeGenFunction::EmitARCRetainNonBlock(llvm::Value *value) {2338  return emitARCValueOperation(*this, value, nullptr,2339                               CGM.getObjCEntrypoints().objc_retain,2340                               llvm::Intrinsic::objc_retain);2341}2342 2343/// Retain the given block, with _Block_copy semantics.2344///   call i8* \@objc_retainBlock(i8* %value)2345///2346/// \param mandatory - If false, emit the call with metadata2347/// indicating that it's okay for the optimizer to eliminate this call2348/// if it can prove that the block never escapes except down the stack.2349llvm::Value *CodeGenFunction::EmitARCRetainBlock(llvm::Value *value,2350                                                 bool mandatory) {2351  llvm::Value *result2352    = emitARCValueOperation(*this, value, nullptr,2353                            CGM.getObjCEntrypoints().objc_retainBlock,2354                            llvm::Intrinsic::objc_retainBlock);2355 2356  // If the copy isn't mandatory, add !clang.arc.copy_on_escape to2357  // tell the optimizer that it doesn't need to do this copy if the2358  // block doesn't escape, where being passed as an argument doesn't2359  // count as escaping.2360  if (!mandatory && isa<llvm::Instruction>(result)) {2361    llvm::CallInst *call2362      = cast<llvm::CallInst>(result->stripPointerCasts());2363    assert(call->getCalledOperand() ==2364           CGM.getObjCEntrypoints().objc_retainBlock);2365 2366    call->setMetadata("clang.arc.copy_on_escape",2367                      llvm::MDNode::get(Builder.getContext(), {}));2368  }2369 2370  return result;2371}2372 2373static void emitAutoreleasedReturnValueMarker(CodeGenFunction &CGF) {2374  // Fetch the void(void) inline asm which marks that we're going to2375  // do something with the autoreleased return value.2376  llvm::InlineAsm *&marker2377    = CGF.CGM.getObjCEntrypoints().retainAutoreleasedReturnValueMarker;2378  if (!marker) {2379    StringRef assembly2380      = CGF.CGM.getTargetCodeGenInfo()2381           .getARCRetainAutoreleasedReturnValueMarker();2382 2383    // If we have an empty assembly string, there's nothing to do.2384    if (assembly.empty()) {2385 2386    // Otherwise, at -O0, build an inline asm that we're going to call2387    // in a moment.2388    } else if (CGF.CGM.getCodeGenOpts().OptimizationLevel == 0) {2389      llvm::FunctionType *type =2390        llvm::FunctionType::get(CGF.VoidTy, /*variadic*/false);2391 2392      marker = llvm::InlineAsm::get(type, assembly, "", /*sideeffects*/ true);2393 2394    // If we're at -O1 and above, we don't want to litter the code2395    // with this marker yet, so leave a breadcrumb for the ARC2396    // optimizer to pick up.2397    } else {2398      const char *retainRVMarkerKey = llvm::objcarc::getRVMarkerModuleFlagStr();2399      if (!CGF.CGM.getModule().getModuleFlag(retainRVMarkerKey)) {2400        auto *str = llvm::MDString::get(CGF.getLLVMContext(), assembly);2401        CGF.CGM.getModule().addModuleFlag(llvm::Module::Error,2402                                          retainRVMarkerKey, str);2403      }2404    }2405  }2406 2407  // Call the marker asm if we made one, which we do only at -O0.2408  if (marker)2409    CGF.Builder.CreateCall(marker, {}, CGF.getBundlesForFunclet(marker));2410}2411 2412static llvm::Value *emitOptimizedARCReturnCall(llvm::Value *value,2413                                               bool IsRetainRV,2414                                               CodeGenFunction &CGF) {2415  emitAutoreleasedReturnValueMarker(CGF);2416 2417  // Add operand bundle "clang.arc.attachedcall" to the call instead of emitting2418  // retainRV or claimRV calls in the IR. We currently do this only when the2419  // optimization level isn't -O0 since global-isel, which is currently run at2420  // -O0, doesn't know about the operand bundle.2421  ObjCEntrypoints &EPs = CGF.CGM.getObjCEntrypoints();2422  llvm::Function *&EP = IsRetainRV2423                            ? EPs.objc_retainAutoreleasedReturnValue2424                            : EPs.objc_unsafeClaimAutoreleasedReturnValue;2425  llvm::Intrinsic::ID IID =2426      IsRetainRV ? llvm::Intrinsic::objc_retainAutoreleasedReturnValue2427                 : llvm::Intrinsic::objc_unsafeClaimAutoreleasedReturnValue;2428  EP = getARCIntrinsic(IID, CGF.CGM);2429 2430  llvm::Triple::ArchType Arch = CGF.CGM.getTriple().getArch();2431 2432  // FIXME: Do this on all targets and at -O0 too. This can be enabled only if2433  // the target backend knows how to handle the operand bundle.2434  if (CGF.CGM.getCodeGenOpts().OptimizationLevel > 0 &&2435      (Arch == llvm::Triple::aarch64 || Arch == llvm::Triple::aarch64_32 ||2436       Arch == llvm::Triple::x86_64)) {2437    llvm::Value *bundleArgs[] = {EP};2438    llvm::OperandBundleDef OB("clang.arc.attachedcall", bundleArgs);2439    auto *oldCall = cast<llvm::CallBase>(value);2440    llvm::CallBase *newCall = llvm::CallBase::addOperandBundle(2441        oldCall, llvm::LLVMContext::OB_clang_arc_attachedcall, OB,2442        oldCall->getIterator());2443    newCall->copyMetadata(*oldCall);2444    oldCall->replaceAllUsesWith(newCall);2445    oldCall->eraseFromParent();2446    CGF.EmitARCNoopIntrinsicUse(newCall);2447    return newCall;2448  }2449 2450  bool isNoTail =2451      CGF.CGM.getTargetCodeGenInfo().markARCOptimizedReturnCallsAsNoTail();2452  llvm::CallInst::TailCallKind tailKind =2453      isNoTail ? llvm::CallInst::TCK_NoTail : llvm::CallInst::TCK_None;2454  return emitARCValueOperation(CGF, value, nullptr, EP, IID, tailKind);2455}2456 2457/// Retain the given object which is the result of a function call.2458///   call i8* \@objc_retainAutoreleasedReturnValue(i8* %value)2459///2460/// Yes, this function name is one character away from a different2461/// call with completely different semantics.2462llvm::Value *2463CodeGenFunction::EmitARCRetainAutoreleasedReturnValue(llvm::Value *value) {2464  return emitOptimizedARCReturnCall(value, true, *this);2465}2466 2467/// Claim a possibly-autoreleased return value at +0.  This is only2468/// valid to do in contexts which do not rely on the retain to keep2469/// the object valid for all of its uses; for example, when2470/// the value is ignored, or when it is being assigned to an2471/// __unsafe_unretained variable.2472///2473///   call i8* \@objc_unsafeClaimAutoreleasedReturnValue(i8* %value)2474llvm::Value *2475CodeGenFunction::EmitARCUnsafeClaimAutoreleasedReturnValue(llvm::Value *value) {2476  return emitOptimizedARCReturnCall(value, false, *this);2477}2478 2479/// Release the given object.2480///   call void \@objc_release(i8* %value)2481void CodeGenFunction::EmitARCRelease(llvm::Value *value,2482                                     ARCPreciseLifetime_t precise) {2483  if (isa<llvm::ConstantPointerNull>(value)) return;2484 2485  llvm::Function *&fn = CGM.getObjCEntrypoints().objc_release;2486  if (!fn)2487    fn = getARCIntrinsic(llvm::Intrinsic::objc_release, CGM);2488 2489  // Cast the argument to 'id'.2490  value = Builder.CreateBitCast(value, Int8PtrTy);2491 2492  // Call objc_release.2493  llvm::CallInst *call = EmitNounwindRuntimeCall(fn, value);2494 2495  if (precise == ARCImpreciseLifetime) {2496    call->setMetadata("clang.imprecise_release",2497                      llvm::MDNode::get(Builder.getContext(), {}));2498  }2499}2500 2501/// Destroy a __strong variable.2502///2503/// At -O0, emit a call to store 'null' into the address;2504/// instrumenting tools prefer this because the address is exposed,2505/// but it's relatively cumbersome to optimize.2506///2507/// At -O1 and above, just load and call objc_release.2508///2509///   call void \@objc_storeStrong(i8** %addr, i8* null)2510void CodeGenFunction::EmitARCDestroyStrong(Address addr,2511                                           ARCPreciseLifetime_t precise) {2512  if (CGM.getCodeGenOpts().OptimizationLevel == 0) {2513    llvm::Value *null = getNullForVariable(addr);2514    EmitARCStoreStrongCall(addr, null, /*ignored*/ true);2515    return;2516  }2517 2518  llvm::Value *value = Builder.CreateLoad(addr);2519  EmitARCRelease(value, precise);2520}2521 2522/// Store into a strong object.  Always calls this:2523///   call void \@objc_storeStrong(i8** %addr, i8* %value)2524llvm::Value *CodeGenFunction::EmitARCStoreStrongCall(Address addr,2525                                                     llvm::Value *value,2526                                                     bool ignored) {2527  assert(addr.getElementType() == value->getType());2528 2529  llvm::Function *&fn = CGM.getObjCEntrypoints().objc_storeStrong;2530  if (!fn)2531    fn = getARCIntrinsic(llvm::Intrinsic::objc_storeStrong, CGM);2532 2533  llvm::Value *args[] = {2534      Builder.CreateBitCast(addr.emitRawPointer(*this), Int8PtrPtrTy),2535      Builder.CreateBitCast(value, Int8PtrTy)};2536  EmitNounwindRuntimeCall(fn, args);2537 2538  if (ignored) return nullptr;2539  return value;2540}2541 2542/// Store into a strong object.  Sometimes calls this:2543///   call void \@objc_storeStrong(i8** %addr, i8* %value)2544/// Other times, breaks it down into components.2545llvm::Value *CodeGenFunction::EmitARCStoreStrong(LValue dst,2546                                                 llvm::Value *newValue,2547                                                 bool ignored) {2548  QualType type = dst.getType();2549  bool isBlock = type->isBlockPointerType();2550 2551  // Use a store barrier at -O0 unless this is a block type or the2552  // lvalue is inadequately aligned.2553  if (shouldUseFusedARCCalls() &&2554      !isBlock &&2555      (dst.getAlignment().isZero() ||2556       dst.getAlignment() >= CharUnits::fromQuantity(PointerAlignInBytes))) {2557    return EmitARCStoreStrongCall(dst.getAddress(), newValue, ignored);2558  }2559 2560  // Otherwise, split it out.2561 2562  // Retain the new value.2563  newValue = EmitARCRetain(type, newValue);2564 2565  // Read the old value.2566  llvm::Value *oldValue = EmitLoadOfScalar(dst, SourceLocation());2567 2568  // Store.  We do this before the release so that any deallocs won't2569  // see the old value.2570  EmitStoreOfScalar(newValue, dst);2571 2572  // Finally, release the old value.2573  EmitARCRelease(oldValue, dst.isARCPreciseLifetime());2574 2575  return newValue;2576}2577 2578/// Autorelease the given object.2579///   call i8* \@objc_autorelease(i8* %value)2580llvm::Value *CodeGenFunction::EmitARCAutorelease(llvm::Value *value) {2581  return emitARCValueOperation(*this, value, nullptr,2582                               CGM.getObjCEntrypoints().objc_autorelease,2583                               llvm::Intrinsic::objc_autorelease);2584}2585 2586/// Autorelease the given object.2587///   call i8* \@objc_autoreleaseReturnValue(i8* %value)2588llvm::Value *2589CodeGenFunction::EmitARCAutoreleaseReturnValue(llvm::Value *value) {2590  return emitARCValueOperation(*this, value, nullptr,2591                            CGM.getObjCEntrypoints().objc_autoreleaseReturnValue,2592                               llvm::Intrinsic::objc_autoreleaseReturnValue,2593                               llvm::CallInst::TCK_Tail);2594}2595 2596/// Do a fused retain/autorelease of the given object.2597///   call i8* \@objc_retainAutoreleaseReturnValue(i8* %value)2598llvm::Value *2599CodeGenFunction::EmitARCRetainAutoreleaseReturnValue(llvm::Value *value) {2600  return emitARCValueOperation(*this, value, nullptr,2601                     CGM.getObjCEntrypoints().objc_retainAutoreleaseReturnValue,2602                             llvm::Intrinsic::objc_retainAutoreleaseReturnValue,2603                               llvm::CallInst::TCK_Tail);2604}2605 2606/// Do a fused retain/autorelease of the given object.2607///   call i8* \@objc_retainAutorelease(i8* %value)2608/// or2609///   %retain = call i8* \@objc_retainBlock(i8* %value)2610///   call i8* \@objc_autorelease(i8* %retain)2611llvm::Value *CodeGenFunction::EmitARCRetainAutorelease(QualType type,2612                                                       llvm::Value *value) {2613  if (!type->isBlockPointerType())2614    return EmitARCRetainAutoreleaseNonBlock(value);2615 2616  if (isa<llvm::ConstantPointerNull>(value)) return value;2617 2618  llvm::Type *origType = value->getType();2619  value = Builder.CreateBitCast(value, Int8PtrTy);2620  value = EmitARCRetainBlock(value, /*mandatory*/ true);2621  value = EmitARCAutorelease(value);2622  return Builder.CreateBitCast(value, origType);2623}2624 2625/// Do a fused retain/autorelease of the given object.2626///   call i8* \@objc_retainAutorelease(i8* %value)2627llvm::Value *2628CodeGenFunction::EmitARCRetainAutoreleaseNonBlock(llvm::Value *value) {2629  return emitARCValueOperation(*this, value, nullptr,2630                               CGM.getObjCEntrypoints().objc_retainAutorelease,2631                               llvm::Intrinsic::objc_retainAutorelease);2632}2633 2634/// i8* \@objc_loadWeak(i8** %addr)2635/// Essentially objc_autorelease(objc_loadWeakRetained(addr)).2636llvm::Value *CodeGenFunction::EmitARCLoadWeak(Address addr) {2637  return emitARCLoadOperation(*this, addr,2638                              CGM.getObjCEntrypoints().objc_loadWeak,2639                              llvm::Intrinsic::objc_loadWeak);2640}2641 2642/// i8* \@objc_loadWeakRetained(i8** %addr)2643llvm::Value *CodeGenFunction::EmitARCLoadWeakRetained(Address addr) {2644  return emitARCLoadOperation(*this, addr,2645                              CGM.getObjCEntrypoints().objc_loadWeakRetained,2646                              llvm::Intrinsic::objc_loadWeakRetained);2647}2648 2649/// i8* \@objc_storeWeak(i8** %addr, i8* %value)2650/// Returns %value.2651llvm::Value *CodeGenFunction::EmitARCStoreWeak(Address addr,2652                                               llvm::Value *value,2653                                               bool ignored) {2654  return emitARCStoreOperation(*this, addr, value,2655                               CGM.getObjCEntrypoints().objc_storeWeak,2656                               llvm::Intrinsic::objc_storeWeak, ignored);2657}2658 2659/// i8* \@objc_initWeak(i8** %addr, i8* %value)2660/// Returns %value.  %addr is known to not have a current weak entry.2661/// Essentially equivalent to:2662///   *addr = nil; objc_storeWeak(addr, value);2663void CodeGenFunction::EmitARCInitWeak(Address addr, llvm::Value *value) {2664  // If we're initializing to null, just write null to memory; no need2665  // to get the runtime involved.  But don't do this if optimization2666  // is enabled, because accounting for this would make the optimizer2667  // much more complicated.2668  if (isa<llvm::ConstantPointerNull>(value) &&2669      CGM.getCodeGenOpts().OptimizationLevel == 0) {2670    Builder.CreateStore(value, addr);2671    return;2672  }2673 2674  emitARCStoreOperation(*this, addr, value,2675                        CGM.getObjCEntrypoints().objc_initWeak,2676                        llvm::Intrinsic::objc_initWeak, /*ignored*/ true);2677}2678 2679/// void \@objc_destroyWeak(i8** %addr)2680/// Essentially objc_storeWeak(addr, nil).2681void CodeGenFunction::EmitARCDestroyWeak(Address addr) {2682  llvm::Function *&fn = CGM.getObjCEntrypoints().objc_destroyWeak;2683  if (!fn)2684    fn = getARCIntrinsic(llvm::Intrinsic::objc_destroyWeak, CGM);2685 2686  EmitNounwindRuntimeCall(fn, addr.emitRawPointer(*this));2687}2688 2689/// void \@objc_moveWeak(i8** %dest, i8** %src)2690/// Disregards the current value in %dest.  Leaves %src pointing to nothing.2691/// Essentially (objc_copyWeak(dest, src), objc_destroyWeak(src)).2692void CodeGenFunction::EmitARCMoveWeak(Address dst, Address src) {2693  emitARCCopyOperation(*this, dst, src,2694                       CGM.getObjCEntrypoints().objc_moveWeak,2695                       llvm::Intrinsic::objc_moveWeak);2696}2697 2698/// void \@objc_copyWeak(i8** %dest, i8** %src)2699/// Disregards the current value in %dest.  Essentially2700///   objc_release(objc_initWeak(dest, objc_readWeakRetained(src)))2701void CodeGenFunction::EmitARCCopyWeak(Address dst, Address src) {2702  emitARCCopyOperation(*this, dst, src,2703                       CGM.getObjCEntrypoints().objc_copyWeak,2704                       llvm::Intrinsic::objc_copyWeak);2705}2706 2707void CodeGenFunction::emitARCCopyAssignWeak(QualType Ty, Address DstAddr,2708                                            Address SrcAddr) {2709  llvm::Value *Object = EmitARCLoadWeakRetained(SrcAddr);2710  Object = EmitObjCConsumeObject(Ty, Object);2711  EmitARCStoreWeak(DstAddr, Object, false);2712}2713 2714void CodeGenFunction::emitARCMoveAssignWeak(QualType Ty, Address DstAddr,2715                                            Address SrcAddr) {2716  llvm::Value *Object = EmitARCLoadWeakRetained(SrcAddr);2717  Object = EmitObjCConsumeObject(Ty, Object);2718  EmitARCStoreWeak(DstAddr, Object, false);2719  EmitARCDestroyWeak(SrcAddr);2720}2721 2722/// Produce the code to do a objc_autoreleasepool_push.2723///   call i8* \@objc_autoreleasePoolPush(void)2724llvm::Value *CodeGenFunction::EmitObjCAutoreleasePoolPush() {2725  llvm::Function *&fn = CGM.getObjCEntrypoints().objc_autoreleasePoolPush;2726  if (!fn)2727    fn = getARCIntrinsic(llvm::Intrinsic::objc_autoreleasePoolPush, CGM);2728 2729  return EmitNounwindRuntimeCall(fn);2730}2731 2732/// Produce the code to do a primitive release.2733///   call void \@objc_autoreleasePoolPop(i8* %ptr)2734void CodeGenFunction::EmitObjCAutoreleasePoolPop(llvm::Value *value) {2735  assert(value->getType() == Int8PtrTy);2736 2737  if (getInvokeDest()) {2738    // Call the runtime method not the intrinsic if we are handling exceptions2739    llvm::FunctionCallee &fn =2740        CGM.getObjCEntrypoints().objc_autoreleasePoolPopInvoke;2741    if (!fn) {2742      llvm::FunctionType *fnType =2743        llvm::FunctionType::get(Builder.getVoidTy(), Int8PtrTy, false);2744      fn = CGM.CreateRuntimeFunction(fnType, "objc_autoreleasePoolPop");2745      setARCRuntimeFunctionLinkage(CGM, fn);2746    }2747 2748    // objc_autoreleasePoolPop can throw.2749    EmitRuntimeCallOrInvoke(fn, value);2750  } else {2751    llvm::FunctionCallee &fn = CGM.getObjCEntrypoints().objc_autoreleasePoolPop;2752    if (!fn)2753      fn = getARCIntrinsic(llvm::Intrinsic::objc_autoreleasePoolPop, CGM);2754 2755    EmitRuntimeCall(fn, value);2756  }2757}2758 2759/// Produce the code to do an MRR version objc_autoreleasepool_push.2760/// Which is: [[NSAutoreleasePool alloc] init];2761/// Where alloc is declared as: + (id) alloc; in NSAutoreleasePool class.2762/// init is declared as: - (id) init; in its NSObject super class.2763///2764llvm::Value *CodeGenFunction::EmitObjCMRRAutoreleasePoolPush() {2765  CGObjCRuntime &Runtime = CGM.getObjCRuntime();2766  llvm::Value *Receiver = Runtime.EmitNSAutoreleasePoolClassRef(*this);2767  // [NSAutoreleasePool alloc]2768  const IdentifierInfo *II = &CGM.getContext().Idents.get("alloc");2769  Selector AllocSel = getContext().Selectors.getSelector(0, &II);2770  CallArgList Args;2771  RValue AllocRV =2772    Runtime.GenerateMessageSend(*this, ReturnValueSlot(),2773                                getContext().getObjCIdType(),2774                                AllocSel, Receiver, Args);2775 2776  // [Receiver init]2777  Receiver = AllocRV.getScalarVal();2778  II = &CGM.getContext().Idents.get("init");2779  Selector InitSel = getContext().Selectors.getSelector(0, &II);2780  RValue InitRV =2781    Runtime.GenerateMessageSend(*this, ReturnValueSlot(),2782                                getContext().getObjCIdType(),2783                                InitSel, Receiver, Args);2784  return InitRV.getScalarVal();2785}2786 2787/// Allocate the given objc object.2788///   call i8* \@objc_alloc(i8* %value)2789llvm::Value *CodeGenFunction::EmitObjCAlloc(llvm::Value *value,2790                                            llvm::Type *resultType) {2791  return emitObjCValueOperation(*this, value, resultType,2792                                CGM.getObjCEntrypoints().objc_alloc,2793                                "objc_alloc");2794}2795 2796/// Allocate the given objc object.2797///   call i8* \@objc_allocWithZone(i8* %value)2798llvm::Value *CodeGenFunction::EmitObjCAllocWithZone(llvm::Value *value,2799                                                    llvm::Type *resultType) {2800  return emitObjCValueOperation(*this, value, resultType,2801                                CGM.getObjCEntrypoints().objc_allocWithZone,2802                                "objc_allocWithZone");2803}2804 2805llvm::Value *CodeGenFunction::EmitObjCAllocInit(llvm::Value *value,2806                                                llvm::Type *resultType) {2807  return emitObjCValueOperation(*this, value, resultType,2808                                CGM.getObjCEntrypoints().objc_alloc_init,2809                                "objc_alloc_init");2810}2811 2812/// Produce the code to do a primitive release.2813/// [tmp drain];2814void CodeGenFunction::EmitObjCMRRAutoreleasePoolPop(llvm::Value *Arg) {2815  const IdentifierInfo *II = &CGM.getContext().Idents.get("drain");2816  Selector DrainSel = getContext().Selectors.getSelector(0, &II);2817  CallArgList Args;2818  CGM.getObjCRuntime().GenerateMessageSend(*this, ReturnValueSlot(),2819                              getContext().VoidTy, DrainSel, Arg, Args);2820}2821 2822void CodeGenFunction::destroyARCStrongPrecise(CodeGenFunction &CGF,2823                                              Address addr,2824                                              QualType type) {2825  CGF.EmitARCDestroyStrong(addr, ARCPreciseLifetime);2826}2827 2828void CodeGenFunction::destroyARCStrongImprecise(CodeGenFunction &CGF,2829                                                Address addr,2830                                                QualType type) {2831  CGF.EmitARCDestroyStrong(addr, ARCImpreciseLifetime);2832}2833 2834void CodeGenFunction::destroyARCWeak(CodeGenFunction &CGF,2835                                     Address addr,2836                                     QualType type) {2837  CGF.EmitARCDestroyWeak(addr);2838}2839 2840void CodeGenFunction::emitARCIntrinsicUse(CodeGenFunction &CGF, Address addr,2841                                          QualType type) {2842  llvm::Value *value = CGF.Builder.CreateLoad(addr);2843  CGF.EmitARCIntrinsicUse(value);2844}2845 2846/// Autorelease the given object.2847///   call i8* \@objc_autorelease(i8* %value)2848llvm::Value *CodeGenFunction::EmitObjCAutorelease(llvm::Value *value,2849                                                  llvm::Type *returnType) {2850  return emitObjCValueOperation(2851      *this, value, returnType,2852      CGM.getObjCEntrypoints().objc_autoreleaseRuntimeFunction,2853      "objc_autorelease");2854}2855 2856/// Retain the given object, with normal retain semantics.2857///   call i8* \@objc_retain(i8* %value)2858llvm::Value *CodeGenFunction::EmitObjCRetainNonBlock(llvm::Value *value,2859                                                     llvm::Type *returnType) {2860  return emitObjCValueOperation(2861      *this, value, returnType,2862      CGM.getObjCEntrypoints().objc_retainRuntimeFunction, "objc_retain");2863}2864 2865/// Release the given object.2866///   call void \@objc_release(i8* %value)2867void CodeGenFunction::EmitObjCRelease(llvm::Value *value,2868                                      ARCPreciseLifetime_t precise) {2869  if (isa<llvm::ConstantPointerNull>(value)) return;2870 2871  llvm::FunctionCallee &fn =2872      CGM.getObjCEntrypoints().objc_releaseRuntimeFunction;2873  if (!fn) {2874    llvm::FunctionType *fnType =2875        llvm::FunctionType::get(Builder.getVoidTy(), Int8PtrTy, false);2876    fn = CGM.CreateRuntimeFunction(fnType, "objc_release");2877    setARCRuntimeFunctionLinkage(CGM, fn);2878    // We have Native ARC, so set nonlazybind attribute for performance2879    if (llvm::Function *f = dyn_cast<llvm::Function>(fn.getCallee()))2880      f->addFnAttr(llvm::Attribute::NonLazyBind);2881  }2882 2883  // Cast the argument to 'id'.2884  value = Builder.CreateBitCast(value, Int8PtrTy);2885 2886  // Call objc_release.2887  llvm::CallBase *call = EmitCallOrInvoke(fn, value);2888 2889  if (precise == ARCImpreciseLifetime) {2890    call->setMetadata("clang.imprecise_release",2891                      llvm::MDNode::get(Builder.getContext(), {}));2892  }2893}2894 2895namespace {2896  struct CallObjCAutoreleasePoolObject final : EHScopeStack::Cleanup {2897    llvm::Value *Token;2898 2899    CallObjCAutoreleasePoolObject(llvm::Value *token) : Token(token) {}2900 2901    void Emit(CodeGenFunction &CGF, Flags flags) override {2902      CGF.EmitObjCAutoreleasePoolPop(Token);2903    }2904  };2905  struct CallObjCMRRAutoreleasePoolObject final : EHScopeStack::Cleanup {2906    llvm::Value *Token;2907 2908    CallObjCMRRAutoreleasePoolObject(llvm::Value *token) : Token(token) {}2909 2910    void Emit(CodeGenFunction &CGF, Flags flags) override {2911      CGF.EmitObjCMRRAutoreleasePoolPop(Token);2912    }2913  };2914}2915 2916void CodeGenFunction::EmitObjCAutoreleasePoolCleanup(llvm::Value *Ptr) {2917  if (CGM.getLangOpts().ObjCAutoRefCount)2918    EHStack.pushCleanup<CallObjCAutoreleasePoolObject>(NormalCleanup, Ptr);2919  else2920    EHStack.pushCleanup<CallObjCMRRAutoreleasePoolObject>(NormalCleanup, Ptr);2921}2922 2923static bool shouldRetainObjCLifetime(Qualifiers::ObjCLifetime lifetime) {2924  switch (lifetime) {2925  case Qualifiers::OCL_None:2926  case Qualifiers::OCL_ExplicitNone:2927  case Qualifiers::OCL_Strong:2928  case Qualifiers::OCL_Autoreleasing:2929    return true;2930 2931  case Qualifiers::OCL_Weak:2932    return false;2933  }2934 2935  llvm_unreachable("impossible lifetime!");2936}2937 2938static TryEmitResult tryEmitARCRetainLoadOfScalar(CodeGenFunction &CGF,2939                                                  LValue lvalue,2940                                                  QualType type) {2941  llvm::Value *result;2942  bool shouldRetain = shouldRetainObjCLifetime(type.getObjCLifetime());2943  if (shouldRetain) {2944    result = CGF.EmitLoadOfLValue(lvalue, SourceLocation()).getScalarVal();2945  } else {2946    assert(type.getObjCLifetime() == Qualifiers::OCL_Weak);2947    result = CGF.EmitARCLoadWeakRetained(lvalue.getAddress());2948  }2949  return TryEmitResult(result, !shouldRetain);2950}2951 2952static TryEmitResult tryEmitARCRetainLoadOfScalar(CodeGenFunction &CGF,2953                                                  const Expr *e) {2954  e = e->IgnoreParens();2955  QualType type = e->getType();2956 2957  // If we're loading retained from a __strong xvalue, we can avoid2958  // an extra retain/release pair by zeroing out the source of this2959  // "move" operation.2960  if (e->isXValue() &&2961      !type.isConstQualified() &&2962      type.getObjCLifetime() == Qualifiers::OCL_Strong) {2963    // Emit the lvalue.2964    LValue lv = CGF.EmitLValue(e);2965 2966    // Load the object pointer.2967    llvm::Value *result = CGF.EmitLoadOfLValue(lv,2968                                               SourceLocation()).getScalarVal();2969 2970    // Set the source pointer to NULL.2971    CGF.EmitStoreOfScalar(getNullForVariable(lv.getAddress()), lv);2972 2973    return TryEmitResult(result, true);2974  }2975 2976  // As a very special optimization, in ARC++, if the l-value is the2977  // result of a non-volatile assignment, do a simple retain of the2978  // result of the call to objc_storeWeak instead of reloading.2979  if (CGF.getLangOpts().CPlusPlus &&2980      !type.isVolatileQualified() &&2981      type.getObjCLifetime() == Qualifiers::OCL_Weak &&2982      isa<BinaryOperator>(e) &&2983      cast<BinaryOperator>(e)->getOpcode() == BO_Assign)2984    return TryEmitResult(CGF.EmitScalarExpr(e), false);2985 2986  // Try to emit code for scalar constant instead of emitting LValue and2987  // loading it because we are not guaranteed to have an l-value. One of such2988  // cases is DeclRefExpr referencing non-odr-used constant-evaluated variable.2989  if (const auto *decl_expr = dyn_cast<DeclRefExpr>(e)) {2990    auto *DRE = const_cast<DeclRefExpr *>(decl_expr);2991    if (CodeGenFunction::ConstantEmission constant = CGF.tryEmitAsConstant(DRE))2992      return TryEmitResult(CGF.emitScalarConstant(constant, DRE),2993                           !shouldRetainObjCLifetime(type.getObjCLifetime()));2994  }2995 2996  return tryEmitARCRetainLoadOfScalar(CGF, CGF.EmitLValue(e), type);2997}2998 2999typedef llvm::function_ref<llvm::Value *(CodeGenFunction &CGF,3000                                         llvm::Value *value)>3001  ValueTransform;3002 3003/// Insert code immediately after a call.3004 3005// FIXME: We should find a way to emit the runtime call immediately3006// after the call is emitted to eliminate the need for this function.3007static llvm::Value *emitARCOperationAfterCall(CodeGenFunction &CGF,3008                                              llvm::Value *value,3009                                              ValueTransform doAfterCall,3010                                              ValueTransform doFallback) {3011  CGBuilderTy::InsertPoint ip = CGF.Builder.saveIP();3012  auto *callBase = dyn_cast<llvm::CallBase>(value);3013 3014  if (callBase && llvm::objcarc::hasAttachedCallOpBundle(callBase)) {3015    // Fall back if the call base has operand bundle "clang.arc.attachedcall".3016    value = doFallback(CGF, value);3017  } else if (llvm::CallInst *call = dyn_cast<llvm::CallInst>(value)) {3018    // Place the retain immediately following the call.3019    CGF.Builder.SetInsertPoint(call->getParent(),3020                               ++llvm::BasicBlock::iterator(call));3021    value = doAfterCall(CGF, value);3022  } else if (llvm::InvokeInst *invoke = dyn_cast<llvm::InvokeInst>(value)) {3023    // Place the retain at the beginning of the normal destination block.3024    llvm::BasicBlock *BB = invoke->getNormalDest();3025    CGF.Builder.SetInsertPoint(BB, BB->begin());3026    value = doAfterCall(CGF, value);3027 3028  // Bitcasts can arise because of related-result returns.  Rewrite3029  // the operand.3030  } else if (llvm::BitCastInst *bitcast = dyn_cast<llvm::BitCastInst>(value)) {3031    // Change the insert point to avoid emitting the fall-back call after the3032    // bitcast.3033    CGF.Builder.SetInsertPoint(bitcast->getParent(), bitcast->getIterator());3034    llvm::Value *operand = bitcast->getOperand(0);3035    operand = emitARCOperationAfterCall(CGF, operand, doAfterCall, doFallback);3036    bitcast->setOperand(0, operand);3037    value = bitcast;3038  } else {3039    auto *phi = dyn_cast<llvm::PHINode>(value);3040    if (phi && phi->getNumIncomingValues() == 2 &&3041        isa<llvm::ConstantPointerNull>(phi->getIncomingValue(1)) &&3042        isa<llvm::CallBase>(phi->getIncomingValue(0))) {3043      // Handle phi instructions that are generated when it's necessary to check3044      // whether the receiver of a message is null.3045      llvm::Value *inVal = phi->getIncomingValue(0);3046      inVal = emitARCOperationAfterCall(CGF, inVal, doAfterCall, doFallback);3047      phi->setIncomingValue(0, inVal);3048      value = phi;3049    } else {3050      // Generic fall-back case.3051      // Retain using the non-block variant: we never need to do a copy3052      // of a block that's been returned to us.3053      value = doFallback(CGF, value);3054    }3055  }3056 3057  CGF.Builder.restoreIP(ip);3058  return value;3059}3060 3061/// Given that the given expression is some sort of call (which does3062/// not return retained), emit a retain following it.3063static llvm::Value *emitARCRetainCallResult(CodeGenFunction &CGF,3064                                            const Expr *e) {3065  llvm::Value *value = CGF.EmitScalarExpr(e);3066  return emitARCOperationAfterCall(CGF, value,3067           [](CodeGenFunction &CGF, llvm::Value *value) {3068             return CGF.EmitARCRetainAutoreleasedReturnValue(value);3069           },3070           [](CodeGenFunction &CGF, llvm::Value *value) {3071             return CGF.EmitARCRetainNonBlock(value);3072           });3073}3074 3075/// Given that the given expression is some sort of call (which does3076/// not return retained), perform an unsafeClaim following it.3077static llvm::Value *emitARCUnsafeClaimCallResult(CodeGenFunction &CGF,3078                                                 const Expr *e) {3079  llvm::Value *value = CGF.EmitScalarExpr(e);3080  return emitARCOperationAfterCall(CGF, value,3081           [](CodeGenFunction &CGF, llvm::Value *value) {3082             return CGF.EmitARCUnsafeClaimAutoreleasedReturnValue(value);3083           },3084           [](CodeGenFunction &CGF, llvm::Value *value) {3085             return value;3086           });3087}3088 3089llvm::Value *CodeGenFunction::EmitARCReclaimReturnedObject(const Expr *E,3090                                                      bool allowUnsafeClaim) {3091  if (allowUnsafeClaim &&3092      CGM.getLangOpts().ObjCRuntime.hasARCUnsafeClaimAutoreleasedReturnValue()) {3093    return emitARCUnsafeClaimCallResult(*this, E);3094  } else {3095    llvm::Value *value = emitARCRetainCallResult(*this, E);3096    return EmitObjCConsumeObject(E->getType(), value);3097  }3098}3099 3100/// Determine whether it might be important to emit a separate3101/// objc_retain_block on the result of the given expression, or3102/// whether it's okay to just emit it in a +1 context.3103static bool shouldEmitSeparateBlockRetain(const Expr *e) {3104  assert(e->getType()->isBlockPointerType());3105  e = e->IgnoreParens();3106 3107  // For future goodness, emit block expressions directly in +13108  // contexts if we can.3109  if (isa<BlockExpr>(e))3110    return false;3111 3112  if (const CastExpr *cast = dyn_cast<CastExpr>(e)) {3113    switch (cast->getCastKind()) {3114    // Emitting these operations in +1 contexts is goodness.3115    case CK_LValueToRValue:3116    case CK_ARCReclaimReturnedObject:3117    case CK_ARCConsumeObject:3118    case CK_ARCProduceObject:3119      return false;3120 3121    // These operations preserve a block type.3122    case CK_NoOp:3123    case CK_BitCast:3124      return shouldEmitSeparateBlockRetain(cast->getSubExpr());3125 3126    // These operations are known to be bad (or haven't been considered).3127    case CK_AnyPointerToBlockPointerCast:3128    default:3129      return true;3130    }3131  }3132 3133  return true;3134}3135 3136namespace {3137/// A CRTP base class for emitting expressions of retainable object3138/// pointer type in ARC.3139template <typename Impl, typename Result> class ARCExprEmitter {3140protected:3141  CodeGenFunction &CGF;3142  Impl &asImpl() { return *static_cast<Impl*>(this); }3143 3144  ARCExprEmitter(CodeGenFunction &CGF) : CGF(CGF) {}3145 3146public:3147  Result visit(const Expr *e);3148  Result visitCastExpr(const CastExpr *e);3149  Result visitPseudoObjectExpr(const PseudoObjectExpr *e);3150  Result visitBlockExpr(const BlockExpr *e);3151  Result visitBinaryOperator(const BinaryOperator *e);3152  Result visitBinAssign(const BinaryOperator *e);3153  Result visitBinAssignUnsafeUnretained(const BinaryOperator *e);3154  Result visitBinAssignAutoreleasing(const BinaryOperator *e);3155  Result visitBinAssignWeak(const BinaryOperator *e);3156  Result visitBinAssignStrong(const BinaryOperator *e);3157 3158  // Minimal implementation:3159  //   Result visitLValueToRValue(const Expr *e)3160  //   Result visitConsumeObject(const Expr *e)3161  //   Result visitExtendBlockObject(const Expr *e)3162  //   Result visitReclaimReturnedObject(const Expr *e)3163  //   Result visitCall(const Expr *e)3164  //   Result visitExpr(const Expr *e)3165  //3166  //   Result emitBitCast(Result result, llvm::Type *resultType)3167  //   llvm::Value *getValueOfResult(Result result)3168};3169}3170 3171/// Try to emit a PseudoObjectExpr under special ARC rules.3172///3173/// This massively duplicates emitPseudoObjectRValue.3174template <typename Impl, typename Result>3175Result3176ARCExprEmitter<Impl,Result>::visitPseudoObjectExpr(const PseudoObjectExpr *E) {3177  SmallVector<CodeGenFunction::OpaqueValueMappingData, 4> opaques;3178 3179  // Find the result expression.3180  const Expr *resultExpr = E->getResultExpr();3181  assert(resultExpr);3182  Result result;3183 3184  for (PseudoObjectExpr::const_semantics_iterator3185         i = E->semantics_begin(), e = E->semantics_end(); i != e; ++i) {3186    const Expr *semantic = *i;3187 3188    // If this semantic expression is an opaque value, bind it3189    // to the result of its source expression.3190    if (const OpaqueValueExpr *ov = dyn_cast<OpaqueValueExpr>(semantic)) {3191      typedef CodeGenFunction::OpaqueValueMappingData OVMA;3192      OVMA opaqueData;3193 3194      // If this semantic is the result of the pseudo-object3195      // expression, try to evaluate the source as +1.3196      if (ov == resultExpr) {3197        assert(!OVMA::shouldBindAsLValue(ov));3198        result = asImpl().visit(ov->getSourceExpr());3199        opaqueData = OVMA::bind(CGF, ov,3200                            RValue::get(asImpl().getValueOfResult(result)));3201 3202      // Otherwise, just bind it.3203      } else {3204        opaqueData = OVMA::bind(CGF, ov, ov->getSourceExpr());3205      }3206      opaques.push_back(opaqueData);3207 3208    // Otherwise, if the expression is the result, evaluate it3209    // and remember the result.3210    } else if (semantic == resultExpr) {3211      result = asImpl().visit(semantic);3212 3213    // Otherwise, evaluate the expression in an ignored context.3214    } else {3215      CGF.EmitIgnoredExpr(semantic);3216    }3217  }3218 3219  // Unbind all the opaques now.3220  for (CodeGenFunction::OpaqueValueMappingData &opaque : opaques)3221    opaque.unbind(CGF);3222 3223  return result;3224}3225 3226template <typename Impl, typename Result>3227Result ARCExprEmitter<Impl, Result>::visitBlockExpr(const BlockExpr *e) {3228  // The default implementation just forwards the expression to visitExpr.3229  return asImpl().visitExpr(e);3230}3231 3232template <typename Impl, typename Result>3233Result ARCExprEmitter<Impl,Result>::visitCastExpr(const CastExpr *e) {3234  switch (e->getCastKind()) {3235 3236  // No-op casts don't change the type, so we just ignore them.3237  case CK_NoOp:3238    return asImpl().visit(e->getSubExpr());3239 3240  // These casts can change the type.3241  case CK_CPointerToObjCPointerCast:3242  case CK_BlockPointerToObjCPointerCast:3243  case CK_AnyPointerToBlockPointerCast:3244  case CK_BitCast: {3245    llvm::Type *resultType = CGF.ConvertType(e->getType());3246    assert(e->getSubExpr()->getType()->hasPointerRepresentation());3247    Result result = asImpl().visit(e->getSubExpr());3248    return asImpl().emitBitCast(result, resultType);3249  }3250 3251  // Handle some casts specially.3252  case CK_LValueToRValue:3253    return asImpl().visitLValueToRValue(e->getSubExpr());3254  case CK_ARCConsumeObject:3255    return asImpl().visitConsumeObject(e->getSubExpr());3256  case CK_ARCExtendBlockObject:3257    return asImpl().visitExtendBlockObject(e->getSubExpr());3258  case CK_ARCReclaimReturnedObject:3259    return asImpl().visitReclaimReturnedObject(e->getSubExpr());3260 3261  // Otherwise, use the default logic.3262  default:3263    return asImpl().visitExpr(e);3264  }3265}3266 3267template <typename Impl, typename Result>3268Result3269ARCExprEmitter<Impl,Result>::visitBinaryOperator(const BinaryOperator *e) {3270  switch (e->getOpcode()) {3271  case BO_Comma:3272    CGF.EmitIgnoredExpr(e->getLHS());3273    CGF.EnsureInsertPoint();3274    return asImpl().visit(e->getRHS());3275 3276  case BO_Assign:3277    return asImpl().visitBinAssign(e);3278 3279  default:3280    return asImpl().visitExpr(e);3281  }3282}3283 3284template <typename Impl, typename Result>3285Result ARCExprEmitter<Impl,Result>::visitBinAssign(const BinaryOperator *e) {3286  switch (e->getLHS()->getType().getObjCLifetime()) {3287  case Qualifiers::OCL_ExplicitNone:3288    return asImpl().visitBinAssignUnsafeUnretained(e);3289 3290  case Qualifiers::OCL_Weak:3291    return asImpl().visitBinAssignWeak(e);3292 3293  case Qualifiers::OCL_Autoreleasing:3294    return asImpl().visitBinAssignAutoreleasing(e);3295 3296  case Qualifiers::OCL_Strong:3297    return asImpl().visitBinAssignStrong(e);3298 3299  case Qualifiers::OCL_None:3300    return asImpl().visitExpr(e);3301  }3302  llvm_unreachable("bad ObjC ownership qualifier");3303}3304 3305/// The default rule for __unsafe_unretained emits the RHS recursively,3306/// stores into the unsafe variable, and propagates the result outward.3307template <typename Impl, typename Result>3308Result ARCExprEmitter<Impl,Result>::3309                    visitBinAssignUnsafeUnretained(const BinaryOperator *e) {3310  // Recursively emit the RHS.3311  // For __block safety, do this before emitting the LHS.3312  Result result = asImpl().visit(e->getRHS());3313 3314  // Perform the store.3315  LValue lvalue =3316    CGF.EmitCheckedLValue(e->getLHS(), CodeGenFunction::TCK_Store);3317  CGF.EmitStoreThroughLValue(RValue::get(asImpl().getValueOfResult(result)),3318                             lvalue);3319 3320  return result;3321}3322 3323template <typename Impl, typename Result>3324Result3325ARCExprEmitter<Impl,Result>::visitBinAssignAutoreleasing(const BinaryOperator *e) {3326  return asImpl().visitExpr(e);3327}3328 3329template <typename Impl, typename Result>3330Result3331ARCExprEmitter<Impl,Result>::visitBinAssignWeak(const BinaryOperator *e) {3332  return asImpl().visitExpr(e);3333}3334 3335template <typename Impl, typename Result>3336Result3337ARCExprEmitter<Impl,Result>::visitBinAssignStrong(const BinaryOperator *e) {3338  return asImpl().visitExpr(e);3339}3340 3341/// The general expression-emission logic.3342template <typename Impl, typename Result>3343Result ARCExprEmitter<Impl,Result>::visit(const Expr *e) {3344  // We should *never* see a nested full-expression here, because if3345  // we fail to emit at +1, our caller must not retain after we close3346  // out the full-expression.  This isn't as important in the unsafe3347  // emitter.3348  assert(!isa<ExprWithCleanups>(e));3349 3350  // Look through parens, __extension__, generic selection, etc.3351  e = e->IgnoreParens();3352 3353  // Handle certain kinds of casts.3354  if (const CastExpr *ce = dyn_cast<CastExpr>(e)) {3355    return asImpl().visitCastExpr(ce);3356 3357  // Handle the comma operator.3358  } else if (auto op = dyn_cast<BinaryOperator>(e)) {3359    return asImpl().visitBinaryOperator(op);3360 3361  // TODO: handle conditional operators here3362 3363  // For calls and message sends, use the retained-call logic.3364  // Delegate inits are a special case in that they're the only3365  // returns-retained expression that *isn't* surrounded by3366  // a consume.3367  } else if (isa<CallExpr>(e) ||3368             (isa<ObjCMessageExpr>(e) &&3369              !cast<ObjCMessageExpr>(e)->isDelegateInitCall())) {3370    return asImpl().visitCall(e);3371 3372  // Look through pseudo-object expressions.3373  } else if (const PseudoObjectExpr *pseudo = dyn_cast<PseudoObjectExpr>(e)) {3374    return asImpl().visitPseudoObjectExpr(pseudo);3375  } else if (auto *be = dyn_cast<BlockExpr>(e))3376    return asImpl().visitBlockExpr(be);3377 3378  return asImpl().visitExpr(e);3379}3380 3381namespace {3382 3383/// An emitter for +1 results.3384struct ARCRetainExprEmitter :3385  public ARCExprEmitter<ARCRetainExprEmitter, TryEmitResult> {3386 3387  ARCRetainExprEmitter(CodeGenFunction &CGF) : ARCExprEmitter(CGF) {}3388 3389  llvm::Value *getValueOfResult(TryEmitResult result) {3390    return result.getPointer();3391  }3392 3393  TryEmitResult emitBitCast(TryEmitResult result, llvm::Type *resultType) {3394    llvm::Value *value = result.getPointer();3395    value = CGF.Builder.CreateBitCast(value, resultType);3396    result.setPointer(value);3397    return result;3398  }3399 3400  TryEmitResult visitLValueToRValue(const Expr *e) {3401    return tryEmitARCRetainLoadOfScalar(CGF, e);3402  }3403 3404  /// For consumptions, just emit the subexpression and thus elide3405  /// the retain/release pair.3406  TryEmitResult visitConsumeObject(const Expr *e) {3407    llvm::Value *result = CGF.EmitScalarExpr(e);3408    return TryEmitResult(result, true);3409  }3410 3411  TryEmitResult visitBlockExpr(const BlockExpr *e) {3412    TryEmitResult result = visitExpr(e);3413    // Avoid the block-retain if this is a block literal that doesn't need to be3414    // copied to the heap.3415    if (CGF.CGM.getCodeGenOpts().ObjCAvoidHeapifyLocalBlocks &&3416        e->getBlockDecl()->canAvoidCopyToHeap())3417      result.setInt(true);3418    return result;3419  }3420 3421  /// Block extends are net +0.  Naively, we could just recurse on3422  /// the subexpression, but actually we need to ensure that the3423  /// value is copied as a block, so there's a little filter here.3424  TryEmitResult visitExtendBlockObject(const Expr *e) {3425    llvm::Value *result; // will be a +0 value3426 3427    // If we can't safely assume the sub-expression will produce a3428    // block-copied value, emit the sub-expression at +0.3429    if (shouldEmitSeparateBlockRetain(e)) {3430      result = CGF.EmitScalarExpr(e);3431 3432    // Otherwise, try to emit the sub-expression at +1 recursively.3433    } else {3434      TryEmitResult subresult = asImpl().visit(e);3435 3436      // If that produced a retained value, just use that.3437      if (subresult.getInt()) {3438        return subresult;3439      }3440 3441      // Otherwise it's +0.3442      result = subresult.getPointer();3443    }3444 3445    // Retain the object as a block.3446    result = CGF.EmitARCRetainBlock(result, /*mandatory*/ true);3447    return TryEmitResult(result, true);3448  }3449 3450  /// For reclaims, emit the subexpression as a retained call and3451  /// skip the consumption.3452  TryEmitResult visitReclaimReturnedObject(const Expr *e) {3453    llvm::Value *result = emitARCRetainCallResult(CGF, e);3454    return TryEmitResult(result, true);3455  }3456 3457  /// When we have an undecorated call, retroactively do a claim.3458  TryEmitResult visitCall(const Expr *e) {3459    llvm::Value *result = emitARCRetainCallResult(CGF, e);3460    return TryEmitResult(result, true);3461  }3462 3463  // TODO: maybe special-case visitBinAssignWeak?3464 3465  TryEmitResult visitExpr(const Expr *e) {3466    // We didn't find an obvious production, so emit what we've got and3467    // tell the caller that we didn't manage to retain.3468    llvm::Value *result = CGF.EmitScalarExpr(e);3469    return TryEmitResult(result, false);3470  }3471};3472}3473 3474static TryEmitResult3475tryEmitARCRetainScalarExpr(CodeGenFunction &CGF, const Expr *e) {3476  return ARCRetainExprEmitter(CGF).visit(e);3477}3478 3479static llvm::Value *emitARCRetainLoadOfScalar(CodeGenFunction &CGF,3480                                                LValue lvalue,3481                                                QualType type) {3482  TryEmitResult result = tryEmitARCRetainLoadOfScalar(CGF, lvalue, type);3483  llvm::Value *value = result.getPointer();3484  if (!result.getInt())3485    value = CGF.EmitARCRetain(type, value);3486  return value;3487}3488 3489/// EmitARCRetainScalarExpr - Semantically equivalent to3490/// EmitARCRetainObject(e->getType(), EmitScalarExpr(e)), but making a3491/// best-effort attempt to peephole expressions that naturally produce3492/// retained objects.3493llvm::Value *CodeGenFunction::EmitARCRetainScalarExpr(const Expr *e) {3494  // The retain needs to happen within the full-expression.3495  if (const ExprWithCleanups *cleanups = dyn_cast<ExprWithCleanups>(e)) {3496    RunCleanupsScope scope(*this);3497    return EmitARCRetainScalarExpr(cleanups->getSubExpr());3498  }3499 3500  TryEmitResult result = tryEmitARCRetainScalarExpr(*this, e);3501  llvm::Value *value = result.getPointer();3502  if (!result.getInt())3503    value = EmitARCRetain(e->getType(), value);3504  return value;3505}3506 3507llvm::Value *3508CodeGenFunction::EmitARCRetainAutoreleaseScalarExpr(const Expr *e) {3509  // The retain needs to happen within the full-expression.3510  if (const ExprWithCleanups *cleanups = dyn_cast<ExprWithCleanups>(e)) {3511    RunCleanupsScope scope(*this);3512    return EmitARCRetainAutoreleaseScalarExpr(cleanups->getSubExpr());3513  }3514 3515  TryEmitResult result = tryEmitARCRetainScalarExpr(*this, e);3516  llvm::Value *value = result.getPointer();3517  if (result.getInt())3518    value = EmitARCAutorelease(value);3519  else3520    value = EmitARCRetainAutorelease(e->getType(), value);3521  return value;3522}3523 3524llvm::Value *CodeGenFunction::EmitARCExtendBlockObject(const Expr *e) {3525  llvm::Value *result;3526  bool doRetain;3527 3528  if (shouldEmitSeparateBlockRetain(e)) {3529    result = EmitScalarExpr(e);3530    doRetain = true;3531  } else {3532    TryEmitResult subresult = tryEmitARCRetainScalarExpr(*this, e);3533    result = subresult.getPointer();3534    doRetain = !subresult.getInt();3535  }3536 3537  if (doRetain)3538    result = EmitARCRetainBlock(result, /*mandatory*/ true);3539  return EmitObjCConsumeObject(e->getType(), result);3540}3541 3542llvm::Value *CodeGenFunction::EmitObjCThrowOperand(const Expr *expr) {3543  // In ARC, retain and autorelease the expression.3544  if (getLangOpts().ObjCAutoRefCount) {3545    // Do so before running any cleanups for the full-expression.3546    // EmitARCRetainAutoreleaseScalarExpr does this for us.3547    return EmitARCRetainAutoreleaseScalarExpr(expr);3548  }3549 3550  // Otherwise, use the normal scalar-expression emission.  The3551  // exception machinery doesn't do anything special with the3552  // exception like retaining it, so there's no safety associated with3553  // only running cleanups after the throw has started, and when it3554  // matters it tends to be substantially inferior code.3555  return EmitScalarExpr(expr);3556}3557 3558namespace {3559 3560/// An emitter for assigning into an __unsafe_unretained context.3561struct ARCUnsafeUnretainedExprEmitter :3562  public ARCExprEmitter<ARCUnsafeUnretainedExprEmitter, llvm::Value*> {3563 3564  ARCUnsafeUnretainedExprEmitter(CodeGenFunction &CGF) : ARCExprEmitter(CGF) {}3565 3566  llvm::Value *getValueOfResult(llvm::Value *value) {3567    return value;3568  }3569 3570  llvm::Value *emitBitCast(llvm::Value *value, llvm::Type *resultType) {3571    return CGF.Builder.CreateBitCast(value, resultType);3572  }3573 3574  llvm::Value *visitLValueToRValue(const Expr *e) {3575    return CGF.EmitScalarExpr(e);3576  }3577 3578  /// For consumptions, just emit the subexpression and perform the3579  /// consumption like normal.3580  llvm::Value *visitConsumeObject(const Expr *e) {3581    llvm::Value *value = CGF.EmitScalarExpr(e);3582    return CGF.EmitObjCConsumeObject(e->getType(), value);3583  }3584 3585  /// No special logic for block extensions.  (This probably can't3586  /// actually happen in this emitter, though.)3587  llvm::Value *visitExtendBlockObject(const Expr *e) {3588    return CGF.EmitARCExtendBlockObject(e);3589  }3590 3591  /// For reclaims, perform an unsafeClaim if that's enabled.3592  llvm::Value *visitReclaimReturnedObject(const Expr *e) {3593    return CGF.EmitARCReclaimReturnedObject(e, /*unsafe*/ true);3594  }3595 3596  /// When we have an undecorated call, just emit it without adding3597  /// the unsafeClaim.3598  llvm::Value *visitCall(const Expr *e) {3599    return CGF.EmitScalarExpr(e);3600  }3601 3602  /// Just do normal scalar emission in the default case.3603  llvm::Value *visitExpr(const Expr *e) {3604    return CGF.EmitScalarExpr(e);3605  }3606};3607}3608 3609static llvm::Value *emitARCUnsafeUnretainedScalarExpr(CodeGenFunction &CGF,3610                                                      const Expr *e) {3611  return ARCUnsafeUnretainedExprEmitter(CGF).visit(e);3612}3613 3614/// EmitARCUnsafeUnretainedScalarExpr - Semantically equivalent to3615/// immediately releasing the resut of EmitARCRetainScalarExpr, but3616/// avoiding any spurious retains, including by performing reclaims3617/// with objc_unsafeClaimAutoreleasedReturnValue.3618llvm::Value *CodeGenFunction::EmitARCUnsafeUnretainedScalarExpr(const Expr *e) {3619  // Look through full-expressions.3620  if (const ExprWithCleanups *cleanups = dyn_cast<ExprWithCleanups>(e)) {3621    RunCleanupsScope scope(*this);3622    return emitARCUnsafeUnretainedScalarExpr(*this, cleanups->getSubExpr());3623  }3624 3625  return emitARCUnsafeUnretainedScalarExpr(*this, e);3626}3627 3628std::pair<LValue,llvm::Value*>3629CodeGenFunction::EmitARCStoreUnsafeUnretained(const BinaryOperator *e,3630                                              bool ignored) {3631  // Evaluate the RHS first.  If we're ignoring the result, assume3632  // that we can emit at an unsafe +0.3633  llvm::Value *value;3634  if (ignored) {3635    value = EmitARCUnsafeUnretainedScalarExpr(e->getRHS());3636  } else {3637    value = EmitScalarExpr(e->getRHS());3638  }3639 3640  // Emit the LHS and perform the store.3641  LValue lvalue = EmitLValue(e->getLHS());3642  EmitStoreOfScalar(value, lvalue);3643 3644  return std::pair<LValue,llvm::Value*>(std::move(lvalue), value);3645}3646 3647std::pair<LValue,llvm::Value*>3648CodeGenFunction::EmitARCStoreStrong(const BinaryOperator *e,3649                                    bool ignored) {3650  // Evaluate the RHS first.3651  TryEmitResult result = tryEmitARCRetainScalarExpr(*this, e->getRHS());3652  llvm::Value *value = result.getPointer();3653 3654  bool hasImmediateRetain = result.getInt();3655 3656  // If we didn't emit a retained object, and the l-value is of block3657  // type, then we need to emit the block-retain immediately in case3658  // it invalidates the l-value.3659  if (!hasImmediateRetain && e->getType()->isBlockPointerType()) {3660    value = EmitARCRetainBlock(value, /*mandatory*/ false);3661    hasImmediateRetain = true;3662  }3663 3664  LValue lvalue = EmitLValue(e->getLHS());3665 3666  // If the RHS was emitted retained, expand this.3667  if (hasImmediateRetain) {3668    llvm::Value *oldValue = EmitLoadOfScalar(lvalue, SourceLocation());3669    EmitStoreOfScalar(value, lvalue);3670    EmitARCRelease(oldValue, lvalue.isARCPreciseLifetime());3671  } else {3672    value = EmitARCStoreStrong(lvalue, value, ignored);3673  }3674 3675  return std::pair<LValue,llvm::Value*>(lvalue, value);3676}3677 3678std::pair<LValue,llvm::Value*>3679CodeGenFunction::EmitARCStoreAutoreleasing(const BinaryOperator *e) {3680  llvm::Value *value = EmitARCRetainAutoreleaseScalarExpr(e->getRHS());3681  LValue lvalue = EmitLValue(e->getLHS());3682 3683  EmitStoreOfScalar(value, lvalue);3684 3685  return std::pair<LValue,llvm::Value*>(lvalue, value);3686}3687 3688void CodeGenFunction::EmitObjCAutoreleasePoolStmt(3689                                          const ObjCAutoreleasePoolStmt &ARPS) {3690  const Stmt *subStmt = ARPS.getSubStmt();3691  const CompoundStmt &S = cast<CompoundStmt>(*subStmt);3692 3693  CGDebugInfo *DI = getDebugInfo();3694  if (DI)3695    DI->EmitLexicalBlockStart(Builder, S.getLBracLoc());3696 3697  // Keep track of the current cleanup stack depth.3698  RunCleanupsScope Scope(*this);3699  if (CGM.getLangOpts().ObjCRuntime.hasNativeARC()) {3700    llvm::Value *token = EmitObjCAutoreleasePoolPush();3701    EHStack.pushCleanup<CallObjCAutoreleasePoolObject>(NormalCleanup, token);3702  } else {3703    llvm::Value *token = EmitObjCMRRAutoreleasePoolPush();3704    EHStack.pushCleanup<CallObjCMRRAutoreleasePoolObject>(NormalCleanup, token);3705  }3706 3707  for (const auto *I : S.body())3708    EmitStmt(I);3709 3710  if (DI)3711    DI->EmitLexicalBlockEnd(Builder, S.getRBracLoc());3712}3713 3714/// EmitExtendGCLifetime - Given a pointer to an Objective-C object,3715/// make sure it survives garbage collection until this point.3716void CodeGenFunction::EmitExtendGCLifetime(llvm::Value *object) {3717  // We just use an inline assembly.3718  llvm::FunctionType *extenderType3719    = llvm::FunctionType::get(VoidTy, VoidPtrTy, RequiredArgs::All);3720  llvm::InlineAsm *extender = llvm::InlineAsm::get(extenderType,3721                                                   /* assembly */ "",3722                                                   /* constraints */ "r",3723                                                   /* side effects */ true);3724 3725  EmitNounwindRuntimeCall(extender, object);3726}3727 3728/// GenerateObjCAtomicSetterCopyHelperFunction - Given a c++ object type with3729/// non-trivial copy assignment function, produce following helper function.3730/// static void copyHelper(Ty *dest, const Ty *source) { *dest = *source; }3731///3732llvm::Constant *3733CodeGenFunction::GenerateObjCAtomicSetterCopyHelperFunction(3734                                        const ObjCPropertyImplDecl *PID) {3735  const ObjCPropertyDecl *PD = PID->getPropertyDecl();3736  if ((!(PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_atomic)))3737    return nullptr;3738 3739  QualType Ty = PID->getPropertyIvarDecl()->getType();3740  ASTContext &C = getContext();3741 3742  if (Ty.isNonTrivialToPrimitiveCopy() == QualType::PCK_Struct) {3743    // Call the move assignment operator instead of calling the copy assignment3744    // operator and destructor.3745    CharUnits Alignment = C.getTypeAlignInChars(Ty);3746    llvm::Constant *Fn = getNonTrivialCStructMoveAssignmentOperator(3747        CGM, Alignment, Alignment, Ty.isVolatileQualified(), Ty);3748    return Fn;3749  }3750 3751  if (!getLangOpts().CPlusPlus ||3752      !getLangOpts().ObjCRuntime.hasAtomicCopyHelper())3753    return nullptr;3754  if (!Ty->isRecordType())3755    return nullptr;3756  llvm::Constant *HelperFn = nullptr;3757  if (hasTrivialSetExpr(PID))3758    return nullptr;3759  assert(PID->getSetterCXXAssignment() && "SetterCXXAssignment - null");3760  if ((HelperFn = CGM.getAtomicSetterHelperFnMap(Ty)))3761    return HelperFn;3762 3763  const IdentifierInfo *II =3764      &CGM.getContext().Idents.get("__assign_helper_atomic_property_");3765 3766  QualType ReturnTy = C.VoidTy;3767  QualType DestTy = C.getPointerType(Ty);3768  QualType SrcTy = Ty;3769  SrcTy.addConst();3770  SrcTy = C.getPointerType(SrcTy);3771 3772  SmallVector<QualType, 2> ArgTys;3773  ArgTys.push_back(DestTy);3774  ArgTys.push_back(SrcTy);3775  QualType FunctionTy = C.getFunctionType(ReturnTy, ArgTys, {});3776 3777  FunctionDecl *FD = FunctionDecl::Create(3778      C, C.getTranslationUnitDecl(), SourceLocation(), SourceLocation(), II,3779      FunctionTy, nullptr, SC_Static, false, false, false);3780 3781  FunctionArgList args;3782  ParmVarDecl *Params[2];3783  ParmVarDecl *DstDecl = ParmVarDecl::Create(3784      C, FD, SourceLocation(), SourceLocation(), nullptr, DestTy,3785      C.getTrivialTypeSourceInfo(DestTy, SourceLocation()), SC_None,3786      /*DefArg=*/nullptr);3787  args.push_back(Params[0] = DstDecl);3788  ParmVarDecl *SrcDecl = ParmVarDecl::Create(3789      C, FD, SourceLocation(), SourceLocation(), nullptr, SrcTy,3790      C.getTrivialTypeSourceInfo(SrcTy, SourceLocation()), SC_None,3791      /*DefArg=*/nullptr);3792  args.push_back(Params[1] = SrcDecl);3793  FD->setParams(Params);3794 3795  const CGFunctionInfo &FI =3796      CGM.getTypes().arrangeBuiltinFunctionDeclaration(ReturnTy, args);3797 3798  llvm::FunctionType *LTy = CGM.getTypes().GetFunctionType(FI);3799 3800  llvm::Function *Fn =3801    llvm::Function::Create(LTy, llvm::GlobalValue::InternalLinkage,3802                           "__assign_helper_atomic_property_",3803                           &CGM.getModule());3804 3805  CGM.SetInternalFunctionAttributes(GlobalDecl(), Fn, FI);3806 3807  StartFunction(FD, ReturnTy, Fn, FI, args);3808 3809  DeclRefExpr DstExpr(C, DstDecl, false, DestTy, VK_PRValue, SourceLocation());3810  UnaryOperator *DST = UnaryOperator::Create(3811      C, &DstExpr, UO_Deref, DestTy->getPointeeType(), VK_LValue, OK_Ordinary,3812      SourceLocation(), false, FPOptionsOverride());3813 3814  DeclRefExpr SrcExpr(C, SrcDecl, false, SrcTy, VK_PRValue, SourceLocation());3815  UnaryOperator *SRC = UnaryOperator::Create(3816      C, &SrcExpr, UO_Deref, SrcTy->getPointeeType(), VK_LValue, OK_Ordinary,3817      SourceLocation(), false, FPOptionsOverride());3818 3819  Expr *Args[2] = {DST, SRC};3820  CallExpr *CalleeExp = cast<CallExpr>(PID->getSetterCXXAssignment());3821  CXXOperatorCallExpr *TheCall = CXXOperatorCallExpr::Create(3822      C, OO_Equal, CalleeExp->getCallee(), Args, DestTy->getPointeeType(),3823      VK_LValue, SourceLocation(), FPOptionsOverride());3824 3825  EmitStmt(TheCall);3826 3827  FinishFunction();3828  HelperFn = Fn;3829  CGM.setAtomicSetterHelperFnMap(Ty, HelperFn);3830  return HelperFn;3831}3832 3833llvm::Constant *CodeGenFunction::GenerateObjCAtomicGetterCopyHelperFunction(3834    const ObjCPropertyImplDecl *PID) {3835  const ObjCPropertyDecl *PD = PID->getPropertyDecl();3836  if ((!(PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_atomic)))3837    return nullptr;3838 3839  QualType Ty = PD->getType();3840  ASTContext &C = getContext();3841 3842  if (Ty.isNonTrivialToPrimitiveCopy() == QualType::PCK_Struct) {3843    CharUnits Alignment = C.getTypeAlignInChars(Ty);3844    llvm::Constant *Fn = getNonTrivialCStructCopyConstructor(3845        CGM, Alignment, Alignment, Ty.isVolatileQualified(), Ty);3846    return Fn;3847  }3848 3849  if (!getLangOpts().CPlusPlus ||3850      !getLangOpts().ObjCRuntime.hasAtomicCopyHelper())3851    return nullptr;3852  if (!Ty->isRecordType())3853    return nullptr;3854  llvm::Constant *HelperFn = nullptr;3855  if (hasTrivialGetExpr(PID))3856    return nullptr;3857  assert(PID->getGetterCXXConstructor() && "getGetterCXXConstructor - null");3858  if ((HelperFn = CGM.getAtomicGetterHelperFnMap(Ty)))3859    return HelperFn;3860 3861  const IdentifierInfo *II =3862      &CGM.getContext().Idents.get("__copy_helper_atomic_property_");3863 3864  QualType ReturnTy = C.VoidTy;3865  QualType DestTy = C.getPointerType(Ty);3866  QualType SrcTy = Ty;3867  SrcTy.addConst();3868  SrcTy = C.getPointerType(SrcTy);3869 3870  SmallVector<QualType, 2> ArgTys;3871  ArgTys.push_back(DestTy);3872  ArgTys.push_back(SrcTy);3873  QualType FunctionTy = C.getFunctionType(ReturnTy, ArgTys, {});3874 3875  FunctionDecl *FD = FunctionDecl::Create(3876      C, C.getTranslationUnitDecl(), SourceLocation(), SourceLocation(), II,3877      FunctionTy, nullptr, SC_Static, false, false, false);3878 3879  FunctionArgList args;3880  ParmVarDecl *Params[2];3881  ParmVarDecl *DstDecl = ParmVarDecl::Create(3882      C, FD, SourceLocation(), SourceLocation(), nullptr, DestTy,3883      C.getTrivialTypeSourceInfo(DestTy, SourceLocation()), SC_None,3884      /*DefArg=*/nullptr);3885  args.push_back(Params[0] = DstDecl);3886  ParmVarDecl *SrcDecl = ParmVarDecl::Create(3887      C, FD, SourceLocation(), SourceLocation(), nullptr, SrcTy,3888      C.getTrivialTypeSourceInfo(SrcTy, SourceLocation()), SC_None,3889      /*DefArg=*/nullptr);3890  args.push_back(Params[1] = SrcDecl);3891  FD->setParams(Params);3892 3893  const CGFunctionInfo &FI =3894      CGM.getTypes().arrangeBuiltinFunctionDeclaration(ReturnTy, args);3895 3896  llvm::FunctionType *LTy = CGM.getTypes().GetFunctionType(FI);3897 3898  llvm::Function *Fn = llvm::Function::Create(3899      LTy, llvm::GlobalValue::InternalLinkage, "__copy_helper_atomic_property_",3900      &CGM.getModule());3901 3902  CGM.SetInternalFunctionAttributes(GlobalDecl(), Fn, FI);3903 3904  StartFunction(FD, ReturnTy, Fn, FI, args);3905 3906  DeclRefExpr SrcExpr(getContext(), SrcDecl, false, SrcTy, VK_PRValue,3907                      SourceLocation());3908 3909  UnaryOperator *SRC = UnaryOperator::Create(3910      C, &SrcExpr, UO_Deref, SrcTy->getPointeeType(), VK_LValue, OK_Ordinary,3911      SourceLocation(), false, FPOptionsOverride());3912 3913  CXXConstructExpr *CXXConstExpr =3914    cast<CXXConstructExpr>(PID->getGetterCXXConstructor());3915 3916  SmallVector<Expr*, 4> ConstructorArgs;3917  ConstructorArgs.push_back(SRC);3918  ConstructorArgs.append(std::next(CXXConstExpr->arg_begin()),3919                         CXXConstExpr->arg_end());3920 3921  CXXConstructExpr *TheCXXConstructExpr =3922    CXXConstructExpr::Create(C, Ty, SourceLocation(),3923                             CXXConstExpr->getConstructor(),3924                             CXXConstExpr->isElidable(),3925                             ConstructorArgs,3926                             CXXConstExpr->hadMultipleCandidates(),3927                             CXXConstExpr->isListInitialization(),3928                             CXXConstExpr->isStdInitListInitialization(),3929                             CXXConstExpr->requiresZeroInitialization(),3930                             CXXConstExpr->getConstructionKind(),3931                             SourceRange());3932 3933  DeclRefExpr DstExpr(getContext(), DstDecl, false, DestTy, VK_PRValue,3934                      SourceLocation());3935 3936  RValue DV = EmitAnyExpr(&DstExpr);3937  CharUnits Alignment =3938      getContext().getTypeAlignInChars(TheCXXConstructExpr->getType());3939  EmitAggExpr(TheCXXConstructExpr,3940              AggValueSlot::forAddr(3941                  Address(DV.getScalarVal(), ConvertTypeForMem(Ty), Alignment),3942                  Qualifiers(), AggValueSlot::IsDestructed,3943                  AggValueSlot::DoesNotNeedGCBarriers,3944                  AggValueSlot::IsNotAliased, AggValueSlot::DoesNotOverlap));3945 3946  FinishFunction();3947  HelperFn = Fn;3948  CGM.setAtomicGetterHelperFnMap(Ty, HelperFn);3949  return HelperFn;3950}3951 3952llvm::Value *3953CodeGenFunction::EmitBlockCopyAndAutorelease(llvm::Value *Block, QualType Ty) {3954  // Get selectors for retain/autorelease.3955  const IdentifierInfo *CopyID = &getContext().Idents.get("copy");3956  Selector CopySelector =3957      getContext().Selectors.getNullarySelector(CopyID);3958  const IdentifierInfo *AutoreleaseID = &getContext().Idents.get("autorelease");3959  Selector AutoreleaseSelector =3960      getContext().Selectors.getNullarySelector(AutoreleaseID);3961 3962  // Emit calls to retain/autorelease.3963  CGObjCRuntime &Runtime = CGM.getObjCRuntime();3964  llvm::Value *Val = Block;3965  RValue Result;3966  Result = Runtime.GenerateMessageSend(*this, ReturnValueSlot(),3967                                       Ty, CopySelector,3968                                       Val, CallArgList(), nullptr, nullptr);3969  Val = Result.getScalarVal();3970  Result = Runtime.GenerateMessageSend(*this, ReturnValueSlot(),3971                                       Ty, AutoreleaseSelector,3972                                       Val, CallArgList(), nullptr, nullptr);3973  Val = Result.getScalarVal();3974  return Val;3975}3976 3977static unsigned getBaseMachOPlatformID(const llvm::Triple &TT) {3978  switch (TT.getOS()) {3979  case llvm::Triple::Darwin:3980  case llvm::Triple::MacOSX:3981    return llvm::MachO::PLATFORM_MACOS;3982  case llvm::Triple::IOS:3983    return llvm::MachO::PLATFORM_IOS;3984  case llvm::Triple::TvOS:3985    return llvm::MachO::PLATFORM_TVOS;3986  case llvm::Triple::WatchOS:3987    return llvm::MachO::PLATFORM_WATCHOS;3988  case llvm::Triple::XROS:3989    return llvm::MachO::PLATFORM_XROS;3990  case llvm::Triple::DriverKit:3991    return llvm::MachO::PLATFORM_DRIVERKIT;3992  default:3993    return llvm::MachO::PLATFORM_UNKNOWN;3994  }3995}3996 3997static llvm::Value *emitIsPlatformVersionAtLeast(CodeGenFunction &CGF,3998                                                 const VersionTuple &Version) {3999  CodeGenModule &CGM = CGF.CGM;4000  // Note: we intend to support multi-platform version checks, so reserve4001  // the room for a dual platform checking invocation that will be4002  // implemented in the future.4003  llvm::SmallVector<llvm::Value *, 8> Args;4004 4005  auto EmitArgs = [&](const VersionTuple &Version, const llvm::Triple &TT) {4006    std::optional<unsigned> Min = Version.getMinor(),4007                            SMin = Version.getSubminor();4008    Args.push_back(4009        llvm::ConstantInt::get(CGM.Int32Ty, getBaseMachOPlatformID(TT)));4010    Args.push_back(llvm::ConstantInt::get(CGM.Int32Ty, Version.getMajor()));4011    Args.push_back(llvm::ConstantInt::get(CGM.Int32Ty, Min.value_or(0)));4012    Args.push_back(llvm::ConstantInt::get(CGM.Int32Ty, SMin.value_or(0)));4013  };4014 4015  assert(!Version.empty() && "unexpected empty version");4016  EmitArgs(Version, CGM.getTarget().getTriple());4017 4018  if (!CGM.IsPlatformVersionAtLeastFn) {4019    llvm::FunctionType *FTy = llvm::FunctionType::get(4020        CGM.Int32Ty, {CGM.Int32Ty, CGM.Int32Ty, CGM.Int32Ty, CGM.Int32Ty},4021        false);4022    CGM.IsPlatformVersionAtLeastFn =4023        CGM.CreateRuntimeFunction(FTy, "__isPlatformVersionAtLeast");4024  }4025 4026  llvm::Value *Check =4027      CGF.EmitNounwindRuntimeCall(CGM.IsPlatformVersionAtLeastFn, Args);4028  return CGF.Builder.CreateICmpNE(Check,4029                                  llvm::Constant::getNullValue(CGM.Int32Ty));4030}4031 4032llvm::Value *4033CodeGenFunction::EmitBuiltinAvailable(const VersionTuple &Version) {4034  // Darwin uses the new __isPlatformVersionAtLeast family of routines.4035  if (CGM.getTarget().getTriple().isOSDarwin())4036    return emitIsPlatformVersionAtLeast(*this, Version);4037 4038  if (!CGM.IsOSVersionAtLeastFn) {4039    llvm::FunctionType *FTy =4040        llvm::FunctionType::get(Int32Ty, {Int32Ty, Int32Ty, Int32Ty}, false);4041    CGM.IsOSVersionAtLeastFn =4042        CGM.CreateRuntimeFunction(FTy, "__isOSVersionAtLeast");4043  }4044 4045  std::optional<unsigned> Min = Version.getMinor(),4046                          SMin = Version.getSubminor();4047  llvm::Value *Args[] = {4048      llvm::ConstantInt::get(CGM.Int32Ty, Version.getMajor()),4049      llvm::ConstantInt::get(CGM.Int32Ty, Min.value_or(0)),4050      llvm::ConstantInt::get(CGM.Int32Ty, SMin.value_or(0))};4051 4052  llvm::Value *CallRes =4053      EmitNounwindRuntimeCall(CGM.IsOSVersionAtLeastFn, Args);4054 4055  return Builder.CreateICmpNE(CallRes, llvm::Constant::getNullValue(Int32Ty));4056}4057 4058static bool isFoundationNeededForDarwinAvailabilityCheck(4059    const llvm::Triple &TT, const VersionTuple &TargetVersion) {4060  VersionTuple FoundationDroppedInVersion;4061  switch (TT.getOS()) {4062  case llvm::Triple::IOS:4063  case llvm::Triple::TvOS:4064    FoundationDroppedInVersion = VersionTuple(/*Major=*/13);4065    break;4066  case llvm::Triple::WatchOS:4067    FoundationDroppedInVersion = VersionTuple(/*Major=*/6);4068    break;4069  case llvm::Triple::Darwin:4070  case llvm::Triple::MacOSX:4071    FoundationDroppedInVersion = VersionTuple(/*Major=*/10, /*Minor=*/15);4072    break;4073  case llvm::Triple::XROS:4074    // XROS doesn't need Foundation.4075    return false;4076  case llvm::Triple::DriverKit:4077    // DriverKit doesn't need Foundation.4078    return false;4079  default:4080    llvm_unreachable("Unexpected OS");4081  }4082  return TargetVersion < FoundationDroppedInVersion;4083}4084 4085void CodeGenModule::emitAtAvailableLinkGuard() {4086  if (!IsPlatformVersionAtLeastFn)4087    return;4088  // @available requires CoreFoundation only on Darwin.4089  if (!Target.getTriple().isOSDarwin())4090    return;4091  // @available doesn't need Foundation on macOS 10.15+, iOS/tvOS 13+, or4092  // watchOS 6+.4093  if (!isFoundationNeededForDarwinAvailabilityCheck(4094          Target.getTriple(), Target.getPlatformMinVersion()))4095    return;4096  // Add -framework CoreFoundation to the linker commands. We still want to4097  // emit the core foundation reference down below because otherwise if4098  // CoreFoundation is not used in the code, the linker won't link the4099  // framework.4100  auto &Context = getLLVMContext();4101  llvm::Metadata *Args[2] = {llvm::MDString::get(Context, "-framework"),4102                             llvm::MDString::get(Context, "CoreFoundation")};4103  LinkerOptionsMetadata.push_back(llvm::MDNode::get(Context, Args));4104  // Emit a reference to a symbol from CoreFoundation to ensure that4105  // CoreFoundation is linked into the final binary.4106  llvm::FunctionType *FTy =4107      llvm::FunctionType::get(Int32Ty, {VoidPtrTy}, false);4108  llvm::FunctionCallee CFFunc =4109      CreateRuntimeFunction(FTy, "CFBundleGetVersionNumber");4110 4111  llvm::FunctionType *CheckFTy = llvm::FunctionType::get(VoidTy, {}, false);4112  llvm::FunctionCallee CFLinkCheckFuncRef = CreateRuntimeFunction(4113      CheckFTy, "__clang_at_available_requires_core_foundation_framework",4114      llvm::AttributeList(), /*Local=*/true);4115  llvm::Function *CFLinkCheckFunc =4116      cast<llvm::Function>(CFLinkCheckFuncRef.getCallee()->stripPointerCasts());4117  if (CFLinkCheckFunc->empty()) {4118    CFLinkCheckFunc->setLinkage(llvm::GlobalValue::LinkOnceAnyLinkage);4119    CFLinkCheckFunc->setVisibility(llvm::GlobalValue::HiddenVisibility);4120    CodeGenFunction CGF(*this);4121    CGF.Builder.SetInsertPoint(CGF.createBasicBlock("", CFLinkCheckFunc));4122    CGF.EmitNounwindRuntimeCall(CFFunc,4123                                llvm::Constant::getNullValue(VoidPtrTy));4124    CGF.Builder.CreateUnreachable();4125    addCompilerUsedGlobal(CFLinkCheckFunc);4126  }4127}4128 4129CGObjCRuntime::~CGObjCRuntime() {}4130