]> gcc.gnu.org Git - gcc.git/blob - gcc/java/class.c
cgraph.h: Flatten.
[gcc.git] / gcc / java / class.c
1 /* Functions related to building classes and their related objects.
2 Copyright (C) 1996-2014 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
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)
9 any later version.
10
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.
15
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/>.
19
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. */
23
24 /* Written by Per Bothner <bothner@cygnus.com> */
25
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "tree.h"
30 #include "stringpool.h"
31 #include "stor-layout.h"
32 #include "varasm.h"
33 #include "flags.h"
34 #include "java-tree.h"
35 #include "jcf.h"
36 #include "obstack.h"
37 #include "diagnostic-core.h"
38 #include "toplev.h"
39 #include "output.h" /* for switch_to_section and get_section */
40 #include "parse.h"
41 #include "hashtab.h"
42 #include "hash-set.h"
43 #include "vec.h"
44 #include "machmode.h"
45 #include "tm.h"
46 #include "hard-reg-set.h"
47 #include "input.h"
48 #include "function.h"
49 #include "ggc.h"
50 #include "hash-map.h"
51 #include "is-a.h"
52 #include "plugin-api.h"
53 #include "ipa-ref.h"
54 #include "cgraph.h"
55 #include "tree-iterator.h"
56 #include "target.h"
57
58 static tree make_method_value (tree);
59 static tree build_java_method_type (tree, tree, int);
60 static int32 hashUtf8String (const char *, int);
61 static tree make_field_value (tree);
62 static tree get_dispatch_vector (tree);
63 static tree get_dispatch_table (tree, tree);
64 static int supers_all_compiled (tree type);
65 static tree maybe_layout_super_class (tree, tree);
66 static void add_miranda_methods (tree, tree);
67 static int assume_compiled (const char *);
68 static tree build_symbol_entry (tree, tree);
69 static tree emit_assertion_table (tree);
70 static void register_class (void);
71
72 struct obstack temporary_obstack;
73
74 static const char *cyclic_inheritance_report;
75
76 /* The compiler generates different code depending on whether or not
77 it can assume certain classes have been compiled down to native
78 code or not. The compiler options -fassume-compiled= and
79 -fno-assume-compiled= are used to create a tree of
80 class_flag_node objects. This tree is queried to determine if
81 a class is assume to be compiled or not. Each node in the tree
82 represents either a package or a specific class. */
83
84 typedef struct class_flag_node_struct
85 {
86 /* The class or package name. */
87 const char *ident;
88
89 /* Nonzero if this represents an exclusion. */
90 int value;
91
92 /* Pointers to other nodes in the tree. */
93 struct class_flag_node_struct *parent;
94 struct class_flag_node_struct *sibling;
95 struct class_flag_node_struct *child;
96 } class_flag_node;
97
98 static class_flag_node *find_class_flag_node (class_flag_node *, const char *);
99 static void add_class_flag (class_flag_node **, const char *, int);
100
101 /* This is the root of the include/exclude tree. */
102
103 static class_flag_node *assume_compiled_tree;
104
105 static class_flag_node *enable_assert_tree;
106
107 static GTY(()) tree class_roots[4];
108 #define fields_ident class_roots[0] /* get_identifier ("fields") */
109 #define info_ident class_roots[1] /* get_identifier ("info") */
110 #define class_list class_roots[2]
111 #define class_dtable_decl class_roots[3]
112
113 static GTY(()) vec<tree, va_gc> *registered_class;
114
115 /* A tree that returns the address of the class$ of the class
116 currently being compiled. */
117 static GTY(()) tree this_classdollar;
118
119 /* A list of static class fields. This is to emit proper debug
120 info for them. */
121 vec<tree, va_gc> *pending_static_fields;
122
123 /* Return the node that most closely represents the class whose name
124 is IDENT. Start the search from NODE (followed by its siblings).
125 Return NULL if an appropriate node does not exist. */
126
127 static class_flag_node *
128 find_class_flag_node (class_flag_node *node, const char *ident)
129 {
130 while (node)
131 {
132 size_t node_ident_length = strlen (node->ident);
133
134 /* node_ident_length is zero at the root of the tree. If the
135 identifiers are the same length, then we have matching
136 classes. Otherwise check if we've matched an enclosing
137 package name. */
138
139 if (node_ident_length == 0
140 || (strncmp (ident, node->ident, node_ident_length) == 0
141 && (ident[node_ident_length] == '\0'
142 || ident[node_ident_length] == '.')))
143 {
144 /* We've found a match, however, there might be a more
145 specific match. */
146
147 class_flag_node *found = find_class_flag_node (node->child, ident);
148 if (found)
149 return found;
150 else
151 return node;
152 }
153
154 /* No match yet. Continue through the sibling list. */
155 node = node->sibling;
156 }
157
158 /* No match at all in this tree. */
159 return NULL;
160 }
161
162 void
163 add_class_flag (class_flag_node **rootp, const char *ident, int value)
164 {
165 class_flag_node *root = *rootp;
166 class_flag_node *parent, *node;
167
168 /* Create the root of the tree if it doesn't exist yet. */
169
170 if (NULL == root)
171 {
172 root = XNEW (class_flag_node);
173 root->ident = "";
174 root->value = 0;
175 root->sibling = NULL;
176 root->child = NULL;
177 root->parent = NULL;
178 *rootp = root;
179 }
180
181 /* Calling the function with the empty string means we're setting
182 value for the root of the hierarchy. */
183
184 if (0 == ident[0])
185 {
186 root->value = value;
187 return;
188 }
189
190 /* Find the parent node for this new node. PARENT will either be a
191 class or a package name. Adjust PARENT accordingly. */
192
193 parent = find_class_flag_node (root, ident);
194 if (strcmp (ident, parent->ident) == 0)
195 parent->value = value;
196 else
197 {
198 /* Insert new node into the tree. */
199 node = XNEW (class_flag_node);
200
201 node->ident = xstrdup (ident);
202 node->value = value;
203 node->child = NULL;
204
205 node->parent = parent;
206 node->sibling = parent->child;
207 parent->child = node;
208 }
209 }
210
211 /* Add a new IDENT to the include/exclude tree. It's an exclusion
212 if EXCLUDEP is nonzero. */
213
214 void
215 add_assume_compiled (const char *ident, int excludep)
216 {
217 add_class_flag (&assume_compiled_tree, ident, excludep);
218 }
219
220 /* The default value returned by enable_assertions. */
221
222 #define DEFAULT_ENABLE_ASSERT (optimize == 0)
223
224 /* Enter IDENT (a class or package name) into the enable-assertions table.
225 VALUE is true to enable and false to disable. */
226
227 void
228 add_enable_assert (const char *ident, int value)
229 {
230 if (enable_assert_tree == NULL)
231 add_class_flag (&enable_assert_tree, "", DEFAULT_ENABLE_ASSERT);
232 add_class_flag (&enable_assert_tree, ident, value);
233 }
234
235 /* Returns nonzero if IDENT is the name of a class that the compiler
236 should assume has been compiled to object code. */
237
238 static int
239 assume_compiled (const char *ident)
240 {
241 class_flag_node *i;
242 int result;
243
244 if (NULL == assume_compiled_tree)
245 return 1;
246
247 i = find_class_flag_node (assume_compiled_tree, ident);
248
249 result = ! i->value;
250
251 return (result);
252 }
253
254 /* Return true if we should generate code to check assertions within KLASS. */
255
256 bool
257 enable_assertions (tree klass)
258 {
259 /* Check if command-line specifies whether we should check assertions. */
260
261 if (klass != NULL_TREE && DECL_NAME (klass) && enable_assert_tree != NULL)
262 {
263 const char *ident = IDENTIFIER_POINTER (DECL_NAME (klass));
264 class_flag_node *node
265 = find_class_flag_node (enable_assert_tree, ident);
266 return node->value;
267 }
268
269 /* The default is to enable assertions if generating class files,
270 or not optimizing. */
271 return DEFAULT_ENABLE_ASSERT;
272 }
273
274 /* Return an IDENTIFIER_NODE the same as (OLD_NAME, OLD_LENGTH).
275 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
276 Also, PREFIX is prepended, and SUFFIX is appended. */
277
278 tree
279 ident_subst (const char* old_name,
280 int old_length,
281 const char *prefix,
282 int old_char,
283 int new_char,
284 const char *suffix)
285 {
286 int prefix_len = strlen (prefix);
287 int suffix_len = strlen (suffix);
288 int i = prefix_len + old_length + suffix_len + 1;
289 char *buffer = (char *) alloca (i);
290
291 strcpy (buffer, prefix);
292 for (i = 0; i < old_length; i++)
293 {
294 char ch = old_name[i];
295 if (ch == old_char)
296 ch = new_char;
297 buffer[prefix_len + i] = ch;
298 }
299 strcpy (buffer + prefix_len + old_length, suffix);
300 return get_identifier (buffer);
301 }
302
303 /* Return an IDENTIFIER_NODE the same as OLD_ID,
304 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
305 Also, PREFIX is prepended, and SUFFIX is appended. */
306
307 tree
308 identifier_subst (const tree old_id,
309 const char *prefix,
310 int old_char,
311 int new_char,
312 const char *suffix)
313 {
314 return ident_subst (IDENTIFIER_POINTER (old_id), IDENTIFIER_LENGTH (old_id),
315 prefix, old_char, new_char, suffix);
316 }
317
318 /* Generate a valid C identifier from the name of the class TYPE,
319 prefixed by PREFIX. */
320
321 tree
322 mangled_classname (const char *prefix, tree type)
323 {
324 tree result;
325 tree ident = TYPE_NAME (type);
326 if (TREE_CODE (ident) != IDENTIFIER_NODE)
327 ident = DECL_NAME (ident);
328 result = identifier_subst (ident, prefix, '.', '_', "");
329
330 /* Replace any characters that aren't in the set [0-9a-zA-Z_$] with
331 "_0xXX". Class names containing such chracters are uncommon, but
332 they do sometimes occur in class files. Without this check,
333 these names cause assembly errors.
334
335 There is a possibility that a real class name could conflict with
336 the identifier we generate, but it is unlikely and will
337 immediately be detected as an assembler error. At some point we
338 should do something more elaborate (perhaps using the full
339 unicode mangling scheme) in order to prevent such a conflict. */
340 {
341 int i;
342 const int len = IDENTIFIER_LENGTH (result);
343 const char *p = IDENTIFIER_POINTER (result);
344 int illegal_chars = 0;
345
346 /* Make two passes over the identifier. The first pass is merely
347 to count illegal characters; we need to do this in order to
348 allocate a buffer. */
349 for (i = 0; i < len; i++)
350 {
351 char c = p[i];
352 illegal_chars += (! ISALNUM (c) && c != '_' && c != '$');
353 }
354
355 /* And the second pass, which is rarely executed, does the
356 rewriting. */
357 if (illegal_chars != 0)
358 {
359 char *buffer = (char *) alloca (illegal_chars * 4 + len + 1);
360 int j;
361
362 for (i = 0, j = 0; i < len; i++)
363 {
364 char c = p[i];
365 if (! ISALNUM (c) && c != '_' && c != '$')
366 {
367 buffer[j++] = '_';
368 sprintf (&buffer[j], "0x%02x", c);
369 j += 4;
370 }
371 else
372 buffer[j++] = c;
373 }
374
375 buffer[j] = 0;
376 result = get_identifier (buffer);
377 }
378 }
379
380 return result;
381 }
382
383 tree
384 make_class (void)
385 {
386 tree type;
387 type = make_node (RECORD_TYPE);
388 /* Unfortunately we must create the binfo here, so that class
389 loading works. */
390 TYPE_BINFO (type) = make_tree_binfo (0);
391 MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC (type);
392 TYPE_CATCH_CLASSES (type) = NULL;
393 /* Push a dummy entry; we can't call make_catch_class_record here
394 because other infrastructure may not be set up yet. We'll come
395 back and fill it in later once said infrastructure is
396 initialized. */
397 CONSTRUCTOR_APPEND_ELT (TYPE_CATCH_CLASSES (type), NULL_TREE, NULL_TREE);
398
399 return type;
400 }
401
402 /* Given a fully-qualified classname in NAME (whose length is NAME_LENGTH),
403 and where each of the constituents is separated by '/',
404 return a corresponding IDENTIFIER_NODE, except using '.' as separator. */
405
406 tree
407 unmangle_classname (const char *name, int name_length)
408 {
409 tree to_return = ident_subst (name, name_length, "", '/', '.', "");
410 /* It's not sufficient to compare to_return and get_identifier
411 (name) to determine whether to_return is qualified. There are
412 cases in signature analysis where name will be stripped of a
413 trailing ';'. */
414 name = IDENTIFIER_POINTER (to_return);
415 while (*name)
416 if (*name++ == '.')
417 {
418 QUALIFIED_P (to_return) = 1;
419 break;
420 }
421
422 return to_return;
423 }
424
425 #define GEN_TABLE(TABLE, NAME, TABLE_TYPE, TYPE) \
426 do \
427 { \
428 const char *type_name = IDENTIFIER_POINTER (mangled_classname ("", TYPE)); \
429 char *buf = (char *) alloca (strlen (type_name) \
430 + strlen (#NAME "_syms_") + 1); \
431 tree decl; \
432 \
433 sprintf (buf, #NAME "_%s", type_name); \
434 TYPE_## TABLE ##_DECL (type) = decl = \
435 build_decl (input_location, VAR_DECL, get_identifier (buf), TABLE_TYPE); \
436 DECL_EXTERNAL (decl) = 1; \
437 TREE_STATIC (decl) = 1; \
438 TREE_READONLY (decl) = 1; \
439 TREE_CONSTANT (decl) = 1; \
440 DECL_IGNORED_P (decl) = 1; \
441 /* Mark the table as belonging to this class. */ \
442 pushdecl (decl); \
443 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl); \
444 DECL_OWNER (decl) = TYPE; \
445 sprintf (buf, #NAME "_syms_%s", type_name); \
446 TYPE_## TABLE ##_SYMS_DECL (TYPE) = \
447 build_decl (input_location, VAR_DECL, get_identifier (buf), symbols_array_type); \
448 TREE_STATIC (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
449 TREE_CONSTANT (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
450 DECL_IGNORED_P (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
451 } \
452 while (0)
453
454 /* Given a class, create the DECLs for all its associated indirect
455 dispatch tables. */
456 void
457 gen_indirect_dispatch_tables (tree type)
458 {
459 const char *type_name = IDENTIFIER_POINTER (mangled_classname ("", type));
460 {
461 tree field = NULL;
462 char *buf = (char *) alloca (strlen (type_name)
463 + strlen ("_catch_classes_") + 1);
464 tree catch_class_type = make_node (RECORD_TYPE);
465
466 sprintf (buf, "_catch_classes_%s", type_name);
467 PUSH_FIELD (input_location,
468 catch_class_type, field, "address", utf8const_ptr_type);
469 PUSH_FIELD (input_location,
470 catch_class_type, field, "classname", ptr_type_node);
471 FINISH_RECORD (catch_class_type);
472
473 TYPE_CTABLE_DECL (type)
474 = build_decl (input_location, VAR_DECL, get_identifier (buf),
475 build_array_type (catch_class_type, 0));
476 DECL_EXTERNAL (TYPE_CTABLE_DECL (type)) = 1;
477 TREE_STATIC (TYPE_CTABLE_DECL (type)) = 1;
478 TREE_READONLY (TYPE_CTABLE_DECL (type)) = 1;
479 TREE_CONSTANT (TYPE_CTABLE_DECL (type)) = 1;
480 DECL_IGNORED_P (TYPE_CTABLE_DECL (type)) = 1;
481 pushdecl (TYPE_CTABLE_DECL (type));
482 }
483
484 if (flag_indirect_dispatch)
485 {
486 GEN_TABLE (ATABLE, _atable, atable_type, type);
487 GEN_TABLE (OTABLE, _otable, otable_type, type);
488 GEN_TABLE (ITABLE, _itable, itable_type, type);
489 }
490 }
491
492 #undef GEN_TABLE
493
494 tree
495 push_class (tree class_type, tree class_name)
496 {
497 tree decl, signature;
498 location_t saved_loc = input_location;
499 CLASS_P (class_type) = 1;
500 decl = build_decl (input_location, TYPE_DECL, class_name, class_type);
501 TYPE_DECL_SUPPRESS_DEBUG (decl) = 1;
502
503 /* dbxout needs a DECL_SIZE if in gstabs mode */
504 DECL_SIZE (decl) = integer_zero_node;
505
506 input_location = saved_loc;
507 signature = identifier_subst (class_name, "L", '.', '/', ";");
508 IDENTIFIER_SIGNATURE_TYPE (signature) = build_pointer_type (class_type);
509
510 /* Setting DECL_ARTIFICIAL forces dbxout.c to specific the type is
511 both a typedef and in the struct name-space. We may want to re-visit
512 this later, but for now it reduces the changes needed for gdb. */
513 DECL_ARTIFICIAL (decl) = 1;
514
515 pushdecl_top_level (decl);
516
517 return decl;
518 }
519
520 /* Finds the (global) class named NAME. Creates the class if not found.
521 Also creates associated TYPE_DECL.
522 Does not check if the class actually exists, load the class,
523 fill in field or methods, or do layout_type. */
524
525 tree
526 lookup_class (tree name)
527 {
528 tree decl = IDENTIFIER_CLASS_VALUE (name);
529 if (decl == NULL_TREE)
530 decl = push_class (make_class (), name);
531 return TREE_TYPE (decl);
532 }
533
534 void
535 set_super_info (int access_flags, tree this_class,
536 tree super_class, int interfaces_count)
537 {
538 int total_supers = interfaces_count;
539 tree class_decl = TYPE_NAME (this_class);
540
541 if (super_class)
542 total_supers++;
543
544 if (total_supers)
545 TYPE_BINFO (this_class) = make_tree_binfo (total_supers);
546 TYPE_VFIELD (this_class) = TYPE_VFIELD (object_type_node);
547 if (super_class)
548 {
549 tree super_binfo = make_tree_binfo (0);
550 BINFO_TYPE (super_binfo) = super_class;
551 BINFO_OFFSET (super_binfo) = integer_zero_node;
552 BINFO_BASE_APPEND (TYPE_BINFO (this_class), super_binfo);
553 CLASS_HAS_SUPER_FLAG (TYPE_BINFO (this_class)) = 1;
554 }
555
556 set_class_decl_access_flags (access_flags, class_decl);
557 }
558
559 void
560 set_class_decl_access_flags (int access_flags, tree class_decl)
561 {
562 if (access_flags & ACC_PUBLIC) CLASS_PUBLIC (class_decl) = 1;
563 if (access_flags & ACC_FINAL) CLASS_FINAL (class_decl) = 1;
564 if (access_flags & ACC_SUPER) CLASS_SUPER (class_decl) = 1;
565 if (access_flags & ACC_INTERFACE) CLASS_INTERFACE (class_decl) = 1;
566 if (access_flags & ACC_ABSTRACT) CLASS_ABSTRACT (class_decl) = 1;
567 if (access_flags & ACC_STATIC) CLASS_STATIC (class_decl) = 1;
568 if (access_flags & ACC_PRIVATE) CLASS_PRIVATE (class_decl) = 1;
569 if (access_flags & ACC_PROTECTED) CLASS_PROTECTED (class_decl) = 1;
570 if (access_flags & ACC_STRICT) CLASS_STRICTFP (class_decl) = 1;
571 if (access_flags & ACC_ENUM) CLASS_ENUM (class_decl) = 1;
572 if (access_flags & ACC_SYNTHETIC) CLASS_SYNTHETIC (class_decl) = 1;
573 if (access_flags & ACC_ANNOTATION) CLASS_ANNOTATION (class_decl) = 1;
574 }
575
576 /* Return length of inheritance chain of CLAS, where java.lang.Object is 0,
577 direct sub-classes of Object are 1, and so on. */
578
579 int
580 class_depth (tree clas)
581 {
582 int depth = 0;
583 if (! CLASS_LOADED_P (clas))
584 load_class (clas, 1);
585 if (TYPE_SIZE (clas) == error_mark_node)
586 return -1;
587 while (clas != object_type_node)
588 {
589 depth++;
590 clas = BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (clas), 0));
591 }
592 return depth;
593 }
594
595 /* Return true iff TYPE2 is an interface that extends interface TYPE1 */
596
597 int
598 interface_of_p (tree type1, tree type2)
599 {
600 int i;
601 tree binfo, base_binfo;
602
603 if (! TYPE_BINFO (type2))
604 return 0;
605
606 for (binfo = TYPE_BINFO (type2), i = 0;
607 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
608 if (BINFO_TYPE (base_binfo) == type1)
609 return 1;
610
611 for (binfo = TYPE_BINFO (type2), i = 0;
612 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++) /* */
613 if (BINFO_TYPE (base_binfo)
614 && interface_of_p (type1, BINFO_TYPE (base_binfo)))
615 return 1;
616
617 return 0;
618 }
619
620 /* Return true iff TYPE1 inherits from TYPE2. */
621
622 int
623 inherits_from_p (tree type1, tree type2)
624 {
625 while (type1 != NULL_TREE && TREE_CODE (type1) == RECORD_TYPE)
626 {
627 if (type1 == type2)
628 return 1;
629
630 if (! CLASS_LOADED_P (type1))
631 load_class (type1, 1);
632
633 type1 = maybe_layout_super_class (CLASSTYPE_SUPER (type1), type1);
634 }
635 return 0;
636 }
637
638 /* Return a 1 iff TYPE1 is an enclosing context for TYPE2 */
639
640 int
641 enclosing_context_p (tree type1, tree type2)
642 {
643 if (!INNER_CLASS_TYPE_P (type2))
644 return 0;
645
646 for (type2 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2)));
647 type2;
648 type2 = (INNER_CLASS_TYPE_P (type2) ?
649 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))) : NULL_TREE))
650 {
651 if (type2 == type1)
652 return 1;
653 }
654
655 return 0;
656 }
657
658
659 /* Return 1 iff TYPE1 and TYPE2 share a common enclosing class, regardless of
660 nesting level. */
661
662 int
663 common_enclosing_context_p (tree type1, tree type2)
664 {
665 while (type1)
666 {
667 tree current;
668 for (current = type2; current;
669 current = (INNER_CLASS_TYPE_P (current) ?
670 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
671 NULL_TREE))
672 if (type1 == current)
673 return 1;
674
675 if (INNER_CLASS_TYPE_P (type1))
676 type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1)));
677 else
678 break;
679 }
680 return 0;
681 }
682
683 /* Return 1 iff there exists a common enclosing "this" between TYPE1
684 and TYPE2, without crossing any static context. */
685
686 int
687 common_enclosing_instance_p (tree type1, tree type2)
688 {
689 if (!PURE_INNER_CLASS_TYPE_P (type1) || !PURE_INNER_CLASS_TYPE_P (type2))
690 return 0;
691
692 for (type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))); type1;
693 type1 = (PURE_INNER_CLASS_TYPE_P (type1) ?
694 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))) : NULL_TREE))
695 {
696 tree current;
697 for (current = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))); current;
698 current = (PURE_INNER_CLASS_TYPE_P (current) ?
699 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
700 NULL_TREE))
701 if (type1 == current)
702 return 1;
703 }
704 return 0;
705 }
706
707 /* Add INTERFACE_CLASS to THIS_CLASS iff INTERFACE_CLASS can't be
708 found in THIS_CLASS. Returns NULL_TREE upon success, INTERFACE_CLASS
709 if attempt is made to add it twice. */
710
711 tree
712 maybe_add_interface (tree this_class, tree interface_class)
713 {
714 tree binfo, base_binfo;
715 int i;
716
717 for (binfo = TYPE_BINFO (this_class), i = 0;
718 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
719 if (BINFO_TYPE (base_binfo) == interface_class)
720 return interface_class;
721 add_interface (this_class, interface_class);
722 return NULL_TREE;
723 }
724
725 /* Add the INTERFACE_CLASS as one of the interfaces of THIS_CLASS. */
726
727 void
728 add_interface (tree this_class, tree interface_class)
729 {
730 tree interface_binfo = make_tree_binfo (0);
731
732 BINFO_TYPE (interface_binfo) = interface_class;
733 BINFO_OFFSET (interface_binfo) = integer_zero_node;
734 BINFO_VPTR_FIELD (interface_binfo) = integer_zero_node;
735 BINFO_VIRTUAL_P (interface_binfo) = 1;
736
737 BINFO_BASE_APPEND (TYPE_BINFO (this_class), interface_binfo);
738 }
739
740 static tree
741 build_java_method_type (tree fntype, tree this_class, int access_flags)
742 {
743 if (access_flags & ACC_STATIC)
744 return fntype;
745 fntype = build_method_type (this_class, fntype);
746
747 /* We know that arg 1 of every nonstatic method is non-null; tell
748 the back-end so. */
749 TYPE_ATTRIBUTES (fntype) = (tree_cons
750 (get_identifier ("nonnull"),
751 tree_cons (NULL_TREE,
752 build_int_cst (NULL_TREE, 1),
753 NULL_TREE),
754 TYPE_ATTRIBUTES (fntype)));
755 return fntype;
756 }
757
758 void
759 java_hide_decl (tree decl ATTRIBUTE_UNUSED)
760 {
761 #ifdef HAVE_GAS_HIDDEN
762 DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
763 DECL_VISIBILITY_SPECIFIED (decl) = 1;
764 #endif
765 }
766
767 tree
768 add_method_1 (tree this_class, int access_flags, tree name, tree function_type)
769 {
770 tree method_type, fndecl;
771
772 method_type = build_java_method_type (function_type,
773 this_class, access_flags);
774
775 fndecl = build_decl (input_location, FUNCTION_DECL, name, method_type);
776 DECL_CONTEXT (fndecl) = this_class;
777
778 DECL_LANG_SPECIFIC (fndecl) = ggc_cleared_alloc<struct lang_decl> ();
779 DECL_LANG_SPECIFIC (fndecl)->desc = LANG_DECL_FUNC;
780
781 /* Initialize the static initializer test table. */
782
783 DECL_FUNCTION_INIT_TEST_TABLE (fndecl) = java_treetreehash_create (10);
784
785 /* Initialize the initialized (static) class table. */
786 if (access_flags & ACC_STATIC)
787 DECL_FUNCTION_INITIALIZED_CLASS_TABLE (fndecl) =
788 hash_table<ict_hasher>::create_ggc (50);
789
790 DECL_CHAIN (fndecl) = TYPE_METHODS (this_class);
791 TYPE_METHODS (this_class) = fndecl;
792
793 /* If pointers to member functions use the least significant bit to
794 indicate whether a function is virtual, ensure a pointer
795 to this function will have that bit clear. */
796 if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
797 && !(access_flags & ACC_STATIC)
798 && DECL_ALIGN (fndecl) < 2 * BITS_PER_UNIT)
799 DECL_ALIGN (fndecl) = 2 * BITS_PER_UNIT;
800
801 /* Notice that this is a finalizer and update the class type
802 accordingly. This is used to optimize instance allocation. */
803 if (name == finalize_identifier_node
804 && TREE_TYPE (function_type) == void_type_node
805 && TREE_VALUE (TYPE_ARG_TYPES (function_type)) == void_type_node)
806 HAS_FINALIZER_P (this_class) = 1;
807
808 if (access_flags & ACC_PUBLIC) METHOD_PUBLIC (fndecl) = 1;
809 if (access_flags & ACC_PROTECTED) METHOD_PROTECTED (fndecl) = 1;
810 if (access_flags & ACC_PRIVATE)
811 METHOD_PRIVATE (fndecl) = 1;
812 if (access_flags & ACC_NATIVE)
813 {
814 METHOD_NATIVE (fndecl) = 1;
815 DECL_EXTERNAL (fndecl) = 1;
816 }
817 else
818 /* FNDECL is external unless we are compiling it into this object
819 file. */
820 DECL_EXTERNAL (fndecl) = CLASS_FROM_CURRENTLY_COMPILED_P (this_class) == 0;
821 if (access_flags & ACC_STATIC)
822 METHOD_STATIC (fndecl) = 1;
823 if (access_flags & ACC_FINAL)
824 METHOD_FINAL (fndecl) = 1;
825 if (access_flags & ACC_SYNCHRONIZED) METHOD_SYNCHRONIZED (fndecl) = 1;
826 if (access_flags & ACC_ABSTRACT) METHOD_ABSTRACT (fndecl) = 1;
827 if (access_flags & ACC_STRICT) METHOD_STRICTFP (fndecl) = 1;
828 if (access_flags & ACC_SYNTHETIC) DECL_ARTIFICIAL (fndecl) = 1;
829 if (access_flags & ACC_BRIDGE) METHOD_BRIDGE (fndecl) = 1;
830 if (access_flags & ACC_VARARGS) METHOD_VARARGS (fndecl) = 1;
831 return fndecl;
832 }
833
834 /* Add a method to THIS_CLASS.
835 The method's name is NAME.
836 Its signature (mangled type) is METHOD_SIG (an IDENTIFIER_NODE). */
837
838 tree
839 add_method (tree this_class, int access_flags, tree name, tree method_sig)
840 {
841 tree function_type, fndecl;
842 const unsigned char *sig
843 = (const unsigned char *) IDENTIFIER_POINTER (method_sig);
844
845 if (sig[0] != '(')
846 fatal_error ("bad method signature");
847
848 function_type = get_type_from_signature (method_sig);
849 fndecl = add_method_1 (this_class, access_flags, name, function_type);
850 set_java_signature (TREE_TYPE (fndecl), method_sig);
851 return fndecl;
852 }
853
854 tree
855 add_field (tree klass, tree name, tree field_type, int flags)
856 {
857 int is_static = (flags & ACC_STATIC) != 0;
858 tree field;
859 field = build_decl (input_location,
860 is_static ? VAR_DECL : FIELD_DECL, name, field_type);
861 DECL_CHAIN (field) = TYPE_FIELDS (klass);
862 TYPE_FIELDS (klass) = field;
863 DECL_CONTEXT (field) = klass;
864 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field);
865
866 if (flags & ACC_PUBLIC) FIELD_PUBLIC (field) = 1;
867 if (flags & ACC_PROTECTED) FIELD_PROTECTED (field) = 1;
868 if (flags & ACC_PRIVATE) FIELD_PRIVATE (field) = 1;
869 if (flags & ACC_FINAL) FIELD_FINAL (field) = 1;
870 if (flags & ACC_VOLATILE)
871 {
872 FIELD_VOLATILE (field) = 1;
873 TREE_THIS_VOLATILE (field) = 1;
874 }
875 if (flags & ACC_TRANSIENT) FIELD_TRANSIENT (field) = 1;
876 if (flags & ACC_ENUM) FIELD_ENUM (field) = 1;
877 if (flags & ACC_SYNTHETIC) FIELD_SYNTHETIC (field) = 1;
878 if (is_static)
879 {
880 FIELD_STATIC (field) = 1;
881 /* Always make field externally visible. This is required so
882 that native methods can always access the field. */
883 TREE_PUBLIC (field) = 1;
884 /* Hide everything that shouldn't be visible outside a DSO. */
885 if (flag_indirect_classes
886 || (FIELD_PRIVATE (field)))
887 java_hide_decl (field);
888 /* Considered external unless we are compiling it into this
889 object file. */
890 DECL_EXTERNAL (field) = (is_compiled_class (klass) != 2);
891 if (!DECL_EXTERNAL (field))
892 vec_safe_push (pending_static_fields, field);
893 }
894
895 return field;
896 }
897
898 /* Associate a constant value CONSTANT with VAR_DECL FIELD. */
899
900 void
901 set_constant_value (tree field, tree constant)
902 {
903 if (field == NULL_TREE)
904 warning (OPT_Wattributes,
905 "misplaced ConstantValue attribute (not in any field)");
906 else if (DECL_INITIAL (field) != NULL_TREE)
907 warning (OPT_Wattributes,
908 "duplicate ConstantValue attribute for field '%s'",
909 IDENTIFIER_POINTER (DECL_NAME (field)));
910 else
911 {
912 DECL_INITIAL (field) = constant;
913 if (TREE_TYPE (constant) != TREE_TYPE (field)
914 && ! (TREE_TYPE (constant) == int_type_node
915 && INTEGRAL_TYPE_P (TREE_TYPE (field))
916 && TYPE_PRECISION (TREE_TYPE (field)) <= 32)
917 && ! (TREE_TYPE (constant) == utf8const_ptr_type
918 && TREE_TYPE (field) == string_ptr_type_node))
919 error ("ConstantValue attribute of field '%s' has wrong type",
920 IDENTIFIER_POINTER (DECL_NAME (field)));
921 }
922 }
923
924 /* Calculate a hash value for a string encoded in Utf8 format.
925 * This returns the same hash value as specified for java.lang.String.hashCode.
926 */
927
928 static int32
929 hashUtf8String (const char *str, int len)
930 {
931 const unsigned char* ptr = (const unsigned char*) str;
932 const unsigned char *limit = ptr + len;
933 uint32 hash = 0;
934 for (; ptr < limit;)
935 {
936 int ch = UTF8_GET (ptr, limit);
937 /* Updated specification from
938 http://www.javasoft.com/docs/books/jls/clarify.html. */
939 hash = (31 * hash) + ch;
940 }
941 return hash;
942 }
943
944 tree
945 build_utf8_ref (tree name)
946 {
947 const char * name_ptr = IDENTIFIER_POINTER (name);
948 int name_len = IDENTIFIER_LENGTH (name), name_pad;
949 char buf[60];
950 tree ctype, field = NULL_TREE, str_type, cinit, string;
951 static int utf8_count = 0;
952 int name_hash;
953 tree ref = IDENTIFIER_UTF8_REF (name);
954 tree decl;
955 vec<constructor_elt, va_gc> *v = NULL;
956 if (ref != NULL_TREE)
957 return ref;
958
959 ctype = make_node (RECORD_TYPE);
960 /* '\0' byte plus padding to utf8const_type's alignment. */
961 name_pad = TYPE_ALIGN_UNIT (utf8const_type)
962 - (name_len & (TYPE_ALIGN_UNIT (utf8const_type) - 1));
963 str_type = build_prim_array_type (unsigned_byte_type_node,
964 name_len + name_pad);
965 PUSH_FIELD (input_location, ctype, field, "hash", unsigned_short_type_node);
966 PUSH_FIELD (input_location,
967 ctype, field, "length", unsigned_short_type_node);
968 PUSH_FIELD (input_location, ctype, field, "data", str_type);
969 FINISH_RECORD (ctype);
970 START_RECORD_CONSTRUCTOR (v, ctype);
971 name_hash = hashUtf8String (name_ptr, name_len) & 0xFFFF;
972 PUSH_FIELD_VALUE (v, "hash", build_int_cst (NULL_TREE, name_hash));
973 PUSH_FIELD_VALUE (v, "length", build_int_cst (NULL_TREE, name_len));
974 string = build_string (name_len, name_ptr);
975 TREE_TYPE (string) = str_type;
976 PUSH_FIELD_VALUE (v, "data", string);
977 FINISH_RECORD_CONSTRUCTOR (cinit, v, ctype);
978 TREE_CONSTANT (cinit) = 1;
979
980 /* Generate a unique-enough identifier. */
981 sprintf(buf, "_Utf%d", ++utf8_count);
982
983 decl = build_decl (input_location,
984 VAR_DECL, get_identifier (buf), utf8const_type);
985 TREE_STATIC (decl) = 1;
986 DECL_ARTIFICIAL (decl) = 1;
987 DECL_IGNORED_P (decl) = 1;
988 TREE_READONLY (decl) = 1;
989 TREE_THIS_VOLATILE (decl) = 0;
990 DECL_INITIAL (decl) = cinit;
991 DECL_USER_ALIGN (decl) = 1;
992
993 if (HAVE_GAS_SHF_MERGE)
994 {
995 int decl_size;
996 /* Ensure decl_size is a multiple of utf8const_type's alignment. */
997 decl_size = name_len + 4 + name_pad;
998 if (flag_merge_constants && decl_size < 256)
999 {
1000 char buf[32];
1001 int flags = (SECTION_OVERRIDE
1002 | SECTION_MERGE | (SECTION_ENTSIZE & decl_size));
1003 sprintf (buf, ".rodata.jutf8.%d", decl_size);
1004 switch_to_section (get_section (buf, flags, NULL));
1005 set_decl_section_name (decl, buf);
1006 }
1007 }
1008
1009 layout_decl (decl, 0);
1010 DECL_SIZE (decl) = TYPE_SIZE (ctype);
1011 DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (ctype);
1012 pushdecl (decl);
1013 rest_of_decl_compilation (decl, global_bindings_p (), 0);
1014 ref = build1 (ADDR_EXPR, utf8const_ptr_type, decl);
1015 IDENTIFIER_UTF8_REF (name) = ref;
1016 return ref;
1017 }
1018
1019 /* Like build_class_ref, but instead of a direct reference generate a
1020 pointer into the constant pool. */
1021
1022 static tree
1023 build_indirect_class_ref (tree type)
1024 {
1025 int index;
1026 tree cl;
1027 index = alloc_class_constant (type);
1028 cl = build_ref_from_constant_pool (index);
1029 return convert (promote_type (class_ptr_type), cl);
1030 }
1031
1032 static tree
1033 build_static_class_ref (tree type)
1034 {
1035 tree decl_name, decl, ref;
1036
1037 if (TYPE_SIZE (type) == error_mark_node)
1038 return null_pointer_node;
1039 decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
1040 "", '/', '/', ".class$$");
1041 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1042 if (decl == NULL_TREE)
1043 {
1044 decl = build_decl (input_location, VAR_DECL, decl_name, class_type_node);
1045 TREE_STATIC (decl) = 1;
1046 if (! flag_indirect_classes)
1047 {
1048 TREE_PUBLIC (decl) = 1;
1049 if (CLASS_PRIVATE (TYPE_NAME (type)))
1050 java_hide_decl (decl);
1051 }
1052 DECL_IGNORED_P (decl) = 1;
1053 DECL_ARTIFICIAL (decl) = 1;
1054 if (is_compiled_class (type) == 1)
1055 DECL_EXTERNAL (decl) = 1;
1056 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1057 DECL_CLASS_FIELD_P (decl) = 1;
1058 DECL_CONTEXT (decl) = type;
1059
1060 /* ??? We want to preserve the DECL_CONTEXT we set just above,
1061 that that means not calling pushdecl_top_level. */
1062 IDENTIFIER_GLOBAL_VALUE (decl_name) = decl;
1063 }
1064
1065 ref = build1 (ADDR_EXPR, class_ptr_type, decl);
1066 return ref;
1067 }
1068
1069 static tree
1070 build_classdollar_field (tree type)
1071 {
1072 tree decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
1073 "", '/', '/', ".class$");
1074 tree decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1075
1076 if (decl == NULL_TREE)
1077 {
1078 decl
1079 = build_decl (input_location,
1080 VAR_DECL, decl_name,
1081 (build_qualified_type
1082 (build_pointer_type
1083 (build_qualified_type (class_type_node,
1084 TYPE_QUAL_CONST)),
1085 TYPE_QUAL_CONST)));
1086 TREE_STATIC (decl) = 1;
1087 TREE_CONSTANT (decl) = 1;
1088 TREE_READONLY (decl) = 1;
1089 TREE_PUBLIC (decl) = 1;
1090 java_hide_decl (decl);
1091 DECL_IGNORED_P (decl) = 1;
1092 DECL_ARTIFICIAL (decl) = 1;
1093 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1094 IDENTIFIER_GLOBAL_VALUE (decl_name) = decl;
1095 DECL_CLASS_FIELD_P (decl) = 1;
1096 DECL_CONTEXT (decl) = type;
1097 }
1098
1099 return decl;
1100 }
1101
1102 /* Create a local variable that holds the current class$. */
1103
1104 void
1105 cache_this_class_ref (tree fndecl)
1106 {
1107 if (optimize)
1108 {
1109 tree classdollar_field;
1110 if (flag_indirect_classes)
1111 classdollar_field = build_classdollar_field (output_class);
1112 else
1113 classdollar_field = build_static_class_ref (output_class);
1114
1115 this_classdollar = build_decl (input_location,
1116 VAR_DECL, NULL_TREE,
1117 TREE_TYPE (classdollar_field));
1118
1119 java_add_local_var (this_classdollar);
1120 java_add_stmt (build2 (MODIFY_EXPR, TREE_TYPE (this_classdollar),
1121 this_classdollar, classdollar_field));
1122 }
1123 else
1124 this_classdollar = build_classdollar_field (output_class);
1125
1126 /* Prepend class initialization for static methods reachable from
1127 other classes. */
1128 if (METHOD_STATIC (fndecl)
1129 && (! METHOD_PRIVATE (fndecl)
1130 || INNER_CLASS_P (DECL_CONTEXT (fndecl)))
1131 && ! DECL_CLINIT_P (fndecl)
1132 && ! CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (fndecl))))
1133 {
1134 tree init = build_call_expr (soft_initclass_node, 1,
1135 this_classdollar);
1136 java_add_stmt (init);
1137 }
1138 }
1139
1140 /* Remove the reference to the local variable that holds the current
1141 class$. */
1142
1143 void
1144 uncache_this_class_ref (tree fndecl ATTRIBUTE_UNUSED)
1145 {
1146 this_classdollar = build_classdollar_field (output_class);
1147 }
1148
1149 /* Build a reference to the class TYPE.
1150 Also handles primitive types and array types. */
1151
1152 tree
1153 build_class_ref (tree type)
1154 {
1155 int is_compiled = is_compiled_class (type);
1156 if (is_compiled)
1157 {
1158 tree ref, decl;
1159 if (TREE_CODE (type) == POINTER_TYPE)
1160 type = TREE_TYPE (type);
1161
1162 if (flag_indirect_dispatch
1163 && type != output_class
1164 && TREE_CODE (type) == RECORD_TYPE)
1165 return build_indirect_class_ref (type);
1166
1167 if (type == output_class && flag_indirect_classes)
1168 {
1169 /* This can be NULL if we see a JNI stub before we see any
1170 other method. */
1171 if (! this_classdollar)
1172 this_classdollar = build_classdollar_field (output_class);
1173 return this_classdollar;
1174 }
1175
1176 if (TREE_CODE (type) == RECORD_TYPE)
1177 return build_static_class_ref (type);
1178 else
1179 {
1180 const char *name;
1181 tree decl_name;
1182 char buffer[25];
1183 decl_name = TYPE_NAME (type);
1184 if (TREE_CODE (decl_name) == TYPE_DECL)
1185 decl_name = DECL_NAME (decl_name);
1186 name = IDENTIFIER_POINTER (decl_name);
1187 if (strncmp (name, "promoted_", 9) == 0)
1188 name += 9;
1189 sprintf (buffer, "_Jv_%sClass", name);
1190 decl_name = get_identifier (buffer);
1191 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1192 if (decl == NULL_TREE)
1193 {
1194 decl = build_decl (input_location,
1195 VAR_DECL, decl_name, class_type_node);
1196 TREE_STATIC (decl) = 1;
1197 TREE_PUBLIC (decl) = 1;
1198 DECL_EXTERNAL (decl) = 1;
1199 DECL_ARTIFICIAL (decl) = 1;
1200 pushdecl_top_level (decl);
1201 }
1202 }
1203
1204 ref = build1 (ADDR_EXPR, class_ptr_type, decl);
1205 return ref;
1206 }
1207 else
1208 return build_indirect_class_ref (type);
1209 }
1210
1211 /* Create a local statically allocated variable that will hold a
1212 pointer to a static field. */
1213
1214 static tree
1215 build_fieldref_cache_entry (int index, tree fdecl ATTRIBUTE_UNUSED)
1216 {
1217 tree decl, decl_name;
1218 const char *name = IDENTIFIER_POINTER (mangled_classname ("_cpool_", output_class));
1219 char *buf = (char *) alloca (strlen (name) + 20);
1220 sprintf (buf, "%s_%d_ref", name, index);
1221 decl_name = get_identifier (buf);
1222 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1223 if (decl == NULL_TREE)
1224 {
1225 decl = build_decl (input_location,
1226 VAR_DECL, decl_name, ptr_type_node);
1227 TREE_STATIC (decl) = 1;
1228 TREE_PUBLIC (decl) = 0;
1229 DECL_EXTERNAL (decl) = 0;
1230 DECL_ARTIFICIAL (decl) = 1;
1231 DECL_IGNORED_P (decl) = 1;
1232 pushdecl_top_level (decl);
1233 }
1234 return decl;
1235 }
1236
1237 tree
1238 build_static_field_ref (tree fdecl)
1239 {
1240 tree fclass = DECL_CONTEXT (fdecl);
1241 int is_compiled = is_compiled_class (fclass);
1242
1243 /* Allow static final fields to fold to a constant. When using
1244 -findirect-dispatch, we simply never do this folding if compiling
1245 from .class; in the .class file constants will be referred to via
1246 the constant pool. */
1247 if (!flag_indirect_dispatch
1248 && (is_compiled
1249 || (FIELD_FINAL (fdecl) && DECL_INITIAL (fdecl) != NULL_TREE
1250 && (JSTRING_TYPE_P (TREE_TYPE (fdecl))
1251 || JNUMERIC_TYPE_P (TREE_TYPE (fdecl)))
1252 && TREE_CONSTANT (DECL_INITIAL (fdecl)))))
1253 {
1254 if (is_compiled == 1)
1255 DECL_EXTERNAL (fdecl) = 1;
1256 }
1257 else
1258 {
1259 /* Generate a CONSTANT_FieldRef for FDECL in the constant pool
1260 and a class local static variable CACHE_ENTRY, then
1261
1262 *(fdecl **)((__builtin_expect (cache_entry == null, false))
1263 ? cache_entry = _Jv_ResolvePoolEntry (output_class, cpool_index)
1264 : cache_entry)
1265
1266 This can mostly be optimized away, so that the usual path is a
1267 load followed by a test and branch. _Jv_ResolvePoolEntry is
1268 only called once for each constant pool entry.
1269
1270 There is an optimization that we don't do: at the start of a
1271 method, create a local copy of CACHE_ENTRY and use that instead.
1272
1273 */
1274
1275 int cpool_index = alloc_constant_fieldref (output_class, fdecl);
1276 tree cache_entry = build_fieldref_cache_entry (cpool_index, fdecl);
1277 tree test
1278 = build_call_expr (builtin_decl_implicit (BUILT_IN_EXPECT), 2,
1279 build2 (EQ_EXPR, boolean_type_node,
1280 cache_entry, null_pointer_node),
1281 boolean_false_node);
1282 tree cpool_index_cst = build_int_cst (NULL_TREE, cpool_index);
1283 tree init
1284 = build_call_expr (soft_resolvepoolentry_node, 2,
1285 build_class_ref (output_class),
1286 cpool_index_cst);
1287 init = build2 (MODIFY_EXPR, ptr_type_node, cache_entry, init);
1288 init = build3 (COND_EXPR, ptr_type_node, test, init, cache_entry);
1289 init = fold_convert (build_pointer_type (TREE_TYPE (fdecl)), init);
1290 fdecl = build1 (INDIRECT_REF, TREE_TYPE (fdecl), init);
1291 }
1292 return fdecl;
1293 }
1294
1295 int
1296 get_access_flags_from_decl (tree decl)
1297 {
1298 int access_flags = 0;
1299 if (TREE_CODE (decl) == FIELD_DECL || TREE_CODE (decl) == VAR_DECL)
1300 {
1301 if (FIELD_STATIC (decl))
1302 access_flags |= ACC_STATIC;
1303 if (FIELD_PUBLIC (decl))
1304 access_flags |= ACC_PUBLIC;
1305 if (FIELD_PROTECTED (decl))
1306 access_flags |= ACC_PROTECTED;
1307 if (FIELD_PRIVATE (decl))
1308 access_flags |= ACC_PRIVATE;
1309 if (FIELD_FINAL (decl))
1310 access_flags |= ACC_FINAL;
1311 if (FIELD_VOLATILE (decl))
1312 access_flags |= ACC_VOLATILE;
1313 if (FIELD_TRANSIENT (decl))
1314 access_flags |= ACC_TRANSIENT;
1315 if (FIELD_ENUM (decl))
1316 access_flags |= ACC_ENUM;
1317 if (FIELD_SYNTHETIC (decl))
1318 access_flags |= ACC_SYNTHETIC;
1319 return access_flags;
1320 }
1321 if (TREE_CODE (decl) == TYPE_DECL)
1322 {
1323 if (CLASS_PUBLIC (decl))
1324 access_flags |= ACC_PUBLIC;
1325 if (CLASS_FINAL (decl))
1326 access_flags |= ACC_FINAL;
1327 if (CLASS_SUPER (decl))
1328 access_flags |= ACC_SUPER;
1329 if (CLASS_INTERFACE (decl))
1330 access_flags |= ACC_INTERFACE;
1331 if (CLASS_ABSTRACT (decl))
1332 access_flags |= ACC_ABSTRACT;
1333 if (CLASS_STATIC (decl))
1334 access_flags |= ACC_STATIC;
1335 if (CLASS_PRIVATE (decl))
1336 access_flags |= ACC_PRIVATE;
1337 if (CLASS_PROTECTED (decl))
1338 access_flags |= ACC_PROTECTED;
1339 if (CLASS_STRICTFP (decl))
1340 access_flags |= ACC_STRICT;
1341 if (CLASS_ENUM (decl))
1342 access_flags |= ACC_ENUM;
1343 if (CLASS_SYNTHETIC (decl))
1344 access_flags |= ACC_SYNTHETIC;
1345 if (CLASS_ANNOTATION (decl))
1346 access_flags |= ACC_ANNOTATION;
1347 return access_flags;
1348 }
1349 if (TREE_CODE (decl) == FUNCTION_DECL)
1350 {
1351 if (METHOD_PUBLIC (decl))
1352 access_flags |= ACC_PUBLIC;
1353 if (METHOD_PRIVATE (decl))
1354 access_flags |= ACC_PRIVATE;
1355 if (METHOD_PROTECTED (decl))
1356 access_flags |= ACC_PROTECTED;
1357 if (METHOD_STATIC (decl))
1358 access_flags |= ACC_STATIC;
1359 if (METHOD_FINAL (decl))
1360 access_flags |= ACC_FINAL;
1361 if (METHOD_SYNCHRONIZED (decl))
1362 access_flags |= ACC_SYNCHRONIZED;
1363 if (METHOD_NATIVE (decl))
1364 access_flags |= ACC_NATIVE;
1365 if (METHOD_ABSTRACT (decl))
1366 access_flags |= ACC_ABSTRACT;
1367 if (METHOD_STRICTFP (decl))
1368 access_flags |= ACC_STRICT;
1369 if (METHOD_INVISIBLE (decl))
1370 access_flags |= ACC_INVISIBLE;
1371 if (DECL_ARTIFICIAL (decl))
1372 access_flags |= ACC_SYNTHETIC;
1373 if (METHOD_BRIDGE (decl))
1374 access_flags |= ACC_BRIDGE;
1375 if (METHOD_VARARGS (decl))
1376 access_flags |= ACC_VARARGS;
1377 return access_flags;
1378 }
1379 gcc_unreachable ();
1380 }
1381
1382 static GTY (()) int alias_labelno = 0;
1383
1384 /* Create a private alias for METHOD. Using this alias instead of the method
1385 decl ensures that ncode entries in the method table point to the real function
1386 at runtime, not a PLT entry. */
1387
1388 static tree
1389 make_local_function_alias (tree method)
1390 {
1391 #ifdef ASM_OUTPUT_DEF
1392 tree alias;
1393
1394 const char *method_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (method));
1395 char *name = (char *) alloca (strlen (method_name) + 2);
1396 char *buf = (char *) alloca (strlen (method_name) + 128);
1397
1398 /* Only create aliases for local functions. */
1399 if (DECL_EXTERNAL (method))
1400 return method;
1401
1402 /* Prefix method_name with 'L' for the alias label. */
1403 *name = 'L';
1404 strcpy (name + 1, method_name);
1405
1406 targetm.asm_out.generate_internal_label (buf, name, alias_labelno++);
1407 alias = build_decl (input_location,
1408 FUNCTION_DECL, get_identifier (buf),
1409 TREE_TYPE (method));
1410 DECL_CONTEXT (alias) = NULL;
1411 TREE_READONLY (alias) = TREE_READONLY (method);
1412 TREE_THIS_VOLATILE (alias) = TREE_THIS_VOLATILE (method);
1413 TREE_PUBLIC (alias) = 0;
1414 DECL_EXTERNAL (alias) = 0;
1415 DECL_ARTIFICIAL (alias) = 1;
1416 DECL_INITIAL (alias) = error_mark_node;
1417 TREE_ADDRESSABLE (alias) = 1;
1418 TREE_USED (alias) = 1;
1419 if (!flag_syntax_only)
1420 assemble_alias (alias, DECL_ASSEMBLER_NAME (method));
1421 return alias;
1422 #else
1423 return method;
1424 #endif
1425 }
1426
1427 /** Make reflection data (_Jv_Field) for field FDECL. */
1428
1429 static tree
1430 make_field_value (tree fdecl)
1431 {
1432 tree finit;
1433 int flags;
1434 tree type = TREE_TYPE (fdecl);
1435 int resolved = is_compiled_class (type) && ! flag_indirect_dispatch;
1436 vec<constructor_elt, va_gc> *v = NULL;
1437
1438 START_RECORD_CONSTRUCTOR (v, field_type_node);
1439 PUSH_FIELD_VALUE (v, "name", build_utf8_ref (DECL_NAME (fdecl)));
1440 if (resolved)
1441 type = build_class_ref (type);
1442 else
1443 {
1444 tree signature = build_java_signature (type);
1445
1446 type = build_utf8_ref (unmangle_classname
1447 (IDENTIFIER_POINTER (signature),
1448 IDENTIFIER_LENGTH (signature)));
1449 }
1450 PUSH_FIELD_VALUE (v, "type", type);
1451
1452 flags = get_access_flags_from_decl (fdecl);
1453 if (! resolved)
1454 flags |= 0x8000 /* FIELD_UNRESOLVED_FLAG */;
1455
1456 PUSH_FIELD_VALUE (v, "accflags", build_int_cst (NULL_TREE, flags));
1457 PUSH_FIELD_VALUE (v, "bsize", TYPE_SIZE_UNIT (TREE_TYPE (fdecl)));
1458
1459 {
1460 tree field_address = integer_zero_node;
1461 tree index, value;
1462 if ((DECL_INITIAL (fdecl) || ! flag_indirect_classes)
1463 && FIELD_STATIC (fdecl))
1464 field_address = build_address_of (fdecl);
1465
1466 index = (FIELD_STATIC (fdecl)
1467 ? DECL_CHAIN (TYPE_FIELDS (field_info_union_node))
1468 : TYPE_FIELDS (field_info_union_node));
1469 value = (FIELD_STATIC (fdecl)
1470 ? field_address
1471 : byte_position (fdecl));
1472
1473 PUSH_FIELD_VALUE
1474 (v, "info",
1475 build_constructor_single (field_info_union_node, index, value));
1476 }
1477
1478 FINISH_RECORD_CONSTRUCTOR (finit, v, field_type_node);
1479 return finit;
1480 }
1481
1482 /** Make reflection data (_Jv_Method) for method MDECL. */
1483
1484 static tree
1485 make_method_value (tree mdecl)
1486 {
1487 static int method_name_count = 0;
1488 tree minit;
1489 tree index;
1490 tree code;
1491 tree class_decl;
1492 #define ACC_TRANSLATED 0x4000
1493 int accflags = get_access_flags_from_decl (mdecl) | ACC_TRANSLATED;
1494 vec<constructor_elt, va_gc> *v = NULL;
1495
1496 class_decl = DECL_CONTEXT (mdecl);
1497 /* For interfaces, the index field contains the dispatch index. */
1498 if (CLASS_INTERFACE (TYPE_NAME (class_decl)))
1499 index = build_int_cst (NULL_TREE,
1500 get_interface_method_index (mdecl, class_decl));
1501 else if (!flag_indirect_dispatch && get_method_index (mdecl) != NULL_TREE)
1502 index = get_method_index (mdecl);
1503 else
1504 index = integer_minus_one_node;
1505
1506 code = null_pointer_node;
1507 if (METHOD_ABSTRACT (mdecl))
1508 code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
1509 soft_abstractmethod_node);
1510 else
1511 code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
1512 make_local_function_alias (mdecl));
1513 START_RECORD_CONSTRUCTOR (v, method_type_node);
1514 PUSH_FIELD_VALUE (v, "name",
1515 build_utf8_ref (DECL_CONSTRUCTOR_P (mdecl) ?
1516 init_identifier_node
1517 : DECL_NAME (mdecl)));
1518 {
1519 tree signature = build_java_signature (TREE_TYPE (mdecl));
1520 PUSH_FIELD_VALUE (v, "signature",
1521 (build_utf8_ref
1522 (unmangle_classname
1523 (IDENTIFIER_POINTER(signature),
1524 IDENTIFIER_LENGTH(signature)))));
1525 }
1526 PUSH_FIELD_VALUE (v, "accflags", build_int_cst (NULL_TREE, accflags));
1527 PUSH_FIELD_VALUE (v, "index", index);
1528 PUSH_FIELD_VALUE (v, "ncode", code);
1529
1530 {
1531 /* Compute the `throws' information for the method. */
1532 tree table = null_pointer_node;
1533
1534 if (!vec_safe_is_empty (DECL_FUNCTION_THROWS (mdecl)))
1535 {
1536 int length = 1 + DECL_FUNCTION_THROWS (mdecl)->length ();
1537 tree t, type, array;
1538 char buf[60];
1539 vec<constructor_elt, va_gc> *v = NULL;
1540 int idx = length - 1;
1541 unsigned ix;
1542 constructor_elt *e;
1543
1544 vec_alloc (v, length);
1545 v->quick_grow_cleared (length);
1546
1547 e = &(*v)[idx--];
1548 e->value = null_pointer_node;
1549
1550 FOR_EACH_VEC_SAFE_ELT (DECL_FUNCTION_THROWS (mdecl), ix, t)
1551 {
1552 tree sig = DECL_NAME (TYPE_NAME (t));
1553 tree utf8
1554 = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
1555 IDENTIFIER_LENGTH (sig)));
1556 e = &(*v)[idx--];
1557 e->value = utf8;
1558 }
1559 gcc_assert (idx == -1);
1560 type = build_prim_array_type (ptr_type_node, length);
1561 table = build_constructor (type, v);
1562 /* Compute something unique enough. */
1563 sprintf (buf, "_methods%d", method_name_count++);
1564 array = build_decl (input_location,
1565 VAR_DECL, get_identifier (buf), type);
1566 DECL_INITIAL (array) = table;
1567 TREE_STATIC (array) = 1;
1568 DECL_ARTIFICIAL (array) = 1;
1569 DECL_IGNORED_P (array) = 1;
1570 rest_of_decl_compilation (array, 1, 0);
1571
1572 table = build1 (ADDR_EXPR, ptr_type_node, array);
1573 }
1574
1575 PUSH_FIELD_VALUE (v, "throws", table);
1576 }
1577
1578 FINISH_RECORD_CONSTRUCTOR (minit, v, method_type_node);
1579 return minit;
1580 }
1581
1582 static tree
1583 get_dispatch_vector (tree type)
1584 {
1585 tree vtable = TYPE_VTABLE (type);
1586
1587 if (vtable == NULL_TREE)
1588 {
1589 HOST_WIDE_INT i;
1590 tree method;
1591 tree super = CLASSTYPE_SUPER (type);
1592 HOST_WIDE_INT nvirtuals = tree_to_shwi (TYPE_NVIRTUALS (type));
1593 vtable = make_tree_vec (nvirtuals);
1594 TYPE_VTABLE (type) = vtable;
1595 if (super != NULL_TREE)
1596 {
1597 tree super_vtable = get_dispatch_vector (super);
1598
1599 for (i = tree_to_shwi (TYPE_NVIRTUALS (super)); --i >= 0; )
1600 TREE_VEC_ELT (vtable, i) = TREE_VEC_ELT (super_vtable, i);
1601 }
1602
1603 for (method = TYPE_METHODS (type); method != NULL_TREE;
1604 method = DECL_CHAIN (method))
1605 {
1606 tree method_index = get_method_index (method);
1607 if (method_index != NULL_TREE
1608 && tree_fits_shwi_p (method_index))
1609 TREE_VEC_ELT (vtable, tree_to_shwi (method_index)) = method;
1610 }
1611 }
1612
1613 return vtable;
1614 }
1615
1616 static tree
1617 get_dispatch_table (tree type, tree this_class_addr)
1618 {
1619 int abstract_p = CLASS_ABSTRACT (TYPE_NAME (type));
1620 tree vtable = get_dispatch_vector (type);
1621 int i, j;
1622 int nvirtuals = TREE_VEC_LENGTH (vtable);
1623 int arraysize;
1624 tree gc_descr;
1625 vec<constructor_elt, va_gc> *v = NULL;
1626 constructor_elt *e;
1627 tree arraytype;
1628
1629 arraysize = (TARGET_VTABLE_USES_DESCRIPTORS? nvirtuals + 1 : nvirtuals + 2);
1630 if (TARGET_VTABLE_USES_DESCRIPTORS)
1631 arraysize *= TARGET_VTABLE_USES_DESCRIPTORS;
1632 arraysize += 2;
1633
1634 vec_safe_grow_cleared (v, arraysize);
1635 e = &(*v)[arraysize - 1];
1636
1637 #define CONSTRUCTOR_PREPEND_VALUE(E, V) E->value = V, E--
1638 for (i = nvirtuals; --i >= 0; )
1639 {
1640 tree method = TREE_VEC_ELT (vtable, i);
1641 if (METHOD_ABSTRACT (method))
1642 {
1643 if (! abstract_p)
1644 warning_at (DECL_SOURCE_LOCATION (method), 0,
1645 "abstract method in non-abstract class");
1646
1647 if (TARGET_VTABLE_USES_DESCRIPTORS)
1648 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1649 CONSTRUCTOR_PREPEND_VALUE (e, null_pointer_node);
1650 else
1651 CONSTRUCTOR_PREPEND_VALUE (e, null_pointer_node);
1652 }
1653 else
1654 {
1655 if (TARGET_VTABLE_USES_DESCRIPTORS)
1656 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1657 {
1658 tree fdesc = build2 (FDESC_EXPR, nativecode_ptr_type_node,
1659 method, build_int_cst (NULL_TREE, j));
1660 TREE_CONSTANT (fdesc) = 1;
1661 CONSTRUCTOR_PREPEND_VALUE (e, fdesc);
1662 }
1663 else
1664 CONSTRUCTOR_PREPEND_VALUE (e,
1665 build1 (ADDR_EXPR,
1666 nativecode_ptr_type_node,
1667 method));
1668 }
1669 }
1670
1671 /* Dummy entry for compatibility with G++ -fvtable-thunks. When
1672 using the Boehm GC we sometimes stash a GC type descriptor
1673 there. We set the PURPOSE to NULL_TREE not to interfere (reset)
1674 the emitted byte count during the output to the assembly file. */
1675 /* With TARGET_VTABLE_USES_DESCRIPTORS, we only add one extra
1676 fake "function descriptor". It's first word is the is the class
1677 pointer, and subsequent words (usually one) contain the GC descriptor.
1678 In all other cases, we reserve two extra vtable slots. */
1679 gc_descr = get_boehm_type_descriptor (type);
1680 CONSTRUCTOR_PREPEND_VALUE (e, gc_descr);
1681 for (j = 1; j < TARGET_VTABLE_USES_DESCRIPTORS-1; ++j)
1682 CONSTRUCTOR_PREPEND_VALUE (e, gc_descr);
1683 CONSTRUCTOR_PREPEND_VALUE (e, this_class_addr);
1684
1685 /** Pointer to type_info object (to be implemented), according to g++ ABI. */
1686 CONSTRUCTOR_PREPEND_VALUE (e, null_pointer_node);
1687 /** Offset to start of whole object. Always (ptrdiff_t)0 for Java. */
1688 gcc_assert (e == v->address ());
1689 e->index = integer_zero_node;
1690 e->value = null_pointer_node;
1691 #undef CONSTRUCTOR_PREPEND_VALUE
1692
1693 arraytype = build_prim_array_type (nativecode_ptr_type_node, arraysize);
1694 return build_constructor (arraytype, v);
1695 }
1696
1697
1698 /* Set the method_index for a method decl. */
1699 void
1700 set_method_index (tree decl, tree method_index)
1701 {
1702 if (method_index != NULL_TREE)
1703 {
1704 /* method_index is null if we're using indirect dispatch. */
1705 method_index = fold (convert (sizetype, method_index));
1706
1707 if (TARGET_VTABLE_USES_DESCRIPTORS)
1708 /* Add one to skip bogus descriptor for class and GC descriptor. */
1709 method_index = size_binop (PLUS_EXPR, method_index, size_int (1));
1710 else
1711 /* Add 1 to skip "class" field of dtable, and 1 to skip GC
1712 descriptor. */
1713 method_index = size_binop (PLUS_EXPR, method_index, size_int (2));
1714 }
1715
1716 DECL_VINDEX (decl) = method_index;
1717 }
1718
1719 /* Get the method_index for a method decl. */
1720 tree
1721 get_method_index (tree decl)
1722 {
1723 tree method_index = DECL_VINDEX (decl);
1724
1725 if (! method_index)
1726 return NULL;
1727
1728 if (TARGET_VTABLE_USES_DESCRIPTORS)
1729 /* Sub one to skip bogus descriptor for class and GC descriptor. */
1730 method_index = size_binop (MINUS_EXPR, method_index, size_int (1));
1731 else
1732 /* Sub 1 to skip "class" field of dtable, and 1 to skip GC descriptor. */
1733 method_index = size_binop (MINUS_EXPR, method_index, size_int (2));
1734
1735 return method_index;
1736 }
1737
1738 static int
1739 supers_all_compiled (tree type)
1740 {
1741 while (type != NULL_TREE)
1742 {
1743 if (!assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)))))
1744 return 0;
1745 type = CLASSTYPE_SUPER (type);
1746 }
1747 return 1;
1748 }
1749
1750 static void
1751 add_table_and_syms (vec<constructor_elt, va_gc> **v,
1752 vec<method_entry, va_gc> *methods,
1753 const char *table_name, tree table_slot, tree table_type,
1754 const char *syms_name, tree syms_slot)
1755 {
1756 if (methods == NULL)
1757 {
1758 PUSH_FIELD_VALUE (*v, table_name, null_pointer_node);
1759 PUSH_FIELD_VALUE (*v, syms_name, null_pointer_node);
1760 }
1761 else
1762 {
1763 pushdecl_top_level (syms_slot);
1764 PUSH_FIELD_VALUE (*v, table_name,
1765 build1 (ADDR_EXPR, table_type, table_slot));
1766 PUSH_FIELD_VALUE (*v, syms_name,
1767 build1 (ADDR_EXPR, symbols_array_ptr_type,
1768 syms_slot));
1769 TREE_CONSTANT (table_slot) = 1;
1770 }
1771 }
1772
1773 void
1774 make_class_data (tree type)
1775 {
1776 tree decl, cons, temp;
1777 tree field, fields_decl;
1778 HOST_WIDE_INT static_field_count = 0;
1779 HOST_WIDE_INT instance_field_count = 0;
1780 HOST_WIDE_INT field_count;
1781 tree field_array_type;
1782 tree method;
1783 tree dtable_decl = NULL_TREE;
1784 HOST_WIDE_INT method_count = 0;
1785 tree method_array_type;
1786 tree methods_decl;
1787 tree super;
1788 tree this_class_addr;
1789 tree constant_pool_constructor;
1790 tree interfaces = null_pointer_node;
1791 int interface_len = 0;
1792 int uses_jv_markobj = 0;
1793 tree type_decl = TYPE_NAME (type);
1794 tree id_main = get_identifier("main");
1795 tree id_class = get_identifier("java.lang.Class");
1796 /** Offset from start of virtual function table declaration
1797 to where objects actually point at, following new g++ ABI. */
1798 tree dtable_start_offset = size_int (2 * POINTER_SIZE / BITS_PER_UNIT);
1799 vec<int> field_indexes;
1800 tree first_real_field;
1801 vec<constructor_elt, va_gc> *v1 = NULL, *v2 = NULL;
1802 tree reflection_data;
1803 vec<constructor_elt, va_gc> *static_fields = NULL;
1804 vec<constructor_elt, va_gc> *instance_fields = NULL;
1805 vec<constructor_elt, va_gc> *methods = NULL;
1806
1807 this_class_addr = build_static_class_ref (type);
1808 decl = TREE_OPERAND (this_class_addr, 0);
1809
1810 if (supers_all_compiled (type) && ! CLASS_INTERFACE (type_decl)
1811 && !flag_indirect_dispatch)
1812 {
1813 tree dtable = get_dispatch_table (type, this_class_addr);
1814 uses_jv_markobj = uses_jv_markobj_p (dtable);
1815 if (type == class_type_node && class_dtable_decl != NULL_TREE)
1816 {
1817 /* We've already created some other class, and consequently
1818 we made class_dtable_decl. Now we just want to fill it
1819 in. */
1820 dtable_decl = class_dtable_decl;
1821 }
1822 else
1823 {
1824 dtable_decl = build_dtable_decl (type);
1825 TREE_STATIC (dtable_decl) = 1;
1826 DECL_ARTIFICIAL (dtable_decl) = 1;
1827 DECL_IGNORED_P (dtable_decl) = 1;
1828 }
1829
1830 TREE_PUBLIC (dtable_decl) = 1;
1831 DECL_INITIAL (dtable_decl) = dtable;
1832 /* The only dispatch table exported from a DSO is the dispatch
1833 table for java.lang.Class. */
1834 if (DECL_NAME (type_decl) != id_class)
1835 java_hide_decl (dtable_decl);
1836 if (! flag_indirect_classes)
1837 rest_of_decl_compilation (dtable_decl, 1, 0);
1838 /* Maybe we're compiling Class as the first class. If so, set
1839 class_dtable_decl to the decl we just made. */
1840 if (type == class_type_node && class_dtable_decl == NULL_TREE)
1841 class_dtable_decl = dtable_decl;
1842 }
1843
1844 /* Build Field array. */
1845 field = TYPE_FIELDS (type);
1846 while (field && DECL_ARTIFICIAL (field))
1847 field = DECL_CHAIN (field); /* Skip dummy fields. */
1848 if (field && DECL_NAME (field) == NULL_TREE)
1849 field = DECL_CHAIN (field); /* Skip dummy field for inherited data. */
1850 first_real_field = field;
1851
1852 /* First count static and instance fields. */
1853 for ( ; field != NULL_TREE; field = DECL_CHAIN (field))
1854 {
1855 if (! DECL_ARTIFICIAL (field))
1856 {
1857 if (FIELD_STATIC (field))
1858 static_field_count++;
1859 else if (uses_jv_markobj || !flag_reduced_reflection)
1860 instance_field_count++;
1861 }
1862 }
1863 field_count = static_field_count + instance_field_count;
1864 field_indexes.create (field_count);
1865
1866 /* gcj sorts fields so that static fields come first, followed by
1867 instance fields. Unfortunately, by the time this takes place we
1868 have already generated the reflection_data for this class, and
1869 that data contains indexes into the fields. So, we generate a
1870 permutation that maps each original field index to its final
1871 position. Then we pass this permutation to
1872 rewrite_reflection_indexes(), which fixes up the reflection
1873 data. */
1874 {
1875 int i;
1876 int static_count = 0;
1877 int instance_count = static_field_count;
1878 int field_index;
1879
1880 for (i = 0, field = first_real_field;
1881 field != NULL_TREE;
1882 field = DECL_CHAIN (field), i++)
1883 {
1884 if (! DECL_ARTIFICIAL (field))
1885 {
1886 field_index = 0;
1887 if (FIELD_STATIC (field))
1888 field_index = static_count++;
1889 else if (uses_jv_markobj || !flag_reduced_reflection)
1890 field_index = instance_count++;
1891 else
1892 continue;
1893 field_indexes.quick_push (field_index);
1894 }
1895 }
1896 }
1897
1898 for (field = first_real_field; field != NULL_TREE;
1899 field = DECL_CHAIN (field))
1900 {
1901 if (! DECL_ARTIFICIAL (field))
1902 {
1903 if (FIELD_STATIC (field))
1904 {
1905 /* We must always create reflection data for static fields
1906 as it is used in the creation of the field itself. */
1907 tree init = make_field_value (field);
1908 tree initial = DECL_INITIAL (field);
1909 CONSTRUCTOR_APPEND_ELT (static_fields, NULL_TREE, init);
1910 /* If the initial value is a string constant,
1911 prevent output_constant from trying to assemble the value. */
1912 if (initial != NULL_TREE
1913 && TREE_TYPE (initial) == string_ptr_type_node)
1914 DECL_INITIAL (field) = NULL_TREE;
1915 rest_of_decl_compilation (field, 1, 1);
1916 DECL_INITIAL (field) = initial;
1917 }
1918 else if (uses_jv_markobj || !flag_reduced_reflection)
1919 {
1920 tree init = make_field_value (field);
1921 CONSTRUCTOR_APPEND_ELT (instance_fields, NULL_TREE, init);
1922 }
1923 }
1924 }
1925
1926 gcc_assert (static_field_count == (int) vec_safe_length (static_fields));
1927 gcc_assert (instance_field_count == (int) vec_safe_length (instance_fields));
1928
1929 if (field_count > 0)
1930 {
1931 vec_safe_splice (static_fields, instance_fields);
1932 field_array_type = build_prim_array_type (field_type_node, field_count);
1933 fields_decl = build_decl (input_location,
1934 VAR_DECL, mangled_classname ("_FL_", type),
1935 field_array_type);
1936 DECL_INITIAL (fields_decl)
1937 = build_constructor (field_array_type, static_fields);
1938 TREE_STATIC (fields_decl) = 1;
1939 DECL_ARTIFICIAL (fields_decl) = 1;
1940 DECL_IGNORED_P (fields_decl) = 1;
1941 rest_of_decl_compilation (fields_decl, 1, 0);
1942 }
1943 else
1944 fields_decl = NULL_TREE;
1945
1946 /* Build Method array. */
1947 for (method = TYPE_METHODS (type);
1948 method != NULL_TREE; method = DECL_CHAIN (method))
1949 {
1950 tree init;
1951 if (METHOD_PRIVATE (method)
1952 && ! flag_keep_inline_functions
1953 && optimize)
1954 continue;
1955 /* Even if we have a decl, we don't necessarily have the code.
1956 This can happen if we inherit a method from a superclass for
1957 which we don't have a .class file. */
1958 if (METHOD_DUMMY (method))
1959 continue;
1960
1961 /* Generate method reflection data if:
1962
1963 - !flag_reduced_reflection.
1964
1965 - <clinit> -- The runtime uses reflection to initialize the
1966 class.
1967
1968 - Any method in class java.lang.Class -- Class.forName() and
1969 perhaps other things require it.
1970
1971 - class$ -- It does not work if reflection data missing.
1972
1973 - main -- Reflection is used to find main(String[]) methods.
1974
1975 - public not static -- It is potentially part of an
1976 interface. The runtime uses reflection data to build
1977 interface dispatch tables. */
1978 if (!flag_reduced_reflection
1979 || DECL_CLINIT_P (method)
1980 || DECL_NAME (type_decl) == id_class
1981 || DECL_NAME (method) == id_main
1982 || (METHOD_PUBLIC (method) && !METHOD_STATIC (method)))
1983 {
1984 init = make_method_value (method);
1985 method_count++;
1986 CONSTRUCTOR_APPEND_ELT (methods, NULL_TREE, init);
1987 }
1988 }
1989 method_array_type = build_prim_array_type (method_type_node, method_count);
1990 methods_decl = build_decl (input_location,
1991 VAR_DECL, mangled_classname ("_MT_", type),
1992 method_array_type);
1993 DECL_INITIAL (methods_decl) = build_constructor (method_array_type, methods);
1994 TREE_STATIC (methods_decl) = 1;
1995 DECL_ARTIFICIAL (methods_decl) = 1;
1996 DECL_IGNORED_P (methods_decl) = 1;
1997 rest_of_decl_compilation (methods_decl, 1, 0);
1998
1999 if (class_dtable_decl == NULL_TREE)
2000 {
2001 class_dtable_decl = build_dtable_decl (class_type_node);
2002 TREE_STATIC (class_dtable_decl) = 1;
2003 DECL_ARTIFICIAL (class_dtable_decl) = 1;
2004 DECL_IGNORED_P (class_dtable_decl) = 1;
2005 if (is_compiled_class (class_type_node) != 2)
2006 {
2007 DECL_EXTERNAL (class_dtable_decl) = 1;
2008 rest_of_decl_compilation (class_dtable_decl, 1, 0);
2009 }
2010 }
2011
2012 super = CLASSTYPE_SUPER (type);
2013 if (super == NULL_TREE)
2014 super = null_pointer_node;
2015 else if (! flag_indirect_dispatch
2016 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (type_decl)))
2017 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (super)))))
2018 super = build_class_ref (super);
2019 else
2020 {
2021 int super_index = alloc_class_constant (super);
2022 super = build_int_cst (ptr_type_node, super_index);
2023 }
2024
2025 /* Build and emit the array of implemented interfaces. */
2026 if (type != object_type_node)
2027 interface_len = BINFO_N_BASE_BINFOS (TYPE_BINFO (type)) - 1;
2028
2029 if (interface_len > 0)
2030 {
2031 int i;
2032 tree interface_array_type, idecl;
2033 vec<constructor_elt, va_gc> *init;
2034 vec_alloc (init, interface_len);
2035 interface_array_type
2036 = build_prim_array_type (class_ptr_type, interface_len);
2037 idecl = build_decl (input_location,
2038 VAR_DECL, mangled_classname ("_IF_", type),
2039 interface_array_type);
2040
2041 for (i = 1; i <= interface_len; i++)
2042 {
2043 tree child = BINFO_BASE_BINFO (TYPE_BINFO (type), i);
2044 tree iclass = BINFO_TYPE (child);
2045 tree index;
2046 if (! flag_indirect_dispatch
2047 && (assume_compiled
2048 (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (iclass))))))
2049 index = build_class_ref (iclass);
2050 else
2051 {
2052 int int_index = alloc_class_constant (iclass);
2053 index = build_int_cst (ptr_type_node, int_index);
2054 }
2055 CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, index);
2056 }
2057 DECL_INITIAL (idecl) = build_constructor (interface_array_type, init);
2058 TREE_STATIC (idecl) = 1;
2059 DECL_ARTIFICIAL (idecl) = 1;
2060 DECL_IGNORED_P (idecl) = 1;
2061 interfaces = build1 (ADDR_EXPR, ptr_type_node, idecl);
2062 rest_of_decl_compilation (idecl, 1, 0);
2063 }
2064
2065 constant_pool_constructor = build_constants_constructor ();
2066
2067 if (flag_indirect_dispatch)
2068 {
2069 TYPE_OTABLE_DECL (type)
2070 = emit_symbol_table
2071 (DECL_NAME (TYPE_OTABLE_DECL (type)),
2072 TYPE_OTABLE_DECL (type), TYPE_OTABLE_METHODS (type),
2073 TYPE_OTABLE_SYMS_DECL (type), integer_type_node, 1);
2074
2075 TYPE_ATABLE_DECL (type)
2076 = emit_symbol_table
2077 (DECL_NAME (TYPE_ATABLE_DECL (type)),
2078 TYPE_ATABLE_DECL (type), TYPE_ATABLE_METHODS (type),
2079 TYPE_ATABLE_SYMS_DECL (type), ptr_type_node, 1);
2080
2081 TYPE_ITABLE_DECL (type)
2082 = emit_symbol_table
2083 (DECL_NAME (TYPE_ITABLE_DECL (type)),
2084 TYPE_ITABLE_DECL (type), TYPE_ITABLE_METHODS (type),
2085 TYPE_ITABLE_SYMS_DECL (type), ptr_type_node, 2);
2086 }
2087
2088 TYPE_CTABLE_DECL (type) = emit_catch_table (type);
2089
2090 START_RECORD_CONSTRUCTOR (v1, object_type_node);
2091 PUSH_FIELD_VALUE (v1, "vtable",
2092 (flag_indirect_classes
2093 ? null_pointer_node
2094 : fold_build_pointer_plus
2095 (build1 (ADDR_EXPR, dtable_ptr_type,
2096 class_dtable_decl),
2097 dtable_start_offset)));
2098 if (! flag_hash_synchronization)
2099 PUSH_FIELD_VALUE (v1, "sync_info", null_pointer_node);
2100 FINISH_RECORD_CONSTRUCTOR (temp, v1, object_type_node);
2101 START_RECORD_CONSTRUCTOR (v2, class_type_node);
2102 PUSH_SUPER_VALUE (v2, temp);
2103 PUSH_FIELD_VALUE (v2, "next_or_version", gcj_abi_version);
2104 PUSH_FIELD_VALUE (v2, "name", build_utf8_ref (DECL_NAME (type_decl)));
2105 PUSH_FIELD_VALUE (v2, "accflags",
2106 build_int_cst (NULL_TREE,
2107 get_access_flags_from_decl (type_decl)));
2108
2109 PUSH_FIELD_VALUE (v2, "superclass",
2110 CLASS_INTERFACE (type_decl) ? null_pointer_node : super);
2111 PUSH_FIELD_VALUE (v2, "constants", constant_pool_constructor);
2112 PUSH_FIELD_VALUE (v2, "methods",
2113 methods_decl == NULL_TREE ? null_pointer_node
2114 : build1 (ADDR_EXPR, method_ptr_type_node, methods_decl));
2115 PUSH_FIELD_VALUE (v2, "method_count",
2116 build_int_cst (NULL_TREE, method_count));
2117
2118 PUSH_FIELD_VALUE (v2, "vtable_method_count",
2119 (flag_indirect_dispatch
2120 ? integer_minus_one_node
2121 : TYPE_NVIRTUALS (type)));
2122
2123 PUSH_FIELD_VALUE (v2, "fields",
2124 fields_decl == NULL_TREE ? null_pointer_node
2125 : build1 (ADDR_EXPR, field_ptr_type_node, fields_decl));
2126 /* If we're using the binary compatibility ABI we don't know the
2127 size until load time. */
2128 PUSH_FIELD_VALUE (v2, "size_in_bytes",
2129 (flag_indirect_dispatch
2130 ? integer_minus_one_node
2131 : size_in_bytes (type)));
2132 PUSH_FIELD_VALUE (v2, "field_count",
2133 build_int_cst (NULL_TREE, field_count));
2134 PUSH_FIELD_VALUE (v2, "static_field_count",
2135 build_int_cst (NULL_TREE, static_field_count));
2136
2137 PUSH_FIELD_VALUE (v2, "vtable",
2138 (flag_indirect_dispatch || dtable_decl == NULL_TREE
2139 ? null_pointer_node
2140 : fold_build_pointer_plus
2141 (build1 (ADDR_EXPR, dtable_ptr_type,
2142 dtable_decl),
2143 dtable_start_offset)));
2144 add_table_and_syms (&v2, TYPE_OTABLE_METHODS (type),
2145 "otable", TYPE_OTABLE_DECL (type), otable_ptr_type,
2146 "otable_syms", TYPE_OTABLE_SYMS_DECL (type));
2147 add_table_and_syms (&v2, TYPE_ATABLE_METHODS (type),
2148 "atable", TYPE_ATABLE_DECL (type), atable_ptr_type,
2149 "atable_syms", TYPE_ATABLE_SYMS_DECL (type));
2150 add_table_and_syms (&v2, TYPE_ITABLE_METHODS (type),
2151 "itable", TYPE_ITABLE_DECL (type), itable_ptr_type,
2152 "itable_syms", TYPE_ITABLE_SYMS_DECL (type));
2153
2154 PUSH_FIELD_VALUE (v2, "catch_classes",
2155 build1 (ADDR_EXPR, ptr_type_node, TYPE_CTABLE_DECL (type)));
2156 PUSH_FIELD_VALUE (v2, "interfaces", interfaces);
2157 PUSH_FIELD_VALUE (v2, "loader", null_pointer_node);
2158 PUSH_FIELD_VALUE (v2, "interface_count",
2159 build_int_cst (NULL_TREE, interface_len));
2160 PUSH_FIELD_VALUE (v2, "state",
2161 convert (byte_type_node,
2162 build_int_cst (NULL_TREE, JV_STATE_PRELOADING)));
2163
2164 PUSH_FIELD_VALUE (v2, "thread", null_pointer_node);
2165 PUSH_FIELD_VALUE (v2, "depth", integer_zero_node);
2166 PUSH_FIELD_VALUE (v2, "ancestors", null_pointer_node);
2167 PUSH_FIELD_VALUE (v2, "idt", null_pointer_node);
2168 PUSH_FIELD_VALUE (v2, "arrayclass", null_pointer_node);
2169 PUSH_FIELD_VALUE (v2, "protectionDomain", null_pointer_node);
2170
2171 {
2172 tree assertion_table_ref;
2173 if (TYPE_ASSERTIONS (type) == NULL)
2174 assertion_table_ref = null_pointer_node;
2175 else
2176 assertion_table_ref = build1 (ADDR_EXPR,
2177 build_pointer_type (assertion_table_type),
2178 emit_assertion_table (type));
2179
2180 PUSH_FIELD_VALUE (v2, "assertion_table", assertion_table_ref);
2181 }
2182
2183 PUSH_FIELD_VALUE (v2, "hack_signers", null_pointer_node);
2184 PUSH_FIELD_VALUE (v2, "chain", null_pointer_node);
2185 PUSH_FIELD_VALUE (v2, "aux_info", null_pointer_node);
2186 PUSH_FIELD_VALUE (v2, "engine", null_pointer_node);
2187
2188 if (TYPE_REFLECTION_DATA (current_class))
2189 {
2190 int i;
2191 int count = TYPE_REFLECTION_DATASIZE (current_class);
2192 vec<constructor_elt, va_gc> *v;
2193 vec_alloc (v, count);
2194 unsigned char *data = TYPE_REFLECTION_DATA (current_class);
2195 tree max_index = build_int_cst (sizetype, count);
2196 tree index = build_index_type (max_index);
2197 tree type = build_array_type (unsigned_byte_type_node, index);
2198 char buf[64];
2199 tree array;
2200 static int reflection_data_count;
2201
2202 sprintf (buf, "_reflection_data_%d", reflection_data_count++);
2203 array = build_decl (input_location,
2204 VAR_DECL, get_identifier (buf), type);
2205
2206 rewrite_reflection_indexes (&field_indexes);
2207
2208 for (i = 0; i < count; i++)
2209 {
2210 constructor_elt elt;
2211 elt.index = build_int_cst (sizetype, i);
2212 elt.value = build_int_cstu (byte_type_node, data[i]);
2213 v->quick_push (elt);
2214 }
2215
2216 DECL_INITIAL (array) = build_constructor (type, v);
2217 TREE_STATIC (array) = 1;
2218 DECL_ARTIFICIAL (array) = 1;
2219 DECL_IGNORED_P (array) = 1;
2220 TREE_READONLY (array) = 1;
2221 TREE_CONSTANT (DECL_INITIAL (array)) = 1;
2222 rest_of_decl_compilation (array, 1, 0);
2223
2224 reflection_data = build_address_of (array);
2225
2226 free (data);
2227 TYPE_REFLECTION_DATA (current_class) = NULL;
2228 }
2229 else
2230 reflection_data = null_pointer_node;
2231
2232 PUSH_FIELD_VALUE (v2, "reflection_data", reflection_data);
2233 FINISH_RECORD_CONSTRUCTOR (cons, v2, class_type_node);
2234
2235 DECL_INITIAL (decl) = cons;
2236
2237 /* Hash synchronization requires at least 64-bit alignment. */
2238 if (flag_hash_synchronization && POINTER_SIZE < 64)
2239 DECL_ALIGN (decl) = 64;
2240
2241 if (flag_indirect_classes)
2242 {
2243 TREE_READONLY (decl) = 1;
2244 TREE_CONSTANT (DECL_INITIAL (decl)) = 1;
2245 }
2246
2247 rest_of_decl_compilation (decl, 1, 0);
2248
2249 {
2250 tree classdollar_field = build_classdollar_field (type);
2251 if (!flag_indirect_classes)
2252 DECL_INITIAL (classdollar_field) = build_static_class_ref (type);
2253 rest_of_decl_compilation (classdollar_field, 1, 0);
2254 }
2255
2256 TYPE_OTABLE_DECL (type) = NULL_TREE;
2257 TYPE_ATABLE_DECL (type) = NULL_TREE;
2258 TYPE_CTABLE_DECL (type) = NULL_TREE;
2259 }
2260
2261 void
2262 finish_class (void)
2263 {
2264 java_expand_catch_classes (current_class);
2265
2266 current_function_decl = NULL_TREE;
2267 TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (current_class)) = 0;
2268 make_class_data (current_class);
2269 register_class ();
2270 rest_of_decl_compilation (TYPE_NAME (current_class), 1, 0);
2271 }
2272
2273 /* Return 2 if KLASS is compiled by this compilation job;
2274 return 1 if KLASS can otherwise be assumed to be compiled;
2275 return 0 if we cannot assume that KLASS is compiled.
2276 Returns 1 for primitive and 0 for array types. */
2277 int
2278 is_compiled_class (tree klass)
2279 {
2280 int seen_in_zip;
2281 if (TREE_CODE (klass) == POINTER_TYPE)
2282 klass = TREE_TYPE (klass);
2283 if (TREE_CODE (klass) != RECORD_TYPE) /* Primitive types are static. */
2284 return 1;
2285 if (TYPE_ARRAY_P (klass))
2286 return 0;
2287
2288 seen_in_zip = (TYPE_JCF (klass) && JCF_SEEN_IN_ZIP (TYPE_JCF (klass)));
2289 if (CLASS_FROM_CURRENTLY_COMPILED_P (klass))
2290 {
2291 /* The class was seen in the current ZIP file and will be
2292 available as a compiled class in the future but may not have
2293 been loaded already. Load it if necessary. This prevent
2294 build_class_ref () from crashing. */
2295
2296 if (seen_in_zip && !CLASS_LOADED_P (klass) && (klass != current_class))
2297 load_class (klass, 1);
2298
2299 /* We return 2 for class seen in ZIP and class from files
2300 belonging to the same compilation unit */
2301 return 2;
2302 }
2303
2304 if (assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (klass)))))
2305 {
2306 if (!CLASS_LOADED_P (klass))
2307 {
2308 if (klass != current_class)
2309 load_class (klass, 1);
2310 }
2311 return 1;
2312 }
2313
2314 return 0;
2315 }
2316
2317 /* Build a VAR_DECL for the dispatch table (vtable) for class TYPE. */
2318
2319 tree
2320 build_dtable_decl (tree type)
2321 {
2322 tree dtype, decl;
2323
2324 /* We need to build a new dtable type so that its size is uniquely
2325 computed when we're dealing with the class for real and not just
2326 faking it (like java.lang.Class during the initialization of the
2327 compiler.) We know we're not faking a class when CURRENT_CLASS is
2328 TYPE. */
2329 if (current_class == type)
2330 {
2331 tree dummy = NULL_TREE;
2332 int n;
2333
2334 dtype = make_node (RECORD_TYPE);
2335
2336 PUSH_FIELD (input_location, dtype, dummy, "top_offset", ptr_type_node);
2337 PUSH_FIELD (input_location, dtype, dummy, "type_info", ptr_type_node);
2338
2339 PUSH_FIELD (input_location, dtype, dummy, "class", class_ptr_type);
2340 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
2341 {
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;
2347 dummy = tmp_field;
2348 }
2349
2350 PUSH_FIELD (input_location, dtype, dummy, "gc_descr", ptr_type_node);
2351 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
2352 {
2353 tree tmp_field = build_decl (input_location,
2354 FIELD_DECL, NULL_TREE, ptr_type_node);
2355 TREE_CHAIN (dummy) = tmp_field;
2356 DECL_CONTEXT (tmp_field) = dtype;
2357 DECL_ARTIFICIAL (tmp_field) = 1;
2358 dummy = tmp_field;
2359 }
2360
2361 n = TREE_VEC_LENGTH (get_dispatch_vector (type));
2362 if (TARGET_VTABLE_USES_DESCRIPTORS)
2363 n *= TARGET_VTABLE_USES_DESCRIPTORS;
2364
2365 PUSH_FIELD (input_location, dtype, dummy, "methods",
2366 build_prim_array_type (nativecode_ptr_type_node, n));
2367 layout_type (dtype);
2368 }
2369 else
2370 dtype = dtable_type;
2371
2372 decl = build_decl (input_location,
2373 VAR_DECL, get_identifier ("vt$"), dtype);
2374 DECL_CONTEXT (decl) = type;
2375 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
2376 DECL_VTABLE_P (decl) = 1;
2377
2378 return decl;
2379 }
2380
2381 /* Pre-pend the TYPE_FIELDS of THIS_CLASS with a dummy FIELD_DECL for the
2382 fields inherited from SUPER_CLASS. */
2383
2384 void
2385 push_super_field (tree this_class, tree super_class)
2386 {
2387 tree base_decl;
2388 /* Don't insert the field if we're just re-laying the class out. */
2389 if (TYPE_FIELDS (this_class) && !DECL_NAME (TYPE_FIELDS (this_class)))
2390 return;
2391 base_decl = build_decl (input_location,
2392 FIELD_DECL, NULL_TREE, super_class);
2393 DECL_IGNORED_P (base_decl) = 1;
2394 DECL_CHAIN (base_decl) = TYPE_FIELDS (this_class);
2395 TYPE_FIELDS (this_class) = base_decl;
2396 DECL_SIZE (base_decl) = TYPE_SIZE (super_class);
2397 DECL_SIZE_UNIT (base_decl) = TYPE_SIZE_UNIT (super_class);
2398 }
2399
2400 /* Handle the different manners we may have to lay out a super class. */
2401
2402 static tree
2403 maybe_layout_super_class (tree super_class, tree this_class ATTRIBUTE_UNUSED)
2404 {
2405 if (!super_class)
2406 return NULL_TREE;
2407 else if (TREE_CODE (super_class) == RECORD_TYPE)
2408 {
2409 if (!CLASS_LOADED_P (super_class))
2410 load_class (super_class, 1);
2411 }
2412 /* We might have to layout the class before its dependency on
2413 the super class gets resolved by java_complete_class */
2414 else if (TREE_CODE (super_class) == POINTER_TYPE)
2415 {
2416 if (TREE_TYPE (super_class) != NULL_TREE)
2417 super_class = TREE_TYPE (super_class);
2418 else
2419 gcc_unreachable ();
2420 }
2421 if (!TYPE_SIZE (super_class))
2422 safe_layout_class (super_class);
2423
2424 return super_class;
2425 }
2426
2427 /* safe_layout_class just makes sure that we can load a class without
2428 disrupting the current_class, input_location, etc, information
2429 about the class processed currently. */
2430
2431 void
2432 safe_layout_class (tree klass)
2433 {
2434 tree save_current_class = current_class;
2435 location_t save_location = input_location;
2436
2437 layout_class (klass);
2438
2439 current_class = save_current_class;
2440 input_location = save_location;
2441 }
2442
2443 void
2444 layout_class (tree this_class)
2445 {
2446 int i;
2447 tree super_class = CLASSTYPE_SUPER (this_class);
2448
2449 class_list = tree_cons (this_class, NULL_TREE, class_list);
2450 if (CLASS_BEING_LAIDOUT (this_class))
2451 {
2452 char buffer [1024];
2453 char *report;
2454 tree current;
2455
2456 sprintf (buffer, " with '%s'",
2457 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class))));
2458 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2459
2460 for (current = TREE_CHAIN (class_list); current;
2461 current = TREE_CHAIN (current))
2462 {
2463 tree decl = TYPE_NAME (TREE_PURPOSE (current));
2464 sprintf (buffer, "\n which inherits from '%s' (%s:%d)",
2465 IDENTIFIER_POINTER (DECL_NAME (decl)),
2466 DECL_SOURCE_FILE (decl),
2467 DECL_SOURCE_LINE (decl));
2468 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2469 }
2470 obstack_1grow (&temporary_obstack, '\0');
2471 report = XOBFINISH (&temporary_obstack, char *);
2472 cyclic_inheritance_report = ggc_strdup (report);
2473 obstack_free (&temporary_obstack, report);
2474 TYPE_SIZE (this_class) = error_mark_node;
2475 return;
2476 }
2477 CLASS_BEING_LAIDOUT (this_class) = 1;
2478
2479 if (super_class && !CLASS_BEING_LAIDOUT (super_class))
2480 {
2481 tree maybe_super_class
2482 = maybe_layout_super_class (super_class, this_class);
2483 if (maybe_super_class == NULL
2484 || TREE_CODE (TYPE_SIZE (maybe_super_class)) == ERROR_MARK)
2485 {
2486 TYPE_SIZE (this_class) = error_mark_node;
2487 CLASS_BEING_LAIDOUT (this_class) = 0;
2488 class_list = TREE_CHAIN (class_list);
2489 return;
2490 }
2491 if (TYPE_SIZE (this_class) == NULL_TREE)
2492 push_super_field (this_class, maybe_super_class);
2493 }
2494
2495 layout_type (this_class);
2496
2497 /* Also recursively load/layout any superinterfaces. */
2498 if (TYPE_BINFO (this_class))
2499 {
2500 for (i = BINFO_N_BASE_BINFOS (TYPE_BINFO (this_class)) - 1; i > 0; i--)
2501 {
2502 tree binfo = BINFO_BASE_BINFO (TYPE_BINFO (this_class), i);
2503 tree super_interface = BINFO_TYPE (binfo);
2504 tree maybe_super_interface
2505 = maybe_layout_super_class (super_interface, NULL_TREE);
2506 if (maybe_super_interface == NULL
2507 || TREE_CODE (TYPE_SIZE (maybe_super_interface)) == ERROR_MARK)
2508 {
2509 TYPE_SIZE (this_class) = error_mark_node;
2510 CLASS_BEING_LAIDOUT (this_class) = 0;
2511 class_list = TREE_CHAIN (class_list);
2512 return;
2513 }
2514 }
2515 }
2516
2517 /* Convert the size back to an SI integer value. */
2518 TYPE_SIZE_UNIT (this_class) =
2519 fold (convert (int_type_node, TYPE_SIZE_UNIT (this_class)));
2520
2521 CLASS_BEING_LAIDOUT (this_class) = 0;
2522 class_list = TREE_CHAIN (class_list);
2523 }
2524
2525 static void
2526 add_miranda_methods (tree base_class, tree search_class)
2527 {
2528 int i;
2529 tree binfo, base_binfo;
2530
2531 if (!CLASS_PARSED_P (search_class))
2532 load_class (search_class, 1);
2533
2534 for (binfo = TYPE_BINFO (search_class), i = 1;
2535 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
2536 {
2537 tree method_decl;
2538 tree elt = BINFO_TYPE (base_binfo);
2539
2540 /* FIXME: This is totally bogus. We should not be handling
2541 Miranda methods at all if we're using the BC ABI. */
2542 if (TYPE_DUMMY (elt))
2543 continue;
2544
2545 /* Ensure that interface methods are seen in declared order. */
2546 if (!CLASS_LOADED_P (elt))
2547 load_class (elt, 1);
2548 layout_class_methods (elt);
2549
2550 /* All base classes will have been laid out at this point, so the order
2551 will be correct. This code must match similar layout code in the
2552 runtime. */
2553 for (method_decl = TYPE_METHODS (elt);
2554 method_decl; method_decl = DECL_CHAIN (method_decl))
2555 {
2556 tree sig, override;
2557
2558 /* An interface can have <clinit>. */
2559 if (ID_CLINIT_P (DECL_NAME (method_decl)))
2560 continue;
2561
2562 sig = build_java_argument_signature (TREE_TYPE (method_decl));
2563 override = lookup_argument_method (base_class,
2564 DECL_NAME (method_decl), sig);
2565 if (override == NULL_TREE)
2566 {
2567 /* Found a Miranda method. Add it. */
2568 tree new_method;
2569 sig = build_java_signature (TREE_TYPE (method_decl));
2570 new_method
2571 = add_method (base_class,
2572 get_access_flags_from_decl (method_decl),
2573 DECL_NAME (method_decl), sig);
2574 METHOD_INVISIBLE (new_method) = 1;
2575 }
2576 }
2577
2578 /* Try superinterfaces. */
2579 add_miranda_methods (base_class, elt);
2580 }
2581 }
2582
2583 void
2584 layout_class_methods (tree this_class)
2585 {
2586 tree method_decl, dtable_count;
2587 tree super_class, type_name;
2588
2589 if (TYPE_NVIRTUALS (this_class))
2590 return;
2591
2592 super_class = CLASSTYPE_SUPER (this_class);
2593
2594 if (super_class)
2595 {
2596 super_class = maybe_layout_super_class (super_class, this_class);
2597 if (!TYPE_NVIRTUALS (super_class))
2598 layout_class_methods (super_class);
2599 dtable_count = TYPE_NVIRTUALS (super_class);
2600 }
2601 else
2602 dtable_count = integer_zero_node;
2603
2604 type_name = TYPE_NAME (this_class);
2605 if (!flag_indirect_dispatch
2606 && (CLASS_ABSTRACT (type_name) || CLASS_INTERFACE (type_name)))
2607 {
2608 /* An abstract class can have methods which are declared only in
2609 an implemented interface. These are called "Miranda
2610 methods". We make a dummy method entry for such methods
2611 here. */
2612 add_miranda_methods (this_class, this_class);
2613 }
2614
2615 TYPE_METHODS (this_class) = nreverse (TYPE_METHODS (this_class));
2616
2617 for (method_decl = TYPE_METHODS (this_class);
2618 method_decl; method_decl = DECL_CHAIN (method_decl))
2619 dtable_count = layout_class_method (this_class, super_class,
2620 method_decl, dtable_count);
2621
2622 TYPE_NVIRTUALS (this_class) = dtable_count;
2623 }
2624
2625 /* Return the index of METHOD in INTERFACE. This index begins at 1
2626 and is used as an argument for _Jv_LookupInterfaceMethodIdx(). */
2627 int
2628 get_interface_method_index (tree method, tree interface)
2629 {
2630 tree meth;
2631 int i = 1;
2632
2633 for (meth = TYPE_METHODS (interface); ; meth = DECL_CHAIN (meth))
2634 {
2635 if (meth == method)
2636 return i;
2637 /* We don't want to put <clinit> into the interface table. */
2638 if (! ID_CLINIT_P (DECL_NAME (meth)))
2639 ++i;
2640 gcc_assert (meth != NULL_TREE);
2641 }
2642 }
2643
2644 /* Lay METHOD_DECL out, returning a possibly new value of
2645 DTABLE_COUNT. Also mangle the method's name. */
2646
2647 tree
2648 layout_class_method (tree this_class, tree super_class,
2649 tree method_decl, tree dtable_count)
2650 {
2651 tree method_name = DECL_NAME (method_decl);
2652
2653 TREE_PUBLIC (method_decl) = 1;
2654
2655 if (flag_indirect_classes
2656 || (METHOD_PRIVATE (method_decl) && METHOD_STATIC (method_decl)
2657 && ! METHOD_NATIVE (method_decl)
2658 && ! special_method_p (method_decl)))
2659 java_hide_decl (method_decl);
2660
2661 /* Considered external unless it is being compiled into this object
2662 file, or it was already flagged as external. */
2663 if (!DECL_EXTERNAL (method_decl))
2664 DECL_EXTERNAL (method_decl) = ((is_compiled_class (this_class) != 2)
2665 || METHOD_NATIVE (method_decl));
2666
2667 if (ID_INIT_P (method_name))
2668 {
2669 const char *p = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class)));
2670 const char *ptr;
2671 for (ptr = p; *ptr; )
2672 {
2673 if (*ptr++ == '.')
2674 p = ptr;
2675 }
2676 DECL_CONSTRUCTOR_P (method_decl) = 1;
2677 build_java_signature (TREE_TYPE (method_decl));
2678 }
2679 else if (! METHOD_STATIC (method_decl))
2680 {
2681 tree method_sig =
2682 build_java_signature (TREE_TYPE (method_decl));
2683 bool method_override = false;
2684 tree super_method = lookup_java_method (super_class, method_name,
2685 method_sig);
2686 if (super_method != NULL_TREE
2687 && ! METHOD_DUMMY (super_method))
2688 {
2689 method_override = true;
2690 if (! METHOD_PUBLIC (super_method) &&
2691 ! METHOD_PROTECTED (super_method))
2692 {
2693 /* Don't override private method, or default-access method in
2694 another package. */
2695 if (METHOD_PRIVATE (super_method) ||
2696 ! in_same_package (TYPE_NAME (this_class),
2697 TYPE_NAME (super_class)))
2698 method_override = false;
2699 }
2700 }
2701 if (method_override)
2702 {
2703 tree method_index = get_method_index (super_method);
2704 set_method_index (method_decl, method_index);
2705 if (method_index == NULL_TREE
2706 && ! flag_indirect_dispatch
2707 && ! DECL_ARTIFICIAL (super_method))
2708 error ("non-static method %q+D overrides static method",
2709 method_decl);
2710 }
2711 else if (this_class == object_type_node
2712 && (METHOD_FINAL (method_decl)
2713 || METHOD_PRIVATE (method_decl)))
2714 {
2715 /* We don't generate vtable entries for final Object
2716 methods. This is simply to save space, since every
2717 object would otherwise have to define them. */
2718 }
2719 else if (! METHOD_PRIVATE (method_decl)
2720 && dtable_count)
2721 {
2722 /* We generate vtable entries for final methods because they
2723 may one day be changed to non-final. */
2724 set_method_index (method_decl, dtable_count);
2725 dtable_count = fold_build2 (PLUS_EXPR, integer_type_node,
2726 dtable_count, integer_one_node);
2727 }
2728 }
2729
2730 return dtable_count;
2731 }
2732
2733 static void
2734 register_class (void)
2735 {
2736 tree node;
2737
2738 if (!registered_class)
2739 vec_alloc (registered_class, 8);
2740
2741 if (flag_indirect_classes)
2742 node = current_class;
2743 else
2744 node = TREE_OPERAND (build_class_ref (current_class), 0);
2745 vec_safe_push (registered_class, node);
2746 }
2747
2748 /* Emit a function that calls _Jv_RegisterNewClasses with a list of
2749 all the classes we have emitted. */
2750
2751 static void
2752 emit_indirect_register_classes (tree *list_p)
2753 {
2754 tree klass, t, register_class_fn;
2755 int i;
2756
2757 int size = vec_safe_length (registered_class) * 2 + 1;
2758 vec<constructor_elt, va_gc> *init;
2759 vec_alloc (init, size);
2760 tree class_array_type
2761 = build_prim_array_type (ptr_type_node, size);
2762 tree cdecl = build_decl (input_location,
2763 VAR_DECL, get_identifier ("_Jv_CLS"),
2764 class_array_type);
2765 tree reg_class_list;
2766 FOR_EACH_VEC_SAFE_ELT (registered_class, i, klass)
2767 {
2768 t = fold_convert (ptr_type_node, build_static_class_ref (klass));
2769 CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, t);
2770 t = fold_convert (ptr_type_node,
2771 build_address_of (build_classdollar_field (klass)));
2772 CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, t);
2773 }
2774 CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, integer_zero_node);
2775 DECL_INITIAL (cdecl) = build_constructor (class_array_type, init);
2776 TREE_CONSTANT (DECL_INITIAL (cdecl)) = 1;
2777 TREE_STATIC (cdecl) = 1;
2778 DECL_ARTIFICIAL (cdecl) = 1;
2779 DECL_IGNORED_P (cdecl) = 1;
2780 TREE_READONLY (cdecl) = 1;
2781 TREE_CONSTANT (cdecl) = 1;
2782 rest_of_decl_compilation (cdecl, 1, 0);
2783 reg_class_list = fold_convert (ptr_type_node, build_address_of (cdecl));
2784
2785 t = build_function_type_list (void_type_node,
2786 build_pointer_type (ptr_type_node), NULL);
2787 t = build_decl (input_location,
2788 FUNCTION_DECL,
2789 get_identifier ("_Jv_RegisterNewClasses"), t);
2790 TREE_PUBLIC (t) = 1;
2791 DECL_EXTERNAL (t) = 1;
2792 register_class_fn = t;
2793 t = build_call_expr (register_class_fn, 1, reg_class_list);
2794 append_to_statement_list (t, list_p);
2795 }
2796
2797 /* Emit a list of pointers to all classes we have emitted to JCR_SECTION. */
2798
2799 static void
2800 emit_register_classes_in_jcr_section (void)
2801 {
2802 #ifdef JCR_SECTION_NAME
2803 tree klass, cdecl, class_array_type;
2804 int i;
2805 int size = vec_safe_length (registered_class);
2806 vec<constructor_elt, va_gc> *init;
2807 vec_alloc (init, size);
2808
2809 FOR_EACH_VEC_SAFE_ELT (registered_class, i, klass)
2810 CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, build_fold_addr_expr (klass));
2811
2812 /* ??? I would like to use tree_output_constant_def() but there is no way
2813 to put the data in a named section name, or to set the alignment,
2814 via that function. So do everything manually here. */
2815 class_array_type = build_prim_array_type (ptr_type_node, size);
2816 cdecl = build_decl (UNKNOWN_LOCATION,
2817 VAR_DECL, get_identifier ("_Jv_JCR_SECTION_data"),
2818 class_array_type);
2819 DECL_ALIGN (cdecl) = POINTER_SIZE;
2820 DECL_USER_ALIGN (cdecl) = 1;
2821 DECL_INITIAL (cdecl) = build_constructor (class_array_type, init);
2822 TREE_CONSTANT (DECL_INITIAL (cdecl)) = 1;
2823 TREE_STATIC (cdecl) = 1;
2824 TREE_READONLY (cdecl) = 0;
2825 TREE_CONSTANT (cdecl) = 1;
2826 DECL_ARTIFICIAL (cdecl) = 1;
2827 DECL_IGNORED_P (cdecl) = 1;
2828 DECL_PRESERVE_P (cdecl) = 1;
2829 set_decl_section_name (cdecl, JCR_SECTION_NAME);
2830 pushdecl_top_level (cdecl);
2831 relayout_decl (cdecl);
2832 rest_of_decl_compilation (cdecl, 1, 0);
2833 #else
2834 /* A target has defined TARGET_USE_JCR_SECTION,
2835 but doesn't have a JCR_SECTION_NAME. */
2836 gcc_unreachable ();
2837 #endif
2838 }
2839
2840
2841 /* Emit a series of calls to _Jv_RegisterClass for every class we emitted.
2842 A series of calls is added to LIST_P. */
2843
2844 static void
2845 emit_Jv_RegisterClass_calls (tree *list_p)
2846 {
2847 tree klass, t, register_class_fn;
2848 int i;
2849
2850 t = build_function_type_list (void_type_node, class_ptr_type, NULL);
2851 t = build_decl (input_location,
2852 FUNCTION_DECL, get_identifier ("_Jv_RegisterClass"), t);
2853 TREE_PUBLIC (t) = 1;
2854 DECL_EXTERNAL (t) = 1;
2855 register_class_fn = t;
2856
2857 FOR_EACH_VEC_SAFE_ELT (registered_class, i, klass)
2858 {
2859 t = build_fold_addr_expr (klass);
2860 t = build_call_expr (register_class_fn, 1, t);
2861 append_to_statement_list (t, list_p);
2862 }
2863 }
2864
2865 /* Emit something to register classes at start-up time.
2866
2867 The default mechanism is to generate instances at run-time.
2868
2869 An alternative mechanism is through the .jcr section, which contain
2870 a list of pointers to classes which get registered during constructor
2871 invocation time.
2872
2873 The fallback mechanism is to add statements to *LIST_P to call
2874 _Jv_RegisterClass for each class in this file. These statements will
2875 be added to a static constructor function for this translation unit. */
2876
2877 void
2878 emit_register_classes (tree *list_p)
2879 {
2880 if (registered_class == NULL)
2881 return;
2882
2883 /* By default, generate instances of Class at runtime. */
2884 if (flag_indirect_classes)
2885 emit_indirect_register_classes (list_p);
2886 /* TARGET_USE_JCR_SECTION defaults to 1 if SUPPORTS_WEAK and
2887 TARGET_ASM_NAMED_SECTION, else 0. Some targets meet those conditions
2888 but lack suitable crtbegin/end objects or linker support. These
2889 targets can override the default in tm.h to use the fallback mechanism. */
2890 else if (TARGET_USE_JCR_SECTION)
2891 emit_register_classes_in_jcr_section ();
2892 /* Use the fallback mechanism. */
2893 else
2894 emit_Jv_RegisterClass_calls (list_p);
2895 }
2896
2897 /* Build a constructor for an entry in the symbol table. */
2898
2899 static tree
2900 build_symbol_table_entry (tree clname, tree name, tree signature)
2901 {
2902 tree symbol;
2903 vec<constructor_elt, va_gc> *v = NULL;
2904
2905 START_RECORD_CONSTRUCTOR (v, symbol_type);
2906 PUSH_FIELD_VALUE (v, "clname", clname);
2907 PUSH_FIELD_VALUE (v, "name", name);
2908 PUSH_FIELD_VALUE (v, "signature", signature);
2909 FINISH_RECORD_CONSTRUCTOR (symbol, v, symbol_type);
2910 TREE_CONSTANT (symbol) = 1;
2911
2912 return symbol;
2913 }
2914
2915 /* Make a symbol_type (_Jv_MethodSymbol) node for DECL. */
2916
2917 static tree
2918 build_symbol_entry (tree decl, tree special)
2919 {
2920 tree clname, name, signature;
2921 clname = build_utf8_ref (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))));
2922 /* ??? Constructors are given the name foo.foo all the way through
2923 the compiler, but in the method table they're all renamed
2924 foo.<init>. So, we have to do the same here unless we want an
2925 unresolved reference at runtime. */
2926 name = build_utf8_ref ((TREE_CODE (decl) == FUNCTION_DECL
2927 && DECL_CONSTRUCTOR_P (decl))
2928 ? init_identifier_node
2929 : DECL_NAME (decl));
2930 signature = build_java_signature (TREE_TYPE (decl));
2931 signature = build_utf8_ref (unmangle_classname
2932 (IDENTIFIER_POINTER (signature),
2933 IDENTIFIER_LENGTH (signature)));
2934 /* SPECIAL is either NULL_TREE or integer_one_node. We emit
2935 signature addr+1 if SPECIAL, and this indicates to the runtime
2936 system that this is a "special" symbol, i.e. one that should
2937 bypass access controls. */
2938 if (special != NULL_TREE)
2939 signature = fold_build_pointer_plus (signature, special);
2940
2941 return build_symbol_table_entry (clname, name, signature);
2942 }
2943
2944 /* Emit a symbol table: used by -findirect-dispatch. */
2945
2946 tree
2947 emit_symbol_table (tree name, tree the_table,
2948 vec<method_entry, va_gc> *decl_table,
2949 tree the_syms_decl, tree the_array_element_type,
2950 int element_size)
2951 {
2952 tree table, null_symbol, table_size, the_array_type;
2953 unsigned index;
2954 method_entry *e;
2955 vec<constructor_elt, va_gc> *v = NULL;
2956
2957 /* Only emit a table if this translation unit actually made any
2958 references via it. */
2959 if (!decl_table)
2960 return the_table;
2961
2962 /* Build a list of _Jv_MethodSymbols for each entry in otable_methods. */
2963 FOR_EACH_VEC_ELT (*decl_table, index, e)
2964 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
2965 build_symbol_entry (e->method, e->special));
2966
2967 /* Terminate the list with a "null" entry. */
2968 null_symbol = build_symbol_table_entry (null_pointer_node,
2969 null_pointer_node,
2970 null_pointer_node);
2971 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, null_symbol);
2972
2973 tree symbols_arr_type
2974 = build_prim_array_type (symbol_type, vec_safe_length (v));
2975
2976 table = build_constructor (symbols_arr_type, v);
2977
2978 /* Make it the initial value for otable_syms and emit the decl. */
2979 TREE_TYPE (the_syms_decl) = symbols_arr_type;
2980 relayout_decl (the_syms_decl);
2981 DECL_INITIAL (the_syms_decl) = table;
2982 DECL_ARTIFICIAL (the_syms_decl) = 1;
2983 DECL_IGNORED_P (the_syms_decl) = 1;
2984 rest_of_decl_compilation (the_syms_decl, 1, 0);
2985
2986 /* Now that its size is known, redefine the table as an
2987 uninitialized static array of INDEX + 1 elements. The extra entry
2988 is used by the runtime to track whether the table has been
2989 initialized. */
2990 table_size
2991 = build_index_type (build_int_cst (NULL_TREE, index * element_size + 1));
2992 the_array_type = build_array_type (the_array_element_type, table_size);
2993 the_table = build_decl (input_location,
2994 VAR_DECL, name, the_array_type);
2995 TREE_STATIC (the_table) = 1;
2996 TREE_READONLY (the_table) = 1;
2997 rest_of_decl_compilation (the_table, 1, 0);
2998
2999 return the_table;
3000 }
3001
3002 /* Make an entry for the catch_classes list. */
3003 tree
3004 make_catch_class_record (tree catch_class, tree classname)
3005 {
3006 tree entry;
3007 tree type = TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (output_class)));
3008 vec<constructor_elt, va_gc> *v = NULL;
3009 START_RECORD_CONSTRUCTOR (v, type);
3010 PUSH_FIELD_VALUE (v, "address", catch_class);
3011 PUSH_FIELD_VALUE (v, "classname", classname);
3012 FINISH_RECORD_CONSTRUCTOR (entry, v, type);
3013 return entry;
3014 }
3015
3016
3017 /* Generate the list of Throwable classes that are caught by exception
3018 handlers in this class. */
3019 tree
3020 emit_catch_table (tree this_class)
3021 {
3022 tree table, table_size, array_type;
3023 int n_catch_classes;
3024 constructor_elt *e;
3025 /* Fill in the dummy entry that make_class created. */
3026 e = &(*TYPE_CATCH_CLASSES (this_class))[0];
3027 e->value = make_catch_class_record (null_pointer_node, null_pointer_node);
3028 CONSTRUCTOR_APPEND_ELT (TYPE_CATCH_CLASSES (this_class), NULL_TREE,
3029 make_catch_class_record (null_pointer_node,
3030 null_pointer_node));
3031 n_catch_classes = TYPE_CATCH_CLASSES (this_class)->length ();
3032 table_size = build_index_type (build_int_cst (NULL_TREE, n_catch_classes));
3033 array_type
3034 = build_array_type (TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (this_class))),
3035 table_size);
3036 table =
3037 build_decl (input_location,
3038 VAR_DECL, DECL_NAME (TYPE_CTABLE_DECL (this_class)), array_type);
3039 DECL_INITIAL (table) =
3040 build_constructor (array_type, TYPE_CATCH_CLASSES (this_class));
3041 TREE_STATIC (table) = 1;
3042 TREE_READONLY (table) = 1;
3043 DECL_IGNORED_P (table) = 1;
3044 rest_of_decl_compilation (table, 1, 0);
3045 return table;
3046 }
3047
3048 /* Given a type, return the signature used by
3049 _Jv_FindClassFromSignature() in libgcj. This isn't exactly the
3050 same as build_java_signature() because we want the canonical array
3051 type. */
3052
3053 static tree
3054 build_signature_for_libgcj (tree type)
3055 {
3056 tree sig, ref;
3057
3058 sig = build_java_signature (type);
3059 ref = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
3060 IDENTIFIER_LENGTH (sig)));
3061 return ref;
3062 }
3063
3064 /* Build an entry in the type assertion table. */
3065
3066 static tree
3067 build_assertion_table_entry (tree code, tree op1, tree op2)
3068 {
3069 vec<constructor_elt, va_gc> *v = NULL;
3070 tree entry;
3071
3072 START_RECORD_CONSTRUCTOR (v, assertion_entry_type);
3073 PUSH_FIELD_VALUE (v, "assertion_code", code);
3074 PUSH_FIELD_VALUE (v, "op1", op1);
3075 PUSH_FIELD_VALUE (v, "op2", op2);
3076 FINISH_RECORD_CONSTRUCTOR (entry, v, assertion_entry_type);
3077
3078 return entry;
3079 }
3080
3081 /* Add an entry to the type assertion table. Callback used during hashtable
3082 traversal. */
3083
3084 int
3085 add_assertion_table_entry (type_assertion **slot, vec<constructor_elt, va_gc> **v)
3086 {
3087 tree entry;
3088 tree code_val, op1_utf8, op2_utf8;
3089 type_assertion *as = *slot;
3090
3091 code_val = build_int_cst (NULL_TREE, as->assertion_code);
3092
3093 if (as->op1 == NULL_TREE)
3094 op1_utf8 = null_pointer_node;
3095 else
3096 op1_utf8 = build_signature_for_libgcj (as->op1);
3097
3098 if (as->op2 == NULL_TREE)
3099 op2_utf8 = null_pointer_node;
3100 else
3101 op2_utf8 = build_signature_for_libgcj (as->op2);
3102
3103 entry = build_assertion_table_entry (code_val, op1_utf8, op2_utf8);
3104
3105 CONSTRUCTOR_APPEND_ELT (*v, NULL_TREE, entry);
3106 return true;
3107 }
3108
3109 /* Generate the type assertion table for KLASS, and return its DECL. */
3110
3111 static tree
3112 emit_assertion_table (tree klass)
3113 {
3114 tree null_entry, ctor, table_decl;
3115 hash_table<type_assertion_hasher> *assertions_htab = TYPE_ASSERTIONS (klass);
3116 vec<constructor_elt, va_gc> *v = NULL;
3117
3118 /* Iterate through the hash table. */
3119 assertions_htab
3120 ->traverse<vec<constructor_elt, va_gc> **, add_assertion_table_entry> (&v);
3121
3122 /* Finish with a null entry. */
3123 null_entry = build_assertion_table_entry (integer_zero_node,
3124 null_pointer_node,
3125 null_pointer_node);
3126
3127 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, null_entry);
3128
3129 tree type
3130 = build_prim_array_type (assertion_entry_type, vec_safe_length (v));
3131
3132 ctor = build_constructor (type, v);
3133
3134 table_decl = build_decl (input_location,
3135 VAR_DECL, mangled_classname ("_type_assert_", klass),
3136 type);
3137
3138 TREE_STATIC (table_decl) = 1;
3139 TREE_READONLY (table_decl) = 1;
3140 TREE_CONSTANT (table_decl) = 1;
3141 DECL_IGNORED_P (table_decl) = 1;
3142
3143 DECL_INITIAL (table_decl) = ctor;
3144 DECL_ARTIFICIAL (table_decl) = 1;
3145 rest_of_decl_compilation (table_decl, 1, 0);
3146
3147 return table_decl;
3148 }
3149
3150 void
3151 init_class_processing (void)
3152 {
3153 fields_ident = get_identifier ("fields");
3154 info_ident = get_identifier ("info");
3155
3156 gcc_obstack_init (&temporary_obstack);
3157 }
3158 \f
3159 /* A hash table mapping trees to trees. Used generally. */
3160
3161 #define JAVA_TREEHASHHASH_H(t) ((hashval_t)TYPE_UID (t))
3162
3163 hashval_t
3164 treetreehasher::hash (treetreehash_entry *k)
3165 {
3166 return JAVA_TREEHASHHASH_H (k->key);
3167 }
3168
3169 bool
3170 treetreehasher::equal (treetreehash_entry *k1, tree k2)
3171 {
3172 return (k1->key == k2);
3173 }
3174
3175 tree
3176 java_treetreehash_find (hash_table<treetreehasher> *ht, tree t)
3177 {
3178 struct treetreehash_entry *e;
3179 hashval_t hv = JAVA_TREEHASHHASH_H (t);
3180 e = ht->find_with_hash (t, hv);
3181 if (e == NULL)
3182 return NULL;
3183 else
3184 return e->value;
3185 }
3186
3187 tree *
3188 java_treetreehash_new (hash_table<treetreehasher> *ht, tree t)
3189 {
3190 struct treetreehash_entry *tthe;
3191 hashval_t hv = JAVA_TREEHASHHASH_H (t);
3192
3193 treetreehash_entry **e = ht->find_slot_with_hash (t, hv, INSERT);
3194 if (*e == NULL)
3195 {
3196 tthe = ggc_cleared_alloc<treetreehash_entry> ();
3197 tthe->key = t;
3198 *e = tthe;
3199 }
3200 else
3201 tthe = *e;
3202 return &tthe->value;
3203 }
3204
3205 hash_table<treetreehasher> *
3206 java_treetreehash_create (size_t size)
3207 {
3208 return hash_table<treetreehasher>::create_ggc (size);
3209 }
3210
3211 /* Break down qualified IDENTIFIER into package and class-name components.
3212 For example, given SOURCE "pkg.foo.Bar", LEFT will be set to
3213 "pkg.foo", and RIGHT to "Bar". */
3214
3215 int
3216 split_qualified_name (tree *left, tree *right, tree source)
3217 {
3218 char *p, *base;
3219 int l = IDENTIFIER_LENGTH (source);
3220
3221 base = (char *) alloca (l + 1);
3222 memcpy (base, IDENTIFIER_POINTER (source), l + 1);
3223
3224 /* Breakdown NAME into REMAINDER . IDENTIFIER. */
3225 p = base + l - 1;
3226 while (*p != '.' && p != base)
3227 p--;
3228
3229 /* We didn't find a '.'. Return an error. */
3230 if (p == base)
3231 return 1;
3232
3233 *p = '\0';
3234 if (right)
3235 *right = get_identifier (p+1);
3236 *left = get_identifier (base);
3237
3238 return 0;
3239 }
3240
3241 /* Given two classes (TYPE_DECL) or class names (IDENTIFIER), return TRUE
3242 if the classes are from the same package. */
3243
3244 int
3245 in_same_package (tree name1, tree name2)
3246 {
3247 tree tmp;
3248 tree pkg1;
3249 tree pkg2;
3250
3251 if (TREE_CODE (name1) == TYPE_DECL)
3252 name1 = DECL_NAME (name1);
3253 if (TREE_CODE (name2) == TYPE_DECL)
3254 name2 = DECL_NAME (name2);
3255
3256 if (QUALIFIED_P (name1) != QUALIFIED_P (name2))
3257 /* One in empty package. */
3258 return 0;
3259
3260 if (QUALIFIED_P (name1) == 0 && QUALIFIED_P (name2) == 0)
3261 /* Both in empty package. */
3262 return 1;
3263
3264 split_qualified_name (&pkg1, &tmp, name1);
3265 split_qualified_name (&pkg2, &tmp, name2);
3266
3267 return (pkg1 == pkg2);
3268 }
3269
3270 /* lang_hooks.decls.final_write_globals: perform final processing on
3271 global variables. */
3272
3273 void
3274 java_write_globals (void)
3275 {
3276 tree *vec = vec_safe_address (pending_static_fields);
3277 int len = vec_safe_length (pending_static_fields);
3278 write_global_declarations ();
3279 emit_debug_global_declarations (vec, len);
3280 vec_free (pending_static_fields);
3281 }
3282
3283 #include "gt-java-class.h"
This page took 0.177674 seconds and 5 git commands to generate.