This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: struct eh_status breakup


On Sun, 13 Apr 2008, Jan Hubicka wrote:

> Hi,
> this patch breaks out RTL specific bits of eh_status datastructure that is now
> pointed to by struct function.  Since the structure becomes quite tiny, I think
> it will make sense to make lowered EH part of struct function or of CFG
> structure to avoid memory fragmentation.  There are still few bits to push out
> (i.e. last_region_number is just size of region_array) and EH regions
> themselves still contain a lot of RTL specific bits that should go into separate
> array.
> 
> The patch also converts call_site_record into vector, since gengtype is
> refusing length attribut on array and vector is fitting here better anyway.  I
> also had to extend gengtype to accept param_is argument for hashtables
> contained in global roots.
> 
> Finally the patch drops note_current_region_may_contain_throw that is noop ever
> since we converted to lowered EH at tree level and drops cfun argument from
> get_exception_pointer and get_exception_filter.
> 
> Bootstrapped/regtested i686-linux, x86_64 and ppc in progress, OK?

Ok.  Please wait for comments from other people though.

Thanks,
Richard.

> 
> Honza
> 
> 	* gengtype.c (write_root): Param_is argument is OK.
> 	* expr.c (expand_expr_real_1): Update call of get_exception_*.
> 	* function.h: Include varray.h
> 	(rtl_eh): New stucture based on except.c one.
> 	(call_site_record): New forward declaration and vector type.
> 	* calls.c (emit_call_1): Do not call note_current_region_may_contain_throw.
> 	* except.c (eh_status): Remove cur_region, try_region since they are unused.
> 	Move filter, exc_ptr, ttype_data, ehspec_data, action_record_data and
> 	exception_handler_label_map, ehr_stackadj, ehr_handler, ehr_label,
> 	sjlj_fc, sjlj_exit_after to rth_eh in function.h. 
> 	Remove call_site_data_used, call_site_data_size.
> 	Turn call_site_record into vector in function.h.
> 	(note_current_region_may_contain_throw): Remove.
> 	(get_exception_pointer, get_exception_filter): Do not take struct
> 	function argument; update.
> 	(add_ehl_entry, find_exception_handler_labels, ehspec_filter_hash,
> 	add_ttypes_entry, add_ehspec_entry, assign_filter_values,
> 	build_post_landing_pads, dw2_build_landing_pads,
> 	sjlj_assign_call_site_values, sjlj_mark_call_sites,
> 	sjlj_emit_function_enter, sjlj_emit_function_enter, 
> 	sjlj_emit_function_exit, sjlj_emit_dispatch_table,
> 	sjlj_build_landing_pads, finish_eh_generation,
> 	remove_exception_handler_label, remove_eh_handler,
> 	maybe_remove_eh_handler, add_reachable_handler,
> 	reachable_handlers, expand_builtin_eh_return,
> 	expand_eh_return, add_action_record, collect_one_action_chain,
> 	add_call_site, convert_to_eh_region_ranges, sjlj_size_of_call_site_table,
> 	sjlj_output_call_site_table, output_function_exception_table,
> 	* except.h (note_current_region_may_contain_throw): Remove
> 	(get_exception_pointer, get_exception_filter): Do not take struct function
> 	argument.
> 	* Makefile.in (GTFILES): Put varargs before struct function.
> Index: gengtype.c
> ===================================================================
> *** gengtype.c	(revision 134239)
> --- gengtype.c	(working copy)
> *************** write_root (outf_p f, pair_p v, type_p t
> *** 2980,2985 ****
> --- 2980,2987 ----
>   		skip_p = 1;
>   	      else if (strcmp (o->name, "desc") == 0)
>   		desc = o->info;
> + 	      else if (strcmp (o->name, "param_is") == 0)
> + 		;
>   	      else
>   		error_at_line (line,
>   		       "field `%s' of global `%s' has unknown option `%s'",
> Index: expr.c
> ===================================================================
> *** expr.c	(revision 134239)
> --- expr.c	(working copy)
> *************** expand_expr_real_1 (tree exp, rtx target
> *** 9180,9189 ****
>         return const0_rtx;
>   
>       case EXC_PTR_EXPR:
> !       return get_exception_pointer (cfun);
>   
>       case FILTER_EXPR:
> !       return get_exception_filter (cfun);
>   
>       case FDESC_EXPR:
>         /* Function descriptors are not valid except for as
> --- 9180,9189 ----
>         return const0_rtx;
>   
>       case EXC_PTR_EXPR:
> !       return get_exception_pointer ();
>   
>       case FILTER_EXPR:
> !       return get_exception_filter ();
>   
>       case FDESC_EXPR:
>         /* Function descriptors are not valid except for as
> Index: function.h
> ===================================================================
> *** function.h	(revision 134239)
> --- function.h	(working copy)
> *************** along with GCC; see the file COPYING3.  
> *** 24,29 ****
> --- 24,30 ----
>   
>   #include "tree.h"
>   #include "hashtab.h"
> + #include "varray.h"
>   
>   /* Stack of pending (incomplete) sequences saved by `start_sequence'.
>      Each element describes one pending sequence.
> *************** struct expr_status GTY(())
> *** 136,141 ****
> --- 137,170 ----
>     rtx x_forced_labels;
>   };
>   
> + typedef struct call_site_record *call_site_record;
> + DEF_VEC_P(call_site_record);
> + DEF_VEC_ALLOC_P(call_site_record, gc);
> + 
> + /* RTL representation of exception handling.  */
> + struct rtl_eh GTY(())
> + {
> +   rtx filter;
> +   rtx exc_ptr;
> + 
> +   int built_landing_pads;
> + 
> +   rtx ehr_stackadj;
> +   rtx ehr_handler;
> +   rtx ehr_label;
> + 
> +   rtx sjlj_fc;
> +   rtx sjlj_exit_after;
> + 
> +   htab_t GTY ((param_is (struct ehl_map_entry))) exception_handler_label_map;
> + 
> +   VEC(tree,gc) *ttype_data;
> +   varray_type ehspec_data;
> +   varray_type action_record_data;
> + 
> +   VEC(call_site_record,gc) *call_site_record;
> + };
> + 
>   #define pending_stack_adjust (crtl->expr.x_pending_stack_adjust)
>   #define inhibit_defer_pop (crtl->expr.x_inhibit_defer_pop)
>   #define saveregs_value (crtl->expr.x_saveregs_value)
> *************** struct expr_status GTY(())
> *** 146,151 ****
> --- 175,181 ----
>   struct gimple_df;
>   struct temp_slot;
>   typedef struct temp_slot *temp_slot_p;
> + struct call_site_record;
>   
>   DEF_VEC_P(temp_slot_p);
>   DEF_VEC_ALLOC_P(temp_slot_p,gc);
> *************** struct rtl_data GTY(())
> *** 227,232 ****
> --- 257,263 ----
>     struct varasm_status varasm;
>     struct incoming_args args;
>     struct function_subsections subsections;
> +   struct rtl_eh eh;
>   
>     /* For function.c  */
>   
> Index: calls.c
> ===================================================================
> *** calls.c	(revision 134239)
> --- calls.c	(working copy)
> *************** emit_call_1 (rtx funexp, tree fntree, tr
> *** 389,395 ****
>         if (rn > 0)
>   	REG_NOTES (call_insn) = gen_rtx_EXPR_LIST (REG_EH_REGION, GEN_INT (rn),
>   						   REG_NOTES (call_insn));
> -       note_current_region_may_contain_throw ();
>       }
>   
>     if (ecf_flags & ECF_NORETURN)
> --- 389,394 ----
> Index: except.c
> ===================================================================
> *** except.c	(revision 134239)
> --- except.c	(working copy)
> *************** along with GCC; see the file COPYING3.  
> *** 84,90 ****
>   #define EH_RETURN_DATA_REGNO(N) INVALID_REGNUM
>   #endif
>   
> - 
>   /* Protect cleanup actions with must-not-throw regions, with a call
>      to the given failure handler.  */
>   tree (*lang_protect_cleanup_actions) (void);
> --- 84,89 ----
> *************** struct eh_status GTY(())
> *** 218,254 ****
>   
>     /* The same information as an indexable array.  */
>     VEC(eh_region,gc) *region_array;
> - 
> -   /* The most recently open region.  */
> -   struct eh_region *cur_region;
> - 
> -   /* This is the region for which we are processing catch blocks.  */
> -   struct eh_region *try_region;
> - 
> -   rtx filter;
> -   rtx exc_ptr;
> - 
> -   int built_landing_pads;
>     int last_region_number;
>   
> -   VEC(tree,gc) *ttype_data;
> -   varray_type ehspec_data;
> -   varray_type action_record_data;
> - 
> -   htab_t GTY ((param_is (struct ehl_map_entry))) exception_handler_label_map;
> - 
> -   struct call_site_record * GTY ((length ("%h.call_site_data_used")))
> -     call_site_data;
> -   int call_site_data_used;
> -   int call_site_data_size;
> - 
> -   rtx ehr_stackadj;
> -   rtx ehr_handler;
> -   rtx ehr_label;
> - 
> -   rtx sjlj_fc;
> -   rtx sjlj_exit_after;
> - 
>     htab_t GTY((param_is (struct throw_stmt_node))) throw_stmt_table;
>   };
>   
> --- 217,224 ----
> *************** note_eh_region_may_contain_throw (struct
> *** 587,627 ****
>       }
>   }
>   
> - void
> - note_current_region_may_contain_throw (void)
> - {
> -   note_eh_region_may_contain_throw (cfun->eh->cur_region);
> - }
> - 
>   
>   /* Return an rtl expression for a pointer to the exception object
>      within a handler.  */
>   
>   rtx
> ! get_exception_pointer (struct function *fun)
>   {
> !   rtx exc_ptr = fun->eh->exc_ptr;
> !   if (fun == cfun && ! exc_ptr)
> !     {
> !       exc_ptr = gen_reg_rtx (ptr_mode);
> !       fun->eh->exc_ptr = exc_ptr;
> !     }
> !   return exc_ptr;
>   }
>   
>   /* Return an rtl expression for the exception dispatch filter
>      within a handler.  */
>   
>   rtx
> ! get_exception_filter (struct function *fun)
>   {
> !   rtx filter = fun->eh->filter;
> !   if (fun == cfun && ! filter)
> !     {
> !       filter = gen_reg_rtx (targetm.eh_return_filter_mode ());
> !       fun->eh->filter = filter;
> !     }
> !   return filter;
>   }
>   
>   /* This section is for the exception handling specific optimization pass.  */
> --- 557,583 ----
>       }
>   }
>   
>   
>   /* Return an rtl expression for a pointer to the exception object
>      within a handler.  */
>   
>   rtx
> ! get_exception_pointer (void)
>   {
> !   if (! crtl->eh.exc_ptr)
> !     crtl->eh.exc_ptr = gen_reg_rtx (ptr_mode);
> !   return crtl->eh.exc_ptr;
>   }
>   
>   /* Return an rtl expression for the exception dispatch filter
>      within a handler.  */
>   
>   rtx
> ! get_exception_filter (void)
>   {
> !   if (! crtl->eh.filter)
> !     crtl->eh.filter = gen_reg_rtx (targetm.eh_return_filter_mode ());
> !   return crtl->eh.filter;
>   }
>   
>   /* This section is for the exception handling specific optimization pass.  */
> *************** add_ehl_entry (rtx label, struct eh_regi
> *** 783,795 ****
>     entry->region = region;
>   
>     slot = (struct ehl_map_entry **)
> !     htab_find_slot (cfun->eh->exception_handler_label_map, entry, INSERT);
>   
>     /* Before landing pad creation, each exception handler has its own
>        label.  After landing pad creation, the exception handlers may
>        share landing pads.  This is ok, since maybe_remove_eh_handler
>        only requires the 1-1 mapping before landing pad creation.  */
> !   gcc_assert (!*slot || cfun->eh->built_landing_pads);
>   
>     *slot = entry;
>   }
> --- 739,751 ----
>     entry->region = region;
>   
>     slot = (struct ehl_map_entry **)
> !     htab_find_slot (crtl->eh.exception_handler_label_map, entry, INSERT);
>   
>     /* Before landing pad creation, each exception handler has its own
>        label.  After landing pad creation, the exception handlers may
>        share landing pads.  This is ok, since maybe_remove_eh_handler
>        only requires the 1-1 mapping before landing pad creation.  */
> !   gcc_assert (!*slot || crtl->eh.built_landing_pads);
>   
>     *slot = entry;
>   }
> *************** find_exception_handler_labels (void)
> *** 799,811 ****
>   {
>     int i;
>   
> !   if (cfun->eh->exception_handler_label_map)
> !     htab_empty (cfun->eh->exception_handler_label_map);
>     else
>       {
>         /* ??? The expansion factor here (3/2) must be greater than the htab
>   	 occupancy factor (4/3) to avoid unnecessary resizing.  */
> !       cfun->eh->exception_handler_label_map
>           = htab_create_ggc (cfun->eh->last_region_number * 3 / 2,
>   			   ehl_hash, ehl_eq, NULL);
>       }
> --- 755,767 ----
>   {
>     int i;
>   
> !   if (crtl->eh.exception_handler_label_map)
> !     htab_empty (crtl->eh.exception_handler_label_map);
>     else
>       {
>         /* ??? The expansion factor here (3/2) must be greater than the htab
>   	 occupancy factor (4/3) to avoid unnecessary resizing.  */
> !       crtl->eh.exception_handler_label_map
>           = htab_create_ggc (cfun->eh->last_region_number * 3 / 2,
>   			   ehl_hash, ehl_eq, NULL);
>       }
> *************** find_exception_handler_labels (void)
> *** 821,827 ****
>         region = VEC_index (eh_region, cfun->eh->region_array, i);
>         if (! region || region->region_number != i)
>   	continue;
> !       if (cfun->eh->built_landing_pads)
>   	lab = region->landing_pad;
>         else
>   	lab = region->label;
> --- 777,783 ----
>         region = VEC_index (eh_region, cfun->eh->region_array, i);
>         if (! region || region->region_number != i)
>   	continue;
> !       if (crtl->eh.built_landing_pads)
>   	lab = region->landing_pad;
>         else
>   	lab = region->label;
> *************** find_exception_handler_labels (void)
> *** 832,838 ****
>   
>     /* For sjlj exceptions, need the return label to remain live until
>        after landing pad generation.  */
> !   if (USING_SJLJ_EXCEPTIONS && ! cfun->eh->built_landing_pads)
>       add_ehl_entry (return_label, NULL);
>   }
>   
> --- 788,794 ----
>   
>     /* For sjlj exceptions, need the return label to remain live until
>        after landing pad generation.  */
> !   if (USING_SJLJ_EXCEPTIONS && ! crtl->eh.built_landing_pads)
>       add_ehl_entry (return_label, NULL);
>   }
>   
> *************** ehspec_filter_hash (const void *pentry)
> *** 1227,1233 ****
>     return h;
>   }
>   
> ! /* Add TYPE (which may be NULL) to cfun->eh->ttype_data, using TYPES_HASH
>      to speed up the search.  Return the filter value to be used.  */
>   
>   static int
> --- 1183,1189 ----
>     return h;
>   }
>   
> ! /* Add TYPE (which may be NULL) to crtl->eh.ttype_data, using TYPES_HASH
>      to speed up the search.  Return the filter value to be used.  */
>   
>   static int
> *************** add_ttypes_entry (htab_t ttypes_hash, tr
> *** 1244,1259 ****
>   
>         n = XNEW (struct ttypes_filter);
>         n->t = type;
> !       n->filter = VEC_length (tree, cfun->eh->ttype_data) + 1;
>         *slot = n;
>   
> !       VEC_safe_push (tree, gc, cfun->eh->ttype_data, type);
>       }
>   
>     return n->filter;
>   }
>   
> ! /* Add LIST to cfun->eh->ehspec_data, using EHSPEC_HASH and TYPES_HASH
>      to speed up the search.  Return the filter value to be used.  */
>   
>   static int
> --- 1200,1215 ----
>   
>         n = XNEW (struct ttypes_filter);
>         n->t = type;
> !       n->filter = VEC_length (tree, crtl->eh.ttype_data) + 1;
>         *slot = n;
>   
> !       VEC_safe_push (tree, gc, crtl->eh.ttype_data, type);
>       }
>   
>     return n->filter;
>   }
>   
> ! /* Add LIST to crtl->eh.ehspec_data, using EHSPEC_HASH and TYPES_HASH
>      to speed up the search.  Return the filter value to be used.  */
>   
>   static int
> *************** add_ehspec_entry (htab_t ehspec_hash, ht
> *** 1272,1297 ****
>   
>         n = XNEW (struct ttypes_filter);
>         n->t = list;
> !       n->filter = -(VARRAY_ACTIVE_SIZE (cfun->eh->ehspec_data) + 1);
>         *slot = n;
>   
>         /* Generate a 0 terminated list of filter values.  */
>         for (; list ; list = TREE_CHAIN (list))
>   	{
>   	  if (targetm.arm_eabi_unwinder)
> ! 	    VARRAY_PUSH_TREE (cfun->eh->ehspec_data, TREE_VALUE (list));
>   	  else
>   	    {
>   	      /* Look up each type in the list and encode its filter
>   		 value as a uleb128.  */
> ! 	      push_uleb128 (&cfun->eh->ehspec_data,
>   		  add_ttypes_entry (ttypes_hash, TREE_VALUE (list)));
>   	    }
>   	}
>         if (targetm.arm_eabi_unwinder)
> ! 	VARRAY_PUSH_TREE (cfun->eh->ehspec_data, NULL_TREE);
>         else
> ! 	VARRAY_PUSH_UCHAR (cfun->eh->ehspec_data, 0);
>       }
>   
>     return n->filter;
> --- 1228,1253 ----
>   
>         n = XNEW (struct ttypes_filter);
>         n->t = list;
> !       n->filter = -(VARRAY_ACTIVE_SIZE (crtl->eh.ehspec_data) + 1);
>         *slot = n;
>   
>         /* Generate a 0 terminated list of filter values.  */
>         for (; list ; list = TREE_CHAIN (list))
>   	{
>   	  if (targetm.arm_eabi_unwinder)
> ! 	    VARRAY_PUSH_TREE (crtl->eh.ehspec_data, TREE_VALUE (list));
>   	  else
>   	    {
>   	      /* Look up each type in the list and encode its filter
>   		 value as a uleb128.  */
> ! 	      push_uleb128 (&crtl->eh.ehspec_data,
>   		  add_ttypes_entry (ttypes_hash, TREE_VALUE (list)));
>   	    }
>   	}
>         if (targetm.arm_eabi_unwinder)
> ! 	VARRAY_PUSH_TREE (crtl->eh.ehspec_data, NULL_TREE);
>         else
> ! 	VARRAY_PUSH_UCHAR (crtl->eh.ehspec_data, 0);
>       }
>   
>     return n->filter;
> *************** assign_filter_values (void)
> *** 1308,1318 ****
>     int i;
>     htab_t ttypes, ehspec;
>   
> !   cfun->eh->ttype_data = VEC_alloc (tree, gc, 16);
>     if (targetm.arm_eabi_unwinder)
> !     VARRAY_TREE_INIT (cfun->eh->ehspec_data, 64, "ehspec_data");
>     else
> !     VARRAY_UCHAR_INIT (cfun->eh->ehspec_data, 64, "ehspec_data");
>   
>     ttypes = htab_create (31, ttypes_filter_hash, ttypes_filter_eq, free);
>     ehspec = htab_create (31, ehspec_filter_hash, ehspec_filter_eq, free);
> --- 1264,1274 ----
>     int i;
>     htab_t ttypes, ehspec;
>   
> !   crtl->eh.ttype_data = VEC_alloc (tree, gc, 16);
>     if (targetm.arm_eabi_unwinder)
> !     VARRAY_TREE_INIT (crtl->eh.ehspec_data, 64, "ehspec_data");
>     else
> !     VARRAY_UCHAR_INIT (crtl->eh.ehspec_data, 64, "ehspec_data");
>   
>     ttypes = htab_create (31, ttypes_filter_hash, ttypes_filter_eq, free);
>     ehspec = htab_create (31, ehspec_filter_hash, ehspec_filter_eq, free);
> *************** build_post_landing_pads (void)
> *** 1457,1463 ****
>   		    for (; tp_node; )
>   		      {
>   			emit_cmp_and_jump_insns
> ! 			  (cfun->eh->filter,
>   			   GEN_INT (tree_low_cst (TREE_VALUE (flt_node), 0)),
>   			   EQ, NULL_RTX,
>   			   targetm.eh_return_filter_mode (), 0, c->label);
> --- 1413,1419 ----
>   		    for (; tp_node; )
>   		      {
>   			emit_cmp_and_jump_insns
> ! 			  (crtl->eh.filter,
>   			   GEN_INT (tree_low_cst (TREE_VALUE (flt_node), 0)),
>   			   EQ, NULL_RTX,
>   			   targetm.eh_return_filter_mode (), 0, c->label);
> *************** build_post_landing_pads (void)
> *** 1490,1496 ****
>   
>   	  emit_label (region->post_landing_pad);
>   
> ! 	  emit_cmp_and_jump_insns (cfun->eh->filter,
>   				   GEN_INT (region->u.allowed.filter),
>   				   EQ, NULL_RTX,
>   				   targetm.eh_return_filter_mode (), 0, region->label);
> --- 1446,1452 ----
>   
>   	  emit_label (region->post_landing_pad);
>   
> ! 	  emit_cmp_and_jump_insns (crtl->eh.filter,
>   				   GEN_INT (region->u.allowed.filter),
>   				   EQ, NULL_RTX,
>   				   targetm.eh_return_filter_mode (), 0, region->label);
> *************** connect_post_landing_pads (void)
> *** 1573,1579 ****
>         else
>   	{
>   	  emit_library_call (unwind_resume_libfunc, LCT_THROW,
> ! 			     VOIDmode, 1, cfun->eh->exc_ptr, ptr_mode);
>   
>   	  /* What we just emitted was a throwing libcall, so it got a
>   	     barrier automatically added after it.  If the last insn in
> --- 1529,1535 ----
>         else
>   	{
>   	  emit_library_call (unwind_resume_libfunc, LCT_THROW,
> ! 			     VOIDmode, 1, crtl->eh.exc_ptr, ptr_mode);
>   
>   	  /* What we just emitted was a throwing libcall, so it got a
>   	     barrier automatically added after it.  If the last insn in
> *************** dw2_build_landing_pads (void)
> *** 1643,1651 ****
>   #endif
>   	  { /* Nothing */ }
>   
> !       emit_move_insn (cfun->eh->exc_ptr,
>   		      gen_rtx_REG (ptr_mode, EH_RETURN_DATA_REGNO (0)));
> !       emit_move_insn (cfun->eh->filter,
>   		      gen_rtx_REG (targetm.eh_return_filter_mode (),
>   				   EH_RETURN_DATA_REGNO (1)));
>   
> --- 1599,1607 ----
>   #endif
>   	  { /* Nothing */ }
>   
> !       emit_move_insn (crtl->eh.exc_ptr,
>   		      gen_rtx_REG (ptr_mode, EH_RETURN_DATA_REGNO (0)));
> !       emit_move_insn (crtl->eh.filter,
>   		      gen_rtx_REG (targetm.eh_return_filter_mode (),
>   				   EH_RETURN_DATA_REGNO (1)));
>   
> *************** sjlj_assign_call_site_values (rtx dispat
> *** 1724,1730 ****
>   
>     /* First task: build the action table.  */
>   
> !   VARRAY_UCHAR_INIT (cfun->eh->action_record_data, 64, "action_record_data");
>     ar_hash = htab_create (31, action_record_hash, action_record_eq, free);
>   
>     for (i = cfun->eh->last_region_number; i > 0; --i)
> --- 1680,1686 ----
>   
>     /* First task: build the action table.  */
>   
> !   VARRAY_UCHAR_INIT (crtl->eh.action_record_data, 64, "action_record_data");
>     ar_hash = htab_create (31, action_record_hash, action_record_eq, free);
>   
>     for (i = cfun->eh->last_region_number; i > 0; --i)
> *************** sjlj_mark_call_sites (struct sjlj_lp_inf
> *** 1830,1836 ****
>   	before = find_first_parameter_load (insn, NULL_RTX);
>   
>         start_sequence ();
> !       mem = adjust_address (cfun->eh->sjlj_fc, TYPE_MODE (integer_type_node),
>   			    sjlj_fc_call_site_ofs);
>         emit_move_insn (mem, GEN_INT (this_call_site));
>         p = get_insns ();
> --- 1786,1792 ----
>   	before = find_first_parameter_load (insn, NULL_RTX);
>   
>         start_sequence ();
> !       mem = adjust_address (crtl->eh.sjlj_fc, TYPE_MODE (integer_type_node),
>   			    sjlj_fc_call_site_ofs);
>         emit_move_insn (mem, GEN_INT (this_call_site));
>         p = get_insns ();
> *************** sjlj_emit_function_enter (rtx dispatch_l
> *** 1849,1855 ****
>     rtx fn_begin, fc, mem, seq;
>     bool fn_begin_outside_block;
>   
> !   fc = cfun->eh->sjlj_fc;
>   
>     start_sequence ();
>   
> --- 1805,1811 ----
>     rtx fn_begin, fc, mem, seq;
>     bool fn_begin_outside_block;
>   
> !   fc = crtl->eh.sjlj_fc;
>   
>     start_sequence ();
>   
> *************** sjlj_emit_function_enter (rtx dispatch_l
> *** 1923,1929 ****
>   void
>   sjlj_emit_function_exit_after (rtx after)
>   {
> !   cfun->eh->sjlj_exit_after = after;
>   }
>   
>   static void
> --- 1879,1885 ----
>   void
>   sjlj_emit_function_exit_after (rtx after)
>   {
> !   crtl->eh.sjlj_exit_after = after;
>   }
>   
>   static void
> *************** sjlj_emit_function_exit (void)
> *** 1936,1942 ****
>     start_sequence ();
>   
>     emit_library_call (unwind_sjlj_unregister_libfunc, LCT_NORMAL, VOIDmode,
> ! 		     1, XEXP (cfun->eh->sjlj_fc, 0), Pmode);
>   
>     seq = get_insns ();
>     end_sequence ();
> --- 1892,1898 ----
>     start_sequence ();
>   
>     emit_library_call (unwind_sjlj_unregister_libfunc, LCT_NORMAL, VOIDmode,
> ! 		     1, XEXP (crtl->eh.sjlj_fc, 0), Pmode);
>   
>     seq = get_insns ();
>     end_sequence ();
> *************** sjlj_emit_function_exit (void)
> *** 1958,1964 ****
>         gcc_assert (e->src->next_bb == EXIT_BLOCK_PTR);
>         for (insn = BB_HEAD (e->src); ; insn = NEXT_INSN (insn))
>   	{
> ! 	  if (insn == cfun->eh->sjlj_exit_after)
>   	    {
>   	      if (LABEL_P (insn))
>   		insn = NEXT_INSN (insn);
> --- 1914,1920 ----
>         gcc_assert (e->src->next_bb == EXIT_BLOCK_PTR);
>         for (insn = BB_HEAD (e->src); ; insn = NEXT_INSN (insn))
>   	{
> ! 	  if (insn == crtl->eh.sjlj_exit_after)
>   	    {
>   	      if (LABEL_P (insn))
>   		insn = NEXT_INSN (insn);
> *************** sjlj_emit_dispatch_table (rtx dispatch_l
> *** 1981,1987 ****
>     basic_block bb;
>     edge e;
>   
> !   fc = cfun->eh->sjlj_fc;
>   
>     start_sequence ();
>   
> --- 1937,1943 ----
>     basic_block bb;
>     edge e;
>   
> !   fc = crtl->eh.sjlj_fc;
>   
>     start_sequence ();
>   
> *************** sjlj_emit_dispatch_table (rtx dispatch_l
> *** 2006,2015 ****
>         mem = convert_to_mode (ptr_mode, mem, 0);
>   #endif
>       }
> !   emit_move_insn (cfun->eh->exc_ptr, mem);
>   
>     mem = adjust_address (fc, word_mode, sjlj_fc_data_ofs + UNITS_PER_WORD);
> !   emit_move_insn (cfun->eh->filter, mem);
>   
>     /* Jump to one of the directly reachable regions.  */
>     /* ??? This really ought to be using a switch statement.  */
> --- 1962,1971 ----
>         mem = convert_to_mode (ptr_mode, mem, 0);
>   #endif
>       }
> !   emit_move_insn (crtl->eh.exc_ptr, mem);
>   
>     mem = adjust_address (fc, word_mode, sjlj_fc_data_ofs + UNITS_PER_WORD);
> !   emit_move_insn (crtl->eh.filter, mem);
>   
>     /* Jump to one of the directly reachable regions.  */
>     /* ??? This really ought to be using a switch statement.  */
> *************** sjlj_build_landing_pads (void)
> *** 2055,2061 ****
>       {
>         rtx dispatch_label = gen_label_rtx ();
>   
> !       cfun->eh->sjlj_fc
>   	= assign_stack_local (TYPE_MODE (sjlj_fc_type_node),
>   			      int_size_in_bytes (sjlj_fc_type_node),
>   			      TYPE_ALIGN (sjlj_fc_type_node));
> --- 2011,2017 ----
>       {
>         rtx dispatch_label = gen_label_rtx ();
>   
> !       crtl->eh.sjlj_fc
>   	= assign_stack_local (TYPE_MODE (sjlj_fc_type_node),
>   			      int_size_in_bytes (sjlj_fc_type_node),
>   			      TYPE_ALIGN (sjlj_fc_type_node));
> *************** finish_eh_generation (void)
> *** 2091,2098 ****
>   
>     /* These registers are used by the landing pads.  Make sure they
>        have been generated.  */
> !   get_exception_pointer (cfun);
> !   get_exception_filter (cfun);
>   
>     /* Construct the landing pads.  */
>   
> --- 2047,2054 ----
>   
>     /* These registers are used by the landing pads.  Make sure they
>        have been generated.  */
> !   get_exception_pointer ();
> !   get_exception_filter ();
>   
>     /* Construct the landing pads.  */
>   
> *************** finish_eh_generation (void)
> *** 2104,2110 ****
>     else
>       dw2_build_landing_pads ();
>   
> !   cfun->eh->built_landing_pads = 1;
>   
>     /* We've totally changed the CFG.  Start over.  */
>     find_exception_handler_labels ();
> --- 2060,2066 ----
>     else
>       dw2_build_landing_pads ();
>   
> !   crtl->eh.built_landing_pads = 1;
>   
>     /* We've totally changed the CFG.  Start over.  */
>     find_exception_handler_labels ();
> *************** remove_exception_handler_label (rtx labe
> *** 2166,2180 ****
>   
>     /* If exception_handler_label_map was not built yet,
>        there is nothing to do.  */
> !   if (cfun->eh->exception_handler_label_map == NULL)
>       return;
>   
>     tmp.label = label;
>     slot = (struct ehl_map_entry **)
> !     htab_find_slot (cfun->eh->exception_handler_label_map, &tmp, NO_INSERT);
>     gcc_assert (slot);
>   
> !   htab_clear_slot (cfun->eh->exception_handler_label_map, (void **) slot);
>   }
>   
>   /* Splice REGION from the region tree etc.  */
> --- 2122,2136 ----
>   
>     /* If exception_handler_label_map was not built yet,
>        there is nothing to do.  */
> !   if (crtl->eh.exception_handler_label_map == NULL)
>       return;
>   
>     tmp.label = label;
>     slot = (struct ehl_map_entry **)
> !     htab_find_slot (crtl->eh.exception_handler_label_map, &tmp, NO_INSERT);
>     gcc_assert (slot);
>   
> !   htab_clear_slot (crtl->eh.exception_handler_label_map, (void **) slot);
>   }
>   
>   /* Splice REGION from the region tree etc.  */
> *************** remove_eh_handler (struct eh_region *reg
> *** 2213,2219 ****
>         bitmap_set_bit (outer->aka, region->region_number);
>       }
>   
> !   if (cfun->eh->built_landing_pads)
>       lab = region->landing_pad;
>     else
>       lab = region->label;
> --- 2169,2175 ----
>         bitmap_set_bit (outer->aka, region->region_number);
>       }
>   
> !   if (crtl->eh.built_landing_pads)
>       lab = region->landing_pad;
>     else
>       lab = region->label;
> *************** maybe_remove_eh_handler (rtx label)
> *** 2281,2292 ****
>        if the region data is completely unused.  One must examine the
>        landing pad and the post landing pad, and whether an inner try block
>        is referencing the catch handlers directly.  */
> !   if (cfun->eh->built_landing_pads)
>       return;
>   
>     tmp.label = label;
>     slot = (struct ehl_map_entry **)
> !     htab_find_slot (cfun->eh->exception_handler_label_map, &tmp, NO_INSERT);
>     if (! slot)
>       return;
>     region = (*slot)->region;
> --- 2237,2248 ----
>        if the region data is completely unused.  One must examine the
>        landing pad and the post landing pad, and whether an inner try block
>        is referencing the catch handlers directly.  */
> !   if (crtl->eh.built_landing_pads)
>       return;
>   
>     tmp.label = label;
>     slot = (struct ehl_map_entry **)
> !     htab_find_slot (crtl->eh.exception_handler_label_map, &tmp, NO_INSERT);
>     if (! slot)
>       return;
>     region = (*slot)->region;
> *************** maybe_remove_eh_handler (rtx label)
> *** 2299,2305 ****
>        are no more contained calls, which we don't see here.  */
>     if (region->type == ERT_MUST_NOT_THROW)
>       {
> !       htab_clear_slot (cfun->eh->exception_handler_label_map, (void **) slot);
>         region->label = NULL_RTX;
>       }
>     else
> --- 2255,2261 ----
>        are no more contained calls, which we don't see here.  */
>     if (region->type == ERT_MUST_NOT_THROW)
>       {
> !       htab_clear_slot (crtl->eh.exception_handler_label_map, (void **) slot);
>         region->label = NULL_RTX;
>       }
>     else
> *************** maybe_remove_eh_handler (rtx label)
> *** 2312,2318 ****
>   void
>   for_each_eh_label (void (*callback) (rtx))
>   {
> !   htab_traverse (cfun->eh->exception_handler_label_map, for_each_eh_label_1,
>   		 (void *) &callback);
>   }
>   
> --- 2268,2274 ----
>   void
>   for_each_eh_label (void (*callback) (rtx))
>   {
> !   htab_traverse (crtl->eh.exception_handler_label_map, for_each_eh_label_1,
>   		 (void *) &callback);
>   }
>   
> *************** add_reachable_handler (struct reachable_
> *** 2396,2402 ****
>   
>     info->saw_any_handlers = true;
>   
> !   if (cfun->eh->built_landing_pads)
>       info->callback (lp_region, info->callback_data);
>     else
>       info->callback (region, info->callback_data);
> --- 2352,2358 ----
>   
>     info->saw_any_handlers = true;
>   
> !   if (crtl->eh.built_landing_pads)
>       info->callback (lp_region, info->callback_data);
>     else
>       info->callback (region, info->callback_data);
> *************** reachable_handlers (rtx insn)
> *** 2658,2664 ****
>       }
>   
>     foreach_reachable_handler (region_number, is_resx,
> ! 			     (cfun->eh->built_landing_pads
>   			      ? arh_to_landing_pad
>   			      : arh_to_label),
>   			     &handlers);
> --- 2614,2620 ----
>       }
>   
>     foreach_reachable_handler (region_number, is_resx,
> ! 			     (crtl->eh.built_landing_pads
>   			      ? arh_to_landing_pad
>   			      : arh_to_label),
>   			     &handlers);
> *************** expand_builtin_eh_return (tree stackadj_
> *** 2966,2991 ****
>     rtx tmp;
>   
>   #ifdef EH_RETURN_STACKADJ_RTX
> !   tmp = expand_expr (stackadj_tree, cfun->eh->ehr_stackadj,
>   		     VOIDmode, EXPAND_NORMAL);
>     tmp = convert_memory_address (Pmode, tmp);
> !   if (!cfun->eh->ehr_stackadj)
> !     cfun->eh->ehr_stackadj = copy_to_reg (tmp);
> !   else if (tmp != cfun->eh->ehr_stackadj)
> !     emit_move_insn (cfun->eh->ehr_stackadj, tmp);
>   #endif
>   
> !   tmp = expand_expr (handler_tree, cfun->eh->ehr_handler,
>   		     VOIDmode, EXPAND_NORMAL);
>     tmp = convert_memory_address (Pmode, tmp);
> !   if (!cfun->eh->ehr_handler)
> !     cfun->eh->ehr_handler = copy_to_reg (tmp);
> !   else if (tmp != cfun->eh->ehr_handler)
> !     emit_move_insn (cfun->eh->ehr_handler, tmp);
> ! 
> !   if (!cfun->eh->ehr_label)
> !     cfun->eh->ehr_label = gen_label_rtx ();
> !   emit_jump (cfun->eh->ehr_label);
>   }
>   
>   void
> --- 2922,2947 ----
>     rtx tmp;
>   
>   #ifdef EH_RETURN_STACKADJ_RTX
> !   tmp = expand_expr (stackadj_tree, crtl->eh.ehr_stackadj,
>   		     VOIDmode, EXPAND_NORMAL);
>     tmp = convert_memory_address (Pmode, tmp);
> !   if (!crtl->eh.ehr_stackadj)
> !     crtl->eh.ehr_stackadj = copy_to_reg (tmp);
> !   else if (tmp != crtl->eh.ehr_stackadj)
> !     emit_move_insn (crtl->eh.ehr_stackadj, tmp);
>   #endif
>   
> !   tmp = expand_expr (handler_tree, crtl->eh.ehr_handler,
>   		     VOIDmode, EXPAND_NORMAL);
>     tmp = convert_memory_address (Pmode, tmp);
> !   if (!crtl->eh.ehr_handler)
> !     crtl->eh.ehr_handler = copy_to_reg (tmp);
> !   else if (tmp != crtl->eh.ehr_handler)
> !     emit_move_insn (crtl->eh.ehr_handler, tmp);
> ! 
> !   if (!crtl->eh.ehr_label)
> !     crtl->eh.ehr_label = gen_label_rtx ();
> !   emit_jump (crtl->eh.ehr_label);
>   }
>   
>   void
> *************** expand_eh_return (void)
> *** 2993,2999 ****
>   {
>     rtx around_label;
>   
> !   if (! cfun->eh->ehr_label)
>       return;
>   
>     current_function_calls_eh_return = 1;
> --- 2949,2955 ----
>   {
>     rtx around_label;
>   
> !   if (! crtl->eh.ehr_label)
>       return;
>   
>     current_function_calls_eh_return = 1;
> *************** expand_eh_return (void)
> *** 3005,3025 ****
>     around_label = gen_label_rtx ();
>     emit_jump (around_label);
>   
> !   emit_label (cfun->eh->ehr_label);
>     clobber_return_register ();
>   
>   #ifdef EH_RETURN_STACKADJ_RTX
> !   emit_move_insn (EH_RETURN_STACKADJ_RTX, cfun->eh->ehr_stackadj);
>   #endif
>   
>   #ifdef HAVE_eh_return
>     if (HAVE_eh_return)
> !     emit_insn (gen_eh_return (cfun->eh->ehr_handler));
>     else
>   #endif
>       {
>   #ifdef EH_RETURN_HANDLER_RTX
> !       emit_move_insn (EH_RETURN_HANDLER_RTX, cfun->eh->ehr_handler);
>   #else
>         error ("__builtin_eh_return not supported on this target");
>   #endif
> --- 2961,2981 ----
>     around_label = gen_label_rtx ();
>     emit_jump (around_label);
>   
> !   emit_label (crtl->eh.ehr_label);
>     clobber_return_register ();
>   
>   #ifdef EH_RETURN_STACKADJ_RTX
> !   emit_move_insn (EH_RETURN_STACKADJ_RTX, crtl->eh.ehr_stackadj);
>   #endif
>   
>   #ifdef HAVE_eh_return
>     if (HAVE_eh_return)
> !     emit_insn (gen_eh_return (crtl->eh.ehr_handler));
>     else
>   #endif
>       {
>   #ifdef EH_RETURN_HANDLER_RTX
> !       emit_move_insn (EH_RETURN_HANDLER_RTX, crtl->eh.ehr_handler);
>   #else
>         error ("__builtin_eh_return not supported on this target");
>   #endif
> *************** add_action_record (htab_t ar_hash, int f
> *** 3093,3099 ****
>     if ((new = *slot) == NULL)
>       {
>         new = xmalloc (sizeof (*new));
> !       new->offset = VARRAY_ACTIVE_SIZE (cfun->eh->action_record_data) + 1;
>         new->filter = filter;
>         new->next = next;
>         *slot = new;
> --- 3049,3055 ----
>     if ((new = *slot) == NULL)
>       {
>         new = xmalloc (sizeof (*new));
> !       new->offset = VARRAY_ACTIVE_SIZE (crtl->eh.action_record_data) + 1;
>         new->filter = filter;
>         new->next = next;
>         *slot = new;
> *************** add_action_record (htab_t ar_hash, int f
> *** 3103,3112 ****
>   	 that there is no next record.  So convert the absolute 1 based
>   	 indices we've been carrying around into a displacement.  */
>   
> !       push_sleb128 (&cfun->eh->action_record_data, filter);
>         if (next)
> ! 	next -= VARRAY_ACTIVE_SIZE (cfun->eh->action_record_data) + 1;
> !       push_sleb128 (&cfun->eh->action_record_data, next);
>       }
>   
>     return new->offset;
> --- 3059,3068 ----
>   	 that there is no next record.  So convert the absolute 1 based
>   	 indices we've been carrying around into a displacement.  */
>   
> !       push_sleb128 (&crtl->eh.action_record_data, filter);
>         if (next)
> ! 	next -= VARRAY_ACTIVE_SIZE (crtl->eh.action_record_data) + 1;
> !       push_sleb128 (&crtl->eh.action_record_data, next);
>       }
>   
>     return new->offset;
> *************** collect_one_action_chain (htab_t ar_hash
> *** 3226,3249 ****
>   static int
>   add_call_site (rtx landing_pad, int action)
>   {
> !   struct call_site_record *data = cfun->eh->call_site_data;
> !   int used = cfun->eh->call_site_data_used;
> !   int size = cfun->eh->call_site_data_size;
> ! 
> !   if (used >= size)
> !     {
> !       size = (size ? size * 2 : 64);
> !       data = ggc_realloc (data, sizeof (*data) * size);
> !       cfun->eh->call_site_data = data;
> !       cfun->eh->call_site_data_size = size;
> !     }
>   
> !   data[used].landing_pad = landing_pad;
> !   data[used].action = action;
>   
> !   cfun->eh->call_site_data_used = used + 1;
> ! 
> !   return used + call_site_base;
>   }
>   
>   /* Turn REG_EH_REGION notes back into NOTE_INSN_EH_REGION notes.
> --- 3182,3196 ----
>   static int
>   add_call_site (rtx landing_pad, int action)
>   {
> !   call_site_record record;
> !   
> !   record = ggc_alloc (sizeof (struct call_site_record));
> !   record->landing_pad = landing_pad;
> !   record->action = action;
>   
> !   VEC_safe_push (call_site_record, gc, crtl->eh.call_site_record, record);
>   
> !   return call_site_base + VEC_length (call_site_record, crtl->eh.call_site_record) - 1;
>   }
>   
>   /* Turn REG_EH_REGION notes back into NOTE_INSN_EH_REGION notes.
> *************** convert_to_eh_region_ranges (void)
> *** 3264,3270 ****
>     if (USING_SJLJ_EXCEPTIONS || cfun->eh->region_tree == NULL)
>       return 0;
>   
> !   VARRAY_UCHAR_INIT (cfun->eh->action_record_data, 64, "action_record_data");
>   
>     ar_hash = htab_create (31, action_record_hash, action_record_eq, free);
>   
> --- 3211,3217 ----
>     if (USING_SJLJ_EXCEPTIONS || cfun->eh->region_tree == NULL)
>       return 0;
>   
> !   VARRAY_UCHAR_INIT (crtl->eh.action_record_data, 64, "action_record_data");
>   
>     ar_hash = htab_create (31, action_record_hash, action_record_eq, free);
>   
> *************** sjlj_size_of_call_site_table (void)
> *** 3466,3477 ****
>   static void
>   dw2_output_call_site_table (void)
>   {
> !   int n = cfun->eh->call_site_data_used;
>     int i;
>   
>     for (i = 0; i < n; ++i)
>       {
> !       struct call_site_record *cs = &cfun->eh->call_site_data[i];
>         char reg_start_lab[32];
>         char reg_end_lab[32];
>         char landing_pad_lab[32];
> --- 3413,3424 ----
>   static void
>   dw2_output_call_site_table (void)
>   {
> !   int n = VEC_length (call_site_record, crtl->eh.call_site_record);
>     int i;
>   
>     for (i = 0; i < n; ++i)
>       {
> !       struct call_site_record *cs = VEC_index (call_site_record, crtl->eh.call_site_record, i);
>         char reg_start_lab[32];
>         char reg_end_lab[32];
>         char landing_pad_lab[32];
> *************** dw2_output_call_site_table (void)
> *** 3520,3531 ****
>   static void
>   sjlj_output_call_site_table (void)
>   {
> !   int n = cfun->eh->call_site_data_used;
>     int i;
>   
>     for (i = 0; i < n; ++i)
>       {
> !       struct call_site_record *cs = &cfun->eh->call_site_data[i];
>   
>         dw2_asm_output_data_uleb128 (INTVAL (cs->landing_pad),
>   				   "region %d landing pad", i);
> --- 3467,3478 ----
>   static void
>   sjlj_output_call_site_table (void)
>   {
> !   int n = VEC_length (call_site_record, crtl->eh.call_site_record);
>     int i;
>   
>     for (i = 0; i < n; ++i)
>       {
> !       struct call_site_record *cs = VEC_index (call_site_record, crtl->eh.call_site_record, i);
>   
>         dw2_asm_output_data_uleb128 (INTVAL (cs->landing_pad),
>   				   "region %d landing pad", i);
> *************** output_function_exception_table (const c
> *** 3672,3679 ****
>     /* If the target wants a label to begin the table, emit it here.  */
>     targetm.asm_out.except_table_label (asm_out_file);
>   
> !   have_tt_data = (VEC_length (tree, cfun->eh->ttype_data) > 0
> ! 		  || VARRAY_ACTIVE_SIZE (cfun->eh->ehspec_data) > 0);
>   
>     /* Indicate the format of the @TType entries.  */
>     if (! have_tt_data)
> --- 3619,3626 ----
>     /* If the target wants a label to begin the table, emit it here.  */
>     targetm.asm_out.except_table_label (asm_out_file);
>   
> !   have_tt_data = (VEC_length (tree, crtl->eh.ttype_data) > 0
> ! 		  || VARRAY_ACTIVE_SIZE (crtl->eh.ehspec_data) > 0);
>   
>     /* Indicate the format of the @TType entries.  */
>     if (! have_tt_data)
> *************** output_function_exception_table (const c
> *** 3734,3741 ****
>         before_disp = 1 + 1;
>         after_disp = (1 + size_of_uleb128 (call_site_len)
>   		    + call_site_len
> ! 		    + VARRAY_ACTIVE_SIZE (cfun->eh->action_record_data)
> ! 		    + (VEC_length (tree, cfun->eh->ttype_data)
>   		       * tt_format_size));
>   
>         disp = after_disp;
> --- 3681,3688 ----
>         before_disp = 1 + 1;
>         after_disp = (1 + size_of_uleb128 (call_site_len)
>   		    + call_site_len
> ! 		    + VARRAY_ACTIVE_SIZE (crtl->eh.action_record_data)
> ! 		    + (VEC_length (tree, crtl->eh.ttype_data)
>   		       * tt_format_size));
>   
>         disp = after_disp;
> *************** output_function_exception_table (const c
> *** 3789,3806 ****
>   #endif
>   
>     /* ??? Decode and interpret the data for flag_debug_asm.  */
> !   n = VARRAY_ACTIVE_SIZE (cfun->eh->action_record_data);
>     for (i = 0; i < n; ++i)
> !     dw2_asm_output_data (1, VARRAY_UCHAR (cfun->eh->action_record_data, i),
>   			 (i ? NULL : "Action record table"));
>   
>     if (have_tt_data)
>       assemble_align (tt_format_size * BITS_PER_UNIT);
>   
> !   i = VEC_length (tree, cfun->eh->ttype_data);
>     while (i-- > 0)
>       {
> !       tree type = VEC_index (tree, cfun->eh->ttype_data, i);
>         output_ttype (type, tt_format, tt_format_size);
>       }
>   
> --- 3736,3753 ----
>   #endif
>   
>     /* ??? Decode and interpret the data for flag_debug_asm.  */
> !   n = VARRAY_ACTIVE_SIZE (crtl->eh.action_record_data);
>     for (i = 0; i < n; ++i)
> !     dw2_asm_output_data (1, VARRAY_UCHAR (crtl->eh.action_record_data, i),
>   			 (i ? NULL : "Action record table"));
>   
>     if (have_tt_data)
>       assemble_align (tt_format_size * BITS_PER_UNIT);
>   
> !   i = VEC_length (tree, crtl->eh.ttype_data);
>     while (i-- > 0)
>       {
> !       tree type = VEC_index (tree, crtl->eh.ttype_data, i);
>         output_ttype (type, tt_format, tt_format_size);
>       }
>   
> *************** output_function_exception_table (const c
> *** 3810,3825 ****
>   #endif
>   
>     /* ??? Decode and interpret the data for flag_debug_asm.  */
> !   n = VARRAY_ACTIVE_SIZE (cfun->eh->ehspec_data);
>     for (i = 0; i < n; ++i)
>       {
>         if (targetm.arm_eabi_unwinder)
>   	{
> ! 	  tree type = VARRAY_TREE (cfun->eh->ehspec_data, i);
>   	  output_ttype (type, tt_format, tt_format_size);
>   	}
>         else
> ! 	dw2_asm_output_data (1, VARRAY_UCHAR (cfun->eh->ehspec_data, i),
>   			     (i ? NULL : "Exception specification table"));
>       }
>   
> --- 3757,3772 ----
>   #endif
>   
>     /* ??? Decode and interpret the data for flag_debug_asm.  */
> !   n = VARRAY_ACTIVE_SIZE (crtl->eh.ehspec_data);
>     for (i = 0; i < n; ++i)
>       {
>         if (targetm.arm_eabi_unwinder)
>   	{
> ! 	  tree type = VARRAY_TREE (crtl->eh.ehspec_data, i);
>   	  output_ttype (type, tt_format, tt_format_size);
>   	}
>         else
> ! 	dw2_asm_output_data (1, VARRAY_UCHAR (crtl->eh.ehspec_data, i),
>   			     (i ? NULL : "Exception specification table"));
>       }
>   
> Index: except.h
> ===================================================================
> *** except.h	(revision 134239)
> --- except.h	(working copy)
> *************** extern int doing_eh (int);
> *** 35,41 ****
>   /* Note that the current EH region (if any) may contain a throw, or a
>      call to a function which itself may contain a throw.  */
>   extern void note_eh_region_may_contain_throw (struct eh_region *);
> - extern void note_current_region_may_contain_throw (void);
>   
>   /* Invokes CALLBACK for every exception handler label.  Only used by old
>      loop hackery; should not be used by new code.  */
> --- 35,40 ----
> *************** extern rtx expand_builtin_dwarf_sp_colum
> *** 78,85 ****
>   extern void expand_builtin_eh_return (tree, tree);
>   extern void expand_eh_return (void);
>   extern rtx expand_builtin_extend_pointer (tree);
> ! extern rtx get_exception_pointer (struct function *);
> ! extern rtx get_exception_filter (struct function *);
>   typedef tree (*duplicate_eh_regions_map) (tree, void *);
>   extern int duplicate_eh_regions (struct function *, duplicate_eh_regions_map,
>   				 void *, int, int);
> --- 77,84 ----
>   extern void expand_builtin_eh_return (tree, tree);
>   extern void expand_eh_return (void);
>   extern rtx expand_builtin_extend_pointer (tree);
> ! extern rtx get_exception_pointer (void);
> ! extern rtx get_exception_filter (void);
>   typedef tree (*duplicate_eh_regions_map) (tree, void *);
>   extern int duplicate_eh_regions (struct function *, duplicate_eh_regions_map,
>   				 void *, int, int);
> Index: Makefile.in
> ===================================================================
> *** Makefile.in	(revision 134239)
> --- Makefile.in	(working copy)
> *************** GTFILES = $(CPP_ID_DATA_H) $(srcdir)/inp
> *** 3107,3114 ****
>     $(host_xm_file_list) \
>     $(tm_file_list) $(HASHTAB_H) $(SPLAY_TREE_H) $(srcdir)/bitmap.h \
>     $(srcdir)/alias.h $(srcdir)/coverage.c $(srcdir)/rtl.h \
> !   $(srcdir)/optabs.h $(srcdir)/tree.h $(srcdir)/function.h $(srcdir)/libfuncs.h $(SYMTAB_H) \
> !   $(srcdir)/real.h $(srcdir)/varray.h $(srcdir)/insn-addr.h $(srcdir)/hwint.h \
>     $(srcdir)/fixed-value.h \
>     $(srcdir)/ipa-reference.h $(srcdir)/output.h $(srcdir)/cfgloop.h \
>     $(srcdir)/cselib.h $(srcdir)/basic-block.h  $(srcdir)/cgraph.h \
> --- 3107,3114 ----
>     $(host_xm_file_list) \
>     $(tm_file_list) $(HASHTAB_H) $(SPLAY_TREE_H) $(srcdir)/bitmap.h \
>     $(srcdir)/alias.h $(srcdir)/coverage.c $(srcdir)/rtl.h \
> !   $(srcdir)/optabs.h $(srcdir)/tree.h $(srcdir)/varray.h $(srcdir)/libfuncs.h $(SYMTAB_H) \
> !   $(srcdir)/real.h $(srcdir)/function.h $(srcdir)/insn-addr.h $(srcdir)/hwint.h \
>     $(srcdir)/fixed-value.h \
>     $(srcdir)/ipa-reference.h $(srcdir)/output.h $(srcdir)/cfgloop.h \
>     $(srcdir)/cselib.h $(srcdir)/basic-block.h  $(srcdir)/cgraph.h \
> 
> 

-- 
Richard Guenther <rguenther@suse.de>
Novell / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 - GF: Markus Rex


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]