]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - lib/CodeGen/CGDecl.cpp
Import Clang r74383.
[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/Decl.h"
19 #include "clang/AST/DeclObjC.h"
20 #include "clang/Basic/SourceManager.h"
21 #include "clang/Basic/TargetInfo.h"
22 #include "llvm/GlobalVariable.h"
23 #include "llvm/Intrinsics.h"
24 #include "llvm/Target/TargetData.h"
25 #include "llvm/Type.h"
26 using namespace clang;
27 using namespace CodeGen;
28
29
30 void CodeGenFunction::EmitDecl(const Decl &D) {
31   switch (D.getKind()) {
32   default: assert(0 && "Unknown decl kind!");
33   case Decl::ParmVar:
34     assert(0 && "Parmdecls should not be in declstmts!");
35   case Decl::Function:  // void X();
36   case Decl::Record:    // struct/union/class X;
37   case Decl::Enum:      // enum X;
38   case Decl::EnumConstant: // enum ? { X = ? } 
39   case Decl::CXXRecord: // struct/union/class X; [C++]
40     // None of these decls require codegen support.
41     return;
42     
43   case Decl::Var: {
44     const VarDecl &VD = cast<VarDecl>(D);
45     assert(VD.isBlockVarDecl() && 
46            "Should not see file-scope variables inside a function!");
47     return EmitBlockVarDecl(VD);
48   }
49         
50   case Decl::Typedef: {   // typedef int X;
51     const TypedefDecl &TD = cast<TypedefDecl>(D);
52     QualType Ty = TD.getUnderlyingType();
53     
54     if (Ty->isVariablyModifiedType())
55       EmitVLASize(Ty);
56   }
57   }
58 }
59
60 /// EmitBlockVarDecl - This method handles emission of any variable declaration
61 /// inside a function, including static vars etc.
62 void CodeGenFunction::EmitBlockVarDecl(const VarDecl &D) {
63   if (D.hasAttr<AsmLabelAttr>(getContext()))
64     CGM.ErrorUnsupported(&D, "__asm__");
65   
66   switch (D.getStorageClass()) {
67   case VarDecl::None:
68   case VarDecl::Auto:
69   case VarDecl::Register:
70     return EmitLocalBlockVarDecl(D);
71   case VarDecl::Static:
72     return EmitStaticBlockVarDecl(D);
73   case VarDecl::Extern:
74   case VarDecl::PrivateExtern:
75     // Don't emit it now, allow it to be emitted lazily on its first use.
76     return;
77   }
78
79   assert(0 && "Unknown storage class");
80 }
81
82 llvm::GlobalVariable *
83 CodeGenFunction::CreateStaticBlockVarDecl(const VarDecl &D,
84                                           const char *Separator,
85                                           llvm::GlobalValue::LinkageTypes
86                                           Linkage) {
87   QualType Ty = D.getType();
88   assert(Ty->isConstantSizeType() && "VLAs can't be static");
89
90   std::string Name;
91   if (getContext().getLangOptions().CPlusPlus) {
92     Name = CGM.getMangledName(&D);
93   } else {
94     std::string ContextName;
95     if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CurFuncDecl))
96       ContextName = CGM.getMangledName(FD);
97     else if (isa<ObjCMethodDecl>(CurFuncDecl))
98       ContextName = std::string(CurFn->getNameStart(), 
99                                 CurFn->getNameStart() + CurFn->getNameLen());
100     else
101       assert(0 && "Unknown context for block var decl");
102     
103     Name = ContextName + Separator + D.getNameAsString();
104   }
105
106   const llvm::Type *LTy = CGM.getTypes().ConvertTypeForMem(Ty);
107   return new llvm::GlobalVariable(LTy, Ty.isConstant(getContext()), Linkage,
108                                   llvm::Constant::getNullValue(LTy), Name,
109                                   &CGM.getModule(), D.isThreadSpecified(),
110                                   Ty.getAddressSpace());
111 }
112
113 void CodeGenFunction::EmitStaticBlockVarDecl(const VarDecl &D) { 
114
115   llvm::Value *&DMEntry = LocalDeclMap[&D];
116   assert(DMEntry == 0 && "Decl already exists in localdeclmap!");
117   
118   llvm::GlobalVariable *GV = 
119     CreateStaticBlockVarDecl(D, ".", llvm::GlobalValue::InternalLinkage);
120
121   // Store into LocalDeclMap before generating initializer to handle
122   // circular references.
123   DMEntry = GV;
124
125   // Make sure to evaluate VLA bounds now so that we have them for later.
126   if (D.getType()->isVariablyModifiedType())
127     EmitVLASize(D.getType());
128
129   if (D.getType()->isReferenceType()) {
130     CGM.ErrorUnsupported(&D, "static declaration with reference type");
131     return;
132   }
133
134   if (D.getInit()) {
135     llvm::Constant *Init = CGM.EmitConstantExpr(D.getInit(), D.getType(), this);
136
137     // If constant emission failed, then this should be a C++ static
138     // initializer.
139     if (!Init) {
140       if (!getContext().getLangOptions().CPlusPlus)
141         CGM.ErrorUnsupported(D.getInit(), "constant l-value expression");
142       else
143         GenerateStaticCXXBlockVarDeclInit(D, GV);
144     } else {
145       // The initializer may differ in type from the global. Rewrite
146       // the global to match the initializer.  (We have to do this
147       // because some types, like unions, can't be completely represented
148       // in the LLVM type system.)
149       if (GV->getType() != Init->getType()) {
150         llvm::GlobalVariable *OldGV = GV;
151         
152         GV = new llvm::GlobalVariable(Init->getType(), OldGV->isConstant(),
153                                       OldGV->getLinkage(), Init, "",
154                                       &CGM.getModule(), D.isThreadSpecified(),
155                                       D.getType().getAddressSpace());
156
157         // Steal the name of the old global
158         GV->takeName(OldGV);
159
160         // Replace all uses of the old global with the new global
161         llvm::Constant *NewPtrForOldDecl = 
162           llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
163         OldGV->replaceAllUsesWith(NewPtrForOldDecl);
164
165         // Erase the old global, since it is no longer used.
166         OldGV->eraseFromParent();
167       } 
168
169       GV->setInitializer(Init);
170     }
171   }
172
173   // FIXME: Merge attribute handling.
174   if (const AnnotateAttr *AA = D.getAttr<AnnotateAttr>(getContext())) {
175     SourceManager &SM = CGM.getContext().getSourceManager();
176     llvm::Constant *Ann =
177       CGM.EmitAnnotateAttr(GV, AA, 
178                            SM.getInstantiationLineNumber(D.getLocation()));
179     CGM.AddAnnotation(Ann);
180   }
181
182   if (const SectionAttr *SA = D.getAttr<SectionAttr>(getContext()))
183     GV->setSection(SA->getName());
184   
185   if (D.hasAttr<UsedAttr>(getContext()))
186     CGM.AddUsedGlobal(GV);
187
188   // We may have to cast the constant because of the initializer
189   // mismatch above.
190   //
191   // FIXME: It is really dangerous to store this in the map; if anyone
192   // RAUW's the GV uses of this constant will be invalid.
193   const llvm::Type *LTy = CGM.getTypes().ConvertTypeForMem(D.getType());
194   const llvm::Type *LPtrTy =
195     llvm::PointerType::get(LTy, D.getType().getAddressSpace());
196   DMEntry = llvm::ConstantExpr::getBitCast(GV, LPtrTy);
197
198   // Emit global variable debug descriptor for static vars.
199   CGDebugInfo *DI = getDebugInfo();
200   if (DI) {
201     DI->setLocation(D.getLocation());
202     DI->EmitGlobalVariable(static_cast<llvm::GlobalVariable *>(GV), &D);
203   }
204 }
205   
206 /// BuildByRefType - This routine changes a __block variable declared as T x
207 ///   into:
208 ///
209 ///      struct {
210 ///        void *__isa;
211 ///        void *__forwarding;
212 ///        int32_t __flags;
213 ///        int32_t __size;
214 ///        void *__copy_helper;
215 ///        void *__destroy_helper;
216 ///        T x;
217 ///      } x
218 ///
219 /// Align is the alignment needed in bytes for x.
220 const llvm::Type *CodeGenFunction::BuildByRefType(QualType Ty,
221                                                   uint64_t Align) {
222   const llvm::Type *LTy = ConvertType(Ty);
223   bool needsCopyDispose = BlockRequiresCopying(Ty);
224   std::vector<const llvm::Type *> Types(needsCopyDispose*2+5);
225   const llvm::PointerType *PtrToInt8Ty
226     = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
227   Types[0] = PtrToInt8Ty;
228   Types[1] = PtrToInt8Ty;
229   Types[2] = llvm::Type::Int32Ty;
230   Types[3] = llvm::Type::Int32Ty;
231   if (needsCopyDispose) {
232     Types[4] = PtrToInt8Ty;
233     Types[5] = PtrToInt8Ty;
234   }
235   // FIXME: Align this on at least an Align boundary, assert if we can't.
236   assert((Align <= unsigned(Target.getPointerAlign(0))/8)
237          && "Can't align more than pointer yet");
238   Types[needsCopyDispose*2 + 4] = LTy;
239   return llvm::StructType::get(Types, false);
240 }
241
242 /// EmitLocalBlockVarDecl - Emit code and set up an entry in LocalDeclMap for a
243 /// variable declaration with auto, register, or no storage class specifier.
244 /// These turn into simple stack objects, or GlobalValues depending on target.
245 void CodeGenFunction::EmitLocalBlockVarDecl(const VarDecl &D) {
246   QualType Ty = D.getType();
247   bool isByRef = D.hasAttr<BlocksAttr>(getContext());
248   bool needsDispose = false;
249   unsigned Align = 0;
250
251   llvm::Value *DeclPtr;
252   if (Ty->isConstantSizeType()) {
253     if (!Target.useGlobalsForAutomaticVariables()) {
254       // A normal fixed sized variable becomes an alloca in the entry block.
255       const llvm::Type *LTy = ConvertTypeForMem(Ty);
256       Align = getContext().getDeclAlignInBytes(&D);
257       if (isByRef)
258         LTy = BuildByRefType(Ty, Align);
259       llvm::AllocaInst *Alloc = CreateTempAlloca(LTy);
260       Alloc->setName(D.getNameAsString().c_str());
261       
262       if (isByRef)
263         Align = std::max(Align, unsigned(Target.getPointerAlign(0) / 8));
264       Alloc->setAlignment(Align);
265       DeclPtr = Alloc;
266     } else {
267       // Targets that don't support recursion emit locals as globals.
268       const char *Class =
269         D.getStorageClass() == VarDecl::Register ? ".reg." : ".auto.";
270       DeclPtr = CreateStaticBlockVarDecl(D, Class, 
271                                          llvm::GlobalValue
272                                          ::InternalLinkage);
273     }
274     
275     if (Ty->isVariablyModifiedType())
276       EmitVLASize(Ty);
277   } else {
278     if (!DidCallStackSave) {
279       // Save the stack.
280       const llvm::Type *LTy = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
281       llvm::Value *Stack = CreateTempAlloca(LTy, "saved_stack");
282       
283       llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::stacksave);
284       llvm::Value *V = Builder.CreateCall(F);
285       
286       Builder.CreateStore(V, Stack);
287
288       DidCallStackSave = true;
289       
290       {
291         // Push a cleanup block and restore the stack there.
292         CleanupScope scope(*this);
293       
294         V = Builder.CreateLoad(Stack, "tmp");
295         llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::stackrestore);
296         Builder.CreateCall(F, V);
297       }
298     }
299     
300     // Get the element type.
301     const llvm::Type *LElemTy = ConvertTypeForMem(Ty);    
302     const llvm::Type *LElemPtrTy =
303       llvm::PointerType::get(LElemTy, D.getType().getAddressSpace());
304
305     llvm::Value *VLASize = EmitVLASize(Ty);
306
307     // Downcast the VLA size expression
308     VLASize = Builder.CreateIntCast(VLASize, llvm::Type::Int32Ty, false, "tmp");
309     
310     // Allocate memory for the array.
311     llvm::Value *VLA = Builder.CreateAlloca(llvm::Type::Int8Ty, VLASize, "vla");
312     DeclPtr = Builder.CreateBitCast(VLA, LElemPtrTy, "tmp");
313   }
314
315   llvm::Value *&DMEntry = LocalDeclMap[&D];
316   assert(DMEntry == 0 && "Decl already exists in localdeclmap!");
317   DMEntry = DeclPtr;
318
319   // Emit debug info for local var declaration.
320   if (CGDebugInfo *DI = getDebugInfo()) {
321     DI->setLocation(D.getLocation());
322     if (Target.useGlobalsForAutomaticVariables()) {
323       DI->EmitGlobalVariable(static_cast<llvm::GlobalVariable *>(DeclPtr), &D);
324     }
325     else if (isByRef) {
326       llvm::Value *Loc;
327       bool needsCopyDispose = BlockRequiresCopying(Ty);
328       Loc = Builder.CreateStructGEP(DeclPtr, 1, "forwarding");
329       Loc = Builder.CreateLoad(Loc, false);
330       Loc = Builder.CreateBitCast(Loc, DeclPtr->getType());
331       Loc = Builder.CreateStructGEP(Loc, needsCopyDispose*2+4, "x");
332       DI->EmitDeclareOfAutoVariable(&D, Loc, Builder);
333     } else
334       DI->EmitDeclareOfAutoVariable(&D, DeclPtr, Builder);
335   }
336
337   // If this local has an initializer, emit it now.
338   if (const Expr *Init = D.getInit()) {
339     llvm::Value *Loc = DeclPtr;
340     if (isByRef) {
341       bool needsCopyDispose = BlockRequiresCopying(Ty);
342       Loc = Builder.CreateStructGEP(DeclPtr, needsCopyDispose*2+4, "x");
343     }
344     if (Ty->isReferenceType()) {
345       llvm::Value *V = EmitReferenceBindingToExpr(Init, Ty).getScalarVal();
346       EmitStoreOfScalar(V, Loc, false, Ty);
347     } else if (!hasAggregateLLVMType(Init->getType())) {
348       llvm::Value *V = EmitScalarExpr(Init);
349       EmitStoreOfScalar(V, Loc, D.getType().isVolatileQualified(), 
350                         D.getType());
351     } else if (Init->getType()->isAnyComplexType()) {
352       EmitComplexExprIntoAddr(Init, Loc, D.getType().isVolatileQualified());
353     } else {
354       EmitAggExpr(Init, Loc, D.getType().isVolatileQualified());
355     }
356   }
357   if (isByRef) {
358     const llvm::PointerType *PtrToInt8Ty
359       = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
360
361     llvm::Value *isa_field = Builder.CreateStructGEP(DeclPtr, 0);
362     llvm::Value *forwarding_field = Builder.CreateStructGEP(DeclPtr, 1);
363     llvm::Value *flags_field = Builder.CreateStructGEP(DeclPtr, 2);
364     llvm::Value *size_field = Builder.CreateStructGEP(DeclPtr, 3);
365     llvm::Value *V;
366     int flag = 0;
367     int flags = 0;
368
369     needsDispose = true;
370
371     if (Ty->isBlockPointerType()) {
372       flag |= BLOCK_FIELD_IS_BLOCK;
373       flags |= BLOCK_HAS_COPY_DISPOSE;
374     } else if (BlockRequiresCopying(Ty)) {
375       flag |= BLOCK_FIELD_IS_OBJECT;
376       flags |= BLOCK_HAS_COPY_DISPOSE;
377     }
378
379     // FIXME: Someone double check this.
380     if (Ty.isObjCGCWeak())
381       flag |= BLOCK_FIELD_IS_WEAK;
382
383     int isa = 0;
384     if (flag&BLOCK_FIELD_IS_WEAK)
385       isa = 1;
386     V = llvm::ConstantInt::get(llvm::Type::Int32Ty, isa);
387     V = Builder.CreateIntToPtr(V, PtrToInt8Ty, "isa");
388     Builder.CreateStore(V, isa_field);
389
390     V = Builder.CreateBitCast(DeclPtr, PtrToInt8Ty, "forwarding");
391     Builder.CreateStore(V, forwarding_field);
392
393     V = llvm::ConstantInt::get(llvm::Type::Int32Ty, flags);
394     Builder.CreateStore(V, flags_field);
395
396     const llvm::Type *V1;
397     V1 = cast<llvm::PointerType>(DeclPtr->getType())->getElementType();
398     V = llvm::ConstantInt::get(llvm::Type::Int32Ty,
399                                (CGM.getTargetData().getTypeStoreSizeInBits(V1)
400                                 / 8));
401     Builder.CreateStore(V, size_field);
402
403     if (flags & BLOCK_HAS_COPY_DISPOSE) {
404       BlockHasCopyDispose = true;
405       llvm::Value *copy_helper = Builder.CreateStructGEP(DeclPtr, 4);
406       Builder.CreateStore(BuildbyrefCopyHelper(DeclPtr->getType(), flag, Align),
407                           copy_helper);
408
409       llvm::Value *destroy_helper = Builder.CreateStructGEP(DeclPtr, 5);
410       Builder.CreateStore(BuildbyrefDestroyHelper(DeclPtr->getType(), flag,
411                                                   Align),
412                           destroy_helper);
413     }
414   }
415
416   // Handle the cleanup attribute
417   if (const CleanupAttr *CA = D.getAttr<CleanupAttr>(getContext())) {
418     const FunctionDecl *FD = CA->getFunctionDecl();
419     
420     llvm::Constant* F = CGM.GetAddrOfFunction(GlobalDecl(FD));
421     assert(F && "Could not find function!");
422   
423     CleanupScope scope(*this);
424
425     const CGFunctionInfo &Info = CGM.getTypes().getFunctionInfo(FD);
426
427     // In some cases, the type of the function argument will be different from
428     // the type of the pointer. An example of this is
429     // void f(void* arg);
430     // __attribute__((cleanup(f))) void *g;
431     // 
432     // To fix this we insert a bitcast here.
433     QualType ArgTy = Info.arg_begin()->type;
434     DeclPtr = Builder.CreateBitCast(DeclPtr, ConvertType(ArgTy));
435     
436     CallArgList Args;
437     Args.push_back(std::make_pair(RValue::get(DeclPtr), 
438                                   getContext().getPointerType(D.getType())));
439     
440     EmitCall(Info, F, Args);
441   }
442
443   if (needsDispose && CGM.getLangOptions().getGCMode() != LangOptions::GCOnly) {
444     CleanupScope scope(*this);
445     llvm::Value *V = Builder.CreateStructGEP(DeclPtr, 1, "forwarding");
446     V = Builder.CreateLoad(V, false);
447     BuildBlockRelease(V);
448   }
449 }
450
451 /// Emit an alloca (or GlobalValue depending on target) 
452 /// for the specified parameter and set up LocalDeclMap.
453 void CodeGenFunction::EmitParmDecl(const VarDecl &D, llvm::Value *Arg) {
454   // FIXME: Why isn't ImplicitParamDecl a ParmVarDecl?
455   assert((isa<ParmVarDecl>(D) || isa<ImplicitParamDecl>(D)) &&
456          "Invalid argument to EmitParmDecl");
457   QualType Ty = D.getType();
458   
459   llvm::Value *DeclPtr;
460   if (!Ty->isConstantSizeType()) {
461     // Variable sized values always are passed by-reference.
462     DeclPtr = Arg;
463   } else {
464     // A fixed sized single-value variable becomes an alloca in the entry block.
465     const llvm::Type *LTy = ConvertTypeForMem(Ty);
466     if (LTy->isSingleValueType()) {
467       // TODO: Alignment
468       std::string Name = D.getNameAsString();
469       Name += ".addr";
470       DeclPtr = CreateTempAlloca(LTy);
471       DeclPtr->setName(Name.c_str());
472       
473       // Store the initial value into the alloca.
474       EmitStoreOfScalar(Arg, DeclPtr, Ty.isVolatileQualified(), Ty);
475     } else {
476       // Otherwise, if this is an aggregate, just use the input pointer.
477       DeclPtr = Arg;
478     }
479     Arg->setName(D.getNameAsString());
480   }
481
482   llvm::Value *&DMEntry = LocalDeclMap[&D];
483   assert(DMEntry == 0 && "Decl already exists in localdeclmap!");
484   DMEntry = DeclPtr;
485
486   // Emit debug info for param declaration.
487   if (CGDebugInfo *DI = getDebugInfo()) {
488     DI->setLocation(D.getLocation());
489     DI->EmitDeclareOfArgVariable(&D, DeclPtr, Builder);
490   }
491 }
492