CGCXX.cpp revision 4a28d5deeba33722aa009eab488591fb9055cc7e
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 dealing with C++ code generation. 11// 12//===----------------------------------------------------------------------===// 13 14// We might split this into multiple files if it gets too unwieldy 15 16#include "CodeGenFunction.h" 17#include "CodeGenModule.h" 18#include "Mangle.h" 19#include "clang/AST/ASTContext.h" 20#include "clang/AST/Decl.h" 21#include "clang/AST/DeclCXX.h" 22#include "clang/AST/DeclObjC.h" 23#include "llvm/ADT/StringExtras.h" 24using namespace clang; 25using namespace CodeGen; 26 27void 28CodeGenFunction::GenerateStaticCXXBlockVarDeclInit(const VarDecl &D, 29 llvm::GlobalVariable *GV) { 30 // FIXME: This should use __cxa_guard_{acquire,release}? 31 32 assert(!getContext().getLangOptions().ThreadsafeStatics && 33 "thread safe statics are currently not supported!"); 34 35 llvm::SmallString<256> GuardVName; 36 llvm::raw_svector_ostream GuardVOut(GuardVName); 37 mangleGuardVariable(&D, getContext(), GuardVOut); 38 39 // Create the guard variable. 40 llvm::GlobalValue *GuardV = 41 new llvm::GlobalVariable(CGM.getModule(), llvm::Type::Int64Ty, false, 42 GV->getLinkage(), 43 VMContext.getNullValue(llvm::Type::Int64Ty), 44 GuardVName.c_str()); 45 46 // Load the first byte of the guard variable. 47 const llvm::Type *PtrTy = VMContext.getPointerType(llvm::Type::Int8Ty, 0); 48 llvm::Value *V = Builder.CreateLoad(Builder.CreateBitCast(GuardV, PtrTy), 49 "tmp"); 50 51 // Compare it against 0. 52 llvm::Value *nullValue = VMContext.getNullValue(llvm::Type::Int8Ty); 53 llvm::Value *ICmp = Builder.CreateICmpEQ(V, nullValue , "tobool"); 54 55 llvm::BasicBlock *InitBlock = createBasicBlock("init"); 56 llvm::BasicBlock *EndBlock = createBasicBlock("init.end"); 57 58 // If the guard variable is 0, jump to the initializer code. 59 Builder.CreateCondBr(ICmp, InitBlock, EndBlock); 60 61 EmitBlock(InitBlock); 62 63 const Expr *Init = D.getInit(); 64 if (!hasAggregateLLVMType(Init->getType())) { 65 llvm::Value *V = EmitScalarExpr(Init); 66 Builder.CreateStore(V, GV, D.getType().isVolatileQualified()); 67 } else if (Init->getType()->isAnyComplexType()) { 68 EmitComplexExprIntoAddr(Init, GV, D.getType().isVolatileQualified()); 69 } else { 70 EmitAggExpr(Init, GV, D.getType().isVolatileQualified()); 71 } 72 73 Builder.CreateStore(llvm::ConstantInt::get(llvm::Type::Int8Ty, 1), 74 Builder.CreateBitCast(GuardV, PtrTy)); 75 76 EmitBlock(EndBlock); 77} 78 79RValue CodeGenFunction::EmitCXXMemberCall(const CXXMethodDecl *MD, 80 llvm::Value *Callee, 81 llvm::Value *This, 82 CallExpr::const_arg_iterator ArgBeg, 83 CallExpr::const_arg_iterator ArgEnd) { 84 assert(MD->isInstance() && 85 "Trying to emit a member call expr on a static method!"); 86 87 const FunctionProtoType *FPT = MD->getType()->getAsFunctionProtoType(); 88 89 CallArgList Args; 90 91 // Push the this ptr. 92 Args.push_back(std::make_pair(RValue::get(This), 93 MD->getThisType(getContext()))); 94 95 // And the rest of the call args 96 EmitCallArgs(Args, FPT, ArgBeg, ArgEnd); 97 98 QualType ResultType = MD->getType()->getAsFunctionType()->getResultType(); 99 return EmitCall(CGM.getTypes().getFunctionInfo(ResultType, Args), 100 Callee, Args, MD); 101} 102 103RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE) { 104 const MemberExpr *ME = cast<MemberExpr>(CE->getCallee()); 105 const CXXMethodDecl *MD = cast<CXXMethodDecl>(ME->getMemberDecl()); 106 107 const FunctionProtoType *FPT = MD->getType()->getAsFunctionProtoType(); 108 const llvm::Type *Ty = 109 CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD), 110 FPT->isVariadic()); 111 llvm::Constant *Callee = CGM.GetAddrOfFunction(GlobalDecl(MD), Ty); 112 113 llvm::Value *This; 114 115 if (ME->isArrow()) 116 This = EmitScalarExpr(ME->getBase()); 117 else { 118 LValue BaseLV = EmitLValue(ME->getBase()); 119 This = BaseLV.getAddress(); 120 } 121 122 return EmitCXXMemberCall(MD, Callee, This, 123 CE->arg_begin(), CE->arg_end()); 124} 125 126RValue 127CodeGenFunction::EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *E, 128 const CXXMethodDecl *MD) { 129 assert(MD->isInstance() && 130 "Trying to emit a member call expr on a static method!"); 131 132 133 const FunctionProtoType *FPT = MD->getType()->getAsFunctionProtoType(); 134 const llvm::Type *Ty = 135 CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD), 136 FPT->isVariadic()); 137 llvm::Constant *Callee = CGM.GetAddrOfFunction(GlobalDecl(MD), Ty); 138 139 llvm::Value *This = EmitLValue(E->getArg(0)).getAddress(); 140 141 return EmitCXXMemberCall(MD, Callee, This, 142 E->arg_begin() + 1, E->arg_end()); 143} 144 145llvm::Value *CodeGenFunction::LoadCXXThis() { 146 assert(isa<CXXMethodDecl>(CurFuncDecl) && 147 "Must be in a C++ member function decl to load 'this'"); 148 assert(cast<CXXMethodDecl>(CurFuncDecl)->isInstance() && 149 "Must be in a C++ member function decl to load 'this'"); 150 151 // FIXME: What if we're inside a block? 152 // ans: See how CodeGenFunction::LoadObjCSelf() uses 153 // CodeGenFunction::BlockForwardSelf() for how to do this. 154 return Builder.CreateLoad(LocalDeclMap[CXXThisDecl], "this"); 155} 156 157void 158CodeGenFunction::EmitCXXConstructorCall(const CXXConstructorDecl *D, 159 CXXCtorType Type, 160 llvm::Value *This, 161 CallExpr::const_arg_iterator ArgBeg, 162 CallExpr::const_arg_iterator ArgEnd) { 163 llvm::Value *Callee = CGM.GetAddrOfCXXConstructor(D, Type); 164 165 EmitCXXMemberCall(D, Callee, This, ArgBeg, ArgEnd); 166} 167 168void CodeGenFunction::EmitCXXDestructorCall(const CXXDestructorDecl *D, 169 CXXDtorType Type, 170 llvm::Value *This) { 171 llvm::Value *Callee = CGM.GetAddrOfCXXDestructor(D, Type); 172 173 EmitCXXMemberCall(D, Callee, This, 0, 0); 174} 175 176void 177CodeGenFunction::EmitCXXConstructExpr(llvm::Value *Dest, 178 const CXXConstructExpr *E) { 179 assert(Dest && "Must have a destination!"); 180 181 const CXXRecordDecl *RD = 182 cast<CXXRecordDecl>(E->getType()->getAsRecordType()->getDecl()); 183 if (RD->hasTrivialConstructor()) 184 return; 185 186 // Call the constructor. 187 EmitCXXConstructorCall(E->getConstructor(), Ctor_Complete, Dest, 188 E->arg_begin(), E->arg_end()); 189} 190 191llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) { 192 if (E->isArray()) { 193 ErrorUnsupported(E, "new[] expression"); 194 return VMContext.getUndef(ConvertType(E->getType())); 195 } 196 197 QualType AllocType = E->getAllocatedType(); 198 FunctionDecl *NewFD = E->getOperatorNew(); 199 const FunctionProtoType *NewFTy = NewFD->getType()->getAsFunctionProtoType(); 200 201 CallArgList NewArgs; 202 203 // The allocation size is the first argument. 204 QualType SizeTy = getContext().getSizeType(); 205 llvm::Value *AllocSize = 206 llvm::ConstantInt::get(ConvertType(SizeTy), 207 getContext().getTypeSize(AllocType) / 8); 208 209 NewArgs.push_back(std::make_pair(RValue::get(AllocSize), SizeTy)); 210 211 // Emit the rest of the arguments. 212 // FIXME: Ideally, this should just use EmitCallArgs. 213 CXXNewExpr::const_arg_iterator NewArg = E->placement_arg_begin(); 214 215 // First, use the types from the function type. 216 // We start at 1 here because the first argument (the allocation size) 217 // has already been emitted. 218 for (unsigned i = 1, e = NewFTy->getNumArgs(); i != e; ++i, ++NewArg) { 219 QualType ArgType = NewFTy->getArgType(i); 220 221 assert(getContext().getCanonicalType(ArgType.getNonReferenceType()). 222 getTypePtr() == 223 getContext().getCanonicalType(NewArg->getType()).getTypePtr() && 224 "type mismatch in call argument!"); 225 226 NewArgs.push_back(std::make_pair(EmitCallArg(*NewArg, ArgType), 227 ArgType)); 228 229 } 230 231 // Either we've emitted all the call args, or we have a call to a 232 // variadic function. 233 assert((NewArg == E->placement_arg_end() || NewFTy->isVariadic()) && 234 "Extra arguments in non-variadic function!"); 235 236 // If we still have any arguments, emit them using the type of the argument. 237 for (CXXNewExpr::const_arg_iterator NewArgEnd = E->placement_arg_end(); 238 NewArg != NewArgEnd; ++NewArg) { 239 QualType ArgType = NewArg->getType(); 240 NewArgs.push_back(std::make_pair(EmitCallArg(*NewArg, ArgType), 241 ArgType)); 242 } 243 244 // Emit the call to new. 245 RValue RV = 246 EmitCall(CGM.getTypes().getFunctionInfo(NewFTy->getResultType(), NewArgs), 247 CGM.GetAddrOfFunction(GlobalDecl(NewFD)), 248 NewArgs, NewFD); 249 250 // If an allocation function is declared with an empty exception specification 251 // it returns null to indicate failure to allocate storage. [expr.new]p13. 252 // (We don't need to check for null when there's no new initializer and 253 // we're allocating a POD type). 254 bool NullCheckResult = NewFTy->hasEmptyExceptionSpec() && 255 !(AllocType->isPODType() && !E->hasInitializer()); 256 257 llvm::BasicBlock *NewNull = 0; 258 llvm::BasicBlock *NewNotNull = 0; 259 llvm::BasicBlock *NewEnd = 0; 260 261 llvm::Value *NewPtr = RV.getScalarVal(); 262 263 if (NullCheckResult) { 264 NewNull = createBasicBlock("new.null"); 265 NewNotNull = createBasicBlock("new.notnull"); 266 NewEnd = createBasicBlock("new.end"); 267 268 llvm::Value *IsNull = 269 Builder.CreateICmpEQ(NewPtr, 270 VMContext.getNullValue(NewPtr->getType()), 271 "isnull"); 272 273 Builder.CreateCondBr(IsNull, NewNull, NewNotNull); 274 EmitBlock(NewNotNull); 275 } 276 277 NewPtr = Builder.CreateBitCast(NewPtr, ConvertType(E->getType())); 278 279 if (AllocType->isPODType()) { 280 if (E->getNumConstructorArgs() > 0) { 281 assert(E->getNumConstructorArgs() == 1 && 282 "Can only have one argument to initializer of POD type."); 283 284 const Expr *Init = E->getConstructorArg(0); 285 286 if (!hasAggregateLLVMType(AllocType)) 287 Builder.CreateStore(EmitScalarExpr(Init), NewPtr); 288 else if (AllocType->isAnyComplexType()) 289 EmitComplexExprIntoAddr(Init, NewPtr, AllocType.isVolatileQualified()); 290 else 291 EmitAggExpr(Init, NewPtr, AllocType.isVolatileQualified()); 292 } 293 } else { 294 // Call the constructor. 295 CXXConstructorDecl *Ctor = E->getConstructor(); 296 297 EmitCXXConstructorCall(Ctor, Ctor_Complete, NewPtr, 298 E->constructor_arg_begin(), 299 E->constructor_arg_end()); 300 } 301 302 if (NullCheckResult) { 303 Builder.CreateBr(NewEnd); 304 EmitBlock(NewNull); 305 Builder.CreateBr(NewEnd); 306 EmitBlock(NewEnd); 307 308 llvm::PHINode *PHI = Builder.CreatePHI(NewPtr->getType()); 309 PHI->reserveOperandSpace(2); 310 PHI->addIncoming(NewPtr, NewNotNull); 311 PHI->addIncoming(VMContext.getNullValue(NewPtr->getType()), NewNull); 312 313 NewPtr = PHI; 314 } 315 316 return NewPtr; 317} 318 319static bool canGenerateCXXstructor(const CXXRecordDecl *RD, 320 ASTContext &Context) { 321 // The class has base classes - we don't support that right now. 322 if (RD->getNumBases() > 0) 323 return false; 324 325 for (CXXRecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end(); 326 I != E; ++I) { 327 // We don't support ctors for fields that aren't POD. 328 if (!I->getType()->isPODType()) 329 return false; 330 } 331 332 return true; 333} 334 335void CodeGenModule::EmitCXXConstructors(const CXXConstructorDecl *D) { 336 if (!canGenerateCXXstructor(D->getParent(), getContext())) { 337 ErrorUnsupported(D, "C++ constructor", true); 338 return; 339 } 340 341 EmitGlobal(GlobalDecl(D, Ctor_Complete)); 342 EmitGlobal(GlobalDecl(D, Ctor_Base)); 343} 344 345void CodeGenModule::EmitCXXConstructor(const CXXConstructorDecl *D, 346 CXXCtorType Type) { 347 348 llvm::Function *Fn = GetAddrOfCXXConstructor(D, Type); 349 350 CodeGenFunction(*this).GenerateCode(D, Fn); 351 352 SetFunctionDefinitionAttributes(D, Fn); 353 SetLLVMFunctionAttributesForDefinition(D, Fn); 354} 355 356llvm::Function * 357CodeGenModule::GetAddrOfCXXConstructor(const CXXConstructorDecl *D, 358 CXXCtorType Type) { 359 const llvm::FunctionType *FTy = 360 getTypes().GetFunctionType(getTypes().getFunctionInfo(D), false); 361 362 const char *Name = getMangledCXXCtorName(D, Type); 363 return cast<llvm::Function>( 364 GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(D, Type))); 365} 366 367const char *CodeGenModule::getMangledCXXCtorName(const CXXConstructorDecl *D, 368 CXXCtorType Type) { 369 llvm::SmallString<256> Name; 370 llvm::raw_svector_ostream Out(Name); 371 mangleCXXCtor(D, Type, Context, Out); 372 373 Name += '\0'; 374 return UniqueMangledName(Name.begin(), Name.end()); 375} 376 377void CodeGenModule::EmitCXXDestructors(const CXXDestructorDecl *D) { 378 if (!canGenerateCXXstructor(D->getParent(), getContext())) { 379 ErrorUnsupported(D, "C++ destructor", true); 380 return; 381 } 382 383 EmitCXXDestructor(D, Dtor_Complete); 384 EmitCXXDestructor(D, Dtor_Base); 385} 386 387void CodeGenModule::EmitCXXDestructor(const CXXDestructorDecl *D, 388 CXXDtorType Type) { 389 llvm::Function *Fn = GetAddrOfCXXDestructor(D, Type); 390 391 CodeGenFunction(*this).GenerateCode(D, Fn); 392 393 SetFunctionDefinitionAttributes(D, Fn); 394 SetLLVMFunctionAttributesForDefinition(D, Fn); 395} 396 397llvm::Function * 398CodeGenModule::GetAddrOfCXXDestructor(const CXXDestructorDecl *D, 399 CXXDtorType Type) { 400 const llvm::FunctionType *FTy = 401 getTypes().GetFunctionType(getTypes().getFunctionInfo(D), false); 402 403 const char *Name = getMangledCXXDtorName(D, Type); 404 return cast<llvm::Function>( 405 GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(D, Type))); 406} 407 408const char *CodeGenModule::getMangledCXXDtorName(const CXXDestructorDecl *D, 409 CXXDtorType Type) { 410 llvm::SmallString<256> Name; 411 llvm::raw_svector_ostream Out(Name); 412 mangleCXXDtor(D, Type, Context, Out); 413 414 Name += '\0'; 415 return UniqueMangledName(Name.begin(), Name.end()); 416} 417 418/// EmitCtorPrologue - This routine generates necessary code to initialize 419/// base classes and non-static data members belonging to this constructor. 420void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD) { 421 for (CXXConstructorDecl::init_const_iterator B = CD->init_begin(), 422 E = CD->init_end(); 423 B != E; ++B) { 424 CXXBaseOrMemberInitializer *Member = (*B); 425 if (Member->isBaseInitializer()) { 426 // FIXME. Added base initialilzers here. 427 assert(false && "FIXME. base initialization unsupported"); 428 } 429 else { 430 // non-static data member initilaizers. 431 FieldDecl *Field = Member->getMember(); 432 QualType FieldType = getContext().getCanonicalType((Field)->getType()); 433 assert(!getContext().getAsArrayType(FieldType) 434 && "FIXME. Field arrays initialization unsupported"); 435 436 llvm::Value *LoadOfThis = LoadCXXThis(); 437 LValue LHS = EmitLValueForField(LoadOfThis, Field, false, 0); 438 if (FieldType->getAsRecordType()) { 439 440 assert(Member->getConstructor() && 441 "EmitCtorPrologue - no constructor to initialize member"); 442 EmitCXXConstructorCall(Member->getConstructor(), 443 Ctor_Complete, LHS.getAddress(), 444 Member->const_arg_begin(), 445 Member->const_arg_end()); 446 continue; 447 } 448 449 assert(Member->getNumArgs() == 1 && "Initializer count must be 1 only"); 450 Expr *RhsExpr = *Member->arg_begin(); 451 llvm::Value *RHS = EmitScalarExpr(RhsExpr, true); 452 if (LHS.isBitfield()) 453 EmitStoreThroughBitfieldLValue(RValue::get(RHS), LHS, FieldType, 0); 454 else 455 EmitStoreThroughLValue(RValue::get(RHS), LHS, FieldType); 456 } 457 } 458} 459