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]

Fix java/3062


The problem was that the rtl inliner wasn't remapping the
received pointer to the exception object, which meant that
the inlined code read from an uninitialized register.

Tested with check-target-libjava on i686-linux.  Applied
to mainline and branch.


r~


        * except.c (get_exception_pointer, get_exception_filter): Take a
        struct function.  Update all callers.
        * except.h (get_exception_pointer): Update declaration.
        * expr.c (expand_expr): Update get_exception_pointer call.
        * integrate.c (expand_inline_function): Remap the exception pointer
        from callee to caller.

Index: except.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/except.c,v
retrieving revision 1.143.2.12
diff -c -p -d -r1.143.2.12 except.c
*** except.c	2001/06/08 16:06:43	1.143.2.12
--- except.c	2001/06/08 22:51:21
*************** static tree lookup_type_for_runtime		PAR
*** 256,262 ****
  
  static struct eh_region *expand_eh_region_end	PARAMS ((void));
  
! static rtx get_exception_filter			PARAMS ((void));
  
  static void collect_eh_region_array		PARAMS ((void));
  static void resolve_fixup_regions		PARAMS ((void));
--- 256,262 ----
  
  static struct eh_region *expand_eh_region_end	PARAMS ((void));
  
! static rtx get_exception_filter			PARAMS ((struct function *));
  
  static void collect_eh_region_array		PARAMS ((void));
  static void resolve_fixup_regions		PARAMS ((void));
*************** expand_eh_region_end_cleanup (handler)
*** 720,728 ****
    /* In case this cleanup involves an inline destructor with a try block in
       it, we need to save the EH return data registers around it.  */
    data_save[0] = gen_reg_rtx (Pmode);
!   emit_move_insn (data_save[0], get_exception_pointer ());
    data_save[1] = gen_reg_rtx (word_mode);
!   emit_move_insn (data_save[1], get_exception_filter ());
  
    expand_expr (handler, const0_rtx, VOIDmode, 0);
  
--- 720,728 ----
    /* In case this cleanup involves an inline destructor with a try block in
       it, we need to save the EH return data registers around it.  */
    data_save[0] = gen_reg_rtx (Pmode);
!   emit_move_insn (data_save[0], get_exception_pointer (cfun));
    data_save[1] = gen_reg_rtx (word_mode);
!   emit_move_insn (data_save[1], get_exception_filter (cfun));
  
    expand_expr (handler, const0_rtx, VOIDmode, 0);
  
*************** expand_eh_region_end_fixup (handler)
*** 955,967 ****
     within a handler.  */
  
  rtx
! get_exception_pointer ()
  {
!   rtx exc_ptr = cfun->eh->exc_ptr;
!   if (! exc_ptr)
      {
        exc_ptr = gen_reg_rtx (Pmode);
!       cfun->eh->exc_ptr = exc_ptr;
      }
    return exc_ptr;
  }
--- 955,968 ----
     within a handler.  */
  
  rtx
! get_exception_pointer (fun)
!      struct function *fun;
  {
!   rtx exc_ptr = fun->eh->exc_ptr;
!   if (fun == cfun && ! exc_ptr)
      {
        exc_ptr = gen_reg_rtx (Pmode);
!       fun->eh->exc_ptr = exc_ptr;
      }
    return exc_ptr;
  }
*************** get_exception_pointer ()
*** 970,982 ****
     within a handler.  */
  
  static rtx
! get_exception_filter ()
  {
!   rtx filter = cfun->eh->filter;
!   if (! filter)
      {
        filter = gen_reg_rtx (word_mode);
!       cfun->eh->filter = filter;
      }
    return filter;
  }
--- 971,984 ----
     within a handler.  */
  
  static rtx
! get_exception_filter (fun)
!      struct function *fun;
  {
!   rtx filter = fun->eh->filter;
!   if (fun == cfun && ! filter)
      {
        filter = gen_reg_rtx (word_mode);
!       fun->eh->filter = filter;
      }
    return filter;
  }
*************** finish_eh_generation ()
*** 2360,2367 ****
  
    /* These registers are used by the landing pads.  Make sure they
       have been generated.  */
!   get_exception_pointer ();
!   get_exception_filter ();
  
    /* Construct the landing pads.  */
  
--- 2362,2369 ----
  
    /* 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.  */
  
Index: except.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/except.h,v
retrieving revision 1.42.6.5
diff -c -p -d -r1.42.6.5 except.h
*** except.h	2001/05/17 18:07:32	1.42.6.5
--- except.h	2001/06/08 22:51:21
*************** extern rtx expand_builtin_dwarf_fp_regnu
*** 137,143 ****
  extern void expand_builtin_eh_return		PARAMS ((tree, tree));
  extern void expand_eh_return			PARAMS ((void));
  
! extern rtx get_exception_pointer		PARAMS ((void));
  
  struct function;
  struct inline_remap;
--- 137,143 ----
  extern void expand_builtin_eh_return		PARAMS ((tree, tree));
  extern void expand_eh_return			PARAMS ((void));
  
! extern rtx get_exception_pointer		PARAMS ((struct function *));
  
  struct function;
  struct inline_remap;
Index: expr.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/expr.c,v
retrieving revision 1.295.2.13
diff -c -p -d -r1.295.2.13 expr.c
*** expr.c	2001/05/27 10:31:44	1.295.2.13
--- expr.c	2001/06/08 22:51:21
*************** expand_expr (exp, target, tmode, modifie
*** 8706,8712 ****
        return expand_builtin_va_arg (TREE_OPERAND (exp, 0), type);
  
      case EXC_PTR_EXPR:
!       return get_exception_pointer ();
  
      default:
        return (*lang_expand_expr) (exp, original_target, tmode, modifier);
--- 8706,8712 ----
        return expand_builtin_va_arg (TREE_OPERAND (exp, 0), type);
  
      case EXC_PTR_EXPR:
!       return get_exception_pointer (cfun);
  
      default:
        return (*lang_expand_expr) (exp, original_target, tmode, modifier);
Index: integrate.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/integrate.c,v
retrieving revision 1.126.4.10
diff -c -p -d -r1.126.4.10 integrate.c
*** integrate.c	2001/05/13 07:09:55	1.126.4.10
--- integrate.c	2001/06/08 22:51:22
*************** expand_inline_function (fndecl, parms, t
*** 1074,1079 ****
--- 1074,1084 ----
    else
      abort ();
  
+   /* Remap the exception handler data pointer from one to the other.  */
+   temp = get_exception_pointer (inl_f);
+   if (temp)
+     map->reg_map[REGNO (temp)] = get_exception_pointer (cfun);
+ 
    /* Initialize label_map.  get_label_from_map will actually make
       the labels.  */
    memset ((char *) &map->label_map[min_labelno], 0,


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