CodeGenFunction.cpp revision 248a753f6b670692523c99afaeb8fe98f7ae3ca7
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 *
45248a753f6b670692523c99afaeb8fe98f7ae3ca7Steve NaroffCodeGenFunction::GetAddrOfStaticLocalVar(const VarDecl *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