OSDN Git Service

2008-06-14 Jerry DeLisle <jvdelisle@gcc.gnu.org>
[pf3gnuchains/gcc-fork.git] / gcc / except.c
index b1f2332..8ebfd7f 100644 (file)
@@ -540,6 +540,7 @@ expand_resx_expr (tree exp)
                                     cfun->eh->region_array, region_nr);
 
   gcc_assert (!reg->resume);
+  do_pending_stack_adjust ();
   reg->resume = emit_jump_insn (gen_rtx_RESX (VOIDmode, region_nr));
   emit_barrier ();
 }
@@ -1691,7 +1692,7 @@ sjlj_assign_call_site_values (rtx dispatch_label, struct sjlj_lp_info *lp_info)
        r->landing_pad = dispatch_label;
        lp_info[i].action_index = collect_one_action_chain (ar_hash, r);
        if (lp_info[i].action_index != -1)
-         cfun->uses_eh_lsda = 1;
+         crtl->uses_eh_lsda = 1;
       }
 
   htab_delete (ar_hash);
@@ -1817,7 +1818,7 @@ sjlj_emit_function_enter (rtx dispatch_label)
   emit_move_insn (mem, eh_personality_libfunc);
 
   mem = adjust_address (fc, Pmode, sjlj_fc_lsda_ofs);
-  if (cfun->uses_eh_lsda)
+  if (crtl->uses_eh_lsda)
     {
       char buf[20];
       rtx sym;
@@ -2746,7 +2747,7 @@ can_throw_external (const_rtx insn)
   return can_throw_external_1 (INTVAL (XEXP (note, 0)), false);
 }
 
-/* Set TREE_NOTHROW and cfun->all_throwers_are_sibcalls.  */
+/* Set TREE_NOTHROW and crtl->all_throwers_are_sibcalls.  */
 
 unsigned int
 set_nothrow_function_flags (void)
@@ -2761,13 +2762,13 @@ set_nothrow_function_flags (void)
 
   TREE_NOTHROW (current_function_decl) = 1;
 
-  /* Assume cfun->all_throwers_are_sibcalls until we encounter
+  /* Assume crtl->all_throwers_are_sibcalls until we encounter
      something that can throw an exception.  We specifically exempt
      CALL_INSNs that are SIBLING_CALL_P, as these are really jumps,
      and can't throw.  Most CALL_INSNs are not SIBLING_CALL_P, so this
      is optimistic.  */
 
-  cfun->all_throwers_are_sibcalls = 1;
+  crtl->all_throwers_are_sibcalls = 1;
 
   if (! flag_exceptions)
     return 0;
@@ -2779,12 +2780,12 @@ set_nothrow_function_flags (void)
 
        if (!CALL_P (insn) || !SIBLING_CALL_P (insn))
          {
-           cfun->all_throwers_are_sibcalls = 0;
+           crtl->all_throwers_are_sibcalls = 0;
            return 0;
          }
       }
 
-  for (insn = current_function_epilogue_delay_list; insn;
+  for (insn = crtl->epilogue_delay_list; insn;
        insn = XEXP (insn, 1))
     if (can_throw_external (insn))
       {
@@ -2792,7 +2793,7 @@ set_nothrow_function_flags (void)
 
        if (!CALL_P (insn) || !SIBLING_CALL_P (insn))
          {
-           cfun->all_throwers_are_sibcalls = 0;
+           crtl->all_throwers_are_sibcalls = 0;
            return 0;
          }
       }
@@ -2829,7 +2830,7 @@ expand_builtin_unwind_init (void)
 {
   /* Set this so all the registers get saved in our frame; we need to be
      able to copy the saved values for any registers from frames we unwind.  */
-  current_function_saves_all_registers = 1;
+  crtl->saves_all_registers = 1;
 
 #ifdef SETUP_FRAME_ADDRESSES
   SETUP_FRAME_ADDRESSES ();
@@ -2952,7 +2953,7 @@ expand_eh_return (void)
   if (! crtl->eh.ehr_label)
     return;
 
-  current_function_calls_eh_return = 1;
+  crtl->calls_eh_return = 1;
 
 #ifdef EH_RETURN_STACKADJ_RTX
   emit_move_insn (EH_RETURN_STACKADJ_RTX, const0_rtx);
@@ -3248,7 +3249,7 @@ convert_to_eh_region_ranges (void)
        /* Existence of catch handlers, or must-not-throw regions
           implies that an lsda is needed (even if empty).  */
        if (this_action != -1)
-         cfun->uses_eh_lsda = 1;
+         crtl->uses_eh_lsda = 1;
 
        /* Delay creation of region notes for no-action regions
           until we're sure that an lsda will be required.  */
@@ -3379,13 +3380,13 @@ push_sleb128 (varray_type *data_area, int value)
 static int
 dw2_size_of_call_site_table (void)
 {
-  int n = cfun->eh->call_site_data_used;
+  int n = VEC_length (call_site_record, crtl->eh.call_site_record);
   int size = n * (4 + 4 + 4);
   int i;
 
   for (i = 0; i < n; ++i)
     {
-      struct call_site_record *cs = &cfun->eh->call_site_data[i];
+      struct call_site_record *cs = VEC_index (call_site_record, crtl->eh.call_site_record, i);
       size += size_of_uleb128 (cs->action);
     }
 
@@ -3395,13 +3396,13 @@ dw2_size_of_call_site_table (void)
 static int
 sjlj_size_of_call_site_table (void)
 {
-  int n = cfun->eh->call_site_data_used;
+  int n = VEC_length (call_site_record, crtl->eh.call_site_record);
   int size = 0;
   int i;
 
   for (i = 0; i < n; ++i)
     {
-      struct call_site_record *cs = &cfun->eh->call_site_data[i];
+      struct call_site_record *cs = VEC_index (call_site_record, crtl->eh.call_site_record, i);
       size += size_of_uleb128 (INTVAL (cs->landing_pad));
       size += size_of_uleb128 (cs->action);
     }
@@ -3599,7 +3600,7 @@ output_function_exception_table (const char * ARG_UNUSED (fnname))
   int tt_format_size = 0;
 
   /* Not all functions need anything.  */
-  if (! cfun->uses_eh_lsda)
+  if (! crtl->uses_eh_lsda)
     return;
 
   if (eh_personality_libfunc)