CodeGenFunction.cpp revision 76526a5245ec2283b0c85fcef507d4c2dec90715
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" 163f2af1002249c8acc9ce17f1fc50324864feb8e1Eli Friedman#include "CGDebugInfo.h" 175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/TargetInfo.h" 185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/AST.h" 19440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman#include "llvm/CallingConv.h" 205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/Constants.h" 215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/DerivedTypes.h" 225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/Function.h" 235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/Analysis/Verifier.h" 24d9363c3a80168283b3da518b4e17f545a6246857Devang Patel#include "llvm/Support/CFG.h" 255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace CodeGen; 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerCodeGenFunction::CodeGenFunction(CodeGenModule &cgm) 29c049e4f406a7f7179eba98659044a32508e53289Devang Patel : CGM(cgm), Target(CGM.getContext().Target), SwitchInsn(NULL), 304111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner CaseRangeBlock(NULL) { 314111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner LLVMIntTy = ConvertType(getContext().IntTy); 324111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner LLVMPointerWidth = Target.getPointerWidth(0); 334111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner} 345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerASTContext &CodeGenFunction::getContext() const { 365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return CGM.getContext(); 375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerllvm::BasicBlock *CodeGenFunction::getBasicBlockForLabel(const LabelStmt *S) { 415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::BasicBlock *&BB = LabelMap[S]; 425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (BB) return BB; 435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Create, but don't insert, the new block. 45984d0b414bc76d3530b9bc55a5a55834ba76c607Gabor Greif return BB = llvm::BasicBlock::Create(S->getName()); 465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 48813733577d33ec56479667b49e1bff42dc6bba90Lauro Ramos Venanciollvm::Constant * 49248a753f6b670692523c99afaeb8fe98f7ae3ca7Steve NaroffCodeGenFunction::GetAddrOfStaticLocalVar(const VarDecl *BVD) { 50813733577d33ec56479667b49e1bff42dc6bba90Lauro Ramos Venancio return cast<llvm::Constant>(LocalDeclMap[BVD]); 51813733577d33ec56479667b49e1bff42dc6bba90Lauro Ramos Venancio} 525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerconst llvm::Type *CodeGenFunction::ConvertType(QualType T) { 545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return CGM.getTypes().ConvertType(T); 555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 574111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattnerbool CodeGenFunction::isObjCPointerType(QualType T) { 584111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner // All Objective-C types are pointers. 594111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner return T->isObjCInterfaceType() || 604111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner T->isObjCQualifiedInterfaceType() || T->isObjCQualifiedIdType(); 615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 634111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattnerbool CodeGenFunction::hasAggregateLLVMType(QualType T) { 644111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner return !isObjCPointerType(T) &&!T->isRealType() && !T->isPointerLikeType() && 654111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner !T->isVoidType() && !T->isVectorType() && !T->isFunctionType(); 664111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner} 67391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner 684111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattnervoid CodeGenFunction::GenerateFunction(const Stmt *Body) { 69391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // Emit the function body. 704111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner EmitStmt(Body); 710ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar 720ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar // Finish emission of indirect switches. 730ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar EmitIndirectSwitches(); 740ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar 75af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta // Emit debug descriptor for function end. 76af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta CGDebugInfo *DI = CGM.getDebugInfo(); 77af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta if (DI) { 78af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta const CompoundStmt* s = dyn_cast<CompoundStmt>(Body); 79af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta if (s && s->getRBracLoc().isValid()) { 80af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta DI->setLocation(s->getRBracLoc()); 81af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta } 82af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta DI->EmitRegionEnd(CurFn, Builder); 83af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta } 84af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta 85391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // Emit a return for code that falls off the end. If insert point 86391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // is a dummy block with no predecessors then remove the block itself. 87391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner llvm::BasicBlock *BB = Builder.GetInsertBlock(); 88391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner if (isDummyBlock(BB)) 89391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner BB->eraseFromParent(); 90391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner else { 914111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner // FIXME: if this is C++ main, this should return 0. 92391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner if (CurFn->getReturnType() == llvm::Type::VoidTy) 93391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner Builder.CreateRetVoid(); 94391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner else 95391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner Builder.CreateRet(llvm::UndefValue::get(CurFn->getReturnType())); 96391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner } 97391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner assert(BreakContinueStack.empty() && 98391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner "mismatched push/pop in break/continue stack!"); 99391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner 100391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // Remove the AllocaInsertPt instruction, which is just a convenience for us. 101391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner AllocaInsertPt->eraseFromParent(); 102391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner AllocaInsertPt = 0; 1034111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner 104391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // Verify that the function is well formed. 1054111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner assert(!verifyFunction(*CurFn) && "Generated function is not well formed."); 106c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner} 107c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner 108bd012ff1fa088181646a784f385b28867372d434Daniel Dunbarvoid CodeGenFunction::GenerateCode(const FunctionDecl *FD, 109bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar llvm::Function *Fn) { 1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer CurFuncDecl = FD; 1114111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner FnRetTy = FD->getResultType(); 112bd012ff1fa088181646a784f385b28867372d434Daniel Dunbar CurFn = Fn; 1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(CurFn->isDeclaration() && "Function already has body?"); 114ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 115984d0b414bc76d3530b9bc55a5a55834ba76c607Gabor Greif llvm::BasicBlock *EntryBB = llvm::BasicBlock::Create("entry", CurFn); 1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Create a marker to make it easy to insert allocas into the entryblock 11855352a2d616cf9fbb621d10faf8b960b4b268bd8Chris Lattner // later. Don't create this with the builder, because we don't want it 11955352a2d616cf9fbb621d10faf8b960b4b268bd8Chris Lattner // folded. 1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::Value *Undef = llvm::UndefValue::get(llvm::Type::Int32Ty); 12155352a2d616cf9fbb621d10faf8b960b4b268bd8Chris Lattner AllocaInsertPt = new llvm::BitCastInst(Undef, llvm::Type::Int32Ty, "allocapt", 12255352a2d616cf9fbb621d10faf8b960b4b268bd8Chris Lattner EntryBB); 12355352a2d616cf9fbb621d10faf8b960b4b268bd8Chris Lattner 12455352a2d616cf9fbb621d10faf8b960b4b268bd8Chris Lattner Builder.SetInsertPoint(EntryBB); 1254111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner 126af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta // Emit subprogram debug descriptor. 127af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta CGDebugInfo *DI = CGM.getDebugInfo(); 128af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta if (DI) { 129af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta CompoundStmt* body = dyn_cast<CompoundStmt>(FD->getBody()); 130af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta if (body && body->getLBracLoc().isValid()) { 131af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta DI->setLocation(body->getLBracLoc()); 132af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta } 133af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta DI->EmitFunctionStart(FD, CurFn, Builder); 134af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta } 135af99417156c652a6f04dff643925036dc3241d60Sanjiv Gupta 1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Emit allocs for param decls. Give the LLVM Argument nodes names. 1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::Function::arg_iterator AI = CurFn->arg_begin(); 1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Name the struct return argument. 1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (hasAggregateLLVMType(FD->getResultType())) { 1415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer AI->setName("agg.result"); 1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ++AI; 1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0, e = FD->getNumParams(); i != e; ++i, ++AI) { 1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(AI != CurFn->arg_end() && "Argument mismatch!"); 1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer EmitParmDecl(*FD->getParamDecl(i), AI); 1485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1494111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner GenerateFunction(FD->getBody()); 1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 152d9363c3a80168283b3da518b4e17f545a6246857Devang Patel/// isDummyBlock - Return true if BB is an empty basic block 153d9363c3a80168283b3da518b4e17f545a6246857Devang Patel/// with no predecessors. 154d9363c3a80168283b3da518b4e17f545a6246857Devang Patelbool CodeGenFunction::isDummyBlock(const llvm::BasicBlock *BB) { 1551e9660e1fb11efb7e65799bc145c0e2b6f3562beChris Lattner if (BB->empty() && pred_begin(BB) == pred_end(BB) && !BB->hasName()) 156d9363c3a80168283b3da518b4e17f545a6246857Devang Patel return true; 157d9363c3a80168283b3da518b4e17f545a6246857Devang Patel return false; 158d9363c3a80168283b3da518b4e17f545a6246857Devang Patel} 159d9363c3a80168283b3da518b4e17f545a6246857Devang Patel 16051b09f2c528c8460b5465c676173324e44176d62Devang Patel/// StartBlock - Start new block named N. If insert block is a dummy block 16151b09f2c528c8460b5465c676173324e44176d62Devang Patel/// then reuse it. 16251b09f2c528c8460b5465c676173324e44176d62Devang Patelvoid CodeGenFunction::StartBlock(const char *N) { 16351b09f2c528c8460b5465c676173324e44176d62Devang Patel llvm::BasicBlock *BB = Builder.GetInsertBlock(); 16451b09f2c528c8460b5465c676173324e44176d62Devang Patel if (!isDummyBlock(BB)) 165984d0b414bc76d3530b9bc55a5a55834ba76c607Gabor Greif EmitBlock(llvm::BasicBlock::Create(N)); 16651b09f2c528c8460b5465c676173324e44176d62Devang Patel else 16751b09f2c528c8460b5465c676173324e44176d62Devang Patel BB->setName(N); 16851b09f2c528c8460b5465c676173324e44176d62Devang Patel} 16951b09f2c528c8460b5465c676173324e44176d62Devang Patel 17088a981b47c7face1b1fdaa9074256245107b9ca9Devang Patel/// getCGRecordLayout - Return record layout info. 17188a981b47c7face1b1fdaa9074256245107b9ca9Devang Patelconst CGRecordLayout *CodeGenFunction::getCGRecordLayout(CodeGenTypes &CGT, 172af31913e48c96fddb45a0fd33f25617546502cbbChris Lattner QualType Ty) { 173af31913e48c96fddb45a0fd33f25617546502cbbChris Lattner const RecordType *RTy = Ty->getAsRecordType(); 174af31913e48c96fddb45a0fd33f25617546502cbbChris Lattner assert (RTy && "Unexpected type. RecordType expected here."); 175b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel 176af31913e48c96fddb45a0fd33f25617546502cbbChris Lattner return CGT.getCGRecordLayout(RTy->getDecl()); 177b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel} 178dc5e8268292046114ffe02e48773572a91a310f1Chris Lattner 179dc5e8268292046114ffe02e48773572a91a310f1Chris Lattner/// WarnUnsupported - Print out a warning that codegen doesn't support the 180dc5e8268292046114ffe02e48773572a91a310f1Chris Lattner/// specified stmt yet. 181dc4d280136d3301fcbf3c7b4b2782c8bd804342cChris Lattnervoid CodeGenFunction::WarnUnsupported(const Stmt *S, const char *Type) { 1822c8569d5f43f7de1fb993e84c95ea571dd9ac55eChris Lattner CGM.WarnUnsupported(S, Type); 183dc5e8268292046114ffe02e48773572a91a310f1Chris Lattner} 184dc5e8268292046114ffe02e48773572a91a310f1Chris Lattner 1850ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbarunsigned CodeGenFunction::GetIDForAddrOfLabel(const LabelStmt *L) { 1860ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar // Use LabelIDs.size() as the new ID if one hasn't been assigned. 1870ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar return LabelIDs.insert(std::make_pair(L, LabelIDs.size())).first->second; 1880ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar} 1890ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar 1900ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbarvoid CodeGenFunction::EmitIndirectSwitches() { 1910ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar llvm::BasicBlock *Default; 1920ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar 19376526a5245ec2283b0c85fcef507d4c2dec90715Daniel Dunbar if (IndirectSwitches.empty()) 19476526a5245ec2283b0c85fcef507d4c2dec90715Daniel Dunbar return; 19576526a5245ec2283b0c85fcef507d4c2dec90715Daniel Dunbar 1960ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar if (!LabelIDs.empty()) { 1970ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar Default = getBasicBlockForLabel(LabelIDs.begin()->first); 1980ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar } else { 1990ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar // No possible targets for indirect goto, just emit an infinite 2000ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar // loop. 2010ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar Default = llvm::BasicBlock::Create("indirectgoto.loop", CurFn); 2020ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar llvm::BranchInst::Create(Default, Default); 2030ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar } 2040ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar 2050ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar for (std::vector<llvm::SwitchInst*>::iterator i = IndirectSwitches.begin(), 2060ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar e = IndirectSwitches.end(); i != e; ++i) { 2070ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar llvm::SwitchInst *I = *i; 2080ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar 2090ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar I->setSuccessor(0, Default); 2100ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar for (std::map<const LabelStmt*,unsigned>::iterator LI = LabelIDs.begin(), 2110ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar LE = LabelIDs.end(); LI != LE; ++LI) { 2120ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar I->addCase(llvm::ConstantInt::get(llvm::Type::Int32Ty, 2130ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar LI->second), 2140ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar getBasicBlockForLabel(LI->first)); 2150ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar } 2160ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar } 2170ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar} 218