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