clang API Documentation

CGExpr.cpp
Go to the documentation of this file.
00001 //===--- CGExpr.cpp - Emit LLVM Code from Expressions ---------------------===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 //
00010 // This contains code to emit Expr nodes as LLVM code.
00011 //
00012 //===----------------------------------------------------------------------===//
00013 
00014 #include "CodeGenFunction.h"
00015 #include "CodeGenModule.h"
00016 #include "CGCall.h"
00017 #include "CGCXXABI.h"
00018 #include "CGDebugInfo.h"
00019 #include "CGRecordLayout.h"
00020 #include "CGObjCRuntime.h"
00021 #include "TargetInfo.h"
00022 #include "clang/AST/ASTContext.h"
00023 #include "clang/AST/DeclObjC.h"
00024 #include "clang/Frontend/CodeGenOptions.h"
00025 #include "llvm/Intrinsics.h"
00026 #include "llvm/LLVMContext.h"
00027 #include "llvm/Support/MDBuilder.h"
00028 #include "llvm/Target/TargetData.h"
00029 using namespace clang;
00030 using namespace CodeGen;
00031 
00032 //===--------------------------------------------------------------------===//
00033 //                        Miscellaneous Helper Methods
00034 //===--------------------------------------------------------------------===//
00035 
00036 llvm::Value *CodeGenFunction::EmitCastToVoidPtr(llvm::Value *value) {
00037   unsigned addressSpace =
00038     cast<llvm::PointerType>(value->getType())->getAddressSpace();
00039 
00040   llvm::PointerType *destType = Int8PtrTy;
00041   if (addressSpace)
00042     destType = llvm::Type::getInt8PtrTy(getLLVMContext(), addressSpace);
00043 
00044   if (value->getType() == destType) return value;
00045   return Builder.CreateBitCast(value, destType);
00046 }
00047 
00048 /// CreateTempAlloca - This creates a alloca and inserts it into the entry
00049 /// block.
00050 llvm::AllocaInst *CodeGenFunction::CreateTempAlloca(llvm::Type *Ty,
00051                                                     const Twine &Name) {
00052   if (!Builder.isNamePreserving())
00053     return new llvm::AllocaInst(Ty, 0, "", AllocaInsertPt);
00054   return new llvm::AllocaInst(Ty, 0, Name, AllocaInsertPt);
00055 }
00056 
00057 void CodeGenFunction::InitTempAlloca(llvm::AllocaInst *Var,
00058                                      llvm::Value *Init) {
00059   llvm::StoreInst *Store = new llvm::StoreInst(Init, Var);
00060   llvm::BasicBlock *Block = AllocaInsertPt->getParent();
00061   Block->getInstList().insertAfter(&*AllocaInsertPt, Store);
00062 }
00063 
00064 llvm::AllocaInst *CodeGenFunction::CreateIRTemp(QualType Ty,
00065                                                 const Twine &Name) {
00066   llvm::AllocaInst *Alloc = CreateTempAlloca(ConvertType(Ty), Name);
00067   // FIXME: Should we prefer the preferred type alignment here?
00068   CharUnits Align = getContext().getTypeAlignInChars(Ty);
00069   Alloc->setAlignment(Align.getQuantity());
00070   return Alloc;
00071 }
00072 
00073 llvm::AllocaInst *CodeGenFunction::CreateMemTemp(QualType Ty,
00074                                                  const Twine &Name) {
00075   llvm::AllocaInst *Alloc = CreateTempAlloca(ConvertTypeForMem(Ty), Name);
00076   // FIXME: Should we prefer the preferred type alignment here?
00077   CharUnits Align = getContext().getTypeAlignInChars(Ty);
00078   Alloc->setAlignment(Align.getQuantity());
00079   return Alloc;
00080 }
00081 
00082 /// EvaluateExprAsBool - Perform the usual unary conversions on the specified
00083 /// expression and compare the result against zero, returning an Int1Ty value.
00084 llvm::Value *CodeGenFunction::EvaluateExprAsBool(const Expr *E) {
00085   if (const MemberPointerType *MPT = E->getType()->getAs<MemberPointerType>()) {
00086     llvm::Value *MemPtr = EmitScalarExpr(E);
00087     return CGM.getCXXABI().EmitMemberPointerIsNotNull(*this, MemPtr, MPT);
00088   }
00089 
00090   QualType BoolTy = getContext().BoolTy;
00091   if (!E->getType()->isAnyComplexType())
00092     return EmitScalarConversion(EmitScalarExpr(E), E->getType(), BoolTy);
00093 
00094   return EmitComplexToScalarConversion(EmitComplexExpr(E), E->getType(),BoolTy);
00095 }
00096 
00097 /// EmitIgnoredExpr - Emit code to compute the specified expression,
00098 /// ignoring the result.
00099 void CodeGenFunction::EmitIgnoredExpr(const Expr *E) {
00100   if (E->isRValue())
00101     return (void) EmitAnyExpr(E, AggValueSlot::ignored(), true);
00102 
00103   // Just emit it as an l-value and drop the result.
00104   EmitLValue(E);
00105 }
00106 
00107 /// EmitAnyExpr - Emit code to compute the specified expression which
00108 /// can have any type.  The result is returned as an RValue struct.
00109 /// If this is an aggregate expression, AggSlot indicates where the
00110 /// result should be returned.
00111 RValue CodeGenFunction::EmitAnyExpr(const Expr *E, AggValueSlot AggSlot,
00112                                     bool IgnoreResult) {
00113   if (!hasAggregateLLVMType(E->getType()))
00114     return RValue::get(EmitScalarExpr(E, IgnoreResult));
00115   else if (E->getType()->isAnyComplexType())
00116     return RValue::getComplex(EmitComplexExpr(E, IgnoreResult, IgnoreResult));
00117 
00118   EmitAggExpr(E, AggSlot, IgnoreResult);
00119   return AggSlot.asRValue();
00120 }
00121 
00122 /// EmitAnyExprToTemp - Similary to EmitAnyExpr(), however, the result will
00123 /// always be accessible even if no aggregate location is provided.
00124 RValue CodeGenFunction::EmitAnyExprToTemp(const Expr *E) {
00125   AggValueSlot AggSlot = AggValueSlot::ignored();
00126 
00127   if (hasAggregateLLVMType(E->getType()) &&
00128       !E->getType()->isAnyComplexType())
00129     AggSlot = CreateAggTemp(E->getType(), "agg.tmp");
00130   return EmitAnyExpr(E, AggSlot);
00131 }
00132 
00133 /// EmitAnyExprToMem - Evaluate an expression into a given memory
00134 /// location.
00135 void CodeGenFunction::EmitAnyExprToMem(const Expr *E,
00136                                        llvm::Value *Location,
00137                                        Qualifiers Quals,
00138                                        bool IsInit) {
00139   // FIXME: This function should take an LValue as an argument.
00140   if (E->getType()->isAnyComplexType()) {
00141     EmitComplexExprIntoAddr(E, Location, Quals.hasVolatile());
00142   } else if (hasAggregateLLVMType(E->getType())) {
00143     CharUnits Alignment = getContext().getTypeAlignInChars(E->getType());
00144     EmitAggExpr(E, AggValueSlot::forAddr(Location, Alignment, Quals,
00145                                          AggValueSlot::IsDestructed_t(IsInit),
00146                                          AggValueSlot::DoesNotNeedGCBarriers,
00147                                          AggValueSlot::IsAliased_t(!IsInit)));
00148   } else {
00149     RValue RV = RValue::get(EmitScalarExpr(E, /*Ignore*/ false));
00150     LValue LV = MakeAddrLValue(Location, E->getType());
00151     EmitStoreThroughLValue(RV, LV);
00152   }
00153 }
00154 
00155 namespace {
00156 /// \brief An adjustment to be made to the temporary created when emitting a
00157 /// reference binding, which accesses a particular subobject of that temporary.
00158   struct SubobjectAdjustment {
00159     enum { DerivedToBaseAdjustment, FieldAdjustment } Kind;
00160 
00161     union {
00162       struct {
00163         const CastExpr *BasePath;
00164         const CXXRecordDecl *DerivedClass;
00165       } DerivedToBase;
00166 
00167       FieldDecl *Field;
00168     };
00169 
00170     SubobjectAdjustment(const CastExpr *BasePath,
00171                         const CXXRecordDecl *DerivedClass)
00172       : Kind(DerivedToBaseAdjustment) {
00173       DerivedToBase.BasePath = BasePath;
00174       DerivedToBase.DerivedClass = DerivedClass;
00175     }
00176 
00177     SubobjectAdjustment(FieldDecl *Field)
00178       : Kind(FieldAdjustment) {
00179       this->Field = Field;
00180     }
00181   };
00182 }
00183 
00184 static llvm::Value *
00185 CreateReferenceTemporary(CodeGenFunction &CGF, QualType Type,
00186                          const NamedDecl *InitializedDecl) {
00187   if (const VarDecl *VD = dyn_cast_or_null<VarDecl>(InitializedDecl)) {
00188     if (VD->hasGlobalStorage()) {
00189       SmallString<256> Name;
00190       llvm::raw_svector_ostream Out(Name);
00191       CGF.CGM.getCXXABI().getMangleContext().mangleReferenceTemporary(VD, Out);
00192       Out.flush();
00193 
00194       llvm::Type *RefTempTy = CGF.ConvertTypeForMem(Type);
00195   
00196       // Create the reference temporary.
00197       llvm::GlobalValue *RefTemp =
00198         new llvm::GlobalVariable(CGF.CGM.getModule(), 
00199                                  RefTempTy, /*isConstant=*/false,
00200                                  llvm::GlobalValue::InternalLinkage,
00201                                  llvm::Constant::getNullValue(RefTempTy),
00202                                  Name.str());
00203       return RefTemp;
00204     }
00205   }
00206 
00207   return CGF.CreateMemTemp(Type, "ref.tmp");
00208 }
00209 
00210 static llvm::Value *
00211 EmitExprForReferenceBinding(CodeGenFunction &CGF, const Expr *E,
00212                             llvm::Value *&ReferenceTemporary,
00213                             const CXXDestructorDecl *&ReferenceTemporaryDtor,
00214                             QualType &ObjCARCReferenceLifetimeType,
00215                             const NamedDecl *InitializedDecl) {
00216   // Look through single-element init lists that claim to be lvalues. They're
00217   // just syntactic wrappers in this case.
00218   if (const InitListExpr *ILE = dyn_cast<InitListExpr>(E)) {
00219     if (ILE->getNumInits() == 1 && ILE->isGLValue())
00220       E = ILE->getInit(0);
00221   }
00222 
00223   // Look through expressions for materialized temporaries (for now).
00224   if (const MaterializeTemporaryExpr *M 
00225                                       = dyn_cast<MaterializeTemporaryExpr>(E)) {
00226     // Objective-C++ ARC:
00227     //   If we are binding a reference to a temporary that has ownership, we 
00228     //   need to perform retain/release operations on the temporary.
00229     if (CGF.getContext().getLangOpts().ObjCAutoRefCount &&        
00230         E->getType()->isObjCLifetimeType() &&
00231         (E->getType().getObjCLifetime() == Qualifiers::OCL_Strong ||
00232          E->getType().getObjCLifetime() == Qualifiers::OCL_Weak ||
00233          E->getType().getObjCLifetime() == Qualifiers::OCL_Autoreleasing))
00234       ObjCARCReferenceLifetimeType = E->getType();
00235     
00236     E = M->GetTemporaryExpr();
00237   }
00238 
00239   if (const CXXDefaultArgExpr *DAE = dyn_cast<CXXDefaultArgExpr>(E))
00240     E = DAE->getExpr();
00241   
00242   if (const ExprWithCleanups *EWC = dyn_cast<ExprWithCleanups>(E)) {
00243     CGF.enterFullExpression(EWC);
00244     CodeGenFunction::RunCleanupsScope Scope(CGF);
00245 
00246     return EmitExprForReferenceBinding(CGF, EWC->getSubExpr(), 
00247                                        ReferenceTemporary, 
00248                                        ReferenceTemporaryDtor,
00249                                        ObjCARCReferenceLifetimeType,
00250                                        InitializedDecl);
00251   }
00252 
00253   RValue RV;
00254   if (E->isGLValue()) {
00255     // Emit the expression as an lvalue.
00256     LValue LV = CGF.EmitLValue(E);
00257     
00258     if (LV.isSimple())
00259       return LV.getAddress();
00260     
00261     // We have to load the lvalue.
00262     RV = CGF.EmitLoadOfLValue(LV);
00263   } else {
00264     if (!ObjCARCReferenceLifetimeType.isNull()) {
00265       ReferenceTemporary = CreateReferenceTemporary(CGF, 
00266                                                   ObjCARCReferenceLifetimeType, 
00267                                                     InitializedDecl);
00268       
00269       
00270       LValue RefTempDst = CGF.MakeAddrLValue(ReferenceTemporary, 
00271                                              ObjCARCReferenceLifetimeType);
00272 
00273       CGF.EmitScalarInit(E, dyn_cast_or_null<ValueDecl>(InitializedDecl),
00274                          RefTempDst, false);
00275       
00276       bool ExtendsLifeOfTemporary = false;
00277       if (const VarDecl *Var = dyn_cast_or_null<VarDecl>(InitializedDecl)) {
00278         if (Var->extendsLifetimeOfTemporary())
00279           ExtendsLifeOfTemporary = true;
00280       } else if (InitializedDecl && isa<FieldDecl>(InitializedDecl)) {
00281         ExtendsLifeOfTemporary = true;
00282       }
00283       
00284       if (!ExtendsLifeOfTemporary) {
00285         // Since the lifetime of this temporary isn't going to be extended,
00286         // we need to clean it up ourselves at the end of the full expression.
00287         switch (ObjCARCReferenceLifetimeType.getObjCLifetime()) {
00288         case Qualifiers::OCL_None:
00289         case Qualifiers::OCL_ExplicitNone:
00290         case Qualifiers::OCL_Autoreleasing:
00291           break;
00292             
00293         case Qualifiers::OCL_Strong: {
00294           assert(!ObjCARCReferenceLifetimeType->isArrayType());
00295           CleanupKind cleanupKind = CGF.getARCCleanupKind();
00296           CGF.pushDestroy(cleanupKind, 
00297                           ReferenceTemporary,
00298                           ObjCARCReferenceLifetimeType,
00299                           CodeGenFunction::destroyARCStrongImprecise,
00300                           cleanupKind & EHCleanup);
00301           break;
00302         }
00303           
00304         case Qualifiers::OCL_Weak:
00305           assert(!ObjCARCReferenceLifetimeType->isArrayType());
00306           CGF.pushDestroy(NormalAndEHCleanup, 
00307                           ReferenceTemporary,
00308                           ObjCARCReferenceLifetimeType,
00309                           CodeGenFunction::destroyARCWeak,
00310                           /*useEHCleanupForArray*/ true);
00311           break;
00312         }
00313         
00314         ObjCARCReferenceLifetimeType = QualType();
00315       }
00316       
00317       return ReferenceTemporary;
00318     }
00319     
00320     SmallVector<SubobjectAdjustment, 2> Adjustments;
00321     while (true) {
00322       E = E->IgnoreParens();
00323 
00324       if (const CastExpr *CE = dyn_cast<CastExpr>(E)) {
00325         if ((CE->getCastKind() == CK_DerivedToBase ||
00326              CE->getCastKind() == CK_UncheckedDerivedToBase) &&
00327             E->getType()->isRecordType()) {
00328           E = CE->getSubExpr();
00329           CXXRecordDecl *Derived 
00330             = cast<CXXRecordDecl>(E->getType()->getAs<RecordType>()->getDecl());
00331           Adjustments.push_back(SubobjectAdjustment(CE, Derived));
00332           continue;
00333         }
00334 
00335         if (CE->getCastKind() == CK_NoOp) {
00336           E = CE->getSubExpr();
00337           continue;
00338         }
00339       } else if (const MemberExpr *ME = dyn_cast<MemberExpr>(E)) {
00340         if (!ME->isArrow() && ME->getBase()->isRValue()) {
00341           assert(ME->getBase()->getType()->isRecordType());
00342           if (FieldDecl *Field = dyn_cast<FieldDecl>(ME->getMemberDecl())) {
00343             E = ME->getBase();
00344             Adjustments.push_back(SubobjectAdjustment(Field));
00345             continue;
00346           }
00347         }
00348       }
00349 
00350       if (const OpaqueValueExpr *opaque = dyn_cast<OpaqueValueExpr>(E))
00351         if (opaque->getType()->isRecordType())
00352           return CGF.EmitOpaqueValueLValue(opaque).getAddress();
00353 
00354       // Nothing changed.
00355       break;
00356     }
00357     
00358     // Create a reference temporary if necessary.
00359     AggValueSlot AggSlot = AggValueSlot::ignored();
00360     if (CGF.hasAggregateLLVMType(E->getType()) &&
00361         !E->getType()->isAnyComplexType()) {
00362       ReferenceTemporary = CreateReferenceTemporary(CGF, E->getType(), 
00363                                                     InitializedDecl);
00364       CharUnits Alignment = CGF.getContext().getTypeAlignInChars(E->getType());
00365       AggValueSlot::IsDestructed_t isDestructed
00366         = AggValueSlot::IsDestructed_t(InitializedDecl != 0);
00367       AggSlot = AggValueSlot::forAddr(ReferenceTemporary, Alignment,
00368                                       Qualifiers(), isDestructed,
00369                                       AggValueSlot::DoesNotNeedGCBarriers,
00370                                       AggValueSlot::IsNotAliased);
00371     }
00372     
00373     if (InitializedDecl) {
00374       // Get the destructor for the reference temporary.
00375       if (const RecordType *RT = E->getType()->getAs<RecordType>()) {
00376         CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(RT->getDecl());
00377         if (!ClassDecl->hasTrivialDestructor())
00378           ReferenceTemporaryDtor = ClassDecl->getDestructor();
00379       }
00380     }
00381 
00382     RV = CGF.EmitAnyExpr(E, AggSlot);
00383 
00384     // Check if need to perform derived-to-base casts and/or field accesses, to
00385     // get from the temporary object we created (and, potentially, for which we
00386     // extended the lifetime) to the subobject we're binding the reference to.
00387     if (!Adjustments.empty()) {
00388       llvm::Value *Object = RV.getAggregateAddr();
00389       for (unsigned I = Adjustments.size(); I != 0; --I) {
00390         SubobjectAdjustment &Adjustment = Adjustments[I-1];
00391         switch (Adjustment.Kind) {
00392         case SubobjectAdjustment::DerivedToBaseAdjustment:
00393           Object = 
00394               CGF.GetAddressOfBaseClass(Object, 
00395                                         Adjustment.DerivedToBase.DerivedClass, 
00396                               Adjustment.DerivedToBase.BasePath->path_begin(),
00397                               Adjustment.DerivedToBase.BasePath->path_end(),
00398                                         /*NullCheckValue=*/false);
00399           break;
00400             
00401         case SubobjectAdjustment::FieldAdjustment: {
00402           LValue LV = CGF.MakeAddrLValue(Object, E->getType());
00403           LV = CGF.EmitLValueForField(LV, Adjustment.Field);
00404           if (LV.isSimple()) {
00405             Object = LV.getAddress();
00406             break;
00407           }
00408           
00409           // For non-simple lvalues, we actually have to create a copy of
00410           // the object we're binding to.
00411           QualType T = Adjustment.Field->getType().getNonReferenceType()
00412                                                   .getUnqualifiedType();
00413           Object = CreateReferenceTemporary(CGF, T, InitializedDecl);
00414           LValue TempLV = CGF.MakeAddrLValue(Object,
00415                                              Adjustment.Field->getType());
00416           CGF.EmitStoreThroughLValue(CGF.EmitLoadOfLValue(LV), TempLV);
00417           break;
00418         }
00419 
00420         }
00421       }
00422 
00423       return Object;
00424     }
00425   }
00426 
00427   if (RV.isAggregate())
00428     return RV.getAggregateAddr();
00429 
00430   // Create a temporary variable that we can bind the reference to.
00431   ReferenceTemporary = CreateReferenceTemporary(CGF, E->getType(), 
00432                                                 InitializedDecl);
00433 
00434 
00435   unsigned Alignment =
00436     CGF.getContext().getTypeAlignInChars(E->getType()).getQuantity();
00437   if (RV.isScalar())
00438     CGF.EmitStoreOfScalar(RV.getScalarVal(), ReferenceTemporary,
00439                           /*Volatile=*/false, Alignment, E->getType());
00440   else
00441     CGF.StoreComplexToAddr(RV.getComplexVal(), ReferenceTemporary,
00442                            /*Volatile=*/false);
00443   return ReferenceTemporary;
00444 }
00445 
00446 RValue
00447 CodeGenFunction::EmitReferenceBindingToExpr(const Expr *E,
00448                                             const NamedDecl *InitializedDecl) {
00449   llvm::Value *ReferenceTemporary = 0;
00450   const CXXDestructorDecl *ReferenceTemporaryDtor = 0;
00451   QualType ObjCARCReferenceLifetimeType;
00452   llvm::Value *Value = EmitExprForReferenceBinding(*this, E, ReferenceTemporary,
00453                                                    ReferenceTemporaryDtor,
00454                                                    ObjCARCReferenceLifetimeType,
00455                                                    InitializedDecl);
00456   if (!ReferenceTemporaryDtor && ObjCARCReferenceLifetimeType.isNull())
00457     return RValue::get(Value);
00458   
00459   // Make sure to call the destructor for the reference temporary.
00460   const VarDecl *VD = dyn_cast_or_null<VarDecl>(InitializedDecl);
00461   if (VD && VD->hasGlobalStorage()) {
00462     if (ReferenceTemporaryDtor) {
00463       llvm::Constant *DtorFn = 
00464         CGM.GetAddrOfCXXDestructor(ReferenceTemporaryDtor, Dtor_Complete);
00465       CGM.getCXXABI().registerGlobalDtor(*this, DtorFn, 
00466                                     cast<llvm::Constant>(ReferenceTemporary));
00467     } else {
00468       assert(!ObjCARCReferenceLifetimeType.isNull());
00469       // Note: We intentionally do not register a global "destructor" to
00470       // release the object.
00471     }
00472     
00473     return RValue::get(Value);
00474   }
00475 
00476   if (ReferenceTemporaryDtor)
00477     PushDestructorCleanup(ReferenceTemporaryDtor, ReferenceTemporary);
00478   else {
00479     switch (ObjCARCReferenceLifetimeType.getObjCLifetime()) {
00480     case Qualifiers::OCL_None:
00481       llvm_unreachable(
00482                       "Not a reference temporary that needs to be deallocated");
00483     case Qualifiers::OCL_ExplicitNone:
00484     case Qualifiers::OCL_Autoreleasing:
00485       // Nothing to do.
00486       break;        
00487         
00488     case Qualifiers::OCL_Strong: {
00489       bool precise = VD && VD->hasAttr<ObjCPreciseLifetimeAttr>();
00490       CleanupKind cleanupKind = getARCCleanupKind();
00491       pushDestroy(cleanupKind, ReferenceTemporary, ObjCARCReferenceLifetimeType,
00492                   precise ? destroyARCStrongPrecise : destroyARCStrongImprecise,
00493                   cleanupKind & EHCleanup);
00494       break;
00495     }
00496         
00497     case Qualifiers::OCL_Weak: {
00498       // __weak objects always get EH cleanups; otherwise, exceptions
00499       // could cause really nasty crashes instead of mere leaks.
00500       pushDestroy(NormalAndEHCleanup, ReferenceTemporary,
00501                   ObjCARCReferenceLifetimeType, destroyARCWeak, true);
00502       break;        
00503     }
00504     }
00505   }
00506   
00507   return RValue::get(Value);
00508 }
00509 
00510 
00511 /// getAccessedFieldNo - Given an encoded value and a result number, return the
00512 /// input field number being accessed.
00513 unsigned CodeGenFunction::getAccessedFieldNo(unsigned Idx,
00514                                              const llvm::Constant *Elts) {
00515   return cast<llvm::ConstantInt>(Elts->getAggregateElement(Idx))
00516       ->getZExtValue();
00517 }
00518 
00519 void CodeGenFunction::EmitCheck(llvm::Value *Address, unsigned Size) {
00520   if (BoundsChecking <= 0)
00521     return;
00522 
00523   // This needs to be to the standard address space.
00524   Address = Builder.CreateBitCast(Address, Int8PtrTy);
00525 
00526   llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::objectsize, IntPtrTy);
00527 
00528   llvm::Value *Min = Builder.getFalse();
00529   llvm::Value *Runtime = Builder.getInt32(BoundsChecking);
00530   llvm::Value *C = Builder.CreateCall3(F, Address, Min, Runtime);
00531   llvm::BasicBlock *Cont = createBasicBlock();
00532   Builder.CreateCondBr(Builder.CreateICmpUGE(C,
00533                                         llvm::ConstantInt::get(IntPtrTy, Size)),
00534                        Cont, getTrapBB());
00535   EmitBlock(Cont);
00536 }
00537 
00538 
00539 CodeGenFunction::ComplexPairTy CodeGenFunction::
00540 EmitComplexPrePostIncDec(const UnaryOperator *E, LValue LV,
00541                          bool isInc, bool isPre) {
00542   ComplexPairTy InVal = LoadComplexFromAddr(LV.getAddress(),
00543                                             LV.isVolatileQualified());
00544   
00545   llvm::Value *NextVal;
00546   if (isa<llvm::IntegerType>(InVal.first->getType())) {
00547     uint64_t AmountVal = isInc ? 1 : -1;
00548     NextVal = llvm::ConstantInt::get(InVal.first->getType(), AmountVal, true);
00549     
00550     // Add the inc/dec to the real part.
00551     NextVal = Builder.CreateAdd(InVal.first, NextVal, isInc ? "inc" : "dec");
00552   } else {
00553     QualType ElemTy = E->getType()->getAs<ComplexType>()->getElementType();
00554     llvm::APFloat FVal(getContext().getFloatTypeSemantics(ElemTy), 1);
00555     if (!isInc)
00556       FVal.changeSign();
00557     NextVal = llvm::ConstantFP::get(getLLVMContext(), FVal);
00558     
00559     // Add the inc/dec to the real part.
00560     NextVal = Builder.CreateFAdd(InVal.first, NextVal, isInc ? "inc" : "dec");
00561   }
00562   
00563   ComplexPairTy IncVal(NextVal, InVal.second);
00564   
00565   // Store the updated result through the lvalue.
00566   StoreComplexToAddr(IncVal, LV.getAddress(), LV.isVolatileQualified());
00567   
00568   // If this is a postinc, return the value read from memory, otherwise use the
00569   // updated value.
00570   return isPre ? IncVal : InVal;
00571 }
00572 
00573 
00574 //===----------------------------------------------------------------------===//
00575 //                         LValue Expression Emission
00576 //===----------------------------------------------------------------------===//
00577 
00578 RValue CodeGenFunction::GetUndefRValue(QualType Ty) {
00579   if (Ty->isVoidType())
00580     return RValue::get(0);
00581   
00582   if (const ComplexType *CTy = Ty->getAs<ComplexType>()) {
00583     llvm::Type *EltTy = ConvertType(CTy->getElementType());
00584     llvm::Value *U = llvm::UndefValue::get(EltTy);
00585     return RValue::getComplex(std::make_pair(U, U));
00586   }
00587   
00588   // If this is a use of an undefined aggregate type, the aggregate must have an
00589   // identifiable address.  Just because the contents of the value are undefined
00590   // doesn't mean that the address can't be taken and compared.
00591   if (hasAggregateLLVMType(Ty)) {
00592     llvm::Value *DestPtr = CreateMemTemp(Ty, "undef.agg.tmp");
00593     return RValue::getAggregate(DestPtr);
00594   }
00595   
00596   return RValue::get(llvm::UndefValue::get(ConvertType(Ty)));
00597 }
00598 
00599 RValue CodeGenFunction::EmitUnsupportedRValue(const Expr *E,
00600                                               const char *Name) {
00601   ErrorUnsupported(E, Name);
00602   return GetUndefRValue(E->getType());
00603 }
00604 
00605 LValue CodeGenFunction::EmitUnsupportedLValue(const Expr *E,
00606                                               const char *Name) {
00607   ErrorUnsupported(E, Name);
00608   llvm::Type *Ty = llvm::PointerType::getUnqual(ConvertType(E->getType()));
00609   return MakeAddrLValue(llvm::UndefValue::get(Ty), E->getType());
00610 }
00611 
00612 LValue CodeGenFunction::EmitCheckedLValue(const Expr *E) {
00613   LValue LV = EmitLValue(E);
00614   if (!isa<DeclRefExpr>(E) && !LV.isBitField() && LV.isSimple())
00615     EmitCheck(LV.getAddress(), 
00616               getContext().getTypeSizeInChars(E->getType()).getQuantity());
00617   return LV;
00618 }
00619 
00620 /// EmitLValue - Emit code to compute a designator that specifies the location
00621 /// of the expression.
00622 ///
00623 /// This can return one of two things: a simple address or a bitfield reference.
00624 /// In either case, the LLVM Value* in the LValue structure is guaranteed to be
00625 /// an LLVM pointer type.
00626 ///
00627 /// If this returns a bitfield reference, nothing about the pointee type of the
00628 /// LLVM value is known: For example, it may not be a pointer to an integer.
00629 ///
00630 /// If this returns a normal address, and if the lvalue's C type is fixed size,
00631 /// this method guarantees that the returned pointer type will point to an LLVM
00632 /// type of the same size of the lvalue's type.  If the lvalue has a variable
00633 /// length type, this is not possible.
00634 ///
00635 LValue CodeGenFunction::EmitLValue(const Expr *E) {
00636   switch (E->getStmtClass()) {
00637   default: return EmitUnsupportedLValue(E, "l-value expression");
00638 
00639   case Expr::ObjCPropertyRefExprClass:
00640     llvm_unreachable("cannot emit a property reference directly");
00641 
00642   case Expr::ObjCSelectorExprClass:
00643   return EmitObjCSelectorLValue(cast<ObjCSelectorExpr>(E));
00644   case Expr::ObjCIsaExprClass:
00645     return EmitObjCIsaExpr(cast<ObjCIsaExpr>(E));
00646   case Expr::BinaryOperatorClass:
00647     return EmitBinaryOperatorLValue(cast<BinaryOperator>(E));
00648   case Expr::CompoundAssignOperatorClass:
00649     if (!E->getType()->isAnyComplexType())
00650       return EmitCompoundAssignmentLValue(cast<CompoundAssignOperator>(E));
00651     return EmitComplexCompoundAssignmentLValue(cast<CompoundAssignOperator>(E));
00652   case Expr::CallExprClass:
00653   case Expr::CXXMemberCallExprClass:
00654   case Expr::CXXOperatorCallExprClass:
00655   case Expr::UserDefinedLiteralClass:
00656     return EmitCallExprLValue(cast<CallExpr>(E));
00657   case Expr::VAArgExprClass:
00658     return EmitVAArgExprLValue(cast<VAArgExpr>(E));
00659   case Expr::DeclRefExprClass:
00660     return EmitDeclRefLValue(cast<DeclRefExpr>(E));
00661   case Expr::ParenExprClass:
00662     return EmitLValue(cast<ParenExpr>(E)->getSubExpr());
00663   case Expr::GenericSelectionExprClass:
00664     return EmitLValue(cast<GenericSelectionExpr>(E)->getResultExpr());
00665   case Expr::PredefinedExprClass:
00666     return EmitPredefinedLValue(cast<PredefinedExpr>(E));
00667   case Expr::StringLiteralClass:
00668     return EmitStringLiteralLValue(cast<StringLiteral>(E));
00669   case Expr::ObjCEncodeExprClass:
00670     return EmitObjCEncodeExprLValue(cast<ObjCEncodeExpr>(E));
00671   case Expr::PseudoObjectExprClass:
00672     return EmitPseudoObjectLValue(cast<PseudoObjectExpr>(E));
00673   case Expr::InitListExprClass:
00674     return EmitInitListLValue(cast<InitListExpr>(E));
00675   case Expr::CXXTemporaryObjectExprClass:
00676   case Expr::CXXConstructExprClass:
00677     return EmitCXXConstructLValue(cast<CXXConstructExpr>(E));
00678   case Expr::CXXBindTemporaryExprClass:
00679     return EmitCXXBindTemporaryLValue(cast<CXXBindTemporaryExpr>(E));
00680   case Expr::LambdaExprClass:
00681     return EmitLambdaLValue(cast<LambdaExpr>(E));
00682 
00683   case Expr::ExprWithCleanupsClass: {
00684     const ExprWithCleanups *cleanups = cast<ExprWithCleanups>(E);
00685     enterFullExpression(cleanups);
00686     RunCleanupsScope Scope(*this);
00687     return EmitLValue(cleanups->getSubExpr());
00688   }
00689 
00690   case Expr::CXXScalarValueInitExprClass:
00691     return EmitNullInitializationLValue(cast<CXXScalarValueInitExpr>(E));
00692   case Expr::CXXDefaultArgExprClass:
00693     return EmitLValue(cast<CXXDefaultArgExpr>(E)->getExpr());
00694   case Expr::CXXTypeidExprClass:
00695     return EmitCXXTypeidLValue(cast<CXXTypeidExpr>(E));
00696 
00697   case Expr::ObjCMessageExprClass:
00698     return EmitObjCMessageExprLValue(cast<ObjCMessageExpr>(E));
00699   case Expr::ObjCIvarRefExprClass:
00700     return EmitObjCIvarRefLValue(cast<ObjCIvarRefExpr>(E));
00701   case Expr::StmtExprClass:
00702     return EmitStmtExprLValue(cast<StmtExpr>(E));
00703   case Expr::UnaryOperatorClass:
00704     return EmitUnaryOpLValue(cast<UnaryOperator>(E));
00705   case Expr::ArraySubscriptExprClass:
00706     return EmitArraySubscriptExpr(cast<ArraySubscriptExpr>(E));
00707   case Expr::ExtVectorElementExprClass:
00708     return EmitExtVectorElementExpr(cast<ExtVectorElementExpr>(E));
00709   case Expr::MemberExprClass:
00710     return EmitMemberExpr(cast<MemberExpr>(E));
00711   case Expr::CompoundLiteralExprClass:
00712     return EmitCompoundLiteralLValue(cast<CompoundLiteralExpr>(E));
00713   case Expr::ConditionalOperatorClass:
00714     return EmitConditionalOperatorLValue(cast<ConditionalOperator>(E));
00715   case Expr::BinaryConditionalOperatorClass:
00716     return EmitConditionalOperatorLValue(cast<BinaryConditionalOperator>(E));
00717   case Expr::ChooseExprClass:
00718     return EmitLValue(cast<ChooseExpr>(E)->getChosenSubExpr(getContext()));
00719   case Expr::OpaqueValueExprClass:
00720     return EmitOpaqueValueLValue(cast<OpaqueValueExpr>(E));
00721   case Expr::SubstNonTypeTemplateParmExprClass:
00722     return EmitLValue(cast<SubstNonTypeTemplateParmExpr>(E)->getReplacement());
00723   case Expr::ImplicitCastExprClass:
00724   case Expr::CStyleCastExprClass:
00725   case Expr::CXXFunctionalCastExprClass:
00726   case Expr::CXXStaticCastExprClass:
00727   case Expr::CXXDynamicCastExprClass:
00728   case Expr::CXXReinterpretCastExprClass:
00729   case Expr::CXXConstCastExprClass:
00730   case Expr::ObjCBridgedCastExprClass:
00731     return EmitCastLValue(cast<CastExpr>(E));
00732 
00733   case Expr::MaterializeTemporaryExprClass:
00734     return EmitMaterializeTemporaryExpr(cast<MaterializeTemporaryExpr>(E));
00735   }
00736 }
00737 
00738 /// Given an object of the given canonical type, can we safely copy a
00739 /// value out of it based on its initializer?
00740 static bool isConstantEmittableObjectType(QualType type) {
00741   assert(type.isCanonical());
00742   assert(!type->isReferenceType());
00743 
00744   // Must be const-qualified but non-volatile.
00745   Qualifiers qs = type.getLocalQualifiers();
00746   if (!qs.hasConst() || qs.hasVolatile()) return false;
00747 
00748   // Otherwise, all object types satisfy this except C++ classes with
00749   // mutable subobjects or non-trivial copy/destroy behavior.
00750   if (const RecordType *RT = dyn_cast<RecordType>(type))
00751     if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl()))
00752       if (RD->hasMutableFields() || !RD->isTrivial())
00753         return false;
00754 
00755   return true;
00756 }
00757 
00758 /// Can we constant-emit a load of a reference to a variable of the
00759 /// given type?  This is different from predicates like
00760 /// Decl::isUsableInConstantExpressions because we do want it to apply
00761 /// in situations that don't necessarily satisfy the language's rules
00762 /// for this (e.g. C++'s ODR-use rules).  For example, we want to able
00763 /// to do this with const float variables even if those variables
00764 /// aren't marked 'constexpr'.
00765 enum ConstantEmissionKind {
00766   CEK_None,
00767   CEK_AsReferenceOnly,
00768   CEK_AsValueOrReference,
00769   CEK_AsValueOnly
00770 };
00771 static ConstantEmissionKind checkVarTypeForConstantEmission(QualType type) {
00772   type = type.getCanonicalType();
00773   if (const ReferenceType *ref = dyn_cast<ReferenceType>(type)) {
00774     if (isConstantEmittableObjectType(ref->getPointeeType()))
00775       return CEK_AsValueOrReference;
00776     return CEK_AsReferenceOnly;
00777   }
00778   if (isConstantEmittableObjectType(type))
00779     return CEK_AsValueOnly;
00780   return CEK_None;
00781 }
00782 
00783 /// Try to emit a reference to the given value without producing it as
00784 /// an l-value.  This is actually more than an optimization: we can't
00785 /// produce an l-value for variables that we never actually captured
00786 /// in a block or lambda, which means const int variables or constexpr
00787 /// literals or similar.
00788 CodeGenFunction::ConstantEmission
00789 CodeGenFunction::tryEmitAsConstant(DeclRefExpr *refExpr) {
00790   ValueDecl *value = refExpr->getDecl();
00791 
00792   // The value needs to be an enum constant or a constant variable.
00793   ConstantEmissionKind CEK;
00794   if (isa<ParmVarDecl>(value)) {
00795     CEK = CEK_None;
00796   } else if (VarDecl *var = dyn_cast<VarDecl>(value)) {
00797     CEK = checkVarTypeForConstantEmission(var->getType());
00798   } else if (isa<EnumConstantDecl>(value)) {
00799     CEK = CEK_AsValueOnly;
00800   } else {
00801     CEK = CEK_None;
00802   }
00803   if (CEK == CEK_None) return ConstantEmission();
00804 
00805   Expr::EvalResult result;
00806   bool resultIsReference;
00807   QualType resultType;
00808 
00809   // It's best to evaluate all the way as an r-value if that's permitted.
00810   if (CEK != CEK_AsReferenceOnly &&
00811       refExpr->EvaluateAsRValue(result, getContext())) {
00812     resultIsReference = false;
00813     resultType = refExpr->getType();
00814 
00815   // Otherwise, try to evaluate as an l-value.
00816   } else if (CEK != CEK_AsValueOnly &&
00817              refExpr->EvaluateAsLValue(result, getContext())) {
00818     resultIsReference = true;
00819     resultType = value->getType();
00820 
00821   // Failure.
00822   } else {
00823     return ConstantEmission();
00824   }
00825 
00826   // In any case, if the initializer has side-effects, abandon ship.
00827   if (result.HasSideEffects)
00828     return ConstantEmission();
00829 
00830   // Emit as a constant.
00831   llvm::Constant *C = CGM.EmitConstantValue(result.Val, resultType, this);
00832 
00833   // Make sure we emit a debug reference to the global variable.
00834   // This should probably fire even for 
00835   if (isa<VarDecl>(value)) {
00836     if (!getContext().DeclMustBeEmitted(cast<VarDecl>(value)))
00837       EmitDeclRefExprDbgValue(refExpr, C);
00838   } else {
00839     assert(isa<EnumConstantDecl>(value));
00840     EmitDeclRefExprDbgValue(refExpr, C);
00841   }
00842 
00843   // If we emitted a reference constant, we need to dereference that.
00844   if (resultIsReference)
00845     return ConstantEmission::forReference(C);
00846 
00847   return ConstantEmission::forValue(C);
00848 }
00849 
00850 llvm::Value *CodeGenFunction::EmitLoadOfScalar(LValue lvalue) {
00851   return EmitLoadOfScalar(lvalue.getAddress(), lvalue.isVolatile(),
00852                           lvalue.getAlignment().getQuantity(),
00853                           lvalue.getType(), lvalue.getTBAAInfo());
00854 }
00855 
00856 static bool hasBooleanRepresentation(QualType Ty) {
00857   if (Ty->isBooleanType())
00858     return true;
00859 
00860   if (const EnumType *ET = Ty->getAs<EnumType>())
00861     return ET->getDecl()->getIntegerType()->isBooleanType();
00862 
00863   if (const AtomicType *AT = Ty->getAs<AtomicType>())
00864     return hasBooleanRepresentation(AT->getValueType());
00865 
00866   return false;
00867 }
00868 
00869 llvm::MDNode *CodeGenFunction::getRangeForLoadFromType(QualType Ty) {
00870   const EnumType *ET = Ty->getAs<EnumType>();
00871   bool IsRegularCPlusPlusEnum = (getLangOpts().CPlusPlus && ET &&
00872                                  CGM.getCodeGenOpts().StrictEnums &&
00873                                  !ET->getDecl()->isFixed());
00874   bool IsBool = hasBooleanRepresentation(Ty);
00875   if (!IsBool && !IsRegularCPlusPlusEnum)
00876     return NULL;
00877 
00878   llvm::APInt Min;
00879   llvm::APInt End;
00880   if (IsBool) {
00881     Min = llvm::APInt(8, 0);
00882     End = llvm::APInt(8, 2);
00883   } else {
00884     const EnumDecl *ED = ET->getDecl();
00885     llvm::Type *LTy = ConvertTypeForMem(ED->getIntegerType());
00886     unsigned Bitwidth = LTy->getScalarSizeInBits();
00887     unsigned NumNegativeBits = ED->getNumNegativeBits();
00888     unsigned NumPositiveBits = ED->getNumPositiveBits();
00889 
00890     if (NumNegativeBits) {
00891       unsigned NumBits = std::max(NumNegativeBits, NumPositiveBits + 1);
00892       assert(NumBits <= Bitwidth);
00893       End = llvm::APInt(Bitwidth, 1) << (NumBits - 1);
00894       Min = -End;
00895     } else {
00896       assert(NumPositiveBits <= Bitwidth);
00897       End = llvm::APInt(Bitwidth, 1) << NumPositiveBits;
00898       Min = llvm::APInt(Bitwidth, 0);
00899     }
00900   }
00901 
00902   llvm::MDBuilder MDHelper(getLLVMContext());
00903   return MDHelper.createRange(Min, End);
00904 }
00905 
00906 llvm::Value *CodeGenFunction::EmitLoadOfScalar(llvm::Value *Addr, bool Volatile,
00907                                               unsigned Alignment, QualType Ty,
00908                                               llvm::MDNode *TBAAInfo) {
00909   llvm::LoadInst *Load = Builder.CreateLoad(Addr);
00910   if (Volatile)
00911     Load->setVolatile(true);
00912   if (Alignment)
00913     Load->setAlignment(Alignment);
00914   if (TBAAInfo)
00915     CGM.DecorateInstruction(Load, TBAAInfo);
00916   // If this is an atomic type, all normal reads must be atomic
00917   if (Ty->isAtomicType())
00918     Load->setAtomic(llvm::SequentiallyConsistent);
00919 
00920   if (CGM.getCodeGenOpts().OptimizationLevel > 0)
00921     if (llvm::MDNode *RangeInfo = getRangeForLoadFromType(Ty))
00922       Load->setMetadata(llvm::LLVMContext::MD_range, RangeInfo);
00923 
00924   return EmitFromMemory(Load, Ty);
00925 }
00926 
00927 llvm::Value *CodeGenFunction::EmitToMemory(llvm::Value *Value, QualType Ty) {
00928   // Bool has a different representation in memory than in registers.
00929   if (hasBooleanRepresentation(Ty)) {
00930     // This should really always be an i1, but sometimes it's already
00931     // an i8, and it's awkward to track those cases down.
00932     if (Value->getType()->isIntegerTy(1))
00933       return Builder.CreateZExt(Value, Builder.getInt8Ty(), "frombool");
00934     assert(Value->getType()->isIntegerTy(8) && "value rep of bool not i1/i8");
00935   }
00936 
00937   return Value;
00938 }
00939 
00940 llvm::Value *CodeGenFunction::EmitFromMemory(llvm::Value *Value, QualType Ty) {
00941   // Bool has a different representation in memory than in registers.
00942   if (hasBooleanRepresentation(Ty)) {
00943     assert(Value->getType()->isIntegerTy(8) && "memory rep of bool not i8");
00944     return Builder.CreateTrunc(Value, Builder.getInt1Ty(), "tobool");
00945   }
00946 
00947   return Value;
00948 }
00949 
00950 void CodeGenFunction::EmitStoreOfScalar(llvm::Value *Value, llvm::Value *Addr,
00951                                         bool Volatile, unsigned Alignment,
00952                                         QualType Ty,
00953                                         llvm::MDNode *TBAAInfo,
00954                                         bool isInit) {
00955   Value = EmitToMemory(Value, Ty);
00956   
00957   llvm::StoreInst *Store = Builder.CreateStore(Value, Addr, Volatile);
00958   if (Alignment)
00959     Store->setAlignment(Alignment);
00960   if (TBAAInfo)
00961     CGM.DecorateInstruction(Store, TBAAInfo);
00962   if (!isInit && Ty->isAtomicType())
00963     Store->setAtomic(llvm::SequentiallyConsistent);
00964 }
00965 
00966 void CodeGenFunction::EmitStoreOfScalar(llvm::Value *value, LValue lvalue,
00967     bool isInit) {
00968   EmitStoreOfScalar(value, lvalue.getAddress(), lvalue.isVolatile(),
00969                     lvalue.getAlignment().getQuantity(), lvalue.getType(),
00970                     lvalue.getTBAAInfo(), isInit);
00971 }
00972 
00973 /// EmitLoadOfLValue - Given an expression that represents a value lvalue, this
00974 /// method emits the address of the lvalue, then loads the result as an rvalue,
00975 /// returning the rvalue.
00976 RValue CodeGenFunction::EmitLoadOfLValue(LValue LV) {
00977   if (LV.isObjCWeak()) {
00978     // load of a __weak object.
00979     llvm::Value *AddrWeakObj = LV.getAddress();
00980     return RValue::get(CGM.getObjCRuntime().EmitObjCWeakRead(*this,
00981                                                              AddrWeakObj));
00982   }
00983   if (LV.getQuals().getObjCLifetime() == Qualifiers::OCL_Weak)
00984     return RValue::get(EmitARCLoadWeak(LV.getAddress()));
00985 
00986   if (LV.isSimple()) {
00987     assert(!LV.getType()->isFunctionType());
00988 
00989     // Everything needs a load.
00990     return RValue::get(EmitLoadOfScalar(LV));
00991   }
00992 
00993   if (LV.isVectorElt()) {
00994     llvm::LoadInst *Load = Builder.CreateLoad(LV.getVectorAddr(),
00995                                               LV.isVolatileQualified());
00996     Load->setAlignment(LV.getAlignment().getQuantity());
00997     return RValue::get(Builder.CreateExtractElement(Load, LV.getVectorIdx(),
00998                                                     "vecext"));
00999   }
01000 
01001   // If this is a reference to a subset of the elements of a vector, either
01002   // shuffle the input or extract/insert them as appropriate.
01003   if (LV.isExtVectorElt())
01004     return EmitLoadOfExtVectorElementLValue(LV);
01005 
01006   assert(LV.isBitField() && "Unknown LValue type!");
01007   return EmitLoadOfBitfieldLValue(LV);
01008 }
01009 
01010 RValue CodeGenFunction::EmitLoadOfBitfieldLValue(LValue LV) {
01011   const CGBitFieldInfo &Info = LV.getBitFieldInfo();
01012 
01013   // Get the output type.
01014   llvm::Type *ResLTy = ConvertType(LV.getType());
01015   unsigned ResSizeInBits = CGM.getTargetData().getTypeSizeInBits(ResLTy);
01016 
01017   // Compute the result as an OR of all of the individual component accesses.
01018   llvm::Value *Res = 0;
01019   for (unsigned i = 0, e = Info.getNumComponents(); i != e; ++i) {
01020     const CGBitFieldInfo::AccessInfo &AI = Info.getComponent(i);
01021 
01022     // Get the field pointer.
01023     llvm::Value *Ptr = LV.getBitFieldBaseAddr();
01024 
01025     // Only offset by the field index if used, so that incoming values are not
01026     // required to be structures.
01027     if (AI.FieldIndex)
01028       Ptr = Builder.CreateStructGEP(Ptr, AI.FieldIndex, "bf.field");
01029 
01030     // Offset by the byte offset, if used.
01031     if (!AI.FieldByteOffset.isZero()) {
01032       Ptr = EmitCastToVoidPtr(Ptr);
01033       Ptr = Builder.CreateConstGEP1_32(Ptr, AI.FieldByteOffset.getQuantity(),
01034                                        "bf.field.offs");
01035     }
01036 
01037     // Cast to the access type.
01038     llvm::Type *PTy = llvm::Type::getIntNPtrTy(getLLVMContext(), AI.AccessWidth,
01039                        CGM.getContext().getTargetAddressSpace(LV.getType()));
01040     Ptr = Builder.CreateBitCast(Ptr, PTy);
01041 
01042     // Perform the load.
01043     llvm::LoadInst *Load = Builder.CreateLoad(Ptr, LV.isVolatileQualified());
01044     if (!AI.AccessAlignment.isZero())
01045       Load->setAlignment(AI.AccessAlignment.getQuantity());
01046 
01047     // Shift out unused low bits and mask out unused high bits.
01048     llvm::Value *Val = Load;
01049     if (AI.FieldBitStart)
01050       Val = Builder.CreateLShr(Load, AI.FieldBitStart);
01051     Val = Builder.CreateAnd(Val, llvm::APInt::getLowBitsSet(AI.AccessWidth,
01052                                                             AI.TargetBitWidth),
01053                             "bf.clear");
01054 
01055     // Extend or truncate to the target size.
01056     if (AI.AccessWidth < ResSizeInBits)
01057       Val = Builder.CreateZExt(Val, ResLTy);
01058     else if (AI.AccessWidth > ResSizeInBits)
01059       Val = Builder.CreateTrunc(Val, ResLTy);
01060 
01061     // Shift into place, and OR into the result.
01062     if (AI.TargetBitOffset)
01063       Val = Builder.CreateShl(Val, AI.TargetBitOffset);
01064     Res = Res ? Builder.CreateOr(Res, Val) : Val;
01065   }
01066 
01067   // If the bit-field is signed, perform the sign-extension.
01068   //
01069   // FIXME: This can easily be folded into the load of the high bits, which
01070   // could also eliminate the mask of high bits in some situations.
01071   if (Info.isSigned()) {
01072     unsigned ExtraBits = ResSizeInBits - Info.getSize();
01073     if (ExtraBits)
01074       Res = Builder.CreateAShr(Builder.CreateShl(Res, ExtraBits),
01075                                ExtraBits, "bf.val.sext");
01076   }
01077 
01078   return RValue::get(Res);
01079 }
01080 
01081 // If this is a reference to a subset of the elements of a vector, create an
01082 // appropriate shufflevector.
01083 RValue CodeGenFunction::EmitLoadOfExtVectorElementLValue(LValue LV) {
01084   llvm::LoadInst *Load = Builder.CreateLoad(LV.getExtVectorAddr(),
01085                                             LV.isVolatileQualified());
01086   Load->setAlignment(LV.getAlignment().getQuantity());
01087   llvm::Value *Vec = Load;
01088 
01089   const llvm::Constant *Elts = LV.getExtVectorElts();
01090 
01091   // If the result of the expression is a non-vector type, we must be extracting
01092   // a single element.  Just codegen as an extractelement.
01093   const VectorType *ExprVT = LV.getType()->getAs<VectorType>();
01094   if (!ExprVT) {
01095     unsigned InIdx = getAccessedFieldNo(0, Elts);
01096     llvm::Value *Elt = llvm::ConstantInt::get(Int32Ty, InIdx);
01097     return RValue::get(Builder.CreateExtractElement(Vec, Elt));
01098   }
01099 
01100   // Always use shuffle vector to try to retain the original program structure
01101   unsigned NumResultElts = ExprVT->getNumElements();
01102 
01103   SmallVector<llvm::Constant*, 4> Mask;
01104   for (unsigned i = 0; i != NumResultElts; ++i)
01105     Mask.push_back(Builder.getInt32(getAccessedFieldNo(i, Elts)));
01106 
01107   llvm::Value *MaskV = llvm::ConstantVector::get(Mask);
01108   Vec = Builder.CreateShuffleVector(Vec, llvm::UndefValue::get(Vec->getType()),
01109                                     MaskV);
01110   return RValue::get(Vec);
01111 }
01112 
01113 
01114 
01115 /// EmitStoreThroughLValue - Store the specified rvalue into the specified
01116 /// lvalue, where both are guaranteed to the have the same type, and that type
01117 /// is 'Ty'.
01118 void CodeGenFunction::EmitStoreThroughLValue(RValue Src, LValue Dst, bool isInit) {
01119   if (!Dst.isSimple()) {
01120     if (Dst.isVectorElt()) {
01121       // Read/modify/write the vector, inserting the new element.
01122       llvm::LoadInst *Load = Builder.CreateLoad(Dst.getVectorAddr(),
01123                                                 Dst.isVolatileQualified());
01124       Load->setAlignment(Dst.getAlignment().getQuantity());
01125       llvm::Value *Vec = Load;
01126       Vec = Builder.CreateInsertElement(Vec, Src.getScalarVal(),
01127                                         Dst.getVectorIdx(), "vecins");
01128       llvm::StoreInst *Store = Builder.CreateStore(Vec, Dst.getVectorAddr(),
01129                                                    Dst.isVolatileQualified());
01130       Store->setAlignment(Dst.getAlignment().getQuantity());
01131       return;
01132     }
01133 
01134     // If this is an update of extended vector elements, insert them as
01135     // appropriate.
01136     if (Dst.isExtVectorElt())
01137       return EmitStoreThroughExtVectorComponentLValue(Src, Dst);
01138 
01139     assert(Dst.isBitField() && "Unknown LValue type");
01140     return EmitStoreThroughBitfieldLValue(Src, Dst);
01141   }
01142 
01143   // There's special magic for assigning into an ARC-qualified l-value.
01144   if (Qualifiers::ObjCLifetime Lifetime = Dst.getQuals().getObjCLifetime()) {
01145     switch (Lifetime) {
01146     case Qualifiers::OCL_None:
01147       llvm_unreachable("present but none");
01148 
01149     case Qualifiers::OCL_ExplicitNone:
01150       // nothing special
01151       break;
01152 
01153     case Qualifiers::OCL_Strong:
01154       EmitARCStoreStrong(Dst, Src.getScalarVal(), /*ignore*/ true);
01155       return;
01156 
01157     case Qualifiers::OCL_Weak:
01158       EmitARCStoreWeak(Dst.getAddress(), Src.getScalarVal(), /*ignore*/ true);
01159       return;
01160 
01161     case Qualifiers::OCL_Autoreleasing:
01162       Src = RValue::get(EmitObjCExtendObjectLifetime(Dst.getType(),
01163                                                      Src.getScalarVal()));
01164       // fall into the normal path
01165       break;
01166     }
01167   }
01168 
01169   if (Dst.isObjCWeak() && !Dst.isNonGC()) {
01170     // load of a __weak object.
01171     llvm::Value *LvalueDst = Dst.getAddress();
01172     llvm::Value *src = Src.getScalarVal();
01173      CGM.getObjCRuntime().EmitObjCWeakAssign(*this, src, LvalueDst);
01174     return;
01175   }
01176 
01177   if (Dst.isObjCStrong() && !Dst.isNonGC()) {
01178     // load of a __strong object.
01179     llvm::Value *LvalueDst = Dst.getAddress();
01180     llvm::Value *src = Src.getScalarVal();
01181     if (Dst.isObjCIvar()) {
01182       assert(Dst.getBaseIvarExp() && "BaseIvarExp is NULL");
01183       llvm::Type *ResultType = ConvertType(getContext().LongTy);
01184       llvm::Value *RHS = EmitScalarExpr(Dst.getBaseIvarExp());
01185       llvm::Value *dst = RHS;
01186       RHS = Builder.CreatePtrToInt(RHS, ResultType, "sub.ptr.rhs.cast");
01187       llvm::Value *LHS = 
01188         Builder.CreatePtrToInt(LvalueDst, ResultType, "sub.ptr.lhs.cast");
01189       llvm::Value *BytesBetween = Builder.CreateSub(LHS, RHS, "ivar.offset");
01190       CGM.getObjCRuntime().EmitObjCIvarAssign(*this, src, dst,
01191                                               BytesBetween);
01192     } else if (Dst.isGlobalObjCRef()) {
01193       CGM.getObjCRuntime().EmitObjCGlobalAssign(*this, src, LvalueDst,
01194                                                 Dst.isThreadLocalRef());
01195     }
01196     else
01197       CGM.getObjCRuntime().EmitObjCStrongCastAssign(*this, src, LvalueDst);
01198     return;
01199   }
01200 
01201   assert(Src.isScalar() && "Can't emit an agg store with this method");
01202   EmitStoreOfScalar(Src.getScalarVal(), Dst, isInit);
01203 }
01204 
01205 void CodeGenFunction::EmitStoreThroughBitfieldLValue(RValue Src, LValue Dst,
01206                                                      llvm::Value **Result) {
01207   const CGBitFieldInfo &Info = Dst.getBitFieldInfo();
01208 
01209   // Get the output type.
01210   llvm::Type *ResLTy = ConvertTypeForMem(Dst.getType());
01211   unsigned ResSizeInBits = CGM.getTargetData().getTypeSizeInBits(ResLTy);
01212 
01213   // Get the source value, truncated to the width of the bit-field.
01214   llvm::Value *SrcVal = Src.getScalarVal();
01215 
01216   if (hasBooleanRepresentation(Dst.getType()))
01217     SrcVal = Builder.CreateIntCast(SrcVal, ResLTy, /*IsSigned=*/false);
01218 
01219   SrcVal = Builder.CreateAnd(SrcVal, llvm::APInt::getLowBitsSet(ResSizeInBits,
01220                                                                 Info.getSize()),
01221                              "bf.value");
01222 
01223   // Return the new value of the bit-field, if requested.
01224   if (Result) {
01225     // Cast back to the proper type for result.
01226     llvm::Type *SrcTy = Src.getScalarVal()->getType();
01227     llvm::Value *ReloadVal = Builder.CreateIntCast(SrcVal, SrcTy, false,
01228                                                    "bf.reload.val");
01229 
01230     // Sign extend if necessary.
01231     if (Info.isSigned()) {
01232       unsigned ExtraBits = ResSizeInBits - Info.getSize();
01233       if (ExtraBits)
01234         ReloadVal = Builder.CreateAShr(Builder.CreateShl(ReloadVal, ExtraBits),
01235                                        ExtraBits, "bf.reload.sext");
01236     }
01237 
01238     *Result = ReloadVal;
01239   }
01240 
01241   // Iterate over the components, writing each piece to memory.
01242   for (unsigned i = 0, e = Info.getNumComponents(); i != e; ++i) {
01243     const CGBitFieldInfo::AccessInfo &AI = Info.getComponent(i);
01244 
01245     // Get the field pointer.
01246     llvm::Value *Ptr = Dst.getBitFieldBaseAddr();
01247     unsigned addressSpace =
01248       cast<llvm::PointerType>(Ptr->getType())->getAddressSpace();
01249 
01250     // Only offset by the field index if used, so that incoming values are not
01251     // required to be structures.
01252     if (AI.FieldIndex)
01253       Ptr = Builder.CreateStructGEP(Ptr, AI.FieldIndex, "bf.field");
01254 
01255     // Offset by the byte offset, if used.
01256     if (!AI.FieldByteOffset.isZero()) {
01257       Ptr = EmitCastToVoidPtr(Ptr);
01258       Ptr = Builder.CreateConstGEP1_32(Ptr, AI.FieldByteOffset.getQuantity(),
01259                                        "bf.field.offs");
01260     }
01261 
01262     // Cast to the access type.
01263     llvm::Type *AccessLTy =
01264       llvm::Type::getIntNTy(getLLVMContext(), AI.AccessWidth);
01265 
01266     llvm::Type *PTy = AccessLTy->getPointerTo(addressSpace);
01267     Ptr = Builder.CreateBitCast(Ptr, PTy);
01268 
01269     // Extract the piece of the bit-field value to write in this access, limited
01270     // to the values that are part of this access.
01271     llvm::Value *Val = SrcVal;
01272     if (AI.TargetBitOffset)
01273       Val = Builder.CreateLShr(Val, AI.TargetBitOffset);
01274     Val = Builder.CreateAnd(Val, llvm::APInt::getLowBitsSet(ResSizeInBits,
01275                                                             AI.TargetBitWidth));
01276 
01277     // Extend or truncate to the access size.
01278     if (ResSizeInBits < AI.AccessWidth)
01279       Val = Builder.CreateZExt(Val, AccessLTy);
01280     else if (ResSizeInBits > AI.AccessWidth)
01281       Val = Builder.CreateTrunc(Val, AccessLTy);
01282 
01283     // Shift into the position in memory.
01284     if (AI.FieldBitStart)
01285       Val = Builder.CreateShl(Val, AI.FieldBitStart);
01286 
01287     // If necessary, load and OR in bits that are outside of the bit-field.
01288     if (AI.TargetBitWidth != AI.AccessWidth) {
01289       llvm::LoadInst *Load = Builder.CreateLoad(Ptr, Dst.isVolatileQualified());
01290       if (!AI.AccessAlignment.isZero())
01291         Load->setAlignment(AI.AccessAlignment.getQuantity());
01292 
01293       // Compute the mask for zeroing the bits that are part of the bit-field.
01294       llvm::APInt InvMask =
01295         ~llvm::APInt::getBitsSet(AI.AccessWidth, AI.FieldBitStart,
01296                                  AI.FieldBitStart + AI.TargetBitWidth);
01297 
01298       // Apply the mask and OR in to the value to write.
01299       Val = Builder.CreateOr(Builder.CreateAnd(Load, InvMask), Val);
01300     }
01301 
01302     // Write the value.
01303     llvm::StoreInst *Store = Builder.CreateStore(Val, Ptr,
01304                                                  Dst.isVolatileQualified());
01305     if (!AI.AccessAlignment.isZero())
01306       Store->setAlignment(AI.AccessAlignment.getQuantity());
01307   }
01308 }
01309 
01310 void CodeGenFunction::EmitStoreThroughExtVectorComponentLValue(RValue Src,
01311                                                                LValue Dst) {
01312   // This access turns into a read/modify/write of the vector.  Load the input
01313   // value now.
01314   llvm::LoadInst *Load = Builder.CreateLoad(Dst.getExtVectorAddr(),
01315                                             Dst.isVolatileQualified());
01316   Load->setAlignment(Dst.getAlignment().getQuantity());
01317   llvm::Value *Vec = Load;
01318   const llvm::Constant *Elts = Dst.getExtVectorElts();
01319 
01320   llvm::Value *SrcVal = Src.getScalarVal();
01321 
01322   if (const VectorType *VTy = Dst.getType()->getAs<VectorType>()) {
01323     unsigned NumSrcElts = VTy->getNumElements();
01324     unsigned NumDstElts =
01325        cast<llvm::VectorType>(Vec->getType())->getNumElements();
01326     if (NumDstElts == NumSrcElts) {
01327       // Use shuffle vector is the src and destination are the same number of
01328       // elements and restore the vector mask since it is on the side it will be
01329       // stored.
01330       SmallVector<llvm::Constant*, 4> Mask(NumDstElts);
01331       for (unsigned i = 0; i != NumSrcElts; ++i)
01332         Mask[getAccessedFieldNo(i, Elts)] = Builder.getInt32(i);
01333 
01334       llvm::Value *MaskV = llvm::ConstantVector::get(Mask);
01335       Vec = Builder.CreateShuffleVector(SrcVal,
01336                                         llvm::UndefValue::get(Vec->getType()),
01337                                         MaskV);
01338     } else if (NumDstElts > NumSrcElts) {
01339       // Extended the source vector to the same length and then shuffle it
01340       // into the destination.
01341       // FIXME: since we're shuffling with undef, can we just use the indices
01342       //        into that?  This could be simpler.
01343       SmallVector<llvm::Constant*, 4> ExtMask;
01344       for (unsigned i = 0; i != NumSrcElts; ++i)
01345         ExtMask.push_back(Builder.getInt32(i));
01346       ExtMask.resize(NumDstElts, llvm::UndefValue::get(Int32Ty));
01347       llvm::Value *ExtMaskV = llvm::ConstantVector::get(ExtMask);
01348       llvm::Value *ExtSrcVal =
01349         Builder.CreateShuffleVector(SrcVal,
01350                                     llvm::UndefValue::get(SrcVal->getType()),
01351                                     ExtMaskV);
01352       // build identity
01353       SmallVector<llvm::Constant*, 4> Mask;
01354       for (unsigned i = 0; i != NumDstElts; ++i)
01355         Mask.push_back(Builder.getInt32(i));
01356 
01357       // modify when what gets shuffled in
01358       for (unsigned i = 0; i != NumSrcElts; ++i)
01359         Mask[getAccessedFieldNo(i, Elts)] = Builder.getInt32(i+NumDstElts);
01360       llvm::Value *MaskV = llvm::ConstantVector::get(Mask);
01361       Vec = Builder.CreateShuffleVector(Vec, ExtSrcVal, MaskV);
01362     } else {
01363       // We should never shorten the vector
01364       llvm_unreachable("unexpected shorten vector length");
01365     }
01366   } else {
01367     // If the Src is a scalar (not a vector) it must be updating one element.
01368     unsigned InIdx = getAccessedFieldNo(0, Elts);
01369     llvm::Value *Elt = llvm::ConstantInt::get(Int32Ty, InIdx);
01370     Vec = Builder.CreateInsertElement(Vec, SrcVal, Elt);
01371   }
01372 
01373   llvm::StoreInst *Store = Builder.CreateStore(Vec, Dst.getExtVectorAddr(),
01374                                                Dst.isVolatileQualified());
01375   Store->setAlignment(Dst.getAlignment().getQuantity());
01376 }
01377 
01378 // setObjCGCLValueClass - sets class of he lvalue for the purpose of
01379 // generating write-barries API. It is currently a global, ivar,
01380 // or neither.
01381 static void setObjCGCLValueClass(const ASTContext &Ctx, const Expr *E,
01382                                  LValue &LV,
01383                                  bool IsMemberAccess=false) {
01384   if (Ctx.getLangOpts().getGC() == LangOptions::NonGC)
01385     return;
01386   
01387   if (isa<ObjCIvarRefExpr>(E)) {
01388     QualType ExpTy = E->getType();
01389     if (IsMemberAccess && ExpTy->isPointerType()) {
01390       // If ivar is a structure pointer, assigning to field of
01391       // this struct follows gcc's behavior and makes it a non-ivar 
01392       // writer-barrier conservatively.
01393       ExpTy = ExpTy->getAs<PointerType>()->getPointeeType();
01394       if (ExpTy->isRecordType()) {
01395         LV.setObjCIvar(false);
01396         return;
01397       }
01398     }
01399     LV.setObjCIvar(true);
01400     ObjCIvarRefExpr *Exp = cast<ObjCIvarRefExpr>(const_cast<Expr*>(E));
01401     LV.setBaseIvarExp(Exp->getBase());
01402     LV.setObjCArray(E->getType()->isArrayType());
01403     return;
01404   }
01405   
01406   if (const DeclRefExpr *Exp = dyn_cast<DeclRefExpr>(E)) {
01407     if (const VarDecl *VD = dyn_cast<VarDecl>(Exp->getDecl())) {
01408       if (VD->hasGlobalStorage()) {
01409         LV.setGlobalObjCRef(true);
01410         LV.setThreadLocalRef(VD->isThreadSpecified());
01411       }
01412     }
01413     LV.setObjCArray(E->getType()->isArrayType());
01414     return;
01415   }
01416   
01417   if (const UnaryOperator *Exp = dyn_cast<UnaryOperator>(E)) {
01418     setObjCGCLValueClass(Ctx, Exp->getSubExpr(), LV, IsMemberAccess);
01419     return;
01420   }
01421   
01422   if (const ParenExpr *Exp = dyn_cast<ParenExpr>(E)) {
01423     setObjCGCLValueClass(Ctx, Exp->getSubExpr(), LV, IsMemberAccess);
01424     if (LV.isObjCIvar()) {
01425       // If cast is to a structure pointer, follow gcc's behavior and make it
01426       // a non-ivar write-barrier.
01427       QualType ExpTy = E->getType();
01428       if (ExpTy->isPointerType())
01429         ExpTy = ExpTy->getAs<PointerType>()->getPointeeType();
01430       if (ExpTy->isRecordType())
01431         LV.setObjCIvar(false); 
01432     }
01433     return;
01434   }
01435 
01436   if (const GenericSelectionExpr *Exp = dyn_cast<GenericSelectionExpr>(E)) {
01437     setObjCGCLValueClass(Ctx, Exp->getResultExpr(), LV);
01438     return;
01439   }
01440 
01441   if (const ImplicitCastExpr *Exp = dyn_cast<ImplicitCastExpr>(E)) {
01442     setObjCGCLValueClass(Ctx, Exp->getSubExpr(), LV, IsMemberAccess);
01443     return;
01444   }
01445   
01446   if (const CStyleCastExpr *Exp = dyn_cast<CStyleCastExpr>(E)) {
01447     setObjCGCLValueClass(Ctx, Exp->getSubExpr(), LV, IsMemberAccess);
01448     return;
01449   }
01450 
01451   if (const ObjCBridgedCastExpr *Exp = dyn_cast<ObjCBridgedCastExpr>(E)) {
01452     setObjCGCLValueClass(Ctx, Exp->getSubExpr(), LV, IsMemberAccess);
01453     return;
01454   }
01455 
01456   if (const ArraySubscriptExpr *Exp = dyn_cast<ArraySubscriptExpr>(E)) {
01457     setObjCGCLValueClass(Ctx, Exp->getBase(), LV);
01458     if (LV.isObjCIvar() && !LV.isObjCArray()) 
01459       // Using array syntax to assigning to what an ivar points to is not 
01460       // same as assigning to the ivar itself. {id *Names;} Names[i] = 0;
01461       LV.setObjCIvar(false); 
01462     else if (LV.isGlobalObjCRef() && !LV.isObjCArray())
01463       // Using array syntax to assigning to what global points to is not 
01464       // same as assigning to the global itself. {id *G;} G[i] = 0;
01465       LV.setGlobalObjCRef(false);
01466     return;
01467   }
01468 
01469   if (const MemberExpr *Exp = dyn_cast<MemberExpr>(E)) {
01470     setObjCGCLValueClass(Ctx, Exp->getBase(), LV, true);
01471     // We don't know if member is an 'ivar', but this flag is looked at
01472     // only in the context of LV.isObjCIvar().
01473     LV.setObjCArray(E->getType()->isArrayType());
01474     return;
01475   }
01476 }
01477 
01478 static llvm::Value *
01479 EmitBitCastOfLValueToProperType(CodeGenFunction &CGF,
01480                                 llvm::Value *V, llvm::Type *IRType,
01481                                 StringRef Name = StringRef()) {
01482   unsigned AS = cast<llvm::PointerType>(V->getType())->getAddressSpace();
01483   return CGF.Builder.CreateBitCast(V, IRType->getPointerTo(AS), Name);
01484 }
01485 
01486 static LValue EmitGlobalVarDeclLValue(CodeGenFunction &CGF,
01487                                       const Expr *E, const VarDecl *VD) {
01488   assert((VD->hasExternalStorage() || VD->isFileVarDecl()) &&
01489          "Var decl must have external storage or be a file var decl!");
01490 
01491   llvm::Value *V = CGF.CGM.GetAddrOfGlobalVar(VD);
01492   llvm::Type *RealVarTy = CGF.getTypes().ConvertTypeForMem(VD->getType());
01493   V = EmitBitCastOfLValueToProperType(CGF, V, RealVarTy);
01494   CharUnits Alignment = CGF.getContext().getDeclAlign(VD);
01495   QualType T = E->getType();
01496   LValue LV;
01497   if (VD->getType()->isReferenceType()) {
01498     llvm::LoadInst *LI = CGF.Builder.CreateLoad(V);
01499     LI->setAlignment(Alignment.getQuantity());
01500     V = LI;
01501     LV = CGF.MakeNaturalAlignAddrLValue(V, T);
01502   } else {
01503     LV = CGF.MakeAddrLValue(V, E->getType(), Alignment);
01504   }
01505   setObjCGCLValueClass(CGF.getContext(), E, LV);
01506   return LV;
01507 }
01508 
01509 static LValue EmitFunctionDeclLValue(CodeGenFunction &CGF,
01510                                      const Expr *E, const FunctionDecl *FD) {
01511   llvm::Value *V = CGF.CGM.GetAddrOfFunction(FD);
01512   if (!FD->hasPrototype()) {
01513     if (const FunctionProtoType *Proto =
01514             FD->getType()->getAs<FunctionProtoType>()) {
01515       // Ugly case: for a K&R-style definition, the type of the definition
01516       // isn't the same as the type of a use.  Correct for this with a
01517       // bitcast.
01518       QualType NoProtoType =
01519           CGF.getContext().getFunctionNoProtoType(Proto->getResultType());
01520       NoProtoType = CGF.getContext().getPointerType(NoProtoType);
01521       V = CGF.Builder.CreateBitCast(V, CGF.ConvertType(NoProtoType));
01522     }
01523   }
01524   CharUnits Alignment = CGF.getContext().getDeclAlign(FD);
01525   return CGF.MakeAddrLValue(V, E->getType(), Alignment);
01526 }
01527 
01528 LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) {
01529   const NamedDecl *ND = E->getDecl();
01530   CharUnits Alignment = getContext().getDeclAlign(ND);
01531   QualType T = E->getType();
01532 
01533   // FIXME: We should be able to assert this for FunctionDecls as well!
01534   // FIXME: We should be able to assert this for all DeclRefExprs, not just
01535   // those with a valid source location.
01536   assert((ND->isUsed(false) || !isa<VarDecl>(ND) ||
01537           !E->getLocation().isValid()) &&
01538          "Should not use decl without marking it used!");
01539 
01540   if (ND->hasAttr<WeakRefAttr>()) {
01541     const ValueDecl *VD = cast<ValueDecl>(ND);
01542     llvm::Constant *Aliasee = CGM.GetWeakRefReference(VD);
01543     return MakeAddrLValue(Aliasee, E->getType(), Alignment);
01544   }
01545 
01546   if (const VarDecl *VD = dyn_cast<VarDecl>(ND)) {
01547     // Check if this is a global variable.
01548     if (VD->hasExternalStorage() || VD->isFileVarDecl()) 
01549       return EmitGlobalVarDeclLValue(*this, E, VD);
01550 
01551     bool isBlockVariable = VD->hasAttr<BlocksAttr>();
01552 
01553     bool NonGCable = VD->hasLocalStorage() &&
01554                      !VD->getType()->isReferenceType() &&
01555                      !isBlockVariable;
01556 
01557     llvm::Value *V = LocalDeclMap[VD];
01558     if (!V && VD->isStaticLocal()) 
01559       V = CGM.getStaticLocalDeclAddress(VD);
01560 
01561     // Use special handling for lambdas.
01562     if (!V) {
01563       if (FieldDecl *FD = LambdaCaptureFields.lookup(VD)) {
01564         QualType LambdaTagType = getContext().getTagDeclType(FD->getParent());
01565         LValue LambdaLV = MakeNaturalAlignAddrLValue(CXXABIThisValue,
01566                                                      LambdaTagType);
01567         return EmitLValueForField(LambdaLV, FD);
01568       }
01569 
01570       assert(isa<BlockDecl>(CurCodeDecl) && E->refersToEnclosingLocal());
01571       CharUnits alignment = getContext().getDeclAlign(VD);
01572       return MakeAddrLValue(GetAddrOfBlockDecl(VD, isBlockVariable),
01573                             E->getType(), alignment);
01574     }
01575 
01576     assert(V && "DeclRefExpr not entered in LocalDeclMap?");
01577 
01578     if (isBlockVariable)
01579       V = BuildBlockByrefAddress(V, VD);
01580 
01581     LValue LV;
01582     if (VD->getType()->isReferenceType()) {
01583       llvm::LoadInst *LI = Builder.CreateLoad(V);
01584       LI->setAlignment(Alignment.getQuantity());
01585       V = LI;
01586       LV = MakeNaturalAlignAddrLValue(V, T);
01587     } else {
01588       LV = MakeAddrLValue(V, T, Alignment);
01589     }
01590 
01591     if (NonGCable) {
01592       LV.getQuals().removeObjCGCAttr();
01593       LV.setNonGC(true);
01594     }
01595     setObjCGCLValueClass(getContext(), E, LV);
01596     return LV;
01597   }
01598 
01599   if (const FunctionDecl *fn = dyn_cast<FunctionDecl>(ND))
01600     return EmitFunctionDeclLValue(*this, E, fn);
01601 
01602   llvm_unreachable("Unhandled DeclRefExpr");
01603 }
01604 
01605 LValue CodeGenFunction::EmitUnaryOpLValue(const UnaryOperator *E) {
01606   // __extension__ doesn't affect lvalue-ness.
01607   if (E->getOpcode() == UO_Extension)
01608     return EmitLValue(E->getSubExpr());
01609 
01610   QualType ExprTy = getContext().getCanonicalType(E->getSubExpr()->getType());
01611   switch (E->getOpcode()) {
01612   default: llvm_unreachable("Unknown unary operator lvalue!");
01613   case UO_Deref: {
01614     QualType T = E->getSubExpr()->getType()->getPointeeType();
01615     assert(!T.isNull() && "CodeGenFunction::EmitUnaryOpLValue: Illegal type");
01616 
01617     LValue LV = MakeNaturalAlignAddrLValue(EmitScalarExpr(E->getSubExpr()), T);
01618     LV.getQuals().setAddressSpace(ExprTy.getAddressSpace());
01619 
01620     // We should not generate __weak write barrier on indirect reference
01621     // of a pointer to object; as in void foo (__weak id *param); *param = 0;
01622     // But, we continue to generate __strong write barrier on indirect write
01623     // into a pointer to object.
01624     if (getContext().getLangOpts().ObjC1 &&
01625         getContext().getLangOpts().getGC() != LangOptions::NonGC &&
01626         LV.isObjCWeak())
01627       LV.setNonGC(!E->isOBJCGCCandidate(getContext()));
01628     return LV;
01629   }
01630   case UO_Real:
01631   case UO_Imag: {
01632     LValue LV = EmitLValue(E->getSubExpr());
01633     assert(LV.isSimple() && "real/imag on non-ordinary l-value");
01634     llvm::Value *Addr = LV.getAddress();
01635 
01636     // __real is valid on scalars.  This is a faster way of testing that.
01637     // __imag can only produce an rvalue on scalars.
01638     if (E->getOpcode() == UO_Real &&
01639         !cast<llvm::PointerType>(Addr->getType())
01640            ->getElementType()->isStructTy()) {
01641       assert(E->getSubExpr()->getType()->isArithmeticType());
01642       return LV;
01643     }
01644 
01645     assert(E->getSubExpr()->getType()->isAnyComplexType());
01646 
01647     unsigned Idx = E->getOpcode() == UO_Imag;
01648     return MakeAddrLValue(Builder.CreateStructGEP(LV.getAddress(),
01649                                                   Idx, "idx"),
01650                           ExprTy);
01651   }
01652   case UO_PreInc:
01653   case UO_PreDec: {
01654     LValue LV = EmitLValue(E->getSubExpr());
01655     bool isInc = E->getOpcode() == UO_PreInc;
01656     
01657     if (E->getType()->isAnyComplexType())
01658       EmitComplexPrePostIncDec(E, LV, isInc, true/*isPre*/);
01659     else
01660       EmitScalarPrePostIncDec(E, LV, isInc, true/*isPre*/);
01661     return LV;
01662   }
01663   }
01664 }
01665 
01666 LValue CodeGenFunction::EmitStringLiteralLValue(const StringLiteral *E) {
01667   return MakeAddrLValue(CGM.GetAddrOfConstantStringFromLiteral(E),
01668                         E->getType());
01669 }
01670 
01671 LValue CodeGenFunction::EmitObjCEncodeExprLValue(const ObjCEncodeExpr *E) {
01672   return MakeAddrLValue(CGM.GetAddrOfConstantStringFromObjCEncode(E),
01673                         E->getType());
01674 }
01675 
01676 
01677 LValue CodeGenFunction::EmitPredefinedLValue(const PredefinedExpr *E) {
01678   switch (E->getIdentType()) {
01679   default:
01680     return EmitUnsupportedLValue(E, "predefined expression");
01681 
01682   case PredefinedExpr::Func:
01683   case PredefinedExpr::Function:
01684   case PredefinedExpr::PrettyFunction: {
01685     unsigned Type = E->getIdentType();
01686     std::string GlobalVarName;
01687 
01688     switch (Type) {
01689     default: llvm_unreachable("Invalid type");
01690     case PredefinedExpr::Func:
01691       GlobalVarName = "__func__.";
01692       break;
01693     case PredefinedExpr::Function:
01694       GlobalVarName = "__FUNCTION__.";
01695       break;
01696     case PredefinedExpr::PrettyFunction:
01697       GlobalVarName = "__PRETTY_FUNCTION__.";
01698       break;
01699     }
01700 
01701     StringRef FnName = CurFn->getName();
01702     if (FnName.startswith("\01"))
01703       FnName = FnName.substr(1);
01704     GlobalVarName += FnName;
01705 
01706     const Decl *CurDecl = CurCodeDecl;
01707     if (CurDecl == 0)
01708       CurDecl = getContext().getTranslationUnitDecl();
01709 
01710     std::string FunctionName =
01711         (isa<BlockDecl>(CurDecl)
01712          ? FnName.str()
01713          : PredefinedExpr::ComputeName((PredefinedExpr::IdentType)Type, CurDecl));
01714 
01715     llvm::Constant *C =
01716       CGM.GetAddrOfConstantCString(FunctionName, GlobalVarName.c_str());
01717     return MakeAddrLValue(C, E->getType());
01718   }
01719   }
01720 }
01721 
01722 llvm::BasicBlock *CodeGenFunction::getTrapBB() {
01723   const CodeGenOptions &GCO = CGM.getCodeGenOpts();
01724 
01725   // If we are not optimzing, don't collapse all calls to trap in the function
01726   // to the same call, that way, in the debugger they can see which operation
01727   // did in fact fail.  If we are optimizing, we collapse all calls to trap down
01728   // to just one per function to save on codesize.
01729   if (GCO.OptimizationLevel && TrapBB)
01730     return TrapBB;
01731 
01732   llvm::BasicBlock *Cont = 0;
01733   if (HaveInsertPoint()) {
01734     Cont = createBasicBlock("cont");
01735     EmitBranch(Cont);
01736   }
01737   TrapBB = createBasicBlock("trap");
01738   EmitBlock(TrapBB);
01739 
01740   llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::trap);
01741   llvm::CallInst *TrapCall = Builder.CreateCall(F);
01742   TrapCall->setDoesNotReturn();
01743   TrapCall->setDoesNotThrow();
01744   Builder.CreateUnreachable();
01745 
01746   if (Cont)
01747     EmitBlock(Cont);
01748   return TrapBB;
01749 }
01750 
01751 /// isSimpleArrayDecayOperand - If the specified expr is a simple decay from an
01752 /// array to pointer, return the array subexpression.
01753 static const Expr *isSimpleArrayDecayOperand(const Expr *E) {
01754   // If this isn't just an array->pointer decay, bail out.
01755   const CastExpr *CE = dyn_cast<CastExpr>(E);
01756   if (CE == 0 || CE->getCastKind() != CK_ArrayToPointerDecay)
01757     return 0;
01758   
01759   // If this is a decay from variable width array, bail out.
01760   const Expr *SubExpr = CE->getSubExpr();
01761   if (SubExpr->getType()->isVariableArrayType())
01762     return 0;
01763   
01764   return SubExpr;
01765 }
01766 
01767 LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E) {
01768   // The index must always be an integer, which is not an aggregate.  Emit it.
01769   llvm::Value *Idx = EmitScalarExpr(E->getIdx());
01770   QualType IdxTy  = E->getIdx()->getType();
01771   bool IdxSigned = IdxTy->isSignedIntegerOrEnumerationType();
01772 
01773   // If the base is a vector type, then we are forming a vector element lvalue
01774   // with this subscript.
01775   if (E->getBase()->getType()->isVectorType()) {
01776     // Emit the vector as an lvalue to get its address.
01777     LValue LHS = EmitLValue(E->getBase());
01778     assert(LHS.isSimple() && "Can only subscript lvalue vectors here!");
01779     Idx = Builder.CreateIntCast(Idx, Int32Ty, IdxSigned, "vidx");
01780     return LValue::MakeVectorElt(LHS.getAddress(), Idx,
01781                                  E->getBase()->getType(), LHS.getAlignment());
01782   }
01783 
01784   // Extend or truncate the index type to 32 or 64-bits.
01785   if (Idx->getType() != IntPtrTy)
01786     Idx = Builder.CreateIntCast(Idx, IntPtrTy, IdxSigned, "idxprom");
01787 
01788   // We know that the pointer points to a type of the correct size, unless the
01789   // size is a VLA or Objective-C interface.
01790   llvm::Value *Address = 0;
01791   CharUnits ArrayAlignment;
01792   if (const VariableArrayType *vla =
01793         getContext().getAsVariableArrayType(E->getType())) {
01794     // The base must be a pointer, which is not an aggregate.  Emit
01795     // it.  It needs to be emitted first in case it's what captures
01796     // the VLA bounds.
01797     Address = EmitScalarExpr(E->getBase());
01798 
01799     // The element count here is the total number of non-VLA elements.
01800     llvm::Value *numElements = getVLASize(vla).first;
01801 
01802     // Effectively, the multiply by the VLA size is part of the GEP.
01803     // GEP indexes are signed, and scaling an index isn't permitted to
01804     // signed-overflow, so we use the same semantics for our explicit
01805     // multiply.  We suppress this if overflow is not undefined behavior.
01806     if (getLangOpts().isSignedOverflowDefined()) {
01807       Idx = Builder.CreateMul(Idx, numElements);
01808       Address = Builder.CreateGEP(Address, Idx, "arrayidx");
01809     } else {
01810       Idx = Builder.CreateNSWMul(Idx, numElements);
01811       Address = Builder.CreateInBoundsGEP(Address, Idx, "arrayidx");
01812     }
01813   } else if (const ObjCObjectType *OIT = E->getType()->getAs<ObjCObjectType>()){
01814     // Indexing over an interface, as in "NSString *P; P[4];"
01815     llvm::Value *InterfaceSize =
01816       llvm::ConstantInt::get(Idx->getType(),
01817           getContext().getTypeSizeInChars(OIT).getQuantity());
01818 
01819     Idx = Builder.CreateMul(Idx, InterfaceSize);
01820 
01821     // The base must be a pointer, which is not an aggregate.  Emit it.
01822     llvm::Value *Base = EmitScalarExpr(E->getBase());
01823     Address = EmitCastToVoidPtr(Base);
01824     Address = Builder.CreateGEP(Address, Idx, "arrayidx");
01825     Address = Builder.CreateBitCast(Address, Base->getType());
01826   } else if (const Expr *Array = isSimpleArrayDecayOperand(E->getBase())) {
01827     // If this is A[i] where A is an array, the frontend will have decayed the
01828     // base to be a ArrayToPointerDecay implicit cast.  While correct, it is
01829     // inefficient at -O0 to emit a "gep A, 0, 0" when codegen'ing it, then a
01830     // "gep x, i" here.  Emit one "gep A, 0, i".
01831     assert(Array->getType()->isArrayType() &&
01832            "Array to pointer decay must have array source type!");
01833     LValue ArrayLV = EmitLValue(Array);
01834     llvm::Value *ArrayPtr = ArrayLV.getAddress();
01835     llvm::Value *Zero = llvm::ConstantInt::get(Int32Ty, 0);
01836     llvm::Value *Args[] = { Zero, Idx };
01837     
01838     // Propagate the alignment from the array itself to the result.
01839     ArrayAlignment = ArrayLV.getAlignment();
01840 
01841     if (getContext().getLangOpts().isSignedOverflowDefined())
01842       Address = Builder.CreateGEP(ArrayPtr, Args, "arrayidx");
01843     else
01844       Address = Builder.CreateInBoundsGEP(ArrayPtr, Args, "arrayidx");
01845   } else {
01846     // The base must be a pointer, which is not an aggregate.  Emit it.
01847     llvm::Value *Base = EmitScalarExpr(E->getBase());
01848     if (getContext().getLangOpts().isSignedOverflowDefined())
01849       Address = Builder.CreateGEP(Base, Idx, "arrayidx");
01850     else
01851       Address = Builder.CreateInBoundsGEP(Base, Idx, "arrayidx");
01852   }
01853 
01854   QualType T = E->getBase()->getType()->getPointeeType();
01855   assert(!T.isNull() &&
01856          "CodeGenFunction::EmitArraySubscriptExpr(): Illegal base type");
01857 
01858   
01859   // Limit the alignment to that of the result type.
01860   LValue LV;
01861   if (!ArrayAlignment.isZero()) {
01862     CharUnits Align = getContext().getTypeAlignInChars(T);
01863     ArrayAlignment = std::min(Align, ArrayAlignment);
01864     LV = MakeAddrLValue(Address, T, ArrayAlignment);
01865   } else {
01866     LV = MakeNaturalAlignAddrLValue(Address, T);
01867   }
01868 
01869   LV.getQuals().setAddressSpace(E->getBase()->getType().getAddressSpace());
01870 
01871   if (getContext().getLangOpts().ObjC1 &&
01872       getContext().getLangOpts().getGC() != LangOptions::NonGC) {
01873     LV.setNonGC(!E->isOBJCGCCandidate(getContext()));
01874     setObjCGCLValueClass(getContext(), E, LV);
01875   }
01876   return LV;
01877 }
01878 
01879 static
01880 llvm::Constant *GenerateConstantVector(CGBuilderTy &Builder,
01881                                        SmallVector<unsigned, 4> &Elts) {
01882   SmallVector<llvm::Constant*, 4> CElts;
01883   for (unsigned i = 0, e = Elts.size(); i != e; ++i)
01884     CElts.push_back(Builder.getInt32(Elts[i]));
01885 
01886   return llvm::ConstantVector::get(CElts);
01887 }
01888 
01889 LValue CodeGenFunction::
01890 EmitExtVectorElementExpr(const ExtVectorElementExpr *E) {
01891   // Emit the base vector as an l-value.
01892   LValue Base;
01893 
01894   // ExtVectorElementExpr's base can either be a vector or pointer to vector.
01895   if (E->isArrow()) {
01896     // If it is a pointer to a vector, emit the address and form an lvalue with
01897     // it.
01898     llvm::Value *Ptr = EmitScalarExpr(E->getBase());
01899     const PointerType *PT = E->getBase()->getType()->getAs<PointerType>();
01900     Base = MakeAddrLValue(Ptr, PT->getPointeeType());
01901     Base.getQuals().removeObjCGCAttr();
01902   } else if (E->getBase()->isGLValue()) {
01903     // Otherwise, if the base is an lvalue ( as in the case of foo.x.x),
01904     // emit the base as an lvalue.
01905     assert(E->getBase()->getType()->isVectorType());
01906     Base = EmitLValue(E->getBase());
01907   } else {
01908     // Otherwise, the base is a normal rvalue (as in (V+V).x), emit it as such.
01909     assert(E->getBase()->getType()->isVectorType() &&
01910            "Result must be a vector");
01911     llvm::Value *Vec = EmitScalarExpr(E->getBase());
01912     
01913     // Store the vector to memory (because LValue wants an address).
01914     llvm::Value *VecMem = CreateMemTemp(E->getBase()->getType());
01915     Builder.CreateStore(Vec, VecMem);
01916     Base = MakeAddrLValue(VecMem, E->getBase()->getType());
01917   }
01918 
01919   QualType type =
01920     E->getType().withCVRQualifiers(Base.getQuals().getCVRQualifiers());
01921   
01922   // Encode the element access list into a vector of unsigned indices.
01923   SmallVector<unsigned, 4> Indices;
01924   E->getEncodedElementAccess(Indices);
01925 
01926   if (Base.isSimple()) {
01927     llvm::Constant *CV = GenerateConstantVector(Builder, Indices);
01928     return LValue::MakeExtVectorElt(Base.getAddress(), CV, type,
01929                                     Base.getAlignment());
01930   }
01931   assert(Base.isExtVectorElt() && "Can only subscript lvalue vec elts here!");
01932 
01933   llvm::Constant *BaseElts = Base.getExtVectorElts();
01934   SmallVector<llvm::Constant *, 4> CElts;
01935 
01936   for (unsigned i = 0, e = Indices.size(); i != e; ++i)
01937     CElts.push_back(BaseElts->getAggregateElement(Indices[i]));
01938   llvm::Constant *CV = llvm::ConstantVector::get(CElts);
01939   return LValue::MakeExtVectorElt(Base.getExtVectorAddr(), CV, type,
01940                                   Base.getAlignment());
01941 }
01942 
01943 LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) {
01944   Expr *BaseExpr = E->getBase();
01945 
01946   // If this is s.x, emit s as an lvalue.  If it is s->x, emit s as a scalar.
01947   LValue BaseLV;
01948   if (E->isArrow())
01949     BaseLV = MakeNaturalAlignAddrLValue(EmitScalarExpr(BaseExpr),
01950                                         BaseExpr->getType()->getPointeeType());
01951   else
01952     BaseLV = EmitLValue(BaseExpr);
01953 
01954   NamedDecl *ND = E->getMemberDecl();
01955   if (FieldDecl *Field = dyn_cast<FieldDecl>(ND)) {
01956     LValue LV = EmitLValueForField(BaseLV, Field);
01957     setObjCGCLValueClass(getContext(), E, LV);
01958     return LV;
01959   }
01960   
01961   if (VarDecl *VD = dyn_cast<VarDecl>(ND))
01962     return EmitGlobalVarDeclLValue(*this, E, VD);
01963 
01964   if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND))
01965     return EmitFunctionDeclLValue(*this, E, FD);
01966 
01967   llvm_unreachable("Unhandled member declaration!");
01968 }
01969 
01970 LValue CodeGenFunction::EmitLValueForBitfield(llvm::Value *BaseValue,
01971                                               const FieldDecl *Field,
01972                                               unsigned CVRQualifiers) {
01973   const CGRecordLayout &RL =
01974     CGM.getTypes().getCGRecordLayout(Field->getParent());
01975   const CGBitFieldInfo &Info = RL.getBitFieldInfo(Field);
01976   return LValue::MakeBitfield(BaseValue, Info,
01977                           Field->getType().withCVRQualifiers(CVRQualifiers));
01978 }
01979 
01980 /// EmitLValueForAnonRecordField - Given that the field is a member of
01981 /// an anonymous struct or union buried inside a record, and given
01982 /// that the base value is a pointer to the enclosing record, derive
01983 /// an lvalue for the ultimate field.
01984 LValue CodeGenFunction::EmitLValueForAnonRecordField(llvm::Value *BaseValue,
01985                                              const IndirectFieldDecl *Field,
01986                                                      unsigned CVRQualifiers) {
01987   IndirectFieldDecl::chain_iterator I = Field->chain_begin(),
01988     IEnd = Field->chain_end();
01989   while (true) {
01990     QualType RecordTy =
01991         getContext().getTypeDeclType(cast<FieldDecl>(*I)->getParent());
01992     LValue LV = EmitLValueForField(MakeAddrLValue(BaseValue, RecordTy),
01993                                    cast<FieldDecl>(*I));
01994     if (++I == IEnd) return LV;
01995 
01996     assert(LV.isSimple());
01997     BaseValue = LV.getAddress();
01998     CVRQualifiers |= LV.getVRQualifiers();
01999   }
02000 }
02001 
02002 LValue CodeGenFunction::EmitLValueForField(LValue base,
02003                                            const FieldDecl *field) {
02004   if (field->isBitField())
02005     return EmitLValueForBitfield(base.getAddress(), field,
02006                                  base.getVRQualifiers());
02007 
02008   const RecordDecl *rec = field->getParent();
02009   QualType type = field->getType();
02010   CharUnits alignment = getContext().getDeclAlign(field);
02011 
02012   // FIXME: It should be impossible to have an LValue without alignment for a
02013   // complete type.
02014   if (!base.getAlignment().isZero())
02015     alignment = std::min(alignment, base.getAlignment());
02016 
02017   bool mayAlias = rec->hasAttr<MayAliasAttr>();
02018 
02019   llvm::Value *addr = base.getAddress();
02020   unsigned cvr = base.getVRQualifiers();
02021   if (rec->isUnion()) {
02022     // For unions, there is no pointer adjustment.
02023     assert(!type->isReferenceType() && "union has reference member");
02024   } else {
02025     // For structs, we GEP to the field that the record layout suggests.
02026     unsigned idx = CGM.getTypes().getCGRecordLayout(rec).getLLVMFieldNo(field);
02027     addr = Builder.CreateStructGEP(addr, idx, field->getName());
02028 
02029     // If this is a reference field, load the reference right now.
02030     if (const ReferenceType *refType = type->getAs<ReferenceType>()) {
02031       llvm::LoadInst *load = Builder.CreateLoad(addr, "ref");
02032       if (cvr & Qualifiers::Volatile) load->setVolatile(true);
02033       load->setAlignment(alignment.getQuantity());
02034 
02035       if (CGM.shouldUseTBAA()) {
02036         llvm::MDNode *tbaa;
02037         if (mayAlias)
02038           tbaa = CGM.getTBAAInfo(getContext().CharTy);
02039         else
02040           tbaa = CGM.getTBAAInfo(type);
02041         CGM.DecorateInstruction(load, tbaa);
02042       }
02043 
02044       addr = load;
02045       mayAlias = false;
02046       type = refType->getPointeeType();
02047       if (type->isIncompleteType())
02048         alignment = CharUnits();
02049       else
02050         alignment = getContext().getTypeAlignInChars(type);
02051       cvr = 0; // qualifiers don't recursively apply to referencee
02052     }
02053   }
02054   
02055   // Make sure that the address is pointing to the right type.  This is critical
02056   // for both unions and structs.  A union needs a bitcast, a struct element
02057   // will need a bitcast if the LLVM type laid out doesn't match the desired
02058   // type.
02059   addr = EmitBitCastOfLValueToProperType(*this, addr,
02060                                          CGM.getTypes().ConvertTypeForMem(type),
02061                                          field->getName());
02062 
02063   if (field->hasAttr<AnnotateAttr>())
02064     addr = EmitFieldAnnotations(field, addr);
02065 
02066   LValue LV = MakeAddrLValue(addr, type, alignment);
02067   LV.getQuals().addCVRQualifiers(cvr);
02068 
02069   // __weak attribute on a field is ignored.
02070   if (LV.getQuals().getObjCGCAttr() == Qualifiers::Weak)
02071     LV.getQuals().removeObjCGCAttr();
02072 
02073   // Fields of may_alias structs act like 'char' for TBAA purposes.
02074   // FIXME: this should get propagated down through anonymous structs
02075   // and unions.
02076   if (mayAlias && LV.getTBAAInfo())
02077     LV.setTBAAInfo(CGM.getTBAAInfo(getContext().CharTy));
02078 
02079   return LV;
02080 }
02081 
02082 LValue 
02083 CodeGenFunction::EmitLValueForFieldInitialization(LValue Base, 
02084                                                   const FieldDecl *Field) {
02085   QualType FieldType = Field->getType();
02086   
02087   if (!FieldType->isReferenceType())
02088     return EmitLValueForField(Base, Field);
02089 
02090   const CGRecordLayout &RL =
02091     CGM.getTypes().getCGRecordLayout(Field->getParent());
02092   unsigned idx = RL.getLLVMFieldNo(Field);
02093   llvm::Value *V = Builder.CreateStructGEP(Base.getAddress(), idx);
02094   assert(!FieldType.getObjCGCAttr() && "fields cannot have GC attrs");
02095 
02096   // Make sure that the address is pointing to the right type.  This is critical
02097   // for both unions and structs.  A union needs a bitcast, a struct element
02098   // will need a bitcast if the LLVM type laid out doesn't match the desired
02099   // type.
02100   llvm::Type *llvmType = ConvertTypeForMem(FieldType);
02101   V = EmitBitCastOfLValueToProperType(*this, V, llvmType, Field->getName());
02102 
02103   CharUnits Alignment = getContext().getDeclAlign(Field);
02104 
02105   // FIXME: It should be impossible to have an LValue without alignment for a
02106   // complete type.
02107   if (!Base.getAlignment().isZero())
02108     Alignment = std::min(Alignment, Base.getAlignment());
02109 
02110   return MakeAddrLValue(V, FieldType, Alignment);
02111 }
02112 
02113 LValue CodeGenFunction::EmitCompoundLiteralLValue(const CompoundLiteralExpr *E){
02114   if (E->isFileScope()) {
02115     llvm::Value *GlobalPtr = CGM.GetAddrOfConstantCompoundLiteral(E);
02116     return MakeAddrLValue(GlobalPtr, E->getType());
02117   }
02118 
02119   llvm::Value *DeclPtr = CreateMemTemp(E->getType(), ".compoundliteral");
02120   const Expr *InitExpr = E->getInitializer();
02121   LValue Result = MakeAddrLValue(DeclPtr, E->getType());
02122 
02123   EmitAnyExprToMem(InitExpr, DeclPtr, E->getType().getQualifiers(),
02124                    /*Init*/ true);
02125 
02126   return Result;
02127 }
02128 
02129 LValue CodeGenFunction::EmitInitListLValue(const InitListExpr *E) {
02130   if (!E->isGLValue())
02131     // Initializing an aggregate temporary in C++11: T{...}.
02132     return EmitAggExprToLValue(E);
02133 
02134   // An lvalue initializer list must be initializing a reference.
02135   assert(E->getNumInits() == 1 && "reference init with multiple values");
02136   return EmitLValue(E->getInit(0));
02137 }
02138 
02139 LValue CodeGenFunction::
02140 EmitConditionalOperatorLValue(const AbstractConditionalOperator *expr) {
02141   if (!expr->isGLValue()) {
02142     // ?: here should be an aggregate.
02143     assert((hasAggregateLLVMType(expr->getType()) &&
02144             !expr->getType()->isAnyComplexType()) &&
02145            "Unexpected conditional operator!");
02146     return EmitAggExprToLValue(expr);
02147   }
02148 
02149   OpaqueValueMapping binding(*this, expr);
02150 
02151   const Expr *condExpr = expr->getCond();
02152   bool CondExprBool;
02153   if (ConstantFoldsToSimpleInteger(condExpr, CondExprBool)) {
02154     const Expr *live = expr->getTrueExpr(), *dead = expr->getFalseExpr();
02155     if (!CondExprBool) std::swap(live, dead);
02156 
02157     if (!ContainsLabel(dead))
02158       return EmitLValue(live);
02159   }
02160 
02161   llvm::BasicBlock *lhsBlock = createBasicBlock("cond.true");
02162   llvm::BasicBlock *rhsBlock = createBasicBlock("cond.false");
02163   llvm::BasicBlock *contBlock = createBasicBlock("cond.end");
02164 
02165   ConditionalEvaluation eval(*this);
02166   EmitBranchOnBoolExpr(condExpr, lhsBlock, rhsBlock);
02167     
02168   // Any temporaries created here are conditional.
02169   EmitBlock(lhsBlock);
02170   eval.begin(*this);
02171   LValue lhs = EmitLValue(expr->getTrueExpr());
02172   eval.end(*this);
02173     
02174   if (!lhs.isSimple())
02175     return EmitUnsupportedLValue(expr, "conditional operator");
02176 
02177   lhsBlock = Builder.GetInsertBlock();
02178   Builder.CreateBr(contBlock);
02179     
02180   // Any temporaries created here are conditional.
02181   EmitBlock(rhsBlock);
02182   eval.begin(*this);
02183   LValue rhs = EmitLValue(expr->getFalseExpr());
02184   eval.end(*this);
02185   if (!rhs.isSimple())
02186     return EmitUnsupportedLValue(expr, "conditional operator");
02187   rhsBlock = Builder.GetInsertBlock();
02188 
02189   EmitBlock(contBlock);
02190 
02191   llvm::PHINode *phi = Builder.CreatePHI(lhs.getAddress()->getType(), 2,
02192                                          "cond-lvalue");
02193   phi->addIncoming(lhs.getAddress(), lhsBlock);
02194   phi->addIncoming(rhs.getAddress(), rhsBlock);
02195   return MakeAddrLValue(phi, expr->getType());
02196 }
02197 
02198 /// EmitCastLValue - Casts are never lvalues unless that cast is to a reference
02199 /// type. If the cast is to a reference, we can have the usual lvalue result,
02200 /// otherwise if a cast is needed by the code generator in an lvalue context,
02201 /// then it must mean that we need the address of an aggregate in order to
02202 /// access one of its members.  This can happen for all the reasons that casts
02203 /// are permitted with aggregate result, including noop aggregate casts, and
02204 /// cast from scalar to union.
02205 LValue CodeGenFunction::EmitCastLValue(const CastExpr *E) {
02206   switch (E->getCastKind()) {
02207   case CK_ToVoid:
02208     return EmitUnsupportedLValue(E, "unexpected cast lvalue");
02209 
02210   case CK_Dependent:
02211     llvm_unreachable("dependent cast kind in IR gen!");
02212  
02213   // These two casts are currently treated as no-ops, although they could
02214   // potentially be real operations depending on the target's ABI.
02215   case CK_NonAtomicToAtomic:
02216   case CK_AtomicToNonAtomic:
02217 
02218   case CK_NoOp:
02219   case CK_LValueToRValue:
02220     if (!E->getSubExpr()->Classify(getContext()).isPRValue() 
02221         || E->getType()->isRecordType())
02222       return EmitLValue(E->getSubExpr());
02223     // Fall through to synthesize a temporary.
02224 
02225   case CK_BitCast:
02226   case CK_ArrayToPointerDecay:
02227   case CK_FunctionToPointerDecay:
02228   case CK_NullToMemberPointer:
02229   case CK_NullToPointer:
02230   case CK_IntegralToPointer:
02231   case CK_PointerToIntegral:
02232   case CK_PointerToBoolean:
02233   case CK_VectorSplat:
02234   case CK_IntegralCast:
02235   case CK_IntegralToBoolean:
02236   case CK_IntegralToFloating:
02237   case CK_FloatingToIntegral:
02238   case CK_FloatingToBoolean:
02239   case CK_FloatingCast:
02240   case CK_FloatingRealToComplex:
02241   case CK_FloatingComplexToReal:
02242   case CK_FloatingComplexToBoolean:
02243   case CK_FloatingComplexCast:
02244   case CK_FloatingComplexToIntegralComplex:
02245   case CK_IntegralRealToComplex:
02246   case CK_IntegralComplexToReal:
02247   case CK_IntegralComplexToBoolean:
02248   case CK_IntegralComplexCast:
02249   case CK_IntegralComplexToFloatingComplex:
02250   case CK_DerivedToBaseMemberPointer:
02251   case CK_BaseToDerivedMemberPointer:
02252   case CK_MemberPointerToBoolean:
02253   case CK_ReinterpretMemberPointer:
02254   case CK_AnyPointerToBlockPointerCast:
02255   case CK_ARCProduceObject:
02256   case CK_ARCConsumeObject:
02257   case CK_ARCReclaimReturnedObject:
02258   case CK_ARCExtendBlockObject: 
02259   case CK_CopyAndAutoreleaseBlockObject: {
02260     // These casts only produce lvalues when we're binding a reference to a 
02261     // temporary realized from a (converted) pure rvalue. Emit the expression
02262     // as a value, copy it into a temporary, and return an lvalue referring to
02263     // that temporary.
02264     llvm::Value *V = CreateMemTemp(E->getType(), "ref.temp");
02265     EmitAnyExprToMem(E, V, E->getType().getQualifiers(), false);
02266     return MakeAddrLValue(V, E->getType());
02267   }
02268 
02269   case CK_Dynamic: {
02270     LValue LV = EmitLValue(E->getSubExpr());
02271     llvm::Value *V = LV.getAddress();
02272     const CXXDynamicCastExpr *DCE = cast<CXXDynamicCastExpr>(E);
02273     return MakeAddrLValue(EmitDynamicCast(V, DCE), E->getType());
02274   }
02275 
02276   case CK_ConstructorConversion:
02277   case CK_UserDefinedConversion:
02278   case CK_CPointerToObjCPointerCast:
02279   case CK_BlockPointerToObjCPointerCast:
02280     return EmitLValue(E->getSubExpr());
02281   
02282   case CK_UncheckedDerivedToBase:
02283   case CK_DerivedToBase: {
02284     const RecordType *DerivedClassTy = 
02285       E->getSubExpr()->getType()->getAs<RecordType>();
02286     CXXRecordDecl *DerivedClassDecl = 
02287       cast<CXXRecordDecl>(DerivedClassTy->getDecl());
02288     
02289     LValue LV = EmitLValue(E->getSubExpr());
02290     llvm::Value *This = LV.getAddress();
02291     
02292     // Perform the derived-to-base conversion
02293     llvm::Value *Base = 
02294       GetAddressOfBaseClass(This, DerivedClassDecl, 
02295                             E->path_begin(), E->path_end(),
02296                             /*NullCheckValue=*/false);
02297     
02298     return MakeAddrLValue(Base, E->getType());
02299   }
02300   case CK_ToUnion:
02301     return EmitAggExprToLValue(E);
02302   case CK_BaseToDerived: {
02303     const RecordType *DerivedClassTy = E->getType()->getAs<RecordType>();
02304     CXXRecordDecl *DerivedClassDecl = 
02305       cast<CXXRecordDecl>(DerivedClassTy->getDecl());
02306     
02307     LValue LV = EmitLValue(E->getSubExpr());
02308     
02309     // Perform the base-to-derived conversion
02310     llvm::Value *Derived = 
02311       GetAddressOfDerivedClass(LV.getAddress(), DerivedClassDecl, 
02312                                E->path_begin(), E->path_end(),
02313                                /*NullCheckValue=*/false);
02314     
02315     return MakeAddrLValue(Derived, E->getType());
02316   }
02317   case CK_LValueBitCast: {
02318     // This must be a reinterpret_cast (or c-style equivalent).
02319     const ExplicitCastExpr *CE = cast<ExplicitCastExpr>(E);
02320     
02321     LValue LV = EmitLValue(E->getSubExpr());
02322     llvm::Value *V = Builder.CreateBitCast(LV.getAddress(),
02323                                            ConvertType(CE->getTypeAsWritten()));
02324     return MakeAddrLValue(V, E->getType());
02325   }
02326   case CK_ObjCObjectLValueCast: {
02327     LValue LV = EmitLValue(E->getSubExpr());
02328     QualType ToType = getContext().getLValueReferenceType(E->getType());
02329     llvm::Value *V = Builder.CreateBitCast(LV.getAddress(), 
02330                                            ConvertType(ToType));
02331     return MakeAddrLValue(V, E->getType());
02332   }
02333   }
02334   
02335   llvm_unreachable("Unhandled lvalue cast kind?");
02336 }
02337 
02338 LValue CodeGenFunction::EmitNullInitializationLValue(
02339                                               const CXXScalarValueInitExpr *E) {
02340   QualType Ty = E->getType();
02341   LValue LV = MakeAddrLValue(CreateMemTemp(Ty), Ty);
02342   EmitNullInitialization(LV.getAddress(), Ty);
02343   return LV;
02344 }
02345 
02346 LValue CodeGenFunction::EmitOpaqueValueLValue(const OpaqueValueExpr *e) {
02347   assert(OpaqueValueMappingData::shouldBindAsLValue(e));
02348   return getOpaqueLValueMapping(e);
02349 }
02350 
02351 LValue CodeGenFunction::EmitMaterializeTemporaryExpr(
02352                                            const MaterializeTemporaryExpr *E) {
02353   RValue RV = EmitReferenceBindingToExpr(E, /*InitializedDecl=*/0);
02354   return MakeAddrLValue(RV.getScalarVal(), E->getType());
02355 }
02356 
02357 RValue CodeGenFunction::EmitRValueForField(LValue LV,
02358                                            const FieldDecl *FD) {
02359   QualType FT = FD->getType();
02360   LValue FieldLV = EmitLValueForField(LV, FD);
02361   if (FT->isAnyComplexType())
02362     return RValue::getComplex(
02363         LoadComplexFromAddr(FieldLV.getAddress(),
02364                             FieldLV.isVolatileQualified()));
02365   else if (CodeGenFunction::hasAggregateLLVMType(FT))
02366     return FieldLV.asAggregateRValue();
02367 
02368   return EmitLoadOfLValue(FieldLV);
02369 }
02370 
02371 //===--------------------------------------------------------------------===//
02372 //                             Expression Emission
02373 //===--------------------------------------------------------------------===//
02374 
02375 RValue CodeGenFunction::EmitCallExpr(const CallExpr *E, 
02376                                      ReturnValueSlot ReturnValue) {
02377   if (CGDebugInfo *DI = getDebugInfo())
02378     DI->EmitLocation(Builder, E->getLocStart());
02379 
02380   // Builtins never have block type.
02381   if (E->getCallee()->getType()->isBlockPointerType())
02382     return EmitBlockCallExpr(E, ReturnValue);
02383 
02384   if (const CXXMemberCallExpr *CE = dyn_cast<CXXMemberCallExpr>(E))
02385     return EmitCXXMemberCallExpr(CE, ReturnValue);
02386 
02387   if (const CUDAKernelCallExpr *CE = dyn_cast<CUDAKernelCallExpr>(E))
02388     return EmitCUDAKernelCallExpr(CE, ReturnValue);
02389 
02390   const Decl *TargetDecl = E->getCalleeDecl();
02391   if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl)) {
02392     if (unsigned builtinID = FD->getBuiltinID())
02393       return EmitBuiltinExpr(FD, builtinID, E);
02394   }
02395 
02396   if (const CXXOperatorCallExpr *CE = dyn_cast<CXXOperatorCallExpr>(E))
02397     if (const CXXMethodDecl *MD = dyn_cast_or_null<CXXMethodDecl>(TargetDecl))
02398       return EmitCXXOperatorMemberCallExpr(CE, MD, ReturnValue);
02399 
02400   if (const CXXPseudoDestructorExpr *PseudoDtor 
02401           = dyn_cast<CXXPseudoDestructorExpr>(E->getCallee()->IgnoreParens())) {
02402     QualType DestroyedType = PseudoDtor->getDestroyedType();
02403     if (getContext().getLangOpts().ObjCAutoRefCount &&
02404         DestroyedType->isObjCLifetimeType() &&
02405         (DestroyedType.getObjCLifetime() == Qualifiers::OCL_Strong ||
02406          DestroyedType.getObjCLifetime() == Qualifiers::OCL_Weak)) {
02407       // Automatic Reference Counting:
02408       //   If the pseudo-expression names a retainable object with weak or
02409       //   strong lifetime, the object shall be released.
02410       Expr *BaseExpr = PseudoDtor->getBase();
02411       llvm::Value *BaseValue = NULL;
02412       Qualifiers BaseQuals;
02413       
02414       // If this is s.x, emit s as an lvalue. If it is s->x, emit s as a scalar.
02415       if (PseudoDtor->isArrow()) {
02416         BaseValue = EmitScalarExpr(BaseExpr);
02417         const PointerType *PTy = BaseExpr->getType()->getAs<PointerType>();
02418         BaseQuals = PTy->getPointeeType().getQualifiers();
02419       } else {
02420         LValue BaseLV = EmitLValue(BaseExpr);
02421         BaseValue = BaseLV.getAddress();
02422         QualType BaseTy = BaseExpr->getType();
02423         BaseQuals = BaseTy.getQualifiers();
02424       }
02425           
02426       switch (PseudoDtor->getDestroyedType().getObjCLifetime()) {
02427       case Qualifiers::OCL_None:
02428       case Qualifiers::OCL_ExplicitNone:
02429       case Qualifiers::OCL_Autoreleasing:
02430         break;
02431         
02432       case Qualifiers::OCL_Strong:
02433         EmitARCRelease(Builder.CreateLoad(BaseValue, 
02434                           PseudoDtor->getDestroyedType().isVolatileQualified()),
02435                        /*precise*/ true);
02436         break;
02437 
02438       case Qualifiers::OCL_Weak:
02439         EmitARCDestroyWeak(BaseValue);
02440         break;
02441       }
02442     } else {
02443       // C++ [expr.pseudo]p1:
02444       //   The result shall only be used as the operand for the function call
02445       //   operator (), and the result of such a call has type void. The only
02446       //   effect is the evaluation of the postfix-expression before the dot or
02447       //   arrow.      
02448       EmitScalarExpr(E->getCallee());
02449     }
02450     
02451     return RValue::get(0);
02452   }
02453 
02454   llvm::Value *Callee = EmitScalarExpr(E->getCallee());
02455   return EmitCall(E->getCallee()->getType(), Callee, ReturnValue,
02456                   E->arg_begin(), E->arg_end(), TargetDecl);
02457 }
02458 
02459 LValue CodeGenFunction::EmitBinaryOperatorLValue(const BinaryOperator *E) {
02460   // Comma expressions just emit their LHS then their RHS as an l-value.
02461   if (E->getOpcode() == BO_Comma) {
02462     EmitIgnoredExpr(E->getLHS());
02463     EnsureInsertPoint();
02464     return EmitLValue(E->getRHS());
02465   }
02466 
02467   if (E->getOpcode() == BO_PtrMemD ||
02468       E->getOpcode() == BO_PtrMemI)
02469     return EmitPointerToDataMemberBinaryExpr(E);
02470 
02471   assert(E->getOpcode() == BO_Assign && "unexpected binary l-value");
02472 
02473   // Note that in all of these cases, __block variables need the RHS
02474   // evaluated first just in case the variable gets moved by the RHS.
02475   
02476   if (!hasAggregateLLVMType(E->getType())) {
02477     switch (E->getLHS()->getType().getObjCLifetime()) {
02478     case Qualifiers::OCL_Strong:
02479       return EmitARCStoreStrong(E, /*ignored*/ false).first;
02480 
02481     case Qualifiers::OCL_Autoreleasing:
02482       return EmitARCStoreAutoreleasing(E).first;
02483 
02484     // No reason to do any of these differently.
02485     case Qualifiers::OCL_None:
02486     case Qualifiers::OCL_ExplicitNone:
02487     case Qualifiers::OCL_Weak:
02488       break;
02489     }
02490 
02491     RValue RV = EmitAnyExpr(E->getRHS());
02492     LValue LV = EmitLValue(E->getLHS());
02493     EmitStoreThroughLValue(RV, LV);
02494     return LV;
02495   }
02496 
02497   if (E->getType()->isAnyComplexType())
02498     return EmitComplexAssignmentLValue(E);
02499 
02500   return EmitAggExprToLValue(E);
02501 }
02502 
02503 LValue CodeGenFunction::EmitCallExprLValue(const CallExpr *E) {
02504   RValue RV = EmitCallExpr(E);
02505 
02506   if (!RV.isScalar())
02507     return MakeAddrLValue(RV.getAggregateAddr(), E->getType());
02508     
02509   assert(E->getCallReturnType()->isReferenceType() &&
02510          "Can't have a scalar return unless the return type is a "
02511          "reference type!");
02512 
02513   return MakeAddrLValue(RV.getScalarVal(), E->getType());
02514 }
02515 
02516 LValue CodeGenFunction::EmitVAArgExprLValue(const VAArgExpr *E) {
02517   // FIXME: This shouldn't require another copy.
02518   return EmitAggExprToLValue(E);
02519 }
02520 
02521 LValue CodeGenFunction::EmitCXXConstructLValue(const CXXConstructExpr *E) {
02522   assert(E->getType()->getAsCXXRecordDecl()->hasTrivialDestructor()
02523          && "binding l-value to type which needs a temporary");
02524   AggValueSlot Slot = CreateAggTemp(E->getType());
02525   EmitCXXConstructExpr(E, Slot);
02526   return MakeAddrLValue(Slot.getAddr(), E->getType());
02527 }
02528 
02529 LValue
02530 CodeGenFunction::EmitCXXTypeidLValue(const CXXTypeidExpr *E) {
02531   return MakeAddrLValue(EmitCXXTypeidExpr(E), E->getType());
02532 }
02533 
02534 LValue
02535 CodeGenFunction::EmitCXXBindTemporaryLValue(const CXXBindTemporaryExpr *E) {
02536   AggValueSlot Slot = CreateAggTemp(E->getType(), "temp.lvalue");
02537   Slot.setExternallyDestructed();
02538   EmitAggExpr(E->getSubExpr(), Slot);
02539   EmitCXXTemporary(E->getTemporary(), E->getType(), Slot.getAddr());
02540   return MakeAddrLValue(Slot.getAddr(), E->getType());
02541 }
02542 
02543 LValue
02544 CodeGenFunction::EmitLambdaLValue(const LambdaExpr *E) {
02545   AggValueSlot Slot = CreateAggTemp(E->getType(), "temp.lvalue");
02546   EmitLambdaExpr(E, Slot);
02547   return MakeAddrLValue(Slot.getAddr(), E->getType());
02548 }
02549 
02550 LValue CodeGenFunction::EmitObjCMessageExprLValue(const ObjCMessageExpr *E) {
02551   RValue RV = EmitObjCMessageExpr(E);
02552   
02553   if (!RV.isScalar())
02554     return MakeAddrLValue(RV.getAggregateAddr(), E->getType());
02555   
02556   assert(E->getMethodDecl()->getResultType()->isReferenceType() &&
02557          "Can't have a scalar return unless the return type is a "
02558          "reference type!");
02559   
02560   return MakeAddrLValue(RV.getScalarVal(), E->getType());
02561 }
02562 
02563 LValue CodeGenFunction::EmitObjCSelectorLValue(const ObjCSelectorExpr *E) {
02564   llvm::Value *V = 
02565     CGM.getObjCRuntime().GetSelector(Builder, E->getSelector(), true);
02566   return MakeAddrLValue(V, E->getType());
02567 }
02568 
02569 llvm::Value *CodeGenFunction::EmitIvarOffset(const ObjCInterfaceDecl *Interface,
02570                                              const ObjCIvarDecl *Ivar) {
02571   return CGM.getObjCRuntime().EmitIvarOffset(*this, Interface, Ivar);
02572 }
02573 
02574 LValue CodeGenFunction::EmitLValueForIvar(QualType ObjectTy,
02575                                           llvm::Value *BaseValue,
02576                                           const ObjCIvarDecl *Ivar,
02577                                           unsigned CVRQualifiers) {
02578   return CGM.getObjCRuntime().EmitObjCValueForIvar(*this, ObjectTy, BaseValue,
02579                                                    Ivar, CVRQualifiers);
02580 }
02581 
02582 LValue CodeGenFunction::EmitObjCIvarRefLValue(const ObjCIvarRefExpr *E) {
02583   // FIXME: A lot of the code below could be shared with EmitMemberExpr.
02584   llvm::Value *BaseValue = 0;
02585   const Expr *BaseExpr = E->getBase();
02586   Qualifiers BaseQuals;
02587   QualType ObjectTy;
02588   if (E->isArrow()) {
02589     BaseValue = EmitScalarExpr(BaseExpr);
02590     ObjectTy = BaseExpr->getType()->getPointeeType();
02591     BaseQuals = ObjectTy.getQualifiers();
02592   } else {
02593     LValue BaseLV = EmitLValue(BaseExpr);
02594     // FIXME: this isn't right for bitfields.
02595     BaseValue = BaseLV.getAddress();
02596     ObjectTy = BaseExpr->getType();
02597     BaseQuals = ObjectTy.getQualifiers();
02598   }
02599 
02600   LValue LV = 
02601     EmitLValueForIvar(ObjectTy, BaseValue, E->getDecl(),
02602                       BaseQuals.getCVRQualifiers());
02603   setObjCGCLValueClass(getContext(), E, LV);
02604   return LV;
02605 }
02606 
02607 LValue CodeGenFunction::EmitStmtExprLValue(const StmtExpr *E) {
02608   // Can only get l-value for message expression returning aggregate type
02609   RValue RV = EmitAnyExprToTemp(E);
02610   return MakeAddrLValue(RV.getAggregateAddr(), E->getType());
02611 }
02612 
02613 RValue CodeGenFunction::EmitCall(QualType CalleeType, llvm::Value *Callee,
02614                                  ReturnValueSlot ReturnValue,
02615                                  CallExpr::const_arg_iterator ArgBeg,
02616                                  CallExpr::const_arg_iterator ArgEnd,
02617                                  const Decl *TargetDecl) {
02618   // Get the actual function type. The callee type will always be a pointer to
02619   // function type or a block pointer type.
02620   assert(CalleeType->isFunctionPointerType() &&
02621          "Call must have function pointer type!");
02622 
02623   CalleeType = getContext().getCanonicalType(CalleeType);
02624 
02625   const FunctionType *FnType
02626     = cast<FunctionType>(cast<PointerType>(CalleeType)->getPointeeType());
02627 
02628   CallArgList Args;
02629   EmitCallArgs(Args, dyn_cast<FunctionProtoType>(FnType), ArgBeg, ArgEnd);
02630 
02631   const CGFunctionInfo &FnInfo =
02632     CGM.getTypes().arrangeFunctionCall(Args, FnType);
02633 
02634   // C99 6.5.2.2p6:
02635   //   If the expression that denotes the called function has a type
02636   //   that does not include a prototype, [the default argument
02637   //   promotions are performed]. If the number of arguments does not
02638   //   equal the number of parameters, the behavior is undefined. If
02639   //   the function is defined with a type that includes a prototype,
02640   //   and either the prototype ends with an ellipsis (, ...) or the
02641   //   types of the arguments after promotion are not compatible with
02642   //   the types of the parameters, the behavior is undefined. If the
02643   //   function is defined with a type that does not include a
02644   //   prototype, and the types of the arguments after promotion are
02645   //   not compatible with those of the parameters after promotion,
02646   //   the behavior is undefined [except in some trivial cases].
02647   // That is, in the general case, we should assume that a call
02648   // through an unprototyped function type works like a *non-variadic*
02649   // call.  The way we make this work is to cast to the exact type
02650   // of the promoted arguments.
02651   if (isa<FunctionNoProtoType>(FnType) && !FnInfo.isVariadic()) {
02652     llvm::Type *CalleeTy = getTypes().GetFunctionType(FnInfo);
02653     CalleeTy = CalleeTy->getPointerTo();
02654     Callee = Builder.CreateBitCast(Callee, CalleeTy, "callee.knr.cast");
02655   }
02656 
02657   return EmitCall(FnInfo, Callee, ReturnValue, Args, TargetDecl);
02658 }
02659 
02660 LValue CodeGenFunction::
02661 EmitPointerToDataMemberBinaryExpr(const BinaryOperator *E) {
02662   llvm::Value *BaseV;
02663   if (E->getOpcode() == BO_PtrMemI)
02664     BaseV = EmitScalarExpr(E->getLHS());
02665   else
02666     BaseV = EmitLValue(E->getLHS()).getAddress();
02667 
02668   llvm::Value *OffsetV = EmitScalarExpr(E->getRHS());
02669 
02670   const MemberPointerType *MPT
02671     = E->getRHS()->getType()->getAs<MemberPointerType>();
02672 
02673   llvm::Value *AddV =
02674     CGM.getCXXABI().EmitMemberDataPointerAddress(*this, BaseV, OffsetV, MPT);
02675 
02676   return MakeAddrLValue(AddV, MPT->getPointeeType());
02677 }
02678 
02679 static void
02680 EmitAtomicOp(CodeGenFunction &CGF, AtomicExpr *E, llvm::Value *Dest,
02681              llvm::Value *Ptr, llvm::Value *Val1, llvm::Value *Val2,
02682              uint64_t Size, unsigned Align, llvm::AtomicOrdering Order) {
02683   llvm::AtomicRMWInst::BinOp Op = llvm::AtomicRMWInst::Add;
02684   llvm::Instruction::BinaryOps PostOp = (llvm::Instruction::BinaryOps)0;
02685 
02686   switch (E->getOp()) {
02687   case AtomicExpr::AO__c11_atomic_init:
02688     llvm_unreachable("Already handled!");
02689 
02690   case AtomicExpr::AO__c11_atomic_compare_exchange_strong:
02691   case AtomicExpr::AO__c11_atomic_compare_exchange_weak:
02692   case AtomicExpr::AO__atomic_compare_exchange:
02693   case AtomicExpr::AO__atomic_compare_exchange_n: {
02694     // Note that cmpxchg only supports specifying one ordering and
02695     // doesn't support weak cmpxchg, at least at the moment.
02696     llvm::LoadInst *LoadVal1 = CGF.Builder.CreateLoad(Val1);
02697     LoadVal1->setAlignment(Align);
02698     llvm::LoadInst *LoadVal2 = CGF.Builder.CreateLoad(Val2);
02699     LoadVal2->setAlignment(Align);
02700     llvm::AtomicCmpXchgInst *CXI =
02701         CGF.Builder.CreateAtomicCmpXchg(Ptr, LoadVal1, LoadVal2, Order);
02702     CXI->setVolatile(E->isVolatile());
02703     llvm::StoreInst *StoreVal1 = CGF.Builder.CreateStore(CXI, Val1);
02704     StoreVal1->setAlignment(Align);
02705     llvm::Value *Cmp = CGF.Builder.CreateICmpEQ(CXI, LoadVal1);
02706     CGF.EmitStoreOfScalar(Cmp, CGF.MakeAddrLValue(Dest, E->getType()));
02707     return;
02708   }
02709 
02710   case AtomicExpr::AO__c11_atomic_load:
02711   case AtomicExpr::AO__atomic_load_n:
02712   case AtomicExpr::AO__atomic_load: {
02713     llvm::LoadInst *Load = CGF.Builder.CreateLoad(Ptr);
02714     Load->setAtomic(Order);
02715     Load->setAlignment(Size);
02716     Load->setVolatile(E->isVolatile());
02717     llvm::StoreInst *StoreDest = CGF.Builder.CreateStore(Load, Dest);
02718     StoreDest->setAlignment(Align);
02719     return;
02720   }
02721 
02722   case AtomicExpr::AO__c11_atomic_store:
02723   case AtomicExpr::AO__atomic_store:
02724   case AtomicExpr::AO__atomic_store_n: {
02725     assert(!Dest && "Store does not return a value");
02726     llvm::LoadInst *LoadVal1 = CGF.Builder.CreateLoad(Val1);
02727     LoadVal1->setAlignment(Align);
02728     llvm::StoreInst *Store = CGF.Builder.CreateStore(LoadVal1, Ptr);
02729     Store->setAtomic(Order);
02730     Store->setAlignment(Size);
02731     Store->setVolatile(E->isVolatile());
02732     return;
02733   }
02734 
02735   case AtomicExpr::AO__c11_atomic_exchange:
02736   case AtomicExpr::AO__atomic_exchange_n:
02737   case AtomicExpr::AO__atomic_exchange:
02738     Op = llvm::AtomicRMWInst::Xchg;
02739     break;
02740 
02741   case AtomicExpr::AO__atomic_add_fetch:
02742     PostOp = llvm::Instruction::Add;
02743     // Fall through.
02744   case AtomicExpr::AO__c11_atomic_fetch_add:
02745   case AtomicExpr::AO__atomic_fetch_add:
02746     Op = llvm::AtomicRMWInst::Add;
02747     break;
02748 
02749   case AtomicExpr::AO__atomic_sub_fetch:
02750     PostOp = llvm::Instruction::Sub;
02751     // Fall through.
02752   case AtomicExpr::AO__c11_atomic_fetch_sub:
02753   case AtomicExpr::AO__atomic_fetch_sub:
02754     Op = llvm::AtomicRMWInst::Sub;
02755     break;
02756 
02757   case AtomicExpr::AO__atomic_and_fetch:
02758     PostOp = llvm::Instruction::And;
02759     // Fall through.
02760   case AtomicExpr::AO__c11_atomic_fetch_and:
02761   case AtomicExpr::AO__atomic_fetch_and:
02762     Op = llvm::AtomicRMWInst::And;
02763     break;
02764 
02765   case AtomicExpr::AO__atomic_or_fetch:
02766     PostOp = llvm::Instruction::Or;
02767     // Fall through.
02768   case AtomicExpr::AO__c11_atomic_fetch_or:
02769   case AtomicExpr::AO__atomic_fetch_or:
02770     Op = llvm::AtomicRMWInst::Or;
02771     break;
02772 
02773   case AtomicExpr::AO__atomic_xor_fetch:
02774     PostOp = llvm::Instruction::Xor;
02775     // Fall through.
02776   case AtomicExpr::AO__c11_atomic_fetch_xor:
02777   case AtomicExpr::AO__atomic_fetch_xor:
02778     Op = llvm::AtomicRMWInst::Xor;
02779     break;
02780 
02781   case AtomicExpr::AO__atomic_nand_fetch:
02782     PostOp = llvm::Instruction::And;
02783     // Fall through.
02784   case AtomicExpr::AO__atomic_fetch_nand:
02785     Op = llvm::AtomicRMWInst::Nand;
02786     break;
02787   }
02788 
02789   llvm::LoadInst *LoadVal1 = CGF.Builder.CreateLoad(Val1);
02790   LoadVal1->setAlignment(Align);
02791   llvm::AtomicRMWInst *RMWI =
02792       CGF.Builder.CreateAtomicRMW(Op, Ptr, LoadVal1, Order);
02793   RMWI->setVolatile(E->isVolatile());
02794 
02795   // For __atomic_*_fetch operations, perform the operation again to
02796   // determine the value which was written.
02797   llvm::Value *Result = RMWI;
02798   if (PostOp)
02799     Result = CGF.Builder.CreateBinOp(PostOp, RMWI, LoadVal1);
02800   if (E->getOp() == AtomicExpr::AO__atomic_nand_fetch)
02801     Result = CGF.Builder.CreateNot(Result);
02802   llvm::StoreInst *StoreDest = CGF.Builder.CreateStore(Result, Dest);
02803   StoreDest->setAlignment(Align);
02804 }
02805 
02806 // This function emits any expression (scalar, complex, or aggregate)
02807 // into a temporary alloca.
02808 static llvm::Value *
02809 EmitValToTemp(CodeGenFunction &CGF, Expr *E) {
02810   llvm::Value *DeclPtr = CGF.CreateMemTemp(E->getType(), ".atomictmp");
02811   CGF.EmitAnyExprToMem(E, DeclPtr, E->getType().getQualifiers(),
02812                        /*Init*/ true);
02813   return DeclPtr;
02814 }
02815 
02816 static RValue ConvertTempToRValue(CodeGenFunction &CGF, QualType Ty,
02817                                   llvm::Value *Dest) {
02818   if (Ty->isAnyComplexType())
02819     return RValue::getComplex(CGF.LoadComplexFromAddr(Dest, false));
02820   if (CGF.hasAggregateLLVMType(Ty))
02821     return RValue::getAggregate(Dest);
02822   return RValue::get(CGF.EmitLoadOfScalar(CGF.MakeAddrLValue(Dest, Ty)));
02823 }
02824 
02825 RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E, llvm::Value *Dest) {
02826   QualType AtomicTy = E->getPtr()->getType()->getPointeeType();
02827   QualType MemTy = AtomicTy;
02828   if (const AtomicType *AT = AtomicTy->getAs<AtomicType>())
02829     MemTy = AT->getValueType();
02830   CharUnits sizeChars = getContext().getTypeSizeInChars(AtomicTy);
02831   uint64_t Size = sizeChars.getQuantity();
02832   CharUnits alignChars = getContext().getTypeAlignInChars(AtomicTy);
02833   unsigned Align = alignChars.getQuantity();
02834   unsigned MaxInlineWidth =
02835       getContext().getTargetInfo().getMaxAtomicInlineWidth();
02836   bool UseLibcall = (Size != Align || Size > MaxInlineWidth);
02837 
02838 
02839 
02840   llvm::Value *Ptr, *Order, *OrderFail = 0, *Val1 = 0, *Val2 = 0;
02841   Ptr = EmitScalarExpr(E->getPtr());
02842 
02843   if (E->getOp() == AtomicExpr::AO__c11_atomic_init) {
02844     assert(!Dest && "Init does not return a value");
02845     if (!hasAggregateLLVMType(E->getVal1()->getType())) {
02846       QualType PointeeType
02847         = E->getPtr()->getType()->getAs<PointerType>()->getPointeeType();
02848       EmitScalarInit(EmitScalarExpr(E->getVal1()),
02849                      LValue::MakeAddr(Ptr, PointeeType, alignChars,
02850                                       getContext()));
02851     } else if (E->getType()->isAnyComplexType()) {
02852       EmitComplexExprIntoAddr(E->getVal1(), Ptr, E->isVolatile());
02853     } else {
02854       AggValueSlot Slot = AggValueSlot::forAddr(Ptr, alignChars,
02855                                         AtomicTy.getQualifiers(),
02856                                         AggValueSlot::IsNotDestructed,
02857                                         AggValueSlot::DoesNotNeedGCBarriers,
02858                                         AggValueSlot::IsNotAliased);
02859       EmitAggExpr(E->getVal1(), Slot);
02860     }
02861     return RValue::get(0);
02862   }
02863 
02864   Order = EmitScalarExpr(E->getOrder());
02865 
02866   switch (E->getOp()) {
02867   case AtomicExpr::AO__c11_atomic_init:
02868     llvm_unreachable("Already handled!");
02869 
02870   case AtomicExpr::AO__c11_atomic_load:
02871   case AtomicExpr::AO__atomic_load_n:
02872     break;
02873 
02874   case AtomicExpr::AO__atomic_load:
02875     Dest = EmitScalarExpr(E->getVal1());
02876     break;
02877 
02878   case AtomicExpr::AO__atomic_store:
02879     Val1 = EmitScalarExpr(E->getVal1());
02880     break;
02881 
02882   case AtomicExpr::AO__atomic_exchange:
02883     Val1 = EmitScalarExpr(E->getVal1());
02884     Dest = EmitScalarExpr(E->getVal2());
02885     break;
02886 
02887   case AtomicExpr::AO__c11_atomic_compare_exchange_strong:
02888   case AtomicExpr::AO__c11_atomic_compare_exchange_weak:
02889   case AtomicExpr::AO__atomic_compare_exchange_n:
02890   case AtomicExpr::AO__atomic_compare_exchange:
02891     Val1 = EmitScalarExpr(E->getVal1());
02892     if (E->getOp() == AtomicExpr::AO__atomic_compare_exchange)
02893       Val2 = EmitScalarExpr(E->getVal2());
02894     else
02895       Val2 = EmitValToTemp(*this, E->getVal2());
02896     OrderFail = EmitScalarExpr(E->getOrderFail());
02897     // Evaluate and discard the 'weak' argument.
02898     if (E->getNumSubExprs() == 6)
02899       EmitScalarExpr(E->getWeak());
02900     break;
02901 
02902   case AtomicExpr::AO__c11_atomic_fetch_add:
02903   case AtomicExpr::AO__c11_atomic_fetch_sub:
02904     if (MemTy->isPointerType()) {
02905       // For pointer arithmetic, we're required to do a bit of math:
02906       // adding 1 to an int* is not the same as adding 1 to a uintptr_t.
02907       // ... but only for the C11 builtins. The GNU builtins expect the
02908       // user to multiply by sizeof(T).
02909       QualType Val1Ty = E->getVal1()->getType();
02910       llvm::Value *Val1Scalar = EmitScalarExpr(E->getVal1());
02911       CharUnits PointeeIncAmt =
02912           getContext().getTypeSizeInChars(MemTy->getPointeeType());
02913       Val1Scalar = Builder.CreateMul(Val1Scalar, CGM.getSize(PointeeIncAmt));
02914       Val1 = CreateMemTemp(Val1Ty, ".atomictmp");
02915       EmitStoreOfScalar(Val1Scalar, MakeAddrLValue(Val1, Val1Ty));
02916       break;
02917     }
02918     // Fall through.
02919   case AtomicExpr::AO__atomic_fetch_add:
02920   case AtomicExpr::AO__atomic_fetch_sub:
02921   case AtomicExpr::AO__atomic_add_fetch:
02922   case AtomicExpr::AO__atomic_sub_fetch:
02923   case AtomicExpr::AO__c11_atomic_store:
02924   case AtomicExpr::AO__c11_atomic_exchange:
02925   case AtomicExpr::AO__atomic_store_n:
02926   case AtomicExpr::AO__atomic_exchange_n:
02927   case AtomicExpr::AO__c11_atomic_fetch_and:
02928   case AtomicExpr::AO__c11_atomic_fetch_or:
02929   case AtomicExpr::AO__c11_atomic_fetch_xor:
02930   case AtomicExpr::AO__atomic_fetch_and:
02931   case AtomicExpr::AO__atomic_fetch_or:
02932   case AtomicExpr::AO__atomic_fetch_xor:
02933   case AtomicExpr::AO__atomic_fetch_nand:
02934   case AtomicExpr::AO__atomic_and_fetch:
02935   case AtomicExpr::AO__atomic_or_fetch:
02936   case AtomicExpr::AO__atomic_xor_fetch:
02937   case AtomicExpr::AO__atomic_nand_fetch:
02938     Val1 = EmitValToTemp(*this, E->getVal1());
02939     break;
02940   }
02941 
02942   if (!E->getType()->isVoidType() && !Dest)
02943     Dest = CreateMemTemp(E->getType(), ".atomicdst");
02944 
02945   // Use a library call.  See: http://gcc.gnu.org/wiki/Atomic/GCCMM/LIbrary .
02946   if (UseLibcall) {
02947 
02948     llvm::SmallVector<QualType, 5> Params;
02949     CallArgList Args;
02950     // Size is always the first parameter
02951     Args.add(RValue::get(llvm::ConstantInt::get(SizeTy, Size)),
02952              getContext().getSizeType());
02953     // Atomic address is always the second parameter
02954     Args.add(RValue::get(EmitCastToVoidPtr(Ptr)),
02955              getContext().VoidPtrTy);
02956 
02957     const char* LibCallName;
02958     QualType RetTy = getContext().VoidTy;
02959     switch (E->getOp()) {
02960     // There is only one libcall for compare an exchange, because there is no
02961     // optimisation benefit possible from a libcall version of a weak compare
02962     // and exchange.
02963     // bool __atomic_compare_exchange(size_t size, void *obj, void *expected,
02964     //                                void *desired, int success, int failure)
02965     case AtomicExpr::AO__c11_atomic_compare_exchange_weak:
02966     case AtomicExpr::AO__c11_atomic_compare_exchange_strong:
02967     case AtomicExpr::AO__atomic_compare_exchange:
02968     case AtomicExpr::AO__atomic_compare_exchange_n:
02969       LibCallName = "__atomic_compare_exchange";
02970       RetTy = getContext().BoolTy;
02971       Args.add(RValue::get(EmitCastToVoidPtr(Val1)),
02972                getContext().VoidPtrTy);
02973       Args.add(RValue::get(EmitCastToVoidPtr(Val2)),
02974                getContext().VoidPtrTy);
02975       Args.add(RValue::get(Order),
02976                getContext().IntTy);
02977       Order = OrderFail;
02978       break;
02979     // void __atomic_exchange(size_t size, void *mem, void *val, void *return,
02980     //                        int order)
02981     case AtomicExpr::AO__c11_atomic_exchange:
02982     case AtomicExpr::AO__atomic_exchange_n:
02983     case AtomicExpr::AO__atomic_exchange:
02984       LibCallName = "__atomic_exchange";
02985       Args.add(RValue::get(EmitCastToVoidPtr(Val1)),
02986                getContext().VoidPtrTy);
02987       Args.add(RValue::get(EmitCastToVoidPtr(Dest)),
02988                getContext().VoidPtrTy);
02989       break;
02990     // void __atomic_store(size_t size, void *mem, void *val, int order)
02991     case AtomicExpr::AO__c11_atomic_store:
02992     case AtomicExpr::AO__atomic_store:
02993     case AtomicExpr::AO__atomic_store_n:
02994       LibCallName = "__atomic_store";
02995       Args.add(RValue::get(EmitCastToVoidPtr(Val1)),
02996                getContext().VoidPtrTy);
02997       break;
02998     // void __atomic_load(size_t size, void *mem, void *return, int order)
02999     case AtomicExpr::AO__c11_atomic_load:
03000     case AtomicExpr::AO__atomic_load:
03001     case AtomicExpr::AO__atomic_load_n:
03002       LibCallName = "__atomic_load";
03003       Args.add(RValue::get(EmitCastToVoidPtr(Dest)),
03004                getContext().VoidPtrTy);
03005       break;
03006 #if 0
03007     // These are only defined for 1-16 byte integers.  It is not clear what
03008     // their semantics would be on anything else...
03009     case AtomicExpr::Add:   LibCallName = "__atomic_fetch_add_generic"; break;
03010     case AtomicExpr::Sub:   LibCallName = "__atomic_fetch_sub_generic"; break;
03011     case AtomicExpr::And:   LibCallName = "__atomic_fetch_and_generic"; break;
03012     case AtomicExpr::Or:    LibCallName = "__atomic_fetch_or_generic"; break;
03013     case AtomicExpr::Xor:   LibCallName = "__atomic_fetch_xor_generic"; break;
03014 #endif
03015     default: return EmitUnsupportedRValue(E, "atomic library call");
03016     }
03017     // order is always the last parameter
03018     Args.add(RValue::get(Order),
03019              getContext().IntTy);
03020 
03021     const CGFunctionInfo &FuncInfo =
03022         CGM.getTypes().arrangeFunctionCall(RetTy, Args,
03023             FunctionType::ExtInfo(), RequiredArgs::All);
03024     llvm::FunctionType *FTy = CGM.getTypes().GetFunctionType(FuncInfo);
03025     llvm::Constant *Func = CGM.CreateRuntimeFunction(FTy, LibCallName);
03026     RValue Res = EmitCall(FuncInfo, Func, ReturnValueSlot(), Args);
03027     if (E->isCmpXChg())
03028       return Res;
03029     if (E->getType()->isVoidType())
03030       return RValue::get(0);
03031     return ConvertTempToRValue(*this, E->getType(), Dest);
03032   }
03033 
03034   llvm::Type *IPtrTy =
03035       llvm::IntegerType::get(getLLVMContext(), Size * 8)->getPointerTo();
03036   llvm::Value *OrigDest = Dest;
03037   Ptr = Builder.CreateBitCast(Ptr, IPtrTy);
03038   if (Val1) Val1 = Builder.CreateBitCast(Val1, IPtrTy);
03039   if (Val2) Val2 = Builder.CreateBitCast(Val2, IPtrTy);
03040   if (Dest && !E->isCmpXChg()) Dest = Builder.CreateBitCast(Dest, IPtrTy);
03041 
03042   if (isa<llvm::ConstantInt>(Order)) {
03043     int ord = cast<llvm::ConstantInt>(Order)->getZExtValue();
03044     switch (ord) {
03045     case 0:  // memory_order_relaxed
03046       EmitAtomicOp(*this, E, Dest, Ptr, Val1, Val2, Size, Align,
03047                    llvm::Monotonic);
03048       break;
03049     case 1:  // memory_order_consume
03050     case 2:  // memory_order_acquire
03051       EmitAtomicOp(*this, E, Dest, Ptr, Val1, Val2, Size, Align,
03052                    llvm::Acquire);
03053       break;
03054     case 3:  // memory_order_release
03055       EmitAtomicOp(*this, E, Dest, Ptr, Val1, Val2, Size, Align,
03056                    llvm::Release);
03057       break;
03058     case 4:  // memory_order_acq_rel
03059       EmitAtomicOp(*this, E, Dest, Ptr, Val1, Val2, Size, Align,
03060                    llvm::AcquireRelease);
03061       break;
03062     case 5:  // memory_order_seq_cst
03063       EmitAtomicOp(*this, E, Dest, Ptr, Val1, Val2, Size, Align,
03064                    llvm::SequentiallyConsistent);
03065       break;
03066     default: // invalid order
03067       // We should not ever get here normally, but it's hard to
03068       // enforce that in general.
03069       break;
03070     }
03071     if (E->getType()->isVoidType())
03072       return RValue::get(0);
03073     return ConvertTempToRValue(*this, E->getType(), OrigDest);
03074   }
03075 
03076   // Long case, when Order isn't obviously constant.
03077 
03078   bool IsStore = E->getOp() == AtomicExpr::AO__c11_atomic_store ||
03079                  E->getOp() == AtomicExpr::AO__atomic_store ||
03080                  E->getOp() == AtomicExpr::AO__atomic_store_n;
03081   bool IsLoad = E->getOp() == AtomicExpr::AO__c11_atomic_load ||
03082                 E->getOp() == AtomicExpr::AO__atomic_load ||
03083                 E->getOp() == AtomicExpr::AO__atomic_load_n;
03084 
03085   // Create all the relevant BB's
03086   llvm::BasicBlock *MonotonicBB = 0, *AcquireBB = 0, *ReleaseBB = 0,
03087                    *AcqRelBB = 0, *SeqCstBB = 0;
03088   MonotonicBB = createBasicBlock("monotonic", CurFn);
03089   if (!IsStore)
03090     AcquireBB = createBasicBlock("acquire", CurFn);
03091   if (!IsLoad)
03092     ReleaseBB = createBasicBlock("release", CurFn);
03093   if (!IsLoad && !IsStore)
03094     AcqRelBB = createBasicBlock("acqrel", CurFn);
03095   SeqCstBB = createBasicBlock("seqcst", CurFn);
03096   llvm::BasicBlock *ContBB = createBasicBlock("atomic.continue", CurFn);
03097 
03098   // Create the switch for the split
03099   // MonotonicBB is arbitrarily chosen as the default case; in practice, this
03100   // doesn't matter unless someone is crazy enough to use something that
03101   // doesn't fold to a constant for the ordering.
03102   Order = Builder.CreateIntCast(Order, Builder.getInt32Ty(), false);
03103   llvm::SwitchInst *SI = Builder.CreateSwitch(Order, MonotonicBB);
03104 
03105   // Emit all the different atomics
03106   Builder.SetInsertPoint(MonotonicBB);
03107   EmitAtomicOp(*this, E, Dest, Ptr, Val1, Val2, Size, Align,
03108                llvm::Monotonic);
03109   Builder.CreateBr(ContBB);
03110   if (!IsStore) {
03111     Builder.SetInsertPoint(AcquireBB);
03112     EmitAtomicOp(*this, E, Dest, Ptr, Val1, Val2, Size, Align,
03113                  llvm::Acquire);
03114     Builder.CreateBr(ContBB);
03115     SI->addCase(Builder.getInt32(1), AcquireBB);
03116     SI->addCase(Builder.getInt32(2), AcquireBB);
03117   }
03118   if (!IsLoad) {
03119     Builder.SetInsertPoint(ReleaseBB);
03120     EmitAtomicOp(*this, E, Dest, Ptr, Val1, Val2, Size, Align,
03121                  llvm::Release);
03122     Builder.CreateBr(ContBB);
03123     SI->addCase(Builder.getInt32(3), ReleaseBB);
03124   }
03125   if (!IsLoad && !IsStore) {
03126     Builder.SetInsertPoint(AcqRelBB);
03127     EmitAtomicOp(*this, E, Dest, Ptr, Val1, Val2, Size, Align,
03128                  llvm::AcquireRelease);
03129     Builder.CreateBr(ContBB);
03130     SI->addCase(Builder.getInt32(4), AcqRelBB);
03131   }
03132   Builder.SetInsertPoint(SeqCstBB);
03133   EmitAtomicOp(*this, E, Dest, Ptr, Val1, Val2, Size, Align,
03134                llvm::SequentiallyConsistent);
03135   Builder.CreateBr(ContBB);
03136   SI->addCase(Builder.getInt32(5), SeqCstBB);
03137 
03138   // Cleanup and return
03139   Builder.SetInsertPoint(ContBB);
03140   if (E->getType()->isVoidType())
03141     return RValue::get(0);
03142   return ConvertTempToRValue(*this, E->getType(), OrigDest);
03143 }
03144 
03145 void CodeGenFunction::SetFPAccuracy(llvm::Value *Val, float Accuracy) {
03146   assert(Val->getType()->isFPOrFPVectorTy());
03147   if (Accuracy == 0.0 || !isa<llvm::Instruction>(Val))
03148     return;
03149 
03150   llvm::MDBuilder MDHelper(getLLVMContext());
03151   llvm::MDNode *Node = MDHelper.createFPMath(Accuracy);
03152 
03153   cast<llvm::Instruction>(Val)->setMetadata(llvm::LLVMContext::MD_fpmath, Node);
03154 }
03155 
03156 namespace {
03157   struct LValueOrRValue {
03158     LValue LV;
03159     RValue RV;
03160   };
03161 }
03162 
03163 static LValueOrRValue emitPseudoObjectExpr(CodeGenFunction &CGF,
03164                                            const PseudoObjectExpr *E,
03165                                            bool forLValue,
03166                                            AggValueSlot slot) {
03167   llvm::SmallVector<CodeGenFunction::OpaqueValueMappingData, 4> opaques;
03168 
03169   // Find the result expression, if any.
03170   const Expr *resultExpr = E->getResultExpr();
03171   LValueOrRValue result;
03172 
03173   for (PseudoObjectExpr::const_semantics_iterator
03174          i = E->semantics_begin(), e = E->semantics_end(); i != e; ++i) {
03175     const Expr *semantic = *i;
03176 
03177     // If this semantic expression is an opaque value, bind it
03178     // to the result of its source expression.
03179     if (const OpaqueValueExpr *ov = dyn_cast<OpaqueValueExpr>(semantic)) {
03180 
03181       // If this is the result expression, we may need to evaluate
03182       // directly into the slot.
03183       typedef CodeGenFunction::OpaqueValueMappingData OVMA;
03184       OVMA opaqueData;
03185       if (ov == resultExpr && ov->isRValue() && !forLValue &&
03186           CodeGenFunction::hasAggregateLLVMType(ov->getType()) &&
03187           !ov->getType()->isAnyComplexType()) {
03188         CGF.EmitAggExpr(ov->getSourceExpr(), slot);
03189 
03190         LValue LV = CGF.MakeAddrLValue(slot.getAddr(), ov->getType());
03191         opaqueData = OVMA::bind(CGF, ov, LV);
03192         result.RV = slot.asRValue();
03193 
03194       // Otherwise, emit as normal.
03195       } else {
03196         opaqueData = OVMA::bind(CGF, ov, ov->getSourceExpr());
03197 
03198         // If this is the result, also evaluate the result now.
03199         if (ov == resultExpr) {
03200           if (forLValue)
03201             result.LV = CGF.EmitLValue(ov);
03202           else
03203             result.RV = CGF.EmitAnyExpr(ov, slot);
03204         }
03205       }
03206 
03207       opaques.push_back(opaqueData);
03208 
03209     // Otherwise, if the expression is the result, evaluate it
03210     // and remember the result.
03211     } else if (semantic == resultExpr) {
03212       if (forLValue)
03213         result.LV = CGF.EmitLValue(semantic);
03214       else
03215         result.RV = CGF.EmitAnyExpr(semantic, slot);
03216 
03217     // Otherwise, evaluate the expression in an ignored context.
03218     } else {
03219       CGF.EmitIgnoredExpr(semantic);
03220     }
03221   }
03222 
03223   // Unbind all the opaques now.
03224   for (unsigned i = 0, e = opaques.size(); i != e; ++i)
03225     opaques[i].unbind(CGF);
03226 
03227   return result;
03228 }
03229 
03230 RValue CodeGenFunction::EmitPseudoObjectRValue(const PseudoObjectExpr *E,
03231                                                AggValueSlot slot) {
03232   return emitPseudoObjectExpr(*this, E, false, slot).RV;
03233 }
03234 
03235 LValue CodeGenFunction::EmitPseudoObjectLValue(const PseudoObjectExpr *E) {
03236   return emitPseudoObjectExpr(*this, E, true, AggValueSlot::ignored()).LV;
03237 }