OSDN Git Service

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