2007-02-15 Sandra Loosemore <sandra@codesourcery.com>
[official-gcc.git] / gcc / java / class.c
blob85cdeb49e1e4d793ab5fe90cbeb6b123d75df6c5
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 = build_call_expr (soft_initclass_node, 1,
1043 this_classdollar);
1044 java_add_stmt (init);
1048 /* Remove the reference to the local variable that holds the current
1049 class$. */
1051 void
1052 uncache_this_class_ref (tree fndecl ATTRIBUTE_UNUSED)
1054 this_classdollar = build_classdollar_field (output_class);
1057 /* Build a reference to the class TYPE.
1058 Also handles primitive types and array types. */
1060 tree
1061 build_class_ref (tree type)
1063 int is_compiled = is_compiled_class (type);
1064 if (is_compiled)
1066 tree ref, decl;
1067 if (TREE_CODE (type) == POINTER_TYPE)
1068 type = TREE_TYPE (type);
1070 if (flag_indirect_dispatch
1071 && type != output_class
1072 && TREE_CODE (type) == RECORD_TYPE)
1073 return build_indirect_class_ref (type);
1075 if (type == output_class && flag_indirect_classes)
1076 return this_classdollar;
1078 if (TREE_CODE (type) == RECORD_TYPE)
1079 return build_static_class_ref (type);
1080 else
1082 const char *name;
1083 tree decl_name;
1084 char buffer[25];
1085 decl_name = TYPE_NAME (type);
1086 if (TREE_CODE (decl_name) == TYPE_DECL)
1087 decl_name = DECL_NAME (decl_name);
1088 name = IDENTIFIER_POINTER (decl_name);
1089 if (strncmp (name, "promoted_", 9) == 0)
1090 name += 9;
1091 sprintf (buffer, "_Jv_%sClass", name);
1092 decl_name = get_identifier (buffer);
1093 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1094 if (decl == NULL_TREE)
1096 decl = build_decl (VAR_DECL, decl_name, class_type_node);
1097 TREE_STATIC (decl) = 1;
1098 TREE_PUBLIC (decl) = 1;
1099 DECL_EXTERNAL (decl) = 1;
1100 DECL_ARTIFICIAL (decl) = 1;
1101 pushdecl_top_level (decl);
1105 ref = build1 (ADDR_EXPR, class_ptr_type, decl);
1106 return ref;
1108 else
1109 return build_indirect_class_ref (type);
1112 /* Create a local statically allocated variable that will hold a
1113 pointer to a static field. */
1115 static tree
1116 build_fieldref_cache_entry (int index, tree fdecl ATTRIBUTE_UNUSED)
1118 tree decl, decl_name;
1119 const char *name = IDENTIFIER_POINTER (mangled_classname ("_cpool_", output_class));
1120 char *buf = alloca (strlen (name) + 20);
1121 sprintf (buf, "%s_%d_ref", name, index);
1122 decl_name = get_identifier (buf);
1123 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1124 if (decl == NULL_TREE)
1126 decl = build_decl (VAR_DECL, decl_name, ptr_type_node);
1127 TREE_STATIC (decl) = 1;
1128 TREE_PUBLIC (decl) = 0;
1129 DECL_EXTERNAL (decl) = 0;
1130 DECL_ARTIFICIAL (decl) = 1;
1131 DECL_IGNORED_P (decl) = 1;
1132 pushdecl_top_level (decl);
1134 return decl;
1137 tree
1138 build_static_field_ref (tree fdecl)
1140 tree fclass = DECL_CONTEXT (fdecl);
1141 int is_compiled = is_compiled_class (fclass);
1142 int from_class = ! CLASS_FROM_SOURCE_P (current_class);
1144 /* Allow static final fields to fold to a constant. When using
1145 -findirect-dispatch, we simply never do this folding if compiling
1146 from .class; in the .class file constants will be referred to via
1147 the constant pool. */
1148 if ((!flag_indirect_dispatch || !from_class)
1149 && (is_compiled
1150 || (FIELD_FINAL (fdecl) && DECL_INITIAL (fdecl) != NULL_TREE
1151 && (JSTRING_TYPE_P (TREE_TYPE (fdecl))
1152 || JNUMERIC_TYPE_P (TREE_TYPE (fdecl)))
1153 && TREE_CONSTANT (DECL_INITIAL (fdecl)))))
1155 if (is_compiled == 1)
1156 DECL_EXTERNAL (fdecl) = 1;
1158 else
1160 /* Generate a CONSTANT_FieldRef for FDECL in the constant pool
1161 and a class local static variable CACHE_ENTRY, then
1163 *(fdecl **)((__builtin_expect (cache_entry == null, false))
1164 ? cache_entry = _Jv_ResolvePoolEntry (output_class, cpool_index)
1165 : cache_entry)
1167 This can mostly be optimized away, so that the usual path is a
1168 load followed by a test and branch. _Jv_ResolvePoolEntry is
1169 only called once for each constant pool entry.
1171 There is an optimization that we don't do: at the start of a
1172 method, create a local copy of CACHE_ENTRY and use that instead.
1176 int cpool_index = alloc_constant_fieldref (output_class, fdecl);
1177 tree cache_entry = build_fieldref_cache_entry (cpool_index, fdecl);
1178 tree test
1179 = build_call_expr (built_in_decls[BUILT_IN_EXPECT], 2,
1180 build2 (EQ_EXPR, boolean_type_node,
1181 cache_entry, null_pointer_node),
1182 boolean_false_node);
1183 tree cpool_index_cst = build_int_cst (NULL_TREE, cpool_index);
1184 tree init
1185 = build_call_expr (soft_resolvepoolentry_node, 2,
1186 build_class_ref (output_class),
1187 cpool_index_cst);
1188 init = build2 (MODIFY_EXPR, ptr_type_node, cache_entry, init);
1189 init = build3 (COND_EXPR, ptr_type_node, test, init, cache_entry);
1190 init = fold_convert (build_pointer_type (TREE_TYPE (fdecl)), init);
1191 fdecl = build1 (INDIRECT_REF, TREE_TYPE (fdecl), init);
1193 return fdecl;
1197 get_access_flags_from_decl (tree decl)
1199 int access_flags = 0;
1200 if (TREE_CODE (decl) == FIELD_DECL || TREE_CODE (decl) == VAR_DECL)
1202 if (FIELD_STATIC (decl))
1203 access_flags |= ACC_STATIC;
1204 if (FIELD_PUBLIC (decl))
1205 access_flags |= ACC_PUBLIC;
1206 if (FIELD_PROTECTED (decl))
1207 access_flags |= ACC_PROTECTED;
1208 if (FIELD_PRIVATE (decl))
1209 access_flags |= ACC_PRIVATE;
1210 if (FIELD_FINAL (decl))
1211 access_flags |= ACC_FINAL;
1212 if (FIELD_VOLATILE (decl))
1213 access_flags |= ACC_VOLATILE;
1214 if (FIELD_TRANSIENT (decl))
1215 access_flags |= ACC_TRANSIENT;
1216 if (FIELD_ENUM (decl))
1217 access_flags |= ACC_ENUM;
1218 if (FIELD_SYNTHETIC (decl))
1219 access_flags |= ACC_SYNTHETIC;
1220 return access_flags;
1222 if (TREE_CODE (decl) == TYPE_DECL)
1224 if (CLASS_PUBLIC (decl))
1225 access_flags |= ACC_PUBLIC;
1226 if (CLASS_FINAL (decl))
1227 access_flags |= ACC_FINAL;
1228 if (CLASS_SUPER (decl))
1229 access_flags |= ACC_SUPER;
1230 if (CLASS_INTERFACE (decl))
1231 access_flags |= ACC_INTERFACE;
1232 if (CLASS_ABSTRACT (decl))
1233 access_flags |= ACC_ABSTRACT;
1234 if (CLASS_STATIC (decl))
1235 access_flags |= ACC_STATIC;
1236 if (CLASS_PRIVATE (decl))
1237 access_flags |= ACC_PRIVATE;
1238 if (CLASS_PROTECTED (decl))
1239 access_flags |= ACC_PROTECTED;
1240 if (CLASS_STRICTFP (decl))
1241 access_flags |= ACC_STRICT;
1242 if (CLASS_ENUM (decl))
1243 access_flags |= ACC_ENUM;
1244 if (CLASS_SYNTHETIC (decl))
1245 access_flags |= ACC_SYNTHETIC;
1246 if (CLASS_ANNOTATION (decl))
1247 access_flags |= ACC_ANNOTATION;
1248 return access_flags;
1250 if (TREE_CODE (decl) == FUNCTION_DECL)
1252 if (METHOD_PUBLIC (decl))
1253 access_flags |= ACC_PUBLIC;
1254 if (METHOD_PRIVATE (decl))
1255 access_flags |= ACC_PRIVATE;
1256 if (METHOD_PROTECTED (decl))
1257 access_flags |= ACC_PROTECTED;
1258 if (METHOD_STATIC (decl))
1259 access_flags |= ACC_STATIC;
1260 if (METHOD_FINAL (decl))
1261 access_flags |= ACC_FINAL;
1262 if (METHOD_SYNCHRONIZED (decl))
1263 access_flags |= ACC_SYNCHRONIZED;
1264 if (METHOD_NATIVE (decl))
1265 access_flags |= ACC_NATIVE;
1266 if (METHOD_ABSTRACT (decl))
1267 access_flags |= ACC_ABSTRACT;
1268 if (METHOD_STRICTFP (decl))
1269 access_flags |= ACC_STRICT;
1270 if (METHOD_INVISIBLE (decl))
1271 access_flags |= ACC_INVISIBLE;
1272 if (DECL_ARTIFICIAL (decl))
1273 access_flags |= ACC_SYNTHETIC;
1274 if (METHOD_BRIDGE (decl))
1275 access_flags |= ACC_BRIDGE;
1276 if (METHOD_VARARGS (decl))
1277 access_flags |= ACC_VARARGS;
1278 return access_flags;
1280 gcc_unreachable ();
1283 static GTY (()) int alias_labelno = 0;
1285 /* Create a private alias for METHOD. Using this alias instead of the method
1286 decl ensures that ncode entries in the method table point to the real function
1287 at runtime, not a PLT entry. */
1289 static tree
1290 make_local_function_alias (tree method)
1292 #ifdef ASM_OUTPUT_DEF
1293 tree alias;
1295 const char *method_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (method));
1296 char *name = alloca (strlen (method_name) + 2);
1297 char *buf = alloca (strlen (method_name) + 128);
1299 /* Only create aliases for local functions. */
1300 if (DECL_EXTERNAL (method))
1301 return method;
1303 /* Prefix method_name with 'L' for the alias label. */
1304 *name = 'L';
1305 strcpy (name + 1, method_name);
1307 ASM_GENERATE_INTERNAL_LABEL (buf, name, alias_labelno++);
1308 alias = build_decl (FUNCTION_DECL, get_identifier (buf),
1309 TREE_TYPE (method));
1310 DECL_CONTEXT (alias) = NULL;
1311 TREE_READONLY (alias) = TREE_READONLY (method);
1312 TREE_THIS_VOLATILE (alias) = TREE_THIS_VOLATILE (method);
1313 TREE_PUBLIC (alias) = 0;
1314 DECL_EXTERNAL (alias) = 0;
1315 DECL_ARTIFICIAL (alias) = 1;
1316 DECL_INLINE (alias) = 0;
1317 DECL_INITIAL (alias) = error_mark_node;
1318 TREE_ADDRESSABLE (alias) = 1;
1319 TREE_USED (alias) = 1;
1320 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias)) = 1;
1321 if (!flag_syntax_only)
1322 assemble_alias (alias, DECL_ASSEMBLER_NAME (method));
1323 return alias;
1324 #else
1325 return method;
1326 #endif
1329 /** Make reflection data (_Jv_Field) for field FDECL. */
1331 static tree
1332 make_field_value (tree fdecl)
1334 tree finit;
1335 int flags;
1336 tree type = TREE_TYPE (fdecl);
1337 int resolved = is_compiled_class (type) && ! flag_indirect_dispatch;
1339 START_RECORD_CONSTRUCTOR (finit, field_type_node);
1340 PUSH_FIELD_VALUE (finit, "name", build_utf8_ref (DECL_NAME (fdecl)));
1341 if (resolved)
1342 type = build_class_ref (type);
1343 else
1345 tree signature = build_java_signature (type);
1347 type = build_utf8_ref (unmangle_classname
1348 (IDENTIFIER_POINTER (signature),
1349 IDENTIFIER_LENGTH (signature)));
1351 PUSH_FIELD_VALUE (finit, "type", type);
1353 flags = get_access_flags_from_decl (fdecl);
1354 if (! resolved)
1355 flags |= 0x8000 /* FIELD_UNRESOLVED_FLAG */;
1357 PUSH_FIELD_VALUE (finit, "accflags", build_int_cst (NULL_TREE, flags));
1358 PUSH_FIELD_VALUE (finit, "bsize", TYPE_SIZE_UNIT (TREE_TYPE (fdecl)));
1361 tree field_address = integer_zero_node;
1362 if ((DECL_INITIAL (fdecl) || ! flag_indirect_classes)
1363 && FIELD_STATIC (fdecl))
1364 field_address = build_address_of (fdecl);
1366 PUSH_FIELD_VALUE
1367 (finit, "info",
1368 build_constructor_from_list (field_info_union_node,
1369 build_tree_list
1370 ((FIELD_STATIC (fdecl)
1371 ? TREE_CHAIN (TYPE_FIELDS (field_info_union_node))
1372 : TYPE_FIELDS (field_info_union_node)),
1373 (FIELD_STATIC (fdecl)
1374 ? field_address
1375 : byte_position (fdecl)))));
1378 FINISH_RECORD_CONSTRUCTOR (finit);
1379 return finit;
1382 /** Make reflection data (_Jv_Method) for method MDECL. */
1384 static tree
1385 make_method_value (tree mdecl)
1387 static int method_name_count = 0;
1388 tree minit;
1389 tree index;
1390 tree code;
1391 tree class_decl;
1392 #define ACC_TRANSLATED 0x4000
1393 int accflags = get_access_flags_from_decl (mdecl) | ACC_TRANSLATED;
1395 class_decl = DECL_CONTEXT (mdecl);
1396 /* For interfaces, the index field contains the dispatch index. */
1397 if (CLASS_INTERFACE (TYPE_NAME (class_decl)))
1398 index = build_int_cst (NULL_TREE,
1399 get_interface_method_index (mdecl, class_decl));
1400 else if (!flag_indirect_dispatch && get_method_index (mdecl) != NULL_TREE)
1401 index = get_method_index (mdecl);
1402 else
1403 index = integer_minus_one_node;
1405 code = null_pointer_node;
1406 if (METHOD_ABSTRACT (mdecl))
1407 code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
1408 soft_abstractmethod_node);
1409 else
1410 code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
1411 make_local_function_alias (mdecl));
1412 START_RECORD_CONSTRUCTOR (minit, method_type_node);
1413 PUSH_FIELD_VALUE (minit, "name",
1414 build_utf8_ref (DECL_CONSTRUCTOR_P (mdecl) ?
1415 init_identifier_node
1416 : DECL_NAME (mdecl)));
1418 tree signature = build_java_signature (TREE_TYPE (mdecl));
1419 PUSH_FIELD_VALUE (minit, "signature",
1420 (build_utf8_ref
1421 (unmangle_classname
1422 (IDENTIFIER_POINTER(signature),
1423 IDENTIFIER_LENGTH(signature)))));
1425 PUSH_FIELD_VALUE (minit, "accflags", build_int_cst (NULL_TREE, accflags));
1426 PUSH_FIELD_VALUE (minit, "index", index);
1427 PUSH_FIELD_VALUE (minit, "ncode", code);
1430 /* Compute the `throws' information for the method. */
1431 tree table = null_pointer_node;
1432 if (DECL_FUNCTION_THROWS (mdecl) != NULL_TREE)
1434 int length = 1 + list_length (DECL_FUNCTION_THROWS (mdecl));
1435 tree iter, type, array;
1436 char buf[60];
1438 table = tree_cons (NULL_TREE, table, NULL_TREE);
1439 for (iter = DECL_FUNCTION_THROWS (mdecl);
1440 iter != NULL_TREE;
1441 iter = TREE_CHAIN (iter))
1443 tree sig = DECL_NAME (TYPE_NAME (TREE_VALUE (iter)));
1444 tree utf8
1445 = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
1446 IDENTIFIER_LENGTH (sig)));
1447 table = tree_cons (NULL_TREE, utf8, table);
1449 type = build_prim_array_type (ptr_type_node, length);
1450 table = build_constructor_from_list (type, table);
1451 /* Compute something unique enough. */
1452 sprintf (buf, "_methods%d", method_name_count++);
1453 array = build_decl (VAR_DECL, get_identifier (buf), type);
1454 DECL_INITIAL (array) = table;
1455 TREE_STATIC (array) = 1;
1456 DECL_ARTIFICIAL (array) = 1;
1457 DECL_IGNORED_P (array) = 1;
1458 rest_of_decl_compilation (array, 1, 0);
1460 table = build1 (ADDR_EXPR, ptr_type_node, array);
1463 PUSH_FIELD_VALUE (minit, "throws", table);
1466 FINISH_RECORD_CONSTRUCTOR (minit);
1467 return minit;
1470 static tree
1471 get_dispatch_vector (tree type)
1473 tree vtable = TYPE_VTABLE (type);
1475 if (vtable == NULL_TREE)
1477 HOST_WIDE_INT i;
1478 tree method;
1479 tree super = CLASSTYPE_SUPER (type);
1480 HOST_WIDE_INT nvirtuals = tree_low_cst (TYPE_NVIRTUALS (type), 0);
1481 vtable = make_tree_vec (nvirtuals);
1482 TYPE_VTABLE (type) = vtable;
1483 if (super != NULL_TREE)
1485 tree super_vtable = get_dispatch_vector (super);
1487 for (i = tree_low_cst (TYPE_NVIRTUALS (super), 0); --i >= 0; )
1488 TREE_VEC_ELT (vtable, i) = TREE_VEC_ELT (super_vtable, i);
1491 for (method = TYPE_METHODS (type); method != NULL_TREE;
1492 method = TREE_CHAIN (method))
1494 tree method_index = get_method_index (method);
1495 if (method_index != NULL_TREE
1496 && host_integerp (method_index, 0))
1497 TREE_VEC_ELT (vtable, tree_low_cst (method_index, 0)) = method;
1501 return vtable;
1504 static tree
1505 get_dispatch_table (tree type, tree this_class_addr)
1507 int abstract_p = CLASS_ABSTRACT (TYPE_NAME (type));
1508 tree vtable = get_dispatch_vector (type);
1509 int i, j;
1510 tree list = NULL_TREE;
1511 int nvirtuals = TREE_VEC_LENGTH (vtable);
1512 int arraysize;
1513 tree gc_descr;
1515 for (i = nvirtuals; --i >= 0; )
1517 tree method = TREE_VEC_ELT (vtable, i);
1518 if (METHOD_ABSTRACT (method))
1520 if (! abstract_p)
1521 warning (0, "%Jabstract method in non-abstract class", method);
1523 if (TARGET_VTABLE_USES_DESCRIPTORS)
1524 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1525 list = tree_cons (NULL_TREE, null_pointer_node, list);
1526 else
1527 list = tree_cons (NULL_TREE, null_pointer_node, list);
1529 else
1531 if (TARGET_VTABLE_USES_DESCRIPTORS)
1532 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1534 tree fdesc = build2 (FDESC_EXPR, nativecode_ptr_type_node,
1535 method, build_int_cst (NULL_TREE, j));
1536 TREE_CONSTANT (fdesc) = 1;
1537 TREE_INVARIANT (fdesc) = 1;
1538 list = tree_cons (NULL_TREE, fdesc, list);
1540 else
1541 list = tree_cons (NULL_TREE,
1542 build1 (ADDR_EXPR, nativecode_ptr_type_node,
1543 method),
1544 list);
1548 /* Dummy entry for compatibility with G++ -fvtable-thunks. When
1549 using the Boehm GC we sometimes stash a GC type descriptor
1550 there. We set the PURPOSE to NULL_TREE not to interfere (reset)
1551 the emitted byte count during the output to the assembly file. */
1552 /* With TARGET_VTABLE_USES_DESCRIPTORS, we only add one extra
1553 fake "function descriptor". It's first word is the is the class
1554 pointer, and subsequent words (usually one) contain the GC descriptor.
1555 In all other cases, we reserve two extra vtable slots. */
1556 gc_descr = get_boehm_type_descriptor (type);
1557 list = tree_cons (NULL_TREE, gc_descr, list);
1558 for (j = 1; j < TARGET_VTABLE_USES_DESCRIPTORS-1; ++j)
1559 list = tree_cons (NULL_TREE, gc_descr, list);
1560 list = tree_cons (NULL_TREE, this_class_addr, list);
1562 /** Pointer to type_info object (to be implemented), according to g++ ABI. */
1563 list = tree_cons (NULL_TREE, null_pointer_node, list);
1564 /** Offset to start of whole object. Always (ptrdiff_t)0 for Java. */
1565 list = tree_cons (integer_zero_node, null_pointer_node, list);
1567 arraysize = (TARGET_VTABLE_USES_DESCRIPTORS? nvirtuals + 1 : nvirtuals + 2);
1568 if (TARGET_VTABLE_USES_DESCRIPTORS)
1569 arraysize *= TARGET_VTABLE_USES_DESCRIPTORS;
1570 arraysize += 2;
1571 return build_constructor_from_list
1572 (build_prim_array_type (nativecode_ptr_type_node,
1573 arraysize), list);
1577 /* Set the method_index for a method decl. */
1578 void
1579 set_method_index (tree decl, tree method_index)
1581 if (method_index != NULL_TREE)
1583 /* method_index is null if we're using indirect dispatch. */
1584 method_index = fold (convert (sizetype, method_index));
1586 if (TARGET_VTABLE_USES_DESCRIPTORS)
1587 /* Add one to skip bogus descriptor for class and GC descriptor. */
1588 method_index = size_binop (PLUS_EXPR, method_index, size_int (1));
1589 else
1590 /* Add 1 to skip "class" field of dtable, and 1 to skip GC
1591 descriptor. */
1592 method_index = size_binop (PLUS_EXPR, method_index, size_int (2));
1595 DECL_VINDEX (decl) = method_index;
1598 /* Get the method_index for a method decl. */
1599 tree
1600 get_method_index (tree decl)
1602 tree method_index = DECL_VINDEX (decl);
1604 if (! method_index)
1605 return NULL;
1607 if (TARGET_VTABLE_USES_DESCRIPTORS)
1608 /* Sub one to skip bogus descriptor for class and GC descriptor. */
1609 method_index = size_binop (MINUS_EXPR, method_index, size_int (1));
1610 else
1611 /* Sub 1 to skip "class" field of dtable, and 1 to skip GC descriptor. */
1612 method_index = size_binop (MINUS_EXPR, method_index, size_int (2));
1614 return method_index;
1617 static int
1618 supers_all_compiled (tree type)
1620 while (type != NULL_TREE)
1622 if (!assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)))))
1623 return 0;
1624 type = CLASSTYPE_SUPER (type);
1626 return 1;
1629 void
1630 make_class_data (tree type)
1632 tree decl, cons, temp;
1633 tree field, fields_decl;
1634 tree static_fields = NULL_TREE;
1635 tree instance_fields = NULL_TREE;
1636 HOST_WIDE_INT static_field_count = 0;
1637 HOST_WIDE_INT instance_field_count = 0;
1638 HOST_WIDE_INT field_count;
1639 tree field_array_type;
1640 tree method;
1641 tree methods = NULL_TREE;
1642 tree dtable_decl = NULL_TREE;
1643 HOST_WIDE_INT method_count = 0;
1644 tree method_array_type;
1645 tree methods_decl;
1646 tree super;
1647 tree this_class_addr;
1648 tree constant_pool_constructor;
1649 tree interfaces = null_pointer_node;
1650 int interface_len = 0;
1651 int uses_jv_markobj = 0;
1652 tree type_decl = TYPE_NAME (type);
1653 tree id_main = get_identifier("main");
1654 tree id_class = get_identifier("java.lang.Class");
1655 /** Offset from start of virtual function table declaration
1656 to where objects actually point at, following new g++ ABI. */
1657 tree dtable_start_offset = build_int_cst (NULL_TREE,
1658 2 * POINTER_SIZE / BITS_PER_UNIT);
1659 VEC(int, heap) *field_indexes;
1660 tree first_real_field;
1662 this_class_addr = build_static_class_ref (type);
1663 decl = TREE_OPERAND (this_class_addr, 0);
1665 if (supers_all_compiled (type) && ! CLASS_INTERFACE (type_decl)
1666 && !flag_indirect_dispatch)
1668 tree dtable = get_dispatch_table (type, this_class_addr);
1669 uses_jv_markobj = uses_jv_markobj_p (dtable);
1670 if (type == class_type_node && class_dtable_decl != NULL_TREE)
1672 /* We've already created some other class, and consequently
1673 we made class_dtable_decl. Now we just want to fill it
1674 in. */
1675 dtable_decl = class_dtable_decl;
1677 else
1679 dtable_decl = build_dtable_decl (type);
1680 TREE_STATIC (dtable_decl) = 1;
1681 DECL_ARTIFICIAL (dtable_decl) = 1;
1682 DECL_IGNORED_P (dtable_decl) = 1;
1685 TREE_PUBLIC (dtable_decl) = 1;
1686 DECL_INITIAL (dtable_decl) = dtable;
1687 if (! flag_indirect_classes)
1688 rest_of_decl_compilation (dtable_decl, 1, 0);
1689 /* Maybe we're compiling Class as the first class. If so, set
1690 class_dtable_decl to the decl we just made. */
1691 if (type == class_type_node && class_dtable_decl == NULL_TREE)
1692 class_dtable_decl = dtable_decl;
1695 /* Build Field array. */
1696 field = TYPE_FIELDS (type);
1697 while (field && DECL_ARTIFICIAL (field))
1698 field = TREE_CHAIN (field); /* Skip dummy fields. */
1699 if (field && DECL_NAME (field) == NULL_TREE)
1700 field = TREE_CHAIN (field); /* Skip dummy field for inherited data. */
1701 first_real_field = field;
1703 /* First count static and instance fields. */
1704 for ( ; field != NULL_TREE; field = TREE_CHAIN (field))
1706 if (! DECL_ARTIFICIAL (field))
1708 if (FIELD_STATIC (field))
1709 static_field_count++;
1710 else if (uses_jv_markobj || !flag_reduced_reflection)
1711 instance_field_count++;
1714 field_count = static_field_count + instance_field_count;
1715 field_indexes = VEC_alloc (int, heap, field_count);
1717 /* gcj sorts fields so that static fields come first, followed by
1718 instance fields. Unfortunately, by the time this takes place we
1719 have already generated the reflection_data for this class, and
1720 that data contains indexes into the fields. So, we generate a
1721 permutation that maps each original field index to its final
1722 position. Then we pass this permutation to
1723 rewrite_reflection_indexes(), which fixes up the reflection
1724 data. */
1726 int i;
1727 int static_count = 0;
1728 int instance_count = static_field_count;
1729 int field_index;
1731 for (i = 0, field = first_real_field;
1732 field != NULL_TREE;
1733 field = TREE_CHAIN (field), i++)
1735 if (! DECL_ARTIFICIAL (field))
1737 field_index = 0;
1738 if (FIELD_STATIC (field))
1739 field_index = static_count++;
1740 else if (uses_jv_markobj || !flag_reduced_reflection)
1741 field_index = instance_count++;
1742 VEC_quick_push (int, field_indexes, field_index);
1747 for (field = first_real_field; field != NULL_TREE;
1748 field = TREE_CHAIN (field))
1750 if (! DECL_ARTIFICIAL (field))
1752 if (FIELD_STATIC (field))
1754 /* We must always create reflection data for static fields
1755 as it is used in the creation of the field itself. */
1756 tree init = make_field_value (field);
1757 tree initial = DECL_INITIAL (field);
1758 static_fields = tree_cons (NULL_TREE, init, static_fields);
1759 /* If the initial value is a string constant,
1760 prevent output_constant from trying to assemble the value. */
1761 if (initial != NULL_TREE
1762 && TREE_TYPE (initial) == string_ptr_type_node)
1763 DECL_INITIAL (field) = NULL_TREE;
1764 rest_of_decl_compilation (field, 1, 1);
1765 DECL_INITIAL (field) = initial;
1767 else if (uses_jv_markobj || !flag_reduced_reflection)
1769 tree init = make_field_value (field);
1770 instance_fields = tree_cons (NULL_TREE, init, instance_fields);
1775 if (field_count > 0)
1777 static_fields = nreverse (static_fields);
1778 instance_fields = nreverse (instance_fields);
1779 static_fields = chainon (static_fields, instance_fields);
1780 field_array_type = build_prim_array_type (field_type_node, field_count);
1781 fields_decl = build_decl (VAR_DECL, mangled_classname ("_FL_", type),
1782 field_array_type);
1783 DECL_INITIAL (fields_decl) = build_constructor_from_list
1784 (field_array_type, static_fields);
1785 TREE_STATIC (fields_decl) = 1;
1786 DECL_ARTIFICIAL (fields_decl) = 1;
1787 DECL_IGNORED_P (fields_decl) = 1;
1788 rest_of_decl_compilation (fields_decl, 1, 0);
1790 else
1791 fields_decl = NULL_TREE;
1793 /* Build Method array. */
1794 for (method = TYPE_METHODS (type);
1795 method != NULL_TREE; method = TREE_CHAIN (method))
1797 tree init;
1798 if (METHOD_PRIVATE (method)
1799 && ! flag_keep_inline_functions
1800 && optimize)
1801 continue;
1802 /* Even if we have a decl, we don't necessarily have the code.
1803 This can happen if we inherit a method from a superclass for
1804 which we don't have a .class file. */
1805 if (METHOD_DUMMY (method))
1806 continue;
1808 /* Generate method reflection data if:
1810 - !flag_reduced_reflection.
1812 - <clinit> -- The runtime uses reflection to initialize the
1813 class.
1815 - Any method in class java.lang.Class -- Class.forName() and
1816 perhaps other things require it.
1818 - class$ -- It does not work if reflection data missing.
1820 - main -- Reflection is used to find main(String[]) methods.
1822 - public not static -- It is potentially part of an
1823 interface. The runtime uses reflection data to build
1824 interface dispatch tables. */
1825 if (!flag_reduced_reflection
1826 || DECL_CLINIT_P (method)
1827 || DECL_NAME (type_decl) == id_class
1828 || DECL_NAME (method) == id_main
1829 || (METHOD_PUBLIC (method) && !METHOD_STATIC (method))
1830 || TYPE_DOT_CLASS (type) == method)
1832 init = make_method_value (method);
1833 method_count++;
1834 methods = tree_cons (NULL_TREE, init, methods);
1837 method_array_type = build_prim_array_type (method_type_node, method_count);
1838 methods_decl = build_decl (VAR_DECL, mangled_classname ("_MT_", type),
1839 method_array_type);
1840 DECL_INITIAL (methods_decl) = build_constructor_from_list
1841 (method_array_type, nreverse (methods));
1842 TREE_STATIC (methods_decl) = 1;
1843 DECL_ARTIFICIAL (methods_decl) = 1;
1844 DECL_IGNORED_P (methods_decl) = 1;
1845 rest_of_decl_compilation (methods_decl, 1, 0);
1847 if (class_dtable_decl == NULL_TREE)
1849 class_dtable_decl = build_dtable_decl (class_type_node);
1850 TREE_STATIC (class_dtable_decl) = 1;
1851 DECL_ARTIFICIAL (class_dtable_decl) = 1;
1852 DECL_IGNORED_P (class_dtable_decl) = 1;
1853 if (is_compiled_class (class_type_node) != 2)
1855 DECL_EXTERNAL (class_dtable_decl) = 1;
1856 rest_of_decl_compilation (class_dtable_decl, 1, 0);
1860 super = CLASSTYPE_SUPER (type);
1861 if (super == NULL_TREE)
1862 super = null_pointer_node;
1863 else if (! flag_indirect_dispatch
1864 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (type_decl)))
1865 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (super)))))
1866 super = build_class_ref (super);
1867 else
1869 int super_index = alloc_class_constant (super);
1870 super = build_int_cst (ptr_type_node, super_index);
1873 /* Build and emit the array of implemented interfaces. */
1874 if (type != object_type_node)
1875 interface_len = BINFO_N_BASE_BINFOS (TYPE_BINFO (type)) - 1;
1877 if (interface_len > 0)
1879 tree init = NULL_TREE;
1880 int i;
1881 tree interface_array_type, idecl;
1882 interface_array_type
1883 = build_prim_array_type (class_ptr_type, interface_len);
1884 idecl = build_decl (VAR_DECL, mangled_classname ("_IF_", type),
1885 interface_array_type);
1887 for (i = interface_len; i > 0; i--)
1889 tree child = BINFO_BASE_BINFO (TYPE_BINFO (type), i);
1890 tree iclass = BINFO_TYPE (child);
1891 tree index;
1892 if (! flag_indirect_dispatch
1893 && (assume_compiled
1894 (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (iclass))))))
1895 index = build_class_ref (iclass);
1896 else
1898 int int_index = alloc_class_constant (iclass);
1899 index = build_int_cst (ptr_type_node, int_index);
1901 init = tree_cons (NULL_TREE, index, init);
1903 DECL_INITIAL (idecl) = build_constructor_from_list (interface_array_type,
1904 init);
1905 TREE_STATIC (idecl) = 1;
1906 DECL_ARTIFICIAL (idecl) = 1;
1907 DECL_IGNORED_P (idecl) = 1;
1908 interfaces = build1 (ADDR_EXPR, ptr_type_node, idecl);
1909 rest_of_decl_compilation (idecl, 1, 0);
1912 constant_pool_constructor = build_constants_constructor ();
1914 if (flag_indirect_dispatch)
1916 TYPE_OTABLE_DECL (type)
1917 = emit_symbol_table
1918 (DECL_NAME (TYPE_OTABLE_DECL (type)),
1919 TYPE_OTABLE_DECL (type), TYPE_OTABLE_METHODS (type),
1920 TYPE_OTABLE_SYMS_DECL (type), integer_type_node, 1);
1922 TYPE_ATABLE_DECL (type)
1923 = emit_symbol_table
1924 (DECL_NAME (TYPE_ATABLE_DECL (type)),
1925 TYPE_ATABLE_DECL (type), TYPE_ATABLE_METHODS (type),
1926 TYPE_ATABLE_SYMS_DECL (type), ptr_type_node, 1);
1928 TYPE_ITABLE_DECL (type)
1929 = emit_symbol_table
1930 (DECL_NAME (TYPE_ITABLE_DECL (type)),
1931 TYPE_ITABLE_DECL (type), TYPE_ITABLE_METHODS (type),
1932 TYPE_ITABLE_SYMS_DECL (type), ptr_type_node, 2);
1935 TYPE_CTABLE_DECL (type) = emit_catch_table (type);
1937 START_RECORD_CONSTRUCTOR (temp, object_type_node);
1938 PUSH_FIELD_VALUE (temp, "vtable",
1939 (flag_indirect_classes
1940 ? null_pointer_node
1941 : build2 (PLUS_EXPR, dtable_ptr_type,
1942 build1 (ADDR_EXPR, dtable_ptr_type,
1943 class_dtable_decl),
1944 dtable_start_offset)));
1945 if (! flag_hash_synchronization)
1946 PUSH_FIELD_VALUE (temp, "sync_info", null_pointer_node);
1947 FINISH_RECORD_CONSTRUCTOR (temp);
1948 START_RECORD_CONSTRUCTOR (cons, class_type_node);
1949 PUSH_SUPER_VALUE (cons, temp);
1950 PUSH_FIELD_VALUE (cons, "next_or_version", gcj_abi_version);
1951 PUSH_FIELD_VALUE (cons, "name", build_utf8_ref (DECL_NAME (type_decl)));
1952 PUSH_FIELD_VALUE (cons, "accflags",
1953 build_int_cst (NULL_TREE,
1954 get_access_flags_from_decl (type_decl)));
1956 PUSH_FIELD_VALUE (cons, "superclass",
1957 CLASS_INTERFACE (type_decl) ? null_pointer_node : super);
1958 PUSH_FIELD_VALUE (cons, "constants", constant_pool_constructor);
1959 PUSH_FIELD_VALUE (cons, "methods",
1960 methods_decl == NULL_TREE ? null_pointer_node
1961 : build1 (ADDR_EXPR, method_ptr_type_node, methods_decl));
1962 PUSH_FIELD_VALUE (cons, "method_count",
1963 build_int_cst (NULL_TREE, method_count));
1965 if (flag_indirect_dispatch)
1966 PUSH_FIELD_VALUE (cons, "vtable_method_count", integer_minus_one_node);
1967 else
1968 PUSH_FIELD_VALUE (cons, "vtable_method_count", TYPE_NVIRTUALS (type));
1970 PUSH_FIELD_VALUE (cons, "fields",
1971 fields_decl == NULL_TREE ? null_pointer_node
1972 : build1 (ADDR_EXPR, field_ptr_type_node, fields_decl));
1973 /* If we're using the binary compatibility ABI we don't know the
1974 size until load time. */
1975 PUSH_FIELD_VALUE (cons, "size_in_bytes",
1976 (flag_indirect_dispatch
1977 ? integer_minus_one_node
1978 : size_in_bytes (type)));
1979 PUSH_FIELD_VALUE (cons, "field_count",
1980 build_int_cst (NULL_TREE, field_count));
1981 PUSH_FIELD_VALUE (cons, "static_field_count",
1982 build_int_cst (NULL_TREE, static_field_count));
1984 if (flag_indirect_dispatch)
1985 PUSH_FIELD_VALUE (cons, "vtable", null_pointer_node);
1986 else
1987 PUSH_FIELD_VALUE (cons, "vtable",
1988 dtable_decl == NULL_TREE ? null_pointer_node
1989 : build2 (PLUS_EXPR, dtable_ptr_type,
1990 build1 (ADDR_EXPR, dtable_ptr_type,
1991 dtable_decl),
1992 dtable_start_offset));
1993 if (TYPE_OTABLE_METHODS (type) == NULL_TREE)
1995 PUSH_FIELD_VALUE (cons, "otable", null_pointer_node);
1996 PUSH_FIELD_VALUE (cons, "otable_syms", null_pointer_node);
1998 else
2000 pushdecl_top_level (TYPE_OTABLE_SYMS_DECL (type));
2001 PUSH_FIELD_VALUE (cons, "otable",
2002 build1 (ADDR_EXPR, otable_ptr_type, TYPE_OTABLE_DECL (type)));
2003 PUSH_FIELD_VALUE (cons, "otable_syms",
2004 build1 (ADDR_EXPR, symbols_array_ptr_type,
2005 TYPE_OTABLE_SYMS_DECL (type)));
2006 TREE_CONSTANT (TYPE_OTABLE_DECL (type)) = 1;
2007 TREE_INVARIANT (TYPE_OTABLE_DECL (type)) = 1;
2009 if (TYPE_ATABLE_METHODS(type) == NULL_TREE)
2011 PUSH_FIELD_VALUE (cons, "atable", null_pointer_node);
2012 PUSH_FIELD_VALUE (cons, "atable_syms", null_pointer_node);
2014 else
2016 pushdecl_top_level (TYPE_ATABLE_SYMS_DECL (type));
2017 PUSH_FIELD_VALUE (cons, "atable",
2018 build1 (ADDR_EXPR, atable_ptr_type, TYPE_ATABLE_DECL (type)));
2019 PUSH_FIELD_VALUE (cons, "atable_syms",
2020 build1 (ADDR_EXPR, symbols_array_ptr_type,
2021 TYPE_ATABLE_SYMS_DECL (type)));
2022 TREE_CONSTANT (TYPE_ATABLE_DECL (type)) = 1;
2023 TREE_INVARIANT (TYPE_ATABLE_DECL (type)) = 1;
2025 if (TYPE_ITABLE_METHODS(type) == NULL_TREE)
2027 PUSH_FIELD_VALUE (cons, "itable", null_pointer_node);
2028 PUSH_FIELD_VALUE (cons, "itable_syms", null_pointer_node);
2030 else
2032 pushdecl_top_level (TYPE_ITABLE_SYMS_DECL (type));
2033 PUSH_FIELD_VALUE (cons, "itable",
2034 build1 (ADDR_EXPR, itable_ptr_type, TYPE_ITABLE_DECL (type)));
2035 PUSH_FIELD_VALUE (cons, "itable_syms",
2036 build1 (ADDR_EXPR, symbols_array_ptr_type,
2037 TYPE_ITABLE_SYMS_DECL (type)));
2038 TREE_CONSTANT (TYPE_ITABLE_DECL (type)) = 1;
2039 TREE_INVARIANT (TYPE_ITABLE_DECL (type)) = 1;
2042 PUSH_FIELD_VALUE (cons, "catch_classes",
2043 build1 (ADDR_EXPR, ptr_type_node, TYPE_CTABLE_DECL (type)));
2044 PUSH_FIELD_VALUE (cons, "interfaces", interfaces);
2045 PUSH_FIELD_VALUE (cons, "loader", null_pointer_node);
2046 PUSH_FIELD_VALUE (cons, "interface_count",
2047 build_int_cst (NULL_TREE, interface_len));
2048 PUSH_FIELD_VALUE (cons, "state",
2049 convert (byte_type_node,
2050 build_int_cst (NULL_TREE, JV_STATE_PRELOADING)));
2052 PUSH_FIELD_VALUE (cons, "thread", null_pointer_node);
2053 PUSH_FIELD_VALUE (cons, "depth", integer_zero_node);
2054 PUSH_FIELD_VALUE (cons, "ancestors", null_pointer_node);
2055 PUSH_FIELD_VALUE (cons, "idt", null_pointer_node);
2056 PUSH_FIELD_VALUE (cons, "arrayclass", null_pointer_node);
2057 PUSH_FIELD_VALUE (cons, "protectionDomain", null_pointer_node);
2060 tree assertion_table_ref;
2061 if (TYPE_ASSERTIONS (type) == NULL)
2062 assertion_table_ref = null_pointer_node;
2063 else
2064 assertion_table_ref = build1 (ADDR_EXPR,
2065 build_pointer_type (assertion_table_type),
2066 emit_assertion_table (type));
2068 PUSH_FIELD_VALUE (cons, "assertion_table", assertion_table_ref);
2071 PUSH_FIELD_VALUE (cons, "hack_signers", null_pointer_node);
2072 PUSH_FIELD_VALUE (cons, "chain", null_pointer_node);
2073 PUSH_FIELD_VALUE (cons, "aux_info", null_pointer_node);
2074 PUSH_FIELD_VALUE (cons, "engine", null_pointer_node);
2076 if (TYPE_REFLECTION_DATA (current_class))
2078 int i;
2079 int count = TYPE_REFLECTION_DATASIZE (current_class);
2080 VEC (constructor_elt, gc) *v
2081 = VEC_alloc (constructor_elt, gc, count);
2082 unsigned char *data = TYPE_REFLECTION_DATA (current_class);
2083 tree max_index = build_int_cst (sizetype, count);
2084 tree index = build_index_type (max_index);
2085 tree type = build_array_type (unsigned_byte_type_node, index);
2086 char buf[64];
2087 tree array;
2088 static int reflection_data_count;
2090 sprintf (buf, "_reflection_data_%d", reflection_data_count++);
2091 array = build_decl (VAR_DECL, get_identifier (buf), type);
2093 rewrite_reflection_indexes (field_indexes);
2095 for (i = 0; i < count; i++)
2097 constructor_elt *elt = VEC_quick_push (constructor_elt, v, NULL);
2098 elt->index = build_int_cst (sizetype, i);
2099 elt->value = build_int_cstu (byte_type_node, data[i]);
2102 DECL_INITIAL (array) = build_constructor (type, v);
2103 TREE_STATIC (array) = 1;
2104 DECL_ARTIFICIAL (array) = 1;
2105 DECL_IGNORED_P (array) = 1;
2106 TREE_READONLY (array) = 1;
2107 TREE_CONSTANT (DECL_INITIAL (array)) = 1;
2108 rest_of_decl_compilation (array, 1, 0);
2110 PUSH_FIELD_VALUE (cons, "reflection_data", build_address_of (array));
2112 free (data);
2113 TYPE_REFLECTION_DATA (current_class) = NULL;
2115 else
2116 PUSH_FIELD_VALUE (cons, "reflection_data", null_pointer_node);
2118 FINISH_RECORD_CONSTRUCTOR (cons);
2120 DECL_INITIAL (decl) = cons;
2122 /* Hash synchronization requires at least 64-bit alignment. */
2123 if (flag_hash_synchronization && POINTER_SIZE < 64)
2124 DECL_ALIGN (decl) = 64;
2126 if (flag_indirect_classes)
2128 TREE_READONLY (decl) = 1;
2129 TREE_CONSTANT (DECL_INITIAL (decl)) = 1;
2132 rest_of_decl_compilation (decl, 1, 0);
2135 tree classdollar_field = build_classdollar_field (type);
2136 if (!flag_indirect_classes)
2137 DECL_INITIAL (classdollar_field) = build_static_class_ref (type);
2138 rest_of_decl_compilation (classdollar_field, 1, 0);
2141 TYPE_OTABLE_DECL (type) = NULL_TREE;
2142 TYPE_ATABLE_DECL (type) = NULL_TREE;
2143 TYPE_CTABLE_DECL (type) = NULL_TREE;
2146 void
2147 finish_class (void)
2149 if (TYPE_VERIFY_METHOD (output_class))
2151 tree verify_method = TYPE_VERIFY_METHOD (output_class);
2152 DECL_SAVED_TREE (verify_method)
2153 = add_stmt_to_compound (DECL_SAVED_TREE (verify_method), void_type_node,
2154 build1 (RETURN_EXPR, void_type_node, NULL));
2155 java_genericize (verify_method);
2156 cgraph_finalize_function (verify_method, false);
2157 TYPE_ASSERTIONS (current_class) = NULL;
2160 java_expand_catch_classes (current_class);
2162 current_function_decl = NULL_TREE;
2163 TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (current_class)) = 0;
2164 make_class_data (current_class);
2165 register_class ();
2166 rest_of_decl_compilation (TYPE_NAME (current_class), 1, 0);
2169 /* Return 2 if CLASS is compiled by this compilation job;
2170 return 1 if CLASS can otherwise be assumed to be compiled;
2171 return 0 if we cannot assume that CLASS is compiled.
2172 Returns 1 for primitive and 0 for array types. */
2174 is_compiled_class (tree class)
2176 int seen_in_zip;
2177 if (TREE_CODE (class) == POINTER_TYPE)
2178 class = TREE_TYPE (class);
2179 if (TREE_CODE (class) != RECORD_TYPE) /* Primitive types are static. */
2180 return 1;
2181 if (TYPE_ARRAY_P (class))
2182 return 0;
2184 seen_in_zip = (TYPE_JCF (class) && JCF_SEEN_IN_ZIP (TYPE_JCF (class)));
2185 if (CLASS_FROM_CURRENTLY_COMPILED_P (class))
2187 /* The class was seen in the current ZIP file and will be
2188 available as a compiled class in the future but may not have
2189 been loaded already. Load it if necessary. This prevent
2190 build_class_ref () from crashing. */
2192 if (seen_in_zip && !CLASS_LOADED_P (class) && (class != current_class))
2193 load_class (class, 1);
2195 /* We return 2 for class seen in ZIP and class from files
2196 belonging to the same compilation unit */
2197 return 2;
2200 if (assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class)))))
2202 if (!CLASS_LOADED_P (class))
2204 if (CLASS_FROM_SOURCE_P (class))
2205 safe_layout_class (class);
2206 else if (class != current_class)
2207 load_class (class, 1);
2209 return 1;
2212 return 0;
2215 /* Build a VAR_DECL for the dispatch table (vtable) for class TYPE. */
2217 tree
2218 build_dtable_decl (tree type)
2220 tree dtype, decl;
2222 /* We need to build a new dtable type so that its size is uniquely
2223 computed when we're dealing with the class for real and not just
2224 faking it (like java.lang.Class during the initialization of the
2225 compiler.) We know we're not faking a class when CURRENT_CLASS is
2226 TYPE. */
2227 if (current_class == type)
2229 tree dummy = NULL_TREE;
2230 int n;
2232 dtype = make_node (RECORD_TYPE);
2234 PUSH_FIELD (dtype, dummy, "top_offset", ptr_type_node);
2235 PUSH_FIELD (dtype, dummy, "type_info", ptr_type_node);
2237 PUSH_FIELD (dtype, dummy, "class", class_ptr_type);
2238 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
2240 tree tmp_field = build_decl (FIELD_DECL, NULL_TREE, ptr_type_node);
2241 TREE_CHAIN (dummy) = tmp_field;
2242 DECL_CONTEXT (tmp_field) = dtype;
2243 DECL_ARTIFICIAL (tmp_field) = 1;
2244 dummy = tmp_field;
2247 PUSH_FIELD (dtype, dummy, "gc_descr", ptr_type_node);
2248 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
2250 tree tmp_field = build_decl (FIELD_DECL, NULL_TREE, ptr_type_node);
2251 TREE_CHAIN (dummy) = tmp_field;
2252 DECL_CONTEXT (tmp_field) = dtype;
2253 DECL_ARTIFICIAL (tmp_field) = 1;
2254 dummy = tmp_field;
2257 n = TREE_VEC_LENGTH (get_dispatch_vector (type));
2258 if (TARGET_VTABLE_USES_DESCRIPTORS)
2259 n *= TARGET_VTABLE_USES_DESCRIPTORS;
2261 PUSH_FIELD (dtype, dummy, "methods",
2262 build_prim_array_type (nativecode_ptr_type_node, n));
2263 layout_type (dtype);
2265 else
2266 dtype = dtable_type;
2268 decl = build_decl (VAR_DECL, get_identifier ("vt$"), dtype);
2269 DECL_CONTEXT (decl) = type;
2270 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
2271 DECL_VTABLE_P (decl) = 1;
2273 return decl;
2276 /* Pre-pend the TYPE_FIELDS of THIS_CLASS with a dummy FIELD_DECL for the
2277 fields inherited from SUPER_CLASS. */
2279 void
2280 push_super_field (tree this_class, tree super_class)
2282 tree base_decl;
2283 /* Don't insert the field if we're just re-laying the class out. */
2284 if (TYPE_FIELDS (this_class) && !DECL_NAME (TYPE_FIELDS (this_class)))
2285 return;
2286 base_decl = build_decl (FIELD_DECL, NULL_TREE, super_class);
2287 DECL_IGNORED_P (base_decl) = 1;
2288 TREE_CHAIN (base_decl) = TYPE_FIELDS (this_class);
2289 TYPE_FIELDS (this_class) = base_decl;
2290 DECL_SIZE (base_decl) = TYPE_SIZE (super_class);
2291 DECL_SIZE_UNIT (base_decl) = TYPE_SIZE_UNIT (super_class);
2294 /* Handle the different manners we may have to lay out a super class. */
2296 static tree
2297 maybe_layout_super_class (tree super_class, tree this_class ATTRIBUTE_UNUSED)
2299 if (!super_class)
2300 return NULL_TREE;
2301 else if (TREE_CODE (super_class) == RECORD_TYPE)
2303 if (!CLASS_LOADED_P (super_class) && CLASS_FROM_SOURCE_P (super_class))
2304 safe_layout_class (super_class);
2305 if (!CLASS_LOADED_P (super_class))
2306 load_class (super_class, 1);
2308 /* We might have to layout the class before its dependency on
2309 the super class gets resolved by java_complete_class */
2310 else if (TREE_CODE (super_class) == POINTER_TYPE)
2312 if (TREE_TYPE (super_class) != NULL_TREE)
2313 super_class = TREE_TYPE (super_class);
2314 else
2315 gcc_unreachable ();
2317 if (!TYPE_SIZE (super_class))
2318 safe_layout_class (super_class);
2320 return super_class;
2323 /* safe_layout_class just makes sure that we can load a class without
2324 disrupting the current_class, input_file, input_line, etc, information
2325 about the class processed currently. */
2327 void
2328 safe_layout_class (tree class)
2330 tree save_current_class = current_class;
2331 location_t save_location = input_location;
2333 layout_class (class);
2335 current_class = save_current_class;
2336 input_location = save_location;
2339 void
2340 layout_class (tree this_class)
2342 tree super_class = CLASSTYPE_SUPER (this_class);
2344 class_list = tree_cons (this_class, NULL_TREE, class_list);
2345 if (CLASS_BEING_LAIDOUT (this_class))
2347 char buffer [1024];
2348 char *report;
2349 tree current;
2351 sprintf (buffer, " with '%s'",
2352 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class))));
2353 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2355 for (current = TREE_CHAIN (class_list); current;
2356 current = TREE_CHAIN (current))
2358 tree decl = TYPE_NAME (TREE_PURPOSE (current));
2359 sprintf (buffer, "\n which inherits from '%s' (%s:%d)",
2360 IDENTIFIER_POINTER (DECL_NAME (decl)),
2361 DECL_SOURCE_FILE (decl),
2362 DECL_SOURCE_LINE (decl));
2363 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2365 obstack_1grow (&temporary_obstack, '\0');
2366 report = obstack_finish (&temporary_obstack);
2367 cyclic_inheritance_report = ggc_strdup (report);
2368 obstack_free (&temporary_obstack, report);
2369 TYPE_SIZE (this_class) = error_mark_node;
2370 return;
2372 CLASS_BEING_LAIDOUT (this_class) = 1;
2374 if (super_class && !CLASS_BEING_LAIDOUT (super_class))
2376 tree maybe_super_class
2377 = maybe_layout_super_class (super_class, this_class);
2378 if (maybe_super_class == NULL
2379 || TREE_CODE (TYPE_SIZE (maybe_super_class)) == ERROR_MARK)
2381 TYPE_SIZE (this_class) = error_mark_node;
2382 CLASS_BEING_LAIDOUT (this_class) = 0;
2383 class_list = TREE_CHAIN (class_list);
2384 return;
2386 if (TYPE_SIZE (this_class) == NULL_TREE)
2387 push_super_field (this_class, maybe_super_class);
2390 layout_type (this_class);
2392 /* Also recursively load/layout any superinterfaces, but only if
2393 class was loaded from bytecode. The source parser will take care
2394 of this itself. */
2395 if (!CLASS_FROM_SOURCE_P (this_class))
2397 int i;
2398 if (TYPE_BINFO (this_class))
2400 for (i = BINFO_N_BASE_BINFOS (TYPE_BINFO (this_class)) - 1; i > 0; i--)
2402 tree binfo = BINFO_BASE_BINFO (TYPE_BINFO (this_class), i);
2403 tree super_interface = BINFO_TYPE (binfo);
2404 tree maybe_super_interface
2405 = maybe_layout_super_class (super_interface, NULL_TREE);
2406 if (maybe_super_interface == NULL
2407 || TREE_CODE (TYPE_SIZE (maybe_super_interface)) == ERROR_MARK)
2409 TYPE_SIZE (this_class) = error_mark_node;
2410 CLASS_BEING_LAIDOUT (this_class) = 0;
2411 class_list = TREE_CHAIN (class_list);
2412 return;
2418 /* Convert the size back to an SI integer value. */
2419 TYPE_SIZE_UNIT (this_class) =
2420 fold (convert (int_type_node, TYPE_SIZE_UNIT (this_class)));
2422 CLASS_BEING_LAIDOUT (this_class) = 0;
2423 class_list = TREE_CHAIN (class_list);
2426 static void
2427 add_miranda_methods (tree base_class, tree search_class)
2429 int i;
2430 tree binfo, base_binfo;
2432 if (!CLASS_PARSED_P (search_class))
2433 load_class (search_class, 1);
2435 for (binfo = TYPE_BINFO (search_class), i = 1;
2436 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
2438 tree method_decl;
2439 tree elt = BINFO_TYPE (base_binfo);
2441 /* FIXME: This is totally bogus. We should not be handling
2442 Miranda methods at all if we're using the BC ABI. */
2443 if (TYPE_DUMMY (elt))
2444 continue;
2446 /* Ensure that interface methods are seen in declared order. */
2447 if (!CLASS_LOADED_P (elt))
2448 load_class (elt, 1);
2449 layout_class_methods (elt);
2451 /* All base classes will have been laid out at this point, so the order
2452 will be correct. This code must match similar layout code in the
2453 runtime. */
2454 for (method_decl = TYPE_METHODS (elt);
2455 method_decl; method_decl = TREE_CHAIN (method_decl))
2457 tree sig, override;
2459 /* An interface can have <clinit>. */
2460 if (ID_CLINIT_P (DECL_NAME (method_decl)))
2461 continue;
2463 sig = build_java_argument_signature (TREE_TYPE (method_decl));
2464 override = lookup_argument_method (base_class,
2465 DECL_NAME (method_decl), sig);
2466 if (override == NULL_TREE)
2468 /* Found a Miranda method. Add it. */
2469 tree new_method;
2470 sig = build_java_signature (TREE_TYPE (method_decl));
2471 new_method
2472 = add_method (base_class,
2473 get_access_flags_from_decl (method_decl),
2474 DECL_NAME (method_decl), sig);
2475 METHOD_INVISIBLE (new_method) = 1;
2479 /* Try superinterfaces. */
2480 add_miranda_methods (base_class, elt);
2484 void
2485 layout_class_methods (tree this_class)
2487 tree method_decl, dtable_count;
2488 tree super_class, type_name;
2490 if (TYPE_NVIRTUALS (this_class))
2491 return;
2493 super_class = CLASSTYPE_SUPER (this_class);
2495 if (super_class)
2497 super_class = maybe_layout_super_class (super_class, this_class);
2498 if (!TYPE_NVIRTUALS (super_class))
2499 layout_class_methods (super_class);
2500 dtable_count = TYPE_NVIRTUALS (super_class);
2502 else
2503 dtable_count = integer_zero_node;
2505 type_name = TYPE_NAME (this_class);
2506 if (!flag_indirect_dispatch
2507 && (CLASS_ABSTRACT (type_name) || CLASS_INTERFACE (type_name)))
2509 /* An abstract class can have methods which are declared only in
2510 an implemented interface. These are called "Miranda
2511 methods". We make a dummy method entry for such methods
2512 here. */
2513 add_miranda_methods (this_class, this_class);
2516 TYPE_METHODS (this_class) = nreverse (TYPE_METHODS (this_class));
2518 for (method_decl = TYPE_METHODS (this_class);
2519 method_decl; method_decl = TREE_CHAIN (method_decl))
2520 dtable_count = layout_class_method (this_class, super_class,
2521 method_decl, dtable_count);
2523 TYPE_NVIRTUALS (this_class) = dtable_count;
2526 /* Return the index of METHOD in INTERFACE. This index begins at 1
2527 and is used as an argument for _Jv_LookupInterfaceMethodIdx(). */
2529 get_interface_method_index (tree method, tree interface)
2531 tree meth;
2532 int i = 1;
2534 for (meth = TYPE_METHODS (interface); ; meth = TREE_CHAIN (meth))
2536 if (meth == method)
2537 return i;
2538 /* We don't want to put <clinit> into the interface table. */
2539 if (! ID_CLINIT_P (DECL_NAME (meth)))
2540 ++i;
2541 gcc_assert (meth != NULL_TREE);
2545 /* Lay METHOD_DECL out, returning a possibly new value of
2546 DTABLE_COUNT. Also mangle the method's name. */
2548 tree
2549 layout_class_method (tree this_class, tree super_class,
2550 tree method_decl, tree dtable_count)
2552 tree method_name = DECL_NAME (method_decl);
2554 TREE_PUBLIC (method_decl) = 1;
2556 /* Considered external unless it is being compiled into this object
2557 file, or it was already flagged as external. */
2558 if (!DECL_EXTERNAL (method_decl))
2559 DECL_EXTERNAL (method_decl) = ((is_compiled_class (this_class) != 2)
2560 || METHOD_NATIVE (method_decl));
2562 if (ID_INIT_P (method_name))
2564 const char *p = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class)));
2565 const char *ptr;
2566 for (ptr = p; *ptr; )
2568 if (*ptr++ == '.')
2569 p = ptr;
2571 DECL_CONSTRUCTOR_P (method_decl) = 1;
2572 build_java_signature (TREE_TYPE (method_decl));
2574 else if (! METHOD_STATIC (method_decl))
2576 tree method_sig =
2577 build_java_signature (TREE_TYPE (method_decl));
2578 bool method_override = false;
2579 tree super_method = lookup_java_method (super_class, method_name,
2580 method_sig);
2581 if (super_method != NULL_TREE
2582 && ! METHOD_DUMMY (super_method))
2584 method_override = true;
2585 if (! METHOD_PUBLIC (super_method) &&
2586 ! METHOD_PROTECTED (super_method))
2588 /* Don't override private method, or default-access method in
2589 another package. */
2590 if (METHOD_PRIVATE (super_method) ||
2591 ! in_same_package (TYPE_NAME (this_class),
2592 TYPE_NAME (super_class)))
2593 method_override = false;
2596 if (method_override)
2598 tree method_index = get_method_index (super_method);
2599 set_method_index (method_decl, method_index);
2600 if (method_index == NULL_TREE
2601 && ! flag_indirect_dispatch
2602 && !CLASS_FROM_SOURCE_P (this_class)
2603 && ! DECL_ARTIFICIAL (super_method))
2604 error ("non-static method %q+D overrides static method",
2605 method_decl);
2607 else if (this_class == object_type_node
2608 && (METHOD_FINAL (method_decl)
2609 || METHOD_PRIVATE (method_decl)))
2611 /* We don't generate vtable entries for final Object
2612 methods. This is simply to save space, since every
2613 object would otherwise have to define them. */
2615 else if (! METHOD_PRIVATE (method_decl)
2616 && dtable_count)
2618 /* We generate vtable entries for final methods because they
2619 may one day be changed to non-final. */
2620 set_method_index (method_decl, dtable_count);
2621 dtable_count = fold_build2 (PLUS_EXPR, integer_type_node,
2622 dtable_count, integer_one_node);
2626 return dtable_count;
2629 static void
2630 register_class (void)
2632 tree node;
2634 if (!registered_class)
2635 registered_class = VEC_alloc (tree, gc, 8);
2637 if (flag_indirect_classes)
2638 node = current_class;
2639 else
2640 node = TREE_OPERAND (build_class_ref (current_class), 0);
2641 VEC_safe_push (tree, gc, registered_class, node);
2644 /* Emit a function that calls _Jv_RegisterNewClasses with a list of
2645 all the classes we have emitted. */
2647 static void
2648 emit_indirect_register_classes (tree *list_p)
2650 tree klass, t, register_class_fn;
2651 int i;
2653 tree init = NULL_TREE;
2654 int size = VEC_length (tree, registered_class) * 2 + 1;
2655 tree class_array_type
2656 = build_prim_array_type (ptr_type_node, size);
2657 tree cdecl = build_decl (VAR_DECL, get_identifier ("_Jv_CLS"),
2658 class_array_type);
2659 tree reg_class_list;
2660 for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i)
2662 init = tree_cons (NULL_TREE,
2663 fold_convert (ptr_type_node,
2664 build_static_class_ref (klass)), init);
2665 init = tree_cons
2666 (NULL_TREE,
2667 fold_convert (ptr_type_node,
2668 build_address_of (build_classdollar_field (klass))),
2669 init);
2671 init = tree_cons (NULL_TREE, integer_zero_node, init);
2672 DECL_INITIAL (cdecl) = build_constructor_from_list (class_array_type,
2673 nreverse (init));
2674 TREE_CONSTANT (DECL_INITIAL (cdecl)) = 1;
2675 TREE_STATIC (cdecl) = 1;
2676 DECL_ARTIFICIAL (cdecl) = 1;
2677 DECL_IGNORED_P (cdecl) = 1;
2678 TREE_READONLY (cdecl) = 1;
2679 TREE_CONSTANT (cdecl) = 1;
2680 rest_of_decl_compilation (cdecl, 1, 0);
2681 reg_class_list = fold_convert (ptr_type_node, build_address_of (cdecl));
2683 t = build_function_type_list (void_type_node,
2684 build_pointer_type (ptr_type_node), NULL);
2685 t = build_decl (FUNCTION_DECL,
2686 get_identifier ("_Jv_RegisterNewClasses"), t);
2687 TREE_PUBLIC (t) = 1;
2688 DECL_EXTERNAL (t) = 1;
2689 register_class_fn = t;
2690 t = build_call_expr (register_class_fn, 1, reg_class_list);
2691 append_to_statement_list (t, list_p);
2695 /* Emit something to register classes at start-up time.
2697 The preferred mechanism is through the .jcr section, which contain
2698 a list of pointers to classes which get registered during constructor
2699 invocation time.
2701 The fallback mechanism is to add statements to *LIST_P to call
2702 _Jv_RegisterClass for each class in this file. These statements will
2703 be added to a static constructor function for this translation unit. */
2705 void
2706 emit_register_classes (tree *list_p)
2708 if (registered_class == NULL)
2709 return;
2711 if (flag_indirect_classes)
2713 emit_indirect_register_classes (list_p);
2714 return;
2717 /* TARGET_USE_JCR_SECTION defaults to 1 if SUPPORTS_WEAK and
2718 TARGET_ASM_NAMED_SECTION, else 0. Some targets meet those conditions
2719 but lack suitable crtbegin/end objects or linker support. These
2720 targets can override the default in tm.h to use the fallback mechanism. */
2721 if (TARGET_USE_JCR_SECTION)
2723 tree klass, t;
2724 int i;
2726 #ifdef JCR_SECTION_NAME
2727 switch_to_section (get_section (JCR_SECTION_NAME, SECTION_WRITE, NULL));
2728 #else
2729 /* A target has defined TARGET_USE_JCR_SECTION,
2730 but doesn't have a JCR_SECTION_NAME. */
2731 gcc_unreachable ();
2732 #endif
2733 assemble_align (POINTER_SIZE);
2735 for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i)
2737 t = build_fold_addr_expr (klass);
2738 output_constant (t, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE);
2741 else
2743 tree klass, t, register_class_fn;
2744 int i;
2746 t = build_function_type_list (void_type_node, class_ptr_type, NULL);
2747 t = build_decl (FUNCTION_DECL, get_identifier ("_Jv_RegisterClass"), t);
2748 TREE_PUBLIC (t) = 1;
2749 DECL_EXTERNAL (t) = 1;
2750 register_class_fn = t;
2752 for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i)
2754 t = build_fold_addr_expr (klass);
2755 t = build_call_expr (register_class_fn, 1, t);
2756 append_to_statement_list (t, list_p);
2761 /* Make a symbol_type (_Jv_MethodSymbol) node for DECL. */
2763 static tree
2764 build_symbol_entry (tree decl, tree special)
2766 tree clname, name, signature, sym;
2767 clname = build_utf8_ref (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))));
2768 /* ??? Constructors are given the name foo.foo all the way through
2769 the compiler, but in the method table they're all renamed
2770 foo.<init>. So, we have to do the same here unless we want an
2771 unresolved reference at runtime. */
2772 name = build_utf8_ref ((TREE_CODE (decl) == FUNCTION_DECL
2773 && DECL_CONSTRUCTOR_P (decl))
2774 ? init_identifier_node
2775 : DECL_NAME (decl));
2776 signature = build_java_signature (TREE_TYPE (decl));
2777 signature = build_utf8_ref (unmangle_classname
2778 (IDENTIFIER_POINTER (signature),
2779 IDENTIFIER_LENGTH (signature)));
2780 /* SPECIAL is either NULL_TREE or integer_one_node. We emit
2781 signature addr+1 if SPECIAL, and this indicates to the runtime
2782 system that this is a "special" symbol, i.e. one that should
2783 bypass access controls. */
2784 if (special != NULL_TREE)
2785 signature = build2 (PLUS_EXPR, TREE_TYPE (signature), signature, special);
2787 START_RECORD_CONSTRUCTOR (sym, symbol_type);
2788 PUSH_FIELD_VALUE (sym, "clname", clname);
2789 PUSH_FIELD_VALUE (sym, "name", name);
2790 PUSH_FIELD_VALUE (sym, "signature", signature);
2791 FINISH_RECORD_CONSTRUCTOR (sym);
2792 TREE_CONSTANT (sym) = 1;
2793 TREE_INVARIANT (sym) = 1;
2795 return sym;
2798 /* Emit a symbol table: used by -findirect-dispatch. */
2800 tree
2801 emit_symbol_table (tree name, tree the_table, tree decl_list,
2802 tree the_syms_decl, tree the_array_element_type,
2803 int element_size)
2805 tree method_list, method, table, list, null_symbol;
2806 tree table_size, the_array_type;
2807 int index;
2809 /* Only emit a table if this translation unit actually made any
2810 references via it. */
2811 if (decl_list == NULL_TREE)
2812 return the_table;
2814 /* Build a list of _Jv_MethodSymbols for each entry in otable_methods. */
2815 index = 0;
2816 method_list = decl_list;
2817 list = NULL_TREE;
2818 while (method_list != NULL_TREE)
2820 tree special = TREE_PURPOSE (method_list);
2821 method = TREE_VALUE (method_list);
2822 list = tree_cons (NULL_TREE, build_symbol_entry (method, special), list);
2823 method_list = TREE_CHAIN (method_list);
2824 index++;
2827 /* Terminate the list with a "null" entry. */
2828 START_RECORD_CONSTRUCTOR (null_symbol, symbol_type);
2829 PUSH_FIELD_VALUE (null_symbol, "clname", null_pointer_node);
2830 PUSH_FIELD_VALUE (null_symbol, "name", null_pointer_node);
2831 PUSH_FIELD_VALUE (null_symbol, "signature", null_pointer_node);
2832 FINISH_RECORD_CONSTRUCTOR (null_symbol);
2833 TREE_CONSTANT (null_symbol) = 1;
2834 TREE_INVARIANT (null_symbol) = 1;
2835 list = tree_cons (NULL_TREE, null_symbol, list);
2837 /* Put the list in the right order and make it a constructor. */
2838 list = nreverse (list);
2839 table = build_constructor_from_list (symbols_array_type, list);
2841 /* Make it the initial value for otable_syms and emit the decl. */
2842 DECL_INITIAL (the_syms_decl) = table;
2843 DECL_ARTIFICIAL (the_syms_decl) = 1;
2844 DECL_IGNORED_P (the_syms_decl) = 1;
2845 rest_of_decl_compilation (the_syms_decl, 1, 0);
2847 /* Now that its size is known, redefine the table as an
2848 uninitialized static array of INDEX + 1 elements. The extra entry
2849 is used by the runtime to track whether the table has been
2850 initialized. */
2851 table_size
2852 = build_index_type (build_int_cst (NULL_TREE, index * element_size + 1));
2853 the_array_type = build_array_type (the_array_element_type, table_size);
2854 the_table = build_decl (VAR_DECL, name, the_array_type);
2855 TREE_STATIC (the_table) = 1;
2856 TREE_READONLY (the_table) = 1;
2857 rest_of_decl_compilation (the_table, 1, 0);
2859 return the_table;
2862 /* Make an entry for the catch_classes list. */
2863 tree
2864 make_catch_class_record (tree catch_class, tree classname)
2866 tree entry;
2867 tree type = TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (output_class)));
2868 START_RECORD_CONSTRUCTOR (entry, type);
2869 PUSH_FIELD_VALUE (entry, "address", catch_class);
2870 PUSH_FIELD_VALUE (entry, "classname", classname);
2871 FINISH_RECORD_CONSTRUCTOR (entry);
2872 return entry;
2876 /* Generate the list of Throwable classes that are caught by exception
2877 handlers in this class. */
2878 tree
2879 emit_catch_table (tree this_class)
2881 tree table, table_size, array_type;
2882 TYPE_CATCH_CLASSES (this_class) =
2883 tree_cons (NULL,
2884 make_catch_class_record (null_pointer_node, null_pointer_node),
2885 TYPE_CATCH_CLASSES (this_class));
2886 TYPE_CATCH_CLASSES (this_class) = nreverse (TYPE_CATCH_CLASSES (this_class));
2887 TYPE_CATCH_CLASSES (this_class) =
2888 tree_cons (NULL,
2889 make_catch_class_record (null_pointer_node, null_pointer_node),
2890 TYPE_CATCH_CLASSES (this_class));
2891 table_size = build_index_type
2892 (build_int_cst (NULL_TREE,
2893 list_length (TYPE_CATCH_CLASSES (this_class))));
2894 array_type
2895 = build_array_type (TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (this_class))),
2896 table_size);
2897 table =
2898 build_decl (VAR_DECL, DECL_NAME (TYPE_CTABLE_DECL (this_class)), array_type);
2899 DECL_INITIAL (table) =
2900 build_constructor_from_list (array_type, TYPE_CATCH_CLASSES (this_class));
2901 TREE_STATIC (table) = 1;
2902 TREE_READONLY (table) = 1;
2903 DECL_IGNORED_P (table) = 1;
2904 rest_of_decl_compilation (table, 1, 0);
2905 return table;
2908 /* Given a type, return the signature used by
2909 _Jv_FindClassFromSignature() in libgcj. This isn't exactly the
2910 same as build_java_signature() because we want the canonical array
2911 type. */
2913 static tree
2914 build_signature_for_libgcj (tree type)
2916 tree sig, ref;
2918 sig = build_java_signature (type);
2919 ref = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
2920 IDENTIFIER_LENGTH (sig)));
2921 return ref;
2924 /* Add an entry to the type assertion table. Callback used during hashtable
2925 traversal. */
2927 static int
2928 add_assertion_table_entry (void **htab_entry, void *ptr)
2930 tree entry;
2931 tree code_val, op1_utf8, op2_utf8;
2932 tree *list = (tree *) ptr;
2933 type_assertion *as = (type_assertion *) *htab_entry;
2935 code_val = build_int_cst (NULL_TREE, as->assertion_code);
2937 if (as->op1 == NULL_TREE)
2938 op1_utf8 = null_pointer_node;
2939 else
2940 op1_utf8 = build_signature_for_libgcj (as->op1);
2942 if (as->op2 == NULL_TREE)
2943 op2_utf8 = null_pointer_node;
2944 else
2945 op2_utf8 = build_signature_for_libgcj (as->op2);
2947 START_RECORD_CONSTRUCTOR (entry, assertion_entry_type);
2948 PUSH_FIELD_VALUE (entry, "assertion_code", code_val);
2949 PUSH_FIELD_VALUE (entry, "op1", op1_utf8);
2950 PUSH_FIELD_VALUE (entry, "op2", op2_utf8);
2951 FINISH_RECORD_CONSTRUCTOR (entry);
2953 *list = tree_cons (NULL_TREE, entry, *list);
2954 return true;
2957 /* Generate the type assertion table for CLASS, and return its DECL. */
2959 static tree
2960 emit_assertion_table (tree class)
2962 tree null_entry, ctor, table_decl;
2963 tree list = NULL_TREE;
2964 htab_t assertions_htab = TYPE_ASSERTIONS (class);
2966 /* Iterate through the hash table. */
2967 htab_traverse (assertions_htab, add_assertion_table_entry, &list);
2969 /* Finish with a null entry. */
2970 START_RECORD_CONSTRUCTOR (null_entry, assertion_entry_type);
2971 PUSH_FIELD_VALUE (null_entry, "assertion_code", integer_zero_node);
2972 PUSH_FIELD_VALUE (null_entry, "op1", null_pointer_node);
2973 PUSH_FIELD_VALUE (null_entry, "op2", null_pointer_node);
2974 FINISH_RECORD_CONSTRUCTOR (null_entry);
2976 list = tree_cons (NULL_TREE, null_entry, list);
2978 /* Put the list in the right order and make it a constructor. */
2979 list = nreverse (list);
2980 ctor = build_constructor_from_list (assertion_table_type, list);
2982 table_decl = build_decl (VAR_DECL, mangled_classname ("_type_assert_", class),
2983 assertion_table_type);
2985 TREE_STATIC (table_decl) = 1;
2986 TREE_READONLY (table_decl) = 1;
2987 TREE_CONSTANT (table_decl) = 1;
2988 DECL_IGNORED_P (table_decl) = 1;
2990 DECL_INITIAL (table_decl) = ctor;
2991 DECL_ARTIFICIAL (table_decl) = 1;
2992 rest_of_decl_compilation (table_decl, 1, 0);
2994 return table_decl;
2997 void
2998 init_class_processing (void)
3000 fields_ident = get_identifier ("fields");
3001 info_ident = get_identifier ("info");
3003 gcc_obstack_init (&temporary_obstack);
3006 static hashval_t java_treetreehash_hash (const void *);
3007 static int java_treetreehash_compare (const void *, const void *);
3009 /* A hash table mapping trees to trees. Used generally. */
3011 #define JAVA_TREEHASHHASH_H(t) (htab_hash_pointer (t))
3013 static hashval_t
3014 java_treetreehash_hash (const void *k_p)
3016 struct treetreehash_entry *k = (struct treetreehash_entry *) k_p;
3017 return JAVA_TREEHASHHASH_H (k->key);
3020 static int
3021 java_treetreehash_compare (const void * k1_p, const void * k2_p)
3023 struct treetreehash_entry * k1 = (struct treetreehash_entry *) k1_p;
3024 tree k2 = (tree) k2_p;
3025 return (k1->key == k2);
3028 tree
3029 java_treetreehash_find (htab_t ht, tree t)
3031 struct treetreehash_entry *e;
3032 hashval_t hv = JAVA_TREEHASHHASH_H (t);
3033 e = htab_find_with_hash (ht, t, hv);
3034 if (e == NULL)
3035 return NULL;
3036 else
3037 return e->value;
3040 tree *
3041 java_treetreehash_new (htab_t ht, tree t)
3043 void **e;
3044 struct treetreehash_entry *tthe;
3045 hashval_t hv = JAVA_TREEHASHHASH_H (t);
3047 e = htab_find_slot_with_hash (ht, t, hv, INSERT);
3048 if (*e == NULL)
3050 tthe = (*ht->alloc_f) (1, sizeof (*tthe));
3051 tthe->key = t;
3052 *e = tthe;
3054 else
3055 tthe = (struct treetreehash_entry *) *e;
3056 return &tthe->value;
3059 htab_t
3060 java_treetreehash_create (size_t size, int gc)
3062 if (gc)
3063 return htab_create_ggc (size, java_treetreehash_hash,
3064 java_treetreehash_compare, NULL);
3065 else
3066 return htab_create_alloc (size, java_treetreehash_hash,
3067 java_treetreehash_compare, free, xcalloc, free);
3070 /* Break down qualified IDENTIFIER into package and class-name components.
3071 For example, given SOURCE "pkg.foo.Bar", LEFT will be set to
3072 "pkg.foo", and RIGHT to "Bar". */
3075 split_qualified_name (tree *left, tree *right, tree source)
3077 char *p, *base;
3078 int l = IDENTIFIER_LENGTH (source);
3080 base = alloca (l + 1);
3081 memcpy (base, IDENTIFIER_POINTER (source), l + 1);
3083 /* Breakdown NAME into REMAINDER . IDENTIFIER. */
3084 p = base + l - 1;
3085 while (*p != '.' && p != base)
3086 p--;
3088 /* We didn't find a '.'. Return an error. */
3089 if (p == base)
3090 return 1;
3092 *p = '\0';
3093 if (right)
3094 *right = get_identifier (p+1);
3095 *left = get_identifier (base);
3097 return 0;
3100 /* Given two classes (TYPE_DECL) or class names (IDENTIFIER), return TRUE
3101 if the classes are from the same package. */
3104 in_same_package (tree name1, tree name2)
3106 tree tmp;
3107 tree pkg1;
3108 tree pkg2;
3110 if (TREE_CODE (name1) == TYPE_DECL)
3111 name1 = DECL_NAME (name1);
3112 if (TREE_CODE (name2) == TYPE_DECL)
3113 name2 = DECL_NAME (name2);
3115 if (QUALIFIED_P (name1) != QUALIFIED_P (name2))
3116 /* One in empty package. */
3117 return 0;
3119 if (QUALIFIED_P (name1) == 0 && QUALIFIED_P (name2) == 0)
3120 /* Both in empty package. */
3121 return 1;
3123 split_qualified_name (&pkg1, &tmp, name1);
3124 split_qualified_name (&pkg2, &tmp, name2);
3126 return (pkg1 == pkg2);
3129 #include "gt-java-class.h"