From: jsturm Date: Mon, 17 Sep 2001 23:16:28 +0000 (+0000) Subject: * except.c (dw2_build_landing_pads): New local X-Git-Tag: upstream/4.9.2~92032 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=77918ba42f29c839be0a9a261842035984d18c3b;p=platform%2Fupstream%2Flinaro-gcc.git * except.c (dw2_build_landing_pads): New local clobbers_hard_regs. Emit an ASM_INPUT as a scheduling barrier after clobbers. Fixes c++/4012. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45667 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1e8d4f0..6a069f1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2001-09-17 Jeff Sturm + + * except.c (dw2_build_landing_pads): New local + clobbers_hard_regs. Emit an ASM_INPUT as a scheduling + barrier after clobbers. Fixes c++/4012. + 2001-09-17 Kaveh R. Ghazi * gcc.c (find_file): Use ACONCAT in lieu of alloca/strcpy/strcat. diff --git a/gcc/except.c b/gcc/except.c index 90423a7..bc21b2c 100644 --- a/gcc/except.c +++ b/gcc/except.c @@ -1865,6 +1865,7 @@ dw2_build_landing_pads () { struct eh_region *region = cfun->eh->region_array[i]; rtx seq; + bool clobbers_hard_regs = false; /* Mind we don't process a region more than once. */ if (!region || region->region_number != i) @@ -1901,7 +1902,19 @@ dw2_build_landing_pads () if (r == INVALID_REGNUM) break; if (! call_used_regs[r]) - emit_insn (gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, r))); + { + emit_insn (gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, r))); + clobbers_hard_regs = true; + } + } + + if (clobbers_hard_regs) + { + /* @@@ This is a kludge. Not all machine descriptions define a + blockage insn, but we must not allow the code we just generated + to be reordered by scheduling. So emit an ASM_INPUT to act as + blockage insn. */ + emit_insn (gen_rtx_ASM_INPUT (VOIDmode, "")); } emit_move_insn (cfun->eh->exc_ptr,