aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/CodeGen/CGObjCMac.cpp2
-rw-r--r--lib/CodeGen/CGStmt.cpp16
-rw-r--r--lib/CodeGen/CodeGenFunction.h5
3 files changed, 16 insertions, 7 deletions
diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp
index 34f9952252..903e92dfc2 100644
--- a/lib/CodeGen/CGObjCMac.cpp
+++ b/lib/CodeGen/CGObjCMac.cpp
@@ -1717,7 +1717,7 @@ void CGObjCMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
CGF.Builder.CreateCall(ObjCTypes.ExceptionThrowFn, ExceptionAsObject);
CGF.Builder.CreateUnreachable();
- CGF.EmitBlock(CGF.createBasicBlock("bb"));
+ CGF.EmitDummyBlock();
}
void CodeGenFunction::EmitJumpThroughFinally(ObjCEHEntry *E,
diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp
index 9d6a79b584..82c39208a4 100644
--- a/lib/CodeGen/CGStmt.cpp
+++ b/lib/CodeGen/CGStmt.cpp
@@ -167,6 +167,10 @@ void CodeGenFunction::EmitBlock(llvm::BasicBlock *BB) {
Builder.SetInsertPoint(BB);
}
+void CodeGenFunction::EmitDummyBlock() {
+ EmitBlock(createBasicBlock());
+}
+
void CodeGenFunction::EmitLabel(const LabelStmt &S) {
llvm::BasicBlock *NextBB = getBasicBlockForLabel(&S);
EmitBlock(NextBB);
@@ -189,7 +193,7 @@ void CodeGenFunction::EmitGotoStmt(const GotoStmt &S) {
// Emit a block after the branch so that dead code after a goto has some place
// to go.
- Builder.SetInsertPoint(createBasicBlock("", CurFn));
+ EmitDummyBlock();
}
void CodeGenFunction::EmitIndirectGotoStmt(const IndirectGotoStmt &S) {
@@ -210,7 +214,7 @@ void CodeGenFunction::EmitIndirectGotoStmt(const IndirectGotoStmt &S) {
// Emit a block after the branch so that dead code after a goto has some place
// to go.
- Builder.SetInsertPoint(createBasicBlock("", CurFn));
+ EmitDummyBlock();
}
void CodeGenFunction::EmitIfStmt(const IfStmt &S) {
@@ -433,7 +437,7 @@ void CodeGenFunction::EmitReturnOfRValue(RValue RV, QualType Ty) {
// Emit a block after the branch so that dead code after a return has some
// place to go.
- EmitBlock(createBasicBlock());
+ EmitDummyBlock();
}
/// EmitReturnStmt - Note that due to GCC extensions, this can have an operand
@@ -473,7 +477,7 @@ void CodeGenFunction::EmitReturnStmt(const ReturnStmt &S) {
// Emit a block after the branch so that dead code after a return has some
// place to go.
- EmitBlock(createBasicBlock());
+ EmitDummyBlock();
}
void CodeGenFunction::EmitDeclStmt(const DeclStmt &S) {
@@ -487,7 +491,7 @@ void CodeGenFunction::EmitBreakStmt() {
llvm::BasicBlock *Block = BreakContinueStack.back().BreakBlock;
Builder.CreateBr(Block);
- EmitBlock(createBasicBlock());
+ EmitDummyBlock();
}
void CodeGenFunction::EmitContinueStmt() {
@@ -495,7 +499,7 @@ void CodeGenFunction::EmitContinueStmt() {
llvm::BasicBlock *Block = BreakContinueStack.back().ContinueBlock;
Builder.CreateBr(Block);
- EmitBlock(createBasicBlock());
+ EmitDummyBlock();
}
/// EmitCaseStmtRange - If case statement range is not too big then
diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h
index c9dcaa7d55..a454cece40 100644
--- a/lib/CodeGen/CodeGenFunction.h
+++ b/lib/CodeGen/CodeGenFunction.h
@@ -225,6 +225,11 @@ public:
llvm::BasicBlock *getBasicBlockForLabel(const LabelStmt *S);
void EmitBlock(llvm::BasicBlock *BB);
+
+ /// EmitDummyBlock - Emit a new block which will never be branched
+ /// to. This is used to satisfy the invariant that codegen always
+ /// has an active unterminated block to dump code into.
+ void EmitDummyBlock();
/// ErrorUnsupported - Print out an error that codegen doesn't support the
/// specified stmt yet.