1 /* Functions related to building classes and their related objects.
2 Copyright (C) 1996-2014 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>.
20 Java and all Java-based marks are trademarks or registered trademarks
21 of Sun Microsystems, Inc. in the United States and other countries.
22 The Free Software Foundation is independent of Sun Microsystems, Inc. */
24 /* Written by Per Bothner <bothner@cygnus.com> */
28 #include "coretypes.h"
30 #include "stringpool.h"
31 #include "stor-layout.h"
34 #include "java-tree.h"
37 #include "diagnostic-core.h"
39 #include "output.h" /* for switch_to_section and get_section */
46 #include "hard-reg-set.h"
52 #include "plugin-api.h"
55 #include "tree-iterator.h"
58 static tree
make_method_value (tree
);
59 static tree
build_java_method_type (tree
, tree
, int);
60 static int32
hashUtf8String (const char *, int);
61 static tree
make_field_value (tree
);
62 static tree
get_dispatch_vector (tree
);
63 static tree
get_dispatch_table (tree
, tree
);
64 static int supers_all_compiled (tree type
);
65 static tree
maybe_layout_super_class (tree
, tree
);
66 static void add_miranda_methods (tree
, tree
);
67 static int assume_compiled (const char *);
68 static tree
build_symbol_entry (tree
, tree
);
69 static tree
emit_assertion_table (tree
);
70 static void register_class (void);
72 struct obstack temporary_obstack
;
74 static const char *cyclic_inheritance_report
;
76 /* The compiler generates different code depending on whether or not
77 it can assume certain classes have been compiled down to native
78 code or not. The compiler options -fassume-compiled= and
79 -fno-assume-compiled= are used to create a tree of
80 class_flag_node objects. This tree is queried to determine if
81 a class is assume to be compiled or not. Each node in the tree
82 represents either a package or a specific class. */
84 typedef struct class_flag_node_struct
86 /* The class or package name. */
89 /* Nonzero if this represents an exclusion. */
92 /* Pointers to other nodes in the tree. */
93 struct class_flag_node_struct
*parent
;
94 struct class_flag_node_struct
*sibling
;
95 struct class_flag_node_struct
*child
;
98 static class_flag_node
*find_class_flag_node (class_flag_node
*, const char *);
99 static void add_class_flag (class_flag_node
**, const char *, int);
101 /* This is the root of the include/exclude tree. */
103 static class_flag_node
*assume_compiled_tree
;
105 static class_flag_node
*enable_assert_tree
;
107 static GTY(()) tree class_roots
[4];
108 #define fields_ident class_roots[0] /* get_identifier ("fields") */
109 #define info_ident class_roots[1] /* get_identifier ("info") */
110 #define class_list class_roots[2]
111 #define class_dtable_decl class_roots[3]
113 static GTY(()) vec
<tree
, va_gc
> *registered_class
;
115 /* A tree that returns the address of the class$ of the class
116 currently being compiled. */
117 static GTY(()) tree this_classdollar
;
119 /* A list of static class fields. This is to emit proper debug
121 vec
<tree
, va_gc
> *pending_static_fields
;
123 /* Return the node that most closely represents the class whose name
124 is IDENT. Start the search from NODE (followed by its siblings).
125 Return NULL if an appropriate node does not exist. */
127 static class_flag_node
*
128 find_class_flag_node (class_flag_node
*node
, const char *ident
)
132 size_t node_ident_length
= strlen (node
->ident
);
134 /* node_ident_length is zero at the root of the tree. If the
135 identifiers are the same length, then we have matching
136 classes. Otherwise check if we've matched an enclosing
139 if (node_ident_length
== 0
140 || (strncmp (ident
, node
->ident
, node_ident_length
) == 0
141 && (ident
[node_ident_length
] == '\0'
142 || ident
[node_ident_length
] == '.')))
144 /* We've found a match, however, there might be a more
147 class_flag_node
*found
= find_class_flag_node (node
->child
, ident
);
154 /* No match yet. Continue through the sibling list. */
155 node
= node
->sibling
;
158 /* No match at all in this tree. */
163 add_class_flag (class_flag_node
**rootp
, const char *ident
, int value
)
165 class_flag_node
*root
= *rootp
;
166 class_flag_node
*parent
, *node
;
168 /* Create the root of the tree if it doesn't exist yet. */
172 root
= XNEW (class_flag_node
);
175 root
->sibling
= NULL
;
181 /* Calling the function with the empty string means we're setting
182 value for the root of the hierarchy. */
190 /* Find the parent node for this new node. PARENT will either be a
191 class or a package name. Adjust PARENT accordingly. */
193 parent
= find_class_flag_node (root
, ident
);
194 if (strcmp (ident
, parent
->ident
) == 0)
195 parent
->value
= value
;
198 /* Insert new node into the tree. */
199 node
= XNEW (class_flag_node
);
201 node
->ident
= xstrdup (ident
);
205 node
->parent
= parent
;
206 node
->sibling
= parent
->child
;
207 parent
->child
= node
;
211 /* Add a new IDENT to the include/exclude tree. It's an exclusion
212 if EXCLUDEP is nonzero. */
215 add_assume_compiled (const char *ident
, int excludep
)
217 add_class_flag (&assume_compiled_tree
, ident
, excludep
);
220 /* The default value returned by enable_assertions. */
222 #define DEFAULT_ENABLE_ASSERT (optimize == 0)
224 /* Enter IDENT (a class or package name) into the enable-assertions table.
225 VALUE is true to enable and false to disable. */
228 add_enable_assert (const char *ident
, int value
)
230 if (enable_assert_tree
== NULL
)
231 add_class_flag (&enable_assert_tree
, "", DEFAULT_ENABLE_ASSERT
);
232 add_class_flag (&enable_assert_tree
, ident
, value
);
235 /* Returns nonzero if IDENT is the name of a class that the compiler
236 should assume has been compiled to object code. */
239 assume_compiled (const char *ident
)
244 if (NULL
== assume_compiled_tree
)
247 i
= find_class_flag_node (assume_compiled_tree
, ident
);
254 /* Return true if we should generate code to check assertions within KLASS. */
257 enable_assertions (tree klass
)
259 /* Check if command-line specifies whether we should check assertions. */
261 if (klass
!= NULL_TREE
&& DECL_NAME (klass
) && enable_assert_tree
!= NULL
)
263 const char *ident
= IDENTIFIER_POINTER (DECL_NAME (klass
));
264 class_flag_node
*node
265 = find_class_flag_node (enable_assert_tree
, ident
);
269 /* The default is to enable assertions if generating class files,
270 or not optimizing. */
271 return DEFAULT_ENABLE_ASSERT
;
274 /* Return an IDENTIFIER_NODE the same as (OLD_NAME, OLD_LENGTH).
275 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
276 Also, PREFIX is prepended, and SUFFIX is appended. */
279 ident_subst (const char* old_name
,
286 int prefix_len
= strlen (prefix
);
287 int suffix_len
= strlen (suffix
);
288 int i
= prefix_len
+ old_length
+ suffix_len
+ 1;
289 char *buffer
= (char *) alloca (i
);
291 strcpy (buffer
, prefix
);
292 for (i
= 0; i
< old_length
; i
++)
294 char ch
= old_name
[i
];
297 buffer
[prefix_len
+ i
] = ch
;
299 strcpy (buffer
+ prefix_len
+ old_length
, suffix
);
300 return get_identifier (buffer
);
303 /* Return an IDENTIFIER_NODE the same as OLD_ID,
304 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
305 Also, PREFIX is prepended, and SUFFIX is appended. */
308 identifier_subst (const tree old_id
,
314 return ident_subst (IDENTIFIER_POINTER (old_id
), IDENTIFIER_LENGTH (old_id
),
315 prefix
, old_char
, new_char
, suffix
);
318 /* Generate a valid C identifier from the name of the class TYPE,
319 prefixed by PREFIX. */
322 mangled_classname (const char *prefix
, tree type
)
325 tree ident
= TYPE_NAME (type
);
326 if (TREE_CODE (ident
) != IDENTIFIER_NODE
)
327 ident
= DECL_NAME (ident
);
328 result
= identifier_subst (ident
, prefix
, '.', '_', "");
330 /* Replace any characters that aren't in the set [0-9a-zA-Z_$] with
331 "_0xXX". Class names containing such chracters are uncommon, but
332 they do sometimes occur in class files. Without this check,
333 these names cause assembly errors.
335 There is a possibility that a real class name could conflict with
336 the identifier we generate, but it is unlikely and will
337 immediately be detected as an assembler error. At some point we
338 should do something more elaborate (perhaps using the full
339 unicode mangling scheme) in order to prevent such a conflict. */
342 const int len
= IDENTIFIER_LENGTH (result
);
343 const char *p
= IDENTIFIER_POINTER (result
);
344 int illegal_chars
= 0;
346 /* Make two passes over the identifier. The first pass is merely
347 to count illegal characters; we need to do this in order to
348 allocate a buffer. */
349 for (i
= 0; i
< len
; i
++)
352 illegal_chars
+= (! ISALNUM (c
) && c
!= '_' && c
!= '$');
355 /* And the second pass, which is rarely executed, does the
357 if (illegal_chars
!= 0)
359 char *buffer
= (char *) alloca (illegal_chars
* 4 + len
+ 1);
362 for (i
= 0, j
= 0; i
< len
; i
++)
365 if (! ISALNUM (c
) && c
!= '_' && c
!= '$')
368 sprintf (&buffer
[j
], "0x%02x", c
);
376 result
= get_identifier (buffer
);
387 type
= make_node (RECORD_TYPE
);
388 /* Unfortunately we must create the binfo here, so that class
390 TYPE_BINFO (type
) = make_tree_binfo (0);
391 MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC (type
);
392 TYPE_CATCH_CLASSES (type
) = NULL
;
393 /* Push a dummy entry; we can't call make_catch_class_record here
394 because other infrastructure may not be set up yet. We'll come
395 back and fill it in later once said infrastructure is
397 CONSTRUCTOR_APPEND_ELT (TYPE_CATCH_CLASSES (type
), NULL_TREE
, NULL_TREE
);
402 /* Given a fully-qualified classname in NAME (whose length is NAME_LENGTH),
403 and where each of the constituents is separated by '/',
404 return a corresponding IDENTIFIER_NODE, except using '.' as separator. */
407 unmangle_classname (const char *name
, int name_length
)
409 tree to_return
= ident_subst (name
, name_length
, "", '/', '.', "");
410 /* It's not sufficient to compare to_return and get_identifier
411 (name) to determine whether to_return is qualified. There are
412 cases in signature analysis where name will be stripped of a
414 name
= IDENTIFIER_POINTER (to_return
);
418 QUALIFIED_P (to_return
) = 1;
425 #define GEN_TABLE(TABLE, NAME, TABLE_TYPE, TYPE) \
428 const char *type_name = IDENTIFIER_POINTER (mangled_classname ("", TYPE)); \
429 char *buf = (char *) alloca (strlen (type_name) \
430 + strlen (#NAME "_syms_") + 1); \
433 sprintf (buf, #NAME "_%s", type_name); \
434 TYPE_## TABLE ##_DECL (type) = decl = \
435 build_decl (input_location, VAR_DECL, get_identifier (buf), TABLE_TYPE); \
436 DECL_EXTERNAL (decl) = 1; \
437 TREE_STATIC (decl) = 1; \
438 TREE_READONLY (decl) = 1; \
439 TREE_CONSTANT (decl) = 1; \
440 DECL_IGNORED_P (decl) = 1; \
441 /* Mark the table as belonging to this class. */ \
443 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl); \
444 DECL_OWNER (decl) = TYPE; \
445 sprintf (buf, #NAME "_syms_%s", type_name); \
446 TYPE_## TABLE ##_SYMS_DECL (TYPE) = \
447 build_decl (input_location, VAR_DECL, get_identifier (buf), symbols_array_type); \
448 TREE_STATIC (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
449 TREE_CONSTANT (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
450 DECL_IGNORED_P (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
454 /* Given a class, create the DECLs for all its associated indirect
457 gen_indirect_dispatch_tables (tree type
)
459 const char *type_name
= IDENTIFIER_POINTER (mangled_classname ("", type
));
462 char *buf
= (char *) alloca (strlen (type_name
)
463 + strlen ("_catch_classes_") + 1);
464 tree catch_class_type
= make_node (RECORD_TYPE
);
466 sprintf (buf
, "_catch_classes_%s", type_name
);
467 PUSH_FIELD (input_location
,
468 catch_class_type
, field
, "address", utf8const_ptr_type
);
469 PUSH_FIELD (input_location
,
470 catch_class_type
, field
, "classname", ptr_type_node
);
471 FINISH_RECORD (catch_class_type
);
473 TYPE_CTABLE_DECL (type
)
474 = build_decl (input_location
, VAR_DECL
, get_identifier (buf
),
475 build_array_type (catch_class_type
, 0));
476 DECL_EXTERNAL (TYPE_CTABLE_DECL (type
)) = 1;
477 TREE_STATIC (TYPE_CTABLE_DECL (type
)) = 1;
478 TREE_READONLY (TYPE_CTABLE_DECL (type
)) = 1;
479 TREE_CONSTANT (TYPE_CTABLE_DECL (type
)) = 1;
480 DECL_IGNORED_P (TYPE_CTABLE_DECL (type
)) = 1;
481 pushdecl (TYPE_CTABLE_DECL (type
));
484 if (flag_indirect_dispatch
)
486 GEN_TABLE (ATABLE
, _atable
, atable_type
, type
);
487 GEN_TABLE (OTABLE
, _otable
, otable_type
, type
);
488 GEN_TABLE (ITABLE
, _itable
, itable_type
, type
);
495 push_class (tree class_type
, tree class_name
)
497 tree decl
, signature
;
498 location_t saved_loc
= input_location
;
499 CLASS_P (class_type
) = 1;
500 decl
= build_decl (input_location
, TYPE_DECL
, class_name
, class_type
);
501 TYPE_DECL_SUPPRESS_DEBUG (decl
) = 1;
503 /* dbxout needs a DECL_SIZE if in gstabs mode */
504 DECL_SIZE (decl
) = integer_zero_node
;
506 input_location
= saved_loc
;
507 signature
= identifier_subst (class_name
, "L", '.', '/', ";");
508 IDENTIFIER_SIGNATURE_TYPE (signature
) = build_pointer_type (class_type
);
510 /* Setting DECL_ARTIFICIAL forces dbxout.c to specific the type is
511 both a typedef and in the struct name-space. We may want to re-visit
512 this later, but for now it reduces the changes needed for gdb. */
513 DECL_ARTIFICIAL (decl
) = 1;
515 pushdecl_top_level (decl
);
520 /* Finds the (global) class named NAME. Creates the class if not found.
521 Also creates associated TYPE_DECL.
522 Does not check if the class actually exists, load the class,
523 fill in field or methods, or do layout_type. */
526 lookup_class (tree name
)
528 tree decl
= IDENTIFIER_CLASS_VALUE (name
);
529 if (decl
== NULL_TREE
)
530 decl
= push_class (make_class (), name
);
531 return TREE_TYPE (decl
);
535 set_super_info (int access_flags
, tree this_class
,
536 tree super_class
, int interfaces_count
)
538 int total_supers
= interfaces_count
;
539 tree class_decl
= TYPE_NAME (this_class
);
545 TYPE_BINFO (this_class
) = make_tree_binfo (total_supers
);
546 TYPE_VFIELD (this_class
) = TYPE_VFIELD (object_type_node
);
549 tree super_binfo
= make_tree_binfo (0);
550 BINFO_TYPE (super_binfo
) = super_class
;
551 BINFO_OFFSET (super_binfo
) = integer_zero_node
;
552 BINFO_BASE_APPEND (TYPE_BINFO (this_class
), super_binfo
);
553 CLASS_HAS_SUPER_FLAG (TYPE_BINFO (this_class
)) = 1;
556 set_class_decl_access_flags (access_flags
, class_decl
);
560 set_class_decl_access_flags (int access_flags
, tree class_decl
)
562 if (access_flags
& ACC_PUBLIC
) CLASS_PUBLIC (class_decl
) = 1;
563 if (access_flags
& ACC_FINAL
) CLASS_FINAL (class_decl
) = 1;
564 if (access_flags
& ACC_SUPER
) CLASS_SUPER (class_decl
) = 1;
565 if (access_flags
& ACC_INTERFACE
) CLASS_INTERFACE (class_decl
) = 1;
566 if (access_flags
& ACC_ABSTRACT
) CLASS_ABSTRACT (class_decl
) = 1;
567 if (access_flags
& ACC_STATIC
) CLASS_STATIC (class_decl
) = 1;
568 if (access_flags
& ACC_PRIVATE
) CLASS_PRIVATE (class_decl
) = 1;
569 if (access_flags
& ACC_PROTECTED
) CLASS_PROTECTED (class_decl
) = 1;
570 if (access_flags
& ACC_STRICT
) CLASS_STRICTFP (class_decl
) = 1;
571 if (access_flags
& ACC_ENUM
) CLASS_ENUM (class_decl
) = 1;
572 if (access_flags
& ACC_SYNTHETIC
) CLASS_SYNTHETIC (class_decl
) = 1;
573 if (access_flags
& ACC_ANNOTATION
) CLASS_ANNOTATION (class_decl
) = 1;
576 /* Return length of inheritance chain of CLAS, where java.lang.Object is 0,
577 direct sub-classes of Object are 1, and so on. */
580 class_depth (tree clas
)
583 if (! CLASS_LOADED_P (clas
))
584 load_class (clas
, 1);
585 if (TYPE_SIZE (clas
) == error_mark_node
)
587 while (clas
!= object_type_node
)
590 clas
= BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (clas
), 0));
595 /* Return true iff TYPE2 is an interface that extends interface TYPE1 */
598 interface_of_p (tree type1
, tree type2
)
601 tree binfo
, base_binfo
;
603 if (! TYPE_BINFO (type2
))
606 for (binfo
= TYPE_BINFO (type2
), i
= 0;
607 BINFO_BASE_ITERATE (binfo
, i
, base_binfo
); i
++)
608 if (BINFO_TYPE (base_binfo
) == type1
)
611 for (binfo
= TYPE_BINFO (type2
), i
= 0;
612 BINFO_BASE_ITERATE (binfo
, i
, base_binfo
); i
++) /* */
613 if (BINFO_TYPE (base_binfo
)
614 && interface_of_p (type1
, BINFO_TYPE (base_binfo
)))
620 /* Return true iff TYPE1 inherits from TYPE2. */
623 inherits_from_p (tree type1
, tree type2
)
625 while (type1
!= NULL_TREE
&& TREE_CODE (type1
) == RECORD_TYPE
)
630 if (! CLASS_LOADED_P (type1
))
631 load_class (type1
, 1);
633 type1
= maybe_layout_super_class (CLASSTYPE_SUPER (type1
), type1
);
638 /* Return a 1 iff TYPE1 is an enclosing context for TYPE2 */
641 enclosing_context_p (tree type1
, tree type2
)
643 if (!INNER_CLASS_TYPE_P (type2
))
646 for (type2
= TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2
)));
648 type2
= (INNER_CLASS_TYPE_P (type2
) ?
649 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2
))) : NULL_TREE
))
659 /* Return 1 iff TYPE1 and TYPE2 share a common enclosing class, regardless of
663 common_enclosing_context_p (tree type1
, tree type2
)
668 for (current
= type2
; current
;
669 current
= (INNER_CLASS_TYPE_P (current
) ?
670 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current
))) :
672 if (type1
== current
)
675 if (INNER_CLASS_TYPE_P (type1
))
676 type1
= TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1
)));
683 /* Return 1 iff there exists a common enclosing "this" between TYPE1
684 and TYPE2, without crossing any static context. */
687 common_enclosing_instance_p (tree type1
, tree type2
)
689 if (!PURE_INNER_CLASS_TYPE_P (type1
) || !PURE_INNER_CLASS_TYPE_P (type2
))
692 for (type1
= TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1
))); type1
;
693 type1
= (PURE_INNER_CLASS_TYPE_P (type1
) ?
694 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1
))) : NULL_TREE
))
697 for (current
= TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2
))); current
;
698 current
= (PURE_INNER_CLASS_TYPE_P (current
) ?
699 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current
))) :
701 if (type1
== current
)
707 /* Add INTERFACE_CLASS to THIS_CLASS iff INTERFACE_CLASS can't be
708 found in THIS_CLASS. Returns NULL_TREE upon success, INTERFACE_CLASS
709 if attempt is made to add it twice. */
712 maybe_add_interface (tree this_class
, tree interface_class
)
714 tree binfo
, base_binfo
;
717 for (binfo
= TYPE_BINFO (this_class
), i
= 0;
718 BINFO_BASE_ITERATE (binfo
, i
, base_binfo
); i
++)
719 if (BINFO_TYPE (base_binfo
) == interface_class
)
720 return interface_class
;
721 add_interface (this_class
, interface_class
);
725 /* Add the INTERFACE_CLASS as one of the interfaces of THIS_CLASS. */
728 add_interface (tree this_class
, tree interface_class
)
730 tree interface_binfo
= make_tree_binfo (0);
732 BINFO_TYPE (interface_binfo
) = interface_class
;
733 BINFO_OFFSET (interface_binfo
) = integer_zero_node
;
734 BINFO_VPTR_FIELD (interface_binfo
) = integer_zero_node
;
735 BINFO_VIRTUAL_P (interface_binfo
) = 1;
737 BINFO_BASE_APPEND (TYPE_BINFO (this_class
), interface_binfo
);
741 build_java_method_type (tree fntype
, tree this_class
, int access_flags
)
743 if (access_flags
& ACC_STATIC
)
745 fntype
= build_method_type (this_class
, fntype
);
747 /* We know that arg 1 of every nonstatic method is non-null; tell
749 TYPE_ATTRIBUTES (fntype
) = (tree_cons
750 (get_identifier ("nonnull"),
751 tree_cons (NULL_TREE
,
752 build_int_cst (NULL_TREE
, 1),
754 TYPE_ATTRIBUTES (fntype
)));
759 java_hide_decl (tree decl ATTRIBUTE_UNUSED
)
761 #ifdef HAVE_GAS_HIDDEN
762 DECL_VISIBILITY (decl
) = VISIBILITY_HIDDEN
;
763 DECL_VISIBILITY_SPECIFIED (decl
) = 1;
768 add_method_1 (tree this_class
, int access_flags
, tree name
, tree function_type
)
770 tree method_type
, fndecl
;
772 method_type
= build_java_method_type (function_type
,
773 this_class
, access_flags
);
775 fndecl
= build_decl (input_location
, FUNCTION_DECL
, name
, method_type
);
776 DECL_CONTEXT (fndecl
) = this_class
;
778 DECL_LANG_SPECIFIC (fndecl
) = ggc_cleared_alloc
<struct lang_decl
> ();
779 DECL_LANG_SPECIFIC (fndecl
)->desc
= LANG_DECL_FUNC
;
781 /* Initialize the static initializer test table. */
783 DECL_FUNCTION_INIT_TEST_TABLE (fndecl
) = java_treetreehash_create (10);
785 /* Initialize the initialized (static) class table. */
786 if (access_flags
& ACC_STATIC
)
787 DECL_FUNCTION_INITIALIZED_CLASS_TABLE (fndecl
) =
788 hash_table
<ict_hasher
>::create_ggc (50);
790 DECL_CHAIN (fndecl
) = TYPE_METHODS (this_class
);
791 TYPE_METHODS (this_class
) = fndecl
;
793 /* If pointers to member functions use the least significant bit to
794 indicate whether a function is virtual, ensure a pointer
795 to this function will have that bit clear. */
796 if (TARGET_PTRMEMFUNC_VBIT_LOCATION
== ptrmemfunc_vbit_in_pfn
797 && !(access_flags
& ACC_STATIC
)
798 && DECL_ALIGN (fndecl
) < 2 * BITS_PER_UNIT
)
799 DECL_ALIGN (fndecl
) = 2 * BITS_PER_UNIT
;
801 /* Notice that this is a finalizer and update the class type
802 accordingly. This is used to optimize instance allocation. */
803 if (name
== finalize_identifier_node
804 && TREE_TYPE (function_type
) == void_type_node
805 && TREE_VALUE (TYPE_ARG_TYPES (function_type
)) == void_type_node
)
806 HAS_FINALIZER_P (this_class
) = 1;
808 if (access_flags
& ACC_PUBLIC
) METHOD_PUBLIC (fndecl
) = 1;
809 if (access_flags
& ACC_PROTECTED
) METHOD_PROTECTED (fndecl
) = 1;
810 if (access_flags
& ACC_PRIVATE
)
811 METHOD_PRIVATE (fndecl
) = 1;
812 if (access_flags
& ACC_NATIVE
)
814 METHOD_NATIVE (fndecl
) = 1;
815 DECL_EXTERNAL (fndecl
) = 1;
818 /* FNDECL is external unless we are compiling it into this object
820 DECL_EXTERNAL (fndecl
) = CLASS_FROM_CURRENTLY_COMPILED_P (this_class
) == 0;
821 if (access_flags
& ACC_STATIC
)
822 METHOD_STATIC (fndecl
) = 1;
823 if (access_flags
& ACC_FINAL
)
824 METHOD_FINAL (fndecl
) = 1;
825 if (access_flags
& ACC_SYNCHRONIZED
) METHOD_SYNCHRONIZED (fndecl
) = 1;
826 if (access_flags
& ACC_ABSTRACT
) METHOD_ABSTRACT (fndecl
) = 1;
827 if (access_flags
& ACC_STRICT
) METHOD_STRICTFP (fndecl
) = 1;
828 if (access_flags
& ACC_SYNTHETIC
) DECL_ARTIFICIAL (fndecl
) = 1;
829 if (access_flags
& ACC_BRIDGE
) METHOD_BRIDGE (fndecl
) = 1;
830 if (access_flags
& ACC_VARARGS
) METHOD_VARARGS (fndecl
) = 1;
834 /* Add a method to THIS_CLASS.
835 The method's name is NAME.
836 Its signature (mangled type) is METHOD_SIG (an IDENTIFIER_NODE). */
839 add_method (tree this_class
, int access_flags
, tree name
, tree method_sig
)
841 tree function_type
, fndecl
;
842 const unsigned char *sig
843 = (const unsigned char *) IDENTIFIER_POINTER (method_sig
);
846 fatal_error ("bad method signature");
848 function_type
= get_type_from_signature (method_sig
);
849 fndecl
= add_method_1 (this_class
, access_flags
, name
, function_type
);
850 set_java_signature (TREE_TYPE (fndecl
), method_sig
);
855 add_field (tree klass
, tree name
, tree field_type
, int flags
)
857 int is_static
= (flags
& ACC_STATIC
) != 0;
859 field
= build_decl (input_location
,
860 is_static
? VAR_DECL
: FIELD_DECL
, name
, field_type
);
861 DECL_CHAIN (field
) = TYPE_FIELDS (klass
);
862 TYPE_FIELDS (klass
) = field
;
863 DECL_CONTEXT (field
) = klass
;
864 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field
);
866 if (flags
& ACC_PUBLIC
) FIELD_PUBLIC (field
) = 1;
867 if (flags
& ACC_PROTECTED
) FIELD_PROTECTED (field
) = 1;
868 if (flags
& ACC_PRIVATE
) FIELD_PRIVATE (field
) = 1;
869 if (flags
& ACC_FINAL
) FIELD_FINAL (field
) = 1;
870 if (flags
& ACC_VOLATILE
)
872 FIELD_VOLATILE (field
) = 1;
873 TREE_THIS_VOLATILE (field
) = 1;
875 if (flags
& ACC_TRANSIENT
) FIELD_TRANSIENT (field
) = 1;
876 if (flags
& ACC_ENUM
) FIELD_ENUM (field
) = 1;
877 if (flags
& ACC_SYNTHETIC
) FIELD_SYNTHETIC (field
) = 1;
880 FIELD_STATIC (field
) = 1;
881 /* Always make field externally visible. This is required so
882 that native methods can always access the field. */
883 TREE_PUBLIC (field
) = 1;
884 /* Hide everything that shouldn't be visible outside a DSO. */
885 if (flag_indirect_classes
886 || (FIELD_PRIVATE (field
)))
887 java_hide_decl (field
);
888 /* Considered external unless we are compiling it into this
890 DECL_EXTERNAL (field
) = (is_compiled_class (klass
) != 2);
891 if (!DECL_EXTERNAL (field
))
892 vec_safe_push (pending_static_fields
, field
);
898 /* Associate a constant value CONSTANT with VAR_DECL FIELD. */
901 set_constant_value (tree field
, tree constant
)
903 if (field
== NULL_TREE
)
904 warning (OPT_Wattributes
,
905 "misplaced ConstantValue attribute (not in any field)");
906 else if (DECL_INITIAL (field
) != NULL_TREE
)
907 warning (OPT_Wattributes
,
908 "duplicate ConstantValue attribute for field '%s'",
909 IDENTIFIER_POINTER (DECL_NAME (field
)));
912 DECL_INITIAL (field
) = constant
;
913 if (TREE_TYPE (constant
) != TREE_TYPE (field
)
914 && ! (TREE_TYPE (constant
) == int_type_node
915 && INTEGRAL_TYPE_P (TREE_TYPE (field
))
916 && TYPE_PRECISION (TREE_TYPE (field
)) <= 32)
917 && ! (TREE_TYPE (constant
) == utf8const_ptr_type
918 && TREE_TYPE (field
) == string_ptr_type_node
))
919 error ("ConstantValue attribute of field '%s' has wrong type",
920 IDENTIFIER_POINTER (DECL_NAME (field
)));
924 /* Calculate a hash value for a string encoded in Utf8 format.
925 * This returns the same hash value as specified for java.lang.String.hashCode.
929 hashUtf8String (const char *str
, int len
)
931 const unsigned char* ptr
= (const unsigned char*) str
;
932 const unsigned char *limit
= ptr
+ len
;
936 int ch
= UTF8_GET (ptr
, limit
);
937 /* Updated specification from
938 http://www.javasoft.com/docs/books/jls/clarify.html. */
939 hash
= (31 * hash
) + ch
;
945 build_utf8_ref (tree name
)
947 const char * name_ptr
= IDENTIFIER_POINTER (name
);
948 int name_len
= IDENTIFIER_LENGTH (name
), name_pad
;
950 tree ctype
, field
= NULL_TREE
, str_type
, cinit
, string
;
951 static int utf8_count
= 0;
953 tree ref
= IDENTIFIER_UTF8_REF (name
);
955 vec
<constructor_elt
, va_gc
> *v
= NULL
;
956 if (ref
!= NULL_TREE
)
959 ctype
= make_node (RECORD_TYPE
);
960 /* '\0' byte plus padding to utf8const_type's alignment. */
961 name_pad
= TYPE_ALIGN_UNIT (utf8const_type
)
962 - (name_len
& (TYPE_ALIGN_UNIT (utf8const_type
) - 1));
963 str_type
= build_prim_array_type (unsigned_byte_type_node
,
964 name_len
+ name_pad
);
965 PUSH_FIELD (input_location
, ctype
, field
, "hash", unsigned_short_type_node
);
966 PUSH_FIELD (input_location
,
967 ctype
, field
, "length", unsigned_short_type_node
);
968 PUSH_FIELD (input_location
, ctype
, field
, "data", str_type
);
969 FINISH_RECORD (ctype
);
970 START_RECORD_CONSTRUCTOR (v
, ctype
);
971 name_hash
= hashUtf8String (name_ptr
, name_len
) & 0xFFFF;
972 PUSH_FIELD_VALUE (v
, "hash", build_int_cst (NULL_TREE
, name_hash
));
973 PUSH_FIELD_VALUE (v
, "length", build_int_cst (NULL_TREE
, name_len
));
974 string
= build_string (name_len
, name_ptr
);
975 TREE_TYPE (string
) = str_type
;
976 PUSH_FIELD_VALUE (v
, "data", string
);
977 FINISH_RECORD_CONSTRUCTOR (cinit
, v
, ctype
);
978 TREE_CONSTANT (cinit
) = 1;
980 /* Generate a unique-enough identifier. */
981 sprintf(buf
, "_Utf%d", ++utf8_count
);
983 decl
= build_decl (input_location
,
984 VAR_DECL
, get_identifier (buf
), utf8const_type
);
985 TREE_STATIC (decl
) = 1;
986 DECL_ARTIFICIAL (decl
) = 1;
987 DECL_IGNORED_P (decl
) = 1;
988 TREE_READONLY (decl
) = 1;
989 TREE_THIS_VOLATILE (decl
) = 0;
990 DECL_INITIAL (decl
) = cinit
;
991 DECL_USER_ALIGN (decl
) = 1;
993 if (HAVE_GAS_SHF_MERGE
)
996 /* Ensure decl_size is a multiple of utf8const_type's alignment. */
997 decl_size
= name_len
+ 4 + name_pad
;
998 if (flag_merge_constants
&& decl_size
< 256)
1001 int flags
= (SECTION_OVERRIDE
1002 | SECTION_MERGE
| (SECTION_ENTSIZE
& decl_size
));
1003 sprintf (buf
, ".rodata.jutf8.%d", decl_size
);
1004 switch_to_section (get_section (buf
, flags
, NULL
));
1005 set_decl_section_name (decl
, buf
);
1009 layout_decl (decl
, 0);
1010 DECL_SIZE (decl
) = TYPE_SIZE (ctype
);
1011 DECL_SIZE_UNIT (decl
) = TYPE_SIZE_UNIT (ctype
);
1013 rest_of_decl_compilation (decl
, global_bindings_p (), 0);
1014 ref
= build1 (ADDR_EXPR
, utf8const_ptr_type
, decl
);
1015 IDENTIFIER_UTF8_REF (name
) = ref
;
1019 /* Like build_class_ref, but instead of a direct reference generate a
1020 pointer into the constant pool. */
1023 build_indirect_class_ref (tree type
)
1027 index
= alloc_class_constant (type
);
1028 cl
= build_ref_from_constant_pool (index
);
1029 return convert (promote_type (class_ptr_type
), cl
);
1033 build_static_class_ref (tree type
)
1035 tree decl_name
, decl
, ref
;
1037 if (TYPE_SIZE (type
) == error_mark_node
)
1038 return null_pointer_node
;
1039 decl_name
= identifier_subst (DECL_NAME (TYPE_NAME (type
)),
1040 "", '/', '/', ".class$$");
1041 decl
= IDENTIFIER_GLOBAL_VALUE (decl_name
);
1042 if (decl
== NULL_TREE
)
1044 decl
= build_decl (input_location
, VAR_DECL
, decl_name
, class_type_node
);
1045 TREE_STATIC (decl
) = 1;
1046 if (! flag_indirect_classes
)
1048 TREE_PUBLIC (decl
) = 1;
1049 if (CLASS_PRIVATE (TYPE_NAME (type
)))
1050 java_hide_decl (decl
);
1052 DECL_IGNORED_P (decl
) = 1;
1053 DECL_ARTIFICIAL (decl
) = 1;
1054 if (is_compiled_class (type
) == 1)
1055 DECL_EXTERNAL (decl
) = 1;
1056 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl
);
1057 DECL_CLASS_FIELD_P (decl
) = 1;
1058 DECL_CONTEXT (decl
) = type
;
1060 /* ??? We want to preserve the DECL_CONTEXT we set just above,
1061 that that means not calling pushdecl_top_level. */
1062 IDENTIFIER_GLOBAL_VALUE (decl_name
) = decl
;
1065 ref
= build1 (ADDR_EXPR
, class_ptr_type
, decl
);
1070 build_classdollar_field (tree type
)
1072 tree decl_name
= identifier_subst (DECL_NAME (TYPE_NAME (type
)),
1073 "", '/', '/', ".class$");
1074 tree decl
= IDENTIFIER_GLOBAL_VALUE (decl_name
);
1076 if (decl
== NULL_TREE
)
1079 = build_decl (input_location
,
1080 VAR_DECL
, decl_name
,
1081 (build_qualified_type
1083 (build_qualified_type (class_type_node
,
1086 TREE_STATIC (decl
) = 1;
1087 TREE_CONSTANT (decl
) = 1;
1088 TREE_READONLY (decl
) = 1;
1089 TREE_PUBLIC (decl
) = 1;
1090 java_hide_decl (decl
);
1091 DECL_IGNORED_P (decl
) = 1;
1092 DECL_ARTIFICIAL (decl
) = 1;
1093 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl
);
1094 IDENTIFIER_GLOBAL_VALUE (decl_name
) = decl
;
1095 DECL_CLASS_FIELD_P (decl
) = 1;
1096 DECL_CONTEXT (decl
) = type
;
1102 /* Create a local variable that holds the current class$. */
1105 cache_this_class_ref (tree fndecl
)
1109 tree classdollar_field
;
1110 if (flag_indirect_classes
)
1111 classdollar_field
= build_classdollar_field (output_class
);
1113 classdollar_field
= build_static_class_ref (output_class
);
1115 this_classdollar
= build_decl (input_location
,
1116 VAR_DECL
, NULL_TREE
,
1117 TREE_TYPE (classdollar_field
));
1119 java_add_local_var (this_classdollar
);
1120 java_add_stmt (build2 (MODIFY_EXPR
, TREE_TYPE (this_classdollar
),
1121 this_classdollar
, classdollar_field
));
1124 this_classdollar
= build_classdollar_field (output_class
);
1126 /* Prepend class initialization for static methods reachable from
1128 if (METHOD_STATIC (fndecl
)
1129 && (! METHOD_PRIVATE (fndecl
)
1130 || INNER_CLASS_P (DECL_CONTEXT (fndecl
)))
1131 && ! DECL_CLINIT_P (fndecl
)
1132 && ! CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (fndecl
))))
1134 tree init
= build_call_expr (soft_initclass_node
, 1,
1136 java_add_stmt (init
);
1140 /* Remove the reference to the local variable that holds the current
1144 uncache_this_class_ref (tree fndecl ATTRIBUTE_UNUSED
)
1146 this_classdollar
= build_classdollar_field (output_class
);
1149 /* Build a reference to the class TYPE.
1150 Also handles primitive types and array types. */
1153 build_class_ref (tree type
)
1155 int is_compiled
= is_compiled_class (type
);
1159 if (TREE_CODE (type
) == POINTER_TYPE
)
1160 type
= TREE_TYPE (type
);
1162 if (flag_indirect_dispatch
1163 && type
!= output_class
1164 && TREE_CODE (type
) == RECORD_TYPE
)
1165 return build_indirect_class_ref (type
);
1167 if (type
== output_class
&& flag_indirect_classes
)
1169 /* This can be NULL if we see a JNI stub before we see any
1171 if (! this_classdollar
)
1172 this_classdollar
= build_classdollar_field (output_class
);
1173 return this_classdollar
;
1176 if (TREE_CODE (type
) == RECORD_TYPE
)
1177 return build_static_class_ref (type
);
1183 decl_name
= TYPE_NAME (type
);
1184 if (TREE_CODE (decl_name
) == TYPE_DECL
)
1185 decl_name
= DECL_NAME (decl_name
);
1186 name
= IDENTIFIER_POINTER (decl_name
);
1187 if (strncmp (name
, "promoted_", 9) == 0)
1189 sprintf (buffer
, "_Jv_%sClass", name
);
1190 decl_name
= get_identifier (buffer
);
1191 decl
= IDENTIFIER_GLOBAL_VALUE (decl_name
);
1192 if (decl
== NULL_TREE
)
1194 decl
= build_decl (input_location
,
1195 VAR_DECL
, decl_name
, class_type_node
);
1196 TREE_STATIC (decl
) = 1;
1197 TREE_PUBLIC (decl
) = 1;
1198 DECL_EXTERNAL (decl
) = 1;
1199 DECL_ARTIFICIAL (decl
) = 1;
1200 pushdecl_top_level (decl
);
1204 ref
= build1 (ADDR_EXPR
, class_ptr_type
, decl
);
1208 return build_indirect_class_ref (type
);
1211 /* Create a local statically allocated variable that will hold a
1212 pointer to a static field. */
1215 build_fieldref_cache_entry (int index
, tree fdecl ATTRIBUTE_UNUSED
)
1217 tree decl
, decl_name
;
1218 const char *name
= IDENTIFIER_POINTER (mangled_classname ("_cpool_", output_class
));
1219 char *buf
= (char *) alloca (strlen (name
) + 20);
1220 sprintf (buf
, "%s_%d_ref", name
, index
);
1221 decl_name
= get_identifier (buf
);
1222 decl
= IDENTIFIER_GLOBAL_VALUE (decl_name
);
1223 if (decl
== NULL_TREE
)
1225 decl
= build_decl (input_location
,
1226 VAR_DECL
, decl_name
, ptr_type_node
);
1227 TREE_STATIC (decl
) = 1;
1228 TREE_PUBLIC (decl
) = 0;
1229 DECL_EXTERNAL (decl
) = 0;
1230 DECL_ARTIFICIAL (decl
) = 1;
1231 DECL_IGNORED_P (decl
) = 1;
1232 pushdecl_top_level (decl
);
1238 build_static_field_ref (tree fdecl
)
1240 tree fclass
= DECL_CONTEXT (fdecl
);
1241 int is_compiled
= is_compiled_class (fclass
);
1243 /* Allow static final fields to fold to a constant. When using
1244 -findirect-dispatch, we simply never do this folding if compiling
1245 from .class; in the .class file constants will be referred to via
1246 the constant pool. */
1247 if (!flag_indirect_dispatch
1249 || (FIELD_FINAL (fdecl
) && DECL_INITIAL (fdecl
) != NULL_TREE
1250 && (JSTRING_TYPE_P (TREE_TYPE (fdecl
))
1251 || JNUMERIC_TYPE_P (TREE_TYPE (fdecl
)))
1252 && TREE_CONSTANT (DECL_INITIAL (fdecl
)))))
1254 if (is_compiled
== 1)
1255 DECL_EXTERNAL (fdecl
) = 1;
1259 /* Generate a CONSTANT_FieldRef for FDECL in the constant pool
1260 and a class local static variable CACHE_ENTRY, then
1262 *(fdecl **)((__builtin_expect (cache_entry == null, false))
1263 ? cache_entry = _Jv_ResolvePoolEntry (output_class, cpool_index)
1266 This can mostly be optimized away, so that the usual path is a
1267 load followed by a test and branch. _Jv_ResolvePoolEntry is
1268 only called once for each constant pool entry.
1270 There is an optimization that we don't do: at the start of a
1271 method, create a local copy of CACHE_ENTRY and use that instead.
1275 int cpool_index
= alloc_constant_fieldref (output_class
, fdecl
);
1276 tree cache_entry
= build_fieldref_cache_entry (cpool_index
, fdecl
);
1278 = build_call_expr (builtin_decl_implicit (BUILT_IN_EXPECT
), 2,
1279 build2 (EQ_EXPR
, boolean_type_node
,
1280 cache_entry
, null_pointer_node
),
1281 boolean_false_node
);
1282 tree cpool_index_cst
= build_int_cst (NULL_TREE
, cpool_index
);
1284 = build_call_expr (soft_resolvepoolentry_node
, 2,
1285 build_class_ref (output_class
),
1287 init
= build2 (MODIFY_EXPR
, ptr_type_node
, cache_entry
, init
);
1288 init
= build3 (COND_EXPR
, ptr_type_node
, test
, init
, cache_entry
);
1289 init
= fold_convert (build_pointer_type (TREE_TYPE (fdecl
)), init
);
1290 fdecl
= build1 (INDIRECT_REF
, TREE_TYPE (fdecl
), init
);
1296 get_access_flags_from_decl (tree decl
)
1298 int access_flags
= 0;
1299 if (TREE_CODE (decl
) == FIELD_DECL
|| TREE_CODE (decl
) == VAR_DECL
)
1301 if (FIELD_STATIC (decl
))
1302 access_flags
|= ACC_STATIC
;
1303 if (FIELD_PUBLIC (decl
))
1304 access_flags
|= ACC_PUBLIC
;
1305 if (FIELD_PROTECTED (decl
))
1306 access_flags
|= ACC_PROTECTED
;
1307 if (FIELD_PRIVATE (decl
))
1308 access_flags
|= ACC_PRIVATE
;
1309 if (FIELD_FINAL (decl
))
1310 access_flags
|= ACC_FINAL
;
1311 if (FIELD_VOLATILE (decl
))
1312 access_flags
|= ACC_VOLATILE
;
1313 if (FIELD_TRANSIENT (decl
))
1314 access_flags
|= ACC_TRANSIENT
;
1315 if (FIELD_ENUM (decl
))
1316 access_flags
|= ACC_ENUM
;
1317 if (FIELD_SYNTHETIC (decl
))
1318 access_flags
|= ACC_SYNTHETIC
;
1319 return access_flags
;
1321 if (TREE_CODE (decl
) == TYPE_DECL
)
1323 if (CLASS_PUBLIC (decl
))
1324 access_flags
|= ACC_PUBLIC
;
1325 if (CLASS_FINAL (decl
))
1326 access_flags
|= ACC_FINAL
;
1327 if (CLASS_SUPER (decl
))
1328 access_flags
|= ACC_SUPER
;
1329 if (CLASS_INTERFACE (decl
))
1330 access_flags
|= ACC_INTERFACE
;
1331 if (CLASS_ABSTRACT (decl
))
1332 access_flags
|= ACC_ABSTRACT
;
1333 if (CLASS_STATIC (decl
))
1334 access_flags
|= ACC_STATIC
;
1335 if (CLASS_PRIVATE (decl
))
1336 access_flags
|= ACC_PRIVATE
;
1337 if (CLASS_PROTECTED (decl
))
1338 access_flags
|= ACC_PROTECTED
;
1339 if (CLASS_STRICTFP (decl
))
1340 access_flags
|= ACC_STRICT
;
1341 if (CLASS_ENUM (decl
))
1342 access_flags
|= ACC_ENUM
;
1343 if (CLASS_SYNTHETIC (decl
))
1344 access_flags
|= ACC_SYNTHETIC
;
1345 if (CLASS_ANNOTATION (decl
))
1346 access_flags
|= ACC_ANNOTATION
;
1347 return access_flags
;
1349 if (TREE_CODE (decl
) == FUNCTION_DECL
)
1351 if (METHOD_PUBLIC (decl
))
1352 access_flags
|= ACC_PUBLIC
;
1353 if (METHOD_PRIVATE (decl
))
1354 access_flags
|= ACC_PRIVATE
;
1355 if (METHOD_PROTECTED (decl
))
1356 access_flags
|= ACC_PROTECTED
;
1357 if (METHOD_STATIC (decl
))
1358 access_flags
|= ACC_STATIC
;
1359 if (METHOD_FINAL (decl
))
1360 access_flags
|= ACC_FINAL
;
1361 if (METHOD_SYNCHRONIZED (decl
))
1362 access_flags
|= ACC_SYNCHRONIZED
;
1363 if (METHOD_NATIVE (decl
))
1364 access_flags
|= ACC_NATIVE
;
1365 if (METHOD_ABSTRACT (decl
))
1366 access_flags
|= ACC_ABSTRACT
;
1367 if (METHOD_STRICTFP (decl
))
1368 access_flags
|= ACC_STRICT
;
1369 if (METHOD_INVISIBLE (decl
))
1370 access_flags
|= ACC_INVISIBLE
;
1371 if (DECL_ARTIFICIAL (decl
))
1372 access_flags
|= ACC_SYNTHETIC
;
1373 if (METHOD_BRIDGE (decl
))
1374 access_flags
|= ACC_BRIDGE
;
1375 if (METHOD_VARARGS (decl
))
1376 access_flags
|= ACC_VARARGS
;
1377 return access_flags
;
1382 static GTY (()) int alias_labelno
= 0;
1384 /* Create a private alias for METHOD. Using this alias instead of the method
1385 decl ensures that ncode entries in the method table point to the real function
1386 at runtime, not a PLT entry. */
1389 make_local_function_alias (tree method
)
1391 #ifdef ASM_OUTPUT_DEF
1394 const char *method_name
= IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (method
));
1395 char *name
= (char *) alloca (strlen (method_name
) + 2);
1396 char *buf
= (char *) alloca (strlen (method_name
) + 128);
1398 /* Only create aliases for local functions. */
1399 if (DECL_EXTERNAL (method
))
1402 /* Prefix method_name with 'L' for the alias label. */
1404 strcpy (name
+ 1, method_name
);
1406 targetm
.asm_out
.generate_internal_label (buf
, name
, alias_labelno
++);
1407 alias
= build_decl (input_location
,
1408 FUNCTION_DECL
, get_identifier (buf
),
1409 TREE_TYPE (method
));
1410 DECL_CONTEXT (alias
) = NULL
;
1411 TREE_READONLY (alias
) = TREE_READONLY (method
);
1412 TREE_THIS_VOLATILE (alias
) = TREE_THIS_VOLATILE (method
);
1413 TREE_PUBLIC (alias
) = 0;
1414 DECL_EXTERNAL (alias
) = 0;
1415 DECL_ARTIFICIAL (alias
) = 1;
1416 DECL_INITIAL (alias
) = error_mark_node
;
1417 TREE_ADDRESSABLE (alias
) = 1;
1418 TREE_USED (alias
) = 1;
1419 if (!flag_syntax_only
)
1420 assemble_alias (alias
, DECL_ASSEMBLER_NAME (method
));
1427 /** Make reflection data (_Jv_Field) for field FDECL. */
1430 make_field_value (tree fdecl
)
1434 tree type
= TREE_TYPE (fdecl
);
1435 int resolved
= is_compiled_class (type
) && ! flag_indirect_dispatch
;
1436 vec
<constructor_elt
, va_gc
> *v
= NULL
;
1438 START_RECORD_CONSTRUCTOR (v
, field_type_node
);
1439 PUSH_FIELD_VALUE (v
, "name", build_utf8_ref (DECL_NAME (fdecl
)));
1441 type
= build_class_ref (type
);
1444 tree signature
= build_java_signature (type
);
1446 type
= build_utf8_ref (unmangle_classname
1447 (IDENTIFIER_POINTER (signature
),
1448 IDENTIFIER_LENGTH (signature
)));
1450 PUSH_FIELD_VALUE (v
, "type", type
);
1452 flags
= get_access_flags_from_decl (fdecl
);
1454 flags
|= 0x8000 /* FIELD_UNRESOLVED_FLAG */;
1456 PUSH_FIELD_VALUE (v
, "accflags", build_int_cst (NULL_TREE
, flags
));
1457 PUSH_FIELD_VALUE (v
, "bsize", TYPE_SIZE_UNIT (TREE_TYPE (fdecl
)));
1460 tree field_address
= integer_zero_node
;
1462 if ((DECL_INITIAL (fdecl
) || ! flag_indirect_classes
)
1463 && FIELD_STATIC (fdecl
))
1464 field_address
= build_address_of (fdecl
);
1466 index
= (FIELD_STATIC (fdecl
)
1467 ? DECL_CHAIN (TYPE_FIELDS (field_info_union_node
))
1468 : TYPE_FIELDS (field_info_union_node
));
1469 value
= (FIELD_STATIC (fdecl
)
1471 : byte_position (fdecl
));
1475 build_constructor_single (field_info_union_node
, index
, value
));
1478 FINISH_RECORD_CONSTRUCTOR (finit
, v
, field_type_node
);
1482 /** Make reflection data (_Jv_Method) for method MDECL. */
1485 make_method_value (tree mdecl
)
1487 static int method_name_count
= 0;
1492 #define ACC_TRANSLATED 0x4000
1493 int accflags
= get_access_flags_from_decl (mdecl
) | ACC_TRANSLATED
;
1494 vec
<constructor_elt
, va_gc
> *v
= NULL
;
1496 class_decl
= DECL_CONTEXT (mdecl
);
1497 /* For interfaces, the index field contains the dispatch index. */
1498 if (CLASS_INTERFACE (TYPE_NAME (class_decl
)))
1499 index
= build_int_cst (NULL_TREE
,
1500 get_interface_method_index (mdecl
, class_decl
));
1501 else if (!flag_indirect_dispatch
&& get_method_index (mdecl
) != NULL_TREE
)
1502 index
= get_method_index (mdecl
);
1504 index
= integer_minus_one_node
;
1506 code
= null_pointer_node
;
1507 if (METHOD_ABSTRACT (mdecl
))
1508 code
= build1 (ADDR_EXPR
, nativecode_ptr_type_node
,
1509 soft_abstractmethod_node
);
1511 code
= build1 (ADDR_EXPR
, nativecode_ptr_type_node
,
1512 make_local_function_alias (mdecl
));
1513 START_RECORD_CONSTRUCTOR (v
, method_type_node
);
1514 PUSH_FIELD_VALUE (v
, "name",
1515 build_utf8_ref (DECL_CONSTRUCTOR_P (mdecl
) ?
1516 init_identifier_node
1517 : DECL_NAME (mdecl
)));
1519 tree signature
= build_java_signature (TREE_TYPE (mdecl
));
1520 PUSH_FIELD_VALUE (v
, "signature",
1523 (IDENTIFIER_POINTER(signature
),
1524 IDENTIFIER_LENGTH(signature
)))));
1526 PUSH_FIELD_VALUE (v
, "accflags", build_int_cst (NULL_TREE
, accflags
));
1527 PUSH_FIELD_VALUE (v
, "index", index
);
1528 PUSH_FIELD_VALUE (v
, "ncode", code
);
1531 /* Compute the `throws' information for the method. */
1532 tree table
= null_pointer_node
;
1534 if (!vec_safe_is_empty (DECL_FUNCTION_THROWS (mdecl
)))
1536 int length
= 1 + DECL_FUNCTION_THROWS (mdecl
)->length ();
1537 tree t
, type
, array
;
1539 vec
<constructor_elt
, va_gc
> *v
= NULL
;
1540 int idx
= length
- 1;
1544 vec_alloc (v
, length
);
1545 v
->quick_grow_cleared (length
);
1548 e
->value
= null_pointer_node
;
1550 FOR_EACH_VEC_SAFE_ELT (DECL_FUNCTION_THROWS (mdecl
), ix
, t
)
1552 tree sig
= DECL_NAME (TYPE_NAME (t
));
1554 = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig
),
1555 IDENTIFIER_LENGTH (sig
)));
1559 gcc_assert (idx
== -1);
1560 type
= build_prim_array_type (ptr_type_node
, length
);
1561 table
= build_constructor (type
, v
);
1562 /* Compute something unique enough. */
1563 sprintf (buf
, "_methods%d", method_name_count
++);
1564 array
= build_decl (input_location
,
1565 VAR_DECL
, get_identifier (buf
), type
);
1566 DECL_INITIAL (array
) = table
;
1567 TREE_STATIC (array
) = 1;
1568 DECL_ARTIFICIAL (array
) = 1;
1569 DECL_IGNORED_P (array
) = 1;
1570 rest_of_decl_compilation (array
, 1, 0);
1572 table
= build1 (ADDR_EXPR
, ptr_type_node
, array
);
1575 PUSH_FIELD_VALUE (v
, "throws", table
);
1578 FINISH_RECORD_CONSTRUCTOR (minit
, v
, method_type_node
);
1583 get_dispatch_vector (tree type
)
1585 tree vtable
= TYPE_VTABLE (type
);
1587 if (vtable
== NULL_TREE
)
1591 tree super
= CLASSTYPE_SUPER (type
);
1592 HOST_WIDE_INT nvirtuals
= tree_to_shwi (TYPE_NVIRTUALS (type
));
1593 vtable
= make_tree_vec (nvirtuals
);
1594 TYPE_VTABLE (type
) = vtable
;
1595 if (super
!= NULL_TREE
)
1597 tree super_vtable
= get_dispatch_vector (super
);
1599 for (i
= tree_to_shwi (TYPE_NVIRTUALS (super
)); --i
>= 0; )
1600 TREE_VEC_ELT (vtable
, i
) = TREE_VEC_ELT (super_vtable
, i
);
1603 for (method
= TYPE_METHODS (type
); method
!= NULL_TREE
;
1604 method
= DECL_CHAIN (method
))
1606 tree method_index
= get_method_index (method
);
1607 if (method_index
!= NULL_TREE
1608 && tree_fits_shwi_p (method_index
))
1609 TREE_VEC_ELT (vtable
, tree_to_shwi (method_index
)) = method
;
1617 get_dispatch_table (tree type
, tree this_class_addr
)
1619 int abstract_p
= CLASS_ABSTRACT (TYPE_NAME (type
));
1620 tree vtable
= get_dispatch_vector (type
);
1622 int nvirtuals
= TREE_VEC_LENGTH (vtable
);
1625 vec
<constructor_elt
, va_gc
> *v
= NULL
;
1629 arraysize
= (TARGET_VTABLE_USES_DESCRIPTORS
? nvirtuals
+ 1 : nvirtuals
+ 2);
1630 if (TARGET_VTABLE_USES_DESCRIPTORS
)
1631 arraysize
*= TARGET_VTABLE_USES_DESCRIPTORS
;
1634 vec_safe_grow_cleared (v
, arraysize
);
1635 e
= &(*v
)[arraysize
- 1];
1637 #define CONSTRUCTOR_PREPEND_VALUE(E, V) E->value = V, E--
1638 for (i
= nvirtuals
; --i
>= 0; )
1640 tree method
= TREE_VEC_ELT (vtable
, i
);
1641 if (METHOD_ABSTRACT (method
))
1644 warning_at (DECL_SOURCE_LOCATION (method
), 0,
1645 "abstract method in non-abstract class");
1647 if (TARGET_VTABLE_USES_DESCRIPTORS
)
1648 for (j
= 0; j
< TARGET_VTABLE_USES_DESCRIPTORS
; ++j
)
1649 CONSTRUCTOR_PREPEND_VALUE (e
, null_pointer_node
);
1651 CONSTRUCTOR_PREPEND_VALUE (e
, null_pointer_node
);
1655 if (TARGET_VTABLE_USES_DESCRIPTORS
)
1656 for (j
= 0; j
< TARGET_VTABLE_USES_DESCRIPTORS
; ++j
)
1658 tree fdesc
= build2 (FDESC_EXPR
, nativecode_ptr_type_node
,
1659 method
, build_int_cst (NULL_TREE
, j
));
1660 TREE_CONSTANT (fdesc
) = 1;
1661 CONSTRUCTOR_PREPEND_VALUE (e
, fdesc
);
1664 CONSTRUCTOR_PREPEND_VALUE (e
,
1666 nativecode_ptr_type_node
,
1671 /* Dummy entry for compatibility with G++ -fvtable-thunks. When
1672 using the Boehm GC we sometimes stash a GC type descriptor
1673 there. We set the PURPOSE to NULL_TREE not to interfere (reset)
1674 the emitted byte count during the output to the assembly file. */
1675 /* With TARGET_VTABLE_USES_DESCRIPTORS, we only add one extra
1676 fake "function descriptor". It's first word is the is the class
1677 pointer, and subsequent words (usually one) contain the GC descriptor.
1678 In all other cases, we reserve two extra vtable slots. */
1679 gc_descr
= get_boehm_type_descriptor (type
);
1680 CONSTRUCTOR_PREPEND_VALUE (e
, gc_descr
);
1681 for (j
= 1; j
< TARGET_VTABLE_USES_DESCRIPTORS
-1; ++j
)
1682 CONSTRUCTOR_PREPEND_VALUE (e
, gc_descr
);
1683 CONSTRUCTOR_PREPEND_VALUE (e
, this_class_addr
);
1685 /** Pointer to type_info object (to be implemented), according to g++ ABI. */
1686 CONSTRUCTOR_PREPEND_VALUE (e
, null_pointer_node
);
1687 /** Offset to start of whole object. Always (ptrdiff_t)0 for Java. */
1688 gcc_assert (e
== v
->address ());
1689 e
->index
= integer_zero_node
;
1690 e
->value
= null_pointer_node
;
1691 #undef CONSTRUCTOR_PREPEND_VALUE
1693 arraytype
= build_prim_array_type (nativecode_ptr_type_node
, arraysize
);
1694 return build_constructor (arraytype
, v
);
1698 /* Set the method_index for a method decl. */
1700 set_method_index (tree decl
, tree method_index
)
1702 if (method_index
!= NULL_TREE
)
1704 /* method_index is null if we're using indirect dispatch. */
1705 method_index
= fold (convert (sizetype
, method_index
));
1707 if (TARGET_VTABLE_USES_DESCRIPTORS
)
1708 /* Add one to skip bogus descriptor for class and GC descriptor. */
1709 method_index
= size_binop (PLUS_EXPR
, method_index
, size_int (1));
1711 /* Add 1 to skip "class" field of dtable, and 1 to skip GC
1713 method_index
= size_binop (PLUS_EXPR
, method_index
, size_int (2));
1716 DECL_VINDEX (decl
) = method_index
;
1719 /* Get the method_index for a method decl. */
1721 get_method_index (tree decl
)
1723 tree method_index
= DECL_VINDEX (decl
);
1728 if (TARGET_VTABLE_USES_DESCRIPTORS
)
1729 /* Sub one to skip bogus descriptor for class and GC descriptor. */
1730 method_index
= size_binop (MINUS_EXPR
, method_index
, size_int (1));
1732 /* Sub 1 to skip "class" field of dtable, and 1 to skip GC descriptor. */
1733 method_index
= size_binop (MINUS_EXPR
, method_index
, size_int (2));
1735 return method_index
;
1739 supers_all_compiled (tree type
)
1741 while (type
!= NULL_TREE
)
1743 if (!assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type
)))))
1745 type
= CLASSTYPE_SUPER (type
);
1751 add_table_and_syms (vec
<constructor_elt
, va_gc
> **v
,
1752 vec
<method_entry
, va_gc
> *methods
,
1753 const char *table_name
, tree table_slot
, tree table_type
,
1754 const char *syms_name
, tree syms_slot
)
1756 if (methods
== NULL
)
1758 PUSH_FIELD_VALUE (*v
, table_name
, null_pointer_node
);
1759 PUSH_FIELD_VALUE (*v
, syms_name
, null_pointer_node
);
1763 pushdecl_top_level (syms_slot
);
1764 PUSH_FIELD_VALUE (*v
, table_name
,
1765 build1 (ADDR_EXPR
, table_type
, table_slot
));
1766 PUSH_FIELD_VALUE (*v
, syms_name
,
1767 build1 (ADDR_EXPR
, symbols_array_ptr_type
,
1769 TREE_CONSTANT (table_slot
) = 1;
1774 make_class_data (tree type
)
1776 tree decl
, cons
, temp
;
1777 tree field
, fields_decl
;
1778 HOST_WIDE_INT static_field_count
= 0;
1779 HOST_WIDE_INT instance_field_count
= 0;
1780 HOST_WIDE_INT field_count
;
1781 tree field_array_type
;
1783 tree dtable_decl
= NULL_TREE
;
1784 HOST_WIDE_INT method_count
= 0;
1785 tree method_array_type
;
1788 tree this_class_addr
;
1789 tree constant_pool_constructor
;
1790 tree interfaces
= null_pointer_node
;
1791 int interface_len
= 0;
1792 int uses_jv_markobj
= 0;
1793 tree type_decl
= TYPE_NAME (type
);
1794 tree id_main
= get_identifier("main");
1795 tree id_class
= get_identifier("java.lang.Class");
1796 /** Offset from start of virtual function table declaration
1797 to where objects actually point at, following new g++ ABI. */
1798 tree dtable_start_offset
= size_int (2 * POINTER_SIZE
/ BITS_PER_UNIT
);
1799 vec
<int> field_indexes
;
1800 tree first_real_field
;
1801 vec
<constructor_elt
, va_gc
> *v1
= NULL
, *v2
= NULL
;
1802 tree reflection_data
;
1803 vec
<constructor_elt
, va_gc
> *static_fields
= NULL
;
1804 vec
<constructor_elt
, va_gc
> *instance_fields
= NULL
;
1805 vec
<constructor_elt
, va_gc
> *methods
= NULL
;
1807 this_class_addr
= build_static_class_ref (type
);
1808 decl
= TREE_OPERAND (this_class_addr
, 0);
1810 if (supers_all_compiled (type
) && ! CLASS_INTERFACE (type_decl
)
1811 && !flag_indirect_dispatch
)
1813 tree dtable
= get_dispatch_table (type
, this_class_addr
);
1814 uses_jv_markobj
= uses_jv_markobj_p (dtable
);
1815 if (type
== class_type_node
&& class_dtable_decl
!= NULL_TREE
)
1817 /* We've already created some other class, and consequently
1818 we made class_dtable_decl. Now we just want to fill it
1820 dtable_decl
= class_dtable_decl
;
1824 dtable_decl
= build_dtable_decl (type
);
1825 TREE_STATIC (dtable_decl
) = 1;
1826 DECL_ARTIFICIAL (dtable_decl
) = 1;
1827 DECL_IGNORED_P (dtable_decl
) = 1;
1830 TREE_PUBLIC (dtable_decl
) = 1;
1831 DECL_INITIAL (dtable_decl
) = dtable
;
1832 /* The only dispatch table exported from a DSO is the dispatch
1833 table for java.lang.Class. */
1834 if (DECL_NAME (type_decl
) != id_class
)
1835 java_hide_decl (dtable_decl
);
1836 if (! flag_indirect_classes
)
1837 rest_of_decl_compilation (dtable_decl
, 1, 0);
1838 /* Maybe we're compiling Class as the first class. If so, set
1839 class_dtable_decl to the decl we just made. */
1840 if (type
== class_type_node
&& class_dtable_decl
== NULL_TREE
)
1841 class_dtable_decl
= dtable_decl
;
1844 /* Build Field array. */
1845 field
= TYPE_FIELDS (type
);
1846 while (field
&& DECL_ARTIFICIAL (field
))
1847 field
= DECL_CHAIN (field
); /* Skip dummy fields. */
1848 if (field
&& DECL_NAME (field
) == NULL_TREE
)
1849 field
= DECL_CHAIN (field
); /* Skip dummy field for inherited data. */
1850 first_real_field
= field
;
1852 /* First count static and instance fields. */
1853 for ( ; field
!= NULL_TREE
; field
= DECL_CHAIN (field
))
1855 if (! DECL_ARTIFICIAL (field
))
1857 if (FIELD_STATIC (field
))
1858 static_field_count
++;
1859 else if (uses_jv_markobj
|| !flag_reduced_reflection
)
1860 instance_field_count
++;
1863 field_count
= static_field_count
+ instance_field_count
;
1864 field_indexes
.create (field_count
);
1866 /* gcj sorts fields so that static fields come first, followed by
1867 instance fields. Unfortunately, by the time this takes place we
1868 have already generated the reflection_data for this class, and
1869 that data contains indexes into the fields. So, we generate a
1870 permutation that maps each original field index to its final
1871 position. Then we pass this permutation to
1872 rewrite_reflection_indexes(), which fixes up the reflection
1876 int static_count
= 0;
1877 int instance_count
= static_field_count
;
1880 for (i
= 0, field
= first_real_field
;
1882 field
= DECL_CHAIN (field
), i
++)
1884 if (! DECL_ARTIFICIAL (field
))
1887 if (FIELD_STATIC (field
))
1888 field_index
= static_count
++;
1889 else if (uses_jv_markobj
|| !flag_reduced_reflection
)
1890 field_index
= instance_count
++;
1893 field_indexes
.quick_push (field_index
);
1898 for (field
= first_real_field
; field
!= NULL_TREE
;
1899 field
= DECL_CHAIN (field
))
1901 if (! DECL_ARTIFICIAL (field
))
1903 if (FIELD_STATIC (field
))
1905 /* We must always create reflection data for static fields
1906 as it is used in the creation of the field itself. */
1907 tree init
= make_field_value (field
);
1908 tree initial
= DECL_INITIAL (field
);
1909 CONSTRUCTOR_APPEND_ELT (static_fields
, NULL_TREE
, init
);
1910 /* If the initial value is a string constant,
1911 prevent output_constant from trying to assemble the value. */
1912 if (initial
!= NULL_TREE
1913 && TREE_TYPE (initial
) == string_ptr_type_node
)
1914 DECL_INITIAL (field
) = NULL_TREE
;
1915 rest_of_decl_compilation (field
, 1, 1);
1916 DECL_INITIAL (field
) = initial
;
1918 else if (uses_jv_markobj
|| !flag_reduced_reflection
)
1920 tree init
= make_field_value (field
);
1921 CONSTRUCTOR_APPEND_ELT (instance_fields
, NULL_TREE
, init
);
1926 gcc_assert (static_field_count
== (int) vec_safe_length (static_fields
));
1927 gcc_assert (instance_field_count
== (int) vec_safe_length (instance_fields
));
1929 if (field_count
> 0)
1931 vec_safe_splice (static_fields
, instance_fields
);
1932 field_array_type
= build_prim_array_type (field_type_node
, field_count
);
1933 fields_decl
= build_decl (input_location
,
1934 VAR_DECL
, mangled_classname ("_FL_", type
),
1936 DECL_INITIAL (fields_decl
)
1937 = build_constructor (field_array_type
, static_fields
);
1938 TREE_STATIC (fields_decl
) = 1;
1939 DECL_ARTIFICIAL (fields_decl
) = 1;
1940 DECL_IGNORED_P (fields_decl
) = 1;
1941 rest_of_decl_compilation (fields_decl
, 1, 0);
1944 fields_decl
= NULL_TREE
;
1946 /* Build Method array. */
1947 for (method
= TYPE_METHODS (type
);
1948 method
!= NULL_TREE
; method
= DECL_CHAIN (method
))
1951 if (METHOD_PRIVATE (method
)
1952 && ! flag_keep_inline_functions
1955 /* Even if we have a decl, we don't necessarily have the code.
1956 This can happen if we inherit a method from a superclass for
1957 which we don't have a .class file. */
1958 if (METHOD_DUMMY (method
))
1961 /* Generate method reflection data if:
1963 - !flag_reduced_reflection.
1965 - <clinit> -- The runtime uses reflection to initialize the
1968 - Any method in class java.lang.Class -- Class.forName() and
1969 perhaps other things require it.
1971 - class$ -- It does not work if reflection data missing.
1973 - main -- Reflection is used to find main(String[]) methods.
1975 - public not static -- It is potentially part of an
1976 interface. The runtime uses reflection data to build
1977 interface dispatch tables. */
1978 if (!flag_reduced_reflection
1979 || DECL_CLINIT_P (method
)
1980 || DECL_NAME (type_decl
) == id_class
1981 || DECL_NAME (method
) == id_main
1982 || (METHOD_PUBLIC (method
) && !METHOD_STATIC (method
)))
1984 init
= make_method_value (method
);
1986 CONSTRUCTOR_APPEND_ELT (methods
, NULL_TREE
, init
);
1989 method_array_type
= build_prim_array_type (method_type_node
, method_count
);
1990 methods_decl
= build_decl (input_location
,
1991 VAR_DECL
, mangled_classname ("_MT_", type
),
1993 DECL_INITIAL (methods_decl
) = build_constructor (method_array_type
, methods
);
1994 TREE_STATIC (methods_decl
) = 1;
1995 DECL_ARTIFICIAL (methods_decl
) = 1;
1996 DECL_IGNORED_P (methods_decl
) = 1;
1997 rest_of_decl_compilation (methods_decl
, 1, 0);
1999 if (class_dtable_decl
== NULL_TREE
)
2001 class_dtable_decl
= build_dtable_decl (class_type_node
);
2002 TREE_STATIC (class_dtable_decl
) = 1;
2003 DECL_ARTIFICIAL (class_dtable_decl
) = 1;
2004 DECL_IGNORED_P (class_dtable_decl
) = 1;
2005 if (is_compiled_class (class_type_node
) != 2)
2007 DECL_EXTERNAL (class_dtable_decl
) = 1;
2008 rest_of_decl_compilation (class_dtable_decl
, 1, 0);
2012 super
= CLASSTYPE_SUPER (type
);
2013 if (super
== NULL_TREE
)
2014 super
= null_pointer_node
;
2015 else if (! flag_indirect_dispatch
2016 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (type_decl
)))
2017 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (super
)))))
2018 super
= build_class_ref (super
);
2021 int super_index
= alloc_class_constant (super
);
2022 super
= build_int_cst (ptr_type_node
, super_index
);
2025 /* Build and emit the array of implemented interfaces. */
2026 if (type
!= object_type_node
)
2027 interface_len
= BINFO_N_BASE_BINFOS (TYPE_BINFO (type
)) - 1;
2029 if (interface_len
> 0)
2032 tree interface_array_type
, idecl
;
2033 vec
<constructor_elt
, va_gc
> *init
;
2034 vec_alloc (init
, interface_len
);
2035 interface_array_type
2036 = build_prim_array_type (class_ptr_type
, interface_len
);
2037 idecl
= build_decl (input_location
,
2038 VAR_DECL
, mangled_classname ("_IF_", type
),
2039 interface_array_type
);
2041 for (i
= 1; i
<= interface_len
; i
++)
2043 tree child
= BINFO_BASE_BINFO (TYPE_BINFO (type
), i
);
2044 tree iclass
= BINFO_TYPE (child
);
2046 if (! flag_indirect_dispatch
2048 (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (iclass
))))))
2049 index
= build_class_ref (iclass
);
2052 int int_index
= alloc_class_constant (iclass
);
2053 index
= build_int_cst (ptr_type_node
, int_index
);
2055 CONSTRUCTOR_APPEND_ELT (init
, NULL_TREE
, index
);
2057 DECL_INITIAL (idecl
) = build_constructor (interface_array_type
, init
);
2058 TREE_STATIC (idecl
) = 1;
2059 DECL_ARTIFICIAL (idecl
) = 1;
2060 DECL_IGNORED_P (idecl
) = 1;
2061 interfaces
= build1 (ADDR_EXPR
, ptr_type_node
, idecl
);
2062 rest_of_decl_compilation (idecl
, 1, 0);
2065 constant_pool_constructor
= build_constants_constructor ();
2067 if (flag_indirect_dispatch
)
2069 TYPE_OTABLE_DECL (type
)
2071 (DECL_NAME (TYPE_OTABLE_DECL (type
)),
2072 TYPE_OTABLE_DECL (type
), TYPE_OTABLE_METHODS (type
),
2073 TYPE_OTABLE_SYMS_DECL (type
), integer_type_node
, 1);
2075 TYPE_ATABLE_DECL (type
)
2077 (DECL_NAME (TYPE_ATABLE_DECL (type
)),
2078 TYPE_ATABLE_DECL (type
), TYPE_ATABLE_METHODS (type
),
2079 TYPE_ATABLE_SYMS_DECL (type
), ptr_type_node
, 1);
2081 TYPE_ITABLE_DECL (type
)
2083 (DECL_NAME (TYPE_ITABLE_DECL (type
)),
2084 TYPE_ITABLE_DECL (type
), TYPE_ITABLE_METHODS (type
),
2085 TYPE_ITABLE_SYMS_DECL (type
), ptr_type_node
, 2);
2088 TYPE_CTABLE_DECL (type
) = emit_catch_table (type
);
2090 START_RECORD_CONSTRUCTOR (v1
, object_type_node
);
2091 PUSH_FIELD_VALUE (v1
, "vtable",
2092 (flag_indirect_classes
2094 : fold_build_pointer_plus
2095 (build1 (ADDR_EXPR
, dtable_ptr_type
,
2097 dtable_start_offset
)));
2098 if (! flag_hash_synchronization
)
2099 PUSH_FIELD_VALUE (v1
, "sync_info", null_pointer_node
);
2100 FINISH_RECORD_CONSTRUCTOR (temp
, v1
, object_type_node
);
2101 START_RECORD_CONSTRUCTOR (v2
, class_type_node
);
2102 PUSH_SUPER_VALUE (v2
, temp
);
2103 PUSH_FIELD_VALUE (v2
, "next_or_version", gcj_abi_version
);
2104 PUSH_FIELD_VALUE (v2
, "name", build_utf8_ref (DECL_NAME (type_decl
)));
2105 PUSH_FIELD_VALUE (v2
, "accflags",
2106 build_int_cst (NULL_TREE
,
2107 get_access_flags_from_decl (type_decl
)));
2109 PUSH_FIELD_VALUE (v2
, "superclass",
2110 CLASS_INTERFACE (type_decl
) ? null_pointer_node
: super
);
2111 PUSH_FIELD_VALUE (v2
, "constants", constant_pool_constructor
);
2112 PUSH_FIELD_VALUE (v2
, "methods",
2113 methods_decl
== NULL_TREE
? null_pointer_node
2114 : build1 (ADDR_EXPR
, method_ptr_type_node
, methods_decl
));
2115 PUSH_FIELD_VALUE (v2
, "method_count",
2116 build_int_cst (NULL_TREE
, method_count
));
2118 PUSH_FIELD_VALUE (v2
, "vtable_method_count",
2119 (flag_indirect_dispatch
2120 ? integer_minus_one_node
2121 : TYPE_NVIRTUALS (type
)));
2123 PUSH_FIELD_VALUE (v2
, "fields",
2124 fields_decl
== NULL_TREE
? null_pointer_node
2125 : build1 (ADDR_EXPR
, field_ptr_type_node
, fields_decl
));
2126 /* If we're using the binary compatibility ABI we don't know the
2127 size until load time. */
2128 PUSH_FIELD_VALUE (v2
, "size_in_bytes",
2129 (flag_indirect_dispatch
2130 ? integer_minus_one_node
2131 : size_in_bytes (type
)));
2132 PUSH_FIELD_VALUE (v2
, "field_count",
2133 build_int_cst (NULL_TREE
, field_count
));
2134 PUSH_FIELD_VALUE (v2
, "static_field_count",
2135 build_int_cst (NULL_TREE
, static_field_count
));
2137 PUSH_FIELD_VALUE (v2
, "vtable",
2138 (flag_indirect_dispatch
|| dtable_decl
== NULL_TREE
2140 : fold_build_pointer_plus
2141 (build1 (ADDR_EXPR
, dtable_ptr_type
,
2143 dtable_start_offset
)));
2144 add_table_and_syms (&v2
, TYPE_OTABLE_METHODS (type
),
2145 "otable", TYPE_OTABLE_DECL (type
), otable_ptr_type
,
2146 "otable_syms", TYPE_OTABLE_SYMS_DECL (type
));
2147 add_table_and_syms (&v2
, TYPE_ATABLE_METHODS (type
),
2148 "atable", TYPE_ATABLE_DECL (type
), atable_ptr_type
,
2149 "atable_syms", TYPE_ATABLE_SYMS_DECL (type
));
2150 add_table_and_syms (&v2
, TYPE_ITABLE_METHODS (type
),
2151 "itable", TYPE_ITABLE_DECL (type
), itable_ptr_type
,
2152 "itable_syms", TYPE_ITABLE_SYMS_DECL (type
));
2154 PUSH_FIELD_VALUE (v2
, "catch_classes",
2155 build1 (ADDR_EXPR
, ptr_type_node
, TYPE_CTABLE_DECL (type
)));
2156 PUSH_FIELD_VALUE (v2
, "interfaces", interfaces
);
2157 PUSH_FIELD_VALUE (v2
, "loader", null_pointer_node
);
2158 PUSH_FIELD_VALUE (v2
, "interface_count",
2159 build_int_cst (NULL_TREE
, interface_len
));
2160 PUSH_FIELD_VALUE (v2
, "state",
2161 convert (byte_type_node
,
2162 build_int_cst (NULL_TREE
, JV_STATE_PRELOADING
)));
2164 PUSH_FIELD_VALUE (v2
, "thread", null_pointer_node
);
2165 PUSH_FIELD_VALUE (v2
, "depth", integer_zero_node
);
2166 PUSH_FIELD_VALUE (v2
, "ancestors", null_pointer_node
);
2167 PUSH_FIELD_VALUE (v2
, "idt", null_pointer_node
);
2168 PUSH_FIELD_VALUE (v2
, "arrayclass", null_pointer_node
);
2169 PUSH_FIELD_VALUE (v2
, "protectionDomain", null_pointer_node
);
2172 tree assertion_table_ref
;
2173 if (TYPE_ASSERTIONS (type
) == NULL
)
2174 assertion_table_ref
= null_pointer_node
;
2176 assertion_table_ref
= build1 (ADDR_EXPR
,
2177 build_pointer_type (assertion_table_type
),
2178 emit_assertion_table (type
));
2180 PUSH_FIELD_VALUE (v2
, "assertion_table", assertion_table_ref
);
2183 PUSH_FIELD_VALUE (v2
, "hack_signers", null_pointer_node
);
2184 PUSH_FIELD_VALUE (v2
, "chain", null_pointer_node
);
2185 PUSH_FIELD_VALUE (v2
, "aux_info", null_pointer_node
);
2186 PUSH_FIELD_VALUE (v2
, "engine", null_pointer_node
);
2188 if (TYPE_REFLECTION_DATA (current_class
))
2191 int count
= TYPE_REFLECTION_DATASIZE (current_class
);
2192 vec
<constructor_elt
, va_gc
> *v
;
2193 vec_alloc (v
, count
);
2194 unsigned char *data
= TYPE_REFLECTION_DATA (current_class
);
2195 tree max_index
= build_int_cst (sizetype
, count
);
2196 tree index
= build_index_type (max_index
);
2197 tree type
= build_array_type (unsigned_byte_type_node
, index
);
2200 static int reflection_data_count
;
2202 sprintf (buf
, "_reflection_data_%d", reflection_data_count
++);
2203 array
= build_decl (input_location
,
2204 VAR_DECL
, get_identifier (buf
), type
);
2206 rewrite_reflection_indexes (&field_indexes
);
2208 for (i
= 0; i
< count
; i
++)
2210 constructor_elt elt
;
2211 elt
.index
= build_int_cst (sizetype
, i
);
2212 elt
.value
= build_int_cstu (byte_type_node
, data
[i
]);
2213 v
->quick_push (elt
);
2216 DECL_INITIAL (array
) = build_constructor (type
, v
);
2217 TREE_STATIC (array
) = 1;
2218 DECL_ARTIFICIAL (array
) = 1;
2219 DECL_IGNORED_P (array
) = 1;
2220 TREE_READONLY (array
) = 1;
2221 TREE_CONSTANT (DECL_INITIAL (array
)) = 1;
2222 rest_of_decl_compilation (array
, 1, 0);
2224 reflection_data
= build_address_of (array
);
2227 TYPE_REFLECTION_DATA (current_class
) = NULL
;
2230 reflection_data
= null_pointer_node
;
2232 PUSH_FIELD_VALUE (v2
, "reflection_data", reflection_data
);
2233 FINISH_RECORD_CONSTRUCTOR (cons
, v2
, class_type_node
);
2235 DECL_INITIAL (decl
) = cons
;
2237 /* Hash synchronization requires at least 64-bit alignment. */
2238 if (flag_hash_synchronization
&& POINTER_SIZE
< 64)
2239 DECL_ALIGN (decl
) = 64;
2241 if (flag_indirect_classes
)
2243 TREE_READONLY (decl
) = 1;
2244 TREE_CONSTANT (DECL_INITIAL (decl
)) = 1;
2247 rest_of_decl_compilation (decl
, 1, 0);
2250 tree classdollar_field
= build_classdollar_field (type
);
2251 if (!flag_indirect_classes
)
2252 DECL_INITIAL (classdollar_field
) = build_static_class_ref (type
);
2253 rest_of_decl_compilation (classdollar_field
, 1, 0);
2256 TYPE_OTABLE_DECL (type
) = NULL_TREE
;
2257 TYPE_ATABLE_DECL (type
) = NULL_TREE
;
2258 TYPE_CTABLE_DECL (type
) = NULL_TREE
;
2264 java_expand_catch_classes (current_class
);
2266 current_function_decl
= NULL_TREE
;
2267 TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (current_class
)) = 0;
2268 make_class_data (current_class
);
2270 rest_of_decl_compilation (TYPE_NAME (current_class
), 1, 0);
2273 /* Return 2 if KLASS is compiled by this compilation job;
2274 return 1 if KLASS can otherwise be assumed to be compiled;
2275 return 0 if we cannot assume that KLASS is compiled.
2276 Returns 1 for primitive and 0 for array types. */
2278 is_compiled_class (tree klass
)
2281 if (TREE_CODE (klass
) == POINTER_TYPE
)
2282 klass
= TREE_TYPE (klass
);
2283 if (TREE_CODE (klass
) != RECORD_TYPE
) /* Primitive types are static. */
2285 if (TYPE_ARRAY_P (klass
))
2288 seen_in_zip
= (TYPE_JCF (klass
) && JCF_SEEN_IN_ZIP (TYPE_JCF (klass
)));
2289 if (CLASS_FROM_CURRENTLY_COMPILED_P (klass
))
2291 /* The class was seen in the current ZIP file and will be
2292 available as a compiled class in the future but may not have
2293 been loaded already. Load it if necessary. This prevent
2294 build_class_ref () from crashing. */
2296 if (seen_in_zip
&& !CLASS_LOADED_P (klass
) && (klass
!= current_class
))
2297 load_class (klass
, 1);
2299 /* We return 2 for class seen in ZIP and class from files
2300 belonging to the same compilation unit */
2304 if (assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (klass
)))))
2306 if (!CLASS_LOADED_P (klass
))
2308 if (klass
!= current_class
)
2309 load_class (klass
, 1);
2317 /* Build a VAR_DECL for the dispatch table (vtable) for class TYPE. */
2320 build_dtable_decl (tree type
)
2324 /* We need to build a new dtable type so that its size is uniquely
2325 computed when we're dealing with the class for real and not just
2326 faking it (like java.lang.Class during the initialization of the
2327 compiler.) We know we're not faking a class when CURRENT_CLASS is
2329 if (current_class
== type
)
2331 tree dummy
= NULL_TREE
;
2334 dtype
= make_node (RECORD_TYPE
);
2336 PUSH_FIELD (input_location
, dtype
, dummy
, "top_offset", ptr_type_node
);
2337 PUSH_FIELD (input_location
, dtype
, dummy
, "type_info", ptr_type_node
);
2339 PUSH_FIELD (input_location
, dtype
, dummy
, "class", class_ptr_type
);
2340 for (n
= 1; n
< TARGET_VTABLE_USES_DESCRIPTORS
; ++n
)
2342 tree tmp_field
= build_decl (input_location
,
2343 FIELD_DECL
, NULL_TREE
, ptr_type_node
);
2344 TREE_CHAIN (dummy
) = tmp_field
;
2345 DECL_CONTEXT (tmp_field
) = dtype
;
2346 DECL_ARTIFICIAL (tmp_field
) = 1;
2350 PUSH_FIELD (input_location
, dtype
, dummy
, "gc_descr", ptr_type_node
);
2351 for (n
= 1; n
< TARGET_VTABLE_USES_DESCRIPTORS
; ++n
)
2353 tree tmp_field
= build_decl (input_location
,
2354 FIELD_DECL
, NULL_TREE
, ptr_type_node
);
2355 TREE_CHAIN (dummy
) = tmp_field
;
2356 DECL_CONTEXT (tmp_field
) = dtype
;
2357 DECL_ARTIFICIAL (tmp_field
) = 1;
2361 n
= TREE_VEC_LENGTH (get_dispatch_vector (type
));
2362 if (TARGET_VTABLE_USES_DESCRIPTORS
)
2363 n
*= TARGET_VTABLE_USES_DESCRIPTORS
;
2365 PUSH_FIELD (input_location
, dtype
, dummy
, "methods",
2366 build_prim_array_type (nativecode_ptr_type_node
, n
));
2367 layout_type (dtype
);
2370 dtype
= dtable_type
;
2372 decl
= build_decl (input_location
,
2373 VAR_DECL
, get_identifier ("vt$"), dtype
);
2374 DECL_CONTEXT (decl
) = type
;
2375 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl
);
2376 DECL_VTABLE_P (decl
) = 1;
2381 /* Pre-pend the TYPE_FIELDS of THIS_CLASS with a dummy FIELD_DECL for the
2382 fields inherited from SUPER_CLASS. */
2385 push_super_field (tree this_class
, tree super_class
)
2388 /* Don't insert the field if we're just re-laying the class out. */
2389 if (TYPE_FIELDS (this_class
) && !DECL_NAME (TYPE_FIELDS (this_class
)))
2391 base_decl
= build_decl (input_location
,
2392 FIELD_DECL
, NULL_TREE
, super_class
);
2393 DECL_IGNORED_P (base_decl
) = 1;
2394 DECL_CHAIN (base_decl
) = TYPE_FIELDS (this_class
);
2395 TYPE_FIELDS (this_class
) = base_decl
;
2396 DECL_SIZE (base_decl
) = TYPE_SIZE (super_class
);
2397 DECL_SIZE_UNIT (base_decl
) = TYPE_SIZE_UNIT (super_class
);
2400 /* Handle the different manners we may have to lay out a super class. */
2403 maybe_layout_super_class (tree super_class
, tree this_class ATTRIBUTE_UNUSED
)
2407 else if (TREE_CODE (super_class
) == RECORD_TYPE
)
2409 if (!CLASS_LOADED_P (super_class
))
2410 load_class (super_class
, 1);
2412 /* We might have to layout the class before its dependency on
2413 the super class gets resolved by java_complete_class */
2414 else if (TREE_CODE (super_class
) == POINTER_TYPE
)
2416 if (TREE_TYPE (super_class
) != NULL_TREE
)
2417 super_class
= TREE_TYPE (super_class
);
2421 if (!TYPE_SIZE (super_class
))
2422 safe_layout_class (super_class
);
2427 /* safe_layout_class just makes sure that we can load a class without
2428 disrupting the current_class, input_location, etc, information
2429 about the class processed currently. */
2432 safe_layout_class (tree klass
)
2434 tree save_current_class
= current_class
;
2435 location_t save_location
= input_location
;
2437 layout_class (klass
);
2439 current_class
= save_current_class
;
2440 input_location
= save_location
;
2444 layout_class (tree this_class
)
2447 tree super_class
= CLASSTYPE_SUPER (this_class
);
2449 class_list
= tree_cons (this_class
, NULL_TREE
, class_list
);
2450 if (CLASS_BEING_LAIDOUT (this_class
))
2456 sprintf (buffer
, " with '%s'",
2457 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class
))));
2458 obstack_grow (&temporary_obstack
, buffer
, strlen (buffer
));
2460 for (current
= TREE_CHAIN (class_list
); current
;
2461 current
= TREE_CHAIN (current
))
2463 tree decl
= TYPE_NAME (TREE_PURPOSE (current
));
2464 sprintf (buffer
, "\n which inherits from '%s' (%s:%d)",
2465 IDENTIFIER_POINTER (DECL_NAME (decl
)),
2466 DECL_SOURCE_FILE (decl
),
2467 DECL_SOURCE_LINE (decl
));
2468 obstack_grow (&temporary_obstack
, buffer
, strlen (buffer
));
2470 obstack_1grow (&temporary_obstack
, '\0');
2471 report
= XOBFINISH (&temporary_obstack
, char *);
2472 cyclic_inheritance_report
= ggc_strdup (report
);
2473 obstack_free (&temporary_obstack
, report
);
2474 TYPE_SIZE (this_class
) = error_mark_node
;
2477 CLASS_BEING_LAIDOUT (this_class
) = 1;
2479 if (super_class
&& !CLASS_BEING_LAIDOUT (super_class
))
2481 tree maybe_super_class
2482 = maybe_layout_super_class (super_class
, this_class
);
2483 if (maybe_super_class
== NULL
2484 || TREE_CODE (TYPE_SIZE (maybe_super_class
)) == ERROR_MARK
)
2486 TYPE_SIZE (this_class
) = error_mark_node
;
2487 CLASS_BEING_LAIDOUT (this_class
) = 0;
2488 class_list
= TREE_CHAIN (class_list
);
2491 if (TYPE_SIZE (this_class
) == NULL_TREE
)
2492 push_super_field (this_class
, maybe_super_class
);
2495 layout_type (this_class
);
2497 /* Also recursively load/layout any superinterfaces. */
2498 if (TYPE_BINFO (this_class
))
2500 for (i
= BINFO_N_BASE_BINFOS (TYPE_BINFO (this_class
)) - 1; i
> 0; i
--)
2502 tree binfo
= BINFO_BASE_BINFO (TYPE_BINFO (this_class
), i
);
2503 tree super_interface
= BINFO_TYPE (binfo
);
2504 tree maybe_super_interface
2505 = maybe_layout_super_class (super_interface
, NULL_TREE
);
2506 if (maybe_super_interface
== NULL
2507 || TREE_CODE (TYPE_SIZE (maybe_super_interface
)) == ERROR_MARK
)
2509 TYPE_SIZE (this_class
) = error_mark_node
;
2510 CLASS_BEING_LAIDOUT (this_class
) = 0;
2511 class_list
= TREE_CHAIN (class_list
);
2517 /* Convert the size back to an SI integer value. */
2518 TYPE_SIZE_UNIT (this_class
) =
2519 fold (convert (int_type_node
, TYPE_SIZE_UNIT (this_class
)));
2521 CLASS_BEING_LAIDOUT (this_class
) = 0;
2522 class_list
= TREE_CHAIN (class_list
);
2526 add_miranda_methods (tree base_class
, tree search_class
)
2529 tree binfo
, base_binfo
;
2531 if (!CLASS_PARSED_P (search_class
))
2532 load_class (search_class
, 1);
2534 for (binfo
= TYPE_BINFO (search_class
), i
= 1;
2535 BINFO_BASE_ITERATE (binfo
, i
, base_binfo
); i
++)
2538 tree elt
= BINFO_TYPE (base_binfo
);
2540 /* FIXME: This is totally bogus. We should not be handling
2541 Miranda methods at all if we're using the BC ABI. */
2542 if (TYPE_DUMMY (elt
))
2545 /* Ensure that interface methods are seen in declared order. */
2546 if (!CLASS_LOADED_P (elt
))
2547 load_class (elt
, 1);
2548 layout_class_methods (elt
);
2550 /* All base classes will have been laid out at this point, so the order
2551 will be correct. This code must match similar layout code in the
2553 for (method_decl
= TYPE_METHODS (elt
);
2554 method_decl
; method_decl
= DECL_CHAIN (method_decl
))
2558 /* An interface can have <clinit>. */
2559 if (ID_CLINIT_P (DECL_NAME (method_decl
)))
2562 sig
= build_java_argument_signature (TREE_TYPE (method_decl
));
2563 override
= lookup_argument_method (base_class
,
2564 DECL_NAME (method_decl
), sig
);
2565 if (override
== NULL_TREE
)
2567 /* Found a Miranda method. Add it. */
2569 sig
= build_java_signature (TREE_TYPE (method_decl
));
2571 = add_method (base_class
,
2572 get_access_flags_from_decl (method_decl
),
2573 DECL_NAME (method_decl
), sig
);
2574 METHOD_INVISIBLE (new_method
) = 1;
2578 /* Try superinterfaces. */
2579 add_miranda_methods (base_class
, elt
);
2584 layout_class_methods (tree this_class
)
2586 tree method_decl
, dtable_count
;
2587 tree super_class
, type_name
;
2589 if (TYPE_NVIRTUALS (this_class
))
2592 super_class
= CLASSTYPE_SUPER (this_class
);
2596 super_class
= maybe_layout_super_class (super_class
, this_class
);
2597 if (!TYPE_NVIRTUALS (super_class
))
2598 layout_class_methods (super_class
);
2599 dtable_count
= TYPE_NVIRTUALS (super_class
);
2602 dtable_count
= integer_zero_node
;
2604 type_name
= TYPE_NAME (this_class
);
2605 if (!flag_indirect_dispatch
2606 && (CLASS_ABSTRACT (type_name
) || CLASS_INTERFACE (type_name
)))
2608 /* An abstract class can have methods which are declared only in
2609 an implemented interface. These are called "Miranda
2610 methods". We make a dummy method entry for such methods
2612 add_miranda_methods (this_class
, this_class
);
2615 TYPE_METHODS (this_class
) = nreverse (TYPE_METHODS (this_class
));
2617 for (method_decl
= TYPE_METHODS (this_class
);
2618 method_decl
; method_decl
= DECL_CHAIN (method_decl
))
2619 dtable_count
= layout_class_method (this_class
, super_class
,
2620 method_decl
, dtable_count
);
2622 TYPE_NVIRTUALS (this_class
) = dtable_count
;
2625 /* Return the index of METHOD in INTERFACE. This index begins at 1
2626 and is used as an argument for _Jv_LookupInterfaceMethodIdx(). */
2628 get_interface_method_index (tree method
, tree interface
)
2633 for (meth
= TYPE_METHODS (interface
); ; meth
= DECL_CHAIN (meth
))
2637 /* We don't want to put <clinit> into the interface table. */
2638 if (! ID_CLINIT_P (DECL_NAME (meth
)))
2640 gcc_assert (meth
!= NULL_TREE
);
2644 /* Lay METHOD_DECL out, returning a possibly new value of
2645 DTABLE_COUNT. Also mangle the method's name. */
2648 layout_class_method (tree this_class
, tree super_class
,
2649 tree method_decl
, tree dtable_count
)
2651 tree method_name
= DECL_NAME (method_decl
);
2653 TREE_PUBLIC (method_decl
) = 1;
2655 if (flag_indirect_classes
2656 || (METHOD_PRIVATE (method_decl
) && METHOD_STATIC (method_decl
)
2657 && ! METHOD_NATIVE (method_decl
)
2658 && ! special_method_p (method_decl
)))
2659 java_hide_decl (method_decl
);
2661 /* Considered external unless it is being compiled into this object
2662 file, or it was already flagged as external. */
2663 if (!DECL_EXTERNAL (method_decl
))
2664 DECL_EXTERNAL (method_decl
) = ((is_compiled_class (this_class
) != 2)
2665 || METHOD_NATIVE (method_decl
));
2667 if (ID_INIT_P (method_name
))
2669 const char *p
= IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class
)));
2671 for (ptr
= p
; *ptr
; )
2676 DECL_CONSTRUCTOR_P (method_decl
) = 1;
2677 build_java_signature (TREE_TYPE (method_decl
));
2679 else if (! METHOD_STATIC (method_decl
))
2682 build_java_signature (TREE_TYPE (method_decl
));
2683 bool method_override
= false;
2684 tree super_method
= lookup_java_method (super_class
, method_name
,
2686 if (super_method
!= NULL_TREE
2687 && ! METHOD_DUMMY (super_method
))
2689 method_override
= true;
2690 if (! METHOD_PUBLIC (super_method
) &&
2691 ! METHOD_PROTECTED (super_method
))
2693 /* Don't override private method, or default-access method in
2695 if (METHOD_PRIVATE (super_method
) ||
2696 ! in_same_package (TYPE_NAME (this_class
),
2697 TYPE_NAME (super_class
)))
2698 method_override
= false;
2701 if (method_override
)
2703 tree method_index
= get_method_index (super_method
);
2704 set_method_index (method_decl
, method_index
);
2705 if (method_index
== NULL_TREE
2706 && ! flag_indirect_dispatch
2707 && ! DECL_ARTIFICIAL (super_method
))
2708 error ("non-static method %q+D overrides static method",
2711 else if (this_class
== object_type_node
2712 && (METHOD_FINAL (method_decl
)
2713 || METHOD_PRIVATE (method_decl
)))
2715 /* We don't generate vtable entries for final Object
2716 methods. This is simply to save space, since every
2717 object would otherwise have to define them. */
2719 else if (! METHOD_PRIVATE (method_decl
)
2722 /* We generate vtable entries for final methods because they
2723 may one day be changed to non-final. */
2724 set_method_index (method_decl
, dtable_count
);
2725 dtable_count
= fold_build2 (PLUS_EXPR
, integer_type_node
,
2726 dtable_count
, integer_one_node
);
2730 return dtable_count
;
2734 register_class (void)
2738 if (!registered_class
)
2739 vec_alloc (registered_class
, 8);
2741 if (flag_indirect_classes
)
2742 node
= current_class
;
2744 node
= TREE_OPERAND (build_class_ref (current_class
), 0);
2745 vec_safe_push (registered_class
, node
);
2748 /* Emit a function that calls _Jv_RegisterNewClasses with a list of
2749 all the classes we have emitted. */
2752 emit_indirect_register_classes (tree
*list_p
)
2754 tree klass
, t
, register_class_fn
;
2757 int size
= vec_safe_length (registered_class
) * 2 + 1;
2758 vec
<constructor_elt
, va_gc
> *init
;
2759 vec_alloc (init
, size
);
2760 tree class_array_type
2761 = build_prim_array_type (ptr_type_node
, size
);
2762 tree
cdecl = build_decl (input_location
,
2763 VAR_DECL
, get_identifier ("_Jv_CLS"),
2765 tree reg_class_list
;
2766 FOR_EACH_VEC_SAFE_ELT (registered_class
, i
, klass
)
2768 t
= fold_convert (ptr_type_node
, build_static_class_ref (klass
));
2769 CONSTRUCTOR_APPEND_ELT (init
, NULL_TREE
, t
);
2770 t
= fold_convert (ptr_type_node
,
2771 build_address_of (build_classdollar_field (klass
)));
2772 CONSTRUCTOR_APPEND_ELT (init
, NULL_TREE
, t
);
2774 CONSTRUCTOR_APPEND_ELT (init
, NULL_TREE
, integer_zero_node
);
2775 DECL_INITIAL (cdecl) = build_constructor (class_array_type
, init
);
2776 TREE_CONSTANT (DECL_INITIAL (cdecl)) = 1;
2777 TREE_STATIC (cdecl) = 1;
2778 DECL_ARTIFICIAL (cdecl) = 1;
2779 DECL_IGNORED_P (cdecl) = 1;
2780 TREE_READONLY (cdecl) = 1;
2781 TREE_CONSTANT (cdecl) = 1;
2782 rest_of_decl_compilation (cdecl, 1, 0);
2783 reg_class_list
= fold_convert (ptr_type_node
, build_address_of (cdecl));
2785 t
= build_function_type_list (void_type_node
,
2786 build_pointer_type (ptr_type_node
), NULL
);
2787 t
= build_decl (input_location
,
2789 get_identifier ("_Jv_RegisterNewClasses"), t
);
2790 TREE_PUBLIC (t
) = 1;
2791 DECL_EXTERNAL (t
) = 1;
2792 register_class_fn
= t
;
2793 t
= build_call_expr (register_class_fn
, 1, reg_class_list
);
2794 append_to_statement_list (t
, list_p
);
2797 /* Emit a list of pointers to all classes we have emitted to JCR_SECTION. */
2800 emit_register_classes_in_jcr_section (void)
2802 #ifdef JCR_SECTION_NAME
2803 tree klass
, cdecl, class_array_type
;
2805 int size
= vec_safe_length (registered_class
);
2806 vec
<constructor_elt
, va_gc
> *init
;
2807 vec_alloc (init
, size
);
2809 FOR_EACH_VEC_SAFE_ELT (registered_class
, i
, klass
)
2810 CONSTRUCTOR_APPEND_ELT (init
, NULL_TREE
, build_fold_addr_expr (klass
));
2812 /* ??? I would like to use tree_output_constant_def() but there is no way
2813 to put the data in a named section name, or to set the alignment,
2814 via that function. So do everything manually here. */
2815 class_array_type
= build_prim_array_type (ptr_type_node
, size
);
2816 cdecl = build_decl (UNKNOWN_LOCATION
,
2817 VAR_DECL
, get_identifier ("_Jv_JCR_SECTION_data"),
2819 DECL_ALIGN (cdecl) = POINTER_SIZE
;
2820 DECL_USER_ALIGN (cdecl) = 1;
2821 DECL_INITIAL (cdecl) = build_constructor (class_array_type
, init
);
2822 TREE_CONSTANT (DECL_INITIAL (cdecl)) = 1;
2823 TREE_STATIC (cdecl) = 1;
2824 TREE_READONLY (cdecl) = 0;
2825 TREE_CONSTANT (cdecl) = 1;
2826 DECL_ARTIFICIAL (cdecl) = 1;
2827 DECL_IGNORED_P (cdecl) = 1;
2828 DECL_PRESERVE_P (cdecl) = 1;
2829 set_decl_section_name (cdecl, JCR_SECTION_NAME
);
2830 pushdecl_top_level (cdecl);
2831 relayout_decl (cdecl);
2832 rest_of_decl_compilation (cdecl, 1, 0);
2834 /* A target has defined TARGET_USE_JCR_SECTION,
2835 but doesn't have a JCR_SECTION_NAME. */
2841 /* Emit a series of calls to _Jv_RegisterClass for every class we emitted.
2842 A series of calls is added to LIST_P. */
2845 emit_Jv_RegisterClass_calls (tree
*list_p
)
2847 tree klass
, t
, register_class_fn
;
2850 t
= build_function_type_list (void_type_node
, class_ptr_type
, NULL
);
2851 t
= build_decl (input_location
,
2852 FUNCTION_DECL
, get_identifier ("_Jv_RegisterClass"), t
);
2853 TREE_PUBLIC (t
) = 1;
2854 DECL_EXTERNAL (t
) = 1;
2855 register_class_fn
= t
;
2857 FOR_EACH_VEC_SAFE_ELT (registered_class
, i
, klass
)
2859 t
= build_fold_addr_expr (klass
);
2860 t
= build_call_expr (register_class_fn
, 1, t
);
2861 append_to_statement_list (t
, list_p
);
2865 /* Emit something to register classes at start-up time.
2867 The default mechanism is to generate instances at run-time.
2869 An alternative mechanism is through the .jcr section, which contain
2870 a list of pointers to classes which get registered during constructor
2873 The fallback mechanism is to add statements to *LIST_P to call
2874 _Jv_RegisterClass for each class in this file. These statements will
2875 be added to a static constructor function for this translation unit. */
2878 emit_register_classes (tree
*list_p
)
2880 if (registered_class
== NULL
)
2883 /* By default, generate instances of Class at runtime. */
2884 if (flag_indirect_classes
)
2885 emit_indirect_register_classes (list_p
);
2886 /* TARGET_USE_JCR_SECTION defaults to 1 if SUPPORTS_WEAK and
2887 TARGET_ASM_NAMED_SECTION, else 0. Some targets meet those conditions
2888 but lack suitable crtbegin/end objects or linker support. These
2889 targets can override the default in tm.h to use the fallback mechanism. */
2890 else if (TARGET_USE_JCR_SECTION
)
2891 emit_register_classes_in_jcr_section ();
2892 /* Use the fallback mechanism. */
2894 emit_Jv_RegisterClass_calls (list_p
);
2897 /* Build a constructor for an entry in the symbol table. */
2900 build_symbol_table_entry (tree clname
, tree name
, tree signature
)
2903 vec
<constructor_elt
, va_gc
> *v
= NULL
;
2905 START_RECORD_CONSTRUCTOR (v
, symbol_type
);
2906 PUSH_FIELD_VALUE (v
, "clname", clname
);
2907 PUSH_FIELD_VALUE (v
, "name", name
);
2908 PUSH_FIELD_VALUE (v
, "signature", signature
);
2909 FINISH_RECORD_CONSTRUCTOR (symbol
, v
, symbol_type
);
2910 TREE_CONSTANT (symbol
) = 1;
2915 /* Make a symbol_type (_Jv_MethodSymbol) node for DECL. */
2918 build_symbol_entry (tree decl
, tree special
)
2920 tree clname
, name
, signature
;
2921 clname
= build_utf8_ref (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl
))));
2922 /* ??? Constructors are given the name foo.foo all the way through
2923 the compiler, but in the method table they're all renamed
2924 foo.<init>. So, we have to do the same here unless we want an
2925 unresolved reference at runtime. */
2926 name
= build_utf8_ref ((TREE_CODE (decl
) == FUNCTION_DECL
2927 && DECL_CONSTRUCTOR_P (decl
))
2928 ? init_identifier_node
2929 : DECL_NAME (decl
));
2930 signature
= build_java_signature (TREE_TYPE (decl
));
2931 signature
= build_utf8_ref (unmangle_classname
2932 (IDENTIFIER_POINTER (signature
),
2933 IDENTIFIER_LENGTH (signature
)));
2934 /* SPECIAL is either NULL_TREE or integer_one_node. We emit
2935 signature addr+1 if SPECIAL, and this indicates to the runtime
2936 system that this is a "special" symbol, i.e. one that should
2937 bypass access controls. */
2938 if (special
!= NULL_TREE
)
2939 signature
= fold_build_pointer_plus (signature
, special
);
2941 return build_symbol_table_entry (clname
, name
, signature
);
2944 /* Emit a symbol table: used by -findirect-dispatch. */
2947 emit_symbol_table (tree name
, tree the_table
,
2948 vec
<method_entry
, va_gc
> *decl_table
,
2949 tree the_syms_decl
, tree the_array_element_type
,
2952 tree table
, null_symbol
, table_size
, the_array_type
;
2955 vec
<constructor_elt
, va_gc
> *v
= NULL
;
2957 /* Only emit a table if this translation unit actually made any
2958 references via it. */
2962 /* Build a list of _Jv_MethodSymbols for each entry in otable_methods. */
2963 FOR_EACH_VEC_ELT (*decl_table
, index
, e
)
2964 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
2965 build_symbol_entry (e
->method
, e
->special
));
2967 /* Terminate the list with a "null" entry. */
2968 null_symbol
= build_symbol_table_entry (null_pointer_node
,
2971 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
, null_symbol
);
2973 tree symbols_arr_type
2974 = build_prim_array_type (symbol_type
, vec_safe_length (v
));
2976 table
= build_constructor (symbols_arr_type
, v
);
2978 /* Make it the initial value for otable_syms and emit the decl. */
2979 TREE_TYPE (the_syms_decl
) = symbols_arr_type
;
2980 relayout_decl (the_syms_decl
);
2981 DECL_INITIAL (the_syms_decl
) = table
;
2982 DECL_ARTIFICIAL (the_syms_decl
) = 1;
2983 DECL_IGNORED_P (the_syms_decl
) = 1;
2984 rest_of_decl_compilation (the_syms_decl
, 1, 0);
2986 /* Now that its size is known, redefine the table as an
2987 uninitialized static array of INDEX + 1 elements. The extra entry
2988 is used by the runtime to track whether the table has been
2991 = build_index_type (build_int_cst (NULL_TREE
, index
* element_size
+ 1));
2992 the_array_type
= build_array_type (the_array_element_type
, table_size
);
2993 the_table
= build_decl (input_location
,
2994 VAR_DECL
, name
, the_array_type
);
2995 TREE_STATIC (the_table
) = 1;
2996 TREE_READONLY (the_table
) = 1;
2997 rest_of_decl_compilation (the_table
, 1, 0);
3002 /* Make an entry for the catch_classes list. */
3004 make_catch_class_record (tree catch_class
, tree classname
)
3007 tree type
= TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (output_class
)));
3008 vec
<constructor_elt
, va_gc
> *v
= NULL
;
3009 START_RECORD_CONSTRUCTOR (v
, type
);
3010 PUSH_FIELD_VALUE (v
, "address", catch_class
);
3011 PUSH_FIELD_VALUE (v
, "classname", classname
);
3012 FINISH_RECORD_CONSTRUCTOR (entry
, v
, type
);
3017 /* Generate the list of Throwable classes that are caught by exception
3018 handlers in this class. */
3020 emit_catch_table (tree this_class
)
3022 tree table
, table_size
, array_type
;
3023 int n_catch_classes
;
3025 /* Fill in the dummy entry that make_class created. */
3026 e
= &(*TYPE_CATCH_CLASSES (this_class
))[0];
3027 e
->value
= make_catch_class_record (null_pointer_node
, null_pointer_node
);
3028 CONSTRUCTOR_APPEND_ELT (TYPE_CATCH_CLASSES (this_class
), NULL_TREE
,
3029 make_catch_class_record (null_pointer_node
,
3030 null_pointer_node
));
3031 n_catch_classes
= TYPE_CATCH_CLASSES (this_class
)->length ();
3032 table_size
= build_index_type (build_int_cst (NULL_TREE
, n_catch_classes
));
3034 = build_array_type (TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (this_class
))),
3037 build_decl (input_location
,
3038 VAR_DECL
, DECL_NAME (TYPE_CTABLE_DECL (this_class
)), array_type
);
3039 DECL_INITIAL (table
) =
3040 build_constructor (array_type
, TYPE_CATCH_CLASSES (this_class
));
3041 TREE_STATIC (table
) = 1;
3042 TREE_READONLY (table
) = 1;
3043 DECL_IGNORED_P (table
) = 1;
3044 rest_of_decl_compilation (table
, 1, 0);
3048 /* Given a type, return the signature used by
3049 _Jv_FindClassFromSignature() in libgcj. This isn't exactly the
3050 same as build_java_signature() because we want the canonical array
3054 build_signature_for_libgcj (tree type
)
3058 sig
= build_java_signature (type
);
3059 ref
= build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig
),
3060 IDENTIFIER_LENGTH (sig
)));
3064 /* Build an entry in the type assertion table. */
3067 build_assertion_table_entry (tree code
, tree op1
, tree op2
)
3069 vec
<constructor_elt
, va_gc
> *v
= NULL
;
3072 START_RECORD_CONSTRUCTOR (v
, assertion_entry_type
);
3073 PUSH_FIELD_VALUE (v
, "assertion_code", code
);
3074 PUSH_FIELD_VALUE (v
, "op1", op1
);
3075 PUSH_FIELD_VALUE (v
, "op2", op2
);
3076 FINISH_RECORD_CONSTRUCTOR (entry
, v
, assertion_entry_type
);
3081 /* Add an entry to the type assertion table. Callback used during hashtable
3085 add_assertion_table_entry (type_assertion
**slot
, vec
<constructor_elt
, va_gc
> **v
)
3088 tree code_val
, op1_utf8
, op2_utf8
;
3089 type_assertion
*as
= *slot
;
3091 code_val
= build_int_cst (NULL_TREE
, as
->assertion_code
);
3093 if (as
->op1
== NULL_TREE
)
3094 op1_utf8
= null_pointer_node
;
3096 op1_utf8
= build_signature_for_libgcj (as
->op1
);
3098 if (as
->op2
== NULL_TREE
)
3099 op2_utf8
= null_pointer_node
;
3101 op2_utf8
= build_signature_for_libgcj (as
->op2
);
3103 entry
= build_assertion_table_entry (code_val
, op1_utf8
, op2_utf8
);
3105 CONSTRUCTOR_APPEND_ELT (*v
, NULL_TREE
, entry
);
3109 /* Generate the type assertion table for KLASS, and return its DECL. */
3112 emit_assertion_table (tree klass
)
3114 tree null_entry
, ctor
, table_decl
;
3115 hash_table
<type_assertion_hasher
> *assertions_htab
= TYPE_ASSERTIONS (klass
);
3116 vec
<constructor_elt
, va_gc
> *v
= NULL
;
3118 /* Iterate through the hash table. */
3120 ->traverse
<vec
<constructor_elt
, va_gc
> **, add_assertion_table_entry
> (&v
);
3122 /* Finish with a null entry. */
3123 null_entry
= build_assertion_table_entry (integer_zero_node
,
3127 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
, null_entry
);
3130 = build_prim_array_type (assertion_entry_type
, vec_safe_length (v
));
3132 ctor
= build_constructor (type
, v
);
3134 table_decl
= build_decl (input_location
,
3135 VAR_DECL
, mangled_classname ("_type_assert_", klass
),
3138 TREE_STATIC (table_decl
) = 1;
3139 TREE_READONLY (table_decl
) = 1;
3140 TREE_CONSTANT (table_decl
) = 1;
3141 DECL_IGNORED_P (table_decl
) = 1;
3143 DECL_INITIAL (table_decl
) = ctor
;
3144 DECL_ARTIFICIAL (table_decl
) = 1;
3145 rest_of_decl_compilation (table_decl
, 1, 0);
3151 init_class_processing (void)
3153 fields_ident
= get_identifier ("fields");
3154 info_ident
= get_identifier ("info");
3156 gcc_obstack_init (&temporary_obstack
);
3159 /* A hash table mapping trees to trees. Used generally. */
3161 #define JAVA_TREEHASHHASH_H(t) ((hashval_t)TYPE_UID (t))
3164 treetreehasher::hash (treetreehash_entry
*k
)
3166 return JAVA_TREEHASHHASH_H (k
->key
);
3170 treetreehasher::equal (treetreehash_entry
*k1
, tree k2
)
3172 return (k1
->key
== k2
);
3176 java_treetreehash_find (hash_table
<treetreehasher
> *ht
, tree t
)
3178 struct treetreehash_entry
*e
;
3179 hashval_t hv
= JAVA_TREEHASHHASH_H (t
);
3180 e
= ht
->find_with_hash (t
, hv
);
3188 java_treetreehash_new (hash_table
<treetreehasher
> *ht
, tree t
)
3190 struct treetreehash_entry
*tthe
;
3191 hashval_t hv
= JAVA_TREEHASHHASH_H (t
);
3193 treetreehash_entry
**e
= ht
->find_slot_with_hash (t
, hv
, INSERT
);
3196 tthe
= ggc_cleared_alloc
<treetreehash_entry
> ();
3202 return &tthe
->value
;
3205 hash_table
<treetreehasher
> *
3206 java_treetreehash_create (size_t size
)
3208 return hash_table
<treetreehasher
>::create_ggc (size
);
3211 /* Break down qualified IDENTIFIER into package and class-name components.
3212 For example, given SOURCE "pkg.foo.Bar", LEFT will be set to
3213 "pkg.foo", and RIGHT to "Bar". */
3216 split_qualified_name (tree
*left
, tree
*right
, tree source
)
3219 int l
= IDENTIFIER_LENGTH (source
);
3221 base
= (char *) alloca (l
+ 1);
3222 memcpy (base
, IDENTIFIER_POINTER (source
), l
+ 1);
3224 /* Breakdown NAME into REMAINDER . IDENTIFIER. */
3226 while (*p
!= '.' && p
!= base
)
3229 /* We didn't find a '.'. Return an error. */
3235 *right
= get_identifier (p
+1);
3236 *left
= get_identifier (base
);
3241 /* Given two classes (TYPE_DECL) or class names (IDENTIFIER), return TRUE
3242 if the classes are from the same package. */
3245 in_same_package (tree name1
, tree name2
)
3251 if (TREE_CODE (name1
) == TYPE_DECL
)
3252 name1
= DECL_NAME (name1
);
3253 if (TREE_CODE (name2
) == TYPE_DECL
)
3254 name2
= DECL_NAME (name2
);
3256 if (QUALIFIED_P (name1
) != QUALIFIED_P (name2
))
3257 /* One in empty package. */
3260 if (QUALIFIED_P (name1
) == 0 && QUALIFIED_P (name2
) == 0)
3261 /* Both in empty package. */
3264 split_qualified_name (&pkg1
, &tmp
, name1
);
3265 split_qualified_name (&pkg2
, &tmp
, name2
);
3267 return (pkg1
== pkg2
);
3270 /* lang_hooks.decls.final_write_globals: perform final processing on
3271 global variables. */
3274 java_write_globals (void)
3276 tree
*vec
= vec_safe_address (pending_static_fields
);
3277 int len
= vec_safe_length (pending_static_fields
);
3278 write_global_declarations ();
3279 emit_debug_global_declarations (vec
, len
);
3280 vec_free (pending_static_fields
);
3283 #include "gt-java-class.h"