* jump.c: Remove prototypes for delete_computation and
[official-gcc.git] / gcc / java / class.c
blob804c239fcfabc61da6a5dd21227cf2dc644e910e
1 /* Functions related to building classes and their related objects.
2 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
3 2005, 2006, 2007 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to
19 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA.
22 Java and all Java-based marks are trademarks or registered trademarks
23 of Sun Microsystems, Inc. in the United States and other countries.
24 The Free Software Foundation is independent of Sun Microsystems, Inc. */
26 /* Written by Per Bothner <bothner@cygnus.com> */
28 #include "config.h"
29 #include "system.h"
30 #include "coretypes.h"
31 #include "tm.h"
32 #include "tree.h"
33 #include "rtl.h"
34 #include "flags.h"
35 #include "java-tree.h"
36 #include "jcf.h"
37 #include "obstack.h"
38 #include "toplev.h"
39 #include "output.h"
40 #include "parse.h"
41 #include "function.h"
42 #include "ggc.h"
43 #include "stdio.h"
44 #include "target.h"
45 #include "except.h"
46 #include "cgraph.h"
47 #include "tree-iterator.h"
48 #include "cgraph.h"
49 #include "vecprim.h"
51 /* DOS brain-damage */
52 #ifndef O_BINARY
53 #define O_BINARY 0 /* MS-DOS brain-damage */
54 #endif
56 static tree make_method_value (tree);
57 static tree build_java_method_type (tree, tree, int);
58 static int32 hashUtf8String (const char *, int);
59 static tree make_field_value (tree);
60 static tree get_dispatch_vector (tree);
61 static tree get_dispatch_table (tree, tree);
62 static int supers_all_compiled (tree type);
63 static tree maybe_layout_super_class (tree, tree);
64 static void add_miranda_methods (tree, tree);
65 static int assume_compiled (const char *);
66 static tree build_symbol_entry (tree, tree);
67 static tree emit_assertion_table (tree);
68 static void register_class (void);
70 struct obstack temporary_obstack;
72 static const char *cyclic_inheritance_report;
74 /* The compiler generates different code depending on whether or not
75 it can assume certain classes have been compiled down to native
76 code or not. The compiler options -fassume-compiled= and
77 -fno-assume-compiled= are used to create a tree of
78 class_flag_node objects. This tree is queried to determine if
79 a class is assume to be compiled or not. Each node in the tree
80 represents either a package or a specific class. */
82 typedef struct class_flag_node_struct
84 /* The class or package name. */
85 const char *ident;
87 /* Nonzero if this represents an exclusion. */
88 int value;
90 /* Pointers to other nodes in the tree. */
91 struct class_flag_node_struct *parent;
92 struct class_flag_node_struct *sibling;
93 struct class_flag_node_struct *child;
94 } class_flag_node;
96 static class_flag_node *find_class_flag_node (class_flag_node *, const char *);
97 static void add_class_flag (class_flag_node **, const char *, int);
99 /* This is the root of the include/exclude tree. */
101 static class_flag_node *assume_compiled_tree;
103 static class_flag_node *enable_assert_tree;
105 static GTY(()) tree class_roots[4];
106 #define fields_ident class_roots[0] /* get_identifier ("fields") */
107 #define info_ident class_roots[1] /* get_identifier ("info") */
108 #define class_list class_roots[2]
109 #define class_dtable_decl class_roots[3]
111 static GTY(()) VEC(tree,gc) *registered_class;
113 /* A tree that returns the address of the class$ of the class
114 currently being compiled. */
115 static GTY(()) tree this_classdollar;
117 /* Return the node that most closely represents the class whose name
118 is IDENT. Start the search from NODE (followed by its siblings).
119 Return NULL if an appropriate node does not exist. */
121 static class_flag_node *
122 find_class_flag_node (class_flag_node *node, const char *ident)
124 while (node)
126 size_t node_ident_length = strlen (node->ident);
128 /* node_ident_length is zero at the root of the tree. If the
129 identifiers are the same length, then we have matching
130 classes. Otherwise check if we've matched an enclosing
131 package name. */
133 if (node_ident_length == 0
134 || (strncmp (ident, node->ident, node_ident_length) == 0
135 && (ident[node_ident_length] == '\0'
136 || ident[node_ident_length] == '.')))
138 /* We've found a match, however, there might be a more
139 specific match. */
141 class_flag_node *found = find_class_flag_node (node->child, ident);
142 if (found)
143 return found;
144 else
145 return node;
148 /* No match yet. Continue through the sibling list. */
149 node = node->sibling;
152 /* No match at all in this tree. */
153 return NULL;
156 void
157 add_class_flag (class_flag_node **rootp, const char *ident, int value)
159 class_flag_node *root = *rootp;
160 class_flag_node *parent, *node;
162 /* Create the root of the tree if it doesn't exist yet. */
164 if (NULL == root)
166 root = XNEW (class_flag_node);
167 root->ident = "";
168 root->value = 0;
169 root->sibling = NULL;
170 root->child = NULL;
171 root->parent = NULL;
172 *rootp = root;
175 /* Calling the function with the empty string means we're setting
176 value for the root of the hierarchy. */
178 if (0 == ident[0])
180 root->value = value;
181 return;
184 /* Find the parent node for this new node. PARENT will either be a
185 class or a package name. Adjust PARENT accordingly. */
187 parent = find_class_flag_node (root, ident);
188 if (strcmp (ident, parent->ident) == 0)
189 parent->value = value;
190 else
192 /* Insert new node into the tree. */
193 node = XNEW (class_flag_node);
195 node->ident = xstrdup (ident);
196 node->value = value;
197 node->child = NULL;
199 node->parent = parent;
200 node->sibling = parent->child;
201 parent->child = node;
205 /* Add a new IDENT to the include/exclude tree. It's an exclusion
206 if EXCLUDEP is nonzero. */
208 void
209 add_assume_compiled (const char *ident, int excludep)
211 add_class_flag (&assume_compiled_tree, ident, excludep);
214 /* The default value returned by enable_assertions. */
216 #define DEFAULT_ENABLE_ASSERT (optimize == 0)
218 /* Enter IDENT (a class or package name) into the enable-assertions table.
219 VALUE is true to enable and false to disable. */
221 void
222 add_enable_assert (const char *ident, int value)
224 if (enable_assert_tree == NULL)
225 add_class_flag (&enable_assert_tree, "", DEFAULT_ENABLE_ASSERT);
226 add_class_flag (&enable_assert_tree, ident, value);
229 /* Returns nonzero if IDENT is the name of a class that the compiler
230 should assume has been compiled to object code. */
232 static int
233 assume_compiled (const char *ident)
235 class_flag_node *i;
236 int result;
238 if (NULL == assume_compiled_tree)
239 return 1;
241 i = find_class_flag_node (assume_compiled_tree, ident);
243 result = ! i->value;
245 return (result);
248 /* Return true if we should generate code to check assertions within KLASS. */
250 bool
251 enable_assertions (tree klass)
253 /* Check if command-line specifies whether we should check assertions. */
255 if (klass != NULL_TREE && DECL_NAME (klass) && enable_assert_tree != NULL)
257 const char *ident = IDENTIFIER_POINTER (DECL_NAME (klass));
258 class_flag_node *node
259 = find_class_flag_node (enable_assert_tree, ident);
260 return node->value;
263 /* The default is to enable assertions if generating class files,
264 or not optimizing. */
265 return DEFAULT_ENABLE_ASSERT;
268 /* Return an IDENTIFIER_NODE the same as (OLD_NAME, OLD_LENGTH).
269 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
270 Also, PREFIX is prepended, and SUFFIX is appended. */
272 tree
273 ident_subst (const char* old_name,
274 int old_length,
275 const char *prefix,
276 int old_char,
277 int new_char,
278 const char *suffix)
280 int prefix_len = strlen (prefix);
281 int suffix_len = strlen (suffix);
282 int i = prefix_len + old_length + suffix_len + 1;
283 char *buffer = alloca (i);
285 strcpy (buffer, prefix);
286 for (i = 0; i < old_length; i++)
288 char ch = old_name[i];
289 if (ch == old_char)
290 ch = new_char;
291 buffer[prefix_len + i] = ch;
293 strcpy (buffer + prefix_len + old_length, suffix);
294 return get_identifier (buffer);
297 /* Return an IDENTIFIER_NODE the same as OLD_ID,
298 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
299 Also, PREFIX is prepended, and SUFFIX is appended. */
301 tree
302 identifier_subst (const tree old_id,
303 const char *prefix,
304 int old_char,
305 int new_char,
306 const char *suffix)
308 return ident_subst (IDENTIFIER_POINTER (old_id), IDENTIFIER_LENGTH (old_id),
309 prefix, old_char, new_char, suffix);
312 /* Generate a valid C identifier from the name of the class TYPE,
313 prefixed by PREFIX. */
315 tree
316 mangled_classname (const char *prefix, tree type)
318 tree ident = TYPE_NAME (type);
319 if (TREE_CODE (ident) != IDENTIFIER_NODE)
320 ident = DECL_NAME (ident);
321 return identifier_subst (ident, prefix, '.', '_', "");
324 tree
325 make_class (void)
327 tree type;
328 type = make_node (RECORD_TYPE);
329 /* Unfortunately we must create the binfo here, so that class
330 loading works. */
331 TYPE_BINFO (type) = make_tree_binfo (0);
332 MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC (type);
334 return type;
337 /* Given a fully-qualified classname in NAME (whose length is NAME_LENGTH),
338 and where each of the constituents is separated by '/',
339 return a corresponding IDENTIFIER_NODE, except using '.' as separator. */
341 tree
342 unmangle_classname (const char *name, int name_length)
344 tree to_return = ident_subst (name, name_length, "", '/', '.', "");
345 /* It's not sufficient to compare to_return and get_identifier
346 (name) to determine whether to_return is qualified. There are
347 cases in signature analysis where name will be stripped of a
348 trailing ';'. */
349 name = IDENTIFIER_POINTER (to_return);
350 while (*name)
351 if (*name++ == '.')
353 QUALIFIED_P (to_return) = 1;
354 break;
357 return to_return;
360 #define GEN_TABLE(TABLE, NAME, TABLE_TYPE, TYPE) \
361 do \
363 const char *typename = IDENTIFIER_POINTER (mangled_classname ("", TYPE)); \
364 char *buf = alloca (strlen (typename) + strlen (#NAME "_syms_") + 1); \
365 tree decl; \
367 sprintf (buf, #NAME "_%s", typename); \
368 TYPE_## TABLE ##_DECL (type) = decl = \
369 build_decl (VAR_DECL, get_identifier (buf), TABLE_TYPE); \
370 DECL_EXTERNAL (decl) = 1; \
371 TREE_STATIC (decl) = 1; \
372 TREE_READONLY (decl) = 1; \
373 TREE_CONSTANT (decl) = 1; \
374 DECL_IGNORED_P (decl) = 1; \
375 /* Mark the table as belonging to this class. */ \
376 pushdecl (decl); \
377 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl); \
378 DECL_OWNER (decl) = TYPE; \
379 sprintf (buf, #NAME "_syms_%s", typename); \
380 TYPE_## TABLE ##_SYMS_DECL (TYPE) = \
381 build_decl (VAR_DECL, get_identifier (buf), symbols_array_type); \
382 TREE_STATIC (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
383 TREE_CONSTANT (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
384 DECL_IGNORED_P (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
386 while (0)
388 /* Given a class, create the DECLs for all its associated indirect
389 dispatch tables. */
390 void
391 gen_indirect_dispatch_tables (tree type)
393 const char *typename = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
395 tree field = NULL;
396 char *buf = alloca (strlen (typename) + strlen ("_catch_classes_") + 1);
397 tree catch_class_type = make_node (RECORD_TYPE);
399 sprintf (buf, "_catch_classes_%s", typename);
400 PUSH_FIELD (catch_class_type, field, "address", utf8const_ptr_type);
401 PUSH_FIELD (catch_class_type, field, "classname", ptr_type_node);
402 FINISH_RECORD (catch_class_type);
404 TYPE_CTABLE_DECL (type)
405 = build_decl (VAR_DECL, get_identifier (buf),
406 build_array_type (catch_class_type, 0));
407 DECL_EXTERNAL (TYPE_CTABLE_DECL (type)) = 1;
408 TREE_STATIC (TYPE_CTABLE_DECL (type)) = 1;
409 TREE_READONLY (TYPE_CTABLE_DECL (type)) = 1;
410 TREE_CONSTANT (TYPE_CTABLE_DECL (type)) = 1;
411 DECL_IGNORED_P (TYPE_CTABLE_DECL (type)) = 1;
412 pushdecl (TYPE_CTABLE_DECL (type));
415 if (flag_indirect_dispatch)
417 GEN_TABLE (ATABLE, _atable, atable_type, type);
418 GEN_TABLE (OTABLE, _otable, otable_type, type);
419 GEN_TABLE (ITABLE, _itable, itable_type, type);
423 #undef GEN_TABLE
425 tree
426 push_class (tree class_type, tree class_name)
428 tree decl, signature;
429 location_t saved_loc = input_location;
430 #ifndef USE_MAPPED_LOCATION
431 tree source_name = identifier_subst (class_name, "", '.', '/', ".java");
432 input_filename = IDENTIFIER_POINTER (source_name);
433 input_line = 0;
434 #endif
435 CLASS_P (class_type) = 1;
436 decl = build_decl (TYPE_DECL, class_name, class_type);
437 TYPE_DECL_SUPPRESS_DEBUG (decl) = 1;
439 /* dbxout needs a DECL_SIZE if in gstabs mode */
440 DECL_SIZE (decl) = integer_zero_node;
442 input_location = saved_loc;
443 signature = identifier_subst (class_name, "L", '.', '/', ";");
444 IDENTIFIER_SIGNATURE_TYPE (signature) = build_pointer_type (class_type);
446 /* Setting DECL_ARTIFICIAL forces dbxout.c to specific the type is
447 both a typedef and in the struct name-space. We may want to re-visit
448 this later, but for now it reduces the changes needed for gdb. */
449 DECL_ARTIFICIAL (decl) = 1;
451 pushdecl_top_level (decl);
453 return decl;
456 /* Finds the (global) class named NAME. Creates the class if not found.
457 Also creates associated TYPE_DECL.
458 Does not check if the class actually exists, load the class,
459 fill in field or methods, or do layout_type. */
461 tree
462 lookup_class (tree name)
464 tree decl = IDENTIFIER_CLASS_VALUE (name);
465 if (decl == NULL_TREE)
466 decl = push_class (make_class (), name);
467 return TREE_TYPE (decl);
470 void
471 set_super_info (int access_flags, tree this_class,
472 tree super_class, int interfaces_count)
474 int total_supers = interfaces_count;
475 tree class_decl = TYPE_NAME (this_class);
477 if (super_class)
478 total_supers++;
480 if (total_supers)
481 TYPE_BINFO (this_class) = make_tree_binfo (total_supers);
482 TYPE_VFIELD (this_class) = TYPE_VFIELD (object_type_node);
483 if (super_class)
485 tree super_binfo = make_tree_binfo (0);
486 BINFO_TYPE (super_binfo) = super_class;
487 BINFO_OFFSET (super_binfo) = integer_zero_node;
488 BINFO_BASE_APPEND (TYPE_BINFO (this_class), super_binfo);
489 CLASS_HAS_SUPER_FLAG (TYPE_BINFO (this_class)) = 1;
492 set_class_decl_access_flags (access_flags, class_decl);
495 void
496 set_class_decl_access_flags (int access_flags, tree class_decl)
498 if (access_flags & ACC_PUBLIC) CLASS_PUBLIC (class_decl) = 1;
499 if (access_flags & ACC_FINAL) CLASS_FINAL (class_decl) = 1;
500 if (access_flags & ACC_SUPER) CLASS_SUPER (class_decl) = 1;
501 if (access_flags & ACC_INTERFACE) CLASS_INTERFACE (class_decl) = 1;
502 if (access_flags & ACC_ABSTRACT) CLASS_ABSTRACT (class_decl) = 1;
503 if (access_flags & ACC_STATIC) CLASS_STATIC (class_decl) = 1;
504 if (access_flags & ACC_PRIVATE) CLASS_PRIVATE (class_decl) = 1;
505 if (access_flags & ACC_PROTECTED) CLASS_PROTECTED (class_decl) = 1;
506 if (access_flags & ACC_STRICT) CLASS_STRICTFP (class_decl) = 1;
507 if (access_flags & ACC_ENUM) CLASS_ENUM (class_decl) = 1;
508 if (access_flags & ACC_SYNTHETIC) CLASS_SYNTHETIC (class_decl) = 1;
509 if (access_flags & ACC_ANNOTATION) CLASS_ANNOTATION (class_decl) = 1;
512 /* Return length of inheritance chain of CLAS, where java.lang.Object is 0,
513 direct sub-classes of Object are 1, and so on. */
516 class_depth (tree clas)
518 int depth = 0;
519 if (! CLASS_LOADED_P (clas))
520 load_class (clas, 1);
521 if (TYPE_SIZE (clas) == error_mark_node)
522 return -1;
523 while (clas != object_type_node)
525 depth++;
526 clas = BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (clas), 0));
528 return depth;
531 /* Return true iff TYPE2 is an interface that extends interface TYPE1 */
534 interface_of_p (tree type1, tree type2)
536 int i;
537 tree binfo, base_binfo;
539 if (! TYPE_BINFO (type2))
540 return 0;
542 for (binfo = TYPE_BINFO (type2), i = 0;
543 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
544 if (BINFO_TYPE (base_binfo) == type1)
545 return 1;
547 for (binfo = TYPE_BINFO (type2), i = 0;
548 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++) /* */
549 if (BINFO_TYPE (base_binfo)
550 && interface_of_p (type1, BINFO_TYPE (base_binfo)))
551 return 1;
553 return 0;
556 /* Return true iff TYPE1 inherits from TYPE2. */
559 inherits_from_p (tree type1, tree type2)
561 while (type1 != NULL_TREE && TREE_CODE (type1) == RECORD_TYPE)
563 if (type1 == type2)
564 return 1;
566 if (! CLASS_LOADED_P (type1))
567 load_class (type1, 1);
569 type1 = maybe_layout_super_class (CLASSTYPE_SUPER (type1), type1);
571 return 0;
574 /* Return a 1 iff TYPE1 is an enclosing context for TYPE2 */
577 enclosing_context_p (tree type1, tree type2)
579 if (!INNER_CLASS_TYPE_P (type2))
580 return 0;
582 for (type2 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2)));
583 type2;
584 type2 = (INNER_CLASS_TYPE_P (type2) ?
585 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))) : NULL_TREE))
587 if (type2 == type1)
588 return 1;
591 return 0;
595 /* Return 1 iff TYPE1 and TYPE2 share a common enclosing class, regardless of
596 nesting level. */
599 common_enclosing_context_p (tree type1, tree type2)
601 while (type1)
603 tree current;
604 for (current = type2; current;
605 current = (INNER_CLASS_TYPE_P (current) ?
606 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
607 NULL_TREE))
608 if (type1 == current)
609 return 1;
611 if (INNER_CLASS_TYPE_P (type1))
612 type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1)));
613 else
614 break;
616 return 0;
619 /* Return 1 iff there exists a common enclosing "this" between TYPE1
620 and TYPE2, without crossing any static context. */
623 common_enclosing_instance_p (tree type1, tree type2)
625 if (!PURE_INNER_CLASS_TYPE_P (type1) || !PURE_INNER_CLASS_TYPE_P (type2))
626 return 0;
628 for (type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))); type1;
629 type1 = (PURE_INNER_CLASS_TYPE_P (type1) ?
630 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))) : NULL_TREE))
632 tree current;
633 for (current = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))); current;
634 current = (PURE_INNER_CLASS_TYPE_P (current) ?
635 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
636 NULL_TREE))
637 if (type1 == current)
638 return 1;
640 return 0;
643 /* Add INTERFACE_CLASS to THIS_CLASS iff INTERFACE_CLASS can't be
644 found in THIS_CLASS. Returns NULL_TREE upon success, INTERFACE_CLASS
645 if attempt is made to add it twice. */
647 tree
648 maybe_add_interface (tree this_class, tree interface_class)
650 tree binfo, base_binfo;
651 int i;
653 for (binfo = TYPE_BINFO (this_class), i = 0;
654 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
655 if (BINFO_TYPE (base_binfo) == interface_class)
656 return interface_class;
657 add_interface (this_class, interface_class);
658 return NULL_TREE;
661 /* Add the INTERFACE_CLASS as one of the interfaces of THIS_CLASS. */
663 void
664 add_interface (tree this_class, tree interface_class)
666 tree interface_binfo = make_tree_binfo (0);
668 BINFO_TYPE (interface_binfo) = interface_class;
669 BINFO_OFFSET (interface_binfo) = integer_zero_node;
670 BINFO_VPTR_FIELD (interface_binfo) = integer_zero_node;
671 BINFO_VIRTUAL_P (interface_binfo) = 1;
673 BINFO_BASE_APPEND (TYPE_BINFO (this_class), interface_binfo);
676 static tree
677 build_java_method_type (tree fntype, tree this_class, int access_flags)
679 if (access_flags & ACC_STATIC)
680 return fntype;
681 fntype = build_method_type (this_class, fntype);
683 /* We know that arg 1 of every nonstatic method is non-null; tell
684 the back-end so. */
685 TYPE_ATTRIBUTES (fntype) = (tree_cons
686 (get_identifier ("nonnull"),
687 tree_cons (NULL_TREE,
688 build_int_cst (NULL_TREE, 1),
689 NULL_TREE),
690 TYPE_ATTRIBUTES (fntype)));
691 return fntype;
694 tree
695 add_method_1 (tree this_class, int access_flags, tree name, tree function_type)
697 tree method_type, fndecl;
699 method_type = build_java_method_type (function_type,
700 this_class, access_flags);
702 fndecl = build_decl (FUNCTION_DECL, name, method_type);
703 DECL_CONTEXT (fndecl) = this_class;
705 DECL_LANG_SPECIFIC (fndecl)
706 = ggc_alloc_cleared (sizeof (struct lang_decl));
707 DECL_LANG_SPECIFIC (fndecl)->desc = LANG_DECL_FUNC;
709 /* Initialize the static initializer test table. */
711 DECL_FUNCTION_INIT_TEST_TABLE (fndecl) =
712 java_treetreehash_create (10, 1);
714 /* Initialize the initialized (static) class table. */
715 if (access_flags & ACC_STATIC)
716 DECL_FUNCTION_INITIALIZED_CLASS_TABLE (fndecl) =
717 htab_create_ggc (50, htab_hash_pointer, htab_eq_pointer, NULL);
719 TREE_CHAIN (fndecl) = TYPE_METHODS (this_class);
720 TYPE_METHODS (this_class) = fndecl;
722 /* Notice that this is a finalizer and update the class type
723 accordingly. This is used to optimize instance allocation. */
724 if (name == finalize_identifier_node
725 && TREE_TYPE (function_type) == void_type_node
726 && TREE_VALUE (TYPE_ARG_TYPES (function_type)) == void_type_node)
727 HAS_FINALIZER_P (this_class) = 1;
729 if (access_flags & ACC_PUBLIC) METHOD_PUBLIC (fndecl) = 1;
730 if (access_flags & ACC_PROTECTED) METHOD_PROTECTED (fndecl) = 1;
731 if (access_flags & ACC_PRIVATE)
732 METHOD_PRIVATE (fndecl) = DECL_INLINE (fndecl) = 1;
733 if (access_flags & ACC_NATIVE)
735 METHOD_NATIVE (fndecl) = 1;
736 DECL_EXTERNAL (fndecl) = 1;
738 else
739 /* FNDECL is external unless we are compiling it into this object
740 file. */
741 DECL_EXTERNAL (fndecl) = CLASS_FROM_CURRENTLY_COMPILED_P (this_class) == 0;
742 if (access_flags & ACC_STATIC)
743 METHOD_STATIC (fndecl) = DECL_INLINE (fndecl) = 1;
744 if (access_flags & ACC_FINAL)
745 METHOD_FINAL (fndecl) = DECL_INLINE (fndecl) = 1;
746 if (access_flags & ACC_SYNCHRONIZED) METHOD_SYNCHRONIZED (fndecl) = 1;
747 if (access_flags & ACC_ABSTRACT) METHOD_ABSTRACT (fndecl) = 1;
748 if (access_flags & ACC_STRICT) METHOD_STRICTFP (fndecl) = 1;
749 if (access_flags & ACC_SYNTHETIC) DECL_ARTIFICIAL (fndecl) = 1;
750 if (access_flags & ACC_BRIDGE) METHOD_BRIDGE (fndecl) = 1;
751 if (access_flags & ACC_VARARGS) METHOD_VARARGS (fndecl) = 1;
752 return fndecl;
755 /* Add a method to THIS_CLASS.
756 The method's name is NAME.
757 Its signature (mangled type) is METHOD_SIG (an IDENTIFIER_NODE). */
759 tree
760 add_method (tree this_class, int access_flags, tree name, tree method_sig)
762 tree function_type, fndecl;
763 const unsigned char *sig
764 = (const unsigned char *) IDENTIFIER_POINTER (method_sig);
766 if (sig[0] != '(')
767 fatal_error ("bad method signature");
769 function_type = get_type_from_signature (method_sig);
770 fndecl = add_method_1 (this_class, access_flags, name, function_type);
771 set_java_signature (TREE_TYPE (fndecl), method_sig);
772 return fndecl;
775 tree
776 add_field (tree class, tree name, tree field_type, int flags)
778 int is_static = (flags & ACC_STATIC) != 0;
779 tree field;
780 field = build_decl (is_static ? VAR_DECL : FIELD_DECL, name, field_type);
781 TREE_CHAIN (field) = TYPE_FIELDS (class);
782 TYPE_FIELDS (class) = field;
783 DECL_CONTEXT (field) = class;
784 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field);
786 if (flags & ACC_PUBLIC) FIELD_PUBLIC (field) = 1;
787 if (flags & ACC_PROTECTED) FIELD_PROTECTED (field) = 1;
788 if (flags & ACC_PRIVATE) FIELD_PRIVATE (field) = 1;
789 if (flags & ACC_FINAL) FIELD_FINAL (field) = 1;
790 if (flags & ACC_VOLATILE)
792 FIELD_VOLATILE (field) = 1;
793 TREE_THIS_VOLATILE (field) = 1;
795 if (flags & ACC_TRANSIENT) FIELD_TRANSIENT (field) = 1;
796 if (flags & ACC_ENUM) FIELD_ENUM (field) = 1;
797 if (flags & ACC_SYNTHETIC) FIELD_SYNTHETIC (field) = 1;
798 if (is_static)
800 FIELD_STATIC (field) = 1;
801 /* Always make field externally visible. This is required so
802 that native methods can always access the field. */
803 TREE_PUBLIC (field) = 1;
804 /* Considered external unless we are compiling it into this
805 object file. */
806 DECL_EXTERNAL (field) = (is_compiled_class (class) != 2);
809 return field;
812 /* Associate a constant value CONSTANT with VAR_DECL FIELD. */
814 void
815 set_constant_value (tree field, tree constant)
817 if (field == NULL_TREE)
818 warning (OPT_Wattributes,
819 "misplaced ConstantValue attribute (not in any field)");
820 else if (DECL_INITIAL (field) != NULL_TREE)
821 warning (OPT_Wattributes,
822 "duplicate ConstantValue attribute for field '%s'",
823 IDENTIFIER_POINTER (DECL_NAME (field)));
824 else
826 DECL_INITIAL (field) = constant;
827 if (TREE_TYPE (constant) != TREE_TYPE (field)
828 && ! (TREE_TYPE (constant) == int_type_node
829 && INTEGRAL_TYPE_P (TREE_TYPE (field))
830 && TYPE_PRECISION (TREE_TYPE (field)) <= 32)
831 && ! (TREE_TYPE (constant) == utf8const_ptr_type
832 && TREE_TYPE (field) == string_ptr_type_node))
833 error ("ConstantValue attribute of field '%s' has wrong type",
834 IDENTIFIER_POINTER (DECL_NAME (field)));
835 if (FIELD_FINAL (field))
836 DECL_FIELD_FINAL_IUD (field) = 1;
840 /* Calculate a hash value for a string encoded in Utf8 format.
841 * This returns the same hash value as specified for java.lang.String.hashCode.
844 static int32
845 hashUtf8String (const char *str, int len)
847 const unsigned char* ptr = (const unsigned char*) str;
848 const unsigned char *limit = ptr + len;
849 int32 hash = 0;
850 for (; ptr < limit;)
852 int ch = UTF8_GET (ptr, limit);
853 /* Updated specification from
854 http://www.javasoft.com/docs/books/jls/clarify.html. */
855 hash = (31 * hash) + ch;
857 return hash;
860 static GTY(()) tree utf8_decl_list = NULL_TREE;
862 tree
863 build_utf8_ref (tree name)
865 const char * name_ptr = IDENTIFIER_POINTER(name);
866 int name_len = IDENTIFIER_LENGTH(name);
867 char buf[60];
868 tree ctype, field = NULL_TREE, str_type, cinit, string;
869 static int utf8_count = 0;
870 int name_hash;
871 tree ref = IDENTIFIER_UTF8_REF (name);
872 tree decl;
873 if (ref != NULL_TREE)
874 return ref;
876 ctype = make_node (RECORD_TYPE);
877 str_type = build_prim_array_type (unsigned_byte_type_node,
878 name_len + 1); /* Allow for final '\0'. */
879 PUSH_FIELD (ctype, field, "hash", unsigned_short_type_node);
880 PUSH_FIELD (ctype, field, "length", unsigned_short_type_node);
881 PUSH_FIELD (ctype, field, "data", str_type);
882 FINISH_RECORD (ctype);
883 START_RECORD_CONSTRUCTOR (cinit, ctype);
884 name_hash = hashUtf8String (name_ptr, name_len) & 0xFFFF;
885 PUSH_FIELD_VALUE (cinit, "hash", build_int_cst (NULL_TREE, name_hash));
886 PUSH_FIELD_VALUE (cinit, "length", build_int_cst (NULL_TREE, name_len));
887 string = build_string (name_len, name_ptr);
888 TREE_TYPE (string) = str_type;
889 PUSH_FIELD_VALUE (cinit, "data", string);
890 FINISH_RECORD_CONSTRUCTOR (cinit);
891 TREE_CONSTANT (cinit) = 1;
892 TREE_INVARIANT (cinit) = 1;
894 /* Generate a unique-enough identifier. */
895 sprintf(buf, "_Utf%d", ++utf8_count);
897 decl = build_decl (VAR_DECL, get_identifier (buf), utf8const_type);
898 TREE_STATIC (decl) = 1;
899 DECL_ARTIFICIAL (decl) = 1;
900 DECL_IGNORED_P (decl) = 1;
901 TREE_READONLY (decl) = 1;
902 TREE_THIS_VOLATILE (decl) = 0;
903 DECL_INITIAL (decl) = cinit;
905 if (HAVE_GAS_SHF_MERGE)
907 int decl_size;
908 /* Ensure decl_size is a multiple of utf8const_type's alignment. */
909 decl_size = (name_len + 5 + TYPE_ALIGN_UNIT (utf8const_type) - 1)
910 & ~(TYPE_ALIGN_UNIT (utf8const_type) - 1);
911 if (flag_merge_constants && decl_size < 256)
913 char buf[32];
914 int flags = (SECTION_OVERRIDE
915 | SECTION_MERGE | (SECTION_ENTSIZE & decl_size));
916 sprintf (buf, ".rodata.jutf8.%d", decl_size);
917 switch_to_section (get_section (buf, flags, NULL));
918 DECL_SECTION_NAME (decl) = build_string (strlen (buf), buf);
922 TREE_CHAIN (decl) = utf8_decl_list;
923 layout_decl (decl, 0);
924 pushdecl (decl);
925 rest_of_decl_compilation (decl, global_bindings_p (), 0);
926 varpool_mark_needed_node (varpool_node (decl));
927 utf8_decl_list = decl;
928 ref = build1 (ADDR_EXPR, utf8const_ptr_type, decl);
929 IDENTIFIER_UTF8_REF (name) = ref;
930 return ref;
933 /* Like build_class_ref, but instead of a direct reference generate a
934 pointer into the constant pool. */
936 static tree
937 build_indirect_class_ref (tree type)
939 int index;
940 tree cl;
941 index = alloc_class_constant (type);
942 cl = build_ref_from_constant_pool (index);
943 return convert (promote_type (class_ptr_type), cl);
946 static tree
947 build_static_class_ref (tree type)
949 tree decl_name, decl, ref;
951 if (TYPE_SIZE (type) == error_mark_node)
952 return null_pointer_node;
953 decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
954 "", '/', '/', ".class$$");
955 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
956 if (decl == NULL_TREE)
958 decl = build_decl (VAR_DECL, decl_name, class_type_node);
959 TREE_STATIC (decl) = 1;
960 if (! flag_indirect_classes)
961 TREE_PUBLIC (decl) = 1;
962 DECL_IGNORED_P (decl) = 1;
963 DECL_ARTIFICIAL (decl) = 1;
964 if (is_compiled_class (type) == 1)
965 DECL_EXTERNAL (decl) = 1;
966 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
967 DECL_CLASS_FIELD_P (decl) = 1;
968 DECL_CONTEXT (decl) = type;
970 /* ??? We want to preserve the DECL_CONTEXT we set just above,
971 that that means not calling pushdecl_top_level. */
972 IDENTIFIER_GLOBAL_VALUE (decl_name) = decl;
975 ref = build1 (ADDR_EXPR, class_ptr_type, decl);
976 return ref;
979 static tree
980 build_classdollar_field (tree type)
982 tree decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
983 "", '/', '/', ".class$");
984 tree decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
986 if (decl == NULL_TREE)
988 decl
989 = build_decl (VAR_DECL, decl_name,
990 (build_type_variant
991 (build_pointer_type
992 (build_type_variant (class_type_node,
993 /* const */ 1, 0)),
994 /* const */ 1, 0)));
995 TREE_STATIC (decl) = 1;
996 TREE_INVARIANT (decl) = 1;
997 TREE_CONSTANT (decl) = 1;
998 TREE_READONLY (decl) = 1;
999 TREE_PUBLIC (decl) = 1;
1000 DECL_IGNORED_P (decl) = 1;
1001 DECL_ARTIFICIAL (decl) = 1;
1002 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1003 IDENTIFIER_GLOBAL_VALUE (decl_name) = decl;
1004 DECL_CLASS_FIELD_P (decl) = 1;
1005 DECL_CONTEXT (decl) = type;
1008 return decl;
1011 /* Create a local variable that holds the the current class$. */
1013 void
1014 cache_this_class_ref (tree fndecl)
1016 if (optimize)
1018 tree classdollar_field;
1019 if (flag_indirect_classes)
1020 classdollar_field = build_classdollar_field (output_class);
1021 else
1022 classdollar_field = build_static_class_ref (output_class);
1024 this_classdollar = build_decl (VAR_DECL, NULL_TREE,
1025 TREE_TYPE (classdollar_field));
1027 java_add_local_var (this_classdollar);
1028 java_add_stmt (build2 (MODIFY_EXPR, TREE_TYPE (this_classdollar),
1029 this_classdollar, classdollar_field));
1031 else
1032 this_classdollar = build_classdollar_field (output_class);
1034 /* Prepend class initialization for static methods reachable from
1035 other classes. */
1036 if (METHOD_STATIC (fndecl)
1037 && (! METHOD_PRIVATE (fndecl)
1038 || INNER_CLASS_P (DECL_CONTEXT (fndecl)))
1039 && ! DECL_CLINIT_P (fndecl)
1040 && ! CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (fndecl))))
1042 tree init = build3 (CALL_EXPR, void_type_node,
1043 build_address_of (soft_initclass_node),
1044 build_tree_list (NULL_TREE, this_classdollar),
1045 NULL_TREE);
1046 java_add_stmt (init);
1050 /* Remove the reference to the local variable that holds the current
1051 class$. */
1053 void
1054 uncache_this_class_ref (tree fndecl ATTRIBUTE_UNUSED)
1056 this_classdollar = build_classdollar_field (output_class);
1059 /* Build a reference to the class TYPE.
1060 Also handles primitive types and array types. */
1062 tree
1063 build_class_ref (tree type)
1065 int is_compiled = is_compiled_class (type);
1066 if (is_compiled)
1068 tree ref, decl;
1069 if (TREE_CODE (type) == POINTER_TYPE)
1070 type = TREE_TYPE (type);
1072 if (flag_indirect_dispatch
1073 && type != output_class
1074 && TREE_CODE (type) == RECORD_TYPE)
1075 return build_indirect_class_ref (type);
1077 if (type == output_class && flag_indirect_classes)
1078 return this_classdollar;
1080 if (TREE_CODE (type) == RECORD_TYPE)
1081 return build_static_class_ref (type);
1082 else
1084 const char *name;
1085 tree decl_name;
1086 char buffer[25];
1087 decl_name = TYPE_NAME (type);
1088 if (TREE_CODE (decl_name) == TYPE_DECL)
1089 decl_name = DECL_NAME (decl_name);
1090 name = IDENTIFIER_POINTER (decl_name);
1091 if (strncmp (name, "promoted_", 9) == 0)
1092 name += 9;
1093 sprintf (buffer, "_Jv_%sClass", name);
1094 decl_name = get_identifier (buffer);
1095 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1096 if (decl == NULL_TREE)
1098 decl = build_decl (VAR_DECL, decl_name, class_type_node);
1099 TREE_STATIC (decl) = 1;
1100 TREE_PUBLIC (decl) = 1;
1101 DECL_EXTERNAL (decl) = 1;
1102 DECL_ARTIFICIAL (decl) = 1;
1103 pushdecl_top_level (decl);
1107 ref = build1 (ADDR_EXPR, class_ptr_type, decl);
1108 return ref;
1110 else
1111 return build_indirect_class_ref (type);
1114 /* Create a local statically allocated variable that will hold a
1115 pointer to a static field. */
1117 static tree
1118 build_fieldref_cache_entry (int index, tree fdecl ATTRIBUTE_UNUSED)
1120 tree decl, decl_name;
1121 const char *name = IDENTIFIER_POINTER (mangled_classname ("_cpool_", output_class));
1122 char *buf = alloca (strlen (name) + 20);
1123 sprintf (buf, "%s_%d_ref", name, index);
1124 decl_name = get_identifier (buf);
1125 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1126 if (decl == NULL_TREE)
1128 decl = build_decl (VAR_DECL, decl_name, ptr_type_node);
1129 TREE_STATIC (decl) = 1;
1130 TREE_PUBLIC (decl) = 0;
1131 DECL_EXTERNAL (decl) = 0;
1132 DECL_ARTIFICIAL (decl) = 1;
1133 DECL_IGNORED_P (decl) = 1;
1134 pushdecl_top_level (decl);
1136 return decl;
1139 tree
1140 build_static_field_ref (tree fdecl)
1142 tree fclass = DECL_CONTEXT (fdecl);
1143 int is_compiled = is_compiled_class (fclass);
1144 int from_class = ! CLASS_FROM_SOURCE_P (current_class);
1146 /* Allow static final fields to fold to a constant. When using
1147 -findirect-dispatch, we simply never do this folding if compiling
1148 from .class; in the .class file constants will be referred to via
1149 the constant pool. */
1150 if ((!flag_indirect_dispatch || !from_class)
1151 && (is_compiled
1152 || (FIELD_FINAL (fdecl) && DECL_INITIAL (fdecl) != NULL_TREE
1153 && (JSTRING_TYPE_P (TREE_TYPE (fdecl))
1154 || JNUMERIC_TYPE_P (TREE_TYPE (fdecl)))
1155 && TREE_CONSTANT (DECL_INITIAL (fdecl)))))
1157 if (is_compiled == 1)
1158 DECL_EXTERNAL (fdecl) = 1;
1160 else
1162 /* Generate a CONSTANT_FieldRef for FDECL in the constant pool
1163 and a class local static variable CACHE_ENTRY, then
1165 *(fdecl **)((__builtin_expect (cache_entry == null, false))
1166 ? cache_entry = _Jv_ResolvePoolEntry (output_class, cpool_index)
1167 : cache_entry)
1169 This can mostly be optimized away, so that the usual path is a
1170 load followed by a test and branch. _Jv_ResolvePoolEntry is
1171 only called once for each constant pool entry.
1173 There is an optimization that we don't do: at the start of a
1174 method, create a local copy of CACHE_ENTRY and use that instead.
1178 int cpool_index = alloc_constant_fieldref (output_class, fdecl);
1179 tree cache_entry = build_fieldref_cache_entry (cpool_index, fdecl);
1180 tree test
1181 = build3 (CALL_EXPR, boolean_type_node,
1182 build_address_of (built_in_decls[BUILT_IN_EXPECT]),
1183 tree_cons (NULL_TREE, build2 (EQ_EXPR, boolean_type_node,
1184 cache_entry, null_pointer_node),
1185 build_tree_list (NULL_TREE, boolean_false_node)),
1186 NULL_TREE);
1187 tree cpool_index_cst = build_int_cst (NULL_TREE, cpool_index);
1188 tree init
1189 = build3 (CALL_EXPR, ptr_type_node,
1190 build_address_of (soft_resolvepoolentry_node),
1191 tree_cons (NULL_TREE, build_class_ref (output_class),
1192 build_tree_list (NULL_TREE, cpool_index_cst)),
1193 NULL_TREE);
1194 init = build2 (MODIFY_EXPR, ptr_type_node, cache_entry, init);
1195 init = build3 (COND_EXPR, ptr_type_node, test, init, cache_entry);
1196 init = fold_convert (build_pointer_type (TREE_TYPE (fdecl)), init);
1197 fdecl = build1 (INDIRECT_REF, TREE_TYPE (fdecl), init);
1199 return fdecl;
1203 get_access_flags_from_decl (tree decl)
1205 int access_flags = 0;
1206 if (TREE_CODE (decl) == FIELD_DECL || TREE_CODE (decl) == VAR_DECL)
1208 if (FIELD_STATIC (decl))
1209 access_flags |= ACC_STATIC;
1210 if (FIELD_PUBLIC (decl))
1211 access_flags |= ACC_PUBLIC;
1212 if (FIELD_PROTECTED (decl))
1213 access_flags |= ACC_PROTECTED;
1214 if (FIELD_PRIVATE (decl))
1215 access_flags |= ACC_PRIVATE;
1216 if (FIELD_FINAL (decl))
1217 access_flags |= ACC_FINAL;
1218 if (FIELD_VOLATILE (decl))
1219 access_flags |= ACC_VOLATILE;
1220 if (FIELD_TRANSIENT (decl))
1221 access_flags |= ACC_TRANSIENT;
1222 if (FIELD_ENUM (decl))
1223 access_flags |= ACC_ENUM;
1224 if (FIELD_SYNTHETIC (decl))
1225 access_flags |= ACC_SYNTHETIC;
1226 return access_flags;
1228 if (TREE_CODE (decl) == TYPE_DECL)
1230 if (CLASS_PUBLIC (decl))
1231 access_flags |= ACC_PUBLIC;
1232 if (CLASS_FINAL (decl))
1233 access_flags |= ACC_FINAL;
1234 if (CLASS_SUPER (decl))
1235 access_flags |= ACC_SUPER;
1236 if (CLASS_INTERFACE (decl))
1237 access_flags |= ACC_INTERFACE;
1238 if (CLASS_ABSTRACT (decl))
1239 access_flags |= ACC_ABSTRACT;
1240 if (CLASS_STATIC (decl))
1241 access_flags |= ACC_STATIC;
1242 if (CLASS_PRIVATE (decl))
1243 access_flags |= ACC_PRIVATE;
1244 if (CLASS_PROTECTED (decl))
1245 access_flags |= ACC_PROTECTED;
1246 if (CLASS_STRICTFP (decl))
1247 access_flags |= ACC_STRICT;
1248 if (CLASS_ENUM (decl))
1249 access_flags |= ACC_ENUM;
1250 if (CLASS_SYNTHETIC (decl))
1251 access_flags |= ACC_SYNTHETIC;
1252 if (CLASS_ANNOTATION (decl))
1253 access_flags |= ACC_ANNOTATION;
1254 return access_flags;
1256 if (TREE_CODE (decl) == FUNCTION_DECL)
1258 if (METHOD_PUBLIC (decl))
1259 access_flags |= ACC_PUBLIC;
1260 if (METHOD_PRIVATE (decl))
1261 access_flags |= ACC_PRIVATE;
1262 if (METHOD_PROTECTED (decl))
1263 access_flags |= ACC_PROTECTED;
1264 if (METHOD_STATIC (decl))
1265 access_flags |= ACC_STATIC;
1266 if (METHOD_FINAL (decl))
1267 access_flags |= ACC_FINAL;
1268 if (METHOD_SYNCHRONIZED (decl))
1269 access_flags |= ACC_SYNCHRONIZED;
1270 if (METHOD_NATIVE (decl))
1271 access_flags |= ACC_NATIVE;
1272 if (METHOD_ABSTRACT (decl))
1273 access_flags |= ACC_ABSTRACT;
1274 if (METHOD_STRICTFP (decl))
1275 access_flags |= ACC_STRICT;
1276 if (METHOD_INVISIBLE (decl))
1277 access_flags |= ACC_INVISIBLE;
1278 if (DECL_ARTIFICIAL (decl))
1279 access_flags |= ACC_SYNTHETIC;
1280 if (METHOD_BRIDGE (decl))
1281 access_flags |= ACC_BRIDGE;
1282 if (METHOD_VARARGS (decl))
1283 access_flags |= ACC_VARARGS;
1284 return access_flags;
1286 gcc_unreachable ();
1289 static GTY (()) int alias_labelno = 0;
1291 /* Create a private alias for METHOD. Using this alias instead of the method
1292 decl ensures that ncode entries in the method table point to the real function
1293 at runtime, not a PLT entry. */
1295 static tree
1296 make_local_function_alias (tree method)
1298 #ifdef ASM_OUTPUT_DEF
1299 tree alias;
1301 const char *method_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (method));
1302 char *name = alloca (strlen (method_name) + 2);
1303 char *buf = alloca (strlen (method_name) + 128);
1305 /* Only create aliases for local functions. */
1306 if (DECL_EXTERNAL (method))
1307 return method;
1309 /* Prefix method_name with 'L' for the alias label. */
1310 *name = 'L';
1311 strcpy (name + 1, method_name);
1313 ASM_GENERATE_INTERNAL_LABEL (buf, name, alias_labelno++);
1314 alias = build_decl (FUNCTION_DECL, get_identifier (buf),
1315 TREE_TYPE (method));
1316 DECL_CONTEXT (alias) = NULL;
1317 TREE_READONLY (alias) = TREE_READONLY (method);
1318 TREE_THIS_VOLATILE (alias) = TREE_THIS_VOLATILE (method);
1319 TREE_PUBLIC (alias) = 0;
1320 DECL_EXTERNAL (alias) = 0;
1321 DECL_ARTIFICIAL (alias) = 1;
1322 DECL_INLINE (alias) = 0;
1323 DECL_INITIAL (alias) = error_mark_node;
1324 TREE_ADDRESSABLE (alias) = 1;
1325 TREE_USED (alias) = 1;
1326 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias)) = 1;
1327 if (!flag_syntax_only)
1328 assemble_alias (alias, DECL_ASSEMBLER_NAME (method));
1329 return alias;
1330 #else
1331 return method;
1332 #endif
1335 /** Make reflection data (_Jv_Field) for field FDECL. */
1337 static tree
1338 make_field_value (tree fdecl)
1340 tree finit;
1341 int flags;
1342 tree type = TREE_TYPE (fdecl);
1343 int resolved = is_compiled_class (type) && ! flag_indirect_dispatch;
1345 START_RECORD_CONSTRUCTOR (finit, field_type_node);
1346 PUSH_FIELD_VALUE (finit, "name", build_utf8_ref (DECL_NAME (fdecl)));
1347 if (resolved)
1348 type = build_class_ref (type);
1349 else
1351 tree signature = build_java_signature (type);
1353 type = build_utf8_ref (unmangle_classname
1354 (IDENTIFIER_POINTER (signature),
1355 IDENTIFIER_LENGTH (signature)));
1357 PUSH_FIELD_VALUE (finit, "type", type);
1359 flags = get_access_flags_from_decl (fdecl);
1360 if (! resolved)
1361 flags |= 0x8000 /* FIELD_UNRESOLVED_FLAG */;
1363 PUSH_FIELD_VALUE (finit, "accflags", build_int_cst (NULL_TREE, flags));
1364 PUSH_FIELD_VALUE (finit, "bsize", TYPE_SIZE_UNIT (TREE_TYPE (fdecl)));
1367 tree field_address = integer_zero_node;
1368 if ((DECL_INITIAL (fdecl) || ! flag_indirect_classes)
1369 && FIELD_STATIC (fdecl))
1370 field_address = build_address_of (fdecl);
1372 PUSH_FIELD_VALUE
1373 (finit, "info",
1374 build_constructor_from_list (field_info_union_node,
1375 build_tree_list
1376 ((FIELD_STATIC (fdecl)
1377 ? TREE_CHAIN (TYPE_FIELDS (field_info_union_node))
1378 : TYPE_FIELDS (field_info_union_node)),
1379 (FIELD_STATIC (fdecl)
1380 ? field_address
1381 : byte_position (fdecl)))));
1384 FINISH_RECORD_CONSTRUCTOR (finit);
1385 return finit;
1388 /** Make reflection data (_Jv_Method) for method MDECL. */
1390 static tree
1391 make_method_value (tree mdecl)
1393 static int method_name_count = 0;
1394 tree minit;
1395 tree index;
1396 tree code;
1397 tree class_decl;
1398 #define ACC_TRANSLATED 0x4000
1399 int accflags = get_access_flags_from_decl (mdecl) | ACC_TRANSLATED;
1401 class_decl = DECL_CONTEXT (mdecl);
1402 /* For interfaces, the index field contains the dispatch index. */
1403 if (CLASS_INTERFACE (TYPE_NAME (class_decl)))
1404 index = build_int_cst (NULL_TREE,
1405 get_interface_method_index (mdecl, class_decl));
1406 else if (!flag_indirect_dispatch && get_method_index (mdecl) != NULL_TREE)
1407 index = get_method_index (mdecl);
1408 else
1409 index = integer_minus_one_node;
1411 code = null_pointer_node;
1412 if (METHOD_ABSTRACT (mdecl))
1413 code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
1414 soft_abstractmethod_node);
1415 else
1416 code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
1417 make_local_function_alias (mdecl));
1418 START_RECORD_CONSTRUCTOR (minit, method_type_node);
1419 PUSH_FIELD_VALUE (minit, "name",
1420 build_utf8_ref (DECL_CONSTRUCTOR_P (mdecl) ?
1421 init_identifier_node
1422 : DECL_NAME (mdecl)));
1424 tree signature = build_java_signature (TREE_TYPE (mdecl));
1425 PUSH_FIELD_VALUE (minit, "signature",
1426 (build_utf8_ref
1427 (unmangle_classname
1428 (IDENTIFIER_POINTER(signature),
1429 IDENTIFIER_LENGTH(signature)))));
1431 PUSH_FIELD_VALUE (minit, "accflags", build_int_cst (NULL_TREE, accflags));
1432 PUSH_FIELD_VALUE (minit, "index", index);
1433 PUSH_FIELD_VALUE (minit, "ncode", code);
1436 /* Compute the `throws' information for the method. */
1437 tree table = null_pointer_node;
1438 if (DECL_FUNCTION_THROWS (mdecl) != NULL_TREE)
1440 int length = 1 + list_length (DECL_FUNCTION_THROWS (mdecl));
1441 tree iter, type, array;
1442 char buf[60];
1444 table = tree_cons (NULL_TREE, table, NULL_TREE);
1445 for (iter = DECL_FUNCTION_THROWS (mdecl);
1446 iter != NULL_TREE;
1447 iter = TREE_CHAIN (iter))
1449 tree sig = DECL_NAME (TYPE_NAME (TREE_VALUE (iter)));
1450 tree utf8
1451 = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
1452 IDENTIFIER_LENGTH (sig)));
1453 table = tree_cons (NULL_TREE, utf8, table);
1455 type = build_prim_array_type (ptr_type_node, length);
1456 table = build_constructor_from_list (type, table);
1457 /* Compute something unique enough. */
1458 sprintf (buf, "_methods%d", method_name_count++);
1459 array = build_decl (VAR_DECL, get_identifier (buf), type);
1460 DECL_INITIAL (array) = table;
1461 TREE_STATIC (array) = 1;
1462 DECL_ARTIFICIAL (array) = 1;
1463 DECL_IGNORED_P (array) = 1;
1464 rest_of_decl_compilation (array, 1, 0);
1466 table = build1 (ADDR_EXPR, ptr_type_node, array);
1469 PUSH_FIELD_VALUE (minit, "throws", table);
1472 FINISH_RECORD_CONSTRUCTOR (minit);
1473 return minit;
1476 static tree
1477 get_dispatch_vector (tree type)
1479 tree vtable = TYPE_VTABLE (type);
1481 if (vtable == NULL_TREE)
1483 HOST_WIDE_INT i;
1484 tree method;
1485 tree super = CLASSTYPE_SUPER (type);
1486 HOST_WIDE_INT nvirtuals = tree_low_cst (TYPE_NVIRTUALS (type), 0);
1487 vtable = make_tree_vec (nvirtuals);
1488 TYPE_VTABLE (type) = vtable;
1489 if (super != NULL_TREE)
1491 tree super_vtable = get_dispatch_vector (super);
1493 for (i = tree_low_cst (TYPE_NVIRTUALS (super), 0); --i >= 0; )
1494 TREE_VEC_ELT (vtable, i) = TREE_VEC_ELT (super_vtable, i);
1497 for (method = TYPE_METHODS (type); method != NULL_TREE;
1498 method = TREE_CHAIN (method))
1500 tree method_index = get_method_index (method);
1501 if (method_index != NULL_TREE
1502 && host_integerp (method_index, 0))
1503 TREE_VEC_ELT (vtable, tree_low_cst (method_index, 0)) = method;
1507 return vtable;
1510 static tree
1511 get_dispatch_table (tree type, tree this_class_addr)
1513 int abstract_p = CLASS_ABSTRACT (TYPE_NAME (type));
1514 tree vtable = get_dispatch_vector (type);
1515 int i, j;
1516 tree list = NULL_TREE;
1517 int nvirtuals = TREE_VEC_LENGTH (vtable);
1518 int arraysize;
1519 tree gc_descr;
1521 for (i = nvirtuals; --i >= 0; )
1523 tree method = TREE_VEC_ELT (vtable, i);
1524 if (METHOD_ABSTRACT (method))
1526 if (! abstract_p)
1527 warning (0, "%Jabstract method in non-abstract class", method);
1529 if (TARGET_VTABLE_USES_DESCRIPTORS)
1530 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1531 list = tree_cons (NULL_TREE, null_pointer_node, list);
1532 else
1533 list = tree_cons (NULL_TREE, null_pointer_node, list);
1535 else
1537 if (TARGET_VTABLE_USES_DESCRIPTORS)
1538 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1540 tree fdesc = build2 (FDESC_EXPR, nativecode_ptr_type_node,
1541 method, build_int_cst (NULL_TREE, j));
1542 TREE_CONSTANT (fdesc) = 1;
1543 TREE_INVARIANT (fdesc) = 1;
1544 list = tree_cons (NULL_TREE, fdesc, list);
1546 else
1547 list = tree_cons (NULL_TREE,
1548 build1 (ADDR_EXPR, nativecode_ptr_type_node,
1549 method),
1550 list);
1554 /* Dummy entry for compatibility with G++ -fvtable-thunks. When
1555 using the Boehm GC we sometimes stash a GC type descriptor
1556 there. We set the PURPOSE to NULL_TREE not to interfere (reset)
1557 the emitted byte count during the output to the assembly file. */
1558 /* With TARGET_VTABLE_USES_DESCRIPTORS, we only add one extra
1559 fake "function descriptor". It's first word is the is the class
1560 pointer, and subsequent words (usually one) contain the GC descriptor.
1561 In all other cases, we reserve two extra vtable slots. */
1562 gc_descr = get_boehm_type_descriptor (type);
1563 list = tree_cons (NULL_TREE, gc_descr, list);
1564 for (j = 1; j < TARGET_VTABLE_USES_DESCRIPTORS-1; ++j)
1565 list = tree_cons (NULL_TREE, gc_descr, list);
1566 list = tree_cons (NULL_TREE, this_class_addr, list);
1568 /** Pointer to type_info object (to be implemented), according to g++ ABI. */
1569 list = tree_cons (NULL_TREE, null_pointer_node, list);
1570 /** Offset to start of whole object. Always (ptrdiff_t)0 for Java. */
1571 list = tree_cons (integer_zero_node, null_pointer_node, list);
1573 arraysize = (TARGET_VTABLE_USES_DESCRIPTORS? nvirtuals + 1 : nvirtuals + 2);
1574 if (TARGET_VTABLE_USES_DESCRIPTORS)
1575 arraysize *= TARGET_VTABLE_USES_DESCRIPTORS;
1576 arraysize += 2;
1577 return build_constructor_from_list
1578 (build_prim_array_type (nativecode_ptr_type_node,
1579 arraysize), list);
1583 /* Set the method_index for a method decl. */
1584 void
1585 set_method_index (tree decl, tree method_index)
1587 if (method_index != NULL_TREE)
1589 /* method_index is null if we're using indirect dispatch. */
1590 method_index = fold (convert (sizetype, method_index));
1592 if (TARGET_VTABLE_USES_DESCRIPTORS)
1593 /* Add one to skip bogus descriptor for class and GC descriptor. */
1594 method_index = size_binop (PLUS_EXPR, method_index, size_int (1));
1595 else
1596 /* Add 1 to skip "class" field of dtable, and 1 to skip GC
1597 descriptor. */
1598 method_index = size_binop (PLUS_EXPR, method_index, size_int (2));
1601 DECL_VINDEX (decl) = method_index;
1604 /* Get the method_index for a method decl. */
1605 tree
1606 get_method_index (tree decl)
1608 tree method_index = DECL_VINDEX (decl);
1610 if (! method_index)
1611 return NULL;
1613 if (TARGET_VTABLE_USES_DESCRIPTORS)
1614 /* Sub one to skip bogus descriptor for class and GC descriptor. */
1615 method_index = size_binop (MINUS_EXPR, method_index, size_int (1));
1616 else
1617 /* Sub 1 to skip "class" field of dtable, and 1 to skip GC descriptor. */
1618 method_index = size_binop (MINUS_EXPR, method_index, size_int (2));
1620 return method_index;
1623 static int
1624 supers_all_compiled (tree type)
1626 while (type != NULL_TREE)
1628 if (!assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)))))
1629 return 0;
1630 type = CLASSTYPE_SUPER (type);
1632 return 1;
1635 void
1636 make_class_data (tree type)
1638 tree decl, cons, temp;
1639 tree field, fields_decl;
1640 tree static_fields = NULL_TREE;
1641 tree instance_fields = NULL_TREE;
1642 HOST_WIDE_INT static_field_count = 0;
1643 HOST_WIDE_INT instance_field_count = 0;
1644 HOST_WIDE_INT field_count;
1645 tree field_array_type;
1646 tree method;
1647 tree methods = NULL_TREE;
1648 tree dtable_decl = NULL_TREE;
1649 HOST_WIDE_INT method_count = 0;
1650 tree method_array_type;
1651 tree methods_decl;
1652 tree super;
1653 tree this_class_addr;
1654 tree constant_pool_constructor;
1655 tree interfaces = null_pointer_node;
1656 int interface_len = 0;
1657 int uses_jv_markobj = 0;
1658 tree type_decl = TYPE_NAME (type);
1659 tree id_main = get_identifier("main");
1660 tree id_class = get_identifier("java.lang.Class");
1661 /** Offset from start of virtual function table declaration
1662 to where objects actually point at, following new g++ ABI. */
1663 tree dtable_start_offset = build_int_cst (NULL_TREE,
1664 2 * POINTER_SIZE / BITS_PER_UNIT);
1665 VEC(int, heap) *field_indexes;
1666 tree first_real_field;
1668 this_class_addr = build_static_class_ref (type);
1669 decl = TREE_OPERAND (this_class_addr, 0);
1671 if (supers_all_compiled (type) && ! CLASS_INTERFACE (type_decl)
1672 && !flag_indirect_dispatch)
1674 tree dtable = get_dispatch_table (type, this_class_addr);
1675 uses_jv_markobj = uses_jv_markobj_p (dtable);
1676 if (type == class_type_node && class_dtable_decl != NULL_TREE)
1678 /* We've already created some other class, and consequently
1679 we made class_dtable_decl. Now we just want to fill it
1680 in. */
1681 dtable_decl = class_dtable_decl;
1683 else
1685 dtable_decl = build_dtable_decl (type);
1686 TREE_STATIC (dtable_decl) = 1;
1687 DECL_ARTIFICIAL (dtable_decl) = 1;
1688 DECL_IGNORED_P (dtable_decl) = 1;
1691 TREE_PUBLIC (dtable_decl) = 1;
1692 DECL_INITIAL (dtable_decl) = dtable;
1693 if (! flag_indirect_classes)
1694 rest_of_decl_compilation (dtable_decl, 1, 0);
1695 /* Maybe we're compiling Class as the first class. If so, set
1696 class_dtable_decl to the decl we just made. */
1697 if (type == class_type_node && class_dtable_decl == NULL_TREE)
1698 class_dtable_decl = dtable_decl;
1701 /* Build Field array. */
1702 field = TYPE_FIELDS (type);
1703 while (field && DECL_ARTIFICIAL (field))
1704 field = TREE_CHAIN (field); /* Skip dummy fields. */
1705 if (field && DECL_NAME (field) == NULL_TREE)
1706 field = TREE_CHAIN (field); /* Skip dummy field for inherited data. */
1707 first_real_field = field;
1709 /* First count static and instance fields. */
1710 for ( ; field != NULL_TREE; field = TREE_CHAIN (field))
1712 if (! DECL_ARTIFICIAL (field))
1714 if (FIELD_STATIC (field))
1715 static_field_count++;
1716 else if (uses_jv_markobj || !flag_reduced_reflection)
1717 instance_field_count++;
1720 field_count = static_field_count + instance_field_count;
1721 field_indexes = VEC_alloc (int, heap, field_count);
1723 /* gcj sorts fields so that static fields come first, followed by
1724 instance fields. Unfortunately, by the time this takes place we
1725 have already generated the reflection_data for this class, and
1726 that data contains indexes into the fields. So, we generate a
1727 permutation that maps each original field index to its final
1728 position. Then we pass this permutation to
1729 rewrite_reflection_indexes(), which fixes up the reflection
1730 data. */
1732 int i;
1733 int static_count = 0;
1734 int instance_count = static_field_count;
1735 int field_index;
1737 for (i = 0, field = first_real_field;
1738 field != NULL_TREE;
1739 field = TREE_CHAIN (field), i++)
1741 if (! DECL_ARTIFICIAL (field))
1743 field_index = 0;
1744 if (FIELD_STATIC (field))
1745 field_index = static_count++;
1746 else if (uses_jv_markobj || !flag_reduced_reflection)
1747 field_index = instance_count++;
1748 VEC_quick_push (int, field_indexes, field_index);
1753 for (field = first_real_field; field != NULL_TREE;
1754 field = TREE_CHAIN (field))
1756 if (! DECL_ARTIFICIAL (field))
1758 if (FIELD_STATIC (field))
1760 /* We must always create reflection data for static fields
1761 as it is used in the creation of the field itself. */
1762 tree init = make_field_value (field);
1763 tree initial = DECL_INITIAL (field);
1764 static_fields = tree_cons (NULL_TREE, init, static_fields);
1765 /* If the initial value is a string constant,
1766 prevent output_constant from trying to assemble the value. */
1767 if (initial != NULL_TREE
1768 && TREE_TYPE (initial) == string_ptr_type_node)
1769 DECL_INITIAL (field) = NULL_TREE;
1770 rest_of_decl_compilation (field, 1, 1);
1771 DECL_INITIAL (field) = initial;
1773 else if (uses_jv_markobj || !flag_reduced_reflection)
1775 tree init = make_field_value (field);
1776 instance_fields = tree_cons (NULL_TREE, init, instance_fields);
1781 if (field_count > 0)
1783 static_fields = nreverse (static_fields);
1784 instance_fields = nreverse (instance_fields);
1785 static_fields = chainon (static_fields, instance_fields);
1786 field_array_type = build_prim_array_type (field_type_node, field_count);
1787 fields_decl = build_decl (VAR_DECL, mangled_classname ("_FL_", type),
1788 field_array_type);
1789 DECL_INITIAL (fields_decl) = build_constructor_from_list
1790 (field_array_type, static_fields);
1791 TREE_STATIC (fields_decl) = 1;
1792 DECL_ARTIFICIAL (fields_decl) = 1;
1793 DECL_IGNORED_P (fields_decl) = 1;
1794 rest_of_decl_compilation (fields_decl, 1, 0);
1796 else
1797 fields_decl = NULL_TREE;
1799 /* Build Method array. */
1800 for (method = TYPE_METHODS (type);
1801 method != NULL_TREE; method = TREE_CHAIN (method))
1803 tree init;
1804 if (METHOD_PRIVATE (method)
1805 && ! flag_keep_inline_functions
1806 && optimize)
1807 continue;
1808 /* Even if we have a decl, we don't necessarily have the code.
1809 This can happen if we inherit a method from a superclass for
1810 which we don't have a .class file. */
1811 if (METHOD_DUMMY (method))
1812 continue;
1814 /* Generate method reflection data if:
1816 - !flag_reduced_reflection.
1818 - <clinit> -- The runtime uses reflection to initialize the
1819 class.
1821 - Any method in class java.lang.Class -- Class.forName() and
1822 perhaps other things require it.
1824 - class$ -- It does not work if reflection data missing.
1826 - main -- Reflection is used to find main(String[]) methods.
1828 - public not static -- It is potentially part of an
1829 interface. The runtime uses reflection data to build
1830 interface dispatch tables. */
1831 if (!flag_reduced_reflection
1832 || DECL_CLINIT_P (method)
1833 || DECL_NAME (type_decl) == id_class
1834 || DECL_NAME (method) == id_main
1835 || (METHOD_PUBLIC (method) && !METHOD_STATIC (method))
1836 || TYPE_DOT_CLASS (type) == method)
1838 init = make_method_value (method);
1839 method_count++;
1840 methods = tree_cons (NULL_TREE, init, methods);
1843 method_array_type = build_prim_array_type (method_type_node, method_count);
1844 methods_decl = build_decl (VAR_DECL, mangled_classname ("_MT_", type),
1845 method_array_type);
1846 DECL_INITIAL (methods_decl) = build_constructor_from_list
1847 (method_array_type, nreverse (methods));
1848 TREE_STATIC (methods_decl) = 1;
1849 DECL_ARTIFICIAL (methods_decl) = 1;
1850 DECL_IGNORED_P (methods_decl) = 1;
1851 rest_of_decl_compilation (methods_decl, 1, 0);
1853 if (class_dtable_decl == NULL_TREE)
1855 class_dtable_decl = build_dtable_decl (class_type_node);
1856 TREE_STATIC (class_dtable_decl) = 1;
1857 DECL_ARTIFICIAL (class_dtable_decl) = 1;
1858 DECL_IGNORED_P (class_dtable_decl) = 1;
1859 if (is_compiled_class (class_type_node) != 2)
1861 DECL_EXTERNAL (class_dtable_decl) = 1;
1862 rest_of_decl_compilation (class_dtable_decl, 1, 0);
1866 super = CLASSTYPE_SUPER (type);
1867 if (super == NULL_TREE)
1868 super = null_pointer_node;
1869 else if (! flag_indirect_dispatch
1870 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (type_decl)))
1871 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (super)))))
1872 super = build_class_ref (super);
1873 else
1875 int super_index = alloc_class_constant (super);
1876 super = build_int_cst (ptr_type_node, super_index);
1879 /* Build and emit the array of implemented interfaces. */
1880 if (type != object_type_node)
1881 interface_len = BINFO_N_BASE_BINFOS (TYPE_BINFO (type)) - 1;
1883 if (interface_len > 0)
1885 tree init = NULL_TREE;
1886 int i;
1887 tree interface_array_type, idecl;
1888 interface_array_type
1889 = build_prim_array_type (class_ptr_type, interface_len);
1890 idecl = build_decl (VAR_DECL, mangled_classname ("_IF_", type),
1891 interface_array_type);
1893 for (i = interface_len; i > 0; i--)
1895 tree child = BINFO_BASE_BINFO (TYPE_BINFO (type), i);
1896 tree iclass = BINFO_TYPE (child);
1897 tree index;
1898 if (! flag_indirect_dispatch
1899 && (assume_compiled
1900 (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (iclass))))))
1901 index = build_class_ref (iclass);
1902 else
1904 int int_index = alloc_class_constant (iclass);
1905 index = build_int_cst (ptr_type_node, int_index);
1907 init = tree_cons (NULL_TREE, index, init);
1909 DECL_INITIAL (idecl) = build_constructor_from_list (interface_array_type,
1910 init);
1911 TREE_STATIC (idecl) = 1;
1912 DECL_ARTIFICIAL (idecl) = 1;
1913 DECL_IGNORED_P (idecl) = 1;
1914 interfaces = build1 (ADDR_EXPR, ptr_type_node, idecl);
1915 rest_of_decl_compilation (idecl, 1, 0);
1918 constant_pool_constructor = build_constants_constructor ();
1920 if (flag_indirect_dispatch)
1922 TYPE_OTABLE_DECL (type)
1923 = emit_symbol_table
1924 (DECL_NAME (TYPE_OTABLE_DECL (type)),
1925 TYPE_OTABLE_DECL (type), TYPE_OTABLE_METHODS (type),
1926 TYPE_OTABLE_SYMS_DECL (type), integer_type_node, 1);
1928 TYPE_ATABLE_DECL (type)
1929 = emit_symbol_table
1930 (DECL_NAME (TYPE_ATABLE_DECL (type)),
1931 TYPE_ATABLE_DECL (type), TYPE_ATABLE_METHODS (type),
1932 TYPE_ATABLE_SYMS_DECL (type), ptr_type_node, 1);
1934 TYPE_ITABLE_DECL (type)
1935 = emit_symbol_table
1936 (DECL_NAME (TYPE_ITABLE_DECL (type)),
1937 TYPE_ITABLE_DECL (type), TYPE_ITABLE_METHODS (type),
1938 TYPE_ITABLE_SYMS_DECL (type), ptr_type_node, 2);
1941 TYPE_CTABLE_DECL (type) = emit_catch_table (type);
1943 START_RECORD_CONSTRUCTOR (temp, object_type_node);
1944 PUSH_FIELD_VALUE (temp, "vtable",
1945 (flag_indirect_classes
1946 ? null_pointer_node
1947 : build2 (PLUS_EXPR, dtable_ptr_type,
1948 build1 (ADDR_EXPR, dtable_ptr_type,
1949 class_dtable_decl),
1950 dtable_start_offset)));
1951 if (! flag_hash_synchronization)
1952 PUSH_FIELD_VALUE (temp, "sync_info", null_pointer_node);
1953 FINISH_RECORD_CONSTRUCTOR (temp);
1954 START_RECORD_CONSTRUCTOR (cons, class_type_node);
1955 PUSH_SUPER_VALUE (cons, temp);
1956 PUSH_FIELD_VALUE (cons, "next_or_version", gcj_abi_version);
1957 PUSH_FIELD_VALUE (cons, "name", build_utf8_ref (DECL_NAME (type_decl)));
1958 PUSH_FIELD_VALUE (cons, "accflags",
1959 build_int_cst (NULL_TREE,
1960 get_access_flags_from_decl (type_decl)));
1962 PUSH_FIELD_VALUE (cons, "superclass",
1963 CLASS_INTERFACE (type_decl) ? null_pointer_node : super);
1964 PUSH_FIELD_VALUE (cons, "constants", constant_pool_constructor);
1965 PUSH_FIELD_VALUE (cons, "methods",
1966 methods_decl == NULL_TREE ? null_pointer_node
1967 : build1 (ADDR_EXPR, method_ptr_type_node, methods_decl));
1968 PUSH_FIELD_VALUE (cons, "method_count",
1969 build_int_cst (NULL_TREE, method_count));
1971 if (flag_indirect_dispatch)
1972 PUSH_FIELD_VALUE (cons, "vtable_method_count", integer_minus_one_node);
1973 else
1974 PUSH_FIELD_VALUE (cons, "vtable_method_count", TYPE_NVIRTUALS (type));
1976 PUSH_FIELD_VALUE (cons, "fields",
1977 fields_decl == NULL_TREE ? null_pointer_node
1978 : build1 (ADDR_EXPR, field_ptr_type_node, fields_decl));
1979 /* If we're using the binary compatibility ABI we don't know the
1980 size until load time. */
1981 PUSH_FIELD_VALUE (cons, "size_in_bytes",
1982 (flag_indirect_dispatch
1983 ? integer_minus_one_node
1984 : size_in_bytes (type)));
1985 PUSH_FIELD_VALUE (cons, "field_count",
1986 build_int_cst (NULL_TREE, field_count));
1987 PUSH_FIELD_VALUE (cons, "static_field_count",
1988 build_int_cst (NULL_TREE, static_field_count));
1990 if (flag_indirect_dispatch)
1991 PUSH_FIELD_VALUE (cons, "vtable", null_pointer_node);
1992 else
1993 PUSH_FIELD_VALUE (cons, "vtable",
1994 dtable_decl == NULL_TREE ? null_pointer_node
1995 : build2 (PLUS_EXPR, dtable_ptr_type,
1996 build1 (ADDR_EXPR, dtable_ptr_type,
1997 dtable_decl),
1998 dtable_start_offset));
1999 if (TYPE_OTABLE_METHODS (type) == NULL_TREE)
2001 PUSH_FIELD_VALUE (cons, "otable", null_pointer_node);
2002 PUSH_FIELD_VALUE (cons, "otable_syms", null_pointer_node);
2004 else
2006 pushdecl_top_level (TYPE_OTABLE_SYMS_DECL (type));
2007 PUSH_FIELD_VALUE (cons, "otable",
2008 build1 (ADDR_EXPR, otable_ptr_type, TYPE_OTABLE_DECL (type)));
2009 PUSH_FIELD_VALUE (cons, "otable_syms",
2010 build1 (ADDR_EXPR, symbols_array_ptr_type,
2011 TYPE_OTABLE_SYMS_DECL (type)));
2012 TREE_CONSTANT (TYPE_OTABLE_DECL (type)) = 1;
2013 TREE_INVARIANT (TYPE_OTABLE_DECL (type)) = 1;
2015 if (TYPE_ATABLE_METHODS(type) == NULL_TREE)
2017 PUSH_FIELD_VALUE (cons, "atable", null_pointer_node);
2018 PUSH_FIELD_VALUE (cons, "atable_syms", null_pointer_node);
2020 else
2022 pushdecl_top_level (TYPE_ATABLE_SYMS_DECL (type));
2023 PUSH_FIELD_VALUE (cons, "atable",
2024 build1 (ADDR_EXPR, atable_ptr_type, TYPE_ATABLE_DECL (type)));
2025 PUSH_FIELD_VALUE (cons, "atable_syms",
2026 build1 (ADDR_EXPR, symbols_array_ptr_type,
2027 TYPE_ATABLE_SYMS_DECL (type)));
2028 TREE_CONSTANT (TYPE_ATABLE_DECL (type)) = 1;
2029 TREE_INVARIANT (TYPE_ATABLE_DECL (type)) = 1;
2031 if (TYPE_ITABLE_METHODS(type) == NULL_TREE)
2033 PUSH_FIELD_VALUE (cons, "itable", null_pointer_node);
2034 PUSH_FIELD_VALUE (cons, "itable_syms", null_pointer_node);
2036 else
2038 pushdecl_top_level (TYPE_ITABLE_SYMS_DECL (type));
2039 PUSH_FIELD_VALUE (cons, "itable",
2040 build1 (ADDR_EXPR, itable_ptr_type, TYPE_ITABLE_DECL (type)));
2041 PUSH_FIELD_VALUE (cons, "itable_syms",
2042 build1 (ADDR_EXPR, symbols_array_ptr_type,
2043 TYPE_ITABLE_SYMS_DECL (type)));
2044 TREE_CONSTANT (TYPE_ITABLE_DECL (type)) = 1;
2045 TREE_INVARIANT (TYPE_ITABLE_DECL (type)) = 1;
2048 PUSH_FIELD_VALUE (cons, "catch_classes",
2049 build1 (ADDR_EXPR, ptr_type_node, TYPE_CTABLE_DECL (type)));
2050 PUSH_FIELD_VALUE (cons, "interfaces", interfaces);
2051 PUSH_FIELD_VALUE (cons, "loader", null_pointer_node);
2052 PUSH_FIELD_VALUE (cons, "interface_count",
2053 build_int_cst (NULL_TREE, interface_len));
2054 PUSH_FIELD_VALUE (cons, "state",
2055 convert (byte_type_node,
2056 build_int_cst (NULL_TREE, JV_STATE_PRELOADING)));
2058 PUSH_FIELD_VALUE (cons, "thread", null_pointer_node);
2059 PUSH_FIELD_VALUE (cons, "depth", integer_zero_node);
2060 PUSH_FIELD_VALUE (cons, "ancestors", null_pointer_node);
2061 PUSH_FIELD_VALUE (cons, "idt", null_pointer_node);
2062 PUSH_FIELD_VALUE (cons, "arrayclass", null_pointer_node);
2063 PUSH_FIELD_VALUE (cons, "protectionDomain", null_pointer_node);
2066 tree assertion_table_ref;
2067 if (TYPE_ASSERTIONS (type) == NULL)
2068 assertion_table_ref = null_pointer_node;
2069 else
2070 assertion_table_ref = build1 (ADDR_EXPR,
2071 build_pointer_type (assertion_table_type),
2072 emit_assertion_table (type));
2074 PUSH_FIELD_VALUE (cons, "assertion_table", assertion_table_ref);
2077 PUSH_FIELD_VALUE (cons, "hack_signers", null_pointer_node);
2078 PUSH_FIELD_VALUE (cons, "chain", null_pointer_node);
2079 PUSH_FIELD_VALUE (cons, "aux_info", null_pointer_node);
2080 PUSH_FIELD_VALUE (cons, "engine", null_pointer_node);
2082 if (TYPE_REFLECTION_DATA (current_class))
2084 int i;
2085 int count = TYPE_REFLECTION_DATASIZE (current_class);
2086 VEC (constructor_elt, gc) *v
2087 = VEC_alloc (constructor_elt, gc, count);
2088 unsigned char *data = TYPE_REFLECTION_DATA (current_class);
2089 tree max_index = build_int_cst (sizetype, count);
2090 tree index = build_index_type (max_index);
2091 tree type = build_array_type (unsigned_byte_type_node, index);
2092 char buf[64];
2093 tree array;
2094 static int reflection_data_count;
2096 sprintf (buf, "_reflection_data_%d", reflection_data_count++);
2097 array = build_decl (VAR_DECL, get_identifier (buf), type);
2099 rewrite_reflection_indexes (field_indexes);
2101 for (i = 0; i < count; i++)
2103 constructor_elt *elt = VEC_quick_push (constructor_elt, v, NULL);
2104 elt->index = build_int_cst (sizetype, i);
2105 elt->value = build_int_cstu (byte_type_node, data[i]);
2108 DECL_INITIAL (array) = build_constructor (type, v);
2109 TREE_STATIC (array) = 1;
2110 DECL_ARTIFICIAL (array) = 1;
2111 DECL_IGNORED_P (array) = 1;
2112 TREE_READONLY (array) = 1;
2113 TREE_CONSTANT (DECL_INITIAL (array)) = 1;
2114 rest_of_decl_compilation (array, 1, 0);
2116 PUSH_FIELD_VALUE (cons, "reflection_data", build_address_of (array));
2118 free (data);
2119 TYPE_REFLECTION_DATA (current_class) = NULL;
2121 else
2122 PUSH_FIELD_VALUE (cons, "reflection_data", null_pointer_node);
2124 FINISH_RECORD_CONSTRUCTOR (cons);
2126 DECL_INITIAL (decl) = cons;
2128 /* Hash synchronization requires at least 64-bit alignment. */
2129 if (flag_hash_synchronization && POINTER_SIZE < 64)
2130 DECL_ALIGN (decl) = 64;
2132 if (flag_indirect_classes)
2134 TREE_READONLY (decl) = 1;
2135 TREE_CONSTANT (DECL_INITIAL (decl)) = 1;
2138 rest_of_decl_compilation (decl, 1, 0);
2141 tree classdollar_field = build_classdollar_field (type);
2142 if (!flag_indirect_classes)
2143 DECL_INITIAL (classdollar_field) = build_static_class_ref (type);
2144 rest_of_decl_compilation (classdollar_field, 1, 0);
2147 TYPE_OTABLE_DECL (type) = NULL_TREE;
2148 TYPE_ATABLE_DECL (type) = NULL_TREE;
2149 TYPE_CTABLE_DECL (type) = NULL_TREE;
2152 void
2153 finish_class (void)
2155 if (TYPE_VERIFY_METHOD (output_class))
2157 tree verify_method = TYPE_VERIFY_METHOD (output_class);
2158 DECL_SAVED_TREE (verify_method)
2159 = add_stmt_to_compound (DECL_SAVED_TREE (verify_method), void_type_node,
2160 build1 (RETURN_EXPR, void_type_node, NULL));
2161 java_genericize (verify_method);
2162 cgraph_finalize_function (verify_method, false);
2163 TYPE_ASSERTIONS (current_class) = NULL;
2166 java_expand_catch_classes (current_class);
2168 current_function_decl = NULL_TREE;
2169 TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (current_class)) = 0;
2170 make_class_data (current_class);
2171 register_class ();
2172 rest_of_decl_compilation (TYPE_NAME (current_class), 1, 0);
2175 /* Return 2 if CLASS is compiled by this compilation job;
2176 return 1 if CLASS can otherwise be assumed to be compiled;
2177 return 0 if we cannot assume that CLASS is compiled.
2178 Returns 1 for primitive and 0 for array types. */
2180 is_compiled_class (tree class)
2182 int seen_in_zip;
2183 if (TREE_CODE (class) == POINTER_TYPE)
2184 class = TREE_TYPE (class);
2185 if (TREE_CODE (class) != RECORD_TYPE) /* Primitive types are static. */
2186 return 1;
2187 if (TYPE_ARRAY_P (class))
2188 return 0;
2190 seen_in_zip = (TYPE_JCF (class) && JCF_SEEN_IN_ZIP (TYPE_JCF (class)));
2191 if (CLASS_FROM_CURRENTLY_COMPILED_P (class))
2193 /* The class was seen in the current ZIP file and will be
2194 available as a compiled class in the future but may not have
2195 been loaded already. Load it if necessary. This prevent
2196 build_class_ref () from crashing. */
2198 if (seen_in_zip && !CLASS_LOADED_P (class) && (class != current_class))
2199 load_class (class, 1);
2201 /* We return 2 for class seen in ZIP and class from files
2202 belonging to the same compilation unit */
2203 return 2;
2206 if (assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class)))))
2208 if (!CLASS_LOADED_P (class))
2210 if (CLASS_FROM_SOURCE_P (class))
2211 safe_layout_class (class);
2212 else if (class != current_class)
2213 load_class (class, 1);
2215 return 1;
2218 return 0;
2221 /* Build a VAR_DECL for the dispatch table (vtable) for class TYPE. */
2223 tree
2224 build_dtable_decl (tree type)
2226 tree dtype, decl;
2228 /* We need to build a new dtable type so that its size is uniquely
2229 computed when we're dealing with the class for real and not just
2230 faking it (like java.lang.Class during the initialization of the
2231 compiler.) We know we're not faking a class when CURRENT_CLASS is
2232 TYPE. */
2233 if (current_class == type)
2235 tree dummy = NULL_TREE;
2236 int n;
2238 dtype = make_node (RECORD_TYPE);
2240 PUSH_FIELD (dtype, dummy, "top_offset", ptr_type_node);
2241 PUSH_FIELD (dtype, dummy, "type_info", ptr_type_node);
2243 PUSH_FIELD (dtype, dummy, "class", class_ptr_type);
2244 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
2246 tree tmp_field = build_decl (FIELD_DECL, NULL_TREE, ptr_type_node);
2247 TREE_CHAIN (dummy) = tmp_field;
2248 DECL_CONTEXT (tmp_field) = dtype;
2249 DECL_ARTIFICIAL (tmp_field) = 1;
2250 dummy = tmp_field;
2253 PUSH_FIELD (dtype, dummy, "gc_descr", ptr_type_node);
2254 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
2256 tree tmp_field = build_decl (FIELD_DECL, NULL_TREE, ptr_type_node);
2257 TREE_CHAIN (dummy) = tmp_field;
2258 DECL_CONTEXT (tmp_field) = dtype;
2259 DECL_ARTIFICIAL (tmp_field) = 1;
2260 dummy = tmp_field;
2263 n = TREE_VEC_LENGTH (get_dispatch_vector (type));
2264 if (TARGET_VTABLE_USES_DESCRIPTORS)
2265 n *= TARGET_VTABLE_USES_DESCRIPTORS;
2267 PUSH_FIELD (dtype, dummy, "methods",
2268 build_prim_array_type (nativecode_ptr_type_node, n));
2269 layout_type (dtype);
2271 else
2272 dtype = dtable_type;
2274 decl = build_decl (VAR_DECL, get_identifier ("vt$"), dtype);
2275 DECL_CONTEXT (decl) = type;
2276 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
2277 DECL_VTABLE_P (decl) = 1;
2279 return decl;
2282 /* Pre-pend the TYPE_FIELDS of THIS_CLASS with a dummy FIELD_DECL for the
2283 fields inherited from SUPER_CLASS. */
2285 void
2286 push_super_field (tree this_class, tree super_class)
2288 tree base_decl;
2289 /* Don't insert the field if we're just re-laying the class out. */
2290 if (TYPE_FIELDS (this_class) && !DECL_NAME (TYPE_FIELDS (this_class)))
2291 return;
2292 base_decl = build_decl (FIELD_DECL, NULL_TREE, super_class);
2293 DECL_IGNORED_P (base_decl) = 1;
2294 TREE_CHAIN (base_decl) = TYPE_FIELDS (this_class);
2295 TYPE_FIELDS (this_class) = base_decl;
2296 DECL_SIZE (base_decl) = TYPE_SIZE (super_class);
2297 DECL_SIZE_UNIT (base_decl) = TYPE_SIZE_UNIT (super_class);
2300 /* Handle the different manners we may have to lay out a super class. */
2302 static tree
2303 maybe_layout_super_class (tree super_class, tree this_class ATTRIBUTE_UNUSED)
2305 if (!super_class)
2306 return NULL_TREE;
2307 else if (TREE_CODE (super_class) == RECORD_TYPE)
2309 if (!CLASS_LOADED_P (super_class) && CLASS_FROM_SOURCE_P (super_class))
2310 safe_layout_class (super_class);
2311 if (!CLASS_LOADED_P (super_class))
2312 load_class (super_class, 1);
2314 /* We might have to layout the class before its dependency on
2315 the super class gets resolved by java_complete_class */
2316 else if (TREE_CODE (super_class) == POINTER_TYPE)
2318 if (TREE_TYPE (super_class) != NULL_TREE)
2319 super_class = TREE_TYPE (super_class);
2320 else
2321 gcc_unreachable ();
2323 if (!TYPE_SIZE (super_class))
2324 safe_layout_class (super_class);
2326 return super_class;
2329 /* safe_layout_class just makes sure that we can load a class without
2330 disrupting the current_class, input_file, input_line, etc, information
2331 about the class processed currently. */
2333 void
2334 safe_layout_class (tree class)
2336 tree save_current_class = current_class;
2337 location_t save_location = input_location;
2339 layout_class (class);
2341 current_class = save_current_class;
2342 input_location = save_location;
2345 void
2346 layout_class (tree this_class)
2348 tree super_class = CLASSTYPE_SUPER (this_class);
2350 class_list = tree_cons (this_class, NULL_TREE, class_list);
2351 if (CLASS_BEING_LAIDOUT (this_class))
2353 char buffer [1024];
2354 char *report;
2355 tree current;
2357 sprintf (buffer, " with '%s'",
2358 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class))));
2359 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2361 for (current = TREE_CHAIN (class_list); current;
2362 current = TREE_CHAIN (current))
2364 tree decl = TYPE_NAME (TREE_PURPOSE (current));
2365 sprintf (buffer, "\n which inherits from '%s' (%s:%d)",
2366 IDENTIFIER_POINTER (DECL_NAME (decl)),
2367 DECL_SOURCE_FILE (decl),
2368 DECL_SOURCE_LINE (decl));
2369 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2371 obstack_1grow (&temporary_obstack, '\0');
2372 report = obstack_finish (&temporary_obstack);
2373 cyclic_inheritance_report = ggc_strdup (report);
2374 obstack_free (&temporary_obstack, report);
2375 TYPE_SIZE (this_class) = error_mark_node;
2376 return;
2378 CLASS_BEING_LAIDOUT (this_class) = 1;
2380 if (super_class && !CLASS_BEING_LAIDOUT (super_class))
2382 tree maybe_super_class
2383 = maybe_layout_super_class (super_class, this_class);
2384 if (maybe_super_class == NULL
2385 || TREE_CODE (TYPE_SIZE (maybe_super_class)) == ERROR_MARK)
2387 TYPE_SIZE (this_class) = error_mark_node;
2388 CLASS_BEING_LAIDOUT (this_class) = 0;
2389 class_list = TREE_CHAIN (class_list);
2390 return;
2392 if (TYPE_SIZE (this_class) == NULL_TREE)
2393 push_super_field (this_class, maybe_super_class);
2396 layout_type (this_class);
2398 /* Also recursively load/layout any superinterfaces, but only if
2399 class was loaded from bytecode. The source parser will take care
2400 of this itself. */
2401 if (!CLASS_FROM_SOURCE_P (this_class))
2403 int i;
2404 if (TYPE_BINFO (this_class))
2406 for (i = BINFO_N_BASE_BINFOS (TYPE_BINFO (this_class)) - 1; i > 0; i--)
2408 tree binfo = BINFO_BASE_BINFO (TYPE_BINFO (this_class), i);
2409 tree super_interface = BINFO_TYPE (binfo);
2410 tree maybe_super_interface
2411 = maybe_layout_super_class (super_interface, NULL_TREE);
2412 if (maybe_super_interface == NULL
2413 || TREE_CODE (TYPE_SIZE (maybe_super_interface)) == ERROR_MARK)
2415 TYPE_SIZE (this_class) = error_mark_node;
2416 CLASS_BEING_LAIDOUT (this_class) = 0;
2417 class_list = TREE_CHAIN (class_list);
2418 return;
2424 /* Convert the size back to an SI integer value. */
2425 TYPE_SIZE_UNIT (this_class) =
2426 fold (convert (int_type_node, TYPE_SIZE_UNIT (this_class)));
2428 CLASS_BEING_LAIDOUT (this_class) = 0;
2429 class_list = TREE_CHAIN (class_list);
2432 static void
2433 add_miranda_methods (tree base_class, tree search_class)
2435 int i;
2436 tree binfo, base_binfo;
2438 if (!CLASS_PARSED_P (search_class))
2439 load_class (search_class, 1);
2441 for (binfo = TYPE_BINFO (search_class), i = 1;
2442 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
2444 tree method_decl;
2445 tree elt = BINFO_TYPE (base_binfo);
2447 /* FIXME: This is totally bogus. We should not be handling
2448 Miranda methods at all if we're using the BC ABI. */
2449 if (TYPE_DUMMY (elt))
2450 continue;
2452 /* Ensure that interface methods are seen in declared order. */
2453 if (!CLASS_LOADED_P (elt))
2454 load_class (elt, 1);
2455 layout_class_methods (elt);
2457 /* All base classes will have been laid out at this point, so the order
2458 will be correct. This code must match similar layout code in the
2459 runtime. */
2460 for (method_decl = TYPE_METHODS (elt);
2461 method_decl; method_decl = TREE_CHAIN (method_decl))
2463 tree sig, override;
2465 /* An interface can have <clinit>. */
2466 if (ID_CLINIT_P (DECL_NAME (method_decl)))
2467 continue;
2469 sig = build_java_argument_signature (TREE_TYPE (method_decl));
2470 override = lookup_argument_method (base_class,
2471 DECL_NAME (method_decl), sig);
2472 if (override == NULL_TREE)
2474 /* Found a Miranda method. Add it. */
2475 tree new_method;
2476 sig = build_java_signature (TREE_TYPE (method_decl));
2477 new_method
2478 = add_method (base_class,
2479 get_access_flags_from_decl (method_decl),
2480 DECL_NAME (method_decl), sig);
2481 METHOD_INVISIBLE (new_method) = 1;
2485 /* Try superinterfaces. */
2486 add_miranda_methods (base_class, elt);
2490 void
2491 layout_class_methods (tree this_class)
2493 tree method_decl, dtable_count;
2494 tree super_class, type_name;
2496 if (TYPE_NVIRTUALS (this_class))
2497 return;
2499 super_class = CLASSTYPE_SUPER (this_class);
2501 if (super_class)
2503 super_class = maybe_layout_super_class (super_class, this_class);
2504 if (!TYPE_NVIRTUALS (super_class))
2505 layout_class_methods (super_class);
2506 dtable_count = TYPE_NVIRTUALS (super_class);
2508 else
2509 dtable_count = integer_zero_node;
2511 type_name = TYPE_NAME (this_class);
2512 if (!flag_indirect_dispatch
2513 && (CLASS_ABSTRACT (type_name) || CLASS_INTERFACE (type_name)))
2515 /* An abstract class can have methods which are declared only in
2516 an implemented interface. These are called "Miranda
2517 methods". We make a dummy method entry for such methods
2518 here. */
2519 add_miranda_methods (this_class, this_class);
2522 TYPE_METHODS (this_class) = nreverse (TYPE_METHODS (this_class));
2524 for (method_decl = TYPE_METHODS (this_class);
2525 method_decl; method_decl = TREE_CHAIN (method_decl))
2526 dtable_count = layout_class_method (this_class, super_class,
2527 method_decl, dtable_count);
2529 TYPE_NVIRTUALS (this_class) = dtable_count;
2532 /* Return the index of METHOD in INTERFACE. This index begins at 1
2533 and is used as an argument for _Jv_LookupInterfaceMethodIdx(). */
2535 get_interface_method_index (tree method, tree interface)
2537 tree meth;
2538 int i = 1;
2540 for (meth = TYPE_METHODS (interface); ; meth = TREE_CHAIN (meth))
2542 if (meth == method)
2543 return i;
2544 /* We don't want to put <clinit> into the interface table. */
2545 if (! ID_CLINIT_P (DECL_NAME (meth)))
2546 ++i;
2547 gcc_assert (meth != NULL_TREE);
2551 /* Lay METHOD_DECL out, returning a possibly new value of
2552 DTABLE_COUNT. Also mangle the method's name. */
2554 tree
2555 layout_class_method (tree this_class, tree super_class,
2556 tree method_decl, tree dtable_count)
2558 tree method_name = DECL_NAME (method_decl);
2560 TREE_PUBLIC (method_decl) = 1;
2562 /* Considered external unless it is being compiled into this object
2563 file, or it was already flagged as external. */
2564 if (!DECL_EXTERNAL (method_decl))
2565 DECL_EXTERNAL (method_decl) = ((is_compiled_class (this_class) != 2)
2566 || METHOD_NATIVE (method_decl));
2568 if (ID_INIT_P (method_name))
2570 const char *p = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class)));
2571 const char *ptr;
2572 for (ptr = p; *ptr; )
2574 if (*ptr++ == '.')
2575 p = ptr;
2577 DECL_CONSTRUCTOR_P (method_decl) = 1;
2578 build_java_signature (TREE_TYPE (method_decl));
2580 else if (! METHOD_STATIC (method_decl))
2582 tree method_sig =
2583 build_java_signature (TREE_TYPE (method_decl));
2584 bool method_override = false;
2585 tree super_method = lookup_java_method (super_class, method_name,
2586 method_sig);
2587 if (super_method != NULL_TREE
2588 && ! METHOD_DUMMY (super_method))
2590 method_override = true;
2591 if (! METHOD_PUBLIC (super_method) &&
2592 ! METHOD_PROTECTED (super_method))
2594 /* Don't override private method, or default-access method in
2595 another package. */
2596 if (METHOD_PRIVATE (super_method) ||
2597 ! in_same_package (TYPE_NAME (this_class),
2598 TYPE_NAME (super_class)))
2599 method_override = false;
2602 if (method_override)
2604 tree method_index = get_method_index (super_method);
2605 set_method_index (method_decl, method_index);
2606 if (method_index == NULL_TREE
2607 && ! flag_indirect_dispatch
2608 && !CLASS_FROM_SOURCE_P (this_class)
2609 && ! DECL_ARTIFICIAL (super_method))
2610 error ("non-static method %q+D overrides static method",
2611 method_decl);
2613 else if (this_class == object_type_node
2614 && (METHOD_FINAL (method_decl)
2615 || METHOD_PRIVATE (method_decl)))
2617 /* We don't generate vtable entries for final Object
2618 methods. This is simply to save space, since every
2619 object would otherwise have to define them. */
2621 else if (! METHOD_PRIVATE (method_decl)
2622 && dtable_count)
2624 /* We generate vtable entries for final methods because they
2625 may one day be changed to non-final. */
2626 set_method_index (method_decl, dtable_count);
2627 dtable_count = fold_build2 (PLUS_EXPR, integer_type_node,
2628 dtable_count, integer_one_node);
2632 return dtable_count;
2635 static void
2636 register_class (void)
2638 tree node;
2640 if (!registered_class)
2641 registered_class = VEC_alloc (tree, gc, 8);
2643 if (flag_indirect_classes)
2644 node = current_class;
2645 else
2646 node = TREE_OPERAND (build_class_ref (current_class), 0);
2647 VEC_safe_push (tree, gc, registered_class, node);
2650 /* Emit a function that calls _Jv_RegisterNewClasses with a list of
2651 all the classes we have emitted. */
2653 static void
2654 emit_indirect_register_classes (tree *list_p)
2656 tree klass, t, register_class_fn;
2657 int i;
2659 tree init = NULL_TREE;
2660 int size = VEC_length (tree, registered_class) * 2 + 1;
2661 tree class_array_type
2662 = build_prim_array_type (ptr_type_node, size);
2663 tree cdecl = build_decl (VAR_DECL, get_identifier ("_Jv_CLS"),
2664 class_array_type);
2665 tree reg_class_list;
2666 for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i)
2668 init = tree_cons (NULL_TREE,
2669 fold_convert (ptr_type_node,
2670 build_static_class_ref (klass)), init);
2671 init = tree_cons
2672 (NULL_TREE,
2673 fold_convert (ptr_type_node,
2674 build_address_of (build_classdollar_field (klass))),
2675 init);
2677 init = tree_cons (NULL_TREE, integer_zero_node, init);
2678 DECL_INITIAL (cdecl) = build_constructor_from_list (class_array_type,
2679 nreverse (init));
2680 TREE_CONSTANT (DECL_INITIAL (cdecl)) = 1;
2681 TREE_STATIC (cdecl) = 1;
2682 DECL_ARTIFICIAL (cdecl) = 1;
2683 DECL_IGNORED_P (cdecl) = 1;
2684 TREE_READONLY (cdecl) = 1;
2685 TREE_CONSTANT (cdecl) = 1;
2686 rest_of_decl_compilation (cdecl, 1, 0);
2687 reg_class_list = fold_convert (ptr_type_node, build_address_of (cdecl));
2689 t = build_function_type_list (void_type_node,
2690 build_pointer_type (ptr_type_node), NULL);
2691 t = build_decl (FUNCTION_DECL,
2692 get_identifier ("_Jv_RegisterNewClasses"), t);
2693 TREE_PUBLIC (t) = 1;
2694 DECL_EXTERNAL (t) = 1;
2695 register_class_fn = t;
2696 t = tree_cons (NULL, reg_class_list, NULL);
2697 t = build_function_call_expr (register_class_fn, t);
2698 append_to_statement_list (t, list_p);
2702 /* Emit something to register classes at start-up time.
2704 The preferred mechanism is through the .jcr section, which contain
2705 a list of pointers to classes which get registered during constructor
2706 invocation time.
2708 The fallback mechanism is to add statements to *LIST_P to call
2709 _Jv_RegisterClass for each class in this file. These statements will
2710 be added to a static constructor function for this translation unit. */
2712 void
2713 emit_register_classes (tree *list_p)
2715 if (registered_class == NULL)
2716 return;
2718 if (flag_indirect_classes)
2720 emit_indirect_register_classes (list_p);
2721 return;
2724 /* TARGET_USE_JCR_SECTION defaults to 1 if SUPPORTS_WEAK and
2725 TARGET_ASM_NAMED_SECTION, else 0. Some targets meet those conditions
2726 but lack suitable crtbegin/end objects or linker support. These
2727 targets can override the default in tm.h to use the fallback mechanism. */
2728 if (TARGET_USE_JCR_SECTION)
2730 tree klass, t;
2731 int i;
2733 #ifdef JCR_SECTION_NAME
2734 switch_to_section (get_section (JCR_SECTION_NAME, SECTION_WRITE, NULL));
2735 #else
2736 /* A target has defined TARGET_USE_JCR_SECTION,
2737 but doesn't have a JCR_SECTION_NAME. */
2738 gcc_unreachable ();
2739 #endif
2740 assemble_align (POINTER_SIZE);
2742 for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i)
2744 t = build_fold_addr_expr (klass);
2745 output_constant (t, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE);
2748 else
2750 tree klass, t, register_class_fn;
2751 int i;
2753 t = build_function_type_list (void_type_node, class_ptr_type, NULL);
2754 t = build_decl (FUNCTION_DECL, get_identifier ("_Jv_RegisterClass"), t);
2755 TREE_PUBLIC (t) = 1;
2756 DECL_EXTERNAL (t) = 1;
2757 register_class_fn = t;
2759 for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i)
2761 t = build_fold_addr_expr (klass);
2762 t = tree_cons (NULL, t, NULL);
2763 t = build_function_call_expr (register_class_fn, t);
2764 append_to_statement_list (t, list_p);
2769 /* Make a symbol_type (_Jv_MethodSymbol) node for DECL. */
2771 static tree
2772 build_symbol_entry (tree decl, tree special)
2774 tree clname, name, signature, sym;
2775 clname = build_utf8_ref (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))));
2776 /* ??? Constructors are given the name foo.foo all the way through
2777 the compiler, but in the method table they're all renamed
2778 foo.<init>. So, we have to do the same here unless we want an
2779 unresolved reference at runtime. */
2780 name = build_utf8_ref ((TREE_CODE (decl) == FUNCTION_DECL
2781 && DECL_CONSTRUCTOR_P (decl))
2782 ? init_identifier_node
2783 : DECL_NAME (decl));
2784 signature = build_java_signature (TREE_TYPE (decl));
2785 signature = build_utf8_ref (unmangle_classname
2786 (IDENTIFIER_POINTER (signature),
2787 IDENTIFIER_LENGTH (signature)));
2788 /* SPECIAL is either NULL_TREE or integer_one_node. We emit
2789 signature addr+1 if SPECIAL, and this indicates to the runtime
2790 system that this is a "special" symbol, i.e. one that should
2791 bypass access controls. */
2792 if (special != NULL_TREE)
2793 signature = build2 (PLUS_EXPR, TREE_TYPE (signature), signature, special);
2795 START_RECORD_CONSTRUCTOR (sym, symbol_type);
2796 PUSH_FIELD_VALUE (sym, "clname", clname);
2797 PUSH_FIELD_VALUE (sym, "name", name);
2798 PUSH_FIELD_VALUE (sym, "signature", signature);
2799 FINISH_RECORD_CONSTRUCTOR (sym);
2800 TREE_CONSTANT (sym) = 1;
2801 TREE_INVARIANT (sym) = 1;
2803 return sym;
2806 /* Emit a symbol table: used by -findirect-dispatch. */
2808 tree
2809 emit_symbol_table (tree name, tree the_table, tree decl_list,
2810 tree the_syms_decl, tree the_array_element_type,
2811 int element_size)
2813 tree method_list, method, table, list, null_symbol;
2814 tree table_size, the_array_type;
2815 int index;
2817 /* Only emit a table if this translation unit actually made any
2818 references via it. */
2819 if (decl_list == NULL_TREE)
2820 return the_table;
2822 /* Build a list of _Jv_MethodSymbols for each entry in otable_methods. */
2823 index = 0;
2824 method_list = decl_list;
2825 list = NULL_TREE;
2826 while (method_list != NULL_TREE)
2828 tree special = TREE_PURPOSE (method_list);
2829 method = TREE_VALUE (method_list);
2830 list = tree_cons (NULL_TREE, build_symbol_entry (method, special), list);
2831 method_list = TREE_CHAIN (method_list);
2832 index++;
2835 /* Terminate the list with a "null" entry. */
2836 START_RECORD_CONSTRUCTOR (null_symbol, symbol_type);
2837 PUSH_FIELD_VALUE (null_symbol, "clname", null_pointer_node);
2838 PUSH_FIELD_VALUE (null_symbol, "name", null_pointer_node);
2839 PUSH_FIELD_VALUE (null_symbol, "signature", null_pointer_node);
2840 FINISH_RECORD_CONSTRUCTOR (null_symbol);
2841 TREE_CONSTANT (null_symbol) = 1;
2842 TREE_INVARIANT (null_symbol) = 1;
2843 list = tree_cons (NULL_TREE, null_symbol, list);
2845 /* Put the list in the right order and make it a constructor. */
2846 list = nreverse (list);
2847 table = build_constructor_from_list (symbols_array_type, list);
2849 /* Make it the initial value for otable_syms and emit the decl. */
2850 DECL_INITIAL (the_syms_decl) = table;
2851 DECL_ARTIFICIAL (the_syms_decl) = 1;
2852 DECL_IGNORED_P (the_syms_decl) = 1;
2853 rest_of_decl_compilation (the_syms_decl, 1, 0);
2855 /* Now that its size is known, redefine the table as an
2856 uninitialized static array of INDEX + 1 elements. The extra entry
2857 is used by the runtime to track whether the table has been
2858 initialized. */
2859 table_size
2860 = build_index_type (build_int_cst (NULL_TREE, index * element_size + 1));
2861 the_array_type = build_array_type (the_array_element_type, table_size);
2862 the_table = build_decl (VAR_DECL, name, the_array_type);
2863 TREE_STATIC (the_table) = 1;
2864 TREE_READONLY (the_table) = 1;
2865 rest_of_decl_compilation (the_table, 1, 0);
2867 return the_table;
2870 /* Make an entry for the catch_classes list. */
2871 tree
2872 make_catch_class_record (tree catch_class, tree classname)
2874 tree entry;
2875 tree type = TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (output_class)));
2876 START_RECORD_CONSTRUCTOR (entry, type);
2877 PUSH_FIELD_VALUE (entry, "address", catch_class);
2878 PUSH_FIELD_VALUE (entry, "classname", classname);
2879 FINISH_RECORD_CONSTRUCTOR (entry);
2880 return entry;
2884 /* Generate the list of Throwable classes that are caught by exception
2885 handlers in this class. */
2886 tree
2887 emit_catch_table (tree this_class)
2889 tree table, table_size, array_type;
2890 TYPE_CATCH_CLASSES (this_class) =
2891 tree_cons (NULL,
2892 make_catch_class_record (null_pointer_node, null_pointer_node),
2893 TYPE_CATCH_CLASSES (this_class));
2894 TYPE_CATCH_CLASSES (this_class) = nreverse (TYPE_CATCH_CLASSES (this_class));
2895 TYPE_CATCH_CLASSES (this_class) =
2896 tree_cons (NULL,
2897 make_catch_class_record (null_pointer_node, null_pointer_node),
2898 TYPE_CATCH_CLASSES (this_class));
2899 table_size = build_index_type
2900 (build_int_cst (NULL_TREE,
2901 list_length (TYPE_CATCH_CLASSES (this_class))));
2902 array_type
2903 = build_array_type (TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (this_class))),
2904 table_size);
2905 table =
2906 build_decl (VAR_DECL, DECL_NAME (TYPE_CTABLE_DECL (this_class)), array_type);
2907 DECL_INITIAL (table) =
2908 build_constructor_from_list (array_type, TYPE_CATCH_CLASSES (this_class));
2909 TREE_STATIC (table) = 1;
2910 TREE_READONLY (table) = 1;
2911 DECL_IGNORED_P (table) = 1;
2912 rest_of_decl_compilation (table, 1, 0);
2913 return table;
2916 /* Given a type, return the signature used by
2917 _Jv_FindClassFromSignature() in libgcj. This isn't exactly the
2918 same as build_java_signature() because we want the canonical array
2919 type. */
2921 static tree
2922 build_signature_for_libgcj (tree type)
2924 tree sig, ref;
2926 sig = build_java_signature (type);
2927 ref = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
2928 IDENTIFIER_LENGTH (sig)));
2929 return ref;
2932 /* Add an entry to the type assertion table. Callback used during hashtable
2933 traversal. */
2935 static int
2936 add_assertion_table_entry (void **htab_entry, void *ptr)
2938 tree entry;
2939 tree code_val, op1_utf8, op2_utf8;
2940 tree *list = (tree *) ptr;
2941 type_assertion *as = (type_assertion *) *htab_entry;
2943 code_val = build_int_cst (NULL_TREE, as->assertion_code);
2945 if (as->op1 == NULL_TREE)
2946 op1_utf8 = null_pointer_node;
2947 else
2948 op1_utf8 = build_signature_for_libgcj (as->op1);
2950 if (as->op2 == NULL_TREE)
2951 op2_utf8 = null_pointer_node;
2952 else
2953 op2_utf8 = build_signature_for_libgcj (as->op2);
2955 START_RECORD_CONSTRUCTOR (entry, assertion_entry_type);
2956 PUSH_FIELD_VALUE (entry, "assertion_code", code_val);
2957 PUSH_FIELD_VALUE (entry, "op1", op1_utf8);
2958 PUSH_FIELD_VALUE (entry, "op2", op2_utf8);
2959 FINISH_RECORD_CONSTRUCTOR (entry);
2961 *list = tree_cons (NULL_TREE, entry, *list);
2962 return true;
2965 /* Generate the type assertion table for CLASS, and return its DECL. */
2967 static tree
2968 emit_assertion_table (tree class)
2970 tree null_entry, ctor, table_decl;
2971 tree list = NULL_TREE;
2972 htab_t assertions_htab = TYPE_ASSERTIONS (class);
2974 /* Iterate through the hash table. */
2975 htab_traverse (assertions_htab, add_assertion_table_entry, &list);
2977 /* Finish with a null entry. */
2978 START_RECORD_CONSTRUCTOR (null_entry, assertion_entry_type);
2979 PUSH_FIELD_VALUE (null_entry, "assertion_code", integer_zero_node);
2980 PUSH_FIELD_VALUE (null_entry, "op1", null_pointer_node);
2981 PUSH_FIELD_VALUE (null_entry, "op2", null_pointer_node);
2982 FINISH_RECORD_CONSTRUCTOR (null_entry);
2984 list = tree_cons (NULL_TREE, null_entry, list);
2986 /* Put the list in the right order and make it a constructor. */
2987 list = nreverse (list);
2988 ctor = build_constructor_from_list (assertion_table_type, list);
2990 table_decl = build_decl (VAR_DECL, mangled_classname ("_type_assert_", class),
2991 assertion_table_type);
2993 TREE_STATIC (table_decl) = 1;
2994 TREE_READONLY (table_decl) = 1;
2995 TREE_CONSTANT (table_decl) = 1;
2996 DECL_IGNORED_P (table_decl) = 1;
2998 DECL_INITIAL (table_decl) = ctor;
2999 DECL_ARTIFICIAL (table_decl) = 1;
3000 rest_of_decl_compilation (table_decl, 1, 0);
3002 return table_decl;
3005 void
3006 init_class_processing (void)
3008 fields_ident = get_identifier ("fields");
3009 info_ident = get_identifier ("info");
3011 gcc_obstack_init (&temporary_obstack);
3014 static hashval_t java_treetreehash_hash (const void *);
3015 static int java_treetreehash_compare (const void *, const void *);
3017 /* A hash table mapping trees to trees. Used generally. */
3019 #define JAVA_TREEHASHHASH_H(t) (htab_hash_pointer (t))
3021 static hashval_t
3022 java_treetreehash_hash (const void *k_p)
3024 struct treetreehash_entry *k = (struct treetreehash_entry *) k_p;
3025 return JAVA_TREEHASHHASH_H (k->key);
3028 static int
3029 java_treetreehash_compare (const void * k1_p, const void * k2_p)
3031 struct treetreehash_entry * k1 = (struct treetreehash_entry *) k1_p;
3032 tree k2 = (tree) k2_p;
3033 return (k1->key == k2);
3036 tree
3037 java_treetreehash_find (htab_t ht, tree t)
3039 struct treetreehash_entry *e;
3040 hashval_t hv = JAVA_TREEHASHHASH_H (t);
3041 e = htab_find_with_hash (ht, t, hv);
3042 if (e == NULL)
3043 return NULL;
3044 else
3045 return e->value;
3048 tree *
3049 java_treetreehash_new (htab_t ht, tree t)
3051 void **e;
3052 struct treetreehash_entry *tthe;
3053 hashval_t hv = JAVA_TREEHASHHASH_H (t);
3055 e = htab_find_slot_with_hash (ht, t, hv, INSERT);
3056 if (*e == NULL)
3058 tthe = (*ht->alloc_f) (1, sizeof (*tthe));
3059 tthe->key = t;
3060 *e = tthe;
3062 else
3063 tthe = (struct treetreehash_entry *) *e;
3064 return &tthe->value;
3067 htab_t
3068 java_treetreehash_create (size_t size, int gc)
3070 if (gc)
3071 return htab_create_ggc (size, java_treetreehash_hash,
3072 java_treetreehash_compare, NULL);
3073 else
3074 return htab_create_alloc (size, java_treetreehash_hash,
3075 java_treetreehash_compare, free, xcalloc, free);
3078 /* Break down qualified IDENTIFIER into package and class-name components.
3079 For example, given SOURCE "pkg.foo.Bar", LEFT will be set to
3080 "pkg.foo", and RIGHT to "Bar". */
3083 split_qualified_name (tree *left, tree *right, tree source)
3085 char *p, *base;
3086 int l = IDENTIFIER_LENGTH (source);
3088 base = alloca (l + 1);
3089 memcpy (base, IDENTIFIER_POINTER (source), l + 1);
3091 /* Breakdown NAME into REMAINDER . IDENTIFIER. */
3092 p = base + l - 1;
3093 while (*p != '.' && p != base)
3094 p--;
3096 /* We didn't find a '.'. Return an error. */
3097 if (p == base)
3098 return 1;
3100 *p = '\0';
3101 if (right)
3102 *right = get_identifier (p+1);
3103 *left = get_identifier (base);
3105 return 0;
3108 /* Given two classes (TYPE_DECL) or class names (IDENTIFIER), return TRUE
3109 if the classes are from the same package. */
3112 in_same_package (tree name1, tree name2)
3114 tree tmp;
3115 tree pkg1;
3116 tree pkg2;
3118 if (TREE_CODE (name1) == TYPE_DECL)
3119 name1 = DECL_NAME (name1);
3120 if (TREE_CODE (name2) == TYPE_DECL)
3121 name2 = DECL_NAME (name2);
3123 if (QUALIFIED_P (name1) != QUALIFIED_P (name2))
3124 /* One in empty package. */
3125 return 0;
3127 if (QUALIFIED_P (name1) == 0 && QUALIFIED_P (name2) == 0)
3128 /* Both in empty package. */
3129 return 1;
3131 split_qualified_name (&pkg1, &tmp, name1);
3132 split_qualified_name (&pkg2, &tmp, name2);
3134 return (pkg1 == pkg2);
3137 #include "gt-java-class.h"