summaryrefslogtreecommitdiff
path: root/gcc/java
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/java')
-rw-r--r--gcc/java/ChangeLog72
-rw-r--r--gcc/java/Make-lang.in4
-rw-r--r--gcc/java/boehm.c49
-rw-r--r--gcc/java/class.c50
-rw-r--r--gcc/java/constants.c9
-rw-r--r--gcc/java/decl.c16
-rw-r--r--gcc/java/except.c34
-rw-r--r--gcc/java/expr.c2
-rw-r--r--gcc/java/gcj.texi4
-rw-r--r--gcc/java/java-tree.h24
-rw-r--r--gcc/java/jcf-parse.c9
-rw-r--r--gcc/java/jcf-reader.c4
-rw-r--r--gcc/java/jcf.h2
-rw-r--r--gcc/java/jvspec.c8
-rw-r--r--gcc/java/lang.c1
15 files changed, 179 insertions, 109 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index f001cfb50e7..e7589638f54 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,75 @@
+2010-06-28 Nathan Froyd <froydnj@codesourcery.com>
+
+ * java-tree.h (struct lang_type) [catch_classes]: Change type to a
+ VEC.
+ * except.c (prepare_eh_table_type): Call CONSTRUCTOR_APPEND_ELT
+ instead of tree_cons.
+ * class.c (make_class): Add dummy entry to TYPE_CATCH_CLASSES.
+ (emit_catch_table): Adjust for new type of TYPE_CATCH_CLASSES.
+
+2010-06-28 Steven Bosscher <steven@gcc.gnu.org>
+
+ * lang.c: Do not include except.h
+ * except.c: Likewise.
+ (doing_eh): New, moved from except.c (in gcc/) but removed the
+ do_warning flag.
+ (maybe_start_try): Update doing_eh call.
+ * Make-lang.in: Update dependencies.
+
+2010-06-23 Anatoly Sokolov <aesok@post.ru>
+
+ * decl.c (java_init_decl_processing): Use double_int_to_tree instead
+ of build_int_cst_wide.
+ * boehm.c (set_bit): Remove.
+ (mark_reference_fields): Use double_int type for 'mask' argument.
+ Use double_int_setbit instead of set_bit.
+ (get_boehm_type_descriptor): Use double_int_setbit instead of
+ set_bit. Use double_int_to_tree instead of build_int_cst_wide.
+
+2010-06-10 Gerald Pfeifer <gerald@pfeifer.com>
+
+ * gcj.texi: Move to GFDL version 1.3. Fix copyright years.
+
+2010-06-08 Laurynas Biveinis <laurynas.biveinis@gmail.com>
+
+ * jcf-reader.c (jcf_parse_constant_pool): Use typed GC allocation.
+
+ * jcf-parse.c (java_parse_file): Likewise.
+ (process_zip_dir): Likewise.
+
+ * java-tree.h (MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC): Likewise.
+ (MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC): Likewise.
+
+ * expr.c (add_type_assertion): Likewise.
+
+ * decl.c (make_binding_level): Likewise.
+ (java_dup_lang_specific_decl): Likewise.
+
+ * constants.c (set_constant_entry): Likewise.
+ (cpool_for_class): Likewise.
+
+ * class.c (add_method_1): Likewise.
+ (java_treetreehash_new): Likewise.
+
+ * java-tree.h (struct lang_type): Add variable_size GTY option.
+ (struct lang_decl): Likewise.
+
+ * jch.h (struct cpool_entry): Likewise.
+
+ * java-tree.h (java_treetreehash_create): Remove parameter ggc.
+
+ * except.c (prepare_eh_table_type): Update
+ java_treetreehash_create call.
+
+ * class.c (add_method_1): Update java_treetreehash_create call.
+ (java_treetreehash_create): Remove parameter gc. Use
+ htab_create_ggc.
+
+2010-06-04 Joseph Myers <joseph@codesourcery.com>
+
+ * jvspec.c (lang_specific_driver): Use GCC-specific formats in
+ diagnostics.
+
2010-05-30 Steven Bosscher <steven@gcc.gnu.org>
* except.c: Include tm.h.
diff --git a/gcc/java/Make-lang.in b/gcc/java/Make-lang.in
index 26a81bab79a..5e240ed0743 100644
--- a/gcc/java/Make-lang.in
+++ b/gcc/java/Make-lang.in
@@ -285,7 +285,7 @@ java/decl.o: java/decl.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h \
libfuncs.h java/java-except.h $(GGC_H) $(REAL_H) gt-java-decl.h \
$(TARGET_H) $(CGRAPH_H) langhooks.h
java/except.o: java/except.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h $(REAL_H) \
- java/javaop.h java/java-opcodes.h except.h java/java-except.h \
+ java/javaop.h java/java-opcodes.h java/java-except.h \
toplev.h $(SYSTEM_H) coretypes.h
java/expr.o: java/expr.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h $(REAL_H) \
java/javaop.h java/java-opcodes.h \
@@ -302,7 +302,7 @@ java/jvgenmain.o: java/jvgenmain.c $(CONFIG_H) $(JAVA_TREE_H) $(SYSTEM_H) \
coretypes.h $(TM_H) intl.h
java/lang.o: java/lang.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h input.h \
toplev.h $(SYSTEM_H) coretypes.h $(TM_H) $(DIAGNOSTIC_H) \
- langhooks.h $(LANGHOOKS_DEF_H) gt-java-lang.h opts.h options.h $(EXCEPT_H)
+ langhooks.h $(LANGHOOKS_DEF_H) gt-java-lang.h opts.h options.h
java/mangle.o: java/mangle.c $(CONFIG_H) java/jcf.h $(JAVA_TREE_H) $(SYSTEM_H) \
coretypes.h $(TM_H) toplev.h $(GGC_H) gt-java-mangle.h $(LANGHOOKS_DEF_H)
java/mangle_name.o: java/mangle_name.c $(CONFIG_H) java/jcf.h $(JAVA_TREE_H) \
diff --git a/gcc/java/boehm.c b/gcc/java/boehm.c
index 04af74b5948..35ba68d0fb3 100644
--- a/gcc/java/boehm.c
+++ b/gcc/java/boehm.c
@@ -27,17 +27,15 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */
#include "system.h"
#include "coretypes.h"
+#include "double-int.h"
#include "tm.h"
#include "tree.h"
#include "java-tree.h"
#include "parse.h"
#include "toplev.h"
-static void mark_reference_fields (tree, unsigned HOST_WIDE_INT *,
- unsigned HOST_WIDE_INT *, unsigned int,
+static void mark_reference_fields (tree, double_int *, unsigned int,
int *, int *, int *, HOST_WIDE_INT *);
-static void set_bit (unsigned HOST_WIDE_INT *, unsigned HOST_WIDE_INT *,
- unsigned int);
/* A procedure-based object descriptor. We know that our
`kind' is 0, and `env' is likewise 0, so we have a simple
@@ -47,30 +45,10 @@ static void set_bit (unsigned HOST_WIDE_INT *, unsigned HOST_WIDE_INT *,
Here DS_PROC == 2. */
#define PROCEDURE_OBJECT_DESCRIPTOR 2
-/* Treat two HOST_WIDE_INT's as a contiguous bitmap, with bit 0 being
- the least significant. This function sets bit N in the bitmap. */
-static void
-set_bit (unsigned HOST_WIDE_INT *low, unsigned HOST_WIDE_INT *high,
- unsigned int n)
-{
- unsigned HOST_WIDE_INT *which;
-
- if (n >= HOST_BITS_PER_WIDE_INT)
- {
- n -= HOST_BITS_PER_WIDE_INT;
- which = high;
- }
- else
- which = low;
-
- *which |= (unsigned HOST_WIDE_INT) 1 << n;
-}
-
/* Recursively mark reference fields. */
static void
mark_reference_fields (tree field,
- unsigned HOST_WIDE_INT *low,
- unsigned HOST_WIDE_INT *high,
+ double_int *mask,
unsigned int ubit,
int *pointer_after_end,
int *all_bits_set,
@@ -81,7 +59,7 @@ mark_reference_fields (tree field,
if (DECL_NAME (field) == NULL_TREE)
{
mark_reference_fields (TYPE_FIELDS (TREE_TYPE (field)),
- low, high, ubit,
+ mask, ubit,
pointer_after_end, all_bits_set,
last_set_index, last_view_index);
field = TREE_CHAIN (field);
@@ -130,7 +108,7 @@ mark_reference_fields (tree field,
bits for all words in the record. This is conservative, but the
size_words != 1 case is impossible in regular java code. */
for (i = 0; i < size_words; ++i)
- set_bit (low, high, ubit - count - i - 1);
+ *mask = double_int_setbit (*mask, ubit - count - i - 1);
if (count >= ubit - 2)
*pointer_after_end = 1;
@@ -159,9 +137,11 @@ get_boehm_type_descriptor (tree type)
int last_set_index = 0;
HOST_WIDE_INT last_view_index = -1;
int pointer_after_end = 0;
- unsigned HOST_WIDE_INT low = 0, high = 0;
+ double_int mask;
tree field, value, value_type;
+ mask = double_int_zero;
+
/* If the GC wasn't requested, just use a null pointer. */
if (! flag_use_boehm_gc)
return null_pointer_node;
@@ -192,7 +172,7 @@ get_boehm_type_descriptor (tree type)
goto procedure_object_descriptor;
field = TYPE_FIELDS (type);
- mark_reference_fields (field, &low, &high, ubit,
+ mark_reference_fields (field, &mask, ubit,
&pointer_after_end, &all_bits_set,
&last_set_index, &last_view_index);
@@ -215,23 +195,22 @@ get_boehm_type_descriptor (tree type)
that we don't have to emit reflection data for run time
marking. */
count = 0;
- low = 0;
- high = 0;
+ mask = double_int_zero;
++last_set_index;
while (last_set_index)
{
if ((last_set_index & 1))
- set_bit (&low, &high, log2_size + count);
+ mask = double_int_setbit (mask, log2_size + count);
last_set_index >>= 1;
++count;
}
- value = build_int_cst_wide (value_type, low, high);
+ value = double_int_to_tree (value_type, mask);
}
else if (! pointer_after_end)
{
/* Bottom two bits for bitmap mark type are 01. */
- set_bit (&low, &high, 0);
- value = build_int_cst_wide (value_type, low, high);
+ mask = double_int_setbit (mask, 0);
+ value = double_int_to_tree (value_type, mask);
}
else
{
diff --git a/gcc/java/class.c b/gcc/java/class.c
index f346ad420f7..7d90a032a81 100644
--- a/gcc/java/class.c
+++ b/gcc/java/class.c
@@ -382,6 +382,12 @@ make_class (void)
loading works. */
TYPE_BINFO (type) = make_tree_binfo (0);
MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC (type);
+ TYPE_CATCH_CLASSES (type) = NULL;
+ /* Push a dummy entry; we can't call make_catch_class_record here
+ because other infrastructure may not be set up yet. We'll come
+ back and fill it in later once said infrastructure is
+ initialized. */
+ CONSTRUCTOR_APPEND_ELT (TYPE_CATCH_CLASSES (type), NULL_TREE, NULL_TREE);
return type;
}
@@ -763,13 +769,12 @@ add_method_1 (tree this_class, int access_flags, tree name, tree function_type)
DECL_CONTEXT (fndecl) = this_class;
DECL_LANG_SPECIFIC (fndecl)
- = GGC_CNEW (struct lang_decl);
+ = ggc_alloc_cleared_lang_decl(sizeof (struct lang_decl));
DECL_LANG_SPECIFIC (fndecl)->desc = LANG_DECL_FUNC;
/* Initialize the static initializer test table. */
-
- DECL_FUNCTION_INIT_TEST_TABLE (fndecl) =
- java_treetreehash_create (10, 1);
+
+ DECL_FUNCTION_INIT_TEST_TABLE (fndecl) = java_treetreehash_create (10);
/* Initialize the initialized (static) class table. */
if (access_flags & ACC_STATIC)
@@ -2961,18 +2966,17 @@ tree
emit_catch_table (tree this_class)
{
tree table, table_size, array_type;
- TYPE_CATCH_CLASSES (this_class) =
- tree_cons (NULL,
- make_catch_class_record (null_pointer_node, null_pointer_node),
- TYPE_CATCH_CLASSES (this_class));
- TYPE_CATCH_CLASSES (this_class) = nreverse (TYPE_CATCH_CLASSES (this_class));
- TYPE_CATCH_CLASSES (this_class) =
- tree_cons (NULL,
- make_catch_class_record (null_pointer_node, null_pointer_node),
- TYPE_CATCH_CLASSES (this_class));
- table_size = build_index_type
- (build_int_cst (NULL_TREE,
- list_length (TYPE_CATCH_CLASSES (this_class))));
+ int n_catch_classes;
+ constructor_elt *e;
+ /* Fill in the dummy entry that make_class created. */
+ e = VEC_index (constructor_elt, TYPE_CATCH_CLASSES (this_class), 0);
+ e->value = make_catch_class_record (null_pointer_node, null_pointer_node);
+ CONSTRUCTOR_APPEND_ELT (TYPE_CATCH_CLASSES (this_class), NULL_TREE,
+ make_catch_class_record (null_pointer_node,
+ null_pointer_node));
+ n_catch_classes = VEC_length (constructor_elt,
+ TYPE_CATCH_CLASSES (this_class));
+ table_size = build_index_type (build_int_cst (NULL_TREE, n_catch_classes));
array_type
= build_array_type (TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (this_class))),
table_size);
@@ -2980,7 +2984,7 @@ emit_catch_table (tree this_class)
build_decl (input_location,
VAR_DECL, DECL_NAME (TYPE_CTABLE_DECL (this_class)), array_type);
DECL_INITIAL (table) =
- build_constructor_from_list (array_type, TYPE_CATCH_CLASSES (this_class));
+ build_constructor (array_type, TYPE_CATCH_CLASSES (this_class));
TREE_STATIC (table) = 1;
TREE_READONLY (table) = 1;
DECL_IGNORED_P (table) = 1;
@@ -3144,7 +3148,7 @@ java_treetreehash_new (htab_t ht, tree t)
e = htab_find_slot_with_hash (ht, t, hv, INSERT);
if (*e == NULL)
{
- tthe = (struct treetreehash_entry *) (*ht->alloc_f) (1, sizeof (*tthe));
+ tthe = ggc_alloc_cleared_treetreehash_entry ();
tthe->key = t;
*e = tthe;
}
@@ -3154,14 +3158,10 @@ java_treetreehash_new (htab_t ht, tree t)
}
htab_t
-java_treetreehash_create (size_t size, int gc)
+java_treetreehash_create (size_t size)
{
- if (gc)
- return htab_create_ggc (size, java_treetreehash_hash,
- java_treetreehash_compare, NULL);
- else
- return htab_create_alloc (size, java_treetreehash_hash,
- java_treetreehash_compare, free, xcalloc, free);
+ return htab_create_ggc (size, java_treetreehash_hash,
+ java_treetreehash_compare, NULL);
}
/* Break down qualified IDENTIFIER into package and class-name components.
diff --git a/gcc/java/constants.c b/gcc/java/constants.c
index ca5eb77ce30..f018a707911 100644
--- a/gcc/java/constants.c
+++ b/gcc/java/constants.c
@@ -44,8 +44,11 @@ set_constant_entry (CPool *cpool, int index, int tag, jword value)
if (cpool->data == NULL)
{
cpool->capacity = 100;
- cpool->tags = GGC_CNEWVEC (uint8, cpool->capacity);
- cpool->data = GGC_CNEWVEC (union cpool_entry, cpool->capacity);
+ cpool->tags = (uint8 *) ggc_alloc_cleared_atomic (sizeof (uint8)
+ * cpool->capacity);
+ cpool->data = ggc_alloc_cleared_vec_cpool_entry (sizeof
+ (union cpool_entry),
+ cpool->capacity);
cpool->count = 1;
}
if (index >= cpool->capacity)
@@ -333,7 +336,7 @@ cpool_for_class (tree klass)
if (cpool == NULL)
{
- cpool = GGC_CNEW (struct CPool);
+ cpool = ggc_alloc_cleared_CPool ();
TYPE_CPOOL (klass) = cpool;
}
return cpool;
diff --git a/gcc/java/decl.c b/gcc/java/decl.c
index f78d68359eb..d3e671067a6 100644
--- a/gcc/java/decl.c
+++ b/gcc/java/decl.c
@@ -619,15 +619,9 @@ java_init_decl_processing (void)
/* A few values used for range checking in the lexer. */
decimal_int_max = build_int_cstu (unsigned_int_type_node, 0x80000000);
-#if HOST_BITS_PER_WIDE_INT == 64
- decimal_long_max = build_int_cstu (unsigned_long_type_node,
- 0x8000000000000000LL);
-#elif HOST_BITS_PER_WIDE_INT == 32
- decimal_long_max = build_int_cst_wide (unsigned_long_type_node,
- 0, 0x80000000);
-#else
- #error "unsupported size"
-#endif
+ decimal_long_max
+ = double_int_to_tree (unsigned_long_type_node,
+ double_int_setbit (double_int_zero, 64));
size_zero_node = size_int (0);
size_one_node = size_int (1);
@@ -1354,7 +1348,7 @@ static struct binding_level *
make_binding_level (void)
{
/* NOSTRICT */
- return GGC_CNEW (struct binding_level);
+ return ggc_alloc_cleared_binding_level ();
}
void
@@ -1696,7 +1690,7 @@ java_dup_lang_specific_decl (tree node)
return;
lang_decl_size = sizeof (struct lang_decl);
- x = GGC_NEW (struct lang_decl);
+ x = ggc_alloc_lang_decl (lang_decl_size);
memcpy (x, DECL_LANG_SPECIFIC (node), lang_decl_size);
DECL_LANG_SPECIFIC (node) = x;
}
diff --git a/gcc/java/except.c b/gcc/java/except.c
index 03bf4e6853b..0033da30653 100644
--- a/gcc/java/except.c
+++ b/gcc/java/except.c
@@ -31,7 +31,6 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */
#include "javaop.h"
#include "java-opcodes.h"
#include "jcf.h"
-#include "except.h" /* for doing_eh. */
#include "java-except.h"
#include "toplev.h"
#include "tree-iterator.h"
@@ -381,7 +380,7 @@ prepare_eh_table_type (tree type)
return NULL_TREE;
if (TYPE_TO_RUNTIME_MAP (output_class) == NULL)
- TYPE_TO_RUNTIME_MAP (output_class) = java_treetreehash_create (10, 1);
+ TYPE_TO_RUNTIME_MAP (output_class) = java_treetreehash_create (10);
slot = java_treetreehash_new (TYPE_TO_RUNTIME_MAP (output_class), type);
if (*slot != NULL)
@@ -420,9 +419,9 @@ prepare_eh_table_type (tree type)
layout_decl (decl, 0);
pushdecl (decl);
exp = build1 (ADDR_EXPR, build_pointer_type (utf8const_ptr_type), decl);
- TYPE_CATCH_CLASSES (output_class) =
- tree_cons (NULL, make_catch_class_record (exp, utf8_ref),
- TYPE_CATCH_CLASSES (output_class));
+ CONSTRUCTOR_APPEND_ELT (TYPE_CATCH_CLASSES (output_class),
+ NULL_TREE,
+ make_catch_class_record (exp, utf8_ref));
}
exp = convert (ptr_type_node, exp);
@@ -565,6 +564,29 @@ check_start_handlers (struct eh_range *range, int pc)
}
+/* Routine to see if exception handling is turned on.
+ DO_WARN is nonzero if we want to inform the user that exception
+ handling is turned off.
+
+ This is used to ensure that -fexceptions has been specified if the
+ compiler tries to use any exception-specific functions. */
+
+static inline int
+doing_eh (void)
+{
+ if (! flag_exceptions)
+ {
+ static int warned = 0;
+ if (! warned)
+ {
+ error ("exception handling disabled, use -fexceptions to enable");
+ warned = 1;
+ }
+ return 0;
+ }
+ return 1;
+}
+
static struct eh_range *current_range;
/* Emit any start-of-try-range starting at start_pc and ending after
@@ -574,7 +596,7 @@ void
maybe_start_try (int start_pc, int end_pc)
{
struct eh_range *range;
- if (! doing_eh (1))
+ if (! doing_eh ())
return;
range = find_handler (start_pc);
diff --git a/gcc/java/expr.c b/gcc/java/expr.c
index 0abcb0d1de7..042ed1b7297 100644
--- a/gcc/java/expr.c
+++ b/gcc/java/expr.c
@@ -463,7 +463,7 @@ add_type_assertion (tree klass, int assertion_code, tree op1, tree op2)
if (*as_pp)
return;
- *as_pp = ggc_alloc (sizeof (type_assertion));
+ *as_pp = ggc_alloc_type_assertion ();
**(type_assertion **)as_pp = as;
}
diff --git a/gcc/java/gcj.texi b/gcc/java/gcj.texi
index 46b0899e800..01acf4344cb 100644
--- a/gcc/java/gcj.texi
+++ b/gcc/java/gcj.texi
@@ -17,14 +17,14 @@
@c the word ``Java'.
@c When this manual is copyrighted.
-@set copyrights-gcj 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+@set copyrights-gcj 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010
@copying
@c man begin COPYRIGHT
Copyright @copyright{} @value{copyrights-gcj} Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version 1.2 or
+under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, the Front-Cover Texts being (a) (see below), and
with the Back-Cover Texts being (b) (see below).
diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h
index f48e4215925..ccaa0e34eb7 100644
--- a/gcc/java/java-tree.h
+++ b/gcc/java/java-tree.h
@@ -750,11 +750,12 @@ union GTY((desc ("TREE_CODE (&%h.generic) == IDENTIFIER_NODE"),
(DECL_LANG_SPECIFIC (NODE)->u.v.vtable)
/* Create a DECL_LANG_SPECIFIC if necessary. */
-#define MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC(T) \
- if (DECL_LANG_SPECIFIC (T) == NULL) \
- { \
- DECL_LANG_SPECIFIC ((T)) = GGC_CNEW (struct lang_decl); \
- DECL_LANG_SPECIFIC (T)->desc = LANG_DECL_VAR; \
+#define MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC(T) \
+ if (DECL_LANG_SPECIFIC (T) == NULL) \
+ { \
+ DECL_LANG_SPECIFIC ((T)) \
+ = ggc_alloc_cleared_lang_decl (sizeof (struct lang_decl)); \
+ DECL_LANG_SPECIFIC (T)->desc = LANG_DECL_VAR; \
}
/* A ConstantExpression, after folding and name resolution. */
@@ -840,7 +841,7 @@ typedef struct GTY(()) type_assertion {
extern tree java_treetreehash_find (htab_t, tree);
extern tree * java_treetreehash_new (htab_t, tree);
-extern htab_t java_treetreehash_create (size_t size, int ggc);
+extern htab_t java_treetreehash_create (size_t size);
/* DECL_LANG_SPECIFIC for VAR_DECL, PARM_DECL and sometimes FIELD_DECL
(access methods on outer class fields) and final fields. */
@@ -861,7 +862,7 @@ struct GTY(()) lang_decl_var {
enum lang_decl_desc {LANG_DECL_FUNC, LANG_DECL_VAR};
-struct GTY(()) lang_decl {
+struct GTY((variable_size)) lang_decl {
enum lang_decl_desc desc;
union lang_decl_u
{
@@ -879,7 +880,7 @@ struct GTY(()) lang_decl {
#define MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC(T) \
if (TYPE_LANG_SPECIFIC ((T)) == NULL) \
TYPE_LANG_SPECIFIC ((T)) \
- = GGC_CNEW (struct lang_type);
+ = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));
#define TYPE_DUMMY(T) (TYPE_LANG_SPECIFIC(T)->dummy_class)
@@ -924,7 +925,10 @@ typedef struct GTY(()) method_entry_d {
DEF_VEC_O(method_entry);
DEF_VEC_ALLOC_O(method_entry,gc);
-struct GTY(()) lang_type {
+/* FIXME: the variable_size annotation here is needed because these types are
+ variable-sized in some other frontends. Due to gengtype deficiency the GTY
+ options of such types have to agree across all frontends. */
+struct GTY((variable_size)) lang_type {
tree signature;
struct JCF *jcf;
struct CPool *cpool;
@@ -948,7 +952,7 @@ struct GTY(()) lang_type {
tree ctable_decl; /* The table of classes for the runtime
type matcher. */
- tree catch_classes;
+ VEC(constructor_elt,gc) *catch_classes;
htab_t GTY ((param_is (struct treetreehash_entry))) type_to_runtime_map;
/* The mapping of classes to exception region
diff --git a/gcc/java/jcf-parse.c b/gcc/java/jcf-parse.c
index eef75aa2516..37d27b41b43 100644
--- a/gcc/java/jcf-parse.c
+++ b/gcc/java/jcf-parse.c
@@ -1906,8 +1906,7 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
if (magic == 0xcafebabe)
{
CLASS_FILE_P (node) = 1;
- current_jcf = GGC_NEW (JCF);
- JCF_ZERO (current_jcf);
+ current_jcf = ggc_alloc_cleared_JCF ();
current_jcf->read_state = finput;
current_jcf->filbuf = jcf_filbuf_from_stdio;
jcf_parse (current_jcf);
@@ -1924,8 +1923,7 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
}
else if (magic == (JCF_u4)ZIPMAGIC)
{
- main_jcf = GGC_NEW (JCF);
- JCF_ZERO (main_jcf);
+ main_jcf = ggc_alloc_cleared_JCF ();
main_jcf->read_state = finput;
main_jcf->filbuf = jcf_filbuf_from_stdio;
linemap_add (line_table, LC_ENTER, false, filename, 0);
@@ -2181,8 +2179,7 @@ process_zip_dir (FILE *finput)
class_name = compute_class_name (zdir);
file_name = XNEWVEC (char, zdir->filename_length+1);
- jcf = GGC_NEW (JCF);
- JCF_ZERO (jcf);
+ jcf = ggc_alloc_cleared_JCF ();
strncpy (file_name, class_name_in_zip_dir, zdir->filename_length);
file_name [zdir->filename_length] = '\0';
diff --git a/gcc/java/jcf-reader.c b/gcc/java/jcf-reader.c
index 8970104708b..069b29bf277 100644
--- a/gcc/java/jcf-reader.c
+++ b/gcc/java/jcf-reader.c
@@ -331,8 +331,8 @@ jcf_parse_constant_pool (JCF* jcf)
{
int i, n;
JPOOL_SIZE (jcf) = (JCF_FILL (jcf, 2), JCF_readu2 (jcf));
- jcf->cpool.tags = GGC_NEWVAR (uint8, JPOOL_SIZE (jcf));
- jcf->cpool.data = GGC_NEWVAR (union cpool_entry, sizeof (jword) * JPOOL_SIZE (jcf));
+ jcf->cpool.tags = (uint8 *) ggc_alloc_atomic (JPOOL_SIZE (jcf));
+ jcf->cpool.data = ggc_alloc_cpool_entry (sizeof (jword) * JPOOL_SIZE (jcf));
jcf->cpool.tags[0] = 0;
#ifdef HANDLE_START_CONSTANT_POOL
HANDLE_START_CONSTANT_POOL (JPOOL_SIZE (jcf));
diff --git a/gcc/java/jcf.h b/gcc/java/jcf.h
index 7e8d18d9b3f..c7a789d6f2b 100644
--- a/gcc/java/jcf.h
+++ b/gcc/java/jcf.h
@@ -66,7 +66,7 @@ jcf_open_exact_case (const char* filename, int oflag);
struct JCF;
typedef int (*jcf_filbuf_t) (struct JCF*, int needed);
-union GTY(()) cpool_entry {
+union GTY((variable_size)) cpool_entry {
jword GTY ((tag ("0"))) w;
tree GTY ((tag ("1"))) t;
};
diff --git a/gcc/java/jvspec.c b/gcc/java/jvspec.c
index e197e2854b0..1987138a687 100644
--- a/gcc/java/jvspec.c
+++ b/gcc/java/jvspec.c
@@ -400,13 +400,13 @@ lang_specific_driver (int *in_argc, const char *const **in_argv,
}
if (quote)
- fatal_error ("argument to '%s' missing\n", quote);
+ fatal_error ("argument to %qs missing", quote);
if (saw_D && ! main_class_name)
- fatal_error ("can't specify '-D' without '--main'\n");
+ fatal_error ("can't specify %<-D%> without %<--main%>");
if (main_class_name && ! verify_class_name (main_class_name))
- fatal_error ("'%s' is not a valid class name", main_class_name);
+ fatal_error ("%qs is not a valid class name", main_class_name);
num_args = argc + added;
if (saw_resource)
@@ -582,7 +582,7 @@ lang_specific_driver (int *in_argc, const char *const **in_argv,
if (strncmp (argv[i], "-fmain=", 7) == 0)
{
if (! will_link)
- fatal_error ("cannot specify 'main' class when not linking");
+ fatal_error ("cannot specify %<main%> class when not linking");
--j;
continue;
}
diff --git a/gcc/java/lang.c b/gcc/java/lang.c
index 351952de1a6..6c31947c6a4 100644
--- a/gcc/java/lang.c
+++ b/gcc/java/lang.c
@@ -43,7 +43,6 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */
#include "tree-dump.h"
#include "opts.h"
#include "options.h"
-#include "except.h" /* For USING_SJLJ_EXCEPTIONS. */
static bool java_init (void);
static void java_finish (void);