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 */
44 #include "tree-iterator.h"
47 static tree
make_method_value (tree
);
48 static tree
build_java_method_type (tree
, tree
, int);
49 static int32
hashUtf8String (const char *, int);
50 static tree
make_field_value (tree
);
51 static tree
get_dispatch_vector (tree
);
52 static tree
get_dispatch_table (tree
, tree
);
53 static int supers_all_compiled (tree type
);
54 static tree
maybe_layout_super_class (tree
, tree
);
55 static void add_miranda_methods (tree
, tree
);
56 static int assume_compiled (const char *);
57 static tree
build_symbol_entry (tree
, tree
);
58 static tree
emit_assertion_table (tree
);
59 static void register_class (void);
61 struct obstack temporary_obstack
;
63 static const char *cyclic_inheritance_report
;
65 /* The compiler generates different code depending on whether or not
66 it can assume certain classes have been compiled down to native
67 code or not. The compiler options -fassume-compiled= and
68 -fno-assume-compiled= are used to create a tree of
69 class_flag_node objects. This tree is queried to determine if
70 a class is assume to be compiled or not. Each node in the tree
71 represents either a package or a specific class. */
73 typedef struct class_flag_node_struct
75 /* The class or package name. */
78 /* Nonzero if this represents an exclusion. */
81 /* Pointers to other nodes in the tree. */
82 struct class_flag_node_struct
*parent
;
83 struct class_flag_node_struct
*sibling
;
84 struct class_flag_node_struct
*child
;
87 static class_flag_node
*find_class_flag_node (class_flag_node
*, const char *);
88 static void add_class_flag (class_flag_node
**, const char *, int);
90 /* This is the root of the include/exclude tree. */
92 static class_flag_node
*assume_compiled_tree
;
94 static class_flag_node
*enable_assert_tree
;
96 static GTY(()) tree class_roots
[4];
97 #define fields_ident class_roots[0] /* get_identifier ("fields") */
98 #define info_ident class_roots[1] /* get_identifier ("info") */
99 #define class_list class_roots[2]
100 #define class_dtable_decl class_roots[3]
102 static GTY(()) vec
<tree
, va_gc
> *registered_class
;
104 /* A tree that returns the address of the class$ of the class
105 currently being compiled. */
106 static GTY(()) tree this_classdollar
;
108 /* A list of static class fields. This is to emit proper debug
110 vec
<tree
, va_gc
> *pending_static_fields
;
112 /* Return the node that most closely represents the class whose name
113 is IDENT. Start the search from NODE (followed by its siblings).
114 Return NULL if an appropriate node does not exist. */
116 static class_flag_node
*
117 find_class_flag_node (class_flag_node
*node
, const char *ident
)
121 size_t node_ident_length
= strlen (node
->ident
);
123 /* node_ident_length is zero at the root of the tree. If the
124 identifiers are the same length, then we have matching
125 classes. Otherwise check if we've matched an enclosing
128 if (node_ident_length
== 0
129 || (strncmp (ident
, node
->ident
, node_ident_length
) == 0
130 && (ident
[node_ident_length
] == '\0'
131 || ident
[node_ident_length
] == '.')))
133 /* We've found a match, however, there might be a more
136 class_flag_node
*found
= find_class_flag_node (node
->child
, ident
);
143 /* No match yet. Continue through the sibling list. */
144 node
= node
->sibling
;
147 /* No match at all in this tree. */
152 add_class_flag (class_flag_node
**rootp
, const char *ident
, int value
)
154 class_flag_node
*root
= *rootp
;
155 class_flag_node
*parent
, *node
;
157 /* Create the root of the tree if it doesn't exist yet. */
161 root
= XNEW (class_flag_node
);
164 root
->sibling
= NULL
;
170 /* Calling the function with the empty string means we're setting
171 value for the root of the hierarchy. */
179 /* Find the parent node for this new node. PARENT will either be a
180 class or a package name. Adjust PARENT accordingly. */
182 parent
= find_class_flag_node (root
, ident
);
183 if (strcmp (ident
, parent
->ident
) == 0)
184 parent
->value
= value
;
187 /* Insert new node into the tree. */
188 node
= XNEW (class_flag_node
);
190 node
->ident
= xstrdup (ident
);
194 node
->parent
= parent
;
195 node
->sibling
= parent
->child
;
196 parent
->child
= node
;
200 /* Add a new IDENT to the include/exclude tree. It's an exclusion
201 if EXCLUDEP is nonzero. */
204 add_assume_compiled (const char *ident
, int excludep
)
206 add_class_flag (&assume_compiled_tree
, ident
, excludep
);
209 /* The default value returned by enable_assertions. */
211 #define DEFAULT_ENABLE_ASSERT (optimize == 0)
213 /* Enter IDENT (a class or package name) into the enable-assertions table.
214 VALUE is true to enable and false to disable. */
217 add_enable_assert (const char *ident
, int value
)
219 if (enable_assert_tree
== NULL
)
220 add_class_flag (&enable_assert_tree
, "", DEFAULT_ENABLE_ASSERT
);
221 add_class_flag (&enable_assert_tree
, ident
, value
);
224 /* Returns nonzero if IDENT is the name of a class that the compiler
225 should assume has been compiled to object code. */
228 assume_compiled (const char *ident
)
233 if (NULL
== assume_compiled_tree
)
236 i
= find_class_flag_node (assume_compiled_tree
, ident
);
243 /* Return true if we should generate code to check assertions within KLASS. */
246 enable_assertions (tree klass
)
248 /* Check if command-line specifies whether we should check assertions. */
250 if (klass
!= NULL_TREE
&& DECL_NAME (klass
) && enable_assert_tree
!= NULL
)
252 const char *ident
= IDENTIFIER_POINTER (DECL_NAME (klass
));
253 class_flag_node
*node
254 = find_class_flag_node (enable_assert_tree
, ident
);
258 /* The default is to enable assertions if generating class files,
259 or not optimizing. */
260 return DEFAULT_ENABLE_ASSERT
;
263 /* Return an IDENTIFIER_NODE the same as (OLD_NAME, OLD_LENGTH).
264 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
265 Also, PREFIX is prepended, and SUFFIX is appended. */
268 ident_subst (const char* old_name
,
275 int prefix_len
= strlen (prefix
);
276 int suffix_len
= strlen (suffix
);
277 int i
= prefix_len
+ old_length
+ suffix_len
+ 1;
278 char *buffer
= (char *) alloca (i
);
280 strcpy (buffer
, prefix
);
281 for (i
= 0; i
< old_length
; i
++)
283 char ch
= old_name
[i
];
286 buffer
[prefix_len
+ i
] = ch
;
288 strcpy (buffer
+ prefix_len
+ old_length
, suffix
);
289 return get_identifier (buffer
);
292 /* Return an IDENTIFIER_NODE the same as OLD_ID,
293 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
294 Also, PREFIX is prepended, and SUFFIX is appended. */
297 identifier_subst (const tree old_id
,
303 return ident_subst (IDENTIFIER_POINTER (old_id
), IDENTIFIER_LENGTH (old_id
),
304 prefix
, old_char
, new_char
, suffix
);
307 /* Generate a valid C identifier from the name of the class TYPE,
308 prefixed by PREFIX. */
311 mangled_classname (const char *prefix
, tree type
)
314 tree ident
= TYPE_NAME (type
);
315 if (TREE_CODE (ident
) != IDENTIFIER_NODE
)
316 ident
= DECL_NAME (ident
);
317 result
= identifier_subst (ident
, prefix
, '.', '_', "");
319 /* Replace any characters that aren't in the set [0-9a-zA-Z_$] with
320 "_0xXX". Class names containing such chracters are uncommon, but
321 they do sometimes occur in class files. Without this check,
322 these names cause assembly errors.
324 There is a possibility that a real class name could conflict with
325 the identifier we generate, but it is unlikely and will
326 immediately be detected as an assembler error. At some point we
327 should do something more elaborate (perhaps using the full
328 unicode mangling scheme) in order to prevent such a conflict. */
331 const int len
= IDENTIFIER_LENGTH (result
);
332 const char *p
= IDENTIFIER_POINTER (result
);
333 int illegal_chars
= 0;
335 /* Make two passes over the identifier. The first pass is merely
336 to count illegal characters; we need to do this in order to
337 allocate a buffer. */
338 for (i
= 0; i
< len
; i
++)
341 illegal_chars
+= (! ISALNUM (c
) && c
!= '_' && c
!= '$');
344 /* And the second pass, which is rarely executed, does the
346 if (illegal_chars
!= 0)
348 char *buffer
= (char *) alloca (illegal_chars
* 4 + len
+ 1);
351 for (i
= 0, j
= 0; i
< len
; i
++)
354 if (! ISALNUM (c
) && c
!= '_' && c
!= '$')
357 sprintf (&buffer
[j
], "0x%02x", c
);
365 result
= get_identifier (buffer
);
376 type
= make_node (RECORD_TYPE
);
377 /* Unfortunately we must create the binfo here, so that class
379 TYPE_BINFO (type
) = make_tree_binfo (0);
380 MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC (type
);
381 TYPE_CATCH_CLASSES (type
) = NULL
;
382 /* Push a dummy entry; we can't call make_catch_class_record here
383 because other infrastructure may not be set up yet. We'll come
384 back and fill it in later once said infrastructure is
386 CONSTRUCTOR_APPEND_ELT (TYPE_CATCH_CLASSES (type
), NULL_TREE
, NULL_TREE
);
391 /* Given a fully-qualified classname in NAME (whose length is NAME_LENGTH),
392 and where each of the constituents is separated by '/',
393 return a corresponding IDENTIFIER_NODE, except using '.' as separator. */
396 unmangle_classname (const char *name
, int name_length
)
398 tree to_return
= ident_subst (name
, name_length
, "", '/', '.', "");
399 /* It's not sufficient to compare to_return and get_identifier
400 (name) to determine whether to_return is qualified. There are
401 cases in signature analysis where name will be stripped of a
403 name
= IDENTIFIER_POINTER (to_return
);
407 QUALIFIED_P (to_return
) = 1;
414 #define GEN_TABLE(TABLE, NAME, TABLE_TYPE, TYPE) \
417 const char *type_name = IDENTIFIER_POINTER (mangled_classname ("", TYPE)); \
418 char *buf = (char *) alloca (strlen (type_name) \
419 + strlen (#NAME "_syms_") + 1); \
422 sprintf (buf, #NAME "_%s", type_name); \
423 TYPE_## TABLE ##_DECL (type) = decl = \
424 build_decl (input_location, VAR_DECL, get_identifier (buf), TABLE_TYPE); \
425 DECL_EXTERNAL (decl) = 1; \
426 TREE_STATIC (decl) = 1; \
427 TREE_READONLY (decl) = 1; \
428 TREE_CONSTANT (decl) = 1; \
429 DECL_IGNORED_P (decl) = 1; \
430 /* Mark the table as belonging to this class. */ \
432 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl); \
433 DECL_OWNER (decl) = TYPE; \
434 sprintf (buf, #NAME "_syms_%s", type_name); \
435 TYPE_## TABLE ##_SYMS_DECL (TYPE) = \
436 build_decl (input_location, VAR_DECL, get_identifier (buf), symbols_array_type); \
437 TREE_STATIC (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
438 TREE_CONSTANT (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
439 DECL_IGNORED_P (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
443 /* Given a class, create the DECLs for all its associated indirect
446 gen_indirect_dispatch_tables (tree type
)
448 const char *type_name
= IDENTIFIER_POINTER (mangled_classname ("", type
));
451 char *buf
= (char *) alloca (strlen (type_name
)
452 + strlen ("_catch_classes_") + 1);
453 tree catch_class_type
= make_node (RECORD_TYPE
);
455 sprintf (buf
, "_catch_classes_%s", type_name
);
456 PUSH_FIELD (input_location
,
457 catch_class_type
, field
, "address", utf8const_ptr_type
);
458 PUSH_FIELD (input_location
,
459 catch_class_type
, field
, "classname", ptr_type_node
);
460 FINISH_RECORD (catch_class_type
);
462 TYPE_CTABLE_DECL (type
)
463 = build_decl (input_location
, VAR_DECL
, get_identifier (buf
),
464 build_array_type (catch_class_type
, 0));
465 DECL_EXTERNAL (TYPE_CTABLE_DECL (type
)) = 1;
466 TREE_STATIC (TYPE_CTABLE_DECL (type
)) = 1;
467 TREE_READONLY (TYPE_CTABLE_DECL (type
)) = 1;
468 TREE_CONSTANT (TYPE_CTABLE_DECL (type
)) = 1;
469 DECL_IGNORED_P (TYPE_CTABLE_DECL (type
)) = 1;
470 pushdecl (TYPE_CTABLE_DECL (type
));
473 if (flag_indirect_dispatch
)
475 GEN_TABLE (ATABLE
, _atable
, atable_type
, type
);
476 GEN_TABLE (OTABLE
, _otable
, otable_type
, type
);
477 GEN_TABLE (ITABLE
, _itable
, itable_type
, type
);
484 push_class (tree class_type
, tree class_name
)
486 tree decl
, signature
;
487 location_t saved_loc
= input_location
;
488 CLASS_P (class_type
) = 1;
489 decl
= build_decl (input_location
, TYPE_DECL
, class_name
, class_type
);
490 TYPE_DECL_SUPPRESS_DEBUG (decl
) = 1;
492 /* dbxout needs a DECL_SIZE if in gstabs mode */
493 DECL_SIZE (decl
) = integer_zero_node
;
495 input_location
= saved_loc
;
496 signature
= identifier_subst (class_name
, "L", '.', '/', ";");
497 IDENTIFIER_SIGNATURE_TYPE (signature
) = build_pointer_type (class_type
);
499 /* Setting DECL_ARTIFICIAL forces dbxout.c to specific the type is
500 both a typedef and in the struct name-space. We may want to re-visit
501 this later, but for now it reduces the changes needed for gdb. */
502 DECL_ARTIFICIAL (decl
) = 1;
504 pushdecl_top_level (decl
);
509 /* Finds the (global) class named NAME. Creates the class if not found.
510 Also creates associated TYPE_DECL.
511 Does not check if the class actually exists, load the class,
512 fill in field or methods, or do layout_type. */
515 lookup_class (tree name
)
517 tree decl
= IDENTIFIER_CLASS_VALUE (name
);
518 if (decl
== NULL_TREE
)
519 decl
= push_class (make_class (), name
);
520 return TREE_TYPE (decl
);
524 set_super_info (int access_flags
, tree this_class
,
525 tree super_class
, int interfaces_count
)
527 int total_supers
= interfaces_count
;
528 tree class_decl
= TYPE_NAME (this_class
);
534 TYPE_BINFO (this_class
) = make_tree_binfo (total_supers
);
535 TYPE_VFIELD (this_class
) = TYPE_VFIELD (object_type_node
);
538 tree super_binfo
= make_tree_binfo (0);
539 BINFO_TYPE (super_binfo
) = super_class
;
540 BINFO_OFFSET (super_binfo
) = integer_zero_node
;
541 BINFO_BASE_APPEND (TYPE_BINFO (this_class
), super_binfo
);
542 CLASS_HAS_SUPER_FLAG (TYPE_BINFO (this_class
)) = 1;
545 set_class_decl_access_flags (access_flags
, class_decl
);
549 set_class_decl_access_flags (int access_flags
, tree class_decl
)
551 if (access_flags
& ACC_PUBLIC
) CLASS_PUBLIC (class_decl
) = 1;
552 if (access_flags
& ACC_FINAL
) CLASS_FINAL (class_decl
) = 1;
553 if (access_flags
& ACC_SUPER
) CLASS_SUPER (class_decl
) = 1;
554 if (access_flags
& ACC_INTERFACE
) CLASS_INTERFACE (class_decl
) = 1;
555 if (access_flags
& ACC_ABSTRACT
) CLASS_ABSTRACT (class_decl
) = 1;
556 if (access_flags
& ACC_STATIC
) CLASS_STATIC (class_decl
) = 1;
557 if (access_flags
& ACC_PRIVATE
) CLASS_PRIVATE (class_decl
) = 1;
558 if (access_flags
& ACC_PROTECTED
) CLASS_PROTECTED (class_decl
) = 1;
559 if (access_flags
& ACC_STRICT
) CLASS_STRICTFP (class_decl
) = 1;
560 if (access_flags
& ACC_ENUM
) CLASS_ENUM (class_decl
) = 1;
561 if (access_flags
& ACC_SYNTHETIC
) CLASS_SYNTHETIC (class_decl
) = 1;
562 if (access_flags
& ACC_ANNOTATION
) CLASS_ANNOTATION (class_decl
) = 1;
565 /* Return length of inheritance chain of CLAS, where java.lang.Object is 0,
566 direct sub-classes of Object are 1, and so on. */
569 class_depth (tree clas
)
572 if (! CLASS_LOADED_P (clas
))
573 load_class (clas
, 1);
574 if (TYPE_SIZE (clas
) == error_mark_node
)
576 while (clas
!= object_type_node
)
579 clas
= BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (clas
), 0));
584 /* Return true iff TYPE2 is an interface that extends interface TYPE1 */
587 interface_of_p (tree type1
, tree type2
)
590 tree binfo
, base_binfo
;
592 if (! TYPE_BINFO (type2
))
595 for (binfo
= TYPE_BINFO (type2
), i
= 0;
596 BINFO_BASE_ITERATE (binfo
, i
, base_binfo
); i
++)
597 if (BINFO_TYPE (base_binfo
) == type1
)
600 for (binfo
= TYPE_BINFO (type2
), i
= 0;
601 BINFO_BASE_ITERATE (binfo
, i
, base_binfo
); i
++) /* */
602 if (BINFO_TYPE (base_binfo
)
603 && interface_of_p (type1
, BINFO_TYPE (base_binfo
)))
609 /* Return true iff TYPE1 inherits from TYPE2. */
612 inherits_from_p (tree type1
, tree type2
)
614 while (type1
!= NULL_TREE
&& TREE_CODE (type1
) == RECORD_TYPE
)
619 if (! CLASS_LOADED_P (type1
))
620 load_class (type1
, 1);
622 type1
= maybe_layout_super_class (CLASSTYPE_SUPER (type1
), type1
);
627 /* Return a 1 iff TYPE1 is an enclosing context for TYPE2 */
630 enclosing_context_p (tree type1
, tree type2
)
632 if (!INNER_CLASS_TYPE_P (type2
))
635 for (type2
= TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2
)));
637 type2
= (INNER_CLASS_TYPE_P (type2
) ?
638 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2
))) : NULL_TREE
))
648 /* Return 1 iff TYPE1 and TYPE2 share a common enclosing class, regardless of
652 common_enclosing_context_p (tree type1
, tree type2
)
657 for (current
= type2
; current
;
658 current
= (INNER_CLASS_TYPE_P (current
) ?
659 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current
))) :
661 if (type1
== current
)
664 if (INNER_CLASS_TYPE_P (type1
))
665 type1
= TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1
)));
672 /* Return 1 iff there exists a common enclosing "this" between TYPE1
673 and TYPE2, without crossing any static context. */
676 common_enclosing_instance_p (tree type1
, tree type2
)
678 if (!PURE_INNER_CLASS_TYPE_P (type1
) || !PURE_INNER_CLASS_TYPE_P (type2
))
681 for (type1
= TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1
))); type1
;
682 type1
= (PURE_INNER_CLASS_TYPE_P (type1
) ?
683 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1
))) : NULL_TREE
))
686 for (current
= TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2
))); current
;
687 current
= (PURE_INNER_CLASS_TYPE_P (current
) ?
688 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current
))) :
690 if (type1
== current
)
696 /* Add INTERFACE_CLASS to THIS_CLASS iff INTERFACE_CLASS can't be
697 found in THIS_CLASS. Returns NULL_TREE upon success, INTERFACE_CLASS
698 if attempt is made to add it twice. */
701 maybe_add_interface (tree this_class
, tree interface_class
)
703 tree binfo
, base_binfo
;
706 for (binfo
= TYPE_BINFO (this_class
), i
= 0;
707 BINFO_BASE_ITERATE (binfo
, i
, base_binfo
); i
++)
708 if (BINFO_TYPE (base_binfo
) == interface_class
)
709 return interface_class
;
710 add_interface (this_class
, interface_class
);
714 /* Add the INTERFACE_CLASS as one of the interfaces of THIS_CLASS. */
717 add_interface (tree this_class
, tree interface_class
)
719 tree interface_binfo
= make_tree_binfo (0);
721 BINFO_TYPE (interface_binfo
) = interface_class
;
722 BINFO_OFFSET (interface_binfo
) = integer_zero_node
;
723 BINFO_VPTR_FIELD (interface_binfo
) = integer_zero_node
;
724 BINFO_VIRTUAL_P (interface_binfo
) = 1;
726 BINFO_BASE_APPEND (TYPE_BINFO (this_class
), interface_binfo
);
730 build_java_method_type (tree fntype
, tree this_class
, int access_flags
)
732 if (access_flags
& ACC_STATIC
)
734 fntype
= build_method_type (this_class
, fntype
);
736 /* We know that arg 1 of every nonstatic method is non-null; tell
738 TYPE_ATTRIBUTES (fntype
) = (tree_cons
739 (get_identifier ("nonnull"),
740 tree_cons (NULL_TREE
,
741 build_int_cst (NULL_TREE
, 1),
743 TYPE_ATTRIBUTES (fntype
)));
748 java_hide_decl (tree decl ATTRIBUTE_UNUSED
)
750 #ifdef HAVE_GAS_HIDDEN
751 DECL_VISIBILITY (decl
) = VISIBILITY_HIDDEN
;
752 DECL_VISIBILITY_SPECIFIED (decl
) = 1;
757 add_method_1 (tree this_class
, int access_flags
, tree name
, tree function_type
)
759 tree method_type
, fndecl
;
761 method_type
= build_java_method_type (function_type
,
762 this_class
, access_flags
);
764 fndecl
= build_decl (input_location
, FUNCTION_DECL
, name
, method_type
);
765 DECL_CONTEXT (fndecl
) = this_class
;
767 DECL_LANG_SPECIFIC (fndecl
) = ggc_cleared_alloc
<struct lang_decl
> ();
768 DECL_LANG_SPECIFIC (fndecl
)->desc
= LANG_DECL_FUNC
;
770 /* Initialize the static initializer test table. */
772 DECL_FUNCTION_INIT_TEST_TABLE (fndecl
) = java_treetreehash_create (10);
774 /* Initialize the initialized (static) class table. */
775 if (access_flags
& ACC_STATIC
)
776 DECL_FUNCTION_INITIALIZED_CLASS_TABLE (fndecl
) =
777 hash_table
<ict_hasher
>::create_ggc (50);
779 DECL_CHAIN (fndecl
) = TYPE_METHODS (this_class
);
780 TYPE_METHODS (this_class
) = fndecl
;
782 /* If pointers to member functions use the least significant bit to
783 indicate whether a function is virtual, ensure a pointer
784 to this function will have that bit clear. */
785 if (TARGET_PTRMEMFUNC_VBIT_LOCATION
== ptrmemfunc_vbit_in_pfn
786 && !(access_flags
& ACC_STATIC
)
787 && DECL_ALIGN (fndecl
) < 2 * BITS_PER_UNIT
)
788 DECL_ALIGN (fndecl
) = 2 * BITS_PER_UNIT
;
790 /* Notice that this is a finalizer and update the class type
791 accordingly. This is used to optimize instance allocation. */
792 if (name
== finalize_identifier_node
793 && TREE_TYPE (function_type
) == void_type_node
794 && TREE_VALUE (TYPE_ARG_TYPES (function_type
)) == void_type_node
)
795 HAS_FINALIZER_P (this_class
) = 1;
797 if (access_flags
& ACC_PUBLIC
) METHOD_PUBLIC (fndecl
) = 1;
798 if (access_flags
& ACC_PROTECTED
) METHOD_PROTECTED (fndecl
) = 1;
799 if (access_flags
& ACC_PRIVATE
)
800 METHOD_PRIVATE (fndecl
) = 1;
801 if (access_flags
& ACC_NATIVE
)
803 METHOD_NATIVE (fndecl
) = 1;
804 DECL_EXTERNAL (fndecl
) = 1;
807 /* FNDECL is external unless we are compiling it into this object
809 DECL_EXTERNAL (fndecl
) = CLASS_FROM_CURRENTLY_COMPILED_P (this_class
) == 0;
810 if (access_flags
& ACC_STATIC
)
811 METHOD_STATIC (fndecl
) = 1;
812 if (access_flags
& ACC_FINAL
)
813 METHOD_FINAL (fndecl
) = 1;
814 if (access_flags
& ACC_SYNCHRONIZED
) METHOD_SYNCHRONIZED (fndecl
) = 1;
815 if (access_flags
& ACC_ABSTRACT
) METHOD_ABSTRACT (fndecl
) = 1;
816 if (access_flags
& ACC_STRICT
) METHOD_STRICTFP (fndecl
) = 1;
817 if (access_flags
& ACC_SYNTHETIC
) DECL_ARTIFICIAL (fndecl
) = 1;
818 if (access_flags
& ACC_BRIDGE
) METHOD_BRIDGE (fndecl
) = 1;
819 if (access_flags
& ACC_VARARGS
) METHOD_VARARGS (fndecl
) = 1;
823 /* Add a method to THIS_CLASS.
824 The method's name is NAME.
825 Its signature (mangled type) is METHOD_SIG (an IDENTIFIER_NODE). */
828 add_method (tree this_class
, int access_flags
, tree name
, tree method_sig
)
830 tree function_type
, fndecl
;
831 const unsigned char *sig
832 = (const unsigned char *) IDENTIFIER_POINTER (method_sig
);
835 fatal_error ("bad method signature");
837 function_type
= get_type_from_signature (method_sig
);
838 fndecl
= add_method_1 (this_class
, access_flags
, name
, function_type
);
839 set_java_signature (TREE_TYPE (fndecl
), method_sig
);
844 add_field (tree klass
, tree name
, tree field_type
, int flags
)
846 int is_static
= (flags
& ACC_STATIC
) != 0;
848 field
= build_decl (input_location
,
849 is_static
? VAR_DECL
: FIELD_DECL
, name
, field_type
);
850 DECL_CHAIN (field
) = TYPE_FIELDS (klass
);
851 TYPE_FIELDS (klass
) = field
;
852 DECL_CONTEXT (field
) = klass
;
853 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field
);
855 if (flags
& ACC_PUBLIC
) FIELD_PUBLIC (field
) = 1;
856 if (flags
& ACC_PROTECTED
) FIELD_PROTECTED (field
) = 1;
857 if (flags
& ACC_PRIVATE
) FIELD_PRIVATE (field
) = 1;
858 if (flags
& ACC_FINAL
) FIELD_FINAL (field
) = 1;
859 if (flags
& ACC_VOLATILE
)
861 FIELD_VOLATILE (field
) = 1;
862 TREE_THIS_VOLATILE (field
) = 1;
864 if (flags
& ACC_TRANSIENT
) FIELD_TRANSIENT (field
) = 1;
865 if (flags
& ACC_ENUM
) FIELD_ENUM (field
) = 1;
866 if (flags
& ACC_SYNTHETIC
) FIELD_SYNTHETIC (field
) = 1;
869 FIELD_STATIC (field
) = 1;
870 /* Always make field externally visible. This is required so
871 that native methods can always access the field. */
872 TREE_PUBLIC (field
) = 1;
873 /* Hide everything that shouldn't be visible outside a DSO. */
874 if (flag_indirect_classes
875 || (FIELD_PRIVATE (field
)))
876 java_hide_decl (field
);
877 /* Considered external unless we are compiling it into this
879 DECL_EXTERNAL (field
) = (is_compiled_class (klass
) != 2);
880 if (!DECL_EXTERNAL (field
))
881 vec_safe_push (pending_static_fields
, field
);
887 /* Associate a constant value CONSTANT with VAR_DECL FIELD. */
890 set_constant_value (tree field
, tree constant
)
892 if (field
== NULL_TREE
)
893 warning (OPT_Wattributes
,
894 "misplaced ConstantValue attribute (not in any field)");
895 else if (DECL_INITIAL (field
) != NULL_TREE
)
896 warning (OPT_Wattributes
,
897 "duplicate ConstantValue attribute for field '%s'",
898 IDENTIFIER_POINTER (DECL_NAME (field
)));
901 DECL_INITIAL (field
) = constant
;
902 if (TREE_TYPE (constant
) != TREE_TYPE (field
)
903 && ! (TREE_TYPE (constant
) == int_type_node
904 && INTEGRAL_TYPE_P (TREE_TYPE (field
))
905 && TYPE_PRECISION (TREE_TYPE (field
)) <= 32)
906 && ! (TREE_TYPE (constant
) == utf8const_ptr_type
907 && TREE_TYPE (field
) == string_ptr_type_node
))
908 error ("ConstantValue attribute of field '%s' has wrong type",
909 IDENTIFIER_POINTER (DECL_NAME (field
)));
913 /* Calculate a hash value for a string encoded in Utf8 format.
914 * This returns the same hash value as specified for java.lang.String.hashCode.
918 hashUtf8String (const char *str
, int len
)
920 const unsigned char* ptr
= (const unsigned char*) str
;
921 const unsigned char *limit
= ptr
+ len
;
925 int ch
= UTF8_GET (ptr
, limit
);
926 /* Updated specification from
927 http://www.javasoft.com/docs/books/jls/clarify.html. */
928 hash
= (31 * hash
) + ch
;
934 build_utf8_ref (tree name
)
936 const char * name_ptr
= IDENTIFIER_POINTER (name
);
937 int name_len
= IDENTIFIER_LENGTH (name
), name_pad
;
939 tree ctype
, field
= NULL_TREE
, str_type
, cinit
, string
;
940 static int utf8_count
= 0;
942 tree ref
= IDENTIFIER_UTF8_REF (name
);
944 vec
<constructor_elt
, va_gc
> *v
= NULL
;
945 if (ref
!= NULL_TREE
)
948 ctype
= make_node (RECORD_TYPE
);
949 /* '\0' byte plus padding to utf8const_type's alignment. */
950 name_pad
= TYPE_ALIGN_UNIT (utf8const_type
)
951 - (name_len
& (TYPE_ALIGN_UNIT (utf8const_type
) - 1));
952 str_type
= build_prim_array_type (unsigned_byte_type_node
,
953 name_len
+ name_pad
);
954 PUSH_FIELD (input_location
, ctype
, field
, "hash", unsigned_short_type_node
);
955 PUSH_FIELD (input_location
,
956 ctype
, field
, "length", unsigned_short_type_node
);
957 PUSH_FIELD (input_location
, ctype
, field
, "data", str_type
);
958 FINISH_RECORD (ctype
);
959 START_RECORD_CONSTRUCTOR (v
, ctype
);
960 name_hash
= hashUtf8String (name_ptr
, name_len
) & 0xFFFF;
961 PUSH_FIELD_VALUE (v
, "hash", build_int_cst (NULL_TREE
, name_hash
));
962 PUSH_FIELD_VALUE (v
, "length", build_int_cst (NULL_TREE
, name_len
));
963 string
= build_string (name_len
, name_ptr
);
964 TREE_TYPE (string
) = str_type
;
965 PUSH_FIELD_VALUE (v
, "data", string
);
966 FINISH_RECORD_CONSTRUCTOR (cinit
, v
, ctype
);
967 TREE_CONSTANT (cinit
) = 1;
969 /* Generate a unique-enough identifier. */
970 sprintf(buf
, "_Utf%d", ++utf8_count
);
972 decl
= build_decl (input_location
,
973 VAR_DECL
, get_identifier (buf
), utf8const_type
);
974 TREE_STATIC (decl
) = 1;
975 DECL_ARTIFICIAL (decl
) = 1;
976 DECL_IGNORED_P (decl
) = 1;
977 TREE_READONLY (decl
) = 1;
978 TREE_THIS_VOLATILE (decl
) = 0;
979 DECL_INITIAL (decl
) = cinit
;
980 DECL_USER_ALIGN (decl
) = 1;
982 if (HAVE_GAS_SHF_MERGE
)
985 /* Ensure decl_size is a multiple of utf8const_type's alignment. */
986 decl_size
= name_len
+ 4 + name_pad
;
987 if (flag_merge_constants
&& decl_size
< 256)
990 int flags
= (SECTION_OVERRIDE
991 | SECTION_MERGE
| (SECTION_ENTSIZE
& decl_size
));
992 sprintf (buf
, ".rodata.jutf8.%d", decl_size
);
993 switch_to_section (get_section (buf
, flags
, NULL
));
994 set_decl_section_name (decl
, buf
);
998 layout_decl (decl
, 0);
999 DECL_SIZE (decl
) = TYPE_SIZE (ctype
);
1000 DECL_SIZE_UNIT (decl
) = TYPE_SIZE_UNIT (ctype
);
1002 rest_of_decl_compilation (decl
, global_bindings_p (), 0);
1003 ref
= build1 (ADDR_EXPR
, utf8const_ptr_type
, decl
);
1004 IDENTIFIER_UTF8_REF (name
) = ref
;
1008 /* Like build_class_ref, but instead of a direct reference generate a
1009 pointer into the constant pool. */
1012 build_indirect_class_ref (tree type
)
1016 index
= alloc_class_constant (type
);
1017 cl
= build_ref_from_constant_pool (index
);
1018 return convert (promote_type (class_ptr_type
), cl
);
1022 build_static_class_ref (tree type
)
1024 tree decl_name
, decl
, ref
;
1026 if (TYPE_SIZE (type
) == error_mark_node
)
1027 return null_pointer_node
;
1028 decl_name
= identifier_subst (DECL_NAME (TYPE_NAME (type
)),
1029 "", '/', '/', ".class$$");
1030 decl
= IDENTIFIER_GLOBAL_VALUE (decl_name
);
1031 if (decl
== NULL_TREE
)
1033 decl
= build_decl (input_location
, VAR_DECL
, decl_name
, class_type_node
);
1034 TREE_STATIC (decl
) = 1;
1035 if (! flag_indirect_classes
)
1037 TREE_PUBLIC (decl
) = 1;
1038 if (CLASS_PRIVATE (TYPE_NAME (type
)))
1039 java_hide_decl (decl
);
1041 DECL_IGNORED_P (decl
) = 1;
1042 DECL_ARTIFICIAL (decl
) = 1;
1043 if (is_compiled_class (type
) == 1)
1044 DECL_EXTERNAL (decl
) = 1;
1045 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl
);
1046 DECL_CLASS_FIELD_P (decl
) = 1;
1047 DECL_CONTEXT (decl
) = type
;
1049 /* ??? We want to preserve the DECL_CONTEXT we set just above,
1050 that that means not calling pushdecl_top_level. */
1051 IDENTIFIER_GLOBAL_VALUE (decl_name
) = decl
;
1054 ref
= build1 (ADDR_EXPR
, class_ptr_type
, decl
);
1059 build_classdollar_field (tree type
)
1061 tree decl_name
= identifier_subst (DECL_NAME (TYPE_NAME (type
)),
1062 "", '/', '/', ".class$");
1063 tree decl
= IDENTIFIER_GLOBAL_VALUE (decl_name
);
1065 if (decl
== NULL_TREE
)
1068 = build_decl (input_location
,
1069 VAR_DECL
, decl_name
,
1070 (build_qualified_type
1072 (build_qualified_type (class_type_node
,
1075 TREE_STATIC (decl
) = 1;
1076 TREE_CONSTANT (decl
) = 1;
1077 TREE_READONLY (decl
) = 1;
1078 TREE_PUBLIC (decl
) = 1;
1079 java_hide_decl (decl
);
1080 DECL_IGNORED_P (decl
) = 1;
1081 DECL_ARTIFICIAL (decl
) = 1;
1082 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl
);
1083 IDENTIFIER_GLOBAL_VALUE (decl_name
) = decl
;
1084 DECL_CLASS_FIELD_P (decl
) = 1;
1085 DECL_CONTEXT (decl
) = type
;
1091 /* Create a local variable that holds the current class$. */
1094 cache_this_class_ref (tree fndecl
)
1098 tree classdollar_field
;
1099 if (flag_indirect_classes
)
1100 classdollar_field
= build_classdollar_field (output_class
);
1102 classdollar_field
= build_static_class_ref (output_class
);
1104 this_classdollar
= build_decl (input_location
,
1105 VAR_DECL
, NULL_TREE
,
1106 TREE_TYPE (classdollar_field
));
1108 java_add_local_var (this_classdollar
);
1109 java_add_stmt (build2 (MODIFY_EXPR
, TREE_TYPE (this_classdollar
),
1110 this_classdollar
, classdollar_field
));
1113 this_classdollar
= build_classdollar_field (output_class
);
1115 /* Prepend class initialization for static methods reachable from
1117 if (METHOD_STATIC (fndecl
)
1118 && (! METHOD_PRIVATE (fndecl
)
1119 || INNER_CLASS_P (DECL_CONTEXT (fndecl
)))
1120 && ! DECL_CLINIT_P (fndecl
)
1121 && ! CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (fndecl
))))
1123 tree init
= build_call_expr (soft_initclass_node
, 1,
1125 java_add_stmt (init
);
1129 /* Remove the reference to the local variable that holds the current
1133 uncache_this_class_ref (tree fndecl ATTRIBUTE_UNUSED
)
1135 this_classdollar
= build_classdollar_field (output_class
);
1138 /* Build a reference to the class TYPE.
1139 Also handles primitive types and array types. */
1142 build_class_ref (tree type
)
1144 int is_compiled
= is_compiled_class (type
);
1148 if (TREE_CODE (type
) == POINTER_TYPE
)
1149 type
= TREE_TYPE (type
);
1151 if (flag_indirect_dispatch
1152 && type
!= output_class
1153 && TREE_CODE (type
) == RECORD_TYPE
)
1154 return build_indirect_class_ref (type
);
1156 if (type
== output_class
&& flag_indirect_classes
)
1158 /* This can be NULL if we see a JNI stub before we see any
1160 if (! this_classdollar
)
1161 this_classdollar
= build_classdollar_field (output_class
);
1162 return this_classdollar
;
1165 if (TREE_CODE (type
) == RECORD_TYPE
)
1166 return build_static_class_ref (type
);
1172 decl_name
= TYPE_NAME (type
);
1173 if (TREE_CODE (decl_name
) == TYPE_DECL
)
1174 decl_name
= DECL_NAME (decl_name
);
1175 name
= IDENTIFIER_POINTER (decl_name
);
1176 if (strncmp (name
, "promoted_", 9) == 0)
1178 sprintf (buffer
, "_Jv_%sClass", name
);
1179 decl_name
= get_identifier (buffer
);
1180 decl
= IDENTIFIER_GLOBAL_VALUE (decl_name
);
1181 if (decl
== NULL_TREE
)
1183 decl
= build_decl (input_location
,
1184 VAR_DECL
, decl_name
, class_type_node
);
1185 TREE_STATIC (decl
) = 1;
1186 TREE_PUBLIC (decl
) = 1;
1187 DECL_EXTERNAL (decl
) = 1;
1188 DECL_ARTIFICIAL (decl
) = 1;
1189 pushdecl_top_level (decl
);
1193 ref
= build1 (ADDR_EXPR
, class_ptr_type
, decl
);
1197 return build_indirect_class_ref (type
);
1200 /* Create a local statically allocated variable that will hold a
1201 pointer to a static field. */
1204 build_fieldref_cache_entry (int index
, tree fdecl ATTRIBUTE_UNUSED
)
1206 tree decl
, decl_name
;
1207 const char *name
= IDENTIFIER_POINTER (mangled_classname ("_cpool_", output_class
));
1208 char *buf
= (char *) alloca (strlen (name
) + 20);
1209 sprintf (buf
, "%s_%d_ref", name
, index
);
1210 decl_name
= get_identifier (buf
);
1211 decl
= IDENTIFIER_GLOBAL_VALUE (decl_name
);
1212 if (decl
== NULL_TREE
)
1214 decl
= build_decl (input_location
,
1215 VAR_DECL
, decl_name
, ptr_type_node
);
1216 TREE_STATIC (decl
) = 1;
1217 TREE_PUBLIC (decl
) = 0;
1218 DECL_EXTERNAL (decl
) = 0;
1219 DECL_ARTIFICIAL (decl
) = 1;
1220 DECL_IGNORED_P (decl
) = 1;
1221 pushdecl_top_level (decl
);
1227 build_static_field_ref (tree fdecl
)
1229 tree fclass
= DECL_CONTEXT (fdecl
);
1230 int is_compiled
= is_compiled_class (fclass
);
1232 /* Allow static final fields to fold to a constant. When using
1233 -findirect-dispatch, we simply never do this folding if compiling
1234 from .class; in the .class file constants will be referred to via
1235 the constant pool. */
1236 if (!flag_indirect_dispatch
1238 || (FIELD_FINAL (fdecl
) && DECL_INITIAL (fdecl
) != NULL_TREE
1239 && (JSTRING_TYPE_P (TREE_TYPE (fdecl
))
1240 || JNUMERIC_TYPE_P (TREE_TYPE (fdecl
)))
1241 && TREE_CONSTANT (DECL_INITIAL (fdecl
)))))
1243 if (is_compiled
== 1)
1244 DECL_EXTERNAL (fdecl
) = 1;
1248 /* Generate a CONSTANT_FieldRef for FDECL in the constant pool
1249 and a class local static variable CACHE_ENTRY, then
1251 *(fdecl **)((__builtin_expect (cache_entry == null, false))
1252 ? cache_entry = _Jv_ResolvePoolEntry (output_class, cpool_index)
1255 This can mostly be optimized away, so that the usual path is a
1256 load followed by a test and branch. _Jv_ResolvePoolEntry is
1257 only called once for each constant pool entry.
1259 There is an optimization that we don't do: at the start of a
1260 method, create a local copy of CACHE_ENTRY and use that instead.
1264 int cpool_index
= alloc_constant_fieldref (output_class
, fdecl
);
1265 tree cache_entry
= build_fieldref_cache_entry (cpool_index
, fdecl
);
1267 = build_call_expr (builtin_decl_implicit (BUILT_IN_EXPECT
), 2,
1268 build2 (EQ_EXPR
, boolean_type_node
,
1269 cache_entry
, null_pointer_node
),
1270 boolean_false_node
);
1271 tree cpool_index_cst
= build_int_cst (NULL_TREE
, cpool_index
);
1273 = build_call_expr (soft_resolvepoolentry_node
, 2,
1274 build_class_ref (output_class
),
1276 init
= build2 (MODIFY_EXPR
, ptr_type_node
, cache_entry
, init
);
1277 init
= build3 (COND_EXPR
, ptr_type_node
, test
, init
, cache_entry
);
1278 init
= fold_convert (build_pointer_type (TREE_TYPE (fdecl
)), init
);
1279 fdecl
= build1 (INDIRECT_REF
, TREE_TYPE (fdecl
), init
);
1285 get_access_flags_from_decl (tree decl
)
1287 int access_flags
= 0;
1288 if (TREE_CODE (decl
) == FIELD_DECL
|| TREE_CODE (decl
) == VAR_DECL
)
1290 if (FIELD_STATIC (decl
))
1291 access_flags
|= ACC_STATIC
;
1292 if (FIELD_PUBLIC (decl
))
1293 access_flags
|= ACC_PUBLIC
;
1294 if (FIELD_PROTECTED (decl
))
1295 access_flags
|= ACC_PROTECTED
;
1296 if (FIELD_PRIVATE (decl
))
1297 access_flags
|= ACC_PRIVATE
;
1298 if (FIELD_FINAL (decl
))
1299 access_flags
|= ACC_FINAL
;
1300 if (FIELD_VOLATILE (decl
))
1301 access_flags
|= ACC_VOLATILE
;
1302 if (FIELD_TRANSIENT (decl
))
1303 access_flags
|= ACC_TRANSIENT
;
1304 if (FIELD_ENUM (decl
))
1305 access_flags
|= ACC_ENUM
;
1306 if (FIELD_SYNTHETIC (decl
))
1307 access_flags
|= ACC_SYNTHETIC
;
1308 return access_flags
;
1310 if (TREE_CODE (decl
) == TYPE_DECL
)
1312 if (CLASS_PUBLIC (decl
))
1313 access_flags
|= ACC_PUBLIC
;
1314 if (CLASS_FINAL (decl
))
1315 access_flags
|= ACC_FINAL
;
1316 if (CLASS_SUPER (decl
))
1317 access_flags
|= ACC_SUPER
;
1318 if (CLASS_INTERFACE (decl
))
1319 access_flags
|= ACC_INTERFACE
;
1320 if (CLASS_ABSTRACT (decl
))
1321 access_flags
|= ACC_ABSTRACT
;
1322 if (CLASS_STATIC (decl
))
1323 access_flags
|= ACC_STATIC
;
1324 if (CLASS_PRIVATE (decl
))
1325 access_flags
|= ACC_PRIVATE
;
1326 if (CLASS_PROTECTED (decl
))
1327 access_flags
|= ACC_PROTECTED
;
1328 if (CLASS_STRICTFP (decl
))
1329 access_flags
|= ACC_STRICT
;
1330 if (CLASS_ENUM (decl
))
1331 access_flags
|= ACC_ENUM
;
1332 if (CLASS_SYNTHETIC (decl
))
1333 access_flags
|= ACC_SYNTHETIC
;
1334 if (CLASS_ANNOTATION (decl
))
1335 access_flags
|= ACC_ANNOTATION
;
1336 return access_flags
;
1338 if (TREE_CODE (decl
) == FUNCTION_DECL
)
1340 if (METHOD_PUBLIC (decl
))
1341 access_flags
|= ACC_PUBLIC
;
1342 if (METHOD_PRIVATE (decl
))
1343 access_flags
|= ACC_PRIVATE
;
1344 if (METHOD_PROTECTED (decl
))
1345 access_flags
|= ACC_PROTECTED
;
1346 if (METHOD_STATIC (decl
))
1347 access_flags
|= ACC_STATIC
;
1348 if (METHOD_FINAL (decl
))
1349 access_flags
|= ACC_FINAL
;
1350 if (METHOD_SYNCHRONIZED (decl
))
1351 access_flags
|= ACC_SYNCHRONIZED
;
1352 if (METHOD_NATIVE (decl
))
1353 access_flags
|= ACC_NATIVE
;
1354 if (METHOD_ABSTRACT (decl
))
1355 access_flags
|= ACC_ABSTRACT
;
1356 if (METHOD_STRICTFP (decl
))
1357 access_flags
|= ACC_STRICT
;
1358 if (METHOD_INVISIBLE (decl
))
1359 access_flags
|= ACC_INVISIBLE
;
1360 if (DECL_ARTIFICIAL (decl
))
1361 access_flags
|= ACC_SYNTHETIC
;
1362 if (METHOD_BRIDGE (decl
))
1363 access_flags
|= ACC_BRIDGE
;
1364 if (METHOD_VARARGS (decl
))
1365 access_flags
|= ACC_VARARGS
;
1366 return access_flags
;
1371 static GTY (()) int alias_labelno
= 0;
1373 /* Create a private alias for METHOD. Using this alias instead of the method
1374 decl ensures that ncode entries in the method table point to the real function
1375 at runtime, not a PLT entry. */
1378 make_local_function_alias (tree method
)
1380 #ifdef ASM_OUTPUT_DEF
1383 const char *method_name
= IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (method
));
1384 char *name
= (char *) alloca (strlen (method_name
) + 2);
1385 char *buf
= (char *) alloca (strlen (method_name
) + 128);
1387 /* Only create aliases for local functions. */
1388 if (DECL_EXTERNAL (method
))
1391 /* Prefix method_name with 'L' for the alias label. */
1393 strcpy (name
+ 1, method_name
);
1395 targetm
.asm_out
.generate_internal_label (buf
, name
, alias_labelno
++);
1396 alias
= build_decl (input_location
,
1397 FUNCTION_DECL
, get_identifier (buf
),
1398 TREE_TYPE (method
));
1399 DECL_CONTEXT (alias
) = NULL
;
1400 TREE_READONLY (alias
) = TREE_READONLY (method
);
1401 TREE_THIS_VOLATILE (alias
) = TREE_THIS_VOLATILE (method
);
1402 TREE_PUBLIC (alias
) = 0;
1403 DECL_EXTERNAL (alias
) = 0;
1404 DECL_ARTIFICIAL (alias
) = 1;
1405 DECL_INITIAL (alias
) = error_mark_node
;
1406 TREE_ADDRESSABLE (alias
) = 1;
1407 TREE_USED (alias
) = 1;
1408 if (!flag_syntax_only
)
1409 assemble_alias (alias
, DECL_ASSEMBLER_NAME (method
));
1416 /** Make reflection data (_Jv_Field) for field FDECL. */
1419 make_field_value (tree fdecl
)
1423 tree type
= TREE_TYPE (fdecl
);
1424 int resolved
= is_compiled_class (type
) && ! flag_indirect_dispatch
;
1425 vec
<constructor_elt
, va_gc
> *v
= NULL
;
1427 START_RECORD_CONSTRUCTOR (v
, field_type_node
);
1428 PUSH_FIELD_VALUE (v
, "name", build_utf8_ref (DECL_NAME (fdecl
)));
1430 type
= build_class_ref (type
);
1433 tree signature
= build_java_signature (type
);
1435 type
= build_utf8_ref (unmangle_classname
1436 (IDENTIFIER_POINTER (signature
),
1437 IDENTIFIER_LENGTH (signature
)));
1439 PUSH_FIELD_VALUE (v
, "type", type
);
1441 flags
= get_access_flags_from_decl (fdecl
);
1443 flags
|= 0x8000 /* FIELD_UNRESOLVED_FLAG */;
1445 PUSH_FIELD_VALUE (v
, "accflags", build_int_cst (NULL_TREE
, flags
));
1446 PUSH_FIELD_VALUE (v
, "bsize", TYPE_SIZE_UNIT (TREE_TYPE (fdecl
)));
1449 tree field_address
= integer_zero_node
;
1451 if ((DECL_INITIAL (fdecl
) || ! flag_indirect_classes
)
1452 && FIELD_STATIC (fdecl
))
1453 field_address
= build_address_of (fdecl
);
1455 index
= (FIELD_STATIC (fdecl
)
1456 ? DECL_CHAIN (TYPE_FIELDS (field_info_union_node
))
1457 : TYPE_FIELDS (field_info_union_node
));
1458 value
= (FIELD_STATIC (fdecl
)
1460 : byte_position (fdecl
));
1464 build_constructor_single (field_info_union_node
, index
, value
));
1467 FINISH_RECORD_CONSTRUCTOR (finit
, v
, field_type_node
);
1471 /** Make reflection data (_Jv_Method) for method MDECL. */
1474 make_method_value (tree mdecl
)
1476 static int method_name_count
= 0;
1481 #define ACC_TRANSLATED 0x4000
1482 int accflags
= get_access_flags_from_decl (mdecl
) | ACC_TRANSLATED
;
1483 vec
<constructor_elt
, va_gc
> *v
= NULL
;
1485 class_decl
= DECL_CONTEXT (mdecl
);
1486 /* For interfaces, the index field contains the dispatch index. */
1487 if (CLASS_INTERFACE (TYPE_NAME (class_decl
)))
1488 index
= build_int_cst (NULL_TREE
,
1489 get_interface_method_index (mdecl
, class_decl
));
1490 else if (!flag_indirect_dispatch
&& get_method_index (mdecl
) != NULL_TREE
)
1491 index
= get_method_index (mdecl
);
1493 index
= integer_minus_one_node
;
1495 code
= null_pointer_node
;
1496 if (METHOD_ABSTRACT (mdecl
))
1497 code
= build1 (ADDR_EXPR
, nativecode_ptr_type_node
,
1498 soft_abstractmethod_node
);
1500 code
= build1 (ADDR_EXPR
, nativecode_ptr_type_node
,
1501 make_local_function_alias (mdecl
));
1502 START_RECORD_CONSTRUCTOR (v
, method_type_node
);
1503 PUSH_FIELD_VALUE (v
, "name",
1504 build_utf8_ref (DECL_CONSTRUCTOR_P (mdecl
) ?
1505 init_identifier_node
1506 : DECL_NAME (mdecl
)));
1508 tree signature
= build_java_signature (TREE_TYPE (mdecl
));
1509 PUSH_FIELD_VALUE (v
, "signature",
1512 (IDENTIFIER_POINTER(signature
),
1513 IDENTIFIER_LENGTH(signature
)))));
1515 PUSH_FIELD_VALUE (v
, "accflags", build_int_cst (NULL_TREE
, accflags
));
1516 PUSH_FIELD_VALUE (v
, "index", index
);
1517 PUSH_FIELD_VALUE (v
, "ncode", code
);
1520 /* Compute the `throws' information for the method. */
1521 tree table
= null_pointer_node
;
1523 if (!vec_safe_is_empty (DECL_FUNCTION_THROWS (mdecl
)))
1525 int length
= 1 + DECL_FUNCTION_THROWS (mdecl
)->length ();
1526 tree t
, type
, array
;
1528 vec
<constructor_elt
, va_gc
> *v
= NULL
;
1529 int idx
= length
- 1;
1533 vec_alloc (v
, length
);
1534 v
->quick_grow_cleared (length
);
1537 e
->value
= null_pointer_node
;
1539 FOR_EACH_VEC_SAFE_ELT (DECL_FUNCTION_THROWS (mdecl
), ix
, t
)
1541 tree sig
= DECL_NAME (TYPE_NAME (t
));
1543 = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig
),
1544 IDENTIFIER_LENGTH (sig
)));
1548 gcc_assert (idx
== -1);
1549 type
= build_prim_array_type (ptr_type_node
, length
);
1550 table
= build_constructor (type
, v
);
1551 /* Compute something unique enough. */
1552 sprintf (buf
, "_methods%d", method_name_count
++);
1553 array
= build_decl (input_location
,
1554 VAR_DECL
, get_identifier (buf
), type
);
1555 DECL_INITIAL (array
) = table
;
1556 TREE_STATIC (array
) = 1;
1557 DECL_ARTIFICIAL (array
) = 1;
1558 DECL_IGNORED_P (array
) = 1;
1559 rest_of_decl_compilation (array
, 1, 0);
1561 table
= build1 (ADDR_EXPR
, ptr_type_node
, array
);
1564 PUSH_FIELD_VALUE (v
, "throws", table
);
1567 FINISH_RECORD_CONSTRUCTOR (minit
, v
, method_type_node
);
1572 get_dispatch_vector (tree type
)
1574 tree vtable
= TYPE_VTABLE (type
);
1576 if (vtable
== NULL_TREE
)
1580 tree super
= CLASSTYPE_SUPER (type
);
1581 HOST_WIDE_INT nvirtuals
= tree_to_shwi (TYPE_NVIRTUALS (type
));
1582 vtable
= make_tree_vec (nvirtuals
);
1583 TYPE_VTABLE (type
) = vtable
;
1584 if (super
!= NULL_TREE
)
1586 tree super_vtable
= get_dispatch_vector (super
);
1588 for (i
= tree_to_shwi (TYPE_NVIRTUALS (super
)); --i
>= 0; )
1589 TREE_VEC_ELT (vtable
, i
) = TREE_VEC_ELT (super_vtable
, i
);
1592 for (method
= TYPE_METHODS (type
); method
!= NULL_TREE
;
1593 method
= DECL_CHAIN (method
))
1595 tree method_index
= get_method_index (method
);
1596 if (method_index
!= NULL_TREE
1597 && tree_fits_shwi_p (method_index
))
1598 TREE_VEC_ELT (vtable
, tree_to_shwi (method_index
)) = method
;
1606 get_dispatch_table (tree type
, tree this_class_addr
)
1608 int abstract_p
= CLASS_ABSTRACT (TYPE_NAME (type
));
1609 tree vtable
= get_dispatch_vector (type
);
1611 int nvirtuals
= TREE_VEC_LENGTH (vtable
);
1614 vec
<constructor_elt
, va_gc
> *v
= NULL
;
1618 arraysize
= (TARGET_VTABLE_USES_DESCRIPTORS
? nvirtuals
+ 1 : nvirtuals
+ 2);
1619 if (TARGET_VTABLE_USES_DESCRIPTORS
)
1620 arraysize
*= TARGET_VTABLE_USES_DESCRIPTORS
;
1623 vec_safe_grow_cleared (v
, arraysize
);
1624 e
= &(*v
)[arraysize
- 1];
1626 #define CONSTRUCTOR_PREPEND_VALUE(E, V) E->value = V, E--
1627 for (i
= nvirtuals
; --i
>= 0; )
1629 tree method
= TREE_VEC_ELT (vtable
, i
);
1630 if (METHOD_ABSTRACT (method
))
1633 warning_at (DECL_SOURCE_LOCATION (method
), 0,
1634 "abstract method in non-abstract class");
1636 if (TARGET_VTABLE_USES_DESCRIPTORS
)
1637 for (j
= 0; j
< TARGET_VTABLE_USES_DESCRIPTORS
; ++j
)
1638 CONSTRUCTOR_PREPEND_VALUE (e
, null_pointer_node
);
1640 CONSTRUCTOR_PREPEND_VALUE (e
, null_pointer_node
);
1644 if (TARGET_VTABLE_USES_DESCRIPTORS
)
1645 for (j
= 0; j
< TARGET_VTABLE_USES_DESCRIPTORS
; ++j
)
1647 tree fdesc
= build2 (FDESC_EXPR
, nativecode_ptr_type_node
,
1648 method
, build_int_cst (NULL_TREE
, j
));
1649 TREE_CONSTANT (fdesc
) = 1;
1650 CONSTRUCTOR_PREPEND_VALUE (e
, fdesc
);
1653 CONSTRUCTOR_PREPEND_VALUE (e
,
1655 nativecode_ptr_type_node
,
1660 /* Dummy entry for compatibility with G++ -fvtable-thunks. When
1661 using the Boehm GC we sometimes stash a GC type descriptor
1662 there. We set the PURPOSE to NULL_TREE not to interfere (reset)
1663 the emitted byte count during the output to the assembly file. */
1664 /* With TARGET_VTABLE_USES_DESCRIPTORS, we only add one extra
1665 fake "function descriptor". It's first word is the is the class
1666 pointer, and subsequent words (usually one) contain the GC descriptor.
1667 In all other cases, we reserve two extra vtable slots. */
1668 gc_descr
= get_boehm_type_descriptor (type
);
1669 CONSTRUCTOR_PREPEND_VALUE (e
, gc_descr
);
1670 for (j
= 1; j
< TARGET_VTABLE_USES_DESCRIPTORS
-1; ++j
)
1671 CONSTRUCTOR_PREPEND_VALUE (e
, gc_descr
);
1672 CONSTRUCTOR_PREPEND_VALUE (e
, this_class_addr
);
1674 /** Pointer to type_info object (to be implemented), according to g++ ABI. */
1675 CONSTRUCTOR_PREPEND_VALUE (e
, null_pointer_node
);
1676 /** Offset to start of whole object. Always (ptrdiff_t)0 for Java. */
1677 gcc_assert (e
== v
->address ());
1678 e
->index
= integer_zero_node
;
1679 e
->value
= null_pointer_node
;
1680 #undef CONSTRUCTOR_PREPEND_VALUE
1682 arraytype
= build_prim_array_type (nativecode_ptr_type_node
, arraysize
);
1683 return build_constructor (arraytype
, v
);
1687 /* Set the method_index for a method decl. */
1689 set_method_index (tree decl
, tree method_index
)
1691 if (method_index
!= NULL_TREE
)
1693 /* method_index is null if we're using indirect dispatch. */
1694 method_index
= fold (convert (sizetype
, method_index
));
1696 if (TARGET_VTABLE_USES_DESCRIPTORS
)
1697 /* Add one to skip bogus descriptor for class and GC descriptor. */
1698 method_index
= size_binop (PLUS_EXPR
, method_index
, size_int (1));
1700 /* Add 1 to skip "class" field of dtable, and 1 to skip GC
1702 method_index
= size_binop (PLUS_EXPR
, method_index
, size_int (2));
1705 DECL_VINDEX (decl
) = method_index
;
1708 /* Get the method_index for a method decl. */
1710 get_method_index (tree decl
)
1712 tree method_index
= DECL_VINDEX (decl
);
1717 if (TARGET_VTABLE_USES_DESCRIPTORS
)
1718 /* Sub one to skip bogus descriptor for class and GC descriptor. */
1719 method_index
= size_binop (MINUS_EXPR
, method_index
, size_int (1));
1721 /* Sub 1 to skip "class" field of dtable, and 1 to skip GC descriptor. */
1722 method_index
= size_binop (MINUS_EXPR
, method_index
, size_int (2));
1724 return method_index
;
1728 supers_all_compiled (tree type
)
1730 while (type
!= NULL_TREE
)
1732 if (!assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type
)))))
1734 type
= CLASSTYPE_SUPER (type
);
1740 add_table_and_syms (vec
<constructor_elt
, va_gc
> **v
,
1741 vec
<method_entry
, va_gc
> *methods
,
1742 const char *table_name
, tree table_slot
, tree table_type
,
1743 const char *syms_name
, tree syms_slot
)
1745 if (methods
== NULL
)
1747 PUSH_FIELD_VALUE (*v
, table_name
, null_pointer_node
);
1748 PUSH_FIELD_VALUE (*v
, syms_name
, null_pointer_node
);
1752 pushdecl_top_level (syms_slot
);
1753 PUSH_FIELD_VALUE (*v
, table_name
,
1754 build1 (ADDR_EXPR
, table_type
, table_slot
));
1755 PUSH_FIELD_VALUE (*v
, syms_name
,
1756 build1 (ADDR_EXPR
, symbols_array_ptr_type
,
1758 TREE_CONSTANT (table_slot
) = 1;
1763 make_class_data (tree type
)
1765 tree decl
, cons
, temp
;
1766 tree field
, fields_decl
;
1767 HOST_WIDE_INT static_field_count
= 0;
1768 HOST_WIDE_INT instance_field_count
= 0;
1769 HOST_WIDE_INT field_count
;
1770 tree field_array_type
;
1772 tree dtable_decl
= NULL_TREE
;
1773 HOST_WIDE_INT method_count
= 0;
1774 tree method_array_type
;
1777 tree this_class_addr
;
1778 tree constant_pool_constructor
;
1779 tree interfaces
= null_pointer_node
;
1780 int interface_len
= 0;
1781 int uses_jv_markobj
= 0;
1782 tree type_decl
= TYPE_NAME (type
);
1783 tree id_main
= get_identifier("main");
1784 tree id_class
= get_identifier("java.lang.Class");
1785 /** Offset from start of virtual function table declaration
1786 to where objects actually point at, following new g++ ABI. */
1787 tree dtable_start_offset
= size_int (2 * POINTER_SIZE
/ BITS_PER_UNIT
);
1788 vec
<int> field_indexes
;
1789 tree first_real_field
;
1790 vec
<constructor_elt
, va_gc
> *v1
= NULL
, *v2
= NULL
;
1791 tree reflection_data
;
1792 vec
<constructor_elt
, va_gc
> *static_fields
= NULL
;
1793 vec
<constructor_elt
, va_gc
> *instance_fields
= NULL
;
1794 vec
<constructor_elt
, va_gc
> *methods
= NULL
;
1796 this_class_addr
= build_static_class_ref (type
);
1797 decl
= TREE_OPERAND (this_class_addr
, 0);
1799 if (supers_all_compiled (type
) && ! CLASS_INTERFACE (type_decl
)
1800 && !flag_indirect_dispatch
)
1802 tree dtable
= get_dispatch_table (type
, this_class_addr
);
1803 uses_jv_markobj
= uses_jv_markobj_p (dtable
);
1804 if (type
== class_type_node
&& class_dtable_decl
!= NULL_TREE
)
1806 /* We've already created some other class, and consequently
1807 we made class_dtable_decl. Now we just want to fill it
1809 dtable_decl
= class_dtable_decl
;
1813 dtable_decl
= build_dtable_decl (type
);
1814 TREE_STATIC (dtable_decl
) = 1;
1815 DECL_ARTIFICIAL (dtable_decl
) = 1;
1816 DECL_IGNORED_P (dtable_decl
) = 1;
1819 TREE_PUBLIC (dtable_decl
) = 1;
1820 DECL_INITIAL (dtable_decl
) = dtable
;
1821 /* The only dispatch table exported from a DSO is the dispatch
1822 table for java.lang.Class. */
1823 if (DECL_NAME (type_decl
) != id_class
)
1824 java_hide_decl (dtable_decl
);
1825 if (! flag_indirect_classes
)
1826 rest_of_decl_compilation (dtable_decl
, 1, 0);
1827 /* Maybe we're compiling Class as the first class. If so, set
1828 class_dtable_decl to the decl we just made. */
1829 if (type
== class_type_node
&& class_dtable_decl
== NULL_TREE
)
1830 class_dtable_decl
= dtable_decl
;
1833 /* Build Field array. */
1834 field
= TYPE_FIELDS (type
);
1835 while (field
&& DECL_ARTIFICIAL (field
))
1836 field
= DECL_CHAIN (field
); /* Skip dummy fields. */
1837 if (field
&& DECL_NAME (field
) == NULL_TREE
)
1838 field
= DECL_CHAIN (field
); /* Skip dummy field for inherited data. */
1839 first_real_field
= field
;
1841 /* First count static and instance fields. */
1842 for ( ; field
!= NULL_TREE
; field
= DECL_CHAIN (field
))
1844 if (! DECL_ARTIFICIAL (field
))
1846 if (FIELD_STATIC (field
))
1847 static_field_count
++;
1848 else if (uses_jv_markobj
|| !flag_reduced_reflection
)
1849 instance_field_count
++;
1852 field_count
= static_field_count
+ instance_field_count
;
1853 field_indexes
.create (field_count
);
1855 /* gcj sorts fields so that static fields come first, followed by
1856 instance fields. Unfortunately, by the time this takes place we
1857 have already generated the reflection_data for this class, and
1858 that data contains indexes into the fields. So, we generate a
1859 permutation that maps each original field index to its final
1860 position. Then we pass this permutation to
1861 rewrite_reflection_indexes(), which fixes up the reflection
1865 int static_count
= 0;
1866 int instance_count
= static_field_count
;
1869 for (i
= 0, field
= first_real_field
;
1871 field
= DECL_CHAIN (field
), i
++)
1873 if (! DECL_ARTIFICIAL (field
))
1876 if (FIELD_STATIC (field
))
1877 field_index
= static_count
++;
1878 else if (uses_jv_markobj
|| !flag_reduced_reflection
)
1879 field_index
= instance_count
++;
1882 field_indexes
.quick_push (field_index
);
1887 for (field
= first_real_field
; field
!= NULL_TREE
;
1888 field
= DECL_CHAIN (field
))
1890 if (! DECL_ARTIFICIAL (field
))
1892 if (FIELD_STATIC (field
))
1894 /* We must always create reflection data for static fields
1895 as it is used in the creation of the field itself. */
1896 tree init
= make_field_value (field
);
1897 tree initial
= DECL_INITIAL (field
);
1898 CONSTRUCTOR_APPEND_ELT (static_fields
, NULL_TREE
, init
);
1899 /* If the initial value is a string constant,
1900 prevent output_constant from trying to assemble the value. */
1901 if (initial
!= NULL_TREE
1902 && TREE_TYPE (initial
) == string_ptr_type_node
)
1903 DECL_INITIAL (field
) = NULL_TREE
;
1904 rest_of_decl_compilation (field
, 1, 1);
1905 DECL_INITIAL (field
) = initial
;
1907 else if (uses_jv_markobj
|| !flag_reduced_reflection
)
1909 tree init
= make_field_value (field
);
1910 CONSTRUCTOR_APPEND_ELT (instance_fields
, NULL_TREE
, init
);
1915 gcc_assert (static_field_count
== (int) vec_safe_length (static_fields
));
1916 gcc_assert (instance_field_count
== (int) vec_safe_length (instance_fields
));
1918 if (field_count
> 0)
1920 vec_safe_splice (static_fields
, instance_fields
);
1921 field_array_type
= build_prim_array_type (field_type_node
, field_count
);
1922 fields_decl
= build_decl (input_location
,
1923 VAR_DECL
, mangled_classname ("_FL_", type
),
1925 DECL_INITIAL (fields_decl
)
1926 = build_constructor (field_array_type
, static_fields
);
1927 TREE_STATIC (fields_decl
) = 1;
1928 DECL_ARTIFICIAL (fields_decl
) = 1;
1929 DECL_IGNORED_P (fields_decl
) = 1;
1930 rest_of_decl_compilation (fields_decl
, 1, 0);
1933 fields_decl
= NULL_TREE
;
1935 /* Build Method array. */
1936 for (method
= TYPE_METHODS (type
);
1937 method
!= NULL_TREE
; method
= DECL_CHAIN (method
))
1940 if (METHOD_PRIVATE (method
)
1941 && ! flag_keep_inline_functions
1944 /* Even if we have a decl, we don't necessarily have the code.
1945 This can happen if we inherit a method from a superclass for
1946 which we don't have a .class file. */
1947 if (METHOD_DUMMY (method
))
1950 /* Generate method reflection data if:
1952 - !flag_reduced_reflection.
1954 - <clinit> -- The runtime uses reflection to initialize the
1957 - Any method in class java.lang.Class -- Class.forName() and
1958 perhaps other things require it.
1960 - class$ -- It does not work if reflection data missing.
1962 - main -- Reflection is used to find main(String[]) methods.
1964 - public not static -- It is potentially part of an
1965 interface. The runtime uses reflection data to build
1966 interface dispatch tables. */
1967 if (!flag_reduced_reflection
1968 || DECL_CLINIT_P (method
)
1969 || DECL_NAME (type_decl
) == id_class
1970 || DECL_NAME (method
) == id_main
1971 || (METHOD_PUBLIC (method
) && !METHOD_STATIC (method
)))
1973 init
= make_method_value (method
);
1975 CONSTRUCTOR_APPEND_ELT (methods
, NULL_TREE
, init
);
1978 method_array_type
= build_prim_array_type (method_type_node
, method_count
);
1979 methods_decl
= build_decl (input_location
,
1980 VAR_DECL
, mangled_classname ("_MT_", type
),
1982 DECL_INITIAL (methods_decl
) = build_constructor (method_array_type
, methods
);
1983 TREE_STATIC (methods_decl
) = 1;
1984 DECL_ARTIFICIAL (methods_decl
) = 1;
1985 DECL_IGNORED_P (methods_decl
) = 1;
1986 rest_of_decl_compilation (methods_decl
, 1, 0);
1988 if (class_dtable_decl
== NULL_TREE
)
1990 class_dtable_decl
= build_dtable_decl (class_type_node
);
1991 TREE_STATIC (class_dtable_decl
) = 1;
1992 DECL_ARTIFICIAL (class_dtable_decl
) = 1;
1993 DECL_IGNORED_P (class_dtable_decl
) = 1;
1994 if (is_compiled_class (class_type_node
) != 2)
1996 DECL_EXTERNAL (class_dtable_decl
) = 1;
1997 rest_of_decl_compilation (class_dtable_decl
, 1, 0);
2001 super
= CLASSTYPE_SUPER (type
);
2002 if (super
== NULL_TREE
)
2003 super
= null_pointer_node
;
2004 else if (! flag_indirect_dispatch
2005 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (type_decl
)))
2006 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (super
)))))
2007 super
= build_class_ref (super
);
2010 int super_index
= alloc_class_constant (super
);
2011 super
= build_int_cst (ptr_type_node
, super_index
);
2014 /* Build and emit the array of implemented interfaces. */
2015 if (type
!= object_type_node
)
2016 interface_len
= BINFO_N_BASE_BINFOS (TYPE_BINFO (type
)) - 1;
2018 if (interface_len
> 0)
2021 tree interface_array_type
, idecl
;
2022 vec
<constructor_elt
, va_gc
> *init
;
2023 vec_alloc (init
, interface_len
);
2024 interface_array_type
2025 = build_prim_array_type (class_ptr_type
, interface_len
);
2026 idecl
= build_decl (input_location
,
2027 VAR_DECL
, mangled_classname ("_IF_", type
),
2028 interface_array_type
);
2030 for (i
= 1; i
<= interface_len
; i
++)
2032 tree child
= BINFO_BASE_BINFO (TYPE_BINFO (type
), i
);
2033 tree iclass
= BINFO_TYPE (child
);
2035 if (! flag_indirect_dispatch
2037 (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (iclass
))))))
2038 index
= build_class_ref (iclass
);
2041 int int_index
= alloc_class_constant (iclass
);
2042 index
= build_int_cst (ptr_type_node
, int_index
);
2044 CONSTRUCTOR_APPEND_ELT (init
, NULL_TREE
, index
);
2046 DECL_INITIAL (idecl
) = build_constructor (interface_array_type
, init
);
2047 TREE_STATIC (idecl
) = 1;
2048 DECL_ARTIFICIAL (idecl
) = 1;
2049 DECL_IGNORED_P (idecl
) = 1;
2050 interfaces
= build1 (ADDR_EXPR
, ptr_type_node
, idecl
);
2051 rest_of_decl_compilation (idecl
, 1, 0);
2054 constant_pool_constructor
= build_constants_constructor ();
2056 if (flag_indirect_dispatch
)
2058 TYPE_OTABLE_DECL (type
)
2060 (DECL_NAME (TYPE_OTABLE_DECL (type
)),
2061 TYPE_OTABLE_DECL (type
), TYPE_OTABLE_METHODS (type
),
2062 TYPE_OTABLE_SYMS_DECL (type
), integer_type_node
, 1);
2064 TYPE_ATABLE_DECL (type
)
2066 (DECL_NAME (TYPE_ATABLE_DECL (type
)),
2067 TYPE_ATABLE_DECL (type
), TYPE_ATABLE_METHODS (type
),
2068 TYPE_ATABLE_SYMS_DECL (type
), ptr_type_node
, 1);
2070 TYPE_ITABLE_DECL (type
)
2072 (DECL_NAME (TYPE_ITABLE_DECL (type
)),
2073 TYPE_ITABLE_DECL (type
), TYPE_ITABLE_METHODS (type
),
2074 TYPE_ITABLE_SYMS_DECL (type
), ptr_type_node
, 2);
2077 TYPE_CTABLE_DECL (type
) = emit_catch_table (type
);
2079 START_RECORD_CONSTRUCTOR (v1
, object_type_node
);
2080 PUSH_FIELD_VALUE (v1
, "vtable",
2081 (flag_indirect_classes
2083 : fold_build_pointer_plus
2084 (build1 (ADDR_EXPR
, dtable_ptr_type
,
2086 dtable_start_offset
)));
2087 if (! flag_hash_synchronization
)
2088 PUSH_FIELD_VALUE (v1
, "sync_info", null_pointer_node
);
2089 FINISH_RECORD_CONSTRUCTOR (temp
, v1
, object_type_node
);
2090 START_RECORD_CONSTRUCTOR (v2
, class_type_node
);
2091 PUSH_SUPER_VALUE (v2
, temp
);
2092 PUSH_FIELD_VALUE (v2
, "next_or_version", gcj_abi_version
);
2093 PUSH_FIELD_VALUE (v2
, "name", build_utf8_ref (DECL_NAME (type_decl
)));
2094 PUSH_FIELD_VALUE (v2
, "accflags",
2095 build_int_cst (NULL_TREE
,
2096 get_access_flags_from_decl (type_decl
)));
2098 PUSH_FIELD_VALUE (v2
, "superclass",
2099 CLASS_INTERFACE (type_decl
) ? null_pointer_node
: super
);
2100 PUSH_FIELD_VALUE (v2
, "constants", constant_pool_constructor
);
2101 PUSH_FIELD_VALUE (v2
, "methods",
2102 methods_decl
== NULL_TREE
? null_pointer_node
2103 : build1 (ADDR_EXPR
, method_ptr_type_node
, methods_decl
));
2104 PUSH_FIELD_VALUE (v2
, "method_count",
2105 build_int_cst (NULL_TREE
, method_count
));
2107 PUSH_FIELD_VALUE (v2
, "vtable_method_count",
2108 (flag_indirect_dispatch
2109 ? integer_minus_one_node
2110 : TYPE_NVIRTUALS (type
)));
2112 PUSH_FIELD_VALUE (v2
, "fields",
2113 fields_decl
== NULL_TREE
? null_pointer_node
2114 : build1 (ADDR_EXPR
, field_ptr_type_node
, fields_decl
));
2115 /* If we're using the binary compatibility ABI we don't know the
2116 size until load time. */
2117 PUSH_FIELD_VALUE (v2
, "size_in_bytes",
2118 (flag_indirect_dispatch
2119 ? integer_minus_one_node
2120 : size_in_bytes (type
)));
2121 PUSH_FIELD_VALUE (v2
, "field_count",
2122 build_int_cst (NULL_TREE
, field_count
));
2123 PUSH_FIELD_VALUE (v2
, "static_field_count",
2124 build_int_cst (NULL_TREE
, static_field_count
));
2126 PUSH_FIELD_VALUE (v2
, "vtable",
2127 (flag_indirect_dispatch
|| dtable_decl
== NULL_TREE
2129 : fold_build_pointer_plus
2130 (build1 (ADDR_EXPR
, dtable_ptr_type
,
2132 dtable_start_offset
)));
2133 add_table_and_syms (&v2
, TYPE_OTABLE_METHODS (type
),
2134 "otable", TYPE_OTABLE_DECL (type
), otable_ptr_type
,
2135 "otable_syms", TYPE_OTABLE_SYMS_DECL (type
));
2136 add_table_and_syms (&v2
, TYPE_ATABLE_METHODS (type
),
2137 "atable", TYPE_ATABLE_DECL (type
), atable_ptr_type
,
2138 "atable_syms", TYPE_ATABLE_SYMS_DECL (type
));
2139 add_table_and_syms (&v2
, TYPE_ITABLE_METHODS (type
),
2140 "itable", TYPE_ITABLE_DECL (type
), itable_ptr_type
,
2141 "itable_syms", TYPE_ITABLE_SYMS_DECL (type
));
2143 PUSH_FIELD_VALUE (v2
, "catch_classes",
2144 build1 (ADDR_EXPR
, ptr_type_node
, TYPE_CTABLE_DECL (type
)));
2145 PUSH_FIELD_VALUE (v2
, "interfaces", interfaces
);
2146 PUSH_FIELD_VALUE (v2
, "loader", null_pointer_node
);
2147 PUSH_FIELD_VALUE (v2
, "interface_count",
2148 build_int_cst (NULL_TREE
, interface_len
));
2149 PUSH_FIELD_VALUE (v2
, "state",
2150 convert (byte_type_node
,
2151 build_int_cst (NULL_TREE
, JV_STATE_PRELOADING
)));
2153 PUSH_FIELD_VALUE (v2
, "thread", null_pointer_node
);
2154 PUSH_FIELD_VALUE (v2
, "depth", integer_zero_node
);
2155 PUSH_FIELD_VALUE (v2
, "ancestors", null_pointer_node
);
2156 PUSH_FIELD_VALUE (v2
, "idt", null_pointer_node
);
2157 PUSH_FIELD_VALUE (v2
, "arrayclass", null_pointer_node
);
2158 PUSH_FIELD_VALUE (v2
, "protectionDomain", null_pointer_node
);
2161 tree assertion_table_ref
;
2162 if (TYPE_ASSERTIONS (type
) == NULL
)
2163 assertion_table_ref
= null_pointer_node
;
2165 assertion_table_ref
= build1 (ADDR_EXPR
,
2166 build_pointer_type (assertion_table_type
),
2167 emit_assertion_table (type
));
2169 PUSH_FIELD_VALUE (v2
, "assertion_table", assertion_table_ref
);
2172 PUSH_FIELD_VALUE (v2
, "hack_signers", null_pointer_node
);
2173 PUSH_FIELD_VALUE (v2
, "chain", null_pointer_node
);
2174 PUSH_FIELD_VALUE (v2
, "aux_info", null_pointer_node
);
2175 PUSH_FIELD_VALUE (v2
, "engine", null_pointer_node
);
2177 if (TYPE_REFLECTION_DATA (current_class
))
2180 int count
= TYPE_REFLECTION_DATASIZE (current_class
);
2181 vec
<constructor_elt
, va_gc
> *v
;
2182 vec_alloc (v
, count
);
2183 unsigned char *data
= TYPE_REFLECTION_DATA (current_class
);
2184 tree max_index
= build_int_cst (sizetype
, count
);
2185 tree index
= build_index_type (max_index
);
2186 tree type
= build_array_type (unsigned_byte_type_node
, index
);
2189 static int reflection_data_count
;
2191 sprintf (buf
, "_reflection_data_%d", reflection_data_count
++);
2192 array
= build_decl (input_location
,
2193 VAR_DECL
, get_identifier (buf
), type
);
2195 rewrite_reflection_indexes (&field_indexes
);
2197 for (i
= 0; i
< count
; i
++)
2199 constructor_elt elt
;
2200 elt
.index
= build_int_cst (sizetype
, i
);
2201 elt
.value
= build_int_cstu (byte_type_node
, data
[i
]);
2202 v
->quick_push (elt
);
2205 DECL_INITIAL (array
) = build_constructor (type
, v
);
2206 TREE_STATIC (array
) = 1;
2207 DECL_ARTIFICIAL (array
) = 1;
2208 DECL_IGNORED_P (array
) = 1;
2209 TREE_READONLY (array
) = 1;
2210 TREE_CONSTANT (DECL_INITIAL (array
)) = 1;
2211 rest_of_decl_compilation (array
, 1, 0);
2213 reflection_data
= build_address_of (array
);
2216 TYPE_REFLECTION_DATA (current_class
) = NULL
;
2219 reflection_data
= null_pointer_node
;
2221 PUSH_FIELD_VALUE (v2
, "reflection_data", reflection_data
);
2222 FINISH_RECORD_CONSTRUCTOR (cons
, v2
, class_type_node
);
2224 DECL_INITIAL (decl
) = cons
;
2226 /* Hash synchronization requires at least 64-bit alignment. */
2227 if (flag_hash_synchronization
&& POINTER_SIZE
< 64)
2228 DECL_ALIGN (decl
) = 64;
2230 if (flag_indirect_classes
)
2232 TREE_READONLY (decl
) = 1;
2233 TREE_CONSTANT (DECL_INITIAL (decl
)) = 1;
2236 rest_of_decl_compilation (decl
, 1, 0);
2239 tree classdollar_field
= build_classdollar_field (type
);
2240 if (!flag_indirect_classes
)
2241 DECL_INITIAL (classdollar_field
) = build_static_class_ref (type
);
2242 rest_of_decl_compilation (classdollar_field
, 1, 0);
2245 TYPE_OTABLE_DECL (type
) = NULL_TREE
;
2246 TYPE_ATABLE_DECL (type
) = NULL_TREE
;
2247 TYPE_CTABLE_DECL (type
) = NULL_TREE
;
2253 java_expand_catch_classes (current_class
);
2255 current_function_decl
= NULL_TREE
;
2256 TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (current_class
)) = 0;
2257 make_class_data (current_class
);
2259 rest_of_decl_compilation (TYPE_NAME (current_class
), 1, 0);
2262 /* Return 2 if KLASS is compiled by this compilation job;
2263 return 1 if KLASS can otherwise be assumed to be compiled;
2264 return 0 if we cannot assume that KLASS is compiled.
2265 Returns 1 for primitive and 0 for array types. */
2267 is_compiled_class (tree klass
)
2270 if (TREE_CODE (klass
) == POINTER_TYPE
)
2271 klass
= TREE_TYPE (klass
);
2272 if (TREE_CODE (klass
) != RECORD_TYPE
) /* Primitive types are static. */
2274 if (TYPE_ARRAY_P (klass
))
2277 seen_in_zip
= (TYPE_JCF (klass
) && JCF_SEEN_IN_ZIP (TYPE_JCF (klass
)));
2278 if (CLASS_FROM_CURRENTLY_COMPILED_P (klass
))
2280 /* The class was seen in the current ZIP file and will be
2281 available as a compiled class in the future but may not have
2282 been loaded already. Load it if necessary. This prevent
2283 build_class_ref () from crashing. */
2285 if (seen_in_zip
&& !CLASS_LOADED_P (klass
) && (klass
!= current_class
))
2286 load_class (klass
, 1);
2288 /* We return 2 for class seen in ZIP and class from files
2289 belonging to the same compilation unit */
2293 if (assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (klass
)))))
2295 if (!CLASS_LOADED_P (klass
))
2297 if (klass
!= current_class
)
2298 load_class (klass
, 1);
2306 /* Build a VAR_DECL for the dispatch table (vtable) for class TYPE. */
2309 build_dtable_decl (tree type
)
2313 /* We need to build a new dtable type so that its size is uniquely
2314 computed when we're dealing with the class for real and not just
2315 faking it (like java.lang.Class during the initialization of the
2316 compiler.) We know we're not faking a class when CURRENT_CLASS is
2318 if (current_class
== type
)
2320 tree dummy
= NULL_TREE
;
2323 dtype
= make_node (RECORD_TYPE
);
2325 PUSH_FIELD (input_location
, dtype
, dummy
, "top_offset", ptr_type_node
);
2326 PUSH_FIELD (input_location
, dtype
, dummy
, "type_info", ptr_type_node
);
2328 PUSH_FIELD (input_location
, dtype
, dummy
, "class", class_ptr_type
);
2329 for (n
= 1; n
< TARGET_VTABLE_USES_DESCRIPTORS
; ++n
)
2331 tree tmp_field
= build_decl (input_location
,
2332 FIELD_DECL
, NULL_TREE
, ptr_type_node
);
2333 TREE_CHAIN (dummy
) = tmp_field
;
2334 DECL_CONTEXT (tmp_field
) = dtype
;
2335 DECL_ARTIFICIAL (tmp_field
) = 1;
2339 PUSH_FIELD (input_location
, dtype
, dummy
, "gc_descr", ptr_type_node
);
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 n
= TREE_VEC_LENGTH (get_dispatch_vector (type
));
2351 if (TARGET_VTABLE_USES_DESCRIPTORS
)
2352 n
*= TARGET_VTABLE_USES_DESCRIPTORS
;
2354 PUSH_FIELD (input_location
, dtype
, dummy
, "methods",
2355 build_prim_array_type (nativecode_ptr_type_node
, n
));
2356 layout_type (dtype
);
2359 dtype
= dtable_type
;
2361 decl
= build_decl (input_location
,
2362 VAR_DECL
, get_identifier ("vt$"), dtype
);
2363 DECL_CONTEXT (decl
) = type
;
2364 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl
);
2365 DECL_VTABLE_P (decl
) = 1;
2370 /* Pre-pend the TYPE_FIELDS of THIS_CLASS with a dummy FIELD_DECL for the
2371 fields inherited from SUPER_CLASS. */
2374 push_super_field (tree this_class
, tree super_class
)
2377 /* Don't insert the field if we're just re-laying the class out. */
2378 if (TYPE_FIELDS (this_class
) && !DECL_NAME (TYPE_FIELDS (this_class
)))
2380 base_decl
= build_decl (input_location
,
2381 FIELD_DECL
, NULL_TREE
, super_class
);
2382 DECL_IGNORED_P (base_decl
) = 1;
2383 DECL_CHAIN (base_decl
) = TYPE_FIELDS (this_class
);
2384 TYPE_FIELDS (this_class
) = base_decl
;
2385 DECL_SIZE (base_decl
) = TYPE_SIZE (super_class
);
2386 DECL_SIZE_UNIT (base_decl
) = TYPE_SIZE_UNIT (super_class
);
2389 /* Handle the different manners we may have to lay out a super class. */
2392 maybe_layout_super_class (tree super_class
, tree this_class ATTRIBUTE_UNUSED
)
2396 else if (TREE_CODE (super_class
) == RECORD_TYPE
)
2398 if (!CLASS_LOADED_P (super_class
))
2399 load_class (super_class
, 1);
2401 /* We might have to layout the class before its dependency on
2402 the super class gets resolved by java_complete_class */
2403 else if (TREE_CODE (super_class
) == POINTER_TYPE
)
2405 if (TREE_TYPE (super_class
) != NULL_TREE
)
2406 super_class
= TREE_TYPE (super_class
);
2410 if (!TYPE_SIZE (super_class
))
2411 safe_layout_class (super_class
);
2416 /* safe_layout_class just makes sure that we can load a class without
2417 disrupting the current_class, input_location, etc, information
2418 about the class processed currently. */
2421 safe_layout_class (tree klass
)
2423 tree save_current_class
= current_class
;
2424 location_t save_location
= input_location
;
2426 layout_class (klass
);
2428 current_class
= save_current_class
;
2429 input_location
= save_location
;
2433 layout_class (tree this_class
)
2436 tree super_class
= CLASSTYPE_SUPER (this_class
);
2438 class_list
= tree_cons (this_class
, NULL_TREE
, class_list
);
2439 if (CLASS_BEING_LAIDOUT (this_class
))
2445 sprintf (buffer
, " with '%s'",
2446 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class
))));
2447 obstack_grow (&temporary_obstack
, buffer
, strlen (buffer
));
2449 for (current
= TREE_CHAIN (class_list
); current
;
2450 current
= TREE_CHAIN (current
))
2452 tree decl
= TYPE_NAME (TREE_PURPOSE (current
));
2453 sprintf (buffer
, "\n which inherits from '%s' (%s:%d)",
2454 IDENTIFIER_POINTER (DECL_NAME (decl
)),
2455 DECL_SOURCE_FILE (decl
),
2456 DECL_SOURCE_LINE (decl
));
2457 obstack_grow (&temporary_obstack
, buffer
, strlen (buffer
));
2459 obstack_1grow (&temporary_obstack
, '\0');
2460 report
= XOBFINISH (&temporary_obstack
, char *);
2461 cyclic_inheritance_report
= ggc_strdup (report
);
2462 obstack_free (&temporary_obstack
, report
);
2463 TYPE_SIZE (this_class
) = error_mark_node
;
2466 CLASS_BEING_LAIDOUT (this_class
) = 1;
2468 if (super_class
&& !CLASS_BEING_LAIDOUT (super_class
))
2470 tree maybe_super_class
2471 = maybe_layout_super_class (super_class
, this_class
);
2472 if (maybe_super_class
== NULL
2473 || TREE_CODE (TYPE_SIZE (maybe_super_class
)) == ERROR_MARK
)
2475 TYPE_SIZE (this_class
) = error_mark_node
;
2476 CLASS_BEING_LAIDOUT (this_class
) = 0;
2477 class_list
= TREE_CHAIN (class_list
);
2480 if (TYPE_SIZE (this_class
) == NULL_TREE
)
2481 push_super_field (this_class
, maybe_super_class
);
2484 layout_type (this_class
);
2486 /* Also recursively load/layout any superinterfaces. */
2487 if (TYPE_BINFO (this_class
))
2489 for (i
= BINFO_N_BASE_BINFOS (TYPE_BINFO (this_class
)) - 1; i
> 0; i
--)
2491 tree binfo
= BINFO_BASE_BINFO (TYPE_BINFO (this_class
), i
);
2492 tree super_interface
= BINFO_TYPE (binfo
);
2493 tree maybe_super_interface
2494 = maybe_layout_super_class (super_interface
, NULL_TREE
);
2495 if (maybe_super_interface
== NULL
2496 || TREE_CODE (TYPE_SIZE (maybe_super_interface
)) == ERROR_MARK
)
2498 TYPE_SIZE (this_class
) = error_mark_node
;
2499 CLASS_BEING_LAIDOUT (this_class
) = 0;
2500 class_list
= TREE_CHAIN (class_list
);
2506 /* Convert the size back to an SI integer value. */
2507 TYPE_SIZE_UNIT (this_class
) =
2508 fold (convert (int_type_node
, TYPE_SIZE_UNIT (this_class
)));
2510 CLASS_BEING_LAIDOUT (this_class
) = 0;
2511 class_list
= TREE_CHAIN (class_list
);
2515 add_miranda_methods (tree base_class
, tree search_class
)
2518 tree binfo
, base_binfo
;
2520 if (!CLASS_PARSED_P (search_class
))
2521 load_class (search_class
, 1);
2523 for (binfo
= TYPE_BINFO (search_class
), i
= 1;
2524 BINFO_BASE_ITERATE (binfo
, i
, base_binfo
); i
++)
2527 tree elt
= BINFO_TYPE (base_binfo
);
2529 /* FIXME: This is totally bogus. We should not be handling
2530 Miranda methods at all if we're using the BC ABI. */
2531 if (TYPE_DUMMY (elt
))
2534 /* Ensure that interface methods are seen in declared order. */
2535 if (!CLASS_LOADED_P (elt
))
2536 load_class (elt
, 1);
2537 layout_class_methods (elt
);
2539 /* All base classes will have been laid out at this point, so the order
2540 will be correct. This code must match similar layout code in the
2542 for (method_decl
= TYPE_METHODS (elt
);
2543 method_decl
; method_decl
= DECL_CHAIN (method_decl
))
2547 /* An interface can have <clinit>. */
2548 if (ID_CLINIT_P (DECL_NAME (method_decl
)))
2551 sig
= build_java_argument_signature (TREE_TYPE (method_decl
));
2552 override
= lookup_argument_method (base_class
,
2553 DECL_NAME (method_decl
), sig
);
2554 if (override
== NULL_TREE
)
2556 /* Found a Miranda method. Add it. */
2558 sig
= build_java_signature (TREE_TYPE (method_decl
));
2560 = add_method (base_class
,
2561 get_access_flags_from_decl (method_decl
),
2562 DECL_NAME (method_decl
), sig
);
2563 METHOD_INVISIBLE (new_method
) = 1;
2567 /* Try superinterfaces. */
2568 add_miranda_methods (base_class
, elt
);
2573 layout_class_methods (tree this_class
)
2575 tree method_decl
, dtable_count
;
2576 tree super_class
, type_name
;
2578 if (TYPE_NVIRTUALS (this_class
))
2581 super_class
= CLASSTYPE_SUPER (this_class
);
2585 super_class
= maybe_layout_super_class (super_class
, this_class
);
2586 if (!TYPE_NVIRTUALS (super_class
))
2587 layout_class_methods (super_class
);
2588 dtable_count
= TYPE_NVIRTUALS (super_class
);
2591 dtable_count
= integer_zero_node
;
2593 type_name
= TYPE_NAME (this_class
);
2594 if (!flag_indirect_dispatch
2595 && (CLASS_ABSTRACT (type_name
) || CLASS_INTERFACE (type_name
)))
2597 /* An abstract class can have methods which are declared only in
2598 an implemented interface. These are called "Miranda
2599 methods". We make a dummy method entry for such methods
2601 add_miranda_methods (this_class
, this_class
);
2604 TYPE_METHODS (this_class
) = nreverse (TYPE_METHODS (this_class
));
2606 for (method_decl
= TYPE_METHODS (this_class
);
2607 method_decl
; method_decl
= DECL_CHAIN (method_decl
))
2608 dtable_count
= layout_class_method (this_class
, super_class
,
2609 method_decl
, dtable_count
);
2611 TYPE_NVIRTUALS (this_class
) = dtable_count
;
2614 /* Return the index of METHOD in INTERFACE. This index begins at 1
2615 and is used as an argument for _Jv_LookupInterfaceMethodIdx(). */
2617 get_interface_method_index (tree method
, tree interface
)
2622 for (meth
= TYPE_METHODS (interface
); ; meth
= DECL_CHAIN (meth
))
2626 /* We don't want to put <clinit> into the interface table. */
2627 if (! ID_CLINIT_P (DECL_NAME (meth
)))
2629 gcc_assert (meth
!= NULL_TREE
);
2633 /* Lay METHOD_DECL out, returning a possibly new value of
2634 DTABLE_COUNT. Also mangle the method's name. */
2637 layout_class_method (tree this_class
, tree super_class
,
2638 tree method_decl
, tree dtable_count
)
2640 tree method_name
= DECL_NAME (method_decl
);
2642 TREE_PUBLIC (method_decl
) = 1;
2644 if (flag_indirect_classes
2645 || (METHOD_PRIVATE (method_decl
) && METHOD_STATIC (method_decl
)
2646 && ! METHOD_NATIVE (method_decl
)
2647 && ! special_method_p (method_decl
)))
2648 java_hide_decl (method_decl
);
2650 /* Considered external unless it is being compiled into this object
2651 file, or it was already flagged as external. */
2652 if (!DECL_EXTERNAL (method_decl
))
2653 DECL_EXTERNAL (method_decl
) = ((is_compiled_class (this_class
) != 2)
2654 || METHOD_NATIVE (method_decl
));
2656 if (ID_INIT_P (method_name
))
2658 const char *p
= IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class
)));
2660 for (ptr
= p
; *ptr
; )
2665 DECL_CONSTRUCTOR_P (method_decl
) = 1;
2666 build_java_signature (TREE_TYPE (method_decl
));
2668 else if (! METHOD_STATIC (method_decl
))
2671 build_java_signature (TREE_TYPE (method_decl
));
2672 bool method_override
= false;
2673 tree super_method
= lookup_java_method (super_class
, method_name
,
2675 if (super_method
!= NULL_TREE
2676 && ! METHOD_DUMMY (super_method
))
2678 method_override
= true;
2679 if (! METHOD_PUBLIC (super_method
) &&
2680 ! METHOD_PROTECTED (super_method
))
2682 /* Don't override private method, or default-access method in
2684 if (METHOD_PRIVATE (super_method
) ||
2685 ! in_same_package (TYPE_NAME (this_class
),
2686 TYPE_NAME (super_class
)))
2687 method_override
= false;
2690 if (method_override
)
2692 tree method_index
= get_method_index (super_method
);
2693 set_method_index (method_decl
, method_index
);
2694 if (method_index
== NULL_TREE
2695 && ! flag_indirect_dispatch
2696 && ! DECL_ARTIFICIAL (super_method
))
2697 error ("non-static method %q+D overrides static method",
2700 else if (this_class
== object_type_node
2701 && (METHOD_FINAL (method_decl
)
2702 || METHOD_PRIVATE (method_decl
)))
2704 /* We don't generate vtable entries for final Object
2705 methods. This is simply to save space, since every
2706 object would otherwise have to define them. */
2708 else if (! METHOD_PRIVATE (method_decl
)
2711 /* We generate vtable entries for final methods because they
2712 may one day be changed to non-final. */
2713 set_method_index (method_decl
, dtable_count
);
2714 dtable_count
= fold_build2 (PLUS_EXPR
, integer_type_node
,
2715 dtable_count
, integer_one_node
);
2719 return dtable_count
;
2723 register_class (void)
2727 if (!registered_class
)
2728 vec_alloc (registered_class
, 8);
2730 if (flag_indirect_classes
)
2731 node
= current_class
;
2733 node
= TREE_OPERAND (build_class_ref (current_class
), 0);
2734 vec_safe_push (registered_class
, node
);
2737 /* Emit a function that calls _Jv_RegisterNewClasses with a list of
2738 all the classes we have emitted. */
2741 emit_indirect_register_classes (tree
*list_p
)
2743 tree klass
, t
, register_class_fn
;
2746 int size
= vec_safe_length (registered_class
) * 2 + 1;
2747 vec
<constructor_elt
, va_gc
> *init
;
2748 vec_alloc (init
, size
);
2749 tree class_array_type
2750 = build_prim_array_type (ptr_type_node
, size
);
2751 tree
cdecl = build_decl (input_location
,
2752 VAR_DECL
, get_identifier ("_Jv_CLS"),
2754 tree reg_class_list
;
2755 FOR_EACH_VEC_SAFE_ELT (registered_class
, i
, klass
)
2757 t
= fold_convert (ptr_type_node
, build_static_class_ref (klass
));
2758 CONSTRUCTOR_APPEND_ELT (init
, NULL_TREE
, t
);
2759 t
= fold_convert (ptr_type_node
,
2760 build_address_of (build_classdollar_field (klass
)));
2761 CONSTRUCTOR_APPEND_ELT (init
, NULL_TREE
, t
);
2763 CONSTRUCTOR_APPEND_ELT (init
, NULL_TREE
, integer_zero_node
);
2764 DECL_INITIAL (cdecl) = build_constructor (class_array_type
, init
);
2765 TREE_CONSTANT (DECL_INITIAL (cdecl)) = 1;
2766 TREE_STATIC (cdecl) = 1;
2767 DECL_ARTIFICIAL (cdecl) = 1;
2768 DECL_IGNORED_P (cdecl) = 1;
2769 TREE_READONLY (cdecl) = 1;
2770 TREE_CONSTANT (cdecl) = 1;
2771 rest_of_decl_compilation (cdecl, 1, 0);
2772 reg_class_list
= fold_convert (ptr_type_node
, build_address_of (cdecl));
2774 t
= build_function_type_list (void_type_node
,
2775 build_pointer_type (ptr_type_node
), NULL
);
2776 t
= build_decl (input_location
,
2778 get_identifier ("_Jv_RegisterNewClasses"), t
);
2779 TREE_PUBLIC (t
) = 1;
2780 DECL_EXTERNAL (t
) = 1;
2781 register_class_fn
= t
;
2782 t
= build_call_expr (register_class_fn
, 1, reg_class_list
);
2783 append_to_statement_list (t
, list_p
);
2786 /* Emit a list of pointers to all classes we have emitted to JCR_SECTION. */
2789 emit_register_classes_in_jcr_section (void)
2791 #ifdef JCR_SECTION_NAME
2792 tree klass
, cdecl, class_array_type
;
2794 int size
= vec_safe_length (registered_class
);
2795 vec
<constructor_elt
, va_gc
> *init
;
2796 vec_alloc (init
, size
);
2798 FOR_EACH_VEC_SAFE_ELT (registered_class
, i
, klass
)
2799 CONSTRUCTOR_APPEND_ELT (init
, NULL_TREE
, build_fold_addr_expr (klass
));
2801 /* ??? I would like to use tree_output_constant_def() but there is no way
2802 to put the data in a named section name, or to set the alignment,
2803 via that function. So do everything manually here. */
2804 class_array_type
= build_prim_array_type (ptr_type_node
, size
);
2805 cdecl = build_decl (UNKNOWN_LOCATION
,
2806 VAR_DECL
, get_identifier ("_Jv_JCR_SECTION_data"),
2808 DECL_ALIGN (cdecl) = POINTER_SIZE
;
2809 DECL_USER_ALIGN (cdecl) = 1;
2810 DECL_INITIAL (cdecl) = build_constructor (class_array_type
, init
);
2811 TREE_CONSTANT (DECL_INITIAL (cdecl)) = 1;
2812 TREE_STATIC (cdecl) = 1;
2813 TREE_READONLY (cdecl) = 0;
2814 TREE_CONSTANT (cdecl) = 1;
2815 DECL_ARTIFICIAL (cdecl) = 1;
2816 DECL_IGNORED_P (cdecl) = 1;
2817 DECL_PRESERVE_P (cdecl) = 1;
2818 set_decl_section_name (cdecl, JCR_SECTION_NAME
);
2819 pushdecl_top_level (cdecl);
2820 relayout_decl (cdecl);
2821 rest_of_decl_compilation (cdecl, 1, 0);
2823 /* A target has defined TARGET_USE_JCR_SECTION,
2824 but doesn't have a JCR_SECTION_NAME. */
2830 /* Emit a series of calls to _Jv_RegisterClass for every class we emitted.
2831 A series of calls is added to LIST_P. */
2834 emit_Jv_RegisterClass_calls (tree
*list_p
)
2836 tree klass
, t
, register_class_fn
;
2839 t
= build_function_type_list (void_type_node
, class_ptr_type
, NULL
);
2840 t
= build_decl (input_location
,
2841 FUNCTION_DECL
, get_identifier ("_Jv_RegisterClass"), t
);
2842 TREE_PUBLIC (t
) = 1;
2843 DECL_EXTERNAL (t
) = 1;
2844 register_class_fn
= t
;
2846 FOR_EACH_VEC_SAFE_ELT (registered_class
, i
, klass
)
2848 t
= build_fold_addr_expr (klass
);
2849 t
= build_call_expr (register_class_fn
, 1, t
);
2850 append_to_statement_list (t
, list_p
);
2854 /* Emit something to register classes at start-up time.
2856 The default mechanism is to generate instances at run-time.
2858 An alternative mechanism is through the .jcr section, which contain
2859 a list of pointers to classes which get registered during constructor
2862 The fallback mechanism is to add statements to *LIST_P to call
2863 _Jv_RegisterClass for each class in this file. These statements will
2864 be added to a static constructor function for this translation unit. */
2867 emit_register_classes (tree
*list_p
)
2869 if (registered_class
== NULL
)
2872 /* By default, generate instances of Class at runtime. */
2873 if (flag_indirect_classes
)
2874 emit_indirect_register_classes (list_p
);
2875 /* TARGET_USE_JCR_SECTION defaults to 1 if SUPPORTS_WEAK and
2876 TARGET_ASM_NAMED_SECTION, else 0. Some targets meet those conditions
2877 but lack suitable crtbegin/end objects or linker support. These
2878 targets can override the default in tm.h to use the fallback mechanism. */
2879 else if (TARGET_USE_JCR_SECTION
)
2880 emit_register_classes_in_jcr_section ();
2881 /* Use the fallback mechanism. */
2883 emit_Jv_RegisterClass_calls (list_p
);
2886 /* Build a constructor for an entry in the symbol table. */
2889 build_symbol_table_entry (tree clname
, tree name
, tree signature
)
2892 vec
<constructor_elt
, va_gc
> *v
= NULL
;
2894 START_RECORD_CONSTRUCTOR (v
, symbol_type
);
2895 PUSH_FIELD_VALUE (v
, "clname", clname
);
2896 PUSH_FIELD_VALUE (v
, "name", name
);
2897 PUSH_FIELD_VALUE (v
, "signature", signature
);
2898 FINISH_RECORD_CONSTRUCTOR (symbol
, v
, symbol_type
);
2899 TREE_CONSTANT (symbol
) = 1;
2904 /* Make a symbol_type (_Jv_MethodSymbol) node for DECL. */
2907 build_symbol_entry (tree decl
, tree special
)
2909 tree clname
, name
, signature
;
2910 clname
= build_utf8_ref (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl
))));
2911 /* ??? Constructors are given the name foo.foo all the way through
2912 the compiler, but in the method table they're all renamed
2913 foo.<init>. So, we have to do the same here unless we want an
2914 unresolved reference at runtime. */
2915 name
= build_utf8_ref ((TREE_CODE (decl
) == FUNCTION_DECL
2916 && DECL_CONSTRUCTOR_P (decl
))
2917 ? init_identifier_node
2918 : DECL_NAME (decl
));
2919 signature
= build_java_signature (TREE_TYPE (decl
));
2920 signature
= build_utf8_ref (unmangle_classname
2921 (IDENTIFIER_POINTER (signature
),
2922 IDENTIFIER_LENGTH (signature
)));
2923 /* SPECIAL is either NULL_TREE or integer_one_node. We emit
2924 signature addr+1 if SPECIAL, and this indicates to the runtime
2925 system that this is a "special" symbol, i.e. one that should
2926 bypass access controls. */
2927 if (special
!= NULL_TREE
)
2928 signature
= fold_build_pointer_plus (signature
, special
);
2930 return build_symbol_table_entry (clname
, name
, signature
);
2933 /* Emit a symbol table: used by -findirect-dispatch. */
2936 emit_symbol_table (tree name
, tree the_table
,
2937 vec
<method_entry
, va_gc
> *decl_table
,
2938 tree the_syms_decl
, tree the_array_element_type
,
2941 tree table
, null_symbol
, table_size
, the_array_type
;
2944 vec
<constructor_elt
, va_gc
> *v
= NULL
;
2946 /* Only emit a table if this translation unit actually made any
2947 references via it. */
2951 /* Build a list of _Jv_MethodSymbols for each entry in otable_methods. */
2952 FOR_EACH_VEC_ELT (*decl_table
, index
, e
)
2953 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
,
2954 build_symbol_entry (e
->method
, e
->special
));
2956 /* Terminate the list with a "null" entry. */
2957 null_symbol
= build_symbol_table_entry (null_pointer_node
,
2960 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
, null_symbol
);
2962 tree symbols_arr_type
2963 = build_prim_array_type (symbol_type
, vec_safe_length (v
));
2965 table
= build_constructor (symbols_arr_type
, v
);
2967 /* Make it the initial value for otable_syms and emit the decl. */
2968 TREE_TYPE (the_syms_decl
) = symbols_arr_type
;
2969 relayout_decl (the_syms_decl
);
2970 DECL_INITIAL (the_syms_decl
) = table
;
2971 DECL_ARTIFICIAL (the_syms_decl
) = 1;
2972 DECL_IGNORED_P (the_syms_decl
) = 1;
2973 rest_of_decl_compilation (the_syms_decl
, 1, 0);
2975 /* Now that its size is known, redefine the table as an
2976 uninitialized static array of INDEX + 1 elements. The extra entry
2977 is used by the runtime to track whether the table has been
2980 = build_index_type (build_int_cst (NULL_TREE
, index
* element_size
+ 1));
2981 the_array_type
= build_array_type (the_array_element_type
, table_size
);
2982 the_table
= build_decl (input_location
,
2983 VAR_DECL
, name
, the_array_type
);
2984 TREE_STATIC (the_table
) = 1;
2985 TREE_READONLY (the_table
) = 1;
2986 rest_of_decl_compilation (the_table
, 1, 0);
2991 /* Make an entry for the catch_classes list. */
2993 make_catch_class_record (tree catch_class
, tree classname
)
2996 tree type
= TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (output_class
)));
2997 vec
<constructor_elt
, va_gc
> *v
= NULL
;
2998 START_RECORD_CONSTRUCTOR (v
, type
);
2999 PUSH_FIELD_VALUE (v
, "address", catch_class
);
3000 PUSH_FIELD_VALUE (v
, "classname", classname
);
3001 FINISH_RECORD_CONSTRUCTOR (entry
, v
, type
);
3006 /* Generate the list of Throwable classes that are caught by exception
3007 handlers in this class. */
3009 emit_catch_table (tree this_class
)
3011 tree table
, table_size
, array_type
;
3012 int n_catch_classes
;
3014 /* Fill in the dummy entry that make_class created. */
3015 e
= &(*TYPE_CATCH_CLASSES (this_class
))[0];
3016 e
->value
= make_catch_class_record (null_pointer_node
, null_pointer_node
);
3017 CONSTRUCTOR_APPEND_ELT (TYPE_CATCH_CLASSES (this_class
), NULL_TREE
,
3018 make_catch_class_record (null_pointer_node
,
3019 null_pointer_node
));
3020 n_catch_classes
= TYPE_CATCH_CLASSES (this_class
)->length ();
3021 table_size
= build_index_type (build_int_cst (NULL_TREE
, n_catch_classes
));
3023 = build_array_type (TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (this_class
))),
3026 build_decl (input_location
,
3027 VAR_DECL
, DECL_NAME (TYPE_CTABLE_DECL (this_class
)), array_type
);
3028 DECL_INITIAL (table
) =
3029 build_constructor (array_type
, TYPE_CATCH_CLASSES (this_class
));
3030 TREE_STATIC (table
) = 1;
3031 TREE_READONLY (table
) = 1;
3032 DECL_IGNORED_P (table
) = 1;
3033 rest_of_decl_compilation (table
, 1, 0);
3037 /* Given a type, return the signature used by
3038 _Jv_FindClassFromSignature() in libgcj. This isn't exactly the
3039 same as build_java_signature() because we want the canonical array
3043 build_signature_for_libgcj (tree type
)
3047 sig
= build_java_signature (type
);
3048 ref
= build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig
),
3049 IDENTIFIER_LENGTH (sig
)));
3053 /* Build an entry in the type assertion table. */
3056 build_assertion_table_entry (tree code
, tree op1
, tree op2
)
3058 vec
<constructor_elt
, va_gc
> *v
= NULL
;
3061 START_RECORD_CONSTRUCTOR (v
, assertion_entry_type
);
3062 PUSH_FIELD_VALUE (v
, "assertion_code", code
);
3063 PUSH_FIELD_VALUE (v
, "op1", op1
);
3064 PUSH_FIELD_VALUE (v
, "op2", op2
);
3065 FINISH_RECORD_CONSTRUCTOR (entry
, v
, assertion_entry_type
);
3070 /* Add an entry to the type assertion table. Callback used during hashtable
3074 add_assertion_table_entry (type_assertion
**slot
, vec
<constructor_elt
, va_gc
> **v
)
3077 tree code_val
, op1_utf8
, op2_utf8
;
3078 type_assertion
*as
= *slot
;
3080 code_val
= build_int_cst (NULL_TREE
, as
->assertion_code
);
3082 if (as
->op1
== NULL_TREE
)
3083 op1_utf8
= null_pointer_node
;
3085 op1_utf8
= build_signature_for_libgcj (as
->op1
);
3087 if (as
->op2
== NULL_TREE
)
3088 op2_utf8
= null_pointer_node
;
3090 op2_utf8
= build_signature_for_libgcj (as
->op2
);
3092 entry
= build_assertion_table_entry (code_val
, op1_utf8
, op2_utf8
);
3094 CONSTRUCTOR_APPEND_ELT (*v
, NULL_TREE
, entry
);
3098 /* Generate the type assertion table for KLASS, and return its DECL. */
3101 emit_assertion_table (tree klass
)
3103 tree null_entry
, ctor
, table_decl
;
3104 hash_table
<type_assertion_hasher
> *assertions_htab
= TYPE_ASSERTIONS (klass
);
3105 vec
<constructor_elt
, va_gc
> *v
= NULL
;
3107 /* Iterate through the hash table. */
3109 ->traverse
<vec
<constructor_elt
, va_gc
> **, add_assertion_table_entry
> (&v
);
3111 /* Finish with a null entry. */
3112 null_entry
= build_assertion_table_entry (integer_zero_node
,
3116 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
, null_entry
);
3119 = build_prim_array_type (assertion_entry_type
, vec_safe_length (v
));
3121 ctor
= build_constructor (type
, v
);
3123 table_decl
= build_decl (input_location
,
3124 VAR_DECL
, mangled_classname ("_type_assert_", klass
),
3127 TREE_STATIC (table_decl
) = 1;
3128 TREE_READONLY (table_decl
) = 1;
3129 TREE_CONSTANT (table_decl
) = 1;
3130 DECL_IGNORED_P (table_decl
) = 1;
3132 DECL_INITIAL (table_decl
) = ctor
;
3133 DECL_ARTIFICIAL (table_decl
) = 1;
3134 rest_of_decl_compilation (table_decl
, 1, 0);
3140 init_class_processing (void)
3142 fields_ident
= get_identifier ("fields");
3143 info_ident
= get_identifier ("info");
3145 gcc_obstack_init (&temporary_obstack
);
3148 /* A hash table mapping trees to trees. Used generally. */
3150 #define JAVA_TREEHASHHASH_H(t) ((hashval_t)TYPE_UID (t))
3153 treetreehasher::hash (treetreehash_entry
*k
)
3155 return JAVA_TREEHASHHASH_H (k
->key
);
3159 treetreehasher::equal (treetreehash_entry
*k1
, tree k2
)
3161 return (k1
->key
== k2
);
3165 java_treetreehash_find (hash_table
<treetreehasher
> *ht
, tree t
)
3167 struct treetreehash_entry
*e
;
3168 hashval_t hv
= JAVA_TREEHASHHASH_H (t
);
3169 e
= ht
->find_with_hash (t
, hv
);
3177 java_treetreehash_new (hash_table
<treetreehasher
> *ht
, tree t
)
3179 struct treetreehash_entry
*tthe
;
3180 hashval_t hv
= JAVA_TREEHASHHASH_H (t
);
3182 treetreehash_entry
**e
= ht
->find_slot_with_hash (t
, hv
, INSERT
);
3185 tthe
= ggc_cleared_alloc
<treetreehash_entry
> ();
3191 return &tthe
->value
;
3194 hash_table
<treetreehasher
> *
3195 java_treetreehash_create (size_t size
)
3197 return hash_table
<treetreehasher
>::create_ggc (size
);
3200 /* Break down qualified IDENTIFIER into package and class-name components.
3201 For example, given SOURCE "pkg.foo.Bar", LEFT will be set to
3202 "pkg.foo", and RIGHT to "Bar". */
3205 split_qualified_name (tree
*left
, tree
*right
, tree source
)
3208 int l
= IDENTIFIER_LENGTH (source
);
3210 base
= (char *) alloca (l
+ 1);
3211 memcpy (base
, IDENTIFIER_POINTER (source
), l
+ 1);
3213 /* Breakdown NAME into REMAINDER . IDENTIFIER. */
3215 while (*p
!= '.' && p
!= base
)
3218 /* We didn't find a '.'. Return an error. */
3224 *right
= get_identifier (p
+1);
3225 *left
= get_identifier (base
);
3230 /* Given two classes (TYPE_DECL) or class names (IDENTIFIER), return TRUE
3231 if the classes are from the same package. */
3234 in_same_package (tree name1
, tree name2
)
3240 if (TREE_CODE (name1
) == TYPE_DECL
)
3241 name1
= DECL_NAME (name1
);
3242 if (TREE_CODE (name2
) == TYPE_DECL
)
3243 name2
= DECL_NAME (name2
);
3245 if (QUALIFIED_P (name1
) != QUALIFIED_P (name2
))
3246 /* One in empty package. */
3249 if (QUALIFIED_P (name1
) == 0 && QUALIFIED_P (name2
) == 0)
3250 /* Both in empty package. */
3253 split_qualified_name (&pkg1
, &tmp
, name1
);
3254 split_qualified_name (&pkg2
, &tmp
, name2
);
3256 return (pkg1
== pkg2
);
3259 /* lang_hooks.decls.final_write_globals: perform final processing on
3260 global variables. */
3263 java_write_globals (void)
3265 tree
*vec
= vec_safe_address (pending_static_fields
);
3266 int len
= vec_safe_length (pending_static_fields
);
3267 write_global_declarations ();
3268 emit_debug_global_declarations (vec
, len
);
3269 vec_free (pending_static_fields
);
3272 #include "gt-java-class.h"