OSDN Git Service

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