CGObjC.cpp revision b6a6079449a5275c283982e19b0c38e165833bb2
1e81fdcb135d0325e3bc22fae0583555d20aae280Brendan Jackman//===---- CGBuiltin.cpp - Emit LLVM Code for builtins ---------------------===//
208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino//
308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino//                     The LLVM Compiler Infrastructure
408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino//
508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino// This file is distributed under the University of Illinois Open Source
608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino// License. See LICENSE.TXT for details.
708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino//
808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino//===----------------------------------------------------------------------===//
908f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino//
1008f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino// This contains code to emit Objective-C code as LLVM code.
1108f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino//
1208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino//===----------------------------------------------------------------------===//
1308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
1408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino#include "CGDebugInfo.h"
1508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino#include "CGObjCRuntime.h"
1608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino#include "CodeGenFunction.h"
1708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino#include "CodeGenModule.h"
1808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino#include "TargetInfo.h"
1908f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino#include "clang/AST/ASTContext.h"
2008f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino#include "clang/AST/DeclObjC.h"
2108f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino#include "clang/AST/StmtObjC.h"
2208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino#include "clang/Basic/Diagnostic.h"
2308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino#include "llvm/ADT/STLExtras.h"
2408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino#include "llvm/IR/DataLayout.h"
2508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino#include "llvm/IR/InlineAsm.h"
2608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merinousing namespace clang;
2708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merinousing namespace CodeGen;
2808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
2908f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merinotypedef llvm::PointerIntPair<llvm::Value*,1,bool> TryEmitResult;
3008f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merinostatic TryEmitResult
3108f3c34d0a24e7ffeff543e302efc911306e7beaJavi MerinotryEmitARCRetainScalarExpr(CodeGenFunction &CGF, const Expr *e);
3208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merinostatic RValue AdjustRelatedResultType(CodeGenFunction &CGF,
3308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                                      QualType ET,
3408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                                      const ObjCMethodDecl *Method,
3508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                                      RValue Result);
3608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
3708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino/// Given the address of a variable of pointer type, find the correct
3808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino/// null to store into it.
3908f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merinostatic llvm::Constant *getNullForVariable(llvm::Value *addr) {
4008f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  llvm::Type *type =
4108f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino    cast<llvm::PointerType>(addr->getType())->getElementType();
4208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  return llvm::ConstantPointerNull::get(cast<llvm::PointerType>(type));
4308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino}
4408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
4508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino/// Emits an instance of NSConstantString representing the object.
4608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merinollvm::Value *CodeGenFunction::EmitObjCStringLiteral(const ObjCStringLiteral *E)
4708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino{
4808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  llvm::Constant *C =
4908f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino      CGM.getObjCRuntime().GenerateConstantString(E->getString());
5008f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  // FIXME: This bitcast should just be made an invariant on the Runtime.
5108f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  return llvm::ConstantExpr::getBitCast(C, ConvertType(E->getType()));
5208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino}
5308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
5408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino/// EmitObjCBoxedExpr - This routine generates code to call
5508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino/// the appropriate expression boxing method. This will either be
5608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino/// one of +[NSNumber numberWith<Type>:], or +[NSString stringWithUTF8String:].
5708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino///
5808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merinollvm::Value *
5908f3c34d0a24e7ffeff543e302efc911306e7beaJavi MerinoCodeGenFunction::EmitObjCBoxedExpr(const ObjCBoxedExpr *E) {
6008f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  // Generate the correct selector for this literal's concrete type.
6108f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  const Expr *SubExpr = E->getSubExpr();
6208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  // Get the method.
6308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  const ObjCMethodDecl *BoxingMethod = E->getBoxingMethod();
6408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  assert(BoxingMethod && "BoxingMethod is null");
6508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  assert(BoxingMethod->isClassMethod() && "BoxingMethod must be a class method");
6608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  Selector Sel = BoxingMethod->getSelector();
6708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
6808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  // Generate a reference to the class pointer, which will be the receiver.
6908f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  // Assumes that the method was introduced in the class that should be
70b01c848f3928dfcdf2f3d7dae1343bbe677847efChris Redpath  // messaged (avoids pulling it out of the result type).
7108f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  CGObjCRuntime &Runtime = CGM.getObjCRuntime();
7208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  const ObjCInterfaceDecl *ClassDecl = BoxingMethod->getClassInterface();
7308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  llvm::Value *Receiver = Runtime.GetClass(*this, ClassDecl);
7408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
7508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  const ParmVarDecl *argDecl = *BoxingMethod->param_begin();
7608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  QualType ArgQT = argDecl->getType().getUnqualifiedType();
7708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  RValue RV = EmitAnyExpr(SubExpr);
7808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  CallArgList Args;
7908f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  Args.add(RV, ArgQT);
8008f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
8108f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  RValue result = Runtime.GenerateMessageSend(*this, ReturnValueSlot(),
8208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                                              BoxingMethod->getResultType(), Sel, Receiver, Args,
8308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                                              ClassDecl, BoxingMethod);
8408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  return Builder.CreateBitCast(result.getScalarVal(),
8508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                               ConvertType(E->getType()));
8608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino}
8708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
8808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merinollvm::Value *CodeGenFunction::EmitObjCCollectionLiteral(const Expr *E,
8908f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                                    const ObjCMethodDecl *MethodWithObjects) {
9008f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  ASTContext &Context = CGM.getContext();
9108f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  const ObjCDictionaryLiteral *DLE = 0;
9208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  const ObjCArrayLiteral *ALE = dyn_cast<ObjCArrayLiteral>(E);
9308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  if (!ALE)
9408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino    DLE = cast<ObjCDictionaryLiteral>(E);
9508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
9608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  // Compute the type of the array we're initializing.
9708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  uint64_t NumElements =
9808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino    ALE ? ALE->getNumElements() : DLE->getNumElements();
9908f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  llvm::APInt APNumElements(Context.getTypeSize(Context.getSizeType()),
10008f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                            NumElements);
10108f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  QualType ElementType = Context.getObjCIdType().withConst();
10208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  QualType ElementArrayType
10308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino    = Context.getConstantArrayType(ElementType, APNumElements,
10408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                                   ArrayType::Normal, /*IndexTypeQuals=*/0);
10508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
10608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  // Allocate the temporary array(s).
10708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  llvm::Value *Objects = CreateMemTemp(ElementArrayType, "objects");
10808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  llvm::Value *Keys = 0;
10908f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  if (DLE)
11008f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino    Keys = CreateMemTemp(ElementArrayType, "keys");
11108f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
11208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  // Perform the actual initialialization of the array(s).
11308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  for (uint64_t i = 0; i < NumElements; i++) {
11408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino    if (ALE) {
11508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino      // Emit the initializer.
11608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino      const Expr *Rhs = ALE->getElement(i);
11708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino      LValue LV = LValue::MakeAddr(Builder.CreateStructGEP(Objects, i),
11808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                                   ElementType,
11908f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                                   Context.getTypeAlignInChars(Rhs->getType()),
12008f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                                   Context);
12108f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino      EmitScalarInit(Rhs, /*D=*/0, LV, /*capturedByInit=*/false);
12208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino    } else {
12308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino      // Emit the key initializer.
12408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino      const Expr *Key = DLE->getKeyValueElement(i).Key;
12508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino      LValue KeyLV = LValue::MakeAddr(Builder.CreateStructGEP(Keys, i),
12608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                                      ElementType,
12708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                                    Context.getTypeAlignInChars(Key->getType()),
12808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                                      Context);
12908f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino      EmitScalarInit(Key, /*D=*/0, KeyLV, /*capturedByInit=*/false);
13008f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
13108f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino      // Emit the value initializer.
13208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino      const Expr *Value = DLE->getKeyValueElement(i).Value;
13308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino      LValue ValueLV = LValue::MakeAddr(Builder.CreateStructGEP(Objects, i),
13408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                                        ElementType,
13508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                                  Context.getTypeAlignInChars(Value->getType()),
13608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                                        Context);
137a951463b87e0a17229d5fcd426b0b05a4ffb0764Joel Fernandes      EmitScalarInit(Value, /*D=*/0, ValueLV, /*capturedByInit=*/false);
138a951463b87e0a17229d5fcd426b0b05a4ffb0764Joel Fernandes    }
139a951463b87e0a17229d5fcd426b0b05a4ffb0764Joel Fernandes  }
14002c452ef5bcfafe49450059f7927664a393e0235Joel Fernandes
14108f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  // Generate the argument list.
14208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino  CallArgList Args;
14302c452ef5bcfafe49450059f7927664a393e0235Joel Fernandes  ObjCMethodDecl::param_const_iterator PI = MethodWithObjects->param_begin();
14402c452ef5bcfafe49450059f7927664a393e0235Joel Fernandes  const ParmVarDecl *argDecl = *PI++;
14502c452ef5bcfafe49450059f7927664a393e0235Joel Fernandes  QualType ArgQT = argDecl->getType().getUnqualifiedType();
146  Args.add(RValue::get(Objects), ArgQT);
147  if (DLE) {
148    argDecl = *PI++;
149    ArgQT = argDecl->getType().getUnqualifiedType();
150    Args.add(RValue::get(Keys), ArgQT);
151  }
152  argDecl = *PI;
153  ArgQT = argDecl->getType().getUnqualifiedType();
154  llvm::Value *Count =
155    llvm::ConstantInt::get(CGM.getTypes().ConvertType(ArgQT), NumElements);
156  Args.add(RValue::get(Count), ArgQT);
157
158  // Generate a reference to the class pointer, which will be the receiver.
159  Selector Sel = MethodWithObjects->getSelector();
160  QualType ResultType = E->getType();
161  const ObjCObjectPointerType *InterfacePointerType
162    = ResultType->getAsObjCInterfacePointerType();
163  ObjCInterfaceDecl *Class
164    = InterfacePointerType->getObjectType()->getInterface();
165  CGObjCRuntime &Runtime = CGM.getObjCRuntime();
166  llvm::Value *Receiver = Runtime.GetClass(*this, Class);
167
168  // Generate the message send.
169  RValue result
170    = Runtime.GenerateMessageSend(*this, ReturnValueSlot(),
171                                  MethodWithObjects->getResultType(),
172                                  Sel,
173                                  Receiver, Args, Class,
174                                  MethodWithObjects);
175  return Builder.CreateBitCast(result.getScalarVal(),
176                               ConvertType(E->getType()));
177}
178
179llvm::Value *CodeGenFunction::EmitObjCArrayLiteral(const ObjCArrayLiteral *E) {
180  return EmitObjCCollectionLiteral(E, E->getArrayWithObjectsMethod());
181}
182
183llvm::Value *CodeGenFunction::EmitObjCDictionaryLiteral(
184                                            const ObjCDictionaryLiteral *E) {
185  return EmitObjCCollectionLiteral(E, E->getDictWithObjectsMethod());
186}
187
188/// Emit a selector.
189llvm::Value *CodeGenFunction::EmitObjCSelectorExpr(const ObjCSelectorExpr *E) {
190  // Untyped selector.
191  // Note that this implementation allows for non-constant strings to be passed
192  // as arguments to @selector().  Currently, the only thing preventing this
193  // behaviour is the type checking in the front end.
194  return CGM.getObjCRuntime().GetSelector(*this, E->getSelector());
195}
196
197llvm::Value *CodeGenFunction::EmitObjCProtocolExpr(const ObjCProtocolExpr *E) {
198  // FIXME: This should pass the Decl not the name.
199  return CGM.getObjCRuntime().GenerateProtocolRef(*this, E->getProtocol());
200}
201
202/// \brief Adjust the type of the result of an Objective-C message send
203/// expression when the method has a related result type.
204static RValue AdjustRelatedResultType(CodeGenFunction &CGF,
205                                      QualType ExpT,
206                                      const ObjCMethodDecl *Method,
207                                      RValue Result) {
208  if (!Method)
209    return Result;
210
211  if (!Method->hasRelatedResultType() ||
212      CGF.getContext().hasSameType(ExpT, Method->getResultType()) ||
213      !Result.isScalar())
214    return Result;
215
216  // We have applied a related result type. Cast the rvalue appropriately.
217  return RValue::get(CGF.Builder.CreateBitCast(Result.getScalarVal(),
218                                               CGF.ConvertType(ExpT)));
219}
220
221/// Decide whether to extend the lifetime of the receiver of a
222/// returns-inner-pointer message.
223static bool
224shouldExtendReceiverForInnerPointerMessage(const ObjCMessageExpr *message) {
225  switch (message->getReceiverKind()) {
226
227  // For a normal instance message, we should extend unless the
228  // receiver is loaded from a variable with precise lifetime.
229  case ObjCMessageExpr::Instance: {
230    const Expr *receiver = message->getInstanceReceiver();
231    const ImplicitCastExpr *ice = dyn_cast<ImplicitCastExpr>(receiver);
232    if (!ice || ice->getCastKind() != CK_LValueToRValue) return true;
233    receiver = ice->getSubExpr()->IgnoreParens();
234
235    // Only __strong variables.
236    if (receiver->getType().getObjCLifetime() != Qualifiers::OCL_Strong)
237      return true;
238
239    // All ivars and fields have precise lifetime.
240    if (isa<MemberExpr>(receiver) || isa<ObjCIvarRefExpr>(receiver))
241      return false;
242
243    // Otherwise, check for variables.
244    const DeclRefExpr *declRef = dyn_cast<DeclRefExpr>(ice->getSubExpr());
245    if (!declRef) return true;
246    const VarDecl *var = dyn_cast<VarDecl>(declRef->getDecl());
247    if (!var) return true;
248
249    // All variables have precise lifetime except local variables with
250    // automatic storage duration that aren't specially marked.
251    return (var->hasLocalStorage() &&
252            !var->hasAttr<ObjCPreciseLifetimeAttr>());
253  }
254
255  case ObjCMessageExpr::Class:
256  case ObjCMessageExpr::SuperClass:
257    // It's never necessary for class objects.
258    return false;
259
260  case ObjCMessageExpr::SuperInstance:
261    // We generally assume that 'self' lives throughout a method call.
262    return false;
263  }
264
265  llvm_unreachable("invalid receiver kind");
266}
267
268RValue CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E,
269                                            ReturnValueSlot Return) {
270  // Only the lookup mechanism and first two arguments of the method
271  // implementation vary between runtimes.  We can get the receiver and
272  // arguments in generic code.
273
274  bool isDelegateInit = E->isDelegateInitCall();
275
276  const ObjCMethodDecl *method = E->getMethodDecl();
277
278  // We don't retain the receiver in delegate init calls, and this is
279  // safe because the receiver value is always loaded from 'self',
280  // which we zero out.  We don't want to Block_copy block receivers,
281  // though.
282  bool retainSelf =
283    (!isDelegateInit &&
284     CGM.getLangOpts().ObjCAutoRefCount &&
285     method &&
286     method->hasAttr<NSConsumesSelfAttr>());
287
288  CGObjCRuntime &Runtime = CGM.getObjCRuntime();
289  bool isSuperMessage = false;
290  bool isClassMessage = false;
291  ObjCInterfaceDecl *OID = 0;
292  // Find the receiver
293  QualType ReceiverType;
294  llvm::Value *Receiver = 0;
295  switch (E->getReceiverKind()) {
296  case ObjCMessageExpr::Instance:
297    ReceiverType = E->getInstanceReceiver()->getType();
298    if (retainSelf) {
299      TryEmitResult ter = tryEmitARCRetainScalarExpr(*this,
300                                                   E->getInstanceReceiver());
301      Receiver = ter.getPointer();
302      if (ter.getInt()) retainSelf = false;
303    } else
304      Receiver = EmitScalarExpr(E->getInstanceReceiver());
305    break;
306
307  case ObjCMessageExpr::Class: {
308    ReceiverType = E->getClassReceiver();
309    const ObjCObjectType *ObjTy = ReceiverType->getAs<ObjCObjectType>();
310    assert(ObjTy && "Invalid Objective-C class message send");
311    OID = ObjTy->getInterface();
312    assert(OID && "Invalid Objective-C class message send");
313    Receiver = Runtime.GetClass(*this, OID);
314    isClassMessage = true;
315    break;
316  }
317
318  case ObjCMessageExpr::SuperInstance:
319    ReceiverType = E->getSuperType();
320    Receiver = LoadObjCSelf();
321    isSuperMessage = true;
322    break;
323
324  case ObjCMessageExpr::SuperClass:
325    ReceiverType = E->getSuperType();
326    Receiver = LoadObjCSelf();
327    isSuperMessage = true;
328    isClassMessage = true;
329    break;
330  }
331
332  if (retainSelf)
333    Receiver = EmitARCRetainNonBlock(Receiver);
334
335  // In ARC, we sometimes want to "extend the lifetime"
336  // (i.e. retain+autorelease) of receivers of returns-inner-pointer
337  // messages.
338  if (getLangOpts().ObjCAutoRefCount && method &&
339      method->hasAttr<ObjCReturnsInnerPointerAttr>() &&
340      shouldExtendReceiverForInnerPointerMessage(E))
341    Receiver = EmitARCRetainAutorelease(ReceiverType, Receiver);
342
343  QualType ResultType =
344    method ? method->getResultType() : E->getType();
345
346  CallArgList Args;
347  EmitCallArgs(Args, method, E->arg_begin(), E->arg_end());
348
349  // For delegate init calls in ARC, do an unsafe store of null into
350  // self.  This represents the call taking direct ownership of that
351  // value.  We have to do this after emitting the other call
352  // arguments because they might also reference self, but we don't
353  // have to worry about any of them modifying self because that would
354  // be an undefined read and write of an object in unordered
355  // expressions.
356  if (isDelegateInit) {
357    assert(getLangOpts().ObjCAutoRefCount &&
358           "delegate init calls should only be marked in ARC");
359
360    // Do an unsafe store of null into self.
361    llvm::Value *selfAddr =
362      LocalDeclMap[cast<ObjCMethodDecl>(CurCodeDecl)->getSelfDecl()];
363    assert(selfAddr && "no self entry for a delegate init call?");
364
365    Builder.CreateStore(getNullForVariable(selfAddr), selfAddr);
366  }
367
368  RValue result;
369  if (isSuperMessage) {
370    // super is only valid in an Objective-C method
371    const ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(CurFuncDecl);
372    bool isCategoryImpl = isa<ObjCCategoryImplDecl>(OMD->getDeclContext());
373    result = Runtime.GenerateMessageSendSuper(*this, Return, ResultType,
374                                              E->getSelector(),
375                                              OMD->getClassInterface(),
376                                              isCategoryImpl,
377                                              Receiver,
378                                              isClassMessage,
379                                              Args,
380                                              method);
381  } else {
382    result = Runtime.GenerateMessageSend(*this, Return, ResultType,
383                                         E->getSelector(),
384                                         Receiver, Args, OID,
385                                         method);
386  }
387
388  // For delegate init calls in ARC, implicitly store the result of
389  // the call back into self.  This takes ownership of the value.
390  if (isDelegateInit) {
391    llvm::Value *selfAddr =
392      LocalDeclMap[cast<ObjCMethodDecl>(CurCodeDecl)->getSelfDecl()];
393    llvm::Value *newSelf = result.getScalarVal();
394
395    // The delegate return type isn't necessarily a matching type; in
396    // fact, it's quite likely to be 'id'.
397    llvm::Type *selfTy =
398      cast<llvm::PointerType>(selfAddr->getType())->getElementType();
399    newSelf = Builder.CreateBitCast(newSelf, selfTy);
400
401    Builder.CreateStore(newSelf, selfAddr);
402  }
403
404  return AdjustRelatedResultType(*this, E->getType(), method, result);
405}
406
407namespace {
408struct FinishARCDealloc : EHScopeStack::Cleanup {
409  void Emit(CodeGenFunction &CGF, Flags flags) {
410    const ObjCMethodDecl *method = cast<ObjCMethodDecl>(CGF.CurCodeDecl);
411
412    const ObjCImplDecl *impl = cast<ObjCImplDecl>(method->getDeclContext());
413    const ObjCInterfaceDecl *iface = impl->getClassInterface();
414    if (!iface->getSuperClass()) return;
415
416    bool isCategory = isa<ObjCCategoryImplDecl>(impl);
417
418    // Call [super dealloc] if we have a superclass.
419    llvm::Value *self = CGF.LoadObjCSelf();
420
421    CallArgList args;
422    CGF.CGM.getObjCRuntime().GenerateMessageSendSuper(CGF, ReturnValueSlot(),
423                                                      CGF.getContext().VoidTy,
424                                                      method->getSelector(),
425                                                      iface,
426                                                      isCategory,
427                                                      self,
428                                                      /*is class msg*/ false,
429                                                      args,
430                                                      method);
431  }
432};
433}
434
435/// StartObjCMethod - Begin emission of an ObjCMethod. This generates
436/// the LLVM function and sets the other context used by
437/// CodeGenFunction.
438void CodeGenFunction::StartObjCMethod(const ObjCMethodDecl *OMD,
439                                      const ObjCContainerDecl *CD,
440                                      SourceLocation StartLoc) {
441  FunctionArgList args;
442  // Check if we should generate debug info for this method.
443  if (!OMD->hasAttr<NoDebugAttr>())
444    maybeInitializeDebugInfo();
445
446  llvm::Function *Fn = CGM.getObjCRuntime().GenerateMethod(OMD, CD);
447
448  const CGFunctionInfo &FI = CGM.getTypes().arrangeObjCMethodDeclaration(OMD);
449  CGM.SetInternalFunctionAttributes(OMD, Fn, FI);
450
451  args.push_back(OMD->getSelfDecl());
452  args.push_back(OMD->getCmdDecl());
453
454  for (ObjCMethodDecl::param_const_iterator PI = OMD->param_begin(),
455         E = OMD->param_end(); PI != E; ++PI)
456    args.push_back(*PI);
457
458  CurGD = OMD;
459
460  StartFunction(OMD, OMD->getResultType(), Fn, FI, args, StartLoc);
461
462  // In ARC, certain methods get an extra cleanup.
463  if (CGM.getLangOpts().ObjCAutoRefCount &&
464      OMD->isInstanceMethod() &&
465      OMD->getSelector().isUnarySelector()) {
466    const IdentifierInfo *ident =
467      OMD->getSelector().getIdentifierInfoForSlot(0);
468    if (ident->isStr("dealloc"))
469      EHStack.pushCleanup<FinishARCDealloc>(getARCCleanupKind());
470  }
471}
472
473static llvm::Value *emitARCRetainLoadOfScalar(CodeGenFunction &CGF,
474                                              LValue lvalue, QualType type);
475
476/// Generate an Objective-C method.  An Objective-C method is a C function with
477/// its pointer, name, and types registered in the class struture.
478void CodeGenFunction::GenerateObjCMethod(const ObjCMethodDecl *OMD) {
479  StartObjCMethod(OMD, OMD->getClassInterface(), OMD->getLocStart());
480  EmitStmt(OMD->getBody());
481  FinishFunction(OMD->getBodyRBrace());
482}
483
484/// emitStructGetterCall - Call the runtime function to load a property
485/// into the return value slot.
486static void emitStructGetterCall(CodeGenFunction &CGF, ObjCIvarDecl *ivar,
487                                 bool isAtomic, bool hasStrong) {
488  ASTContext &Context = CGF.getContext();
489
490  llvm::Value *src =
491    CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(), CGF.LoadObjCSelf(),
492                          ivar, 0).getAddress();
493
494  // objc_copyStruct (ReturnValue, &structIvar,
495  //                  sizeof (Type of Ivar), isAtomic, false);
496  CallArgList args;
497
498  llvm::Value *dest = CGF.Builder.CreateBitCast(CGF.ReturnValue, CGF.VoidPtrTy);
499  args.add(RValue::get(dest), Context.VoidPtrTy);
500
501  src = CGF.Builder.CreateBitCast(src, CGF.VoidPtrTy);
502  args.add(RValue::get(src), Context.VoidPtrTy);
503
504  CharUnits size = CGF.getContext().getTypeSizeInChars(ivar->getType());
505  args.add(RValue::get(CGF.CGM.getSize(size)), Context.getSizeType());
506  args.add(RValue::get(CGF.Builder.getInt1(isAtomic)), Context.BoolTy);
507  args.add(RValue::get(CGF.Builder.getInt1(hasStrong)), Context.BoolTy);
508
509  llvm::Value *fn = CGF.CGM.getObjCRuntime().GetGetStructFunction();
510  CGF.EmitCall(CGF.getTypes().arrangeFreeFunctionCall(Context.VoidTy, args,
511                                                      FunctionType::ExtInfo(),
512                                                      RequiredArgs::All),
513               fn, ReturnValueSlot(), args);
514}
515
516/// Determine whether the given architecture supports unaligned atomic
517/// accesses.  They don't have to be fast, just faster than a function
518/// call and a mutex.
519static bool hasUnalignedAtomics(llvm::Triple::ArchType arch) {
520  // FIXME: Allow unaligned atomic load/store on x86.  (It is not
521  // currently supported by the backend.)
522  return 0;
523}
524
525/// Return the maximum size that permits atomic accesses for the given
526/// architecture.
527static CharUnits getMaxAtomicAccessSize(CodeGenModule &CGM,
528                                        llvm::Triple::ArchType arch) {
529  // ARM has 8-byte atomic accesses, but it's not clear whether we
530  // want to rely on them here.
531
532  // In the default case, just assume that any size up to a pointer is
533  // fine given adequate alignment.
534  return CharUnits::fromQuantity(CGM.PointerSizeInBytes);
535}
536
537namespace {
538  class PropertyImplStrategy {
539  public:
540    enum StrategyKind {
541      /// The 'native' strategy is to use the architecture's provided
542      /// reads and writes.
543      Native,
544
545      /// Use objc_setProperty and objc_getProperty.
546      GetSetProperty,
547
548      /// Use objc_setProperty for the setter, but use expression
549      /// evaluation for the getter.
550      SetPropertyAndExpressionGet,
551
552      /// Use objc_copyStruct.
553      CopyStruct,
554
555      /// The 'expression' strategy is to emit normal assignment or
556      /// lvalue-to-rvalue expressions.
557      Expression
558    };
559
560    StrategyKind getKind() const { return StrategyKind(Kind); }
561
562    bool hasStrongMember() const { return HasStrong; }
563    bool isAtomic() const { return IsAtomic; }
564    bool isCopy() const { return IsCopy; }
565
566    CharUnits getIvarSize() const { return IvarSize; }
567    CharUnits getIvarAlignment() const { return IvarAlignment; }
568
569    PropertyImplStrategy(CodeGenModule &CGM,
570                         const ObjCPropertyImplDecl *propImpl);
571
572  private:
573    unsigned Kind : 8;
574    unsigned IsAtomic : 1;
575    unsigned IsCopy : 1;
576    unsigned HasStrong : 1;
577
578    CharUnits IvarSize;
579    CharUnits IvarAlignment;
580  };
581}
582
583/// Pick an implementation strategy for the given property synthesis.
584PropertyImplStrategy::PropertyImplStrategy(CodeGenModule &CGM,
585                                     const ObjCPropertyImplDecl *propImpl) {
586  const ObjCPropertyDecl *prop = propImpl->getPropertyDecl();
587  ObjCPropertyDecl::SetterKind setterKind = prop->getSetterKind();
588
589  IsCopy = (setterKind == ObjCPropertyDecl::Copy);
590  IsAtomic = prop->isAtomic();
591  HasStrong = false; // doesn't matter here.
592
593  // Evaluate the ivar's size and alignment.
594  ObjCIvarDecl *ivar = propImpl->getPropertyIvarDecl();
595  QualType ivarType = ivar->getType();
596  llvm::tie(IvarSize, IvarAlignment)
597    = CGM.getContext().getTypeInfoInChars(ivarType);
598
599  // If we have a copy property, we always have to use getProperty/setProperty.
600  // TODO: we could actually use setProperty and an expression for non-atomics.
601  if (IsCopy) {
602    Kind = GetSetProperty;
603    return;
604  }
605
606  // Handle retain.
607  if (setterKind == ObjCPropertyDecl::Retain) {
608    // In GC-only, there's nothing special that needs to be done.
609    if (CGM.getLangOpts().getGC() == LangOptions::GCOnly) {
610      // fallthrough
611
612    // In ARC, if the property is non-atomic, use expression emission,
613    // which translates to objc_storeStrong.  This isn't required, but
614    // it's slightly nicer.
615    } else if (CGM.getLangOpts().ObjCAutoRefCount && !IsAtomic) {
616      // Using standard expression emission for the setter is only
617      // acceptable if the ivar is __strong, which won't be true if
618      // the property is annotated with __attribute__((NSObject)).
619      // TODO: falling all the way back to objc_setProperty here is
620      // just laziness, though;  we could still use objc_storeStrong
621      // if we hacked it right.
622      if (ivarType.getObjCLifetime() == Qualifiers::OCL_Strong)
623        Kind = Expression;
624      else
625        Kind = SetPropertyAndExpressionGet;
626      return;
627
628    // Otherwise, we need to at least use setProperty.  However, if
629    // the property isn't atomic, we can use normal expression
630    // emission for the getter.
631    } else if (!IsAtomic) {
632      Kind = SetPropertyAndExpressionGet;
633      return;
634
635    // Otherwise, we have to use both setProperty and getProperty.
636    } else {
637      Kind = GetSetProperty;
638      return;
639    }
640  }
641
642  // If we're not atomic, just use expression accesses.
643  if (!IsAtomic) {
644    Kind = Expression;
645    return;
646  }
647
648  // Properties on bitfield ivars need to be emitted using expression
649  // accesses even if they're nominally atomic.
650  if (ivar->isBitField()) {
651    Kind = Expression;
652    return;
653  }
654
655  // GC-qualified or ARC-qualified ivars need to be emitted as
656  // expressions.  This actually works out to being atomic anyway,
657  // except for ARC __strong, but that should trigger the above code.
658  if (ivarType.hasNonTrivialObjCLifetime() ||
659      (CGM.getLangOpts().getGC() &&
660       CGM.getContext().getObjCGCAttrKind(ivarType))) {
661    Kind = Expression;
662    return;
663  }
664
665  // Compute whether the ivar has strong members.
666  if (CGM.getLangOpts().getGC())
667    if (const RecordType *recordType = ivarType->getAs<RecordType>())
668      HasStrong = recordType->getDecl()->hasObjectMember();
669
670  // We can never access structs with object members with a native
671  // access, because we need to use write barriers.  This is what
672  // objc_copyStruct is for.
673  if (HasStrong) {
674    Kind = CopyStruct;
675    return;
676  }
677
678  // Otherwise, this is target-dependent and based on the size and
679  // alignment of the ivar.
680
681  // If the size of the ivar is not a power of two, give up.  We don't
682  // want to get into the business of doing compare-and-swaps.
683  if (!IvarSize.isPowerOfTwo()) {
684    Kind = CopyStruct;
685    return;
686  }
687
688  llvm::Triple::ArchType arch =
689    CGM.getContext().getTargetInfo().getTriple().getArch();
690
691  // Most architectures require memory to fit within a single cache
692  // line, so the alignment has to be at least the size of the access.
693  // Otherwise we have to grab a lock.
694  if (IvarAlignment < IvarSize && !hasUnalignedAtomics(arch)) {
695    Kind = CopyStruct;
696    return;
697  }
698
699  // If the ivar's size exceeds the architecture's maximum atomic
700  // access size, we have to use CopyStruct.
701  if (IvarSize > getMaxAtomicAccessSize(CGM, arch)) {
702    Kind = CopyStruct;
703    return;
704  }
705
706  // Otherwise, we can use native loads and stores.
707  Kind = Native;
708}
709
710/// \brief Generate an Objective-C property getter function.
711///
712/// The given Decl must be an ObjCImplementationDecl. \@synthesize
713/// is illegal within a category.
714void CodeGenFunction::GenerateObjCGetter(ObjCImplementationDecl *IMP,
715                                         const ObjCPropertyImplDecl *PID) {
716  llvm::Constant *AtomicHelperFn =
717    GenerateObjCAtomicGetterCopyHelperFunction(PID);
718  const ObjCPropertyDecl *PD = PID->getPropertyDecl();
719  ObjCMethodDecl *OMD = PD->getGetterMethodDecl();
720  assert(OMD && "Invalid call to generate getter (empty method)");
721  StartObjCMethod(OMD, IMP->getClassInterface(), OMD->getLocStart());
722
723  generateObjCGetterBody(IMP, PID, OMD, AtomicHelperFn);
724
725  FinishFunction();
726}
727
728static bool hasTrivialGetExpr(const ObjCPropertyImplDecl *propImpl) {
729  const Expr *getter = propImpl->getGetterCXXConstructor();
730  if (!getter) return true;
731
732  // Sema only makes only of these when the ivar has a C++ class type,
733  // so the form is pretty constrained.
734
735  // If the property has a reference type, we might just be binding a
736  // reference, in which case the result will be a gl-value.  We should
737  // treat this as a non-trivial operation.
738  if (getter->isGLValue())
739    return false;
740
741  // If we selected a trivial copy-constructor, we're okay.
742  if (const CXXConstructExpr *construct = dyn_cast<CXXConstructExpr>(getter))
743    return (construct->getConstructor()->isTrivial());
744
745  // The constructor might require cleanups (in which case it's never
746  // trivial).
747  assert(isa<ExprWithCleanups>(getter));
748  return false;
749}
750
751/// emitCPPObjectAtomicGetterCall - Call the runtime function to
752/// copy the ivar into the resturn slot.
753static void emitCPPObjectAtomicGetterCall(CodeGenFunction &CGF,
754                                          llvm::Value *returnAddr,
755                                          ObjCIvarDecl *ivar,
756                                          llvm::Constant *AtomicHelperFn) {
757  // objc_copyCppObjectAtomic (&returnSlot, &CppObjectIvar,
758  //                           AtomicHelperFn);
759  CallArgList args;
760
761  // The 1st argument is the return Slot.
762  args.add(RValue::get(returnAddr), CGF.getContext().VoidPtrTy);
763
764  // The 2nd argument is the address of the ivar.
765  llvm::Value *ivarAddr =
766  CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(),
767                        CGF.LoadObjCSelf(), ivar, 0).getAddress();
768  ivarAddr = CGF.Builder.CreateBitCast(ivarAddr, CGF.Int8PtrTy);
769  args.add(RValue::get(ivarAddr), CGF.getContext().VoidPtrTy);
770
771  // Third argument is the helper function.
772  args.add(RValue::get(AtomicHelperFn), CGF.getContext().VoidPtrTy);
773
774  llvm::Value *copyCppAtomicObjectFn =
775    CGF.CGM.getObjCRuntime().GetCppAtomicObjectGetFunction();
776  CGF.EmitCall(CGF.getTypes().arrangeFreeFunctionCall(CGF.getContext().VoidTy,
777                                                      args,
778                                                      FunctionType::ExtInfo(),
779                                                      RequiredArgs::All),
780               copyCppAtomicObjectFn, ReturnValueSlot(), args);
781}
782
783void
784CodeGenFunction::generateObjCGetterBody(const ObjCImplementationDecl *classImpl,
785                                        const ObjCPropertyImplDecl *propImpl,
786                                        const ObjCMethodDecl *GetterMethodDecl,
787                                        llvm::Constant *AtomicHelperFn) {
788  // If there's a non-trivial 'get' expression, we just have to emit that.
789  if (!hasTrivialGetExpr(propImpl)) {
790    if (!AtomicHelperFn) {
791      ReturnStmt ret(SourceLocation(), propImpl->getGetterCXXConstructor(),
792                     /*nrvo*/ 0);
793      EmitReturnStmt(ret);
794    }
795    else {
796      ObjCIvarDecl *ivar = propImpl->getPropertyIvarDecl();
797      emitCPPObjectAtomicGetterCall(*this, ReturnValue,
798                                    ivar, AtomicHelperFn);
799    }
800    return;
801  }
802
803  const ObjCPropertyDecl *prop = propImpl->getPropertyDecl();
804  QualType propType = prop->getType();
805  ObjCMethodDecl *getterMethod = prop->getGetterMethodDecl();
806
807  ObjCIvarDecl *ivar = propImpl->getPropertyIvarDecl();
808
809  // Pick an implementation strategy.
810  PropertyImplStrategy strategy(CGM, propImpl);
811  switch (strategy.getKind()) {
812  case PropertyImplStrategy::Native: {
813    // We don't need to do anything for a zero-size struct.
814    if (strategy.getIvarSize().isZero())
815      return;
816
817    LValue LV = EmitLValueForIvar(TypeOfSelfObject(), LoadObjCSelf(), ivar, 0);
818
819    // Currently, all atomic accesses have to be through integer
820    // types, so there's no point in trying to pick a prettier type.
821    llvm::Type *bitcastType =
822      llvm::Type::getIntNTy(getLLVMContext(),
823                            getContext().toBits(strategy.getIvarSize()));
824    bitcastType = bitcastType->getPointerTo(); // addrspace 0 okay
825
826    // Perform an atomic load.  This does not impose ordering constraints.
827    llvm::Value *ivarAddr = LV.getAddress();
828    ivarAddr = Builder.CreateBitCast(ivarAddr, bitcastType);
829    llvm::LoadInst *load = Builder.CreateLoad(ivarAddr, "load");
830    load->setAlignment(strategy.getIvarAlignment().getQuantity());
831    load->setAtomic(llvm::Unordered);
832
833    // Store that value into the return address.  Doing this with a
834    // bitcast is likely to produce some pretty ugly IR, but it's not
835    // the *most* terrible thing in the world.
836    Builder.CreateStore(load, Builder.CreateBitCast(ReturnValue, bitcastType));
837
838    // Make sure we don't do an autorelease.
839    AutoreleaseResult = false;
840    return;
841  }
842
843  case PropertyImplStrategy::GetSetProperty: {
844    llvm::Value *getPropertyFn =
845      CGM.getObjCRuntime().GetPropertyGetFunction();
846    if (!getPropertyFn) {
847      CGM.ErrorUnsupported(propImpl, "Obj-C getter requiring atomic copy");
848      return;
849    }
850
851    // Return (ivar-type) objc_getProperty((id) self, _cmd, offset, true).
852    // FIXME: Can't this be simpler? This might even be worse than the
853    // corresponding gcc code.
854    llvm::Value *cmd =
855      Builder.CreateLoad(LocalDeclMap[getterMethod->getCmdDecl()], "cmd");
856    llvm::Value *self = Builder.CreateBitCast(LoadObjCSelf(), VoidPtrTy);
857    llvm::Value *ivarOffset =
858      EmitIvarOffset(classImpl->getClassInterface(), ivar);
859
860    CallArgList args;
861    args.add(RValue::get(self), getContext().getObjCIdType());
862    args.add(RValue::get(cmd), getContext().getObjCSelType());
863    args.add(RValue::get(ivarOffset), getContext().getPointerDiffType());
864    args.add(RValue::get(Builder.getInt1(strategy.isAtomic())),
865             getContext().BoolTy);
866
867    // FIXME: We shouldn't need to get the function info here, the
868    // runtime already should have computed it to build the function.
869    RValue RV = EmitCall(getTypes().arrangeFreeFunctionCall(propType, args,
870                                                       FunctionType::ExtInfo(),
871                                                            RequiredArgs::All),
872                         getPropertyFn, ReturnValueSlot(), args);
873
874    // We need to fix the type here. Ivars with copy & retain are
875    // always objects so we don't need to worry about complex or
876    // aggregates.
877    RV = RValue::get(Builder.CreateBitCast(RV.getScalarVal(),
878           getTypes().ConvertType(getterMethod->getResultType())));
879
880    EmitReturnOfRValue(RV, propType);
881
882    // objc_getProperty does an autorelease, so we should suppress ours.
883    AutoreleaseResult = false;
884
885    return;
886  }
887
888  case PropertyImplStrategy::CopyStruct:
889    emitStructGetterCall(*this, ivar, strategy.isAtomic(),
890                         strategy.hasStrongMember());
891    return;
892
893  case PropertyImplStrategy::Expression:
894  case PropertyImplStrategy::SetPropertyAndExpressionGet: {
895    LValue LV = EmitLValueForIvar(TypeOfSelfObject(), LoadObjCSelf(), ivar, 0);
896
897    QualType ivarType = ivar->getType();
898    switch (getEvaluationKind(ivarType)) {
899    case TEK_Complex: {
900      ComplexPairTy pair = EmitLoadOfComplex(LV);
901      EmitStoreOfComplex(pair,
902                         MakeNaturalAlignAddrLValue(ReturnValue, ivarType),
903                         /*init*/ true);
904      return;
905    }
906    case TEK_Aggregate:
907      // The return value slot is guaranteed to not be aliased, but
908      // that's not necessarily the same as "on the stack", so
909      // we still potentially need objc_memmove_collectable.
910      EmitAggregateCopy(ReturnValue, LV.getAddress(), ivarType);
911      return;
912    case TEK_Scalar: {
913      llvm::Value *value;
914      if (propType->isReferenceType()) {
915        value = LV.getAddress();
916      } else {
917        // We want to load and autoreleaseReturnValue ARC __weak ivars.
918        if (LV.getQuals().getObjCLifetime() == Qualifiers::OCL_Weak) {
919          value = emitARCRetainLoadOfScalar(*this, LV, ivarType);
920
921        // Otherwise we want to do a simple load, suppressing the
922        // final autorelease.
923        } else {
924          value = EmitLoadOfLValue(LV).getScalarVal();
925          AutoreleaseResult = false;
926        }
927
928        value = Builder.CreateBitCast(value, ConvertType(propType));
929        value = Builder.CreateBitCast(value,
930                  ConvertType(GetterMethodDecl->getResultType()));
931      }
932
933      EmitReturnOfRValue(RValue::get(value), propType);
934      return;
935    }
936    }
937    llvm_unreachable("bad evaluation kind");
938  }
939
940  }
941  llvm_unreachable("bad @property implementation strategy!");
942}
943
944/// emitStructSetterCall - Call the runtime function to store the value
945/// from the first formal parameter into the given ivar.
946static void emitStructSetterCall(CodeGenFunction &CGF, ObjCMethodDecl *OMD,
947                                 ObjCIvarDecl *ivar) {
948  // objc_copyStruct (&structIvar, &Arg,
949  //                  sizeof (struct something), true, false);
950  CallArgList args;
951
952  // The first argument is the address of the ivar.
953  llvm::Value *ivarAddr = CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(),
954                                                CGF.LoadObjCSelf(), ivar, 0)
955    .getAddress();
956  ivarAddr = CGF.Builder.CreateBitCast(ivarAddr, CGF.Int8PtrTy);
957  args.add(RValue::get(ivarAddr), CGF.getContext().VoidPtrTy);
958
959  // The second argument is the address of the parameter variable.
960  ParmVarDecl *argVar = *OMD->param_begin();
961  DeclRefExpr argRef(argVar, false, argVar->getType().getNonReferenceType(),
962                     VK_LValue, SourceLocation());
963  llvm::Value *argAddr = CGF.EmitLValue(&argRef).getAddress();
964  argAddr = CGF.Builder.CreateBitCast(argAddr, CGF.Int8PtrTy);
965  args.add(RValue::get(argAddr), CGF.getContext().VoidPtrTy);
966
967  // The third argument is the sizeof the type.
968  llvm::Value *size =
969    CGF.CGM.getSize(CGF.getContext().getTypeSizeInChars(ivar->getType()));
970  args.add(RValue::get(size), CGF.getContext().getSizeType());
971
972  // The fourth argument is the 'isAtomic' flag.
973  args.add(RValue::get(CGF.Builder.getTrue()), CGF.getContext().BoolTy);
974
975  // The fifth argument is the 'hasStrong' flag.
976  // FIXME: should this really always be false?
977  args.add(RValue::get(CGF.Builder.getFalse()), CGF.getContext().BoolTy);
978
979  llvm::Value *copyStructFn = CGF.CGM.getObjCRuntime().GetSetStructFunction();
980  CGF.EmitCall(CGF.getTypes().arrangeFreeFunctionCall(CGF.getContext().VoidTy,
981                                                      args,
982                                                      FunctionType::ExtInfo(),
983                                                      RequiredArgs::All),
984               copyStructFn, ReturnValueSlot(), args);
985}
986
987/// emitCPPObjectAtomicSetterCall - Call the runtime function to store
988/// the value from the first formal parameter into the given ivar, using
989/// the Cpp API for atomic Cpp objects with non-trivial copy assignment.
990static void emitCPPObjectAtomicSetterCall(CodeGenFunction &CGF,
991                                          ObjCMethodDecl *OMD,
992                                          ObjCIvarDecl *ivar,
993                                          llvm::Constant *AtomicHelperFn) {
994  // objc_copyCppObjectAtomic (&CppObjectIvar, &Arg,
995  //                           AtomicHelperFn);
996  CallArgList args;
997
998  // The first argument is the address of the ivar.
999  llvm::Value *ivarAddr =
1000    CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(),
1001                          CGF.LoadObjCSelf(), ivar, 0).getAddress();
1002  ivarAddr = CGF.Builder.CreateBitCast(ivarAddr, CGF.Int8PtrTy);
1003  args.add(RValue::get(ivarAddr), CGF.getContext().VoidPtrTy);
1004
1005  // The second argument is the address of the parameter variable.
1006  ParmVarDecl *argVar = *OMD->param_begin();
1007  DeclRefExpr argRef(argVar, false, argVar->getType().getNonReferenceType(),
1008                     VK_LValue, SourceLocation());
1009  llvm::Value *argAddr = CGF.EmitLValue(&argRef).getAddress();
1010  argAddr = CGF.Builder.CreateBitCast(argAddr, CGF.Int8PtrTy);
1011  args.add(RValue::get(argAddr), CGF.getContext().VoidPtrTy);
1012
1013  // Third argument is the helper function.
1014  args.add(RValue::get(AtomicHelperFn), CGF.getContext().VoidPtrTy);
1015
1016  llvm::Value *copyCppAtomicObjectFn =
1017    CGF.CGM.getObjCRuntime().GetCppAtomicObjectSetFunction();
1018  CGF.EmitCall(CGF.getTypes().arrangeFreeFunctionCall(CGF.getContext().VoidTy,
1019                                                      args,
1020                                                      FunctionType::ExtInfo(),
1021                                                      RequiredArgs::All),
1022               copyCppAtomicObjectFn, ReturnValueSlot(), args);
1023
1024
1025}
1026
1027
1028static bool hasTrivialSetExpr(const ObjCPropertyImplDecl *PID) {
1029  Expr *setter = PID->getSetterCXXAssignment();
1030  if (!setter) return true;
1031
1032  // Sema only makes only of these when the ivar has a C++ class type,
1033  // so the form is pretty constrained.
1034
1035  // An operator call is trivial if the function it calls is trivial.
1036  // This also implies that there's nothing non-trivial going on with
1037  // the arguments, because operator= can only be trivial if it's a
1038  // synthesized assignment operator and therefore both parameters are
1039  // references.
1040  if (CallExpr *call = dyn_cast<CallExpr>(setter)) {
1041    if (const FunctionDecl *callee
1042          = dyn_cast_or_null<FunctionDecl>(call->getCalleeDecl()))
1043      if (callee->isTrivial())
1044        return true;
1045    return false;
1046  }
1047
1048  assert(isa<ExprWithCleanups>(setter));
1049  return false;
1050}
1051
1052static bool UseOptimizedSetter(CodeGenModule &CGM) {
1053  if (CGM.getLangOpts().getGC() != LangOptions::NonGC)
1054    return false;
1055  return CGM.getLangOpts().ObjCRuntime.hasOptimizedSetter();
1056}
1057
1058void
1059CodeGenFunction::generateObjCSetterBody(const ObjCImplementationDecl *classImpl,
1060                                        const ObjCPropertyImplDecl *propImpl,
1061                                        llvm::Constant *AtomicHelperFn) {
1062  const ObjCPropertyDecl *prop = propImpl->getPropertyDecl();
1063  ObjCIvarDecl *ivar = propImpl->getPropertyIvarDecl();
1064  ObjCMethodDecl *setterMethod = prop->getSetterMethodDecl();
1065
1066  // Just use the setter expression if Sema gave us one and it's
1067  // non-trivial.
1068  if (!hasTrivialSetExpr(propImpl)) {
1069    if (!AtomicHelperFn)
1070      // If non-atomic, assignment is called directly.
1071      EmitStmt(propImpl->getSetterCXXAssignment());
1072    else
1073      // If atomic, assignment is called via a locking api.
1074      emitCPPObjectAtomicSetterCall(*this, setterMethod, ivar,
1075                                    AtomicHelperFn);
1076    return;
1077  }
1078
1079  PropertyImplStrategy strategy(CGM, propImpl);
1080  switch (strategy.getKind()) {
1081  case PropertyImplStrategy::Native: {
1082    // We don't need to do anything for a zero-size struct.
1083    if (strategy.getIvarSize().isZero())
1084      return;
1085
1086    llvm::Value *argAddr = LocalDeclMap[*setterMethod->param_begin()];
1087
1088    LValue ivarLValue =
1089      EmitLValueForIvar(TypeOfSelfObject(), LoadObjCSelf(), ivar, /*quals*/ 0);
1090    llvm::Value *ivarAddr = ivarLValue.getAddress();
1091
1092    // Currently, all atomic accesses have to be through integer
1093    // types, so there's no point in trying to pick a prettier type.
1094    llvm::Type *bitcastType =
1095      llvm::Type::getIntNTy(getLLVMContext(),
1096                            getContext().toBits(strategy.getIvarSize()));
1097    bitcastType = bitcastType->getPointerTo(); // addrspace 0 okay
1098
1099    // Cast both arguments to the chosen operation type.
1100    argAddr = Builder.CreateBitCast(argAddr, bitcastType);
1101    ivarAddr = Builder.CreateBitCast(ivarAddr, bitcastType);
1102
1103    // This bitcast load is likely to cause some nasty IR.
1104    llvm::Value *load = Builder.CreateLoad(argAddr);
1105
1106    // Perform an atomic store.  There are no memory ordering requirements.
1107    llvm::StoreInst *store = Builder.CreateStore(load, ivarAddr);
1108    store->setAlignment(strategy.getIvarAlignment().getQuantity());
1109    store->setAtomic(llvm::Unordered);
1110    return;
1111  }
1112
1113  case PropertyImplStrategy::GetSetProperty:
1114  case PropertyImplStrategy::SetPropertyAndExpressionGet: {
1115
1116    llvm::Value *setOptimizedPropertyFn = 0;
1117    llvm::Value *setPropertyFn = 0;
1118    if (UseOptimizedSetter(CGM)) {
1119      // 10.8 and iOS 6.0 code and GC is off
1120      setOptimizedPropertyFn =
1121        CGM.getObjCRuntime()
1122           .GetOptimizedPropertySetFunction(strategy.isAtomic(),
1123                                            strategy.isCopy());
1124      if (!setOptimizedPropertyFn) {
1125        CGM.ErrorUnsupported(propImpl, "Obj-C optimized setter - NYI");
1126        return;
1127      }
1128    }
1129    else {
1130      setPropertyFn = CGM.getObjCRuntime().GetPropertySetFunction();
1131      if (!setPropertyFn) {
1132        CGM.ErrorUnsupported(propImpl, "Obj-C setter requiring atomic copy");
1133        return;
1134      }
1135    }
1136
1137    // Emit objc_setProperty((id) self, _cmd, offset, arg,
1138    //                       <is-atomic>, <is-copy>).
1139    llvm::Value *cmd =
1140      Builder.CreateLoad(LocalDeclMap[setterMethod->getCmdDecl()]);
1141    llvm::Value *self =
1142      Builder.CreateBitCast(LoadObjCSelf(), VoidPtrTy);
1143    llvm::Value *ivarOffset =
1144      EmitIvarOffset(classImpl->getClassInterface(), ivar);
1145    llvm::Value *arg = LocalDeclMap[*setterMethod->param_begin()];
1146    arg = Builder.CreateBitCast(Builder.CreateLoad(arg, "arg"), VoidPtrTy);
1147
1148    CallArgList args;
1149    args.add(RValue::get(self), getContext().getObjCIdType());
1150    args.add(RValue::get(cmd), getContext().getObjCSelType());
1151    if (setOptimizedPropertyFn) {
1152      args.add(RValue::get(arg), getContext().getObjCIdType());
1153      args.add(RValue::get(ivarOffset), getContext().getPointerDiffType());
1154      EmitCall(getTypes().arrangeFreeFunctionCall(getContext().VoidTy, args,
1155                                                  FunctionType::ExtInfo(),
1156                                                  RequiredArgs::All),
1157               setOptimizedPropertyFn, ReturnValueSlot(), args);
1158    } else {
1159      args.add(RValue::get(ivarOffset), getContext().getPointerDiffType());
1160      args.add(RValue::get(arg), getContext().getObjCIdType());
1161      args.add(RValue::get(Builder.getInt1(strategy.isAtomic())),
1162               getContext().BoolTy);
1163      args.add(RValue::get(Builder.getInt1(strategy.isCopy())),
1164               getContext().BoolTy);
1165      // FIXME: We shouldn't need to get the function info here, the runtime
1166      // already should have computed it to build the function.
1167      EmitCall(getTypes().arrangeFreeFunctionCall(getContext().VoidTy, args,
1168                                                  FunctionType::ExtInfo(),
1169                                                  RequiredArgs::All),
1170               setPropertyFn, ReturnValueSlot(), args);
1171    }
1172
1173    return;
1174  }
1175
1176  case PropertyImplStrategy::CopyStruct:
1177    emitStructSetterCall(*this, setterMethod, ivar);
1178    return;
1179
1180  case PropertyImplStrategy::Expression:
1181    break;
1182  }
1183
1184  // Otherwise, fake up some ASTs and emit a normal assignment.
1185  ValueDecl *selfDecl = setterMethod->getSelfDecl();
1186  DeclRefExpr self(selfDecl, false, selfDecl->getType(),
1187                   VK_LValue, SourceLocation());
1188  ImplicitCastExpr selfLoad(ImplicitCastExpr::OnStack,
1189                            selfDecl->getType(), CK_LValueToRValue, &self,
1190                            VK_RValue);
1191  ObjCIvarRefExpr ivarRef(ivar, ivar->getType().getNonReferenceType(),
1192                          SourceLocation(), &selfLoad, true, true);
1193
1194  ParmVarDecl *argDecl = *setterMethod->param_begin();
1195  QualType argType = argDecl->getType().getNonReferenceType();
1196  DeclRefExpr arg(argDecl, false, argType, VK_LValue, SourceLocation());
1197  ImplicitCastExpr argLoad(ImplicitCastExpr::OnStack,
1198                           argType.getUnqualifiedType(), CK_LValueToRValue,
1199                           &arg, VK_RValue);
1200
1201  // The property type can differ from the ivar type in some situations with
1202  // Objective-C pointer types, we can always bit cast the RHS in these cases.
1203  // The following absurdity is just to ensure well-formed IR.
1204  CastKind argCK = CK_NoOp;
1205  if (ivarRef.getType()->isObjCObjectPointerType()) {
1206    if (argLoad.getType()->isObjCObjectPointerType())
1207      argCK = CK_BitCast;
1208    else if (argLoad.getType()->isBlockPointerType())
1209      argCK = CK_BlockPointerToObjCPointerCast;
1210    else
1211      argCK = CK_CPointerToObjCPointerCast;
1212  } else if (ivarRef.getType()->isBlockPointerType()) {
1213     if (argLoad.getType()->isBlockPointerType())
1214      argCK = CK_BitCast;
1215    else
1216      argCK = CK_AnyPointerToBlockPointerCast;
1217  } else if (ivarRef.getType()->isPointerType()) {
1218    argCK = CK_BitCast;
1219  }
1220  ImplicitCastExpr argCast(ImplicitCastExpr::OnStack,
1221                           ivarRef.getType(), argCK, &argLoad,
1222                           VK_RValue);
1223  Expr *finalArg = &argLoad;
1224  if (!getContext().hasSameUnqualifiedType(ivarRef.getType(),
1225                                           argLoad.getType()))
1226    finalArg = &argCast;
1227
1228
1229  BinaryOperator assign(&ivarRef, finalArg, BO_Assign,
1230                        ivarRef.getType(), VK_RValue, OK_Ordinary,
1231                        SourceLocation(), false);
1232  EmitStmt(&assign);
1233}
1234
1235/// \brief Generate an Objective-C property setter function.
1236///
1237/// The given Decl must be an ObjCImplementationDecl. \@synthesize
1238/// is illegal within a category.
1239void CodeGenFunction::GenerateObjCSetter(ObjCImplementationDecl *IMP,
1240                                         const ObjCPropertyImplDecl *PID) {
1241  llvm::Constant *AtomicHelperFn =
1242    GenerateObjCAtomicSetterCopyHelperFunction(PID);
1243  const ObjCPropertyDecl *PD = PID->getPropertyDecl();
1244  ObjCMethodDecl *OMD = PD->getSetterMethodDecl();
1245  assert(OMD && "Invalid call to generate setter (empty method)");
1246  StartObjCMethod(OMD, IMP->getClassInterface(), OMD->getLocStart());
1247
1248  generateObjCSetterBody(IMP, PID, AtomicHelperFn);
1249
1250  FinishFunction();
1251}
1252
1253namespace {
1254  struct DestroyIvar : EHScopeStack::Cleanup {
1255  private:
1256    llvm::Value *addr;
1257    const ObjCIvarDecl *ivar;
1258    CodeGenFunction::Destroyer *destroyer;
1259    bool useEHCleanupForArray;
1260  public:
1261    DestroyIvar(llvm::Value *addr, const ObjCIvarDecl *ivar,
1262                CodeGenFunction::Destroyer *destroyer,
1263                bool useEHCleanupForArray)
1264      : addr(addr), ivar(ivar), destroyer(destroyer),
1265        useEHCleanupForArray(useEHCleanupForArray) {}
1266
1267    void Emit(CodeGenFunction &CGF, Flags flags) {
1268      LValue lvalue
1269        = CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(), addr, ivar, /*CVR*/ 0);
1270      CGF.emitDestroy(lvalue.getAddress(), ivar->getType(), destroyer,
1271                      flags.isForNormalCleanup() && useEHCleanupForArray);
1272    }
1273  };
1274}
1275
1276/// Like CodeGenFunction::destroyARCStrong, but do it with a call.
1277static void destroyARCStrongWithStore(CodeGenFunction &CGF,
1278                                      llvm::Value *addr,
1279                                      QualType type) {
1280  llvm::Value *null = getNullForVariable(addr);
1281  CGF.EmitARCStoreStrongCall(addr, null, /*ignored*/ true);
1282}
1283
1284static void emitCXXDestructMethod(CodeGenFunction &CGF,
1285                                  ObjCImplementationDecl *impl) {
1286  CodeGenFunction::RunCleanupsScope scope(CGF);
1287
1288  llvm::Value *self = CGF.LoadObjCSelf();
1289
1290  const ObjCInterfaceDecl *iface = impl->getClassInterface();
1291  for (const ObjCIvarDecl *ivar = iface->all_declared_ivar_begin();
1292       ivar; ivar = ivar->getNextIvar()) {
1293    QualType type = ivar->getType();
1294
1295    // Check whether the ivar is a destructible type.
1296    QualType::DestructionKind dtorKind = type.isDestructedType();
1297    if (!dtorKind) continue;
1298
1299    CodeGenFunction::Destroyer *destroyer = 0;
1300
1301    // Use a call to objc_storeStrong to destroy strong ivars, for the
1302    // general benefit of the tools.
1303    if (dtorKind == QualType::DK_objc_strong_lifetime) {
1304      destroyer = destroyARCStrongWithStore;
1305
1306    // Otherwise use the default for the destruction kind.
1307    } else {
1308      destroyer = CGF.getDestroyer(dtorKind);
1309    }
1310
1311    CleanupKind cleanupKind = CGF.getCleanupKind(dtorKind);
1312
1313    CGF.EHStack.pushCleanup<DestroyIvar>(cleanupKind, self, ivar, destroyer,
1314                                         cleanupKind & EHCleanup);
1315  }
1316
1317  assert(scope.requiresCleanups() && "nothing to do in .cxx_destruct?");
1318}
1319
1320void CodeGenFunction::GenerateObjCCtorDtorMethod(ObjCImplementationDecl *IMP,
1321                                                 ObjCMethodDecl *MD,
1322                                                 bool ctor) {
1323  MD->createImplicitParams(CGM.getContext(), IMP->getClassInterface());
1324  StartObjCMethod(MD, IMP->getClassInterface(), MD->getLocStart());
1325
1326  // Emit .cxx_construct.
1327  if (ctor) {
1328    // Suppress the final autorelease in ARC.
1329    AutoreleaseResult = false;
1330
1331    SmallVector<CXXCtorInitializer *, 8> IvarInitializers;
1332    for (ObjCImplementationDecl::init_const_iterator B = IMP->init_begin(),
1333           E = IMP->init_end(); B != E; ++B) {
1334      CXXCtorInitializer *IvarInit = (*B);
1335      FieldDecl *Field = IvarInit->getAnyMember();
1336      ObjCIvarDecl  *Ivar = cast<ObjCIvarDecl>(Field);
1337      LValue LV = EmitLValueForIvar(TypeOfSelfObject(),
1338                                    LoadObjCSelf(), Ivar, 0);
1339      EmitAggExpr(IvarInit->getInit(),
1340                  AggValueSlot::forLValue(LV, AggValueSlot::IsDestructed,
1341                                          AggValueSlot::DoesNotNeedGCBarriers,
1342                                          AggValueSlot::IsNotAliased));
1343    }
1344    // constructor returns 'self'.
1345    CodeGenTypes &Types = CGM.getTypes();
1346    QualType IdTy(CGM.getContext().getObjCIdType());
1347    llvm::Value *SelfAsId =
1348      Builder.CreateBitCast(LoadObjCSelf(), Types.ConvertType(IdTy));
1349    EmitReturnOfRValue(RValue::get(SelfAsId), IdTy);
1350
1351  // Emit .cxx_destruct.
1352  } else {
1353    emitCXXDestructMethod(*this, IMP);
1354  }
1355  FinishFunction();
1356}
1357
1358bool CodeGenFunction::IndirectObjCSetterArg(const CGFunctionInfo &FI) {
1359  CGFunctionInfo::const_arg_iterator it = FI.arg_begin();
1360  it++; it++;
1361  const ABIArgInfo &AI = it->info;
1362  // FIXME. Is this sufficient check?
1363  return (AI.getKind() == ABIArgInfo::Indirect);
1364}
1365
1366bool CodeGenFunction::IvarTypeWithAggrGCObjects(QualType Ty) {
1367  if (CGM.getLangOpts().getGC() == LangOptions::NonGC)
1368    return false;
1369  if (const RecordType *FDTTy = Ty.getTypePtr()->getAs<RecordType>())
1370    return FDTTy->getDecl()->hasObjectMember();
1371  return false;
1372}
1373
1374llvm::Value *CodeGenFunction::LoadObjCSelf() {
1375  const ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(CurFuncDecl);
1376  return Builder.CreateLoad(LocalDeclMap[OMD->getSelfDecl()], "self");
1377}
1378
1379QualType CodeGenFunction::TypeOfSelfObject() {
1380  const ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(CurFuncDecl);
1381  ImplicitParamDecl *selfDecl = OMD->getSelfDecl();
1382  const ObjCObjectPointerType *PTy = cast<ObjCObjectPointerType>(
1383    getContext().getCanonicalType(selfDecl->getType()));
1384  return PTy->getPointeeType();
1385}
1386
1387void CodeGenFunction::EmitObjCForCollectionStmt(const ObjCForCollectionStmt &S){
1388  llvm::Constant *EnumerationMutationFn =
1389    CGM.getObjCRuntime().EnumerationMutationFunction();
1390
1391  if (!EnumerationMutationFn) {
1392    CGM.ErrorUnsupported(&S, "Obj-C fast enumeration for this runtime");
1393    return;
1394  }
1395
1396  CGDebugInfo *DI = getDebugInfo();
1397  if (DI)
1398    DI->EmitLexicalBlockStart(Builder, S.getSourceRange().getBegin());
1399
1400  // The local variable comes into scope immediately.
1401  AutoVarEmission variable = AutoVarEmission::invalid();
1402  if (const DeclStmt *SD = dyn_cast<DeclStmt>(S.getElement()))
1403    variable = EmitAutoVarAlloca(*cast<VarDecl>(SD->getSingleDecl()));
1404
1405  JumpDest LoopEnd = getJumpDestInCurrentScope("forcoll.end");
1406
1407  // Fast enumeration state.
1408  QualType StateTy = CGM.getObjCFastEnumerationStateType();
1409  llvm::Value *StatePtr = CreateMemTemp(StateTy, "state.ptr");
1410  EmitNullInitialization(StatePtr, StateTy);
1411
1412  // Number of elements in the items array.
1413  static const unsigned NumItems = 16;
1414
1415  // Fetch the countByEnumeratingWithState:objects:count: selector.
1416  IdentifierInfo *II[] = {
1417    &CGM.getContext().Idents.get("countByEnumeratingWithState"),
1418    &CGM.getContext().Idents.get("objects"),
1419    &CGM.getContext().Idents.get("count")
1420  };
1421  Selector FastEnumSel =
1422    CGM.getContext().Selectors.getSelector(llvm::array_lengthof(II), &II[0]);
1423
1424  QualType ItemsTy =
1425    getContext().getConstantArrayType(getContext().getObjCIdType(),
1426                                      llvm::APInt(32, NumItems),
1427                                      ArrayType::Normal, 0);
1428  llvm::Value *ItemsPtr = CreateMemTemp(ItemsTy, "items.ptr");
1429
1430  // Emit the collection pointer.  In ARC, we do a retain.
1431  llvm::Value *Collection;
1432  if (getLangOpts().ObjCAutoRefCount) {
1433    Collection = EmitARCRetainScalarExpr(S.getCollection());
1434
1435    // Enter a cleanup to do the release.
1436    EmitObjCConsumeObject(S.getCollection()->getType(), Collection);
1437  } else {
1438    Collection = EmitScalarExpr(S.getCollection());
1439  }
1440
1441  // The 'continue' label needs to appear within the cleanup for the
1442  // collection object.
1443  JumpDest AfterBody = getJumpDestInCurrentScope("forcoll.next");
1444
1445  // Send it our message:
1446  CallArgList Args;
1447
1448  // The first argument is a temporary of the enumeration-state type.
1449  Args.add(RValue::get(StatePtr), getContext().getPointerType(StateTy));
1450
1451  // The second argument is a temporary array with space for NumItems
1452  // pointers.  We'll actually be loading elements from the array
1453  // pointer written into the control state; this buffer is so that
1454  // collections that *aren't* backed by arrays can still queue up
1455  // batches of elements.
1456  Args.add(RValue::get(ItemsPtr), getContext().getPointerType(ItemsTy));
1457
1458  // The third argument is the capacity of that temporary array.
1459  llvm::Type *UnsignedLongLTy = ConvertType(getContext().UnsignedLongTy);
1460  llvm::Constant *Count = llvm::ConstantInt::get(UnsignedLongLTy, NumItems);
1461  Args.add(RValue::get(Count), getContext().UnsignedLongTy);
1462
1463  // Start the enumeration.
1464  RValue CountRV =
1465    CGM.getObjCRuntime().GenerateMessageSend(*this, ReturnValueSlot(),
1466                                             getContext().UnsignedLongTy,
1467                                             FastEnumSel,
1468                                             Collection, Args);
1469
1470  // The initial number of objects that were returned in the buffer.
1471  llvm::Value *initialBufferLimit = CountRV.getScalarVal();
1472
1473  llvm::BasicBlock *EmptyBB = createBasicBlock("forcoll.empty");
1474  llvm::BasicBlock *LoopInitBB = createBasicBlock("forcoll.loopinit");
1475
1476  llvm::Value *zero = llvm::Constant::getNullValue(UnsignedLongLTy);
1477
1478  // If the limit pointer was zero to begin with, the collection is
1479  // empty; skip all this.
1480  Builder.CreateCondBr(Builder.CreateICmpEQ(initialBufferLimit, zero, "iszero"),
1481                       EmptyBB, LoopInitBB);
1482
1483  // Otherwise, initialize the loop.
1484  EmitBlock(LoopInitBB);
1485
1486  // Save the initial mutations value.  This is the value at an
1487  // address that was written into the state object by
1488  // countByEnumeratingWithState:objects:count:.
1489  llvm::Value *StateMutationsPtrPtr =
1490    Builder.CreateStructGEP(StatePtr, 2, "mutationsptr.ptr");
1491  llvm::Value *StateMutationsPtr = Builder.CreateLoad(StateMutationsPtrPtr,
1492                                                      "mutationsptr");
1493
1494  llvm::Value *initialMutations =
1495    Builder.CreateLoad(StateMutationsPtr, "forcoll.initial-mutations");
1496
1497  // Start looping.  This is the point we return to whenever we have a
1498  // fresh, non-empty batch of objects.
1499  llvm::BasicBlock *LoopBodyBB = createBasicBlock("forcoll.loopbody");
1500  EmitBlock(LoopBodyBB);
1501
1502  // The current index into the buffer.
1503  llvm::PHINode *index = Builder.CreatePHI(UnsignedLongLTy, 3, "forcoll.index");
1504  index->addIncoming(zero, LoopInitBB);
1505
1506  // The current buffer size.
1507  llvm::PHINode *count = Builder.CreatePHI(UnsignedLongLTy, 3, "forcoll.count");
1508  count->addIncoming(initialBufferLimit, LoopInitBB);
1509
1510  // Check whether the mutations value has changed from where it was
1511  // at start.  StateMutationsPtr should actually be invariant between
1512  // refreshes.
1513  StateMutationsPtr = Builder.CreateLoad(StateMutationsPtrPtr, "mutationsptr");
1514  llvm::Value *currentMutations
1515    = Builder.CreateLoad(StateMutationsPtr, "statemutations");
1516
1517  llvm::BasicBlock *WasMutatedBB = createBasicBlock("forcoll.mutated");
1518  llvm::BasicBlock *WasNotMutatedBB = createBasicBlock("forcoll.notmutated");
1519
1520  Builder.CreateCondBr(Builder.CreateICmpEQ(currentMutations, initialMutations),
1521                       WasNotMutatedBB, WasMutatedBB);
1522
1523  // If so, call the enumeration-mutation function.
1524  EmitBlock(WasMutatedBB);
1525  llvm::Value *V =
1526    Builder.CreateBitCast(Collection,
1527                          ConvertType(getContext().getObjCIdType()));
1528  CallArgList Args2;
1529  Args2.add(RValue::get(V), getContext().getObjCIdType());
1530  // FIXME: We shouldn't need to get the function info here, the runtime already
1531  // should have computed it to build the function.
1532  EmitCall(CGM.getTypes().arrangeFreeFunctionCall(getContext().VoidTy, Args2,
1533                                                  FunctionType::ExtInfo(),
1534                                                  RequiredArgs::All),
1535           EnumerationMutationFn, ReturnValueSlot(), Args2);
1536
1537  // Otherwise, or if the mutation function returns, just continue.
1538  EmitBlock(WasNotMutatedBB);
1539
1540  // Initialize the element variable.
1541  RunCleanupsScope elementVariableScope(*this);
1542  bool elementIsVariable;
1543  LValue elementLValue;
1544  QualType elementType;
1545  if (const DeclStmt *SD = dyn_cast<DeclStmt>(S.getElement())) {
1546    // Initialize the variable, in case it's a __block variable or something.
1547    EmitAutoVarInit(variable);
1548
1549    const VarDecl* D = cast<VarDecl>(SD->getSingleDecl());
1550    DeclRefExpr tempDRE(const_cast<VarDecl*>(D), false, D->getType(),
1551                        VK_LValue, SourceLocation());
1552    elementLValue = EmitLValue(&tempDRE);
1553    elementType = D->getType();
1554    elementIsVariable = true;
1555
1556    if (D->isARCPseudoStrong())
1557      elementLValue.getQuals().setObjCLifetime(Qualifiers::OCL_ExplicitNone);
1558  } else {
1559    elementLValue = LValue(); // suppress warning
1560    elementType = cast<Expr>(S.getElement())->getType();
1561    elementIsVariable = false;
1562  }
1563  llvm::Type *convertedElementType = ConvertType(elementType);
1564
1565  // Fetch the buffer out of the enumeration state.
1566  // TODO: this pointer should actually be invariant between
1567  // refreshes, which would help us do certain loop optimizations.
1568  llvm::Value *StateItemsPtr =
1569    Builder.CreateStructGEP(StatePtr, 1, "stateitems.ptr");
1570  llvm::Value *EnumStateItems =
1571    Builder.CreateLoad(StateItemsPtr, "stateitems");
1572
1573  // Fetch the value at the current index from the buffer.
1574  llvm::Value *CurrentItemPtr =
1575    Builder.CreateGEP(EnumStateItems, index, "currentitem.ptr");
1576  llvm::Value *CurrentItem = Builder.CreateLoad(CurrentItemPtr);
1577
1578  // Cast that value to the right type.
1579  CurrentItem = Builder.CreateBitCast(CurrentItem, convertedElementType,
1580                                      "currentitem");
1581
1582  // Make sure we have an l-value.  Yes, this gets evaluated every
1583  // time through the loop.
1584  if (!elementIsVariable) {
1585    elementLValue = EmitLValue(cast<Expr>(S.getElement()));
1586    EmitStoreThroughLValue(RValue::get(CurrentItem), elementLValue);
1587  } else {
1588    EmitScalarInit(CurrentItem, elementLValue);
1589  }
1590
1591  // If we do have an element variable, this assignment is the end of
1592  // its initialization.
1593  if (elementIsVariable)
1594    EmitAutoVarCleanups(variable);
1595
1596  // Perform the loop body, setting up break and continue labels.
1597  BreakContinueStack.push_back(BreakContinue(LoopEnd, AfterBody));
1598  {
1599    RunCleanupsScope Scope(*this);
1600    EmitStmt(S.getBody());
1601  }
1602  BreakContinueStack.pop_back();
1603
1604  // Destroy the element variable now.
1605  elementVariableScope.ForceCleanup();
1606
1607  // Check whether there are more elements.
1608  EmitBlock(AfterBody.getBlock());
1609
1610  llvm::BasicBlock *FetchMoreBB = createBasicBlock("forcoll.refetch");
1611
1612  // First we check in the local buffer.
1613  llvm::Value *indexPlusOne
1614    = Builder.CreateAdd(index, llvm::ConstantInt::get(UnsignedLongLTy, 1));
1615
1616  // If we haven't overrun the buffer yet, we can continue.
1617  Builder.CreateCondBr(Builder.CreateICmpULT(indexPlusOne, count),
1618                       LoopBodyBB, FetchMoreBB);
1619
1620  index->addIncoming(indexPlusOne, AfterBody.getBlock());
1621  count->addIncoming(count, AfterBody.getBlock());
1622
1623  // Otherwise, we have to fetch more elements.
1624  EmitBlock(FetchMoreBB);
1625
1626  CountRV =
1627    CGM.getObjCRuntime().GenerateMessageSend(*this, ReturnValueSlot(),
1628                                             getContext().UnsignedLongTy,
1629                                             FastEnumSel,
1630                                             Collection, Args);
1631
1632  // If we got a zero count, we're done.
1633  llvm::Value *refetchCount = CountRV.getScalarVal();
1634
1635  // (note that the message send might split FetchMoreBB)
1636  index->addIncoming(zero, Builder.GetInsertBlock());
1637  count->addIncoming(refetchCount, Builder.GetInsertBlock());
1638
1639  Builder.CreateCondBr(Builder.CreateICmpEQ(refetchCount, zero),
1640                       EmptyBB, LoopBodyBB);
1641
1642  // No more elements.
1643  EmitBlock(EmptyBB);
1644
1645  if (!elementIsVariable) {
1646    // If the element was not a declaration, set it to be null.
1647
1648    llvm::Value *null = llvm::Constant::getNullValue(convertedElementType);
1649    elementLValue = EmitLValue(cast<Expr>(S.getElement()));
1650    EmitStoreThroughLValue(RValue::get(null), elementLValue);
1651  }
1652
1653  if (DI)
1654    DI->EmitLexicalBlockEnd(Builder, S.getSourceRange().getEnd());
1655
1656  // Leave the cleanup we entered in ARC.
1657  if (getLangOpts().ObjCAutoRefCount)
1658    PopCleanupBlock();
1659
1660  EmitBlock(LoopEnd.getBlock());
1661}
1662
1663void CodeGenFunction::EmitObjCAtTryStmt(const ObjCAtTryStmt &S) {
1664  CGM.getObjCRuntime().EmitTryStmt(*this, S);
1665}
1666
1667void CodeGenFunction::EmitObjCAtThrowStmt(const ObjCAtThrowStmt &S) {
1668  CGM.getObjCRuntime().EmitThrowStmt(*this, S);
1669}
1670
1671void CodeGenFunction::EmitObjCAtSynchronizedStmt(
1672                                              const ObjCAtSynchronizedStmt &S) {
1673  CGM.getObjCRuntime().EmitSynchronizedStmt(*this, S);
1674}
1675
1676/// Produce the code for a CK_ARCProduceObject.  Just does a
1677/// primitive retain.
1678llvm::Value *CodeGenFunction::EmitObjCProduceObject(QualType type,
1679                                                    llvm::Value *value) {
1680  return EmitARCRetain(type, value);
1681}
1682
1683namespace {
1684  struct CallObjCRelease : EHScopeStack::Cleanup {
1685    CallObjCRelease(llvm::Value *object) : object(object) {}
1686    llvm::Value *object;
1687
1688    void Emit(CodeGenFunction &CGF, Flags flags) {
1689      // Releases at the end of the full-expression are imprecise.
1690      CGF.EmitARCRelease(object, ARCImpreciseLifetime);
1691    }
1692  };
1693}
1694
1695/// Produce the code for a CK_ARCConsumeObject.  Does a primitive
1696/// release at the end of the full-expression.
1697llvm::Value *CodeGenFunction::EmitObjCConsumeObject(QualType type,
1698                                                    llvm::Value *object) {
1699  // If we're in a conditional branch, we need to make the cleanup
1700  // conditional.
1701  pushFullExprCleanup<CallObjCRelease>(getARCCleanupKind(), object);
1702  return object;
1703}
1704
1705llvm::Value *CodeGenFunction::EmitObjCExtendObjectLifetime(QualType type,
1706                                                           llvm::Value *value) {
1707  return EmitARCRetainAutorelease(type, value);
1708}
1709
1710/// Given a number of pointers, inform the optimizer that they're
1711/// being intrinsically used up until this point in the program.
1712void CodeGenFunction::EmitARCIntrinsicUse(ArrayRef<llvm::Value*> values) {
1713  llvm::Constant *&fn = CGM.getARCEntrypoints().clang_arc_use;
1714  if (!fn) {
1715    llvm::FunctionType *fnType =
1716      llvm::FunctionType::get(CGM.VoidTy, ArrayRef<llvm::Type*>(), true);
1717    fn = CGM.CreateRuntimeFunction(fnType, "clang.arc.use");
1718  }
1719
1720  // This isn't really a "runtime" function, but as an intrinsic it
1721  // doesn't really matter as long as we align things up.
1722  EmitNounwindRuntimeCall(fn, values);
1723}
1724
1725
1726static llvm::Constant *createARCRuntimeFunction(CodeGenModule &CGM,
1727                                                llvm::FunctionType *type,
1728                                                StringRef fnName) {
1729  llvm::Constant *fn = CGM.CreateRuntimeFunction(type, fnName);
1730
1731  if (llvm::Function *f = dyn_cast<llvm::Function>(fn)) {
1732    // If the target runtime doesn't naturally support ARC, emit weak
1733    // references to the runtime support library.  We don't really
1734    // permit this to fail, but we need a particular relocation style.
1735    if (!CGM.getLangOpts().ObjCRuntime.hasNativeARC()) {
1736      f->setLinkage(llvm::Function::ExternalWeakLinkage);
1737    } else if (fnName == "objc_retain" || fnName  == "objc_release") {
1738      // If we have Native ARC, set nonlazybind attribute for these APIs for
1739      // performance.
1740      f->addFnAttr(llvm::Attribute::NonLazyBind);
1741    }
1742  }
1743
1744  return fn;
1745}
1746
1747/// Perform an operation having the signature
1748///   i8* (i8*)
1749/// where a null input causes a no-op and returns null.
1750static llvm::Value *emitARCValueOperation(CodeGenFunction &CGF,
1751                                          llvm::Value *value,
1752                                          llvm::Constant *&fn,
1753                                          StringRef fnName,
1754                                          bool isTailCall = false) {
1755  if (isa<llvm::ConstantPointerNull>(value)) return value;
1756
1757  if (!fn) {
1758    llvm::FunctionType *fnType =
1759      llvm::FunctionType::get(CGF.Int8PtrTy, CGF.Int8PtrTy, false);
1760    fn = createARCRuntimeFunction(CGF.CGM, fnType, fnName);
1761  }
1762
1763  // Cast the argument to 'id'.
1764  llvm::Type *origType = value->getType();
1765  value = CGF.Builder.CreateBitCast(value, CGF.Int8PtrTy);
1766
1767  // Call the function.
1768  llvm::CallInst *call = CGF.EmitNounwindRuntimeCall(fn, value);
1769  if (isTailCall)
1770    call->setTailCall();
1771
1772  // Cast the result back to the original type.
1773  return CGF.Builder.CreateBitCast(call, origType);
1774}
1775
1776/// Perform an operation having the following signature:
1777///   i8* (i8**)
1778static llvm::Value *emitARCLoadOperation(CodeGenFunction &CGF,
1779                                         llvm::Value *addr,
1780                                         llvm::Constant *&fn,
1781                                         StringRef fnName) {
1782  if (!fn) {
1783    llvm::FunctionType *fnType =
1784      llvm::FunctionType::get(CGF.Int8PtrTy, CGF.Int8PtrPtrTy, false);
1785    fn = createARCRuntimeFunction(CGF.CGM, fnType, fnName);
1786  }
1787
1788  // Cast the argument to 'id*'.
1789  llvm::Type *origType = addr->getType();
1790  addr = CGF.Builder.CreateBitCast(addr, CGF.Int8PtrPtrTy);
1791
1792  // Call the function.
1793  llvm::Value *result = CGF.EmitNounwindRuntimeCall(fn, addr);
1794
1795  // Cast the result back to a dereference of the original type.
1796  if (origType != CGF.Int8PtrPtrTy)
1797    result = CGF.Builder.CreateBitCast(result,
1798                        cast<llvm::PointerType>(origType)->getElementType());
1799
1800  return result;
1801}
1802
1803/// Perform an operation having the following signature:
1804///   i8* (i8**, i8*)
1805static llvm::Value *emitARCStoreOperation(CodeGenFunction &CGF,
1806                                          llvm::Value *addr,
1807                                          llvm::Value *value,
1808                                          llvm::Constant *&fn,
1809                                          StringRef fnName,
1810                                          bool ignored) {
1811  assert(cast<llvm::PointerType>(addr->getType())->getElementType()
1812           == value->getType());
1813
1814  if (!fn) {
1815    llvm::Type *argTypes[] = { CGF.Int8PtrPtrTy, CGF.Int8PtrTy };
1816
1817    llvm::FunctionType *fnType
1818      = llvm::FunctionType::get(CGF.Int8PtrTy, argTypes, false);
1819    fn = createARCRuntimeFunction(CGF.CGM, fnType, fnName);
1820  }
1821
1822  llvm::Type *origType = value->getType();
1823
1824  llvm::Value *args[] = {
1825    CGF.Builder.CreateBitCast(addr, CGF.Int8PtrPtrTy),
1826    CGF.Builder.CreateBitCast(value, CGF.Int8PtrTy)
1827  };
1828  llvm::CallInst *result = CGF.EmitNounwindRuntimeCall(fn, args);
1829
1830  if (ignored) return 0;
1831
1832  return CGF.Builder.CreateBitCast(result, origType);
1833}
1834
1835/// Perform an operation having the following signature:
1836///   void (i8**, i8**)
1837static void emitARCCopyOperation(CodeGenFunction &CGF,
1838                                 llvm::Value *dst,
1839                                 llvm::Value *src,
1840                                 llvm::Constant *&fn,
1841                                 StringRef fnName) {
1842  assert(dst->getType() == src->getType());
1843
1844  if (!fn) {
1845    llvm::Type *argTypes[] = { CGF.Int8PtrPtrTy, CGF.Int8PtrPtrTy };
1846
1847    llvm::FunctionType *fnType
1848      = llvm::FunctionType::get(CGF.Builder.getVoidTy(), argTypes, false);
1849    fn = createARCRuntimeFunction(CGF.CGM, fnType, fnName);
1850  }
1851
1852  llvm::Value *args[] = {
1853    CGF.Builder.CreateBitCast(dst, CGF.Int8PtrPtrTy),
1854    CGF.Builder.CreateBitCast(src, CGF.Int8PtrPtrTy)
1855  };
1856  CGF.EmitNounwindRuntimeCall(fn, args);
1857}
1858
1859/// Produce the code to do a retain.  Based on the type, calls one of:
1860///   call i8* \@objc_retain(i8* %value)
1861///   call i8* \@objc_retainBlock(i8* %value)
1862llvm::Value *CodeGenFunction::EmitARCRetain(QualType type, llvm::Value *value) {
1863  if (type->isBlockPointerType())
1864    return EmitARCRetainBlock(value, /*mandatory*/ false);
1865  else
1866    return EmitARCRetainNonBlock(value);
1867}
1868
1869/// Retain the given object, with normal retain semantics.
1870///   call i8* \@objc_retain(i8* %value)
1871llvm::Value *CodeGenFunction::EmitARCRetainNonBlock(llvm::Value *value) {
1872  return emitARCValueOperation(*this, value,
1873                               CGM.getARCEntrypoints().objc_retain,
1874                               "objc_retain");
1875}
1876
1877/// Retain the given block, with _Block_copy semantics.
1878///   call i8* \@objc_retainBlock(i8* %value)
1879///
1880/// \param mandatory - If false, emit the call with metadata
1881/// indicating that it's okay for the optimizer to eliminate this call
1882/// if it can prove that the block never escapes except down the stack.
1883llvm::Value *CodeGenFunction::EmitARCRetainBlock(llvm::Value *value,
1884                                                 bool mandatory) {
1885  llvm::Value *result
1886    = emitARCValueOperation(*this, value,
1887                            CGM.getARCEntrypoints().objc_retainBlock,
1888                            "objc_retainBlock");
1889
1890  // If the copy isn't mandatory, add !clang.arc.copy_on_escape to
1891  // tell the optimizer that it doesn't need to do this copy if the
1892  // block doesn't escape, where being passed as an argument doesn't
1893  // count as escaping.
1894  if (!mandatory && isa<llvm::Instruction>(result)) {
1895    llvm::CallInst *call
1896      = cast<llvm::CallInst>(result->stripPointerCasts());
1897    assert(call->getCalledValue() == CGM.getARCEntrypoints().objc_retainBlock);
1898
1899    SmallVector<llvm::Value*,1> args;
1900    call->setMetadata("clang.arc.copy_on_escape",
1901                      llvm::MDNode::get(Builder.getContext(), args));
1902  }
1903
1904  return result;
1905}
1906
1907/// Retain the given object which is the result of a function call.
1908///   call i8* \@objc_retainAutoreleasedReturnValue(i8* %value)
1909///
1910/// Yes, this function name is one character away from a different
1911/// call with completely different semantics.
1912llvm::Value *
1913CodeGenFunction::EmitARCRetainAutoreleasedReturnValue(llvm::Value *value) {
1914  // Fetch the void(void) inline asm which marks that we're going to
1915  // retain the autoreleased return value.
1916  llvm::InlineAsm *&marker
1917    = CGM.getARCEntrypoints().retainAutoreleasedReturnValueMarker;
1918  if (!marker) {
1919    StringRef assembly
1920      = CGM.getTargetCodeGenInfo()
1921           .getARCRetainAutoreleasedReturnValueMarker();
1922
1923    // If we have an empty assembly string, there's nothing to do.
1924    if (assembly.empty()) {
1925
1926    // Otherwise, at -O0, build an inline asm that we're going to call
1927    // in a moment.
1928    } else if (CGM.getCodeGenOpts().OptimizationLevel == 0) {
1929      llvm::FunctionType *type =
1930        llvm::FunctionType::get(VoidTy, /*variadic*/false);
1931
1932      marker = llvm::InlineAsm::get(type, assembly, "", /*sideeffects*/ true);
1933
1934    // If we're at -O1 and above, we don't want to litter the code
1935    // with this marker yet, so leave a breadcrumb for the ARC
1936    // optimizer to pick up.
1937    } else {
1938      llvm::NamedMDNode *metadata =
1939        CGM.getModule().getOrInsertNamedMetadata(
1940                            "clang.arc.retainAutoreleasedReturnValueMarker");
1941      assert(metadata->getNumOperands() <= 1);
1942      if (metadata->getNumOperands() == 0) {
1943        llvm::Value *string = llvm::MDString::get(getLLVMContext(), assembly);
1944        metadata->addOperand(llvm::MDNode::get(getLLVMContext(), string));
1945      }
1946    }
1947  }
1948
1949  // Call the marker asm if we made one, which we do only at -O0.
1950  if (marker) Builder.CreateCall(marker);
1951
1952  return emitARCValueOperation(*this, value,
1953                     CGM.getARCEntrypoints().objc_retainAutoreleasedReturnValue,
1954                               "objc_retainAutoreleasedReturnValue");
1955}
1956
1957/// Release the given object.
1958///   call void \@objc_release(i8* %value)
1959void CodeGenFunction::EmitARCRelease(llvm::Value *value,
1960                                     ARCPreciseLifetime_t precise) {
1961  if (isa<llvm::ConstantPointerNull>(value)) return;
1962
1963  llvm::Constant *&fn = CGM.getARCEntrypoints().objc_release;
1964  if (!fn) {
1965    llvm::FunctionType *fnType =
1966      llvm::FunctionType::get(Builder.getVoidTy(), Int8PtrTy, false);
1967    fn = createARCRuntimeFunction(CGM, fnType, "objc_release");
1968  }
1969
1970  // Cast the argument to 'id'.
1971  value = Builder.CreateBitCast(value, Int8PtrTy);
1972
1973  // Call objc_release.
1974  llvm::CallInst *call = EmitNounwindRuntimeCall(fn, value);
1975
1976  if (precise == ARCImpreciseLifetime) {
1977    SmallVector<llvm::Value*,1> args;
1978    call->setMetadata("clang.imprecise_release",
1979                      llvm::MDNode::get(Builder.getContext(), args));
1980  }
1981}
1982
1983/// Destroy a __strong variable.
1984///
1985/// At -O0, emit a call to store 'null' into the address;
1986/// instrumenting tools prefer this because the address is exposed,
1987/// but it's relatively cumbersome to optimize.
1988///
1989/// At -O1 and above, just load and call objc_release.
1990///
1991///   call void \@objc_storeStrong(i8** %addr, i8* null)
1992void CodeGenFunction::EmitARCDestroyStrong(llvm::Value *addr,
1993                                           ARCPreciseLifetime_t precise) {
1994  if (CGM.getCodeGenOpts().OptimizationLevel == 0) {
1995    llvm::PointerType *addrTy = cast<llvm::PointerType>(addr->getType());
1996    llvm::Value *null = llvm::ConstantPointerNull::get(
1997                          cast<llvm::PointerType>(addrTy->getElementType()));
1998    EmitARCStoreStrongCall(addr, null, /*ignored*/ true);
1999    return;
2000  }
2001
2002  llvm::Value *value = Builder.CreateLoad(addr);
2003  EmitARCRelease(value, precise);
2004}
2005
2006/// Store into a strong object.  Always calls this:
2007///   call void \@objc_storeStrong(i8** %addr, i8* %value)
2008llvm::Value *CodeGenFunction::EmitARCStoreStrongCall(llvm::Value *addr,
2009                                                     llvm::Value *value,
2010                                                     bool ignored) {
2011  assert(cast<llvm::PointerType>(addr->getType())->getElementType()
2012           == value->getType());
2013
2014  llvm::Constant *&fn = CGM.getARCEntrypoints().objc_storeStrong;
2015  if (!fn) {
2016    llvm::Type *argTypes[] = { Int8PtrPtrTy, Int8PtrTy };
2017    llvm::FunctionType *fnType
2018      = llvm::FunctionType::get(Builder.getVoidTy(), argTypes, false);
2019    fn = createARCRuntimeFunction(CGM, fnType, "objc_storeStrong");
2020  }
2021
2022  llvm::Value *args[] = {
2023    Builder.CreateBitCast(addr, Int8PtrPtrTy),
2024    Builder.CreateBitCast(value, Int8PtrTy)
2025  };
2026  EmitNounwindRuntimeCall(fn, args);
2027
2028  if (ignored) return 0;
2029  return value;
2030}
2031
2032/// Store into a strong object.  Sometimes calls this:
2033///   call void \@objc_storeStrong(i8** %addr, i8* %value)
2034/// Other times, breaks it down into components.
2035llvm::Value *CodeGenFunction::EmitARCStoreStrong(LValue dst,
2036                                                 llvm::Value *newValue,
2037                                                 bool ignored) {
2038  QualType type = dst.getType();
2039  bool isBlock = type->isBlockPointerType();
2040
2041  // Use a store barrier at -O0 unless this is a block type or the
2042  // lvalue is inadequately aligned.
2043  if (shouldUseFusedARCCalls() &&
2044      !isBlock &&
2045      (dst.getAlignment().isZero() ||
2046       dst.getAlignment() >= CharUnits::fromQuantity(PointerAlignInBytes))) {
2047    return EmitARCStoreStrongCall(dst.getAddress(), newValue, ignored);
2048  }
2049
2050  // Otherwise, split it out.
2051
2052  // Retain the new value.
2053  newValue = EmitARCRetain(type, newValue);
2054
2055  // Read the old value.
2056  llvm::Value *oldValue = EmitLoadOfScalar(dst);
2057
2058  // Store.  We do this before the release so that any deallocs won't
2059  // see the old value.
2060  EmitStoreOfScalar(newValue, dst);
2061
2062  // Finally, release the old value.
2063  EmitARCRelease(oldValue, dst.isARCPreciseLifetime());
2064
2065  return newValue;
2066}
2067
2068/// Autorelease the given object.
2069///   call i8* \@objc_autorelease(i8* %value)
2070llvm::Value *CodeGenFunction::EmitARCAutorelease(llvm::Value *value) {
2071  return emitARCValueOperation(*this, value,
2072                               CGM.getARCEntrypoints().objc_autorelease,
2073                               "objc_autorelease");
2074}
2075
2076/// Autorelease the given object.
2077///   call i8* \@objc_autoreleaseReturnValue(i8* %value)
2078llvm::Value *
2079CodeGenFunction::EmitARCAutoreleaseReturnValue(llvm::Value *value) {
2080  return emitARCValueOperation(*this, value,
2081                            CGM.getARCEntrypoints().objc_autoreleaseReturnValue,
2082                               "objc_autoreleaseReturnValue",
2083                               /*isTailCall*/ true);
2084}
2085
2086/// Do a fused retain/autorelease of the given object.
2087///   call i8* \@objc_retainAutoreleaseReturnValue(i8* %value)
2088llvm::Value *
2089CodeGenFunction::EmitARCRetainAutoreleaseReturnValue(llvm::Value *value) {
2090  return emitARCValueOperation(*this, value,
2091                     CGM.getARCEntrypoints().objc_retainAutoreleaseReturnValue,
2092                               "objc_retainAutoreleaseReturnValue",
2093                               /*isTailCall*/ true);
2094}
2095
2096/// Do a fused retain/autorelease of the given object.
2097///   call i8* \@objc_retainAutorelease(i8* %value)
2098/// or
2099///   %retain = call i8* \@objc_retainBlock(i8* %value)
2100///   call i8* \@objc_autorelease(i8* %retain)
2101llvm::Value *CodeGenFunction::EmitARCRetainAutorelease(QualType type,
2102                                                       llvm::Value *value) {
2103  if (!type->isBlockPointerType())
2104    return EmitARCRetainAutoreleaseNonBlock(value);
2105
2106  if (isa<llvm::ConstantPointerNull>(value)) return value;
2107
2108  llvm::Type *origType = value->getType();
2109  value = Builder.CreateBitCast(value, Int8PtrTy);
2110  value = EmitARCRetainBlock(value, /*mandatory*/ true);
2111  value = EmitARCAutorelease(value);
2112  return Builder.CreateBitCast(value, origType);
2113}
2114
2115/// Do a fused retain/autorelease of the given object.
2116///   call i8* \@objc_retainAutorelease(i8* %value)
2117llvm::Value *
2118CodeGenFunction::EmitARCRetainAutoreleaseNonBlock(llvm::Value *value) {
2119  return emitARCValueOperation(*this, value,
2120                               CGM.getARCEntrypoints().objc_retainAutorelease,
2121                               "objc_retainAutorelease");
2122}
2123
2124/// i8* \@objc_loadWeak(i8** %addr)
2125/// Essentially objc_autorelease(objc_loadWeakRetained(addr)).
2126llvm::Value *CodeGenFunction::EmitARCLoadWeak(llvm::Value *addr) {
2127  return emitARCLoadOperation(*this, addr,
2128                              CGM.getARCEntrypoints().objc_loadWeak,
2129                              "objc_loadWeak");
2130}
2131
2132/// i8* \@objc_loadWeakRetained(i8** %addr)
2133llvm::Value *CodeGenFunction::EmitARCLoadWeakRetained(llvm::Value *addr) {
2134  return emitARCLoadOperation(*this, addr,
2135                              CGM.getARCEntrypoints().objc_loadWeakRetained,
2136                              "objc_loadWeakRetained");
2137}
2138
2139/// i8* \@objc_storeWeak(i8** %addr, i8* %value)
2140/// Returns %value.
2141llvm::Value *CodeGenFunction::EmitARCStoreWeak(llvm::Value *addr,
2142                                               llvm::Value *value,
2143                                               bool ignored) {
2144  return emitARCStoreOperation(*this, addr, value,
2145                               CGM.getARCEntrypoints().objc_storeWeak,
2146                               "objc_storeWeak", ignored);
2147}
2148
2149/// i8* \@objc_initWeak(i8** %addr, i8* %value)
2150/// Returns %value.  %addr is known to not have a current weak entry.
2151/// Essentially equivalent to:
2152///   *addr = nil; objc_storeWeak(addr, value);
2153void CodeGenFunction::EmitARCInitWeak(llvm::Value *addr, llvm::Value *value) {
2154  // If we're initializing to null, just write null to memory; no need
2155  // to get the runtime involved.  But don't do this if optimization
2156  // is enabled, because accounting for this would make the optimizer
2157  // much more complicated.
2158  if (isa<llvm::ConstantPointerNull>(value) &&
2159      CGM.getCodeGenOpts().OptimizationLevel == 0) {
2160    Builder.CreateStore(value, addr);
2161    return;
2162  }
2163
2164  emitARCStoreOperation(*this, addr, value,
2165                        CGM.getARCEntrypoints().objc_initWeak,
2166                        "objc_initWeak", /*ignored*/ true);
2167}
2168
2169/// void \@objc_destroyWeak(i8** %addr)
2170/// Essentially objc_storeWeak(addr, nil).
2171void CodeGenFunction::EmitARCDestroyWeak(llvm::Value *addr) {
2172  llvm::Constant *&fn = CGM.getARCEntrypoints().objc_destroyWeak;
2173  if (!fn) {
2174    llvm::FunctionType *fnType =
2175      llvm::FunctionType::get(Builder.getVoidTy(), Int8PtrPtrTy, false);
2176    fn = createARCRuntimeFunction(CGM, fnType, "objc_destroyWeak");
2177  }
2178
2179  // Cast the argument to 'id*'.
2180  addr = Builder.CreateBitCast(addr, Int8PtrPtrTy);
2181
2182  EmitNounwindRuntimeCall(fn, addr);
2183}
2184
2185/// void \@objc_moveWeak(i8** %dest, i8** %src)
2186/// Disregards the current value in %dest.  Leaves %src pointing to nothing.
2187/// Essentially (objc_copyWeak(dest, src), objc_destroyWeak(src)).
2188void CodeGenFunction::EmitARCMoveWeak(llvm::Value *dst, llvm::Value *src) {
2189  emitARCCopyOperation(*this, dst, src,
2190                       CGM.getARCEntrypoints().objc_moveWeak,
2191                       "objc_moveWeak");
2192}
2193
2194/// void \@objc_copyWeak(i8** %dest, i8** %src)
2195/// Disregards the current value in %dest.  Essentially
2196///   objc_release(objc_initWeak(dest, objc_readWeakRetained(src)))
2197void CodeGenFunction::EmitARCCopyWeak(llvm::Value *dst, llvm::Value *src) {
2198  emitARCCopyOperation(*this, dst, src,
2199                       CGM.getARCEntrypoints().objc_copyWeak,
2200                       "objc_copyWeak");
2201}
2202
2203/// Produce the code to do a objc_autoreleasepool_push.
2204///   call i8* \@objc_autoreleasePoolPush(void)
2205llvm::Value *CodeGenFunction::EmitObjCAutoreleasePoolPush() {
2206  llvm::Constant *&fn = CGM.getRREntrypoints().objc_autoreleasePoolPush;
2207  if (!fn) {
2208    llvm::FunctionType *fnType =
2209      llvm::FunctionType::get(Int8PtrTy, false);
2210    fn = createARCRuntimeFunction(CGM, fnType, "objc_autoreleasePoolPush");
2211  }
2212
2213  return EmitNounwindRuntimeCall(fn);
2214}
2215
2216/// Produce the code to do a primitive release.
2217///   call void \@objc_autoreleasePoolPop(i8* %ptr)
2218void CodeGenFunction::EmitObjCAutoreleasePoolPop(llvm::Value *value) {
2219  assert(value->getType() == Int8PtrTy);
2220
2221  llvm::Constant *&fn = CGM.getRREntrypoints().objc_autoreleasePoolPop;
2222  if (!fn) {
2223    llvm::FunctionType *fnType =
2224      llvm::FunctionType::get(Builder.getVoidTy(), Int8PtrTy, false);
2225
2226    // We don't want to use a weak import here; instead we should not
2227    // fall into this path.
2228    fn = createARCRuntimeFunction(CGM, fnType, "objc_autoreleasePoolPop");
2229  }
2230
2231  EmitNounwindRuntimeCall(fn, value);
2232}
2233
2234/// Produce the code to do an MRR version objc_autoreleasepool_push.
2235/// Which is: [[NSAutoreleasePool alloc] init];
2236/// Where alloc is declared as: + (id) alloc; in NSAutoreleasePool class.
2237/// init is declared as: - (id) init; in its NSObject super class.
2238///
2239llvm::Value *CodeGenFunction::EmitObjCMRRAutoreleasePoolPush() {
2240  CGObjCRuntime &Runtime = CGM.getObjCRuntime();
2241  llvm::Value *Receiver = Runtime.EmitNSAutoreleasePoolClassRef(*this);
2242  // [NSAutoreleasePool alloc]
2243  IdentifierInfo *II = &CGM.getContext().Idents.get("alloc");
2244  Selector AllocSel = getContext().Selectors.getSelector(0, &II);
2245  CallArgList Args;
2246  RValue AllocRV =
2247    Runtime.GenerateMessageSend(*this, ReturnValueSlot(),
2248                                getContext().getObjCIdType(),
2249                                AllocSel, Receiver, Args);
2250
2251  // [Receiver init]
2252  Receiver = AllocRV.getScalarVal();
2253  II = &CGM.getContext().Idents.get("init");
2254  Selector InitSel = getContext().Selectors.getSelector(0, &II);
2255  RValue InitRV =
2256    Runtime.GenerateMessageSend(*this, ReturnValueSlot(),
2257                                getContext().getObjCIdType(),
2258                                InitSel, Receiver, Args);
2259  return InitRV.getScalarVal();
2260}
2261
2262/// Produce the code to do a primitive release.
2263/// [tmp drain];
2264void CodeGenFunction::EmitObjCMRRAutoreleasePoolPop(llvm::Value *Arg) {
2265  IdentifierInfo *II = &CGM.getContext().Idents.get("drain");
2266  Selector DrainSel = getContext().Selectors.getSelector(0, &II);
2267  CallArgList Args;
2268  CGM.getObjCRuntime().GenerateMessageSend(*this, ReturnValueSlot(),
2269                              getContext().VoidTy, DrainSel, Arg, Args);
2270}
2271
2272void CodeGenFunction::destroyARCStrongPrecise(CodeGenFunction &CGF,
2273                                              llvm::Value *addr,
2274                                              QualType type) {
2275  CGF.EmitARCDestroyStrong(addr, ARCPreciseLifetime);
2276}
2277
2278void CodeGenFunction::destroyARCStrongImprecise(CodeGenFunction &CGF,
2279                                                llvm::Value *addr,
2280                                                QualType type) {
2281  CGF.EmitARCDestroyStrong(addr, ARCImpreciseLifetime);
2282}
2283
2284void CodeGenFunction::destroyARCWeak(CodeGenFunction &CGF,
2285                                     llvm::Value *addr,
2286                                     QualType type) {
2287  CGF.EmitARCDestroyWeak(addr);
2288}
2289
2290namespace {
2291  struct CallObjCAutoreleasePoolObject : EHScopeStack::Cleanup {
2292    llvm::Value *Token;
2293
2294    CallObjCAutoreleasePoolObject(llvm::Value *token) : Token(token) {}
2295
2296    void Emit(CodeGenFunction &CGF, Flags flags) {
2297      CGF.EmitObjCAutoreleasePoolPop(Token);
2298    }
2299  };
2300  struct CallObjCMRRAutoreleasePoolObject : EHScopeStack::Cleanup {
2301    llvm::Value *Token;
2302
2303    CallObjCMRRAutoreleasePoolObject(llvm::Value *token) : Token(token) {}
2304
2305    void Emit(CodeGenFunction &CGF, Flags flags) {
2306      CGF.EmitObjCMRRAutoreleasePoolPop(Token);
2307    }
2308  };
2309}
2310
2311void CodeGenFunction::EmitObjCAutoreleasePoolCleanup(llvm::Value *Ptr) {
2312  if (CGM.getLangOpts().ObjCAutoRefCount)
2313    EHStack.pushCleanup<CallObjCAutoreleasePoolObject>(NormalCleanup, Ptr);
2314  else
2315    EHStack.pushCleanup<CallObjCMRRAutoreleasePoolObject>(NormalCleanup, Ptr);
2316}
2317
2318static TryEmitResult tryEmitARCRetainLoadOfScalar(CodeGenFunction &CGF,
2319                                                  LValue lvalue,
2320                                                  QualType type) {
2321  switch (type.getObjCLifetime()) {
2322  case Qualifiers::OCL_None:
2323  case Qualifiers::OCL_ExplicitNone:
2324  case Qualifiers::OCL_Strong:
2325  case Qualifiers::OCL_Autoreleasing:
2326    return TryEmitResult(CGF.EmitLoadOfLValue(lvalue).getScalarVal(),
2327                         false);
2328
2329  case Qualifiers::OCL_Weak:
2330    return TryEmitResult(CGF.EmitARCLoadWeakRetained(lvalue.getAddress()),
2331                         true);
2332  }
2333
2334  llvm_unreachable("impossible lifetime!");
2335}
2336
2337static TryEmitResult tryEmitARCRetainLoadOfScalar(CodeGenFunction &CGF,
2338                                                  const Expr *e) {
2339  e = e->IgnoreParens();
2340  QualType type = e->getType();
2341
2342  // If we're loading retained from a __strong xvalue, we can avoid
2343  // an extra retain/release pair by zeroing out the source of this
2344  // "move" operation.
2345  if (e->isXValue() &&
2346      !type.isConstQualified() &&
2347      type.getObjCLifetime() == Qualifiers::OCL_Strong) {
2348    // Emit the lvalue.
2349    LValue lv = CGF.EmitLValue(e);
2350
2351    // Load the object pointer.
2352    llvm::Value *result = CGF.EmitLoadOfLValue(lv).getScalarVal();
2353
2354    // Set the source pointer to NULL.
2355    CGF.EmitStoreOfScalar(getNullForVariable(lv.getAddress()), lv);
2356
2357    return TryEmitResult(result, true);
2358  }
2359
2360  // As a very special optimization, in ARC++, if the l-value is the
2361  // result of a non-volatile assignment, do a simple retain of the
2362  // result of the call to objc_storeWeak instead of reloading.
2363  if (CGF.getLangOpts().CPlusPlus &&
2364      !type.isVolatileQualified() &&
2365      type.getObjCLifetime() == Qualifiers::OCL_Weak &&
2366      isa<BinaryOperator>(e) &&
2367      cast<BinaryOperator>(e)->getOpcode() == BO_Assign)
2368    return TryEmitResult(CGF.EmitScalarExpr(e), false);
2369
2370  return tryEmitARCRetainLoadOfScalar(CGF, CGF.EmitLValue(e), type);
2371}
2372
2373static llvm::Value *emitARCRetainAfterCall(CodeGenFunction &CGF,
2374                                           llvm::Value *value);
2375
2376/// Given that the given expression is some sort of call (which does
2377/// not return retained), emit a retain following it.
2378static llvm::Value *emitARCRetainCall(CodeGenFunction &CGF, const Expr *e) {
2379  llvm::Value *value = CGF.EmitScalarExpr(e);
2380  return emitARCRetainAfterCall(CGF, value);
2381}
2382
2383static llvm::Value *emitARCRetainAfterCall(CodeGenFunction &CGF,
2384                                           llvm::Value *value) {
2385  if (llvm::CallInst *call = dyn_cast<llvm::CallInst>(value)) {
2386    CGBuilderTy::InsertPoint ip = CGF.Builder.saveIP();
2387
2388    // Place the retain immediately following the call.
2389    CGF.Builder.SetInsertPoint(call->getParent(),
2390                               ++llvm::BasicBlock::iterator(call));
2391    value = CGF.EmitARCRetainAutoreleasedReturnValue(value);
2392
2393    CGF.Builder.restoreIP(ip);
2394    return value;
2395  } else if (llvm::InvokeInst *invoke = dyn_cast<llvm::InvokeInst>(value)) {
2396    CGBuilderTy::InsertPoint ip = CGF.Builder.saveIP();
2397
2398    // Place the retain at the beginning of the normal destination block.
2399    llvm::BasicBlock *BB = invoke->getNormalDest();
2400    CGF.Builder.SetInsertPoint(BB, BB->begin());
2401    value = CGF.EmitARCRetainAutoreleasedReturnValue(value);
2402
2403    CGF.Builder.restoreIP(ip);
2404    return value;
2405
2406  // Bitcasts can arise because of related-result returns.  Rewrite
2407  // the operand.
2408  } else if (llvm::BitCastInst *bitcast = dyn_cast<llvm::BitCastInst>(value)) {
2409    llvm::Value *operand = bitcast->getOperand(0);
2410    operand = emitARCRetainAfterCall(CGF, operand);
2411    bitcast->setOperand(0, operand);
2412    return bitcast;
2413
2414  // Generic fall-back case.
2415  } else {
2416    // Retain using the non-block variant: we never need to do a copy
2417    // of a block that's been returned to us.
2418    return CGF.EmitARCRetainNonBlock(value);
2419  }
2420}
2421
2422/// Determine whether it might be important to emit a separate
2423/// objc_retain_block on the result of the given expression, or
2424/// whether it's okay to just emit it in a +1 context.
2425static bool shouldEmitSeparateBlockRetain(const Expr *e) {
2426  assert(e->getType()->isBlockPointerType());
2427  e = e->IgnoreParens();
2428
2429  // For future goodness, emit block expressions directly in +1
2430  // contexts if we can.
2431  if (isa<BlockExpr>(e))
2432    return false;
2433
2434  if (const CastExpr *cast = dyn_cast<CastExpr>(e)) {
2435    switch (cast->getCastKind()) {
2436    // Emitting these operations in +1 contexts is goodness.
2437    case CK_LValueToRValue:
2438    case CK_ARCReclaimReturnedObject:
2439    case CK_ARCConsumeObject:
2440    case CK_ARCProduceObject:
2441      return false;
2442
2443    // These operations preserve a block type.
2444    case CK_NoOp:
2445    case CK_BitCast:
2446      return shouldEmitSeparateBlockRetain(cast->getSubExpr());
2447
2448    // These operations are known to be bad (or haven't been considered).
2449    case CK_AnyPointerToBlockPointerCast:
2450    default:
2451      return true;
2452    }
2453  }
2454
2455  return true;
2456}
2457
2458/// Try to emit a PseudoObjectExpr at +1.
2459///
2460/// This massively duplicates emitPseudoObjectRValue.
2461static TryEmitResult tryEmitARCRetainPseudoObject(CodeGenFunction &CGF,
2462                                                  const PseudoObjectExpr *E) {
2463  SmallVector<CodeGenFunction::OpaqueValueMappingData, 4> opaques;
2464
2465  // Find the result expression.
2466  const Expr *resultExpr = E->getResultExpr();
2467  assert(resultExpr);
2468  TryEmitResult result;
2469
2470  for (PseudoObjectExpr::const_semantics_iterator
2471         i = E->semantics_begin(), e = E->semantics_end(); i != e; ++i) {
2472    const Expr *semantic = *i;
2473
2474    // If this semantic expression is an opaque value, bind it
2475    // to the result of its source expression.
2476    if (const OpaqueValueExpr *ov = dyn_cast<OpaqueValueExpr>(semantic)) {
2477      typedef CodeGenFunction::OpaqueValueMappingData OVMA;
2478      OVMA opaqueData;
2479
2480      // If this semantic is the result of the pseudo-object
2481      // expression, try to evaluate the source as +1.
2482      if (ov == resultExpr) {
2483        assert(!OVMA::shouldBindAsLValue(ov));
2484        result = tryEmitARCRetainScalarExpr(CGF, ov->getSourceExpr());
2485        opaqueData = OVMA::bind(CGF, ov, RValue::get(result.getPointer()));
2486
2487      // Otherwise, just bind it.
2488      } else {
2489        opaqueData = OVMA::bind(CGF, ov, ov->getSourceExpr());
2490      }
2491      opaques.push_back(opaqueData);
2492
2493    // Otherwise, if the expression is the result, evaluate it
2494    // and remember the result.
2495    } else if (semantic == resultExpr) {
2496      result = tryEmitARCRetainScalarExpr(CGF, semantic);
2497
2498    // Otherwise, evaluate the expression in an ignored context.
2499    } else {
2500      CGF.EmitIgnoredExpr(semantic);
2501    }
2502  }
2503
2504  // Unbind all the opaques now.
2505  for (unsigned i = 0, e = opaques.size(); i != e; ++i)
2506    opaques[i].unbind(CGF);
2507
2508  return result;
2509}
2510
2511static TryEmitResult
2512tryEmitARCRetainScalarExpr(CodeGenFunction &CGF, const Expr *e) {
2513  // We should *never* see a nested full-expression here, because if
2514  // we fail to emit at +1, our caller must not retain after we close
2515  // out the full-expression.
2516  assert(!isa<ExprWithCleanups>(e));
2517
2518  // The desired result type, if it differs from the type of the
2519  // ultimate opaque expression.
2520  llvm::Type *resultType = 0;
2521
2522  while (true) {
2523    e = e->IgnoreParens();
2524
2525    // There's a break at the end of this if-chain;  anything
2526    // that wants to keep looping has to explicitly continue.
2527    if (const CastExpr *ce = dyn_cast<CastExpr>(e)) {
2528      switch (ce->getCastKind()) {
2529      // No-op casts don't change the type, so we just ignore them.
2530      case CK_NoOp:
2531        e = ce->getSubExpr();
2532        continue;
2533
2534      case CK_LValueToRValue: {
2535        TryEmitResult loadResult
2536          = tryEmitARCRetainLoadOfScalar(CGF, ce->getSubExpr());
2537        if (resultType) {
2538          llvm::Value *value = loadResult.getPointer();
2539          value = CGF.Builder.CreateBitCast(value, resultType);
2540          loadResult.setPointer(value);
2541        }
2542        return loadResult;
2543      }
2544
2545      // These casts can change the type, so remember that and
2546      // soldier on.  We only need to remember the outermost such
2547      // cast, though.
2548      case CK_CPointerToObjCPointerCast:
2549      case CK_BlockPointerToObjCPointerCast:
2550      case CK_AnyPointerToBlockPointerCast:
2551      case CK_BitCast:
2552        if (!resultType)
2553          resultType = CGF.ConvertType(ce->getType());
2554        e = ce->getSubExpr();
2555        assert(e->getType()->hasPointerRepresentation());
2556        continue;
2557
2558      // For consumptions, just emit the subexpression and thus elide
2559      // the retain/release pair.
2560      case CK_ARCConsumeObject: {
2561        llvm::Value *result = CGF.EmitScalarExpr(ce->getSubExpr());
2562        if (resultType) result = CGF.Builder.CreateBitCast(result, resultType);
2563        return TryEmitResult(result, true);
2564      }
2565
2566      // Block extends are net +0.  Naively, we could just recurse on
2567      // the subexpression, but actually we need to ensure that the
2568      // value is copied as a block, so there's a little filter here.
2569      case CK_ARCExtendBlockObject: {
2570        llvm::Value *result; // will be a +0 value
2571
2572        // If we can't safely assume the sub-expression will produce a
2573        // block-copied value, emit the sub-expression at +0.
2574        if (shouldEmitSeparateBlockRetain(ce->getSubExpr())) {
2575          result = CGF.EmitScalarExpr(ce->getSubExpr());
2576
2577        // Otherwise, try to emit the sub-expression at +1 recursively.
2578        } else {
2579          TryEmitResult subresult
2580            = tryEmitARCRetainScalarExpr(CGF, ce->getSubExpr());
2581          result = subresult.getPointer();
2582
2583          // If that produced a retained value, just use that,
2584          // possibly casting down.
2585          if (subresult.getInt()) {
2586            if (resultType)
2587              result = CGF.Builder.CreateBitCast(result, resultType);
2588            return TryEmitResult(result, true);
2589          }
2590
2591          // Otherwise it's +0.
2592        }
2593
2594        // Retain the object as a block, then cast down.
2595        result = CGF.EmitARCRetainBlock(result, /*mandatory*/ true);
2596        if (resultType) result = CGF.Builder.CreateBitCast(result, resultType);
2597        return TryEmitResult(result, true);
2598      }
2599
2600      // For reclaims, emit the subexpression as a retained call and
2601      // skip the consumption.
2602      case CK_ARCReclaimReturnedObject: {
2603        llvm::Value *result = emitARCRetainCall(CGF, ce->getSubExpr());
2604        if (resultType) result = CGF.Builder.CreateBitCast(result, resultType);
2605        return TryEmitResult(result, true);
2606      }
2607
2608      default:
2609        break;
2610      }
2611
2612    // Skip __extension__.
2613    } else if (const UnaryOperator *op = dyn_cast<UnaryOperator>(e)) {
2614      if (op->getOpcode() == UO_Extension) {
2615        e = op->getSubExpr();
2616        continue;
2617      }
2618
2619    // For calls and message sends, use the retained-call logic.
2620    // Delegate inits are a special case in that they're the only
2621    // returns-retained expression that *isn't* surrounded by
2622    // a consume.
2623    } else if (isa<CallExpr>(e) ||
2624               (isa<ObjCMessageExpr>(e) &&
2625                !cast<ObjCMessageExpr>(e)->isDelegateInitCall())) {
2626      llvm::Value *result = emitARCRetainCall(CGF, e);
2627      if (resultType) result = CGF.Builder.CreateBitCast(result, resultType);
2628      return TryEmitResult(result, true);
2629
2630    // Look through pseudo-object expressions.
2631    } else if (const PseudoObjectExpr *pseudo = dyn_cast<PseudoObjectExpr>(e)) {
2632      TryEmitResult result
2633        = tryEmitARCRetainPseudoObject(CGF, pseudo);
2634      if (resultType) {
2635        llvm::Value *value = result.getPointer();
2636        value = CGF.Builder.CreateBitCast(value, resultType);
2637        result.setPointer(value);
2638      }
2639      return result;
2640    }
2641
2642    // Conservatively halt the search at any other expression kind.
2643    break;
2644  }
2645
2646  // We didn't find an obvious production, so emit what we've got and
2647  // tell the caller that we didn't manage to retain.
2648  llvm::Value *result = CGF.EmitScalarExpr(e);
2649  if (resultType) result = CGF.Builder.CreateBitCast(result, resultType);
2650  return TryEmitResult(result, false);
2651}
2652
2653static llvm::Value *emitARCRetainLoadOfScalar(CodeGenFunction &CGF,
2654                                                LValue lvalue,
2655                                                QualType type) {
2656  TryEmitResult result = tryEmitARCRetainLoadOfScalar(CGF, lvalue, type);
2657  llvm::Value *value = result.getPointer();
2658  if (!result.getInt())
2659    value = CGF.EmitARCRetain(type, value);
2660  return value;
2661}
2662
2663/// EmitARCRetainScalarExpr - Semantically equivalent to
2664/// EmitARCRetainObject(e->getType(), EmitScalarExpr(e)), but making a
2665/// best-effort attempt to peephole expressions that naturally produce
2666/// retained objects.
2667llvm::Value *CodeGenFunction::EmitARCRetainScalarExpr(const Expr *e) {
2668  // The retain needs to happen within the full-expression.
2669  if (const ExprWithCleanups *cleanups = dyn_cast<ExprWithCleanups>(e)) {
2670    enterFullExpression(cleanups);
2671    RunCleanupsScope scope(*this);
2672    return EmitARCRetainScalarExpr(cleanups->getSubExpr());
2673  }
2674
2675  TryEmitResult result = tryEmitARCRetainScalarExpr(*this, e);
2676  llvm::Value *value = result.getPointer();
2677  if (!result.getInt())
2678    value = EmitARCRetain(e->getType(), value);
2679  return value;
2680}
2681
2682llvm::Value *
2683CodeGenFunction::EmitARCRetainAutoreleaseScalarExpr(const Expr *e) {
2684  // The retain needs to happen within the full-expression.
2685  if (const ExprWithCleanups *cleanups = dyn_cast<ExprWithCleanups>(e)) {
2686    enterFullExpression(cleanups);
2687    RunCleanupsScope scope(*this);
2688    return EmitARCRetainAutoreleaseScalarExpr(cleanups->getSubExpr());
2689  }
2690
2691  TryEmitResult result = tryEmitARCRetainScalarExpr(*this, e);
2692  llvm::Value *value = result.getPointer();
2693  if (result.getInt())
2694    value = EmitARCAutorelease(value);
2695  else
2696    value = EmitARCRetainAutorelease(e->getType(), value);
2697  return value;
2698}
2699
2700llvm::Value *CodeGenFunction::EmitARCExtendBlockObject(const Expr *e) {
2701  llvm::Value *result;
2702  bool doRetain;
2703
2704  if (shouldEmitSeparateBlockRetain(e)) {
2705    result = EmitScalarExpr(e);
2706    doRetain = true;
2707  } else {
2708    TryEmitResult subresult = tryEmitARCRetainScalarExpr(*this, e);
2709    result = subresult.getPointer();
2710    doRetain = !subresult.getInt();
2711  }
2712
2713  if (doRetain)
2714    result = EmitARCRetainBlock(result, /*mandatory*/ true);
2715  return EmitObjCConsumeObject(e->getType(), result);
2716}
2717
2718llvm::Value *CodeGenFunction::EmitObjCThrowOperand(const Expr *expr) {
2719  // In ARC, retain and autorelease the expression.
2720  if (getLangOpts().ObjCAutoRefCount) {
2721    // Do so before running any cleanups for the full-expression.
2722    // EmitARCRetainAutoreleaseScalarExpr does this for us.
2723    return EmitARCRetainAutoreleaseScalarExpr(expr);
2724  }
2725
2726  // Otherwise, use the normal scalar-expression emission.  The
2727  // exception machinery doesn't do anything special with the
2728  // exception like retaining it, so there's no safety associated with
2729  // only running cleanups after the throw has started, and when it
2730  // matters it tends to be substantially inferior code.
2731  return EmitScalarExpr(expr);
2732}
2733
2734std::pair<LValue,llvm::Value*>
2735CodeGenFunction::EmitARCStoreStrong(const BinaryOperator *e,
2736                                    bool ignored) {
2737  // Evaluate the RHS first.
2738  TryEmitResult result = tryEmitARCRetainScalarExpr(*this, e->getRHS());
2739  llvm::Value *value = result.getPointer();
2740
2741  bool hasImmediateRetain = result.getInt();
2742
2743  // If we didn't emit a retained object, and the l-value is of block
2744  // type, then we need to emit the block-retain immediately in case
2745  // it invalidates the l-value.
2746  if (!hasImmediateRetain && e->getType()->isBlockPointerType()) {
2747    value = EmitARCRetainBlock(value, /*mandatory*/ false);
2748    hasImmediateRetain = true;
2749  }
2750
2751  LValue lvalue = EmitLValue(e->getLHS());
2752
2753  // If the RHS was emitted retained, expand this.
2754  if (hasImmediateRetain) {
2755    llvm::Value *oldValue =
2756      EmitLoadOfScalar(lvalue);
2757    EmitStoreOfScalar(value, lvalue);
2758    EmitARCRelease(oldValue, lvalue.isARCPreciseLifetime());
2759  } else {
2760    value = EmitARCStoreStrong(lvalue, value, ignored);
2761  }
2762
2763  return std::pair<LValue,llvm::Value*>(lvalue, value);
2764}
2765
2766std::pair<LValue,llvm::Value*>
2767CodeGenFunction::EmitARCStoreAutoreleasing(const BinaryOperator *e) {
2768  llvm::Value *value = EmitARCRetainAutoreleaseScalarExpr(e->getRHS());
2769  LValue lvalue = EmitLValue(e->getLHS());
2770
2771  EmitStoreOfScalar(value, lvalue);
2772
2773  return std::pair<LValue,llvm::Value*>(lvalue, value);
2774}
2775
2776void CodeGenFunction::EmitObjCAutoreleasePoolStmt(
2777                                          const ObjCAutoreleasePoolStmt &ARPS) {
2778  const Stmt *subStmt = ARPS.getSubStmt();
2779  const CompoundStmt &S = cast<CompoundStmt>(*subStmt);
2780
2781  CGDebugInfo *DI = getDebugInfo();
2782  if (DI)
2783    DI->EmitLexicalBlockStart(Builder, S.getLBracLoc());
2784
2785  // Keep track of the current cleanup stack depth.
2786  RunCleanupsScope Scope(*this);
2787  if (CGM.getLangOpts().ObjCRuntime.hasNativeARC()) {
2788    llvm::Value *token = EmitObjCAutoreleasePoolPush();
2789    EHStack.pushCleanup<CallObjCAutoreleasePoolObject>(NormalCleanup, token);
2790  } else {
2791    llvm::Value *token = EmitObjCMRRAutoreleasePoolPush();
2792    EHStack.pushCleanup<CallObjCMRRAutoreleasePoolObject>(NormalCleanup, token);
2793  }
2794
2795  for (CompoundStmt::const_body_iterator I = S.body_begin(),
2796       E = S.body_end(); I != E; ++I)
2797    EmitStmt(*I);
2798
2799  if (DI)
2800    DI->EmitLexicalBlockEnd(Builder, S.getRBracLoc());
2801}
2802
2803/// EmitExtendGCLifetime - Given a pointer to an Objective-C object,
2804/// make sure it survives garbage collection until this point.
2805void CodeGenFunction::EmitExtendGCLifetime(llvm::Value *object) {
2806  // We just use an inline assembly.
2807  llvm::FunctionType *extenderType
2808    = llvm::FunctionType::get(VoidTy, VoidPtrTy, RequiredArgs::All);
2809  llvm::Value *extender
2810    = llvm::InlineAsm::get(extenderType,
2811                           /* assembly */ "",
2812                           /* constraints */ "r",
2813                           /* side effects */ true);
2814
2815  object = Builder.CreateBitCast(object, VoidPtrTy);
2816  EmitNounwindRuntimeCall(extender, object);
2817}
2818
2819/// GenerateObjCAtomicSetterCopyHelperFunction - Given a c++ object type with
2820/// non-trivial copy assignment function, produce following helper function.
2821/// static void copyHelper(Ty *dest, const Ty *source) { *dest = *source; }
2822///
2823llvm::Constant *
2824CodeGenFunction::GenerateObjCAtomicSetterCopyHelperFunction(
2825                                        const ObjCPropertyImplDecl *PID) {
2826  if (!getLangOpts().CPlusPlus ||
2827      !getLangOpts().ObjCRuntime.hasAtomicCopyHelper())
2828    return 0;
2829  QualType Ty = PID->getPropertyIvarDecl()->getType();
2830  if (!Ty->isRecordType())
2831    return 0;
2832  const ObjCPropertyDecl *PD = PID->getPropertyDecl();
2833  if ((!(PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_atomic)))
2834    return 0;
2835  llvm::Constant * HelperFn = 0;
2836  if (hasTrivialSetExpr(PID))
2837    return 0;
2838  assert(PID->getSetterCXXAssignment() && "SetterCXXAssignment - null");
2839  if ((HelperFn = CGM.getAtomicSetterHelperFnMap(Ty)))
2840    return HelperFn;
2841
2842  ASTContext &C = getContext();
2843  IdentifierInfo *II
2844    = &CGM.getContext().Idents.get("__assign_helper_atomic_property_");
2845  FunctionDecl *FD = FunctionDecl::Create(C,
2846                                          C.getTranslationUnitDecl(),
2847                                          SourceLocation(),
2848                                          SourceLocation(), II, C.VoidTy, 0,
2849                                          SC_Static,
2850                                          SC_None,
2851                                          false,
2852                                          false);
2853
2854  QualType DestTy = C.getPointerType(Ty);
2855  QualType SrcTy = Ty;
2856  SrcTy.addConst();
2857  SrcTy = C.getPointerType(SrcTy);
2858
2859  FunctionArgList args;
2860  ImplicitParamDecl dstDecl(FD, SourceLocation(), 0, DestTy);
2861  args.push_back(&dstDecl);
2862  ImplicitParamDecl srcDecl(FD, SourceLocation(), 0, SrcTy);
2863  args.push_back(&srcDecl);
2864
2865  const CGFunctionInfo &FI =
2866    CGM.getTypes().arrangeFunctionDeclaration(C.VoidTy, args,
2867                                              FunctionType::ExtInfo(),
2868                                              RequiredArgs::All);
2869
2870  llvm::FunctionType *LTy = CGM.getTypes().GetFunctionType(FI);
2871
2872  llvm::Function *Fn =
2873    llvm::Function::Create(LTy, llvm::GlobalValue::InternalLinkage,
2874                           "__assign_helper_atomic_property_",
2875                           &CGM.getModule());
2876
2877  // Initialize debug info if needed.
2878  maybeInitializeDebugInfo();
2879
2880  StartFunction(FD, C.VoidTy, Fn, FI, args, SourceLocation());
2881
2882  DeclRefExpr DstExpr(&dstDecl, false, DestTy,
2883                      VK_RValue, SourceLocation());
2884  UnaryOperator DST(&DstExpr, UO_Deref, DestTy->getPointeeType(),
2885                    VK_LValue, OK_Ordinary, SourceLocation());
2886
2887  DeclRefExpr SrcExpr(&srcDecl, false, SrcTy,
2888                      VK_RValue, SourceLocation());
2889  UnaryOperator SRC(&SrcExpr, UO_Deref, SrcTy->getPointeeType(),
2890                    VK_LValue, OK_Ordinary, SourceLocation());
2891
2892  Expr *Args[2] = { &DST, &SRC };
2893  CallExpr *CalleeExp = cast<CallExpr>(PID->getSetterCXXAssignment());
2894  CXXOperatorCallExpr TheCall(C, OO_Equal, CalleeExp->getCallee(),
2895                              Args, DestTy->getPointeeType(),
2896                              VK_LValue, SourceLocation(), false);
2897
2898  EmitStmt(&TheCall);
2899
2900  FinishFunction();
2901  HelperFn = llvm::ConstantExpr::getBitCast(Fn, VoidPtrTy);
2902  CGM.setAtomicSetterHelperFnMap(Ty, HelperFn);
2903  return HelperFn;
2904}
2905
2906llvm::Constant *
2907CodeGenFunction::GenerateObjCAtomicGetterCopyHelperFunction(
2908                                            const ObjCPropertyImplDecl *PID) {
2909  if (!getLangOpts().CPlusPlus ||
2910      !getLangOpts().ObjCRuntime.hasAtomicCopyHelper())
2911    return 0;
2912  const ObjCPropertyDecl *PD = PID->getPropertyDecl();
2913  QualType Ty = PD->getType();
2914  if (!Ty->isRecordType())
2915    return 0;
2916  if ((!(PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_atomic)))
2917    return 0;
2918  llvm::Constant * HelperFn = 0;
2919
2920  if (hasTrivialGetExpr(PID))
2921    return 0;
2922  assert(PID->getGetterCXXConstructor() && "getGetterCXXConstructor - null");
2923  if ((HelperFn = CGM.getAtomicGetterHelperFnMap(Ty)))
2924    return HelperFn;
2925
2926
2927  ASTContext &C = getContext();
2928  IdentifierInfo *II
2929  = &CGM.getContext().Idents.get("__copy_helper_atomic_property_");
2930  FunctionDecl *FD = FunctionDecl::Create(C,
2931                                          C.getTranslationUnitDecl(),
2932                                          SourceLocation(),
2933                                          SourceLocation(), II, C.VoidTy, 0,
2934                                          SC_Static,
2935                                          SC_None,
2936                                          false,
2937                                          false);
2938
2939  QualType DestTy = C.getPointerType(Ty);
2940  QualType SrcTy = Ty;
2941  SrcTy.addConst();
2942  SrcTy = C.getPointerType(SrcTy);
2943
2944  FunctionArgList args;
2945  ImplicitParamDecl dstDecl(FD, SourceLocation(), 0, DestTy);
2946  args.push_back(&dstDecl);
2947  ImplicitParamDecl srcDecl(FD, SourceLocation(), 0, SrcTy);
2948  args.push_back(&srcDecl);
2949
2950  const CGFunctionInfo &FI =
2951  CGM.getTypes().arrangeFunctionDeclaration(C.VoidTy, args,
2952                                            FunctionType::ExtInfo(),
2953                                            RequiredArgs::All);
2954
2955  llvm::FunctionType *LTy = CGM.getTypes().GetFunctionType(FI);
2956
2957  llvm::Function *Fn =
2958  llvm::Function::Create(LTy, llvm::GlobalValue::InternalLinkage,
2959                         "__copy_helper_atomic_property_", &CGM.getModule());
2960
2961  // Initialize debug info if needed.
2962  maybeInitializeDebugInfo();
2963
2964  StartFunction(FD, C.VoidTy, Fn, FI, args, SourceLocation());
2965
2966  DeclRefExpr SrcExpr(&srcDecl, false, SrcTy,
2967                      VK_RValue, SourceLocation());
2968
2969  UnaryOperator SRC(&SrcExpr, UO_Deref, SrcTy->getPointeeType(),
2970                    VK_LValue, OK_Ordinary, SourceLocation());
2971
2972  CXXConstructExpr *CXXConstExpr =
2973    cast<CXXConstructExpr>(PID->getGetterCXXConstructor());
2974
2975  SmallVector<Expr*, 4> ConstructorArgs;
2976  ConstructorArgs.push_back(&SRC);
2977  CXXConstructExpr::arg_iterator A = CXXConstExpr->arg_begin();
2978  ++A;
2979
2980  for (CXXConstructExpr::arg_iterator AEnd = CXXConstExpr->arg_end();
2981       A != AEnd; ++A)
2982    ConstructorArgs.push_back(*A);
2983
2984  CXXConstructExpr *TheCXXConstructExpr =
2985    CXXConstructExpr::Create(C, Ty, SourceLocation(),
2986                             CXXConstExpr->getConstructor(),
2987                             CXXConstExpr->isElidable(),
2988                             ConstructorArgs,
2989                             CXXConstExpr->hadMultipleCandidates(),
2990                             CXXConstExpr->isListInitialization(),
2991                             CXXConstExpr->requiresZeroInitialization(),
2992                             CXXConstExpr->getConstructionKind(),
2993                             SourceRange());
2994
2995  DeclRefExpr DstExpr(&dstDecl, false, DestTy,
2996                      VK_RValue, SourceLocation());
2997
2998  RValue DV = EmitAnyExpr(&DstExpr);
2999  CharUnits Alignment
3000    = getContext().getTypeAlignInChars(TheCXXConstructExpr->getType());
3001  EmitAggExpr(TheCXXConstructExpr,
3002              AggValueSlot::forAddr(DV.getScalarVal(), Alignment, Qualifiers(),
3003                                    AggValueSlot::IsDestructed,
3004                                    AggValueSlot::DoesNotNeedGCBarriers,
3005                                    AggValueSlot::IsNotAliased));
3006
3007  FinishFunction();
3008  HelperFn = llvm::ConstantExpr::getBitCast(Fn, VoidPtrTy);
3009  CGM.setAtomicGetterHelperFnMap(Ty, HelperFn);
3010  return HelperFn;
3011}
3012
3013llvm::Value *
3014CodeGenFunction::EmitBlockCopyAndAutorelease(llvm::Value *Block, QualType Ty) {
3015  // Get selectors for retain/autorelease.
3016  IdentifierInfo *CopyID = &getContext().Idents.get("copy");
3017  Selector CopySelector =
3018      getContext().Selectors.getNullarySelector(CopyID);
3019  IdentifierInfo *AutoreleaseID = &getContext().Idents.get("autorelease");
3020  Selector AutoreleaseSelector =
3021      getContext().Selectors.getNullarySelector(AutoreleaseID);
3022
3023  // Emit calls to retain/autorelease.
3024  CGObjCRuntime &Runtime = CGM.getObjCRuntime();
3025  llvm::Value *Val = Block;
3026  RValue Result;
3027  Result = Runtime.GenerateMessageSend(*this, ReturnValueSlot(),
3028                                       Ty, CopySelector,
3029                                       Val, CallArgList(), 0, 0);
3030  Val = Result.getScalarVal();
3031  Result = Runtime.GenerateMessageSend(*this, ReturnValueSlot(),
3032                                       Ty, AutoreleaseSelector,
3033                                       Val, CallArgList(), 0, 0);
3034  Val = Result.getScalarVal();
3035  return Val;
3036}
3037
3038
3039CGObjCRuntime::~CGObjCRuntime() {}
3040