OSDN Git Service

* except.c (dw2_build_landing_pads): New local
authorjsturm <jsturm@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 17 Sep 2001 23:16:28 +0000 (23:16 +0000)
committerjsturm <jsturm@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 17 Sep 2001 23:16:28 +0000 (23:16 +0000)
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

gcc/ChangeLog
gcc/except.c

index 1e8d4f0..6a069f1 100644 (file)
@@ -1,3 +1,9 @@
+2001-09-17  Jeff Sturm  <jsturm@one-point.com>
+
+       * 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  <ghazi@caip.rutgers.edu>
 
        * gcc.c (find_file): Use ACONCAT in lieu of alloca/strcpy/strcat.
index 90423a7..bc21b2c 100644 (file)
@@ -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,