diff options
author | Tom Tromey <tromey@gcc.gnu.org> | 2007-01-09 19:58:05 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2007-01-09 19:58:05 +0000 |
commit | 97b8365cafc3a344a22d3980b8ed885f5c6d8357 (patch) | |
tree | 996a5f57d4a68c53473382e45cb22f574cb3e4db /gcc/java/constants.c | |
parent | c648dedbde727ca3f883bb5fd773aa4af70d3369 (diff) | |
download | gcc-97b8365cafc3a344a22d3980b8ed885f5c6d8357.zip gcc-97b8365cafc3a344a22d3980b8ed885f5c6d8357.tar.gz gcc-97b8365cafc3a344a22d3980b8ed885f5c6d8357.tar.bz2 |
Merged gcj-eclipse branch to trunk.
From-SVN: r120621
Diffstat (limited to 'gcc/java/constants.c')
-rw-r--r-- | gcc/java/constants.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/gcc/java/constants.c b/gcc/java/constants.c index 2f4c053..70e5321 100644 --- a/gcc/java/constants.c +++ b/gcc/java/constants.c @@ -34,11 +34,9 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */ static void set_constant_entry (CPool *, int, int, jword); static int find_tree_constant (CPool *, int, tree); -static int find_class_or_string_constant (CPool *, int, tree); static int find_name_and_type_constant (CPool *, tree, tree); static tree get_tag_node (int); static tree build_constant_data_ref (void); -static CPool *cpool_for_class (tree); /* Set the INDEX'th constant in CPOOL to have the given TAG and VALUE. */ @@ -134,7 +132,7 @@ find_utf8_constant (CPool *cpool, tree name) return find_tree_constant (cpool, CONSTANT_Utf8, name); } -static int +int find_class_or_string_constant (CPool *cpool, int tag, tree name) { jword j = find_utf8_constant (cpool, name); @@ -322,6 +320,9 @@ get_tag_node (int tag) { /* A Cache for build_int_cst (CONSTANT_XXX, 0). */ + if (tag >= 13) + return build_int_cst (NULL_TREE, tag); + if (tag_nodes[tag] == NULL_TREE) tag_nodes[tag] = build_int_cst (NULL_TREE, tag); return tag_nodes[tag]; @@ -329,7 +330,7 @@ get_tag_node (int tag) /* Given a class, return its constant pool, creating one if necessary. */ -static CPool * +CPool * cpool_for_class (tree class) { CPool *cpool = TYPE_CPOOL (class); @@ -495,11 +496,20 @@ build_constants_constructor (void) tree tags_list = NULL_TREE; tree data_list = NULL_TREE; int i; + for (i = outgoing_cpool->count; --i > 0; ) - switch (outgoing_cpool->tags[i]) + switch (outgoing_cpool->tags[i] & ~CONSTANT_LazyFlag) { + case CONSTANT_None: /* The second half of a Double or Long on a + 32-bit target. */ case CONSTANT_Fieldref: case CONSTANT_NameAndType: + case CONSTANT_Float: + case CONSTANT_Integer: + case CONSTANT_Double: + case CONSTANT_Long: + case CONSTANT_Methodref: + case CONSTANT_InterfaceMethodref: { unsigned HOST_WIDE_INT temp = outgoing_cpool->data[i].w; @@ -512,8 +522,7 @@ build_constants_constructor (void) temp <<= BITS_PER_WORD - 32; tags_list - = tree_cons (NULL_TREE, - build_int_cst (NULL_TREE, outgoing_cpool->tags[i]), + = tree_cons (NULL_TREE, get_tag_node (outgoing_cpool->tags[i]), tags_list); data_list = tree_cons (NULL_TREE, @@ -522,7 +531,11 @@ build_constants_constructor (void) data_list); } break; - default: + + case CONSTANT_Class: + case CONSTANT_String: + case CONSTANT_Unicode: + case CONSTANT_Utf8: tags_list = tree_cons (NULL_TREE, get_tag_node (outgoing_cpool->tags[i]), tags_list); @@ -530,6 +543,9 @@ build_constants_constructor (void) = tree_cons (NULL_TREE, build_utf8_ref (outgoing_cpool->data[i].t), data_list); break; + + default: + gcc_assert (false); } if (outgoing_cpool->count > 0) { |