OSDN Git Service

PR driver/44076
[pf3gnuchains/gcc-fork.git] / gcc / java / lang.c
1 /* Java(TM) language-specific utility routines.
2    Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
3    2005, 2006, 2007, 2008, 2010 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 /* Hacked by Per Bothner <bothner@cygnus.com> February 1996. */
26
27 #include "config.h"
28 #include "system.h"
29 #include "coretypes.h"
30 #include "tm.h"
31 #include "tree.h"
32 #include "input.h"
33 #include "java-tree.h"
34 #include "jcf.h"
35 #include "toplev.h"
36 #include "langhooks.h"
37 #include "langhooks-def.h"
38 #include "flags.h"
39 #include "ggc.h"
40 #include "diagnostic.h"
41 #include "tree-inline.h"
42 #include "splay-tree.h"
43 #include "tree-dump.h"
44 #include "opts.h"
45 #include "options.h"
46
47 static bool java_init (void);
48 static void java_finish (void);
49 static unsigned int java_option_lang_mask (void);
50 static void java_init_options (unsigned int, struct cl_decoded_option *);
51 static bool java_post_options (const char **);
52
53 static bool java_handle_option (size_t, const char *, int, int,
54                                 const struct cl_option_handlers *);
55 static void put_decl_string (const char *, int);
56 static void put_decl_node (tree, int);
57 static void java_print_error_function (diagnostic_context *, const char *,
58                                        diagnostic_info *);
59 static int merge_init_test_initialization (void * *, void *);
60 static int inline_init_test_initialization (void * *, void *);
61 static bool java_dump_tree (void *, tree);
62 static void dump_compound_expr (dump_info_p, tree);
63 static bool java_decl_ok_for_sibcall (const_tree);
64
65 static enum classify_record java_classify_record (tree type);
66
67 static tree java_eh_personality (void);
68
69 #ifndef TARGET_OBJECT_SUFFIX
70 # define TARGET_OBJECT_SUFFIX ".o"
71 #endif
72
73 /* Table of machine-independent attributes.  */
74 const struct attribute_spec java_attribute_table[] =
75 {
76  { "nonnull",                0, -1, false, true, true,
77                               NULL },
78   { NULL,                     0, 0, false, false, false, NULL }
79 };
80
81 /* Used to avoid printing error messages with bogus function
82    prototypes.  Starts out false.  */
83 static bool inhibit_error_function_printing;
84
85 const char *resource_name;
86
87 /* When nonzero, -Wall was turned on.  */
88 int flag_wall = 0;
89
90 /* When nonzero, report use of deprecated classes, methods, or fields.  */
91 int flag_deprecated = 1;
92
93 /* When zero, don't optimize static class initialization. This flag shouldn't
94    be tested alone, use STATIC_CLASS_INITIALIZATION_OPTIMIZATION_P instead.  */
95 /* FIXME: Make this work with gimplify.  */
96 /* int flag_optimize_sci = 0;  */
97
98 /* Don't attempt to verify invocations.  */
99 int flag_verify_invocations = 0; 
100
101 /* When nonzero, print extra version information.  */
102 static int v_flag = 0;
103
104 JCF *current_jcf;
105
106 /* Variable controlling how dependency tracking is enabled in
107    java_init.  */
108 static int dependency_tracking = 0;
109
110 /* Flag values for DEPENDENCY_TRACKING.  */
111 #define DEPEND_SET_FILE 1
112 #define DEPEND_ENABLE   2
113 #define DEPEND_TARGET_SET 4
114 #define DEPEND_FILE_ALREADY_SET 8
115
116 struct GTY(()) language_function {
117   int unused;
118 };
119
120 #undef LANG_HOOKS_NAME
121 #define LANG_HOOKS_NAME "GNU Java"
122 #undef LANG_HOOKS_INIT
123 #define LANG_HOOKS_INIT java_init
124 #undef LANG_HOOKS_FINISH
125 #define LANG_HOOKS_FINISH java_finish
126 #undef LANG_HOOKS_OPTION_LANG_MASK
127 #define LANG_HOOKS_OPTION_LANG_MASK java_option_lang_mask
128 #undef LANG_HOOKS_INIT_OPTIONS
129 #define LANG_HOOKS_INIT_OPTIONS java_init_options
130 #undef LANG_HOOKS_HANDLE_OPTION
131 #define LANG_HOOKS_HANDLE_OPTION java_handle_option
132 #undef LANG_HOOKS_POST_OPTIONS
133 #define LANG_HOOKS_POST_OPTIONS java_post_options
134 #undef LANG_HOOKS_PARSE_FILE
135 #define LANG_HOOKS_PARSE_FILE java_parse_file
136 #undef LANG_HOOKS_DUP_LANG_SPECIFIC_DECL
137 #define LANG_HOOKS_DUP_LANG_SPECIFIC_DECL java_dup_lang_specific_decl
138 #undef LANG_HOOKS_DECL_PRINTABLE_NAME
139 #define LANG_HOOKS_DECL_PRINTABLE_NAME lang_printable_name
140 #undef LANG_HOOKS_PRINT_ERROR_FUNCTION
141 #define LANG_HOOKS_PRINT_ERROR_FUNCTION java_print_error_function
142 #undef LANG_HOOKS_WRITE_GLOBALS
143 #define LANG_HOOKS_WRITE_GLOBALS java_write_globals
144
145 #undef LANG_HOOKS_TYPE_FOR_MODE
146 #define LANG_HOOKS_TYPE_FOR_MODE java_type_for_mode
147 #undef LANG_HOOKS_TYPE_FOR_SIZE
148 #define LANG_HOOKS_TYPE_FOR_SIZE java_type_for_size
149 #undef LANG_HOOKS_CLASSIFY_RECORD
150 #define LANG_HOOKS_CLASSIFY_RECORD java_classify_record
151
152 #undef LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN
153 #define LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN java_dump_tree
154
155 #undef LANG_HOOKS_GIMPLIFY_EXPR
156 #define LANG_HOOKS_GIMPLIFY_EXPR java_gimplify_expr
157
158 #undef LANG_HOOKS_DECL_OK_FOR_SIBCALL
159 #define LANG_HOOKS_DECL_OK_FOR_SIBCALL java_decl_ok_for_sibcall
160
161 #undef LANG_HOOKS_SET_DECL_ASSEMBLER_NAME
162 #define LANG_HOOKS_SET_DECL_ASSEMBLER_NAME java_mangle_decl
163
164 #undef LANG_HOOKS_ATTRIBUTE_TABLE
165 #define LANG_HOOKS_ATTRIBUTE_TABLE java_attribute_table
166
167 #undef LANG_HOOKS_EH_PERSONALITY
168 #define LANG_HOOKS_EH_PERSONALITY java_eh_personality
169
170 #undef LANG_HOOKS_EH_USE_CXA_END_CLEANUP
171 #define LANG_HOOKS_EH_USE_CXA_END_CLEANUP  true
172
173 /* Each front end provides its own.  */
174 struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
175
176 /*
177  * process java-specific compiler command-line options
178  * return false, but do not complain if the option is not recognized.
179  */
180 static bool
181 java_handle_option (size_t scode, const char *arg, int value,
182                     int kind ATTRIBUTE_UNUSED,
183                     const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED)
184 {
185   enum opt_code code = (enum opt_code) scode;
186
187   switch (code)
188     {
189     case OPT_I:
190       jcf_path_include_arg (arg);
191       break;
192
193     case OPT_M:
194       jcf_dependency_init (1);
195       dependency_tracking |= DEPEND_ENABLE;
196       break;
197
198     case OPT_MD_:
199       jcf_dependency_init (1);
200       dependency_tracking |= DEPEND_SET_FILE | DEPEND_ENABLE;
201       break;
202
203     case OPT_MF:
204       jcf_dependency_set_dep_file (arg);
205       dependency_tracking |= DEPEND_FILE_ALREADY_SET;
206       break;
207
208     case OPT_MM:
209       jcf_dependency_init (0);
210       dependency_tracking |= DEPEND_ENABLE;
211       break;
212
213     case OPT_MMD_:
214       jcf_dependency_init (0);
215       dependency_tracking |= DEPEND_SET_FILE | DEPEND_ENABLE;
216       break;
217
218     case OPT_MP:
219       jcf_dependency_print_dummies ();
220       break;
221
222     case OPT_MT:
223       jcf_dependency_set_target (arg);
224       dependency_tracking |= DEPEND_TARGET_SET;
225       break;
226
227     case OPT_Wall:
228       flag_wall = value;
229       /* When -Wall given, enable -Wunused.  We do this because the C
230          compiler does it, and people expect it.  */
231       warn_unused = value;
232       break;
233
234     case OPT_fenable_assertions_:
235       add_enable_assert (arg, value);
236       break;
237
238     case OPT_fenable_assertions:
239       add_enable_assert ("", value);
240       break;
241
242     case OPT_fdisable_assertions_:
243       add_enable_assert (arg, !value);
244       break;
245
246     case OPT_fdisable_assertions:
247       add_enable_assert ("", !value);
248       break;
249
250     case OPT_fassume_compiled_:
251       add_assume_compiled (arg, !value);
252       break;
253
254     case OPT_fassume_compiled:
255       add_assume_compiled ("", !value);
256       break;
257
258     case OPT_fbootclasspath_:
259       jcf_path_bootclasspath_arg (arg);
260       break;
261
262     case OPT_faux_classpath:
263     case OPT_fclasspath_:
264       jcf_path_classpath_arg (arg);
265       break;
266
267     case OPT_fcompile_resource_:
268       resource_name = arg;
269       break;
270
271     case OPT_fdump_:
272       if (!dump_switch_p (arg))
273         return false;
274       break;
275
276     case OPT_fencoding_:
277       /* Nothing.  */
278       break;
279
280     case OPT_fextdirs_:
281       jcf_path_extdirs_arg (arg);
282       break;
283
284     case OPT_foutput_class_dir_:
285       /* FIXME: remove; this is handled by ecj1 now.  */
286       break;
287
288     case OPT_version:
289       v_flag = 1;
290       break;
291       
292     case OPT_fsource_filename_:
293       java_read_sourcefilenames (arg);
294       break;
295       
296     default:
297       if (cl_options[code].flags & CL_Java)
298         break;
299       gcc_unreachable ();
300     }
301
302   return true;
303 }
304
305 /* Global open file.  */
306 FILE *finput;
307
308 static bool
309 java_init (void)
310 {
311   /* FIXME: Indirect dispatch isn't yet compatible with static class
312      init optimization.  */
313   if (flag_indirect_dispatch)
314     always_initialize_class_p = true;
315
316   if (!flag_indirect_dispatch)
317     flag_indirect_classes = false;
318
319   jcf_path_seal (v_flag);
320
321   java_init_decl_processing ();
322
323   using_eh_for_cleanups ();
324
325   return true;
326 }
327
328 static void
329 java_finish (void)
330 {
331   jcf_dependency_write ();
332 }
333
334 /* Buffer used by lang_printable_name. */
335 static char *decl_buf = NULL;
336
337 /* Allocated size of decl_buf. */
338 static int decl_buflen = 0;
339
340 /* Length of used part of decl_buf;  position for next character. */
341 static int decl_bufpos = 0;
342
343 /* Append the string STR to decl_buf.
344    It length is given by LEN;  -1 means the string is nul-terminated. */
345
346 static void
347 put_decl_string (const char *str, int len)
348 {
349   if (len < 0)
350     len = strlen (str);
351   if (decl_bufpos + len >= decl_buflen)
352     {
353       if (decl_buf == NULL)
354         {
355           decl_buflen = len + 100;
356           decl_buf = XNEWVEC (char, decl_buflen);
357         }
358       else
359         {
360           decl_buflen *= 2;
361           decl_buf = XRESIZEVAR (char, decl_buf, decl_buflen);
362         }
363     }
364   strcpy (decl_buf + decl_bufpos, str);
365   decl_bufpos += len;
366 }
367
368 /* Append to decl_buf a printable name for NODE.
369    Depending on VERBOSITY, more information about NODE
370    is printed. Read the comments of decl_printable_name in
371    langhooks.h for more.  */
372
373 static void
374 put_decl_node (tree node, int verbosity)
375 {
376   int was_pointer = 0;
377   if (TREE_CODE (node) == POINTER_TYPE)
378     {
379       node = TREE_TYPE (node);
380       was_pointer = 1;
381     }
382   if (DECL_P (node) && DECL_NAME (node) != NULL_TREE)
383     {
384       if (TREE_CODE (node) == FUNCTION_DECL)
385         {
386           if (verbosity == 0 && DECL_NAME (node))
387           /* We have been instructed to just print the bare name
388              of the function.  */
389             {
390               put_decl_node (DECL_NAME (node), 0);
391               return;
392             }
393
394           /* We want to print the type the DECL belongs to. We don't do
395              that when we handle constructors. */
396           if (! DECL_CONSTRUCTOR_P (node)
397               && ! DECL_ARTIFICIAL (node) && DECL_CONTEXT (node)
398               /* We want to print qualified DECL names only
399                  if verbosity is higher than 1.  */
400               && verbosity >= 1)
401             {
402               put_decl_node (TYPE_NAME (DECL_CONTEXT (node)),
403                                verbosity);
404               put_decl_string (".", 1);
405             }
406           if (! DECL_CONSTRUCTOR_P (node))
407             put_decl_node (DECL_NAME (node), verbosity);
408           if (TREE_TYPE (node) != NULL_TREE
409               /* We want to print function parameters only if verbosity
410                  is higher than 2.  */
411               && verbosity >= 2)
412             {
413               int i = 0;
414               tree args = TYPE_ARG_TYPES (TREE_TYPE (node));
415               if (TREE_CODE (TREE_TYPE (node)) == METHOD_TYPE)
416                 args = TREE_CHAIN (args);
417               put_decl_string ("(", 1);
418               for ( ; args != end_params_node;  args = TREE_CHAIN (args), i++)
419                 {
420                   if (i > 0)
421                     put_decl_string (",", 1);
422                   put_decl_node (TREE_VALUE (args), verbosity);
423                 }
424               put_decl_string (")", 1);
425             }
426         }
427       else
428         put_decl_node (DECL_NAME (node), verbosity);
429     }
430   else if (TYPE_P (node) && TYPE_NAME (node) != NULL_TREE)
431     {
432       if (TREE_CODE (node) == RECORD_TYPE && TYPE_ARRAY_P (node)
433           /* Print detailed array information only if verbosity is higher
434             than 2.  */
435           && verbosity >= 2)
436         {
437           put_decl_node (TYPE_ARRAY_ELEMENT (node), verbosity);
438           put_decl_string("[]", 2);
439         }
440       else if (node == promoted_byte_type_node)
441         put_decl_string ("byte", 4);
442       else if (node == promoted_short_type_node)
443         put_decl_string ("short", 5);
444       else if (node == promoted_char_type_node)
445         put_decl_string ("char", 4);
446       else if (node == promoted_boolean_type_node)
447         put_decl_string ("boolean", 7);
448       else if (node == void_type_node && was_pointer)
449         put_decl_string ("null", 4);
450       else
451         put_decl_node (TYPE_NAME (node), verbosity);
452     }
453   else if (TREE_CODE (node) == IDENTIFIER_NODE)
454     put_decl_string (IDENTIFIER_POINTER (node), IDENTIFIER_LENGTH (node));
455   else
456     put_decl_string ("<unknown>", -1);
457 }
458
459 /* Return a user-friendly name for DECL.
460    The resulting string is only valid until the next call.
461    The value of the hook decl_printable_name is this function,
462    which is also called directly by java_print_error_function. */
463
464 const char *
465 lang_printable_name (tree decl, int v)
466 {
467   decl_bufpos = 0;
468   put_decl_node (decl, v);
469   put_decl_string ("", 1);
470   return decl_buf;
471 }
472
473 /* Print on stderr the current class and method context.  This function
474    is the value of the hook print_error_function. */
475
476 static GTY(()) tree last_error_function_context;
477 static GTY(()) tree last_error_function;
478 static void
479 java_print_error_function (diagnostic_context *context ATTRIBUTE_UNUSED,
480                            const char *file,
481                            diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
482 {
483   /* Don't print error messages with bogus function prototypes.  */
484   if (inhibit_error_function_printing)
485     return;
486
487   if (current_function_decl != NULL
488       && DECL_CONTEXT (current_function_decl) != last_error_function_context)
489     {
490       if (file)
491         fprintf (stderr, "%s: ", file);
492
493       last_error_function_context = DECL_CONTEXT (current_function_decl);
494       fprintf (stderr, "In class '%s':\n",
495                lang_printable_name (last_error_function_context, 0));
496     }
497   if (last_error_function != current_function_decl)
498     {
499       if (file)
500         fprintf (stderr, "%s: ", file);
501
502       if (current_function_decl == NULL)
503         fprintf (stderr, "At top level:\n");
504       else
505         {
506           const char *name = lang_printable_name (current_function_decl, 2);
507           fprintf (stderr, "In %s '%s':\n",
508                    (DECL_CONSTRUCTOR_P (current_function_decl) ? "constructor"
509                     : "method"),
510                    name);
511         }
512
513       last_error_function = current_function_decl;
514     }
515
516 }
517
518 /* Called to install the PRINT_ERROR_FUNCTION hook differently
519    according to LEVEL. LEVEL is 1 during early parsing, when function
520    prototypes aren't fully resolved. java_print_error_function is set
521    so it doesn't print incomplete function prototypes. When LEVEL is
522    2, function prototypes are fully resolved and can be printed when
523    reporting errors.  */
524
525 void
526 lang_init_source (int level)
527 {
528   inhibit_error_function_printing = (level == 1);
529 }
530
531 static unsigned int
532 java_option_lang_mask (void)
533 {
534   return CL_Java;
535 }
536
537 static void
538 java_init_options (unsigned int decoded_options_count ATTRIBUTE_UNUSED,
539                    struct cl_decoded_option *decoded_options ATTRIBUTE_UNUSED)
540 {
541   flag_bounds_check = 1;
542   flag_exceptions = 1;
543   flag_non_call_exceptions = 1;
544
545   /* In Java floating point operations never trap.  */
546   flag_trapping_math = 0;
547
548   /* In Java arithmetic overflow always wraps around.  */
549   flag_wrapv = 1;
550
551   /* Java requires left-to-right evaluation of subexpressions.  */
552   flag_evaluation_order = 1;
553
554   jcf_path_init ();
555 }
556
557 /* Post-switch processing.  */
558 static bool
559 java_post_options (const char **pfilename)
560 {
561   const char *filename = *pfilename;
562
563   /* Excess precision other than "fast" requires front-end
564      support.  */
565   if (flag_excess_precision_cmdline == EXCESS_PRECISION_STANDARD
566       && TARGET_FLT_EVAL_METHOD_NON_DEFAULT)
567     sorry ("-fexcess-precision=standard for Java");
568   flag_excess_precision_cmdline = EXCESS_PRECISION_FAST;
569
570   /* An absolute requirement: if we're not using indirect dispatch, we
571      must always verify everything.  */
572   if (! flag_indirect_dispatch)
573     flag_verify_invocations = true;
574
575   if (flag_reduced_reflection)
576     {
577       if (flag_indirect_dispatch)
578         error ("-findirect-dispatch is incompatible "
579                "with -freduced-reflection");
580       if (flag_jni)
581         error ("-fjni is incompatible with -freduced-reflection");
582     }
583
584   /* Open input file.  */
585
586   if (filename == 0 || !strcmp (filename, "-"))
587     {
588       finput = stdin;
589       filename = "stdin";
590
591       if (dependency_tracking)
592         error ("can't do dependency tracking with input from stdin");
593     }
594   else
595     {
596       if (dependency_tracking)
597         {
598           const char *dot;
599
600           /* If the target is set and the output filename is set, then
601              there's no processing to do here.  Otherwise we must
602              compute one or the other.  */
603           if (! ((dependency_tracking & DEPEND_TARGET_SET)
604                  && (dependency_tracking & DEPEND_FILE_ALREADY_SET)))
605             {
606               dot = strrchr (filename, '.');
607               if (dot == NULL)
608                 error ("couldn't determine target name for dependency tracking");
609               else
610                 {
611                   char *buf = XNEWVEC (char, dot - filename +
612                                        3 + sizeof (TARGET_OBJECT_SUFFIX));
613                   strncpy (buf, filename, dot - filename);
614
615                   /* If emitting class files, we might have multiple
616                      targets.  The class generation code takes care of
617                      registering them.  Otherwise we compute the
618                      target name here.  */
619                   if ((dependency_tracking & DEPEND_TARGET_SET))
620                     ; /* Nothing.  */
621                   else
622                     {
623                       strcpy (buf + (dot - filename), TARGET_OBJECT_SUFFIX);
624                       jcf_dependency_set_target (buf);
625                     }
626
627                   if ((dependency_tracking & DEPEND_FILE_ALREADY_SET))
628                     ; /* Nothing.  */
629                   else if ((dependency_tracking & DEPEND_SET_FILE))
630                     {
631                       strcpy (buf + (dot - filename), ".d");
632                       jcf_dependency_set_dep_file (buf);
633                     }
634                   else
635                     jcf_dependency_set_dep_file ("-");
636
637                   free (buf);
638                 }
639             }
640         }
641     }
642   linemap_add (line_table, LC_ENTER, false, filename, 0);
643   linemap_add (line_table, LC_RENAME, false, "<built-in>", 0);
644
645   /* Initialize the compiler back end.  */
646   return false;
647 }
648
649 /* Return either DECL or its known constant value (if it has one).  */
650
651 tree
652 decl_constant_value (tree decl)
653 {
654   if (/* Don't change a variable array bound or initial value to a constant
655          in a place where a variable is invalid.  */
656       current_function_decl != 0
657       && ! TREE_THIS_VOLATILE (decl)
658       && TREE_READONLY (decl)
659       && DECL_INITIAL (decl) != 0
660       && TREE_CODE (DECL_INITIAL (decl)) != ERROR_MARK
661       /* This is invalid if initial value is not constant.
662          If it has either a function call, a memory reference,
663          or a variable, then re-evaluating it could give different results.  */
664       && TREE_CONSTANT (DECL_INITIAL (decl))
665       /* Check for cases where this is sub-optimal, even though valid.  */
666       && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR)
667     return DECL_INITIAL (decl);
668   return decl;
669 }
670
671 /* Every call to a static constructor has an associated boolean
672    variable which is in the outermost scope of the calling method.
673    This variable is used to avoid multiple calls to the static
674    constructor for each class.
675
676    It looks something like this:
677
678    foo ()
679    {
680       boolean dummy = OtherClass.is_initialized;
681
682      ...
683
684      if (! dummy)
685        OtherClass.initialize();
686
687      ... use OtherClass.data ...
688    }
689
690    Each of these boolean variables has an entry in the
691    DECL_FUNCTION_INIT_TEST_TABLE of a method.  When inlining a method
692    we must merge the DECL_FUNCTION_INIT_TEST_TABLE from the function
693    being inlined and create the boolean variables in the outermost
694    scope of the method being inlined into.  */
695
696 /* Create a mapping from a boolean variable in a method being inlined
697    to one in the scope of the method being inlined into.  */
698
699 static int
700 merge_init_test_initialization (void **entry, void *x)
701 {
702   struct treetreehash_entry *ite = (struct treetreehash_entry *) *entry;
703   splay_tree decl_map = (splay_tree)x;
704   splay_tree_node n;
705   tree *init_test_decl;
706
707   /* See if we have remapped this declaration.  If we haven't there's
708      a bug in the inliner.  */
709   n = splay_tree_lookup (decl_map, (splay_tree_key) ite->value);
710   gcc_assert (n);
711
712   /* Create a new entry for the class and its remapped boolean
713      variable.  If we already have a mapping for this class we've
714      already initialized it, so don't overwrite the value.  */
715   init_test_decl = java_treetreehash_new
716     (DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl), ite->key);
717   if (!*init_test_decl)
718     *init_test_decl = (tree)n->value;
719
720   /* This fixes a weird case.
721
722   The front end assumes that once we have called a method that
723   initializes some class, we can assume the class is initialized.  It
724   does this by setting the DECL_INITIAL of the init_test_decl for that
725   class, and no initializations are emitted for that class.
726
727   However, what if the method that is supposed to do the initialization
728   is itself inlined in the caller?  When expanding the called method
729   we'll assume that the class initialization has already been done,
730   because the DECL_INITIAL of the init_test_decl is set.
731
732   To fix this we remove the DECL_INITIAL (in the caller scope) of all
733   the init_test_decls corresponding to classes initialized by the
734   inlined method.  This makes the caller no longer assume that the
735   method being inlined does any class initializations.  */
736   DECL_INITIAL (*init_test_decl) = NULL;
737
738   return true;
739 }
740
741 /* Merge the DECL_FUNCTION_INIT_TEST_TABLE from the function we're
742    inlining.  */
743
744 void
745 java_inlining_merge_static_initializers (tree fn, void *decl_map)
746 {
747   htab_traverse
748     (DECL_FUNCTION_INIT_TEST_TABLE (fn),
749      merge_init_test_initialization, decl_map);
750 }
751
752 /* Lookup a DECL_FUNCTION_INIT_TEST_TABLE entry in the method we're
753    inlining into.  If we already have a corresponding entry in that
754    class we don't need to create another one, so we create a mapping
755    from the variable in the inlined class to the corresponding
756    pre-existing one.  */
757
758 static int
759 inline_init_test_initialization (void **entry, void *x)
760 {
761   struct treetreehash_entry *ite = (struct treetreehash_entry *) *entry;
762   splay_tree decl_map = (splay_tree)x;
763
764   tree h = java_treetreehash_find
765     (DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl), ite->key);
766   if (! h)
767     return true;
768   splay_tree_insert (decl_map,
769                      (splay_tree_key) ite->value,
770                      (splay_tree_value) h);
771   return true;
772 }
773
774 /* Look up the boolean variables in the DECL_FUNCTION_INIT_TEST_TABLE
775    of a method being inlined.  For each hone, if we already have a
776    variable associated with the same class in the method being inlined
777    into, create a new mapping for it.  */
778
779 void
780 java_inlining_map_static_initializers (tree fn, void *decl_map)
781 {
782   htab_traverse
783     (DECL_FUNCTION_INIT_TEST_TABLE (fn),
784      inline_init_test_initialization, decl_map);
785 }
786
787 /* Avoid voluminous output for deep recursion of compound exprs.  */
788
789 static void
790 dump_compound_expr (dump_info_p di, tree t)
791 {
792   int i;
793
794   for (i=0; i<2; i++)
795     {
796       switch (TREE_CODE (TREE_OPERAND (t, i)))
797         {
798         case COMPOUND_EXPR:
799           dump_compound_expr (di, TREE_OPERAND (t, i));
800           break;
801
802         default:
803           dump_child ("expr", TREE_OPERAND (t, i));
804         }
805     }
806 }
807
808 static bool
809 java_dump_tree (void *dump_info, tree t)
810 {
811   enum tree_code code;
812   dump_info_p di = (dump_info_p) dump_info;
813
814   /* Figure out what kind of node this is.  */
815   code = TREE_CODE (t);
816
817   switch (code)
818     {
819     case FUNCTION_DECL:
820       dump_child ("args", DECL_ARGUMENTS (t));
821       if (DECL_EXTERNAL (t))
822         dump_string (di, "undefined");
823       if (TREE_PUBLIC (t))
824         dump_string (di, "extern");
825       else
826         dump_string (di, "static");
827       if (DECL_LANG_SPECIFIC (t) && !dump_flag (di, TDF_SLIM, t))
828         dump_child ("inline body", DECL_SAVED_TREE (t));
829       return true;
830
831     case RETURN_EXPR:
832       dump_child ("expr", TREE_OPERAND (t, 0));
833       return true;
834
835     case GOTO_EXPR:
836       dump_child ("goto", TREE_OPERAND (t, 0));
837       return true;
838
839     case LABEL_EXPR:
840       dump_child ("label", TREE_OPERAND (t, 0));
841       return true;
842
843     case BLOCK:
844       if (BLOCK_EXPR_BODY (t))
845         {
846           tree local = BLOCK_VARS (t);
847           while (local)
848             {
849               tree next = TREE_CHAIN (local);
850               dump_child ("var", local);
851               local = next;
852             }
853
854           {
855             tree block = BLOCK_EXPR_BODY (t);
856             dump_child ("body", block);
857             block = TREE_CHAIN (block);
858           }
859         }
860       return true;
861
862     case COMPOUND_EXPR:
863       if (!dump_flag (di, TDF_SLIM, t))
864         return false;
865       dump_compound_expr (di, t);
866       return true;
867
868     default:
869       break;
870     }
871   return false;
872 }
873
874 /* Java calls can't, in general, be sibcalls because we need an
875    accurate stack trace in order to guarantee correct operation of
876    methods such as Class.forName(String) and
877    SecurityManager.getClassContext().  */
878
879 static bool
880 java_decl_ok_for_sibcall (const_tree decl)
881 {
882   return (decl != NULL && DECL_CONTEXT (decl) == output_class
883           && !DECL_UNINLINABLE (decl));
884 }
885
886 static enum classify_record
887 java_classify_record (tree type)
888 {
889   if (! CLASS_P (type))
890     return RECORD_IS_STRUCT;
891
892   if (CLASS_INTERFACE (TYPE_NAME (type)))
893     return RECORD_IS_INTERFACE;
894
895   return RECORD_IS_CLASS;
896 }
897
898 static GTY(()) tree java_eh_personality_decl;
899
900 static tree
901 java_eh_personality (void)
902 {
903   if (!java_eh_personality_decl)
904     java_eh_personality_decl
905       = build_personality_function (USING_SJLJ_EXCEPTIONS
906                                     ? "__gcj_personality_sj0"
907                                     : "__gcj_personality_v0");
908
909   return java_eh_personality_decl;
910 }
911
912 #include "gt-java-lang.h"