OSDN Git Service

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