OSDN Git Service

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