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