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