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