X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=jump_target.c;h=ebdf1022cc8f1e1eac1b39346fae56f0c64a5d2a;hb=84b4c24ec6848505549af4b240df492317138f27;hp=c5991d4151dadc46fd87a29f6753ed73fbd969cf;hpb=2bb94311298af01987fdb9c80666adc0ee7ee3ef;p=cparser diff --git a/jump_target.c b/jump_target.c index c5991d4..ebdf102 100644 --- a/jump_target.c +++ b/jump_target.c @@ -1,3 +1,7 @@ +/* + * This file is part of cparser. + * Copyright (C) 2012 Christoph Mallon + */ #include "adt/util.h" #include "jump_target.h" @@ -46,15 +50,20 @@ ir_node *enter_jump_target(jump_target *const tgt) return block; } -ir_node *get_target_block(jump_target *const tgt) +void enter_immature_jump_target(jump_target *const tgt) { - if (!tgt->block) { - tgt->block = new_immBlock(); + ir_node *jmp; + ir_node *block = tgt->block; + if (!block) { + /* Avoid unreachable loops by adding a Bad entry. */ + jmp = new_Bad(mode_X); + goto new_block; } else if (tgt->first) { - ir_node *const jmp = new_r_Jmp(tgt->block); - tgt->block = new_immBlock(); tgt->first = false; - add_immBlock_pred(tgt->block, jmp); + jmp = new_r_Jmp(block); +new_block: + tgt->block = block = new_immBlock(); + add_immBlock_pred(block, jmp); } - return tgt->block; + set_cur_block(block); }