aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
authorPekka Enberg <penberg@kernel.org>2011-08-23 20:07:30 +0300
committerPekka Enberg <penberg@kernel.org>2011-08-23 20:07:30 +0300
commitb78a2674f3275e9de4a18d2302c6529ea7bec774 (patch)
treef12be81300d3ef7b29d5947210135a1b90199c21
parent80e549751078e55e852965876642bca1b1f88930 (diff)
downloadsparse-dev-b78a2674f3275e9de4a18d2302c6529ea7bec774.tar.gz
llvm, sparse: Separate entry and exit basic blocks
Signed-off-by: Pekka Enberg <penberg@kernel.org>
-rw-r--r--sparse-llvm.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/sparse-llvm.c b/sparse-llvm.c
index 24bc6000..3ee37eb4 100644
--- a/sparse-llvm.c
+++ b/sparse-llvm.c
@@ -63,12 +63,16 @@ static void output_insn(struct instruction *insn)
{
}
-static void output_bb(struct basic_block *bb, unsigned long generation)
+static void output_bb(LLVMBasicBlockRef bb_ref, struct basic_block *bb, unsigned long generation)
{
struct instruction *insn;
bb->generation = generation;
+ LLVMBuilderRef builder = LLVMCreateBuilder();
+
+ LLVMPositionBuilderAtEnd(builder, bb_ref);
+
FOR_EACH_PTR(bb->insns, insn) {
if (!insn->bb)
continue;
@@ -107,18 +111,22 @@ static void output_fn(LLVMModuleRef module, struct entrypoint *ep)
unssa(ep);
+ LLVMBuilderRef builder = LLVMCreateBuilder();
+
+ LLVMBasicBlockRef entry = LLVMAppendBasicBlock(function, "entry");
+ LLVMBasicBlockRef exit = LLVMAppendBasicBlock(function, "exit");
+
FOR_EACH_PTR(ep->bbs, bb) {
if (bb->generation == generation)
continue;
- output_bb(bb, generation);
+ output_bb(entry, bb, generation);
}
END_FOR_EACH_PTR(bb);
- LLVMBasicBlockRef entry = LLVMAppendBasicBlock(function, "entry");
-
- LLVMBuilderRef builder = LLVMCreateBuilder();
-
LLVMPositionBuilderAtEnd(builder, entry);
+ LLVMBuildBr(builder, exit);
+
+ LLVMPositionBuilderAtEnd(builder, exit);
if (ret_type == &void_ctype)
LLVMBuildRetVoid(builder);