CGStmt.cpp revision 64d5d6c5903157c521af496479d06dc26032d718
1//===--- CGStmt.cpp - Emit LLVM Code from Statements ----------------------===//
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 to emit Stmt nodes as LLVM code.
11//
12//===----------------------------------------------------------------------===//
13
14#include "CGDebugInfo.h"
15#include "CodeGenModule.h"
16#include "CodeGenFunction.h"
17#include "clang/AST/StmtVisitor.h"
18#include "clang/Basic/TargetInfo.h"
19#include "llvm/InlineAsm.h"
20#include "llvm/ADT/StringExtras.h"
21using namespace clang;
22using namespace CodeGen;
23
24//===----------------------------------------------------------------------===//
25//                              Statement Emission
26//===----------------------------------------------------------------------===//
27
28void CodeGenFunction::EmitStmt(const Stmt *S) {
29  assert(S && "Null statement?");
30
31  // Generate stoppoints if we are emitting debug info.
32  // Beginning of a Compound Statement (e.g. an opening '{') does not produce
33  // executable code. So do not generate a stoppoint for that.
34  CGDebugInfo *DI = CGM.getDebugInfo();
35  if (DI && S->getStmtClass() != Stmt::CompoundStmtClass) {
36    if (S->getLocStart().isValid()) {
37        DI->setLocation(S->getLocStart());
38    }
39
40    DI->EmitStopPoint(CurFn, Builder);
41  }
42
43  switch (S->getStmtClass()) {
44  default:
45    // Must be an expression in a stmt context.  Emit the value (to get
46    // side-effects) and ignore the result.
47    if (const Expr *E = dyn_cast<Expr>(S)) {
48      if (!hasAggregateLLVMType(E->getType()))
49        EmitScalarExpr(E);
50      else if (E->getType()->isAnyComplexType())
51        EmitComplexExpr(E);
52      else
53        EmitAggExpr(E, 0, false);
54    } else {
55      ErrorUnsupported(S, "statement");
56    }
57    break;
58  case Stmt::NullStmtClass: break;
59  case Stmt::CompoundStmtClass: EmitCompoundStmt(cast<CompoundStmt>(*S)); break;
60  case Stmt::LabelStmtClass:    EmitLabelStmt(cast<LabelStmt>(*S));       break;
61  case Stmt::GotoStmtClass:     EmitGotoStmt(cast<GotoStmt>(*S));         break;
62  case Stmt::IndirectGotoStmtClass:
63    EmitIndirectGotoStmt(cast<IndirectGotoStmt>(*S)); break;
64
65  case Stmt::IfStmtClass:       EmitIfStmt(cast<IfStmt>(*S));             break;
66  case Stmt::WhileStmtClass:    EmitWhileStmt(cast<WhileStmt>(*S));       break;
67  case Stmt::DoStmtClass:       EmitDoStmt(cast<DoStmt>(*S));             break;
68  case Stmt::ForStmtClass:      EmitForStmt(cast<ForStmt>(*S));           break;
69
70  case Stmt::ReturnStmtClass:   EmitReturnStmt(cast<ReturnStmt>(*S));     break;
71  case Stmt::DeclStmtClass:     EmitDeclStmt(cast<DeclStmt>(*S));         break;
72
73  case Stmt::BreakStmtClass:    EmitBreakStmt();                          break;
74  case Stmt::ContinueStmtClass: EmitContinueStmt();                       break;
75  case Stmt::SwitchStmtClass:   EmitSwitchStmt(cast<SwitchStmt>(*S));     break;
76  case Stmt::DefaultStmtClass:  EmitDefaultStmt(cast<DefaultStmt>(*S));   break;
77  case Stmt::CaseStmtClass:     EmitCaseStmt(cast<CaseStmt>(*S));         break;
78  case Stmt::AsmStmtClass:      EmitAsmStmt(cast<AsmStmt>(*S));           break;
79
80  case Stmt::ObjCAtTryStmtClass:
81    EmitObjCAtTryStmt(cast<ObjCAtTryStmt>(*S));
82    break;
83  case Stmt::ObjCAtCatchStmtClass:
84    assert(0 && "@catch statements should be handled by EmitObjCAtTryStmt");
85    break;
86  case Stmt::ObjCAtFinallyStmtClass:
87    assert(0 && "@finally statements should be handled by EmitObjCAtTryStmt");
88    break;
89  case Stmt::ObjCAtThrowStmtClass:
90    EmitObjCAtThrowStmt(cast<ObjCAtThrowStmt>(*S));
91    break;
92  case Stmt::ObjCAtSynchronizedStmtClass:
93    ErrorUnsupported(S, "@synchronized statement");
94    break;
95  case Stmt::ObjCForCollectionStmtClass:
96    EmitObjCForCollectionStmt(cast<ObjCForCollectionStmt>(*S));
97    break;
98  }
99}
100
101/// EmitCompoundStmt - Emit a compound statement {..} node.  If GetLast is true,
102/// this captures the expression result of the last sub-statement and returns it
103/// (for use by the statement expression extension).
104RValue CodeGenFunction::EmitCompoundStmt(const CompoundStmt &S, bool GetLast,
105                                         llvm::Value *AggLoc, bool isAggVol) {
106  // FIXME: handle vla's etc.
107  CGDebugInfo *DI = CGM.getDebugInfo();
108  if (DI) {
109    if (S.getLBracLoc().isValid())
110      DI->setLocation(S.getLBracLoc());
111    DI->EmitRegionStart(CurFn, Builder);
112  }
113
114  for (CompoundStmt::const_body_iterator I = S.body_begin(),
115       E = S.body_end()-GetLast; I != E; ++I)
116    EmitStmt(*I);
117
118  if (DI) {
119    if (S.getRBracLoc().isValid())
120      DI->setLocation(S.getRBracLoc());
121    DI->EmitRegionEnd(CurFn, Builder);
122  }
123
124  if (!GetLast)
125    return RValue::get(0);
126
127  // We have to special case labels here.  They are statements, but when put at
128  // the end of a statement expression, they yield the value of their
129  // subexpression.  Handle this by walking through all labels we encounter,
130  // emitting them before we evaluate the subexpr.
131  const Stmt *LastStmt = S.body_back();
132  while (const LabelStmt *LS = dyn_cast<LabelStmt>(LastStmt)) {
133    EmitLabel(*LS);
134    LastStmt = LS->getSubStmt();
135  }
136
137  return EmitAnyExpr(cast<Expr>(LastStmt), AggLoc);
138}
139
140void CodeGenFunction::EmitBlock(llvm::BasicBlock *BB) {
141  // Emit a branch from this block to the next one if this was a real block.  If
142  // this was just a fall-through block after a terminator, don't emit it.
143  llvm::BasicBlock *LastBB = Builder.GetInsertBlock();
144
145  if (LastBB->getTerminator()) {
146    // If the previous block is already terminated, don't touch it.
147  } else if (LastBB->empty() && isDummyBlock(LastBB)) {
148    // If the last block was an empty placeholder, remove it now.
149    // TODO: cache and reuse these.
150    LastBB->eraseFromParent();
151  } else {
152    // Otherwise, create a fall-through branch.
153    Builder.CreateBr(BB);
154  }
155  CurFn->getBasicBlockList().push_back(BB);
156  Builder.SetInsertPoint(BB);
157}
158
159void CodeGenFunction::EmitLabel(const LabelStmt &S) {
160  llvm::BasicBlock *NextBB = getBasicBlockForLabel(&S);
161  EmitBlock(NextBB);
162}
163
164
165void CodeGenFunction::EmitLabelStmt(const LabelStmt &S) {
166  EmitLabel(S);
167  EmitStmt(S.getSubStmt());
168}
169
170void CodeGenFunction::EmitGotoStmt(const GotoStmt &S) {
171  Builder.CreateBr(getBasicBlockForLabel(S.getLabel()));
172
173  // Emit a block after the branch so that dead code after a goto has some place
174  // to go.
175  Builder.SetInsertPoint(llvm::BasicBlock::Create("", CurFn));
176}
177
178void CodeGenFunction::EmitIndirectGotoStmt(const IndirectGotoStmt &S) {
179  // Emit initial switch which will be patched up later by
180  // EmitIndirectSwitches(). We need a default dest, so we use the
181  // current BB, but this is overwritten.
182  llvm::Value *V = Builder.CreatePtrToInt(EmitScalarExpr(S.getTarget()),
183                                          llvm::Type::Int32Ty,
184                                          "addr");
185  llvm::SwitchInst *I = Builder.CreateSwitch(V, Builder.GetInsertBlock());
186  IndirectSwitches.push_back(I);
187
188  // Emit a block after the branch so that dead code after a goto has some place
189  // to go.
190  Builder.SetInsertPoint(llvm::BasicBlock::Create("", CurFn));
191}
192
193void CodeGenFunction::EmitIfStmt(const IfStmt &S) {
194  // FIXME: It would probably be nice for us to skip emission of if
195  // (0) code here.
196
197  // C99 6.8.4.1: The first substatement is executed if the expression compares
198  // unequal to 0.  The condition must be a scalar type.
199  llvm::Value *BoolCondVal = EvaluateExprAsBool(S.getCond());
200
201  llvm::BasicBlock *ContBlock = llvm::BasicBlock::Create("ifend");
202  llvm::BasicBlock *ThenBlock = llvm::BasicBlock::Create("ifthen");
203  llvm::BasicBlock *ElseBlock = ContBlock;
204
205  if (S.getElse())
206    ElseBlock = llvm::BasicBlock::Create("ifelse");
207
208  // Insert the conditional branch.
209  Builder.CreateCondBr(BoolCondVal, ThenBlock, ElseBlock);
210
211  // Emit the 'then' code.
212  EmitBlock(ThenBlock);
213  EmitStmt(S.getThen());
214  llvm::BasicBlock *BB = Builder.GetInsertBlock();
215  if (isDummyBlock(BB)) {
216    BB->eraseFromParent();
217    Builder.SetInsertPoint(ThenBlock);
218  } else {
219    Builder.CreateBr(ContBlock);
220  }
221
222  // Emit the 'else' code if present.
223  if (const Stmt *Else = S.getElse()) {
224    EmitBlock(ElseBlock);
225    EmitStmt(Else);
226    llvm::BasicBlock *BB = Builder.GetInsertBlock();
227    if (isDummyBlock(BB)) {
228      BB->eraseFromParent();
229      Builder.SetInsertPoint(ElseBlock);
230    } else {
231      Builder.CreateBr(ContBlock);
232    }
233  }
234
235  // Emit the continuation block for code after the if.
236  EmitBlock(ContBlock);
237}
238
239void CodeGenFunction::EmitWhileStmt(const WhileStmt &S) {
240  // Emit the header for the loop, insert it, which will create an uncond br to
241  // it.
242  llvm::BasicBlock *LoopHeader = llvm::BasicBlock::Create("whilecond");
243  EmitBlock(LoopHeader);
244
245  // Evaluate the conditional in the while header.  C99 6.8.5.1: The evaluation
246  // of the controlling expression takes place before each execution of the loop
247  // body.
248  llvm::Value *BoolCondVal = EvaluateExprAsBool(S.getCond());
249
250  // while(1) is common, avoid extra exit blocks.  Be sure
251  // to correctly handle break/continue though.
252  bool EmitBoolCondBranch = true;
253  if (llvm::ConstantInt *C = dyn_cast<llvm::ConstantInt>(BoolCondVal))
254    if (C->isOne())
255      EmitBoolCondBranch = false;
256
257  // Create an exit block for when the condition fails, create a block for the
258  // body of the loop.
259  llvm::BasicBlock *ExitBlock = llvm::BasicBlock::Create("whileexit");
260  llvm::BasicBlock *LoopBody  = llvm::BasicBlock::Create("whilebody");
261
262  // As long as the condition is true, go to the loop body.
263  if (EmitBoolCondBranch)
264    Builder.CreateCondBr(BoolCondVal, LoopBody, ExitBlock);
265
266  // Store the blocks to use for break and continue.
267  BreakContinueStack.push_back(BreakContinue(ExitBlock, LoopHeader));
268
269  // Emit the loop body.
270  EmitBlock(LoopBody);
271  EmitStmt(S.getBody());
272
273  BreakContinueStack.pop_back();
274
275  // Cycle to the condition.
276  Builder.CreateBr(LoopHeader);
277
278  // Emit the exit block.
279  EmitBlock(ExitBlock);
280
281  // If LoopHeader is a simple forwarding block then eliminate it.
282  if (!EmitBoolCondBranch
283      && &LoopHeader->front() == LoopHeader->getTerminator()) {
284    LoopHeader->replaceAllUsesWith(LoopBody);
285    LoopHeader->getTerminator()->eraseFromParent();
286    LoopHeader->eraseFromParent();
287  }
288}
289
290void CodeGenFunction::EmitDoStmt(const DoStmt &S) {
291  // Emit the body for the loop, insert it, which will create an uncond br to
292  // it.
293  llvm::BasicBlock *LoopBody = llvm::BasicBlock::Create("dobody");
294  llvm::BasicBlock *AfterDo = llvm::BasicBlock::Create("afterdo");
295  EmitBlock(LoopBody);
296
297  llvm::BasicBlock *DoCond = llvm::BasicBlock::Create("docond");
298
299  // Store the blocks to use for break and continue.
300  BreakContinueStack.push_back(BreakContinue(AfterDo, DoCond));
301
302  // Emit the body of the loop into the block.
303  EmitStmt(S.getBody());
304
305  BreakContinueStack.pop_back();
306
307  EmitBlock(DoCond);
308
309  // C99 6.8.5.2: "The evaluation of the controlling expression takes place
310  // after each execution of the loop body."
311
312  // Evaluate the conditional in the while header.
313  // C99 6.8.5p2/p4: The first substatement is executed if the expression
314  // compares unequal to 0.  The condition must be a scalar type.
315  llvm::Value *BoolCondVal = EvaluateExprAsBool(S.getCond());
316
317  // "do {} while (0)" is common in macros, avoid extra blocks.  Be sure
318  // to correctly handle break/continue though.
319  bool EmitBoolCondBranch = true;
320  if (llvm::ConstantInt *C = dyn_cast<llvm::ConstantInt>(BoolCondVal))
321    if (C->isZero())
322      EmitBoolCondBranch = false;
323
324  // As long as the condition is true, iterate the loop.
325  if (EmitBoolCondBranch)
326    Builder.CreateCondBr(BoolCondVal, LoopBody, AfterDo);
327
328  // Emit the exit block.
329  EmitBlock(AfterDo);
330
331  // If DoCond is a simple forwarding block then eliminate it.
332  if (!EmitBoolCondBranch && &DoCond->front() == DoCond->getTerminator()) {
333    DoCond->replaceAllUsesWith(AfterDo);
334    DoCond->getTerminator()->eraseFromParent();
335    DoCond->eraseFromParent();
336  }
337}
338
339void CodeGenFunction::EmitForStmt(const ForStmt &S) {
340  // FIXME: What do we do if the increment (f.e.) contains a stmt expression,
341  // which contains a continue/break?
342  // TODO: We could keep track of whether the loop body contains any
343  // break/continue statements and not create unnecessary blocks (like
344  // "afterfor" for a condless loop) if it doesn't.
345
346  // Evaluate the first part before the loop.
347  if (S.getInit())
348    EmitStmt(S.getInit());
349
350  // Start the loop with a block that tests the condition.
351  llvm::BasicBlock *CondBlock = llvm::BasicBlock::Create("forcond");
352  llvm::BasicBlock *AfterFor = llvm::BasicBlock::Create("afterfor");
353
354  EmitBlock(CondBlock);
355
356  // Evaluate the condition if present.  If not, treat it as a non-zero-constant
357  // according to 6.8.5.3p2, aka, true.
358  if (S.getCond()) {
359    // C99 6.8.5p2/p4: The first substatement is executed if the expression
360    // compares unequal to 0.  The condition must be a scalar type.
361    llvm::Value *BoolCondVal = EvaluateExprAsBool(S.getCond());
362
363    // As long as the condition is true, iterate the loop.
364    llvm::BasicBlock *ForBody = llvm::BasicBlock::Create("forbody");
365    Builder.CreateCondBr(BoolCondVal, ForBody, AfterFor);
366    EmitBlock(ForBody);
367  } else {
368    // Treat it as a non-zero constant.  Don't even create a new block for the
369    // body, just fall into it.
370  }
371
372  // If the for loop doesn't have an increment we can just use the
373  // condition as the continue block.
374  llvm::BasicBlock *ContinueBlock;
375  if (S.getInc())
376    ContinueBlock = llvm::BasicBlock::Create("forinc");
377  else
378    ContinueBlock = CondBlock;
379
380  // Store the blocks to use for break and continue.
381  BreakContinueStack.push_back(BreakContinue(AfterFor, ContinueBlock));
382
383  // If the condition is true, execute the body of the for stmt.
384  EmitStmt(S.getBody());
385
386  BreakContinueStack.pop_back();
387
388  if (S.getInc())
389    EmitBlock(ContinueBlock);
390
391  // If there is an increment, emit it next.
392  if (S.getInc())
393    EmitStmt(S.getInc());
394
395  // Finally, branch back up to the condition for the next iteration.
396  Builder.CreateBr(CondBlock);
397
398  // Emit the fall-through block.
399  EmitBlock(AfterFor);
400}
401
402/// EmitReturnStmt - Note that due to GCC extensions, this can have an operand
403/// if the function returns void, or may be missing one if the function returns
404/// non-void.  Fun stuff :).
405void CodeGenFunction::EmitReturnStmt(const ReturnStmt &S) {
406  // Emit the result value, even if unused, to evalute the side effects.
407  const Expr *RV = S.getRetValue();
408
409  llvm::Value* RetValue = 0;
410  if (FnRetTy->isVoidType()) {
411    // Make sure not to return anything
412    if (RV) {
413      // Evaluate the expression for side effects
414      EmitAnyExpr(RV);
415    }
416  } else if (RV == 0) {
417    const llvm::Type *RetTy = CurFn->getFunctionType()->getReturnType();
418    if (RetTy != llvm::Type::VoidTy) {
419      // Handle "return;" in a function that returns a value.
420      RetValue = llvm::UndefValue::get(RetTy);
421    }
422  } else if (!hasAggregateLLVMType(RV->getType())) {
423    RetValue = EmitScalarExpr(RV);
424  } else if (RV->getType()->isAnyComplexType()) {
425    EmitComplexExprIntoAddr(RV, CurFn->arg_begin(), false);
426  } else {
427    EmitAggExpr(RV, CurFn->arg_begin(), false);
428  }
429
430  if (RetValue) {
431    Builder.CreateRet(RetValue);
432  } else {
433    Builder.CreateRetVoid();
434  }
435
436  // Emit a block after the branch so that dead code after a return has some
437  // place to go.
438  EmitBlock(llvm::BasicBlock::Create());
439}
440
441void CodeGenFunction::EmitDeclStmt(const DeclStmt &S) {
442  for (const ScopedDecl *Decl = S.getDecl(); Decl;
443       Decl = Decl->getNextDeclarator())
444    EmitDecl(*Decl);
445}
446
447void CodeGenFunction::EmitBreakStmt() {
448  assert(!BreakContinueStack.empty() && "break stmt not in a loop or switch!");
449
450  llvm::BasicBlock *Block = BreakContinueStack.back().BreakBlock;
451  Builder.CreateBr(Block);
452  EmitBlock(llvm::BasicBlock::Create());
453}
454
455void CodeGenFunction::EmitContinueStmt() {
456  assert(!BreakContinueStack.empty() && "continue stmt not in a loop!");
457
458  llvm::BasicBlock *Block = BreakContinueStack.back().ContinueBlock;
459  Builder.CreateBr(Block);
460  EmitBlock(llvm::BasicBlock::Create());
461}
462
463/// EmitCaseStmtRange - If case statement range is not too big then
464/// add multiple cases to switch instruction, one for each value within
465/// the range. If range is too big then emit "if" condition check.
466void CodeGenFunction::EmitCaseStmtRange(const CaseStmt &S) {
467  // FIXME: kill me with param - ddunbar
468  assert(S.getRHS() && "Expected RHS value in CaseStmt");
469
470  llvm::APSInt LHS = S.getLHS()->getIntegerConstantExprValue(getContext());
471  llvm::APSInt RHS = S.getRHS()->getIntegerConstantExprValue(getContext());
472
473  // Emit the code for this case. We do this first to make sure it is
474  // properly chained from our predecessor before generating the
475  // switch machinery to enter this block.
476  StartBlock("sw.bb");
477  llvm::BasicBlock *CaseDest = Builder.GetInsertBlock();
478  EmitStmt(S.getSubStmt());
479
480  // If range is empty, do nothing.
481  if (LHS.isSigned() ? RHS.slt(LHS) : RHS.ult(LHS))
482    return;
483
484  llvm::APInt Range = RHS - LHS;
485  // FIXME: parameters such as this should not be hardcoded.
486  if (Range.ult(llvm::APInt(Range.getBitWidth(), 64))) {
487    // Range is small enough to add multiple switch instruction cases.
488    for (unsigned i = 0, e = Range.getZExtValue() + 1; i != e; ++i) {
489      SwitchInsn->addCase(llvm::ConstantInt::get(LHS), CaseDest);
490      LHS++;
491    }
492    return;
493  }
494
495  // The range is too big. Emit "if" condition into a new block,
496  // making sure to save and restore the current insertion point.
497  llvm::BasicBlock *RestoreBB = Builder.GetInsertBlock();
498
499  // Push this test onto the chain of range checks (which terminates
500  // in the default basic block). The switch's default will be changed
501  // to the top of this chain after switch emission is complete.
502  llvm::BasicBlock *FalseDest = CaseRangeBlock;
503  CaseRangeBlock = llvm::BasicBlock::Create("sw.caserange");
504
505  CurFn->getBasicBlockList().push_back(CaseRangeBlock);
506  Builder.SetInsertPoint(CaseRangeBlock);
507
508  // Emit range check.
509  llvm::Value *Diff =
510    Builder.CreateSub(SwitchInsn->getCondition(), llvm::ConstantInt::get(LHS),
511                      "tmp");
512  llvm::Value *Cond =
513    Builder.CreateICmpULE(Diff, llvm::ConstantInt::get(Range), "tmp");
514  Builder.CreateCondBr(Cond, CaseDest, FalseDest);
515
516  // Restore the appropriate insertion point.
517  Builder.SetInsertPoint(RestoreBB);
518}
519
520void CodeGenFunction::EmitCaseStmt(const CaseStmt &S) {
521  if (S.getRHS()) {
522    EmitCaseStmtRange(S);
523    return;
524  }
525
526  StartBlock("sw.bb");
527  llvm::BasicBlock *CaseDest = Builder.GetInsertBlock();
528  llvm::APSInt CaseVal = S.getLHS()->getIntegerConstantExprValue(getContext());
529  SwitchInsn->addCase(llvm::ConstantInt::get(CaseVal),
530                      CaseDest);
531  EmitStmt(S.getSubStmt());
532}
533
534void CodeGenFunction::EmitDefaultStmt(const DefaultStmt &S) {
535  llvm::BasicBlock *DefaultBlock = SwitchInsn->getDefaultDest();
536  assert(DefaultBlock->empty() && "EmitDefaultStmt: Default block already defined?");
537  EmitBlock(DefaultBlock);
538  EmitStmt(S.getSubStmt());
539}
540
541void CodeGenFunction::EmitSwitchStmt(const SwitchStmt &S) {
542  llvm::Value *CondV = EmitScalarExpr(S.getCond());
543
544  // Handle nested switch statements.
545  llvm::SwitchInst *SavedSwitchInsn = SwitchInsn;
546  llvm::BasicBlock *SavedCRBlock = CaseRangeBlock;
547
548  // Create basic block to hold stuff that comes after switch
549  // statement. We also need to create a default block now so that
550  // explicit case ranges tests can have a place to jump to on
551  // failure.
552  llvm::BasicBlock *NextBlock = llvm::BasicBlock::Create("sw.epilog");
553  llvm::BasicBlock *DefaultBlock = llvm::BasicBlock::Create("sw.default");
554  SwitchInsn = Builder.CreateSwitch(CondV, DefaultBlock);
555  CaseRangeBlock = DefaultBlock;
556
557  // Create basic block for body of switch
558  StartBlock("sw.body");
559
560  // All break statements jump to NextBlock. If BreakContinueStack is non empty
561  // then reuse last ContinueBlock.
562  llvm::BasicBlock *ContinueBlock = NULL;
563  if (!BreakContinueStack.empty())
564    ContinueBlock = BreakContinueStack.back().ContinueBlock;
565  BreakContinueStack.push_back(BreakContinue(NextBlock, ContinueBlock));
566
567  // Emit switch body.
568  EmitStmt(S.getBody());
569  BreakContinueStack.pop_back();
570
571  // Update the default block in case explicit case range tests have
572  // been chained on top.
573  SwitchInsn->setSuccessor(0, CaseRangeBlock);
574
575  // If a default was never emitted then reroute any jumps to it and
576  // discard.
577  if (!DefaultBlock->getParent()) {
578    DefaultBlock->replaceAllUsesWith(NextBlock);
579    delete DefaultBlock;
580  }
581
582  // Emit continuation.
583  EmitBlock(NextBlock);
584
585  SwitchInsn = SavedSwitchInsn;
586  CaseRangeBlock = SavedCRBlock;
587}
588
589static std::string ConvertAsmString(const char *Start, unsigned NumOperands,
590                                    bool IsSimple) {
591  static unsigned AsmCounter = 0;
592  AsmCounter++;
593  std::string Result;
594  if (IsSimple) {
595    while (*Start) {
596      switch (*Start) {
597      default:
598        Result += *Start;
599        break;
600      case '$':
601        Result += "$$";
602        break;
603      }
604      Start++;
605    }
606
607    return Result;
608  }
609
610  while (*Start) {
611    switch (*Start) {
612    default:
613      Result += *Start;
614      break;
615    case '$':
616      Result += "$$";
617      break;
618    case '%':
619      // Escaped character
620      Start++;
621      if (!*Start) {
622        // FIXME: This should be caught during Sema.
623        assert(0 && "Trailing '%' in asm string.");
624      }
625
626      char EscapedChar = *Start;
627      if (EscapedChar == '%') {
628        // Escaped percentage sign.
629        Result += '%';
630      } else if (EscapedChar == '=') {
631        // Generate an unique ID.
632        Result += llvm::utostr(AsmCounter);
633      } else if (isdigit(EscapedChar)) {
634        // %n - Assembler operand n
635        char *End;
636        unsigned long n = strtoul(Start, &End, 10);
637        if (Start == End) {
638          // FIXME: This should be caught during Sema.
639          assert(0 && "Missing operand!");
640        } else if (n >= NumOperands) {
641          // FIXME: This should be caught during Sema.
642          assert(0 && "Operand number out of range!");
643        }
644
645        Result += '$' + llvm::utostr(n);
646        Start = End - 1;
647      } else if (isalpha(EscapedChar)) {
648        char *End;
649
650        unsigned long n = strtoul(Start + 1, &End, 10);
651        if (Start == End) {
652          // FIXME: This should be caught during Sema.
653          assert(0 && "Missing operand!");
654        } else if (n >= NumOperands) {
655          // FIXME: This should be caught during Sema.
656          assert(0 && "Operand number out of range!");
657        }
658
659        Result += "${" + llvm::utostr(n) + ':' + EscapedChar + '}';
660        Start = End - 1;
661      } else {
662        assert(0 && "Unhandled asm escaped character!");
663      }
664    }
665    Start++;
666  }
667
668  return Result;
669}
670
671static std::string SimplifyConstraint(const char* Constraint,
672                                      TargetInfo &Target) {
673  std::string Result;
674
675  while (*Constraint) {
676    switch (*Constraint) {
677    default:
678      Result += Target.convertConstraint(*Constraint);
679      break;
680    // Ignore these
681    case '*':
682    case '?':
683    case '!':
684      break;
685    case 'g':
686      Result += "imr";
687      break;
688    }
689
690    Constraint++;
691  }
692
693  return Result;
694}
695
696void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
697  std::string AsmString =
698    ConvertAsmString(std::string(S.getAsmString()->getStrData(),
699                                 S.getAsmString()->getByteLength()).c_str(),
700                     S.getNumOutputs() + S.getNumInputs(), S.isSimple());
701
702  std::string Constraints;
703
704  llvm::Value *ResultAddr = 0;
705  const llvm::Type *ResultType = llvm::Type::VoidTy;
706
707  std::vector<const llvm::Type*> ArgTypes;
708  std::vector<llvm::Value*> Args;
709
710  // Keep track of inout constraints.
711  std::string InOutConstraints;
712  std::vector<llvm::Value*> InOutArgs;
713  std::vector<const llvm::Type*> InOutArgTypes;
714
715  for (unsigned i = 0, e = S.getNumOutputs(); i != e; i++) {
716    std::string OutputConstraint(S.getOutputConstraint(i)->getStrData(),
717                                 S.getOutputConstraint(i)->getByteLength());
718
719    TargetInfo::ConstraintInfo Info;
720    bool result = Target.validateOutputConstraint(OutputConstraint.c_str(),
721                                                  Info);
722    assert(result && "Failed to parse output constraint");
723
724    // Simplify the output constraint.
725    OutputConstraint = SimplifyConstraint(OutputConstraint.c_str() + 1, Target);
726
727    LValue Dest = EmitLValue(S.getOutputExpr(i));
728    const llvm::Type *DestValueType =
729      cast<llvm::PointerType>(Dest.getAddress()->getType())->getElementType();
730
731    // If the first output operand is not a memory dest, we'll
732    // make it the return value.
733    if (i == 0 && !(Info & TargetInfo::CI_AllowsMemory) &&
734        DestValueType->isSingleValueType()) {
735      ResultAddr = Dest.getAddress();
736      ResultType = DestValueType;
737      Constraints += "=" + OutputConstraint;
738    } else {
739      ArgTypes.push_back(Dest.getAddress()->getType());
740      Args.push_back(Dest.getAddress());
741      if (i != 0)
742        Constraints += ',';
743      Constraints += "=*";
744      Constraints += OutputConstraint;
745    }
746
747    if (Info & TargetInfo::CI_ReadWrite) {
748      // FIXME: This code should be shared with the code that handles inputs.
749      InOutConstraints += ',';
750
751      const Expr *InputExpr = S.getOutputExpr(i);
752      llvm::Value *Arg;
753      if ((Info & TargetInfo::CI_AllowsRegister) ||
754          !(Info & TargetInfo::CI_AllowsMemory)) {
755        if (ConvertType(InputExpr->getType())->isSingleValueType()) {
756          Arg = EmitScalarExpr(InputExpr);
757        } else {
758          ErrorUnsupported(&S, "asm statement passing multiple-value types as inputs");
759        }
760      } else {
761        LValue Dest = EmitLValue(InputExpr);
762        Arg = Dest.getAddress();
763        InOutConstraints += '*';
764      }
765
766      InOutArgTypes.push_back(Arg->getType());
767      InOutArgs.push_back(Arg);
768      InOutConstraints += OutputConstraint;
769    }
770  }
771
772  unsigned NumConstraints = S.getNumOutputs() + S.getNumInputs();
773
774  for (unsigned i = 0, e = S.getNumInputs(); i != e; i++) {
775    const Expr *InputExpr = S.getInputExpr(i);
776
777    std::string InputConstraint(S.getInputConstraint(i)->getStrData(),
778                                S.getInputConstraint(i)->getByteLength());
779
780    TargetInfo::ConstraintInfo Info;
781    bool result = Target.validateInputConstraint(InputConstraint.c_str(),
782                                                 NumConstraints,
783                                                 Info);
784    assert(result && "Failed to parse input constraint");
785
786    if (i != 0 || S.getNumOutputs() > 0)
787      Constraints += ',';
788
789    // Simplify the input constraint.
790    InputConstraint = SimplifyConstraint(InputConstraint.c_str(), Target);
791
792    llvm::Value *Arg;
793
794    if ((Info & TargetInfo::CI_AllowsRegister) ||
795        !(Info & TargetInfo::CI_AllowsMemory)) {
796      if (ConvertType(InputExpr->getType())->isSingleValueType()) {
797        Arg = EmitScalarExpr(InputExpr);
798      } else {
799        ErrorUnsupported(&S, "asm statement passing multiple-value types as inputs");
800      }
801    } else {
802      LValue Dest = EmitLValue(InputExpr);
803      Arg = Dest.getAddress();
804      Constraints += '*';
805    }
806
807    ArgTypes.push_back(Arg->getType());
808    Args.push_back(Arg);
809    Constraints += InputConstraint;
810  }
811
812  // Append the "input" part of inout constraints last.
813  for (unsigned i = 0, e = InOutArgs.size(); i != e; i++) {
814    ArgTypes.push_back(InOutArgTypes[i]);
815    Args.push_back(InOutArgs[i]);
816  }
817  Constraints += InOutConstraints;
818
819  // Clobbers
820  for (unsigned i = 0, e = S.getNumClobbers(); i != e; i++) {
821    std::string Clobber(S.getClobber(i)->getStrData(),
822                        S.getClobber(i)->getByteLength());
823
824    Clobber = Target.getNormalizedGCCRegisterName(Clobber.c_str());
825
826    if (i != 0 || NumConstraints != 0)
827      Constraints += ',';
828
829    Constraints += "~{";
830    Constraints += Clobber;
831    Constraints += '}';
832  }
833
834  // Add machine specific clobbers
835  if (const char *C = Target.getClobbers()) {
836    if (!Constraints.empty())
837      Constraints += ',';
838    Constraints += C;
839  }
840
841  const llvm::FunctionType *FTy =
842    llvm::FunctionType::get(ResultType, ArgTypes, false);
843
844  llvm::InlineAsm *IA =
845    llvm::InlineAsm::get(FTy, AsmString, Constraints,
846                         S.isVolatile() || S.getNumOutputs() == 0);
847  llvm::Value *Result = Builder.CreateCall(IA, Args.begin(), Args.end(), "");
848  if (ResultAddr) // FIXME: volatility
849    Builder.CreateStore(Result, ResultAddr);
850}
851