]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - lib/CodeGen/CGDecl.cpp
Update clang to r108428.
[FreeBSD/FreeBSD.git] / lib / CodeGen / CGDecl.cpp
1 //===--- CGDecl.cpp - Emit LLVM Code for declarations ---------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This contains code to emit Decl nodes as LLVM code.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "CGDebugInfo.h"
15 #include "CodeGenFunction.h"
16 #include "CodeGenModule.h"
17 #include "clang/AST/ASTContext.h"
18 #include "clang/AST/CharUnits.h"
19 #include "clang/AST/Decl.h"
20 #include "clang/AST/DeclObjC.h"
21 #include "clang/Basic/SourceManager.h"
22 #include "clang/Basic/TargetInfo.h"
23 #include "clang/Frontend/CodeGenOptions.h"
24 #include "llvm/GlobalVariable.h"
25 #include "llvm/Intrinsics.h"
26 #include "llvm/Target/TargetData.h"
27 #include "llvm/Type.h"
28 using namespace clang;
29 using namespace CodeGen;
30
31
32 void CodeGenFunction::EmitDecl(const Decl &D) {
33   switch (D.getKind()) {
34   case Decl::TranslationUnit:
35   case Decl::Namespace:
36   case Decl::UnresolvedUsingTypename:
37   case Decl::ClassTemplateSpecialization:
38   case Decl::ClassTemplatePartialSpecialization:
39   case Decl::TemplateTypeParm:
40   case Decl::UnresolvedUsingValue:
41   case Decl::NonTypeTemplateParm:
42   case Decl::CXXMethod:
43   case Decl::CXXConstructor:
44   case Decl::CXXDestructor:
45   case Decl::CXXConversion:
46   case Decl::Field:
47   case Decl::ObjCIvar:
48   case Decl::ObjCAtDefsField:      
49   case Decl::ParmVar:
50   case Decl::ImplicitParam:
51   case Decl::ClassTemplate:
52   case Decl::FunctionTemplate:
53   case Decl::TemplateTemplateParm:
54   case Decl::ObjCMethod:
55   case Decl::ObjCCategory:
56   case Decl::ObjCProtocol:
57   case Decl::ObjCInterface:
58   case Decl::ObjCCategoryImpl:
59   case Decl::ObjCImplementation:
60   case Decl::ObjCProperty:
61   case Decl::ObjCCompatibleAlias:
62   case Decl::AccessSpec:
63   case Decl::LinkageSpec:
64   case Decl::ObjCPropertyImpl:
65   case Decl::ObjCClass:
66   case Decl::ObjCForwardProtocol:
67   case Decl::FileScopeAsm:
68   case Decl::Friend:
69   case Decl::FriendTemplate:
70   case Decl::Block:
71     
72     assert(0 && "Declaration not should not be in declstmts!");
73   case Decl::Function:  // void X();
74   case Decl::Record:    // struct/union/class X;
75   case Decl::Enum:      // enum X;
76   case Decl::EnumConstant: // enum ? { X = ? }
77   case Decl::CXXRecord: // struct/union/class X; [C++]
78   case Decl::Using:          // using X; [C++]
79   case Decl::UsingShadow:
80   case Decl::UsingDirective: // using namespace X; [C++]
81   case Decl::NamespaceAlias:
82   case Decl::StaticAssert: // static_assert(X, ""); [C++0x]
83     // None of these decls require codegen support.
84     return;
85
86   case Decl::Var: {
87     const VarDecl &VD = cast<VarDecl>(D);
88     assert(VD.isBlockVarDecl() &&
89            "Should not see file-scope variables inside a function!");
90     return EmitBlockVarDecl(VD);
91   }
92
93   case Decl::Typedef: {   // typedef int X;
94     const TypedefDecl &TD = cast<TypedefDecl>(D);
95     QualType Ty = TD.getUnderlyingType();
96
97     if (Ty->isVariablyModifiedType())
98       EmitVLASize(Ty);
99   }
100   }
101 }
102
103 /// EmitBlockVarDecl - This method handles emission of any variable declaration
104 /// inside a function, including static vars etc.
105 void CodeGenFunction::EmitBlockVarDecl(const VarDecl &D) {
106   if (D.hasAttr<AsmLabelAttr>())
107     CGM.ErrorUnsupported(&D, "__asm__");
108
109   switch (D.getStorageClass()) {
110   case VarDecl::None:
111   case VarDecl::Auto:
112   case VarDecl::Register:
113     return EmitLocalBlockVarDecl(D);
114   case VarDecl::Static: {
115     llvm::GlobalValue::LinkageTypes Linkage = 
116       llvm::GlobalValue::InternalLinkage;
117
118     // If the function definition has some sort of weak linkage, its
119     // static variables should also be weak so that they get properly
120     // uniqued.  We can't do this in C, though, because there's no
121     // standard way to agree on which variables are the same (i.e.
122     // there's no mangling).
123     if (getContext().getLangOptions().CPlusPlus)
124       if (llvm::GlobalValue::isWeakForLinker(CurFn->getLinkage()))
125         Linkage = CurFn->getLinkage();
126     
127     return EmitStaticBlockVarDecl(D, Linkage);
128   }
129   case VarDecl::Extern:
130   case VarDecl::PrivateExtern:
131     // Don't emit it now, allow it to be emitted lazily on its first use.
132     return;
133   }
134
135   assert(0 && "Unknown storage class");
136 }
137
138 static std::string GetStaticDeclName(CodeGenFunction &CGF, const VarDecl &D,
139                                      const char *Separator) {
140   CodeGenModule &CGM = CGF.CGM;
141   if (CGF.getContext().getLangOptions().CPlusPlus) {
142     llvm::StringRef Name = CGM.getMangledName(&D);
143     return Name.str();
144   }
145   
146   std::string ContextName;
147   if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CGF.CurFuncDecl)) {
148     llvm::StringRef Name = CGM.getMangledName(FD);
149     ContextName = Name.str();
150   } else if (isa<ObjCMethodDecl>(CGF.CurFuncDecl))
151     ContextName = CGF.CurFn->getName();
152   else
153     // FIXME: What about in a block??
154     assert(0 && "Unknown context for block var decl");
155   
156   return ContextName + Separator + D.getNameAsString();
157 }
158
159 llvm::GlobalVariable *
160 CodeGenFunction::CreateStaticBlockVarDecl(const VarDecl &D,
161                                           const char *Separator,
162                                       llvm::GlobalValue::LinkageTypes Linkage) {
163   QualType Ty = D.getType();
164   assert(Ty->isConstantSizeType() && "VLAs can't be static");
165
166   std::string Name = GetStaticDeclName(*this, D, Separator);
167
168   const llvm::Type *LTy = CGM.getTypes().ConvertTypeForMem(Ty);
169   llvm::GlobalVariable *GV =
170     new llvm::GlobalVariable(CGM.getModule(), LTy,
171                              Ty.isConstant(getContext()), Linkage,
172                              CGM.EmitNullConstant(D.getType()), Name, 0,
173                              D.isThreadSpecified(), Ty.getAddressSpace());
174   GV->setAlignment(getContext().getDeclAlign(&D).getQuantity());
175   return GV;
176 }
177
178 /// AddInitializerToGlobalBlockVarDecl - Add the initializer for 'D' to the
179 /// global variable that has already been created for it.  If the initializer
180 /// has a different type than GV does, this may free GV and return a different
181 /// one.  Otherwise it just returns GV.
182 llvm::GlobalVariable *
183 CodeGenFunction::AddInitializerToGlobalBlockVarDecl(const VarDecl &D,
184                                                     llvm::GlobalVariable *GV) {
185   llvm::Constant *Init = CGM.EmitConstantExpr(D.getInit(), D.getType(), this);
186   
187   // If constant emission failed, then this should be a C++ static
188   // initializer.
189   if (!Init) {
190     if (!getContext().getLangOptions().CPlusPlus)
191       CGM.ErrorUnsupported(D.getInit(), "constant l-value expression");
192     else {
193       // Since we have a static initializer, this global variable can't 
194       // be constant.
195       GV->setConstant(false);
196       
197       EmitStaticCXXBlockVarDeclInit(D, GV);
198     }
199     return GV;
200   }
201   
202   // The initializer may differ in type from the global. Rewrite
203   // the global to match the initializer.  (We have to do this
204   // because some types, like unions, can't be completely represented
205   // in the LLVM type system.)
206   if (GV->getType() != Init->getType()) {
207     llvm::GlobalVariable *OldGV = GV;
208     
209     GV = new llvm::GlobalVariable(CGM.getModule(), Init->getType(),
210                                   OldGV->isConstant(),
211                                   OldGV->getLinkage(), Init, "",
212                                   0, D.isThreadSpecified(),
213                                   D.getType().getAddressSpace());
214     
215     // Steal the name of the old global
216     GV->takeName(OldGV);
217     
218     // Replace all uses of the old global with the new global
219     llvm::Constant *NewPtrForOldDecl =
220     llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
221     OldGV->replaceAllUsesWith(NewPtrForOldDecl);
222     
223     // Erase the old global, since it is no longer used.
224     OldGV->eraseFromParent();
225   }
226   
227   GV->setInitializer(Init);
228   return GV;
229 }
230
231 void CodeGenFunction::EmitStaticBlockVarDecl(const VarDecl &D,
232                                       llvm::GlobalValue::LinkageTypes Linkage) {
233   llvm::Value *&DMEntry = LocalDeclMap[&D];
234   assert(DMEntry == 0 && "Decl already exists in localdeclmap!");
235
236   llvm::GlobalVariable *GV = CreateStaticBlockVarDecl(D, ".", Linkage);
237
238   // Store into LocalDeclMap before generating initializer to handle
239   // circular references.
240   DMEntry = GV;
241
242   // We can't have a VLA here, but we can have a pointer to a VLA,
243   // even though that doesn't really make any sense.
244   // Make sure to evaluate VLA bounds now so that we have them for later.
245   if (D.getType()->isVariablyModifiedType())
246     EmitVLASize(D.getType());
247
248   // If this value has an initializer, emit it.
249   if (D.getInit())
250     GV = AddInitializerToGlobalBlockVarDecl(D, GV);
251
252   GV->setAlignment(getContext().getDeclAlign(&D).getQuantity());
253
254   // FIXME: Merge attribute handling.
255   if (const AnnotateAttr *AA = D.getAttr<AnnotateAttr>()) {
256     SourceManager &SM = CGM.getContext().getSourceManager();
257     llvm::Constant *Ann =
258       CGM.EmitAnnotateAttr(GV, AA,
259                            SM.getInstantiationLineNumber(D.getLocation()));
260     CGM.AddAnnotation(Ann);
261   }
262
263   if (const SectionAttr *SA = D.getAttr<SectionAttr>())
264     GV->setSection(SA->getName());
265
266   if (D.hasAttr<UsedAttr>())
267     CGM.AddUsedGlobal(GV);
268
269   if (getContext().getLangOptions().CPlusPlus)
270     CGM.setStaticLocalDeclAddress(&D, GV);
271   
272   // We may have to cast the constant because of the initializer
273   // mismatch above.
274   //
275   // FIXME: It is really dangerous to store this in the map; if anyone
276   // RAUW's the GV uses of this constant will be invalid.
277   const llvm::Type *LTy = CGM.getTypes().ConvertTypeForMem(D.getType());
278   const llvm::Type *LPtrTy =
279     llvm::PointerType::get(LTy, D.getType().getAddressSpace());
280   DMEntry = llvm::ConstantExpr::getBitCast(GV, LPtrTy);
281
282   // Emit global variable debug descriptor for static vars.
283   CGDebugInfo *DI = getDebugInfo();
284   if (DI) {
285     DI->setLocation(D.getLocation());
286     DI->EmitGlobalVariable(static_cast<llvm::GlobalVariable *>(GV), &D);
287   }
288 }
289
290 unsigned CodeGenFunction::getByRefValueLLVMField(const ValueDecl *VD) const {
291   assert(ByRefValueInfo.count(VD) && "Did not find value!");
292   
293   return ByRefValueInfo.find(VD)->second.second;
294 }
295
296 /// BuildByRefType - This routine changes a __block variable declared as T x
297 ///   into:
298 ///
299 ///      struct {
300 ///        void *__isa;
301 ///        void *__forwarding;
302 ///        int32_t __flags;
303 ///        int32_t __size;
304 ///        void *__copy_helper;       // only if needed
305 ///        void *__destroy_helper;    // only if needed
306 ///        char padding[X];           // only if needed
307 ///        T x;
308 ///      } x
309 ///
310 const llvm::Type *CodeGenFunction::BuildByRefType(const ValueDecl *D) {
311   std::pair<const llvm::Type *, unsigned> &Info = ByRefValueInfo[D];
312   if (Info.first)
313     return Info.first;
314   
315   QualType Ty = D->getType();
316
317   std::vector<const llvm::Type *> Types;
318   
319   const llvm::PointerType *Int8PtrTy = llvm::Type::getInt8PtrTy(VMContext);
320
321   llvm::PATypeHolder ByRefTypeHolder = llvm::OpaqueType::get(VMContext);
322   
323   // void *__isa;
324   Types.push_back(Int8PtrTy);
325   
326   // void *__forwarding;
327   Types.push_back(llvm::PointerType::getUnqual(ByRefTypeHolder));
328   
329   // int32_t __flags;
330   Types.push_back(Int32Ty);
331     
332   // int32_t __size;
333   Types.push_back(Int32Ty);
334
335   bool HasCopyAndDispose = BlockRequiresCopying(Ty);
336   if (HasCopyAndDispose) {
337     /// void *__copy_helper;
338     Types.push_back(Int8PtrTy);
339     
340     /// void *__destroy_helper;
341     Types.push_back(Int8PtrTy);
342   }
343
344   bool Packed = false;
345   CharUnits Align = getContext().getDeclAlign(D);
346   if (Align > CharUnits::fromQuantity(Target.getPointerAlign(0) / 8)) {
347     // We have to insert padding.
348     
349     // The struct above has 2 32-bit integers.
350     unsigned CurrentOffsetInBytes = 4 * 2;
351     
352     // And either 2 or 4 pointers.
353     CurrentOffsetInBytes += (HasCopyAndDispose ? 4 : 2) *
354       CGM.getTargetData().getTypeAllocSize(Int8PtrTy);
355     
356     // Align the offset.
357     unsigned AlignedOffsetInBytes = 
358       llvm::RoundUpToAlignment(CurrentOffsetInBytes, Align.getQuantity());
359     
360     unsigned NumPaddingBytes = AlignedOffsetInBytes - CurrentOffsetInBytes;
361     if (NumPaddingBytes > 0) {
362       const llvm::Type *Ty = llvm::Type::getInt8Ty(VMContext);
363       // FIXME: We need a sema error for alignment larger than the minimum of
364       // the maximal stack alignmint and the alignment of malloc on the system.
365       if (NumPaddingBytes > 1)
366         Ty = llvm::ArrayType::get(Ty, NumPaddingBytes);
367     
368       Types.push_back(Ty);
369
370       // We want a packed struct.
371       Packed = true;
372     }
373   }
374
375   // T x;
376   Types.push_back(ConvertType(Ty));
377   
378   const llvm::Type *T = llvm::StructType::get(VMContext, Types, Packed);
379   
380   cast<llvm::OpaqueType>(ByRefTypeHolder.get())->refineAbstractTypeTo(T);
381   CGM.getModule().addTypeName("struct.__block_byref_" + D->getNameAsString(), 
382                               ByRefTypeHolder.get());
383   
384   Info.first = ByRefTypeHolder.get();
385   
386   Info.second = Types.size() - 1;
387   
388   return Info.first;
389 }
390
391 namespace {
392   struct CallArrayDtor : EHScopeStack::LazyCleanup {
393     CallArrayDtor(const CXXDestructorDecl *Dtor, 
394                   const ConstantArrayType *Type,
395                   llvm::Value *Loc)
396       : Dtor(Dtor), Type(Type), Loc(Loc) {}
397
398     const CXXDestructorDecl *Dtor;
399     const ConstantArrayType *Type;
400     llvm::Value *Loc;
401
402     void Emit(CodeGenFunction &CGF, bool IsForEH) {
403       QualType BaseElementTy = CGF.getContext().getBaseElementType(Type);
404       const llvm::Type *BasePtr = CGF.ConvertType(BaseElementTy);
405       BasePtr = llvm::PointerType::getUnqual(BasePtr);
406       llvm::Value *BaseAddrPtr = CGF.Builder.CreateBitCast(Loc, BasePtr);
407       CGF.EmitCXXAggrDestructorCall(Dtor, Type, BaseAddrPtr);
408     }
409   };
410
411   struct CallVarDtor : EHScopeStack::LazyCleanup {
412     CallVarDtor(const CXXDestructorDecl *Dtor,
413                 llvm::Value *NRVOFlag,
414                 llvm::Value *Loc)
415       : Dtor(Dtor), NRVOFlag(NRVOFlag), Loc(Loc) {}
416
417     const CXXDestructorDecl *Dtor;
418     llvm::Value *NRVOFlag;
419     llvm::Value *Loc;
420
421     void Emit(CodeGenFunction &CGF, bool IsForEH) {
422       // Along the exceptions path we always execute the dtor.
423       bool NRVO = !IsForEH && NRVOFlag;
424
425       llvm::BasicBlock *SkipDtorBB = 0;
426       if (NRVO) {
427         // If we exited via NRVO, we skip the destructor call.
428         llvm::BasicBlock *RunDtorBB = CGF.createBasicBlock("nrvo.unused");
429         SkipDtorBB = CGF.createBasicBlock("nrvo.skipdtor");
430         llvm::Value *DidNRVO = CGF.Builder.CreateLoad(NRVOFlag, "nrvo.val");
431         CGF.Builder.CreateCondBr(DidNRVO, SkipDtorBB, RunDtorBB);
432         CGF.EmitBlock(RunDtorBB);
433       }
434           
435       CGF.EmitCXXDestructorCall(Dtor, Dtor_Complete,
436                                 /*ForVirtualBase=*/false, Loc);
437
438       if (NRVO) CGF.EmitBlock(SkipDtorBB);
439     }
440   };
441 }
442
443 /// EmitLocalBlockVarDecl - Emit code and set up an entry in LocalDeclMap for a
444 /// variable declaration with auto, register, or no storage class specifier.
445 /// These turn into simple stack objects, or GlobalValues depending on target.
446 void CodeGenFunction::EmitLocalBlockVarDecl(const VarDecl &D,
447                                             SpecialInitFn *SpecialInit) {
448   QualType Ty = D.getType();
449   bool isByRef = D.hasAttr<BlocksAttr>();
450   bool needsDispose = false;
451   CharUnits Align = CharUnits::Zero();
452   bool IsSimpleConstantInitializer = false;
453
454   bool NRVO = false;
455   llvm::Value *NRVOFlag = 0;
456   llvm::Value *DeclPtr;
457   if (Ty->isConstantSizeType()) {
458     if (!Target.useGlobalsForAutomaticVariables()) {
459       NRVO = getContext().getLangOptions().ElideConstructors && 
460              D.isNRVOVariable();
461       // If this value is an array or struct, is POD, and if the initializer is
462       // a staticly determinable constant, try to optimize it (unless the NRVO
463       // is already optimizing this).
464       if (D.getInit() && !isByRef &&
465           (Ty->isArrayType() || Ty->isRecordType()) &&
466           Ty->isPODType() &&
467           D.getInit()->isConstantInitializer(getContext()) && !NRVO) {
468         // If this variable is marked 'const', emit the value as a global.
469         if (CGM.getCodeGenOpts().MergeAllConstants &&
470             Ty.isConstant(getContext())) {
471           EmitStaticBlockVarDecl(D, llvm::GlobalValue::InternalLinkage);
472           return;
473         }
474         
475         IsSimpleConstantInitializer = true;
476       }
477       
478       // A normal fixed sized variable becomes an alloca in the entry block,
479       // unless it's an NRVO variable.
480       const llvm::Type *LTy = ConvertTypeForMem(Ty);
481       
482       if (NRVO) {
483         // The named return value optimization: allocate this variable in the
484         // return slot, so that we can elide the copy when returning this
485         // variable (C++0x [class.copy]p34).
486         DeclPtr = ReturnValue;
487         
488         if (const RecordType *RecordTy = Ty->getAs<RecordType>()) {
489           if (!cast<CXXRecordDecl>(RecordTy->getDecl())->hasTrivialDestructor()) {
490             // Create a flag that is used to indicate when the NRVO was applied
491             // to this variable. Set it to zero to indicate that NRVO was not 
492             // applied.
493             const llvm::Type *BoolTy = llvm::Type::getInt1Ty(VMContext);
494             llvm::Value *Zero = llvm::ConstantInt::get(BoolTy, 0);
495             NRVOFlag = CreateTempAlloca(BoolTy, "nrvo");            
496             Builder.CreateStore(Zero, NRVOFlag);
497             
498             // Record the NRVO flag for this variable.
499             NRVOFlags[&D] = NRVOFlag;
500           }
501         }
502       } else {
503         if (isByRef)
504           LTy = BuildByRefType(&D);
505         
506         llvm::AllocaInst *Alloc = CreateTempAlloca(LTy);
507         Alloc->setName(D.getNameAsString());
508
509         Align = getContext().getDeclAlign(&D);
510         if (isByRef)
511           Align = std::max(Align, 
512               CharUnits::fromQuantity(Target.getPointerAlign(0) / 8));
513         Alloc->setAlignment(Align.getQuantity());
514         DeclPtr = Alloc;
515       }
516     } else {
517       // Targets that don't support recursion emit locals as globals.
518       const char *Class =
519         D.getStorageClass() == VarDecl::Register ? ".reg." : ".auto.";
520       DeclPtr = CreateStaticBlockVarDecl(D, Class,
521                                          llvm::GlobalValue
522                                          ::InternalLinkage);
523     }
524
525     // FIXME: Can this happen?
526     if (Ty->isVariablyModifiedType())
527       EmitVLASize(Ty);
528   } else {
529     EnsureInsertPoint();
530
531     if (!DidCallStackSave) {
532       // Save the stack.
533       const llvm::Type *LTy = llvm::Type::getInt8PtrTy(VMContext);
534       llvm::Value *Stack = CreateTempAlloca(LTy, "saved_stack");
535
536       llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::stacksave);
537       llvm::Value *V = Builder.CreateCall(F);
538
539       Builder.CreateStore(V, Stack);
540
541       DidCallStackSave = true;
542
543       {
544         // Push a cleanup block and restore the stack there.
545         CleanupBlock scope(*this, NormalCleanup);
546
547         V = Builder.CreateLoad(Stack, "tmp");
548         llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::stackrestore);
549         Builder.CreateCall(F, V);
550       }
551     }
552
553     // Get the element type.
554     const llvm::Type *LElemTy = ConvertTypeForMem(Ty);
555     const llvm::Type *LElemPtrTy =
556       llvm::PointerType::get(LElemTy, D.getType().getAddressSpace());
557
558     llvm::Value *VLASize = EmitVLASize(Ty);
559
560     // Allocate memory for the array.
561     llvm::AllocaInst *VLA = 
562       Builder.CreateAlloca(llvm::Type::getInt8Ty(VMContext), VLASize, "vla");
563     VLA->setAlignment(getContext().getDeclAlign(&D).getQuantity());
564
565     DeclPtr = Builder.CreateBitCast(VLA, LElemPtrTy, "tmp");
566   }
567
568   llvm::Value *&DMEntry = LocalDeclMap[&D];
569   assert(DMEntry == 0 && "Decl already exists in localdeclmap!");
570   DMEntry = DeclPtr;
571
572   // Emit debug info for local var declaration.
573   if (CGDebugInfo *DI = getDebugInfo()) {
574     assert(HaveInsertPoint() && "Unexpected unreachable point!");
575
576     DI->setLocation(D.getLocation());
577     if (Target.useGlobalsForAutomaticVariables()) {
578       DI->EmitGlobalVariable(static_cast<llvm::GlobalVariable *>(DeclPtr), &D);
579     } else
580       DI->EmitDeclareOfAutoVariable(&D, DeclPtr, Builder);
581   }
582
583   // If this local has an initializer, emit it now.
584   const Expr *Init = D.getInit();
585
586   // If we are at an unreachable point, we don't need to emit the initializer
587   // unless it contains a label.
588   if (!HaveInsertPoint()) {
589     if (!ContainsLabel(Init))
590       Init = 0;
591     else
592       EnsureInsertPoint();
593   }
594
595   if (isByRef) {
596     const llvm::PointerType *PtrToInt8Ty = llvm::Type::getInt8PtrTy(VMContext);
597
598     EnsureInsertPoint();
599     llvm::Value *isa_field = Builder.CreateStructGEP(DeclPtr, 0);
600     llvm::Value *forwarding_field = Builder.CreateStructGEP(DeclPtr, 1);
601     llvm::Value *flags_field = Builder.CreateStructGEP(DeclPtr, 2);
602     llvm::Value *size_field = Builder.CreateStructGEP(DeclPtr, 3);
603     llvm::Value *V;
604     int flag = 0;
605     int flags = 0;
606
607     needsDispose = true;
608
609     if (Ty->isBlockPointerType()) {
610       flag |= BLOCK_FIELD_IS_BLOCK;
611       flags |= BLOCK_HAS_COPY_DISPOSE;
612     } else if (BlockRequiresCopying(Ty)) {
613       flag |= BLOCK_FIELD_IS_OBJECT;
614       flags |= BLOCK_HAS_COPY_DISPOSE;
615     }
616
617     // FIXME: Someone double check this.
618     if (Ty.isObjCGCWeak())
619       flag |= BLOCK_FIELD_IS_WEAK;
620
621     int isa = 0;
622     if (flag&BLOCK_FIELD_IS_WEAK)
623       isa = 1;
624     V = llvm::ConstantInt::get(Int32Ty, isa);
625     V = Builder.CreateIntToPtr(V, PtrToInt8Ty, "isa");
626     Builder.CreateStore(V, isa_field);
627
628     Builder.CreateStore(DeclPtr, forwarding_field);
629
630     V = llvm::ConstantInt::get(Int32Ty, flags);
631     Builder.CreateStore(V, flags_field);
632
633     const llvm::Type *V1;
634     V1 = cast<llvm::PointerType>(DeclPtr->getType())->getElementType();
635     V = llvm::ConstantInt::get(Int32Ty,
636                                CGM.GetTargetTypeStoreSize(V1).getQuantity());
637     Builder.CreateStore(V, size_field);
638
639     if (flags & BLOCK_HAS_COPY_DISPOSE) {
640       BlockHasCopyDispose = true;
641       llvm::Value *copy_helper = Builder.CreateStructGEP(DeclPtr, 4);
642       Builder.CreateStore(BuildbyrefCopyHelper(DeclPtr->getType(), flag, 
643                                                Align.getQuantity()),
644                           copy_helper);
645
646       llvm::Value *destroy_helper = Builder.CreateStructGEP(DeclPtr, 5);
647       Builder.CreateStore(BuildbyrefDestroyHelper(DeclPtr->getType(), flag,
648                                                   Align.getQuantity()),
649                           destroy_helper);
650     }
651   }
652
653   if (SpecialInit) {
654     SpecialInit(*this, D, DeclPtr);
655   } else if (Init) {
656     llvm::Value *Loc = DeclPtr;
657     if (isByRef)
658       Loc = Builder.CreateStructGEP(DeclPtr, getByRefValueLLVMField(&D), 
659                                     D.getNameAsString());
660     
661     bool isVolatile =
662     getContext().getCanonicalType(D.getType()).isVolatileQualified();
663     
664     // If the initializer was a simple constant initializer, we can optimize it
665     // in various ways.
666     if (IsSimpleConstantInitializer) {
667       llvm::Constant *Init = CGM.EmitConstantExpr(D.getInit(),D.getType(),this);
668       assert(Init != 0 && "Wasn't a simple constant init?");
669       
670       llvm::Value *AlignVal = 
671       llvm::ConstantInt::get(Int32Ty, Align.getQuantity());
672       const llvm::Type *IntPtr =
673       llvm::IntegerType::get(VMContext, LLVMPointerWidth);
674       llvm::Value *SizeVal =
675       llvm::ConstantInt::get(IntPtr, 
676                              getContext().getTypeSizeInChars(Ty).getQuantity());
677       
678       const llvm::Type *BP = llvm::Type::getInt8PtrTy(VMContext);
679       if (Loc->getType() != BP)
680         Loc = Builder.CreateBitCast(Loc, BP, "tmp");
681       
682       llvm::Value *NotVolatile =
683         llvm::ConstantInt::get(llvm::Type::getInt1Ty(VMContext), 0);
684
685       // If the initializer is all zeros, codegen with memset.
686       if (isa<llvm::ConstantAggregateZero>(Init)) {
687         llvm::Value *Zero =
688           llvm::ConstantInt::get(llvm::Type::getInt8Ty(VMContext), 0);
689         Builder.CreateCall5(CGM.getMemSetFn(Loc->getType(), SizeVal->getType()),
690                             Loc, Zero, SizeVal, AlignVal, NotVolatile);
691       } else {
692         // Otherwise, create a temporary global with the initializer then 
693         // memcpy from the global to the alloca.
694         std::string Name = GetStaticDeclName(*this, D, ".");
695         llvm::GlobalVariable *GV =
696         new llvm::GlobalVariable(CGM.getModule(), Init->getType(), true,
697                                  llvm::GlobalValue::InternalLinkage,
698                                  Init, Name, 0, false, 0);
699         GV->setAlignment(Align.getQuantity());
700         
701         llvm::Value *SrcPtr = GV;
702         if (SrcPtr->getType() != BP)
703           SrcPtr = Builder.CreateBitCast(SrcPtr, BP, "tmp");
704
705         Builder.CreateCall5(CGM.getMemCpyFn(Loc->getType(), SrcPtr->getType(),
706                                             SizeVal->getType()),
707                             Loc, SrcPtr, SizeVal, AlignVal, NotVolatile);
708       }
709     } else if (Ty->isReferenceType()) {
710       RValue RV = EmitReferenceBindingToExpr(Init, &D);
711       EmitStoreOfScalar(RV.getScalarVal(), Loc, false, Ty);
712     } else if (!hasAggregateLLVMType(Init->getType())) {
713       llvm::Value *V = EmitScalarExpr(Init);
714       EmitStoreOfScalar(V, Loc, isVolatile, D.getType());
715     } else if (Init->getType()->isAnyComplexType()) {
716       EmitComplexExprIntoAddr(Init, Loc, isVolatile);
717     } else {
718       EmitAggExpr(Init, Loc, isVolatile);
719     }
720   }
721
722   // Handle CXX destruction of variables.
723   QualType DtorTy(Ty);
724   while (const ArrayType *Array = getContext().getAsArrayType(DtorTy))
725     DtorTy = getContext().getBaseElementType(Array);
726   if (const RecordType *RT = DtorTy->getAs<RecordType>())
727     if (CXXRecordDecl *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) {      
728       if (!ClassDecl->hasTrivialDestructor()) {
729         // Note: We suppress the destructor call when the corresponding NRVO
730         // flag has been set.
731         llvm::Value *Loc = DeclPtr;
732         if (isByRef)
733           Loc = Builder.CreateStructGEP(DeclPtr, getByRefValueLLVMField(&D), 
734                                         D.getNameAsString());
735         
736         const CXXDestructorDecl *D = ClassDecl->getDestructor();
737         assert(D && "EmitLocalBlockVarDecl - destructor is nul");
738         
739         if (const ConstantArrayType *Array = 
740               getContext().getAsConstantArrayType(Ty)) {
741           EHStack.pushLazyCleanup<CallArrayDtor>(NormalAndEHCleanup,
742                                                  D, Array, Loc);
743         } else {
744           EHStack.pushLazyCleanup<CallVarDtor>(NormalAndEHCleanup,
745                                                D, NRVOFlag, Loc);
746         }
747       }
748   }
749
750   // Handle the cleanup attribute
751   if (const CleanupAttr *CA = D.getAttr<CleanupAttr>()) {
752     const FunctionDecl *FD = CA->getFunctionDecl();
753
754     llvm::Constant* F = CGM.GetAddrOfFunction(FD);
755     assert(F && "Could not find function!");
756
757     const CGFunctionInfo &Info = CGM.getTypes().getFunctionInfo(FD);
758
759     // In some cases, the type of the function argument will be different from
760     // the type of the pointer. An example of this is
761     // void f(void* arg);
762     // __attribute__((cleanup(f))) void *g;
763     //
764     // To fix this we insert a bitcast here.
765     QualType ArgTy = Info.arg_begin()->type;
766
767     CleanupBlock CleanupScope(*this, NormalCleanup);
768
769     // Normal cleanup.
770     CallArgList Args;
771     Args.push_back(std::make_pair(RValue::get(Builder.CreateBitCast(DeclPtr,
772                                                          ConvertType(ArgTy))),
773                                   getContext().getPointerType(D.getType())));
774     EmitCall(Info, F, ReturnValueSlot(), Args);
775
776     // EH cleanup.
777     if (Exceptions) {
778       CleanupScope.beginEHCleanup();
779
780       CallArgList Args;
781       Args.push_back(std::make_pair(RValue::get(Builder.CreateBitCast(DeclPtr,
782                                                            ConvertType(ArgTy))),
783                                     getContext().getPointerType(D.getType())));
784       EmitCall(Info, F, ReturnValueSlot(), Args);
785     }
786   }
787
788   if (needsDispose && CGM.getLangOptions().getGCMode() != LangOptions::GCOnly) {
789     CleanupBlock CleanupScope(*this, NormalCleanup);
790
791     llvm::Value *V = Builder.CreateStructGEP(DeclPtr, 1, "forwarding");
792     V = Builder.CreateLoad(V);
793     BuildBlockRelease(V);
794
795     // FIXME: Turn this on and audit the codegen
796     if (0 && Exceptions) {
797       CleanupScope.beginEHCleanup();
798
799       llvm::Value *V = Builder.CreateStructGEP(DeclPtr, 1, "forwarding");
800       V = Builder.CreateLoad(V);
801       BuildBlockRelease(V);
802     }
803   }
804 }
805
806 /// Emit an alloca (or GlobalValue depending on target)
807 /// for the specified parameter and set up LocalDeclMap.
808 void CodeGenFunction::EmitParmDecl(const VarDecl &D, llvm::Value *Arg) {
809   // FIXME: Why isn't ImplicitParamDecl a ParmVarDecl?
810   assert((isa<ParmVarDecl>(D) || isa<ImplicitParamDecl>(D)) &&
811          "Invalid argument to EmitParmDecl");
812   QualType Ty = D.getType();
813   CanQualType CTy = getContext().getCanonicalType(Ty);
814
815   llvm::Value *DeclPtr;
816   // If this is an aggregate or variable sized value, reuse the input pointer.
817   if (!Ty->isConstantSizeType() ||
818       CodeGenFunction::hasAggregateLLVMType(Ty)) {
819     DeclPtr = Arg;
820   } else {
821     // Otherwise, create a temporary to hold the value.
822     DeclPtr = CreateMemTemp(Ty, D.getName() + ".addr");
823
824     // Store the initial value into the alloca.
825     EmitStoreOfScalar(Arg, DeclPtr, CTy.isVolatileQualified(), Ty);
826   }
827   Arg->setName(D.getName());
828
829   llvm::Value *&DMEntry = LocalDeclMap[&D];
830   assert(DMEntry == 0 && "Decl already exists in localdeclmap!");
831   DMEntry = DeclPtr;
832
833   // Emit debug info for param declaration.
834   if (CGDebugInfo *DI = getDebugInfo()) {
835     DI->setLocation(D.getLocation());
836     DI->EmitDeclareOfArgVariable(&D, DeclPtr, Builder);
837   }
838 }