* config/pa/linux-atomic.c (__kernel_cmpxchg): Reorder arguments to
[official-gcc.git] / gcc / java / lang.c
blobd2b519c6c8ef1d0b953f0afebb3b952fed902723
1 /* Java(TM) language-specific utility routines.
2 Copyright (C) 1996-2015 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>.
20 Java and all Java-based marks are trademarks or registered trademarks
21 of Sun Microsystems, Inc. in the United States and other countries.
22 The Free Software Foundation is independent of Sun Microsystems, Inc. */
24 /* Hacked by Per Bothner <bothner@cygnus.com> February 1996. */
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "tm.h"
30 #include "alias.h"
31 #include "symtab.h"
32 #include "tree.h"
33 #include "java-tree.h"
34 #include "jcf.h"
35 #include "langhooks.h"
36 #include "langhooks-def.h"
37 #include "flags.h"
38 #include "diagnostic.h"
39 #include "tree-inline.h"
40 #include "splay-tree.h"
41 #include "tree-dump.h"
42 #include "opts.h"
43 #include "options.h"
44 #include "target.h"
45 #include "context.h"
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_struct (struct gcc_options *);
51 static void java_init_options (unsigned int, struct cl_decoded_option *);
52 static bool java_post_options (const char **);
54 static bool java_handle_option (size_t, const char *, int, int, location_t,
55 const struct cl_option_handlers *);
56 static void put_decl_string (const char *, int);
57 static void put_decl_node (tree, int);
58 static void java_print_error_function (diagnostic_context *, const char *,
59 diagnostic_info *);
60 static bool java_dump_tree (void *, tree);
61 static void dump_compound_expr (dump_info_p, tree);
62 static bool java_decl_ok_for_sibcall (const_tree);
64 static enum classify_record java_classify_record (tree type);
66 static tree java_eh_personality (void);
68 #ifndef TARGET_OBJECT_SUFFIX
69 # define TARGET_OBJECT_SUFFIX ".o"
70 #endif
72 /* Table of machine-independent attributes. */
73 const struct attribute_spec java_attribute_table[] =
75 { "nonnull", 0, -1, false, true, true,
76 NULL, false },
77 { NULL, 0, 0, false, false, false, NULL, false }
80 /* Used to avoid printing error messages with bogus function
81 prototypes. Starts out false. */
82 static bool inhibit_error_function_printing;
84 const char *resource_name;
86 /* When nonzero, -Wall was turned on. */
87 int flag_wall = 0;
89 /* When nonzero, report use of deprecated classes, methods, or fields. */
90 int flag_deprecated = 1;
92 /* When zero, don't optimize static class initialization. This flag shouldn't
93 be tested alone, use STATIC_CLASS_INITIALIZATION_OPTIMIZATION_P instead. */
94 /* FIXME: Make this work with gimplify. */
95 /* int flag_optimize_sci = 0; */
97 /* Don't attempt to verify invocations. */
98 int flag_verify_invocations = 0;
100 /* When nonzero, print extra version information. */
101 static int v_flag = 0;
103 JCF *current_jcf;
105 /* Variable controlling how dependency tracking is enabled in
106 java_init. */
107 static int dependency_tracking = 0;
109 /* Flag values for DEPENDENCY_TRACKING. */
110 #define DEPEND_SET_FILE 1
111 #define DEPEND_ENABLE 2
112 #define DEPEND_TARGET_SET 4
113 #define DEPEND_FILE_ALREADY_SET 8
115 struct GTY(()) language_function {
116 int unused;
119 #undef LANG_HOOKS_NAME
120 #define LANG_HOOKS_NAME "GNU Java"
121 #undef LANG_HOOKS_INIT
122 #define LANG_HOOKS_INIT java_init
123 #undef LANG_HOOKS_FINISH
124 #define LANG_HOOKS_FINISH java_finish
125 #undef LANG_HOOKS_OPTION_LANG_MASK
126 #define LANG_HOOKS_OPTION_LANG_MASK java_option_lang_mask
127 #undef LANG_HOOKS_INIT_OPTIONS_STRUCT
128 #define LANG_HOOKS_INIT_OPTIONS_STRUCT java_init_options_struct
129 #undef LANG_HOOKS_INIT_OPTIONS
130 #define LANG_HOOKS_INIT_OPTIONS java_init_options
131 #undef LANG_HOOKS_HANDLE_OPTION
132 #define LANG_HOOKS_HANDLE_OPTION java_handle_option
133 #undef LANG_HOOKS_POST_OPTIONS
134 #define LANG_HOOKS_POST_OPTIONS java_post_options
135 #undef LANG_HOOKS_PARSE_FILE
136 #define LANG_HOOKS_PARSE_FILE java_parse_file
137 #undef LANG_HOOKS_DUP_LANG_SPECIFIC_DECL
138 #define LANG_HOOKS_DUP_LANG_SPECIFIC_DECL java_dup_lang_specific_decl
139 #undef LANG_HOOKS_DECL_PRINTABLE_NAME
140 #define LANG_HOOKS_DECL_PRINTABLE_NAME lang_printable_name
141 #undef LANG_HOOKS_PRINT_ERROR_FUNCTION
142 #define LANG_HOOKS_PRINT_ERROR_FUNCTION java_print_error_function
144 #undef LANG_HOOKS_TYPE_FOR_MODE
145 #define LANG_HOOKS_TYPE_FOR_MODE java_type_for_mode
146 #undef LANG_HOOKS_TYPE_FOR_SIZE
147 #define LANG_HOOKS_TYPE_FOR_SIZE java_type_for_size
148 #undef LANG_HOOKS_CLASSIFY_RECORD
149 #define LANG_HOOKS_CLASSIFY_RECORD java_classify_record
151 #undef LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN
152 #define LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN java_dump_tree
154 #undef LANG_HOOKS_GIMPLIFY_EXPR
155 #define LANG_HOOKS_GIMPLIFY_EXPR java_gimplify_expr
157 #undef LANG_HOOKS_DECL_OK_FOR_SIBCALL
158 #define LANG_HOOKS_DECL_OK_FOR_SIBCALL java_decl_ok_for_sibcall
160 #undef LANG_HOOKS_SET_DECL_ASSEMBLER_NAME
161 #define LANG_HOOKS_SET_DECL_ASSEMBLER_NAME java_mangle_decl
163 #undef LANG_HOOKS_ATTRIBUTE_TABLE
164 #define LANG_HOOKS_ATTRIBUTE_TABLE java_attribute_table
166 #undef LANG_HOOKS_EH_PERSONALITY
167 #define LANG_HOOKS_EH_PERSONALITY java_eh_personality
169 #undef LANG_HOOKS_EH_USE_CXA_END_CLEANUP
170 #define LANG_HOOKS_EH_USE_CXA_END_CLEANUP true
172 /* Each front end provides its own. */
173 struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
176 * process java-specific compiler command-line options
177 * return false, but do not complain if the option is not recognized.
179 static bool
180 java_handle_option (size_t scode, const char *arg, int value,
181 int kind ATTRIBUTE_UNUSED, location_t loc ATTRIBUTE_UNUSED,
182 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED)
184 enum opt_code code = (enum opt_code) scode;
186 switch (code)
188 case OPT_I:
189 jcf_path_include_arg (arg);
190 break;
192 case OPT_M:
193 jcf_dependency_init (1);
194 dependency_tracking |= DEPEND_ENABLE;
195 break;
197 case OPT_MD_:
198 jcf_dependency_init (1);
199 dependency_tracking |= DEPEND_SET_FILE | DEPEND_ENABLE;
200 break;
202 case OPT_MF:
203 jcf_dependency_set_dep_file (arg);
204 dependency_tracking |= DEPEND_FILE_ALREADY_SET;
205 break;
207 case OPT_MM:
208 jcf_dependency_init (0);
209 dependency_tracking |= DEPEND_ENABLE;
210 break;
212 case OPT_MMD_:
213 jcf_dependency_init (0);
214 dependency_tracking |= DEPEND_SET_FILE | DEPEND_ENABLE;
215 break;
217 case OPT_MP:
218 jcf_dependency_print_dummies ();
219 break;
221 case OPT_MT:
222 jcf_dependency_set_target (arg);
223 dependency_tracking |= DEPEND_TARGET_SET;
224 break;
226 case OPT_Wall:
227 flag_wall = value;
228 /* When -Wall given, enable -Wunused. We do this because the C
229 compiler does it, and people expect it. */
230 warn_unused = value;
231 break;
233 case OPT_fenable_assertions_:
234 add_enable_assert (arg, value);
235 break;
237 case OPT_fenable_assertions:
238 add_enable_assert ("", value);
239 break;
241 case OPT_fdisable_assertions_:
242 add_enable_assert (arg, !value);
243 break;
245 case OPT_fdisable_assertions:
246 add_enable_assert ("", !value);
247 break;
249 case OPT_fassume_compiled_:
250 add_assume_compiled (arg, !value);
251 break;
253 case OPT_fassume_compiled:
254 add_assume_compiled ("", !value);
255 break;
257 case OPT_fbootclasspath_:
258 jcf_path_bootclasspath_arg (arg);
259 break;
261 case OPT_faux_classpath:
262 case OPT_fclasspath_:
263 jcf_path_classpath_arg (arg);
264 break;
266 case OPT_fcompile_resource_:
267 resource_name = arg;
268 break;
270 case OPT_fdump_:
271 if (!g->get_dumps ()->dump_switch_p (arg))
272 return false;
273 break;
275 case OPT_fencoding_:
276 /* Nothing. */
277 break;
279 case OPT_fextdirs_:
280 jcf_path_extdirs_arg (arg);
281 break;
283 case OPT_foutput_class_dir_:
284 /* FIXME: remove; this is handled by ecj1 now. */
285 break;
287 case OPT_version:
288 v_flag = 1;
289 break;
291 case OPT_fsource_filename_:
292 java_read_sourcefilenames (arg);
293 break;
295 default:
296 if (cl_options[code].flags & CL_Java)
297 break;
298 gcc_unreachable ();
301 return true;
304 /* Global open file. */
305 FILE *finput;
307 static bool
308 java_init (void)
310 /* FIXME: Indirect dispatch isn't yet compatible with static class
311 init optimization. */
312 if (flag_indirect_dispatch)
313 always_initialize_class_p = true;
315 if (!flag_indirect_dispatch)
316 flag_indirect_classes = false;
318 jcf_path_seal (v_flag);
320 java_init_decl_processing ();
322 using_eh_for_cleanups ();
324 return true;
327 static void
328 java_finish (void)
330 jcf_dependency_write ();
333 /* Buffer used by lang_printable_name. */
334 static char *decl_buf = NULL;
336 /* Allocated size of decl_buf. */
337 static int decl_buflen = 0;
339 /* Length of used part of decl_buf; position for next character. */
340 static int decl_bufpos = 0;
342 /* Append the string STR to decl_buf.
343 It length is given by LEN; -1 means the string is nul-terminated. */
345 static void
346 put_decl_string (const char *str, int len)
348 if (len < 0)
349 len = strlen (str);
350 if (decl_bufpos + len >= decl_buflen)
352 if (decl_buf == NULL)
354 decl_buflen = len + 100;
355 decl_buf = XNEWVEC (char, decl_buflen);
357 else
359 decl_buflen *= 2;
360 decl_buf = XRESIZEVAR (char, decl_buf, decl_buflen);
363 strcpy (decl_buf + decl_bufpos, str);
364 decl_bufpos += len;
367 /* Append to decl_buf a printable name for NODE.
368 Depending on VERBOSITY, more information about NODE
369 is printed. Read the comments of decl_printable_name in
370 langhooks.h for more. */
372 static void
373 put_decl_node (tree node, int verbosity)
375 int was_pointer = 0;
376 if (TREE_CODE (node) == POINTER_TYPE)
378 node = TREE_TYPE (node);
379 was_pointer = 1;
381 if (DECL_P (node) && DECL_NAME (node) != NULL_TREE)
383 if (TREE_CODE (node) == FUNCTION_DECL)
385 if (verbosity == 0 && DECL_NAME (node))
386 /* We have been instructed to just print the bare name
387 of the function. */
389 put_decl_node (DECL_NAME (node), 0);
390 return;
393 /* We want to print the type the DECL belongs to. We don't do
394 that when we handle constructors. */
395 if (! DECL_CONSTRUCTOR_P (node)
396 && ! DECL_ARTIFICIAL (node) && DECL_CONTEXT (node)
397 /* We want to print qualified DECL names only
398 if verbosity is higher than 1. */
399 && verbosity >= 1)
401 put_decl_node (TREE_CODE (DECL_CONTEXT (node)) == FUNCTION_DECL
402 ? DECL_CONTEXT (node)
403 : TYPE_NAME (DECL_CONTEXT (node)),
404 verbosity);
405 put_decl_string (".", 1);
407 if (! DECL_CONSTRUCTOR_P (node))
408 put_decl_node (DECL_NAME (node), verbosity);
409 if (TREE_TYPE (node) != NULL_TREE
410 /* We want to print function parameters only if verbosity
411 is higher than 2. */
412 && verbosity >= 2)
414 int i = 0;
415 tree args = TYPE_ARG_TYPES (TREE_TYPE (node));
416 if (TREE_CODE (TREE_TYPE (node)) == METHOD_TYPE)
417 args = TREE_CHAIN (args);
418 put_decl_string ("(", 1);
419 for ( ; args != NULL_TREE && args != end_params_node;
420 args = TREE_CHAIN (args), i++)
422 if (i > 0)
423 put_decl_string (",", 1);
424 put_decl_node (TREE_VALUE (args), verbosity);
426 put_decl_string (")", 1);
429 else
430 put_decl_node (DECL_NAME (node), verbosity);
432 else if (TYPE_P (node) && TYPE_NAME (node) != NULL_TREE)
434 if (TREE_CODE (node) == RECORD_TYPE && TYPE_ARRAY_P (node)
435 /* Print detailed array information only if verbosity is higher
436 than 2. */
437 && verbosity >= 2)
439 put_decl_node (TYPE_ARRAY_ELEMENT (node), verbosity);
440 put_decl_string("[]", 2);
442 else if (node == promoted_byte_type_node)
443 put_decl_string ("byte", 4);
444 else if (node == promoted_short_type_node)
445 put_decl_string ("short", 5);
446 else if (node == promoted_char_type_node)
447 put_decl_string ("char", 4);
448 else if (node == promoted_boolean_type_node)
449 put_decl_string ("boolean", 7);
450 else if (node == void_type_node && was_pointer)
451 put_decl_string ("null", 4);
452 else
453 put_decl_node (TYPE_NAME (node), verbosity);
455 else if (TREE_CODE (node) == IDENTIFIER_NODE)
456 put_decl_string (IDENTIFIER_POINTER (node), IDENTIFIER_LENGTH (node));
457 else
458 put_decl_string ("<unknown>", -1);
461 /* Return a user-friendly name for DECL.
462 The resulting string is only valid until the next call.
463 The value of the hook decl_printable_name is this function,
464 which is also called directly by java_print_error_function. */
466 const char *
467 lang_printable_name (tree decl, int v)
469 decl_bufpos = 0;
470 put_decl_node (decl, v);
471 put_decl_string ("", 1);
472 return decl_buf;
475 /* Print on stderr the current class and method context. This function
476 is the value of the hook print_error_function. */
478 static GTY(()) tree last_error_function_context;
479 static GTY(()) tree last_error_function;
480 static void
481 java_print_error_function (diagnostic_context *context ATTRIBUTE_UNUSED,
482 const char *file,
483 diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
485 /* Don't print error messages with bogus function prototypes. */
486 if (inhibit_error_function_printing)
487 return;
489 if (current_function_decl != NULL
490 && DECL_CONTEXT (current_function_decl) != NULL
491 && DECL_CONTEXT (current_function_decl) != last_error_function_context)
493 if (file)
494 fprintf (stderr, "%s: ", file);
496 last_error_function_context = DECL_CONTEXT (current_function_decl);
497 fprintf (stderr, "In class '%s':\n",
498 lang_printable_name (last_error_function_context, 0));
500 if (last_error_function != current_function_decl)
502 if (file)
503 fprintf (stderr, "%s: ", file);
505 if (current_function_decl == NULL)
506 fprintf (stderr, "At top level:\n");
507 else
509 const char *name = lang_printable_name (current_function_decl, 2);
510 fprintf (stderr, "In %s '%s':\n",
511 (DECL_CONSTRUCTOR_P (current_function_decl) ? "constructor"
512 : "method"),
513 name);
516 last_error_function = current_function_decl;
521 /* Called to install the PRINT_ERROR_FUNCTION hook differently
522 according to LEVEL. LEVEL is 1 during early parsing, when function
523 prototypes aren't fully resolved. java_print_error_function is set
524 so it doesn't print incomplete function prototypes. When LEVEL is
525 2, function prototypes are fully resolved and can be printed when
526 reporting errors. */
528 void
529 lang_init_source (int level)
531 inhibit_error_function_printing = (level == 1);
534 static unsigned int
535 java_option_lang_mask (void)
537 return CL_Java;
540 /* Initialize options structure OPTS. */
542 static void
543 java_init_options_struct (struct gcc_options *opts)
545 opts->x_flag_bounds_check = 1;
546 opts->x_flag_exceptions = 1;
547 opts->x_flag_non_call_exceptions = 1;
549 /* In Java floating point operations never trap. */
550 opts->x_flag_trapping_math = 0;
551 opts->frontend_set_flag_trapping_math = true;
553 /* In Java arithmetic overflow always wraps around. */
554 opts->x_flag_wrapv = 1;
556 /* Java requires left-to-right evaluation of subexpressions. */
557 opts->x_flag_evaluation_order = 1;
559 /* Java catches NULL pointer exceptions, thus we can not necessarily
560 rely on a pointer having a non-NULL value after a dereference. */
561 opts->x_flag_delete_null_pointer_checks = 0;
564 static void
565 java_init_options (unsigned int decoded_options_count ATTRIBUTE_UNUSED,
566 struct cl_decoded_option *decoded_options ATTRIBUTE_UNUSED)
568 jcf_path_init ();
571 /* Post-switch processing. */
572 static bool
573 java_post_options (const char **pfilename)
575 const char *filename = *pfilename;
577 /* Excess precision other than "fast" requires front-end
578 support. */
579 if (flag_excess_precision_cmdline == EXCESS_PRECISION_STANDARD
580 && TARGET_FLT_EVAL_METHOD_NON_DEFAULT)
581 sorry ("-fexcess-precision=standard for Java");
582 flag_excess_precision_cmdline = EXCESS_PRECISION_FAST;
584 /* An absolute requirement: if we're not using indirect dispatch, we
585 must always verify everything. */
586 if (! flag_indirect_dispatch)
587 flag_verify_invocations = true;
589 if (flag_reduced_reflection)
591 if (flag_indirect_dispatch)
592 error ("-findirect-dispatch is incompatible "
593 "with -freduced-reflection");
594 if (flag_jni)
595 error ("-fjni is incompatible with -freduced-reflection");
598 /* Open input file. */
600 if (filename == 0 || !strcmp (filename, "-"))
602 finput = stdin;
603 filename = "stdin";
605 if (dependency_tracking)
606 error ("can%'t do dependency tracking with input from stdin");
608 else
610 if (dependency_tracking)
612 const char *dot;
614 /* If the target is set and the output filename is set, then
615 there's no processing to do here. Otherwise we must
616 compute one or the other. */
617 if (! ((dependency_tracking & DEPEND_TARGET_SET)
618 && (dependency_tracking & DEPEND_FILE_ALREADY_SET)))
620 dot = strrchr (filename, '.');
621 if (dot == NULL)
622 error ("couldn%'t determine target name for dependency tracking");
623 else
625 char *buf = XNEWVEC (char, dot - filename +
626 3 + sizeof (TARGET_OBJECT_SUFFIX));
627 strncpy (buf, filename, dot - filename);
629 /* If emitting class files, we might have multiple
630 targets. The class generation code takes care of
631 registering them. Otherwise we compute the
632 target name here. */
633 if ((dependency_tracking & DEPEND_TARGET_SET))
634 ; /* Nothing. */
635 else
637 strcpy (buf + (dot - filename), TARGET_OBJECT_SUFFIX);
638 jcf_dependency_set_target (buf);
641 if ((dependency_tracking & DEPEND_FILE_ALREADY_SET))
642 ; /* Nothing. */
643 else if ((dependency_tracking & DEPEND_SET_FILE))
645 strcpy (buf + (dot - filename), ".d");
646 jcf_dependency_set_dep_file (buf);
648 else
649 jcf_dependency_set_dep_file ("-");
651 free (buf);
656 linemap_add (line_table, LC_ENTER, false, filename, 0);
657 linemap_add (line_table, LC_RENAME, false, "<built-in>", 0);
659 /* Initialize the compiler back end. */
660 return false;
663 /* Return either DECL or its known constant value (if it has one). */
665 tree
666 decl_constant_value (tree decl)
668 if (/* Don't change a variable array bound or initial value to a constant
669 in a place where a variable is invalid. */
670 current_function_decl != 0
671 && ! TREE_THIS_VOLATILE (decl)
672 && TREE_READONLY (decl)
673 && DECL_INITIAL (decl) != 0
674 && TREE_CODE (DECL_INITIAL (decl)) != ERROR_MARK
675 /* This is invalid if initial value is not constant.
676 If it has either a function call, a memory reference,
677 or a variable, then re-evaluating it could give different results. */
678 && TREE_CONSTANT (DECL_INITIAL (decl))
679 /* Check for cases where this is sub-optimal, even though valid. */
680 && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR)
681 return DECL_INITIAL (decl);
682 return decl;
685 /* Every call to a static constructor has an associated boolean
686 variable which is in the outermost scope of the calling method.
687 This variable is used to avoid multiple calls to the static
688 constructor for each class.
690 It looks something like this:
692 foo ()
694 boolean dummy = OtherClass.is_initialized;
698 if (! dummy)
699 OtherClass.initialize();
701 ... use OtherClass.data ...
704 Each of these boolean variables has an entry in the
705 DECL_FUNCTION_INIT_TEST_TABLE of a method. When inlining a method
706 we must merge the DECL_FUNCTION_INIT_TEST_TABLE from the function
707 being inlined and create the boolean variables in the outermost
708 scope of the method being inlined into. */
710 /* Create a mapping from a boolean variable in a method being inlined
711 to one in the scope of the method being inlined into. */
714 merge_init_test_initialization (treetreehash_entry **entry, void *x)
716 struct treetreehash_entry *ite = *entry;
717 splay_tree decl_map = (splay_tree)x;
718 splay_tree_node n;
719 tree *init_test_decl;
721 /* See if we have remapped this declaration. If we haven't there's
722 a bug in the inliner. */
723 n = splay_tree_lookup (decl_map, (splay_tree_key) ite->value);
724 gcc_assert (n);
726 /* Create a new entry for the class and its remapped boolean
727 variable. If we already have a mapping for this class we've
728 already initialized it, so don't overwrite the value. */
729 init_test_decl = java_treetreehash_new
730 (DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl), ite->key);
731 if (!*init_test_decl)
732 *init_test_decl = (tree)n->value;
734 /* This fixes a weird case.
736 The front end assumes that once we have called a method that
737 initializes some class, we can assume the class is initialized. It
738 does this by setting the DECL_INITIAL of the init_test_decl for that
739 class, and no initializations are emitted for that class.
741 However, what if the method that is supposed to do the initialization
742 is itself inlined in the caller? When expanding the called method
743 we'll assume that the class initialization has already been done,
744 because the DECL_INITIAL of the init_test_decl is set.
746 To fix this we remove the DECL_INITIAL (in the caller scope) of all
747 the init_test_decls corresponding to classes initialized by the
748 inlined method. This makes the caller no longer assume that the
749 method being inlined does any class initializations. */
750 DECL_INITIAL (*init_test_decl) = NULL;
752 return true;
755 /* Merge the DECL_FUNCTION_INIT_TEST_TABLE from the function we're
756 inlining. */
758 void
759 java_inlining_merge_static_initializers (tree fn, void *decl_map)
761 DECL_FUNCTION_INIT_TEST_TABLE (fn)
762 ->traverse<void *, merge_init_test_initialization> (decl_map);
765 /* Lookup a DECL_FUNCTION_INIT_TEST_TABLE entry in the method we're
766 inlining into. If we already have a corresponding entry in that
767 class we don't need to create another one, so we create a mapping
768 from the variable in the inlined class to the corresponding
769 pre-existing one. */
772 inline_init_test_initialization (treetreehash_entry **entry, void *x)
774 struct treetreehash_entry *ite = *entry;
775 splay_tree decl_map = (splay_tree)x;
777 tree h = java_treetreehash_find
778 (DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl), ite->key);
779 if (! h)
780 return true;
781 splay_tree_insert (decl_map,
782 (splay_tree_key) ite->value,
783 (splay_tree_value) h);
784 return true;
787 /* Look up the boolean variables in the DECL_FUNCTION_INIT_TEST_TABLE
788 of a method being inlined. For each hone, if we already have a
789 variable associated with the same class in the method being inlined
790 into, create a new mapping for it. */
792 void
793 java_inlining_map_static_initializers (tree fn, void *decl_map)
795 DECL_FUNCTION_INIT_TEST_TABLE (fn)
796 ->traverse<void *, inline_init_test_initialization> (decl_map);
799 /* Avoid voluminous output for deep recursion of compound exprs. */
801 static void
802 dump_compound_expr (dump_info_p di, tree t)
804 int i;
806 for (i=0; i<2; i++)
808 switch (TREE_CODE (TREE_OPERAND (t, i)))
810 case COMPOUND_EXPR:
811 dump_compound_expr (di, TREE_OPERAND (t, i));
812 break;
814 default:
815 dump_child ("expr", TREE_OPERAND (t, i));
820 static bool
821 java_dump_tree (void *dump_info, tree t)
823 enum tree_code code;
824 dump_info_p di = (dump_info_p) dump_info;
826 /* Figure out what kind of node this is. */
827 code = TREE_CODE (t);
829 switch (code)
831 case FUNCTION_DECL:
832 dump_child ("args", DECL_ARGUMENTS (t));
833 if (DECL_EXTERNAL (t))
834 dump_string (di, "undefined");
835 if (TREE_PUBLIC (t))
836 dump_string (di, "extern");
837 else
838 dump_string (di, "static");
839 if (DECL_LANG_SPECIFIC (t) && !dump_flag (di, TDF_SLIM, t))
840 dump_child ("inline body", DECL_SAVED_TREE (t));
841 return true;
843 case RETURN_EXPR:
844 dump_child ("expr", TREE_OPERAND (t, 0));
845 return true;
847 case GOTO_EXPR:
848 dump_child ("goto", TREE_OPERAND (t, 0));
849 return true;
851 case LABEL_EXPR:
852 dump_child ("label", TREE_OPERAND (t, 0));
853 return true;
855 case BLOCK:
856 if (BLOCK_EXPR_BODY (t))
858 tree local = BLOCK_VARS (t);
859 while (local)
861 tree next = TREE_CHAIN (local);
862 dump_child ("var", local);
863 local = next;
867 tree block = BLOCK_EXPR_BODY (t);
868 dump_child ("body", block);
869 block = TREE_CHAIN (block);
872 return true;
874 case COMPOUND_EXPR:
875 if (!dump_flag (di, TDF_SLIM, t))
876 return false;
877 dump_compound_expr (di, t);
878 return true;
880 default:
881 break;
883 return false;
886 /* Java calls can't, in general, be sibcalls because we need an
887 accurate stack trace in order to guarantee correct operation of
888 methods such as Class.forName(String) and
889 SecurityManager.getClassContext(). */
891 static bool
892 java_decl_ok_for_sibcall (const_tree decl)
894 return (decl != NULL && DECL_CONTEXT (decl) == output_class
895 && !DECL_UNINLINABLE (decl));
898 static enum classify_record
899 java_classify_record (tree type)
901 if (! CLASS_P (type))
902 return RECORD_IS_STRUCT;
904 if (CLASS_INTERFACE (TYPE_NAME (type)))
905 return RECORD_IS_INTERFACE;
907 return RECORD_IS_CLASS;
910 static GTY(()) tree java_eh_personality_decl;
912 static tree
913 java_eh_personality (void)
915 if (!java_eh_personality_decl)
916 java_eh_personality_decl = build_personality_function ("gcj");
917 return java_eh_personality_decl;
920 #include "gt-java-lang.h"