CodeGenFunction.cpp revision 984d0b414bc76d3530b9bc55a5a55834ba76c607
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- CodeGenFunction.cpp - Emit LLVM Code from ASTs for a Function ----===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This coordinates the per-function state used while generating code. 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "CodeGenFunction.h" 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "CodeGenModule.h" 165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/TargetInfo.h" 175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/AST.h" 18440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman#include "llvm/CallingConv.h" 195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/Constants.h" 205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/DerivedTypes.h" 215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/Function.h" 225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/Analysis/Verifier.h" 23d9363c3a80168283b3da518b4e17f545a6246857Devang Patel#include "llvm/Support/CFG.h" 245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace CodeGen; 265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerCodeGenFunction::CodeGenFunction(CodeGenModule &cgm) 28c049e4f406a7f7179eba98659044a32508e53289Devang Patel : CGM(cgm), Target(CGM.getContext().Target), SwitchInsn(NULL), 29ce5605ecf76d8cde6372138f830bb144d174ced9Chris Lattner CaseRangeBlock(NULL) {} 305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerASTContext &CodeGenFunction::getContext() const { 325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return CGM.getContext(); 335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerllvm::BasicBlock *CodeGenFunction::getBasicBlockForLabel(const LabelStmt *S) { 375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::BasicBlock *&BB = LabelMap[S]; 385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (BB) return BB; 395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Create, but don't insert, the new block. 41984d0b414bc76d3530b9bc55a5a55834ba76c607Gabor Greif return BB = llvm::BasicBlock::Create(S->getName()); 425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 44813733577d33ec56479667b49e1bff42dc6bba90Lauro Ramos Venanciollvm::Constant * 45813733577d33ec56479667b49e1bff42dc6bba90Lauro Ramos VenancioCodeGenFunction::GetAddrOfStaticLocalVar(const BlockVarDecl *BVD) { 46813733577d33ec56479667b49e1bff42dc6bba90Lauro Ramos Venancio return cast<llvm::Constant>(LocalDeclMap[BVD]); 47813733577d33ec56479667b49e1bff42dc6bba90Lauro Ramos Venancio} 485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerconst llvm::Type *CodeGenFunction::ConvertType(QualType T) { 505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return CGM.getTypes().ConvertType(T); 515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool CodeGenFunction::hasAggregateLLVMType(QualType T) { 54423a3c9c2719fb75133673e72ac881719df45dafChris Lattner return !T->isRealType() && !T->isPointerLikeType() && 55793680ed8104bf088d1b382b963a8badcb3f07deAnders Carlsson !T->isVoidType() && !T->isVectorType() && !T->isFunctionType(); 565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 58391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner/// Generate an Objective-C method. An Objective-C method is a C function with 59391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner/// its pointer, name, and types registered in the class struture. 60391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner// FIXME: This method contains a lot of code copied and pasted from 61391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner// GenerateCode. This should be factored out. 62391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattnervoid CodeGenFunction::GenerateObjCMethod(const ObjCMethodDecl *OMD) { 63391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner llvm::SmallVector<const llvm::Type *, 16> ParamTypes; 64391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner for (unsigned i=0 ; i<OMD->param_size() ; i++) { 65391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner ParamTypes.push_back(ConvertType(OMD->getParamDecl(i)->getType())); 66391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner } 67ce5605ecf76d8cde6372138f830bb144d174ced9Chris Lattner CurFn =CGM.getObjCRuntime()->MethodPreamble(ConvertType(OMD->getResultType()), 68ce5605ecf76d8cde6372138f830bb144d174ced9Chris Lattner llvm::PointerType::getUnqual(llvm::Type::Int32Ty), 69ce5605ecf76d8cde6372138f830bb144d174ced9Chris Lattner ParamTypes.begin(), 70ce5605ecf76d8cde6372138f830bb144d174ced9Chris Lattner OMD->param_size(), 71ce5605ecf76d8cde6372138f830bb144d174ced9Chris Lattner OMD->isVariadic()); 72984d0b414bc76d3530b9bc55a5a55834ba76c607Gabor Greif llvm::BasicBlock *EntryBB = llvm::BasicBlock::Create("entry", CurFn); 73391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner 74391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // Create a marker to make it easy to insert allocas into the entryblock 75391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // later. Don't create this with the builder, because we don't want it 76391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // folded. 77391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner llvm::Value *Undef = llvm::UndefValue::get(llvm::Type::Int32Ty); 78391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner AllocaInsertPt = new llvm::BitCastInst(Undef, llvm::Type::Int32Ty, "allocapt", 79391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner EntryBB); 80391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner 81391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner FnRetTy = OMD->getResultType(); 82391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner 83391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner Builder.SetInsertPoint(EntryBB); 84391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner 85391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // Emit allocs for param decls. Give the LLVM Argument nodes names. 86391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner llvm::Function::arg_iterator AI = CurFn->arg_begin(); 87391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner 88391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // Name the struct return argument. 89391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // FIXME: Probably should be in the runtime, or it will trample the other 90391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // hidden arguments. 91391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner if (hasAggregateLLVMType(OMD->getResultType())) { 92391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner AI->setName("agg.result"); 93391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner ++AI; 94391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner } 95391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner 96391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // Add implicit parameters to the decl map. 97391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // TODO: Add something to AST to let the runtime specify the names and types 98391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // of these. 99391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner llvm::Value *&DMEntry = LocalDeclMap[&(*OMD->getSelfDecl())]; 100c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner const llvm::Type *SelfTy = AI->getType(); 101c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner llvm::Value *DeclPtr = new llvm::AllocaInst(SelfTy, 0, "self.addr", 102c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner AllocaInsertPt); 103c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner 104c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner // Store the initial value into the alloca. 105c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner Builder.CreateStore(AI, DeclPtr); 106c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner DMEntry = DeclPtr; 107391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner ++AI; ++AI; 108391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner 109391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner 110391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner for (unsigned i = 0, e = OMD->getNumParams(); i != e; ++i, ++AI) { 111391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner assert(AI != CurFn->arg_end() && "Argument mismatch!"); 112391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner EmitParmDecl(*OMD->getParamDecl(i), AI); 113391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner } 114391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner 115391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // Emit the function body. 116391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner EmitStmt(OMD->getBody()); 117391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner 118391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // Emit a return for code that falls off the end. If insert point 119391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // is a dummy block with no predecessors then remove the block itself. 120391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner llvm::BasicBlock *BB = Builder.GetInsertBlock(); 121391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner if (isDummyBlock(BB)) 122391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner BB->eraseFromParent(); 123391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner else { 124391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner if (CurFn->getReturnType() == llvm::Type::VoidTy) 125391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner Builder.CreateRetVoid(); 126391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner else 127391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner Builder.CreateRet(llvm::UndefValue::get(CurFn->getReturnType())); 128391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner } 129391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner assert(BreakContinueStack.empty() && 130391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner "mismatched push/pop in break/continue stack!"); 131391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner 132391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // Remove the AllocaInsertPt instruction, which is just a convenience for us. 133391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner AllocaInsertPt->eraseFromParent(); 134391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner AllocaInsertPt = 0; 135391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // Verify that the function is well formed. 136391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner assert(!verifyFunction(*CurFn) && "Generated method is not well formed."); 137391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner} 1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 139c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattnerllvm::Value *CodeGenFunction::LoadObjCSelf(void) 140c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner{ 141c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner if(const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(CurFuncDecl)) { 142c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner llvm::Value *SelfPtr = LocalDeclMap[&(*OMD->getSelfDecl())]; 143c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner return Builder.CreateLoad(SelfPtr, "self"); 144c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner } 145c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner return NULL; 146c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner} 147c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner 1485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid CodeGenFunction::GenerateCode(const FunctionDecl *FD) { 1495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer LLVMIntTy = ConvertType(getContext().IntTy); 15047f7dbf7c0b25505ad093a317983a9b39efe0610Chris Lattner LLVMPointerWidth = static_cast<unsigned>( 15198be4943e8dc4f3905629a7102668960873cf863Chris Lattner getContext().getTypeSize(getContext().getPointerType(getContext().VoidTy))); 1525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer CurFuncDecl = FD; 154c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner FnRetTy = FD->getType()->getAsFunctionType()->getResultType(); 155391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner 156391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner 1579cd4fe4af6d3e8b6dcfce9c2cdefcaafca7eed7cChris Lattner CurFn = cast<llvm::Function>(CGM.GetAddrOfFunctionDecl(FD, true)); 1585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(CurFn->isDeclaration() && "Function already has body?"); 1595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1605c6a42aeccd5134216e12408634577ce5a517505Chris Lattner // TODO: Set up linkage and many other things. Note, this is a simple 1615c6a42aeccd5134216e12408634577ce5a517505Chris Lattner // approximation of what we really want. 162ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner if (FD->getAttr<DLLImportAttr>()) 163ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner CurFn->setLinkage(llvm::Function::DLLImportLinkage); 164ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner else if (FD->getAttr<DLLExportAttr>()) 165ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner CurFn->setLinkage(llvm::Function::DLLExportLinkage); 166ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner else if (FD->getAttr<WeakAttr>() || FD->isInline()) 1675c6a42aeccd5134216e12408634577ce5a517505Chris Lattner CurFn->setLinkage(llvm::Function::WeakLinkage); 168ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner else if (FD->getStorageClass() == FunctionDecl::Static) 169ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner CurFn->setLinkage(llvm::Function::InternalLinkage); 170ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 171440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman if (FD->getAttr<FastCallAttr>()) 172440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman CurFn->setCallingConv(llvm::CallingConv::Fast); 173440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman 174ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner if (const VisibilityAttr *attr = FD->getAttr<VisibilityAttr>()) 175ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner CurFn->setVisibility(attr->getVisibility()); 176ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // FIXME: else handle -fvisibility 177ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 178ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 179f89e88d1278828e43d4a67687ba96af88a66d634Chris Lattner unsigned FuncAttrs = 0; 180ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner if (FD->getAttr<NoThrowAttr>()) 181f89e88d1278828e43d4a67687ba96af88a66d634Chris Lattner FuncAttrs |= llvm::ParamAttr::NoUnwind; 182ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner if (FD->getAttr<NoReturnAttr>()) 183f89e88d1278828e43d4a67687ba96af88a66d634Chris Lattner FuncAttrs |= llvm::ParamAttr::NoReturn; 184f89e88d1278828e43d4a67687ba96af88a66d634Chris Lattner 185f89e88d1278828e43d4a67687ba96af88a66d634Chris Lattner if (FuncAttrs) { 186e0e0c94fa26abeef39166fc0d50e901ba3a1a638Chris Lattner llvm::ParamAttrsWithIndex PAWI = 187e0e0c94fa26abeef39166fc0d50e901ba3a1a638Chris Lattner llvm::ParamAttrsWithIndex::get(0, FuncAttrs); 188e0e0c94fa26abeef39166fc0d50e901ba3a1a638Chris Lattner CurFn->setParamAttrs(llvm::PAListPtr::get(&PAWI, 1)); 189f89e88d1278828e43d4a67687ba96af88a66d634Chris Lattner } 190ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 191984d0b414bc76d3530b9bc55a5a55834ba76c607Gabor Greif llvm::BasicBlock *EntryBB = llvm::BasicBlock::Create("entry", CurFn); 1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Create a marker to make it easy to insert allocas into the entryblock 19455352a2d616cf9fbb621d10faf8b960b4b268bd8Chris Lattner // later. Don't create this with the builder, because we don't want it 19555352a2d616cf9fbb621d10faf8b960b4b268bd8Chris Lattner // folded. 1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::Value *Undef = llvm::UndefValue::get(llvm::Type::Int32Ty); 19755352a2d616cf9fbb621d10faf8b960b4b268bd8Chris Lattner AllocaInsertPt = new llvm::BitCastInst(Undef, llvm::Type::Int32Ty, "allocapt", 19855352a2d616cf9fbb621d10faf8b960b4b268bd8Chris Lattner EntryBB); 19955352a2d616cf9fbb621d10faf8b960b4b268bd8Chris Lattner 20055352a2d616cf9fbb621d10faf8b960b4b268bd8Chris Lattner Builder.SetInsertPoint(EntryBB); 2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Emit allocs for param decls. Give the LLVM Argument nodes names. 2035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::Function::arg_iterator AI = CurFn->arg_begin(); 2045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Name the struct return argument. 2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (hasAggregateLLVMType(FD->getResultType())) { 2075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer AI->setName("agg.result"); 2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ++AI; 2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0, e = FD->getNumParams(); i != e; ++i, ++AI) { 2125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(AI != CurFn->arg_end() && "Argument mismatch!"); 2135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer EmitParmDecl(*FD->getParamDecl(i), AI); 2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Emit the function body. 2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer EmitStmt(FD->getBody()); 2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 219d9363c3a80168283b3da518b4e17f545a6246857Devang Patel // Emit a return for code that falls off the end. If insert point 220d9363c3a80168283b3da518b4e17f545a6246857Devang Patel // is a dummy block with no predecessors then remove the block itself. 221d9363c3a80168283b3da518b4e17f545a6246857Devang Patel llvm::BasicBlock *BB = Builder.GetInsertBlock(); 222d9363c3a80168283b3da518b4e17f545a6246857Devang Patel if (isDummyBlock(BB)) 223d9363c3a80168283b3da518b4e17f545a6246857Devang Patel BB->eraseFromParent(); 224d9363c3a80168283b3da518b4e17f545a6246857Devang Patel else { 225d9363c3a80168283b3da518b4e17f545a6246857Devang Patel // FIXME: if this is C++ main, this should return 0. 226d9363c3a80168283b3da518b4e17f545a6246857Devang Patel if (CurFn->getReturnType() == llvm::Type::VoidTy) 227d9363c3a80168283b3da518b4e17f545a6246857Devang Patel Builder.CreateRetVoid(); 228d9363c3a80168283b3da518b4e17f545a6246857Devang Patel else 229d9363c3a80168283b3da518b4e17f545a6246857Devang Patel Builder.CreateRet(llvm::UndefValue::get(CurFn->getReturnType())); 230d9363c3a80168283b3da518b4e17f545a6246857Devang Patel } 231da13870e99fe33934b2122f06528a5063f78ae4cChris Lattner assert(BreakContinueStack.empty() && 232da13870e99fe33934b2122f06528a5063f78ae4cChris Lattner "mismatched push/pop in break/continue stack!"); 233da13870e99fe33934b2122f06528a5063f78ae4cChris Lattner 2345a2fa14860813a8b93f68a84063dd20c690f045aChris Lattner // Remove the AllocaInsertPt instruction, which is just a convenience for us. 2355a2fa14860813a8b93f68a84063dd20c690f045aChris Lattner AllocaInsertPt->eraseFromParent(); 2365a2fa14860813a8b93f68a84063dd20c690f045aChris Lattner AllocaInsertPt = 0; 2375a2fa14860813a8b93f68a84063dd20c690f045aChris Lattner 2385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Verify that the function is well formed. 239391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner assert(!verifyFunction(*CurFn) && "Generated function is not well formed."); 2405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 242d9363c3a80168283b3da518b4e17f545a6246857Devang Patel/// isDummyBlock - Return true if BB is an empty basic block 243d9363c3a80168283b3da518b4e17f545a6246857Devang Patel/// with no predecessors. 244d9363c3a80168283b3da518b4e17f545a6246857Devang Patelbool CodeGenFunction::isDummyBlock(const llvm::BasicBlock *BB) { 245d9363c3a80168283b3da518b4e17f545a6246857Devang Patel if (BB->empty() && pred_begin(BB) == pred_end(BB)) 246d9363c3a80168283b3da518b4e17f545a6246857Devang Patel return true; 247d9363c3a80168283b3da518b4e17f545a6246857Devang Patel return false; 248d9363c3a80168283b3da518b4e17f545a6246857Devang Patel} 249d9363c3a80168283b3da518b4e17f545a6246857Devang Patel 25051b09f2c528c8460b5465c676173324e44176d62Devang Patel/// StartBlock - Start new block named N. If insert block is a dummy block 25151b09f2c528c8460b5465c676173324e44176d62Devang Patel/// then reuse it. 25251b09f2c528c8460b5465c676173324e44176d62Devang Patelvoid CodeGenFunction::StartBlock(const char *N) { 25351b09f2c528c8460b5465c676173324e44176d62Devang Patel llvm::BasicBlock *BB = Builder.GetInsertBlock(); 25451b09f2c528c8460b5465c676173324e44176d62Devang Patel if (!isDummyBlock(BB)) 255984d0b414bc76d3530b9bc55a5a55834ba76c607Gabor Greif EmitBlock(llvm::BasicBlock::Create(N)); 25651b09f2c528c8460b5465c676173324e44176d62Devang Patel else 25751b09f2c528c8460b5465c676173324e44176d62Devang Patel BB->setName(N); 25851b09f2c528c8460b5465c676173324e44176d62Devang Patel} 25951b09f2c528c8460b5465c676173324e44176d62Devang Patel 26088a981b47c7face1b1fdaa9074256245107b9ca9Devang Patel/// getCGRecordLayout - Return record layout info. 26188a981b47c7face1b1fdaa9074256245107b9ca9Devang Patelconst CGRecordLayout *CodeGenFunction::getCGRecordLayout(CodeGenTypes &CGT, 262af31913e48c96fddb45a0fd33f25617546502cbbChris Lattner QualType Ty) { 263af31913e48c96fddb45a0fd33f25617546502cbbChris Lattner const RecordType *RTy = Ty->getAsRecordType(); 264af31913e48c96fddb45a0fd33f25617546502cbbChris Lattner assert (RTy && "Unexpected type. RecordType expected here."); 265b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel 266af31913e48c96fddb45a0fd33f25617546502cbbChris Lattner return CGT.getCGRecordLayout(RTy->getDecl()); 267b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel} 268dc5e8268292046114ffe02e48773572a91a310f1Chris Lattner 269dc5e8268292046114ffe02e48773572a91a310f1Chris Lattner/// WarnUnsupported - Print out a warning that codegen doesn't support the 270dc5e8268292046114ffe02e48773572a91a310f1Chris Lattner/// specified stmt yet. 271dc4d280136d3301fcbf3c7b4b2782c8bd804342cChris Lattnervoid CodeGenFunction::WarnUnsupported(const Stmt *S, const char *Type) { 2722c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner CGM.WarnUnsupported(S, Type); 273dc5e8268292046114ffe02e48773572a91a310f1Chris Lattner} 274dc5e8268292046114ffe02e48773572a91a310f1Chris Lattner 275