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