This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Fix java/3062
- To: gcc-patches at gcc dot gnu dot org, java at gcc dot gnu dot org
- Subject: Fix java/3062
- From: Richard Henderson <rth at redhat dot com>
- Date: Fri, 8 Jun 2001 16:04:23 -0700
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,