re PR libgcj/26858 (NullPointerException not generated for large classes...)

2006-03-30  Andrew Haley  <aph@redhat.com>

        PR java/26858
        * lang.c (java_attribute_table): New.
        (LANG_HOOKS_ATTRIBUTE_TABLE): Define.
        * expr.c (build_field_ref): Add a null pointer check for all
        fields of offset > 4k.  Don't do so for accesses via the this
        pointer, which we know can never be null.
        * class.c (build_java_method_type): Mark arg 1 of all nonstatic
        methods nonnull.

From-SVN: r112574
This commit is contained in:
Andrew Haley 2006-03-31 11:43:43 +00:00 committed by Andrew Haley
parent 9ef47dec91
commit e6b7893e34
4 changed files with 59 additions and 5 deletions

View File

@ -1,3 +1,14 @@
2006-03-30 Andrew Haley <aph@redhat.com>
PR java/26858
* lang.c (java_attribute_table): New.
(LANG_HOOKS_ATTRIBUTE_TABLE): Define.
* expr.c (build_field_ref): Add a null pointer check for all
fields of offset > 4k. Don't do so for accesses via the this
pointer, which we know can never be null.
* class.c (build_java_method_type): Mark arg 1 of all nonstatic
methods nonnull.
2006-03-30 Carlos O'Donell <carlos@codesourcery.com>
* Make-lang.in: Rename docdir to gcc_docdir.

View File

@ -681,7 +681,17 @@ build_java_method_type (tree fntype, tree this_class, int access_flags)
{
if (access_flags & ACC_STATIC)
return fntype;
return build_method_type (this_class, fntype);
fntype = build_method_type (this_class, fntype);
/* We know that arg 1 of every nonstatic method is non-null; tell
the back-end so. */
TYPE_ATTRIBUTES (fntype) = (tree_cons
(get_identifier ("nonnull"),
tree_cons (NULL_TREE,
build_int_cst (NULL_TREE, 1),
NULL_TREE),
TYPE_ATTRIBUTES (fntype)));
return fntype;
}
tree

View File

@ -130,6 +130,10 @@ static GTY(()) tree quick_stack;
/* A free-list of unused permanent TREE_LIST nodes. */
static GTY((deletable)) tree tree_list_free_list;
/* The physical memory page size used in this computer. See
build_field_ref(). */
static GTY(()) tree page_size;
/* The stack pointer of the Java virtual machine.
This does include the size of the quick_stack. */
@ -1678,11 +1682,28 @@ build_field_ref (tree self_value, tree self_class, tree name)
}
else
{
int check = (flag_check_references
&& ! (DECL_P (self_value)
&& DECL_NAME (self_value) == this_identifier_node));
tree base_type = promote_type (base_class);
/* CHECK is true if self_value is not the this pointer. */
int check = (! (DECL_P (self_value)
&& DECL_NAME (self_value) == this_identifier_node));
/* Determine whether a field offset from NULL will lie within
Page 0: this is necessary on those GNU/Linux/BSD systems that
trap SEGV to generate NullPointerExceptions.
We assume that Page 0 will be mapped with NOPERM, and that
memory may be allocated from any other page, so only field
offsets < pagesize are guaratneed to trap. We also assume
the smallest page size we'll encounter is 4k bytes. */
if (check && ! flag_check_references && ! flag_indirect_dispatch)
{
tree field_offset = byte_position (field_decl);
if (! page_size)
page_size = size_int (4096);
check = ! INT_CST_LT_UNSIGNED (field_offset, page_size);
}
if (base_type != TREE_TYPE (self_value))
self_value = fold_build1 (NOP_EXPR, base_type, self_value);
if (! flag_syntax_only && flag_indirect_dispatch)
@ -1708,6 +1729,7 @@ build_field_ref (tree self_value, tree self_class, tree name)
field_offset);
field_offset = fold (convert (sizetype, field_offset));
self_value = java_check_reference (self_value, check);
address
= fold_build2 (PLUS_EXPR,
build_pointer_type (TREE_TYPE (field_decl)),

View File

@ -108,6 +108,14 @@ const char *const tree_code_name[] = {
};
#undef DEFTREECODE
/* Table of machine-independent attributes. */
const struct attribute_spec java_attribute_table[] =
{
{ "nonnull", 0, -1, false, true, true,
NULL },
{ NULL, 0, 0, false, false, false, NULL }
};
/* Used to avoid printing error messages with bogus function
prototypes. Starts out false. */
static bool inhibit_error_function_printing;
@ -213,6 +221,9 @@ struct language_function GTY(())
#undef LANG_HOOKS_SET_DECL_ASSEMBLER_NAME
#define LANG_HOOKS_SET_DECL_ASSEMBLER_NAME java_mangle_decl
#undef LANG_HOOKS_ATTRIBUTE_TABLE
#define LANG_HOOKS_ATTRIBUTE_TABLE java_attribute_table
/* Each front end provides its own. */
const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;