diff options
-rw-r--r-- | lib/CodeGen/CGStmt.cpp | 16 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenFunction.h | 5 |
2 files changed, 12 insertions, 9 deletions
diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp index 4e2bca59ea..dc7722c425 100644 --- a/lib/CodeGen/CGStmt.cpp +++ b/lib/CodeGen/CGStmt.cpp @@ -357,6 +357,14 @@ void CodeGenFunction::EmitWhileStmt(const WhileStmt &S) { // it. llvm::BasicBlock *LoopHeader = createBasicBlock("while.cond"); EmitBlock(LoopHeader); + + // Create an exit block for when the condition fails, create a block for the + // body of the loop. + llvm::BasicBlock *ExitBlock = createBasicBlock("while.end"); + llvm::BasicBlock *LoopBody = createBasicBlock("while.body"); + + // Store the blocks to use for break and continue. + BreakContinuePush(ExitBlock, LoopHeader); // Evaluate the conditional in the while header. C99 6.8.5.1: The // evaluation of the controlling expression takes place before each @@ -370,18 +378,10 @@ void CodeGenFunction::EmitWhileStmt(const WhileStmt &S) { if (C->isOne()) EmitBoolCondBranch = false; - // Create an exit block for when the condition fails, create a block for the - // body of the loop. - llvm::BasicBlock *ExitBlock = createBasicBlock("while.end"); - llvm::BasicBlock *LoopBody = createBasicBlock("while.body"); - // As long as the condition is true, go to the loop body. if (EmitBoolCondBranch) Builder.CreateCondBr(BoolCondVal, LoopBody, ExitBlock); - // Store the blocks to use for break and continue. - BreakContinuePush(ExitBlock, LoopHeader); - // Emit the loop body. EmitBlock(LoopBody); EmitStmt(S.getBody()); diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index 90b0bf45fe..1a251d1363 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -151,7 +151,10 @@ private: /// LabelMap - This keeps track of the LLVM basic block for each C label. llvm::DenseMap<const LabelStmt*, llvm::BasicBlock*> LabelMap; - /// BreakContinuePush - Note a new break and continue level. + /// BreakContinuePush - Note a new break and continue level. This + /// must be called at the stack depth of the continue block. In + /// particular, this must not be called after the controlling + /// condition has possibly started a vla. void BreakContinuePush(llvm::BasicBlock *bb, llvm::BasicBlock *cb) { BreakContinueStack.push_back(BreakContinue(bb, cb, StackDepth, ObjCEHStack.size())); |