1 /* Code to test for "definitive assignment".
2 Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2, or (at your option)
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with GNU CC; see the file COPYING. If not, write to
16 the Free Software Foundation, 59 Temple Place - Suite 330,
17 Boston, MA 02111-1307, USA.
19 Java and all Java-based marks are trademarks or registered trademarks
20 of Sun Microsystems, Inc. in the United States and other countries.
21 The Free Software Foundation is independent of Sun Microsystems, Inc. */
23 /* Written by Per Bothner <bothner@cygnus.com>, January 1999. */
28 #include "flags.h" /* Needed for optimize. */
29 #include "java-tree.h"
30 #include "toplev.h" /* Needed for fatal. */
32 /* The basic idea is that we assign each local variable declaration
33 an index, and then we pass around bitstrings, where the i'th bit
34 is set if decl whose DECL_BIT_INDEX is i is definitely assigned. */
36 /* One segment of a bitstring. */
37 typedef unsigned int word;
39 /* Pointer to a bitstring. */
42 /* Number of locals variables currently active. */
43 int num_current_locals = 0;
45 /* The index of the first local variable in the current block.
47 The variables whose DECL_BIT_INDEX are in the range from
48 start_current_locals (inclusive) up to num_current_locals (exclusive)
49 are declared in the "current" block. If there is a loop or branch
50 form, we set start_current_locals to num_current_locals to indicate
51 there is no current block.
53 The point is that if a variable in the current block is set,
54 there are no other control paths that we have to worry about.
55 Hence, we can remove it from the set of variables we are
56 checking, making its bit index available for some other variable.
57 For simplicity, we only do that if the variable's bit index
58 is (num_current_locals-1); freeing up its bit index is then
59 just a simple matter of decrementing num_current_locals.
60 The reason this is worth doing is that it is simple, and
61 allows us to use short (usually one-word) bit-strings,
62 even for methods with thousands of local variables, as
63 long as most of them are initialized immediately after or in
65 int start_current_locals = 0;
67 int num_current_words = 1;
71 #define COPYN(DST, SRC, NWORDS) memcpy (DST, SRC, NWORDS * sizeof(word))
72 #define COPY(DST, SRC) COPYN (DST, SRC, num_current_words)
74 #define SET_ALL(DST) memset (DST, ~0, num_current_words * sizeof(word))
75 #define CLEAR_ALL(DST) memset (DST, 0, num_current_words * sizeof(word))
77 #define INTERSECTN(DST, SRC1, SRC2, N) \
79 while (--n >= 0) DST[n] = SRC1[n] & SRC2[n]; \
82 #define UNION(DST, SRC1, SRC2) \
83 UNIONN (DST, SRC1, SRC2, num_current_words)
85 #define UNIONN(DST, SRC1, SRC2, N) \
87 while (--n >= 0) DST[n] = SRC1[n] | SRC2[n]; \
90 #define INTERSECT(DST, SRC1, SRC2) \
91 INTERSECTN (DST, SRC1, SRC2, num_current_words)
93 #define WORD_SIZE ((unsigned int)(sizeof(word) * 8))
95 static void check_bool_init PARAMS ((tree, words, words, words));
96 static void check_init PARAMS ((tree, words));
97 static void check_cond_init PARAMS ((tree, tree, tree, words, words, words));
98 static void check_bool2_init PARAMS ((enum tree_code, tree, tree, words, words, words));
100 static void done_alternative PARAMS ((words, struct alternatives *));
103 #define ALLOC_WORDS(NUM) ((word*) xmalloc ((NUM) * sizeof (word)))
104 #define FREE_WORDS(PTR) (free (PTR))
106 #define ALLOC_WORDS(NUM) ((word*)alloca ((NUM) * sizeof (word)))
107 #define FREE_WORDS(PTR) ((void)0)
110 #define SET_P(WORDS, BIT) \
111 (WORDS[BIT / WORD_SIZE] & (1 << (BIT % WORD_SIZE)))
113 #define CLEAR_BIT(WORDS, BIT) \
114 (WORDS[BIT / WORD_SIZE] &= ~ (1 << (BIT % WORD_SIZE)))
116 #define SET_BIT(WORDS, BIT) \
117 (WORDS[BIT / WORD_SIZE] |= (1 << (BIT % WORD_SIZE)))
119 #define WORDS_NEEDED(BITS) (((BITS)+(WORD_SIZE-1))/(WORD_SIZE))
121 /* Check a conditional form (TEST_EXP ? THEN_EXP : ELSE_EXP) for
123 BEFORE, WHEN_FALSE, and WHEN_TRUE are as in check_bool_init. */
126 check_cond_init (test_exp, then_exp, else_exp,
127 before, when_false, when_true)
128 tree test_exp, then_exp, else_exp;
129 words before, when_false, when_true;
131 words tmp = ALLOC_WORDS (6 * num_current_words);
132 words test_false = tmp;
133 words test_true = tmp + num_current_words;
134 words then_false = tmp + 2 * num_current_words;
135 words then_true = tmp + 3 * num_current_words;
136 words else_false = tmp + 4 * num_current_words;
137 words else_true = tmp + 5 * num_current_words;
138 check_bool_init (test_exp, before, test_false, test_true);
139 check_bool_init (then_exp, test_true, then_false, then_true);
140 check_bool_init (else_exp, test_false, else_false, else_true);
141 INTERSECT (when_false, then_false, else_false);
142 INTERSECT (when_true, then_true, else_true);
146 /* Check a boolean binary form CODE (EXP0, EXP1),
147 where CODE is one of EQ_EXPR, BIT_AND_EXPR, or BIT_IOR_EXPR.
148 BEFORE, WHEN_FALSE, and WHEN_TRUE are as in check_bool_init. */
151 check_bool2_init (code, exp0, exp1, before, when_false, when_true)
152 enum tree_code code; tree exp0, exp1;
153 words before, when_false, when_true;
156 words tmp = num_current_words <= 1 ? buf
157 : ALLOC_WORDS (4 * num_current_words);
158 words when_false_0 = tmp;
159 words when_false_1 = tmp+num_current_words;
160 words when_true_0 = tmp+2*num_current_words;
161 words when_true_1 = tmp+3*num_current_words;
162 check_bool_init (exp0, before, when_false_0, when_true_0);
163 INTERSECT (before, when_false_0, when_true_0);
164 check_bool_init (exp1, before, when_false_1, when_true_1);
166 INTERSECT (before, when_false_1, when_true_1);
171 * when_true = (when_false_1 INTERSECTION when_true_1)
172 * UNION (when_true_0 INTERSECTION when_false_1)
173 * UNION (when_false_0 INTERSECTION when_true_1);
174 * using when_false and before as temporary working areas. */
175 INTERSECT (when_true, when_true_0, when_false_1);
176 INTERSECT (when_false, when_true_0, when_false_1);
177 UNION (when_true, when_true, when_false);
178 UNION (when_true, when_true, before);
181 * when_false = (when_false_1 INTERSECTION when_true_1)
182 * UNION (when_true_0 INTERSECTION when_true_1)
183 * UNION (when_false_0 INTERSECTION when_false_1);
184 * using before as a temporary working area. */
185 INTERSECT (when_false, when_true_0, when_true_1);
186 UNION (when_false, when_false, before);
187 INTERSECT (before, when_false_0, when_false_1);
188 UNION (when_false, when_false, before);
190 else if (code == BIT_AND_EXPR || code == TRUTH_AND_EXPR)
192 UNION (when_true, when_true_0, when_true_1);
193 INTERSECT (when_false, when_false_0, when_false_1);
194 UNION (when_false, when_false, before);
196 else /* if (code == BIT_IOR_EXPR || code == TRUTH_OR_EXPR) */
198 UNION (when_false, when_false_0, when_false_1);
199 INTERSECT (when_true, when_true_0, when_true_1);
200 UNION (when_true, when_true, before);
207 /* Check a boolean expression EXP for definite assignment.
208 BEFORE is the set of variables definitely assigned before the conditional.
209 (This bitstring may be modified arbitrarily in this function.)
210 On output, WHEN_FALSE is the set of variables definitely assigned after
211 the conditional when the conditional is false.
212 On output, WHEN_TRUE is the set of variables definitely assigned after
213 the conditional when the conditional is true.
214 (WHEN_FALSE and WHEN_TRUE are overwritten with initial values ignored.)
215 (None of BEFORE, WHEN_FALSE, or WHEN_TRUE can overlap, as they may
216 be used as temporary working areas. */
219 check_bool_init (exp, before, when_false, when_true)
221 words before, when_false, when_true;
223 switch (TREE_CODE (exp))
226 check_cond_init (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
227 TREE_OPERAND (exp, 2),
228 before, when_false, when_true);
231 case TRUTH_ANDIF_EXPR:
232 check_cond_init (TREE_OPERAND (exp, 0),
233 TREE_OPERAND (exp, 1), boolean_false_node,
234 before, when_false, when_true);
236 case TRUTH_ORIF_EXPR:
237 check_cond_init (TREE_OPERAND (exp, 0),
238 boolean_true_node, TREE_OPERAND (exp, 1),
239 before, when_false, when_true);
242 check_bool_init (TREE_OPERAND (exp, 0), before, when_true, when_false);
246 tree tmp = TREE_OPERAND (exp, 0);
247 if (TREE_CODE (tmp) == VAR_DECL && ! FIELD_STATIC (tmp))
250 check_bool_init (TREE_OPERAND (exp, 1), before,
251 when_false, when_true);
252 index = DECL_BIT_INDEX (tmp);
255 SET_BIT (when_false, index);
256 SET_BIT (when_true, index);
268 check_bool2_init (TREE_CODE (exp),
269 TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
270 before, when_false, when_true);
276 /* Just like EQ_EXPR, but switch when_true and when_false. */
277 check_bool2_init (EQ_EXPR, TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
278 before, when_true, when_false);
283 if (integer_zerop (exp))
286 COPY (when_false, before);
290 SET_ALL (when_false);
291 COPY (when_true, before);
296 check_init (exp, before);
297 COPY (when_false, before);
298 COPY (when_true, before);
302 /* Used to keep track of control flow branches. */
306 struct alternatives *outer;
308 /* The value of num_current_locals at the start of this compound. */
311 /* The value of the "before" set at the start of the control stucture.
312 Used for SWITCH_EXPR but not set for LABELED_BLOCK_EXPR. */
315 int save_start_current_locals;
317 /* If num_current_words==1, combined==&one_word, for efficiency. */
320 /* The intersection of the "after" sets from previous branches. */
326 struct alternatives * alternatives = NULL;
328 #define BEGIN_ALTERNATIVES(before, current) \
330 current.saved = NULL; \
331 current.num_locals = num_current_locals; \
332 current.combined = num_current_words <= 1 ? ¤t.one_word \
333 : ALLOC_WORDS (num_current_words); \
334 SET_ALL (current.combined); \
335 current.outer = alternatives; \
336 alternatives = ¤t; \
337 current.save_start_current_locals = start_current_locals; \
338 start_current_locals = num_current_locals; \
342 done_alternative (after, current)
344 struct alternatives *current;
346 INTERSECTN (current->combined, current->combined, after,
347 WORDS_NEEDED (current->num_locals));
350 #define END_ALTERNATIVES(after, current) \
352 alternatives = current.outer; \
353 COPY (after, current.combined); \
354 if (current.combined != ¤t.one_word) \
355 FREE_WORDS (current.combined); \
356 start_current_locals = current.save_start_current_locals; \
359 /* Check for (un)initialized local variables in EXP. */
362 check_init (exp, before)
368 switch (TREE_CODE (exp))
371 if (! FIELD_STATIC (exp) && DECL_NAME (exp) != NULL_TREE)
373 int index = DECL_BIT_INDEX (exp);
374 /* We don't want to report and mark as non initialized flags
375 the are, they will be marked initialized later on when
376 assigned to `true.' */
377 if ((STATIC_CLASS_INIT_OPT_P ()
378 && ! LOCAL_CLASS_INITIALIZATION_FLAG_P (exp))
379 && index >= 0 && ! SET_P (before, index))
382 (wfl, "Variable `%s' may not have been initialized",
383 IDENTIFIER_POINTER (DECL_NAME (exp)));
384 /* Suppress further errors. */
385 DECL_BIT_INDEX (exp) = -1;
390 tmp = TREE_OPERAND (exp, 0);
391 /* We're interested in variable declaration and parameter
392 declaration when they're declared with the `final' modifier. */
393 if ((TREE_CODE (tmp) == VAR_DECL && ! FIELD_STATIC (tmp))
394 || (TREE_CODE (tmp) == PARM_DECL && LOCAL_FINAL_P (tmp)))
397 check_init (TREE_OPERAND (exp, 1), before);
398 index = DECL_BIT_INDEX (tmp);
399 /* A final local already assigned or a final parameter
400 assigned must be reported as errors */
401 if (LOCAL_FINAL_P (tmp)
402 && (index == -1 || TREE_CODE (tmp) == PARM_DECL))
403 parse_error_context (wfl, "Can't assign here a value to the `final' variable `%s'", IDENTIFIER_POINTER (DECL_NAME (tmp)));
406 SET_BIT (before, index);
407 /* Minor optimization. See comment for start_current_locals.
408 If we're optimizing for class initialization, we keep
409 this information to check whether the variable is
410 definitely assigned when once we checked the whole
412 if (! STATIC_CLASS_INIT_OPT_P ()
413 && index >= start_current_locals
414 && index == num_current_locals - 1)
416 num_current_locals--;
417 DECL_BIT_INDEX (tmp) = -1;
424 if (BLOCK_EXPR_BODY (exp))
426 tree decl = BLOCK_EXPR_DECLS (exp);
430 int save_start_current_locals = start_current_locals;
431 int save_num_current_words = num_current_words;
432 start_current_locals = num_current_locals;
433 for (; decl != NULL_TREE; decl = TREE_CHAIN (decl))
435 DECL_BIT_INDEX (decl) = num_current_locals++;
437 words_needed = WORDS_NEEDED (num_current_locals);
438 if (words_needed > num_current_words)
440 tmp = ALLOC_WORDS (words_needed);
442 num_current_words = words_needed;
446 for (i = start_current_locals; i < num_current_locals; i++)
448 check_init (BLOCK_EXPR_BODY (exp), tmp);
449 num_current_locals = start_current_locals;
450 start_current_locals = save_start_current_locals;
453 num_current_words = save_num_current_words;
461 struct alternatives alt;
462 BEGIN_ALTERNATIVES (before, alt);
464 check_init (TREE_OPERAND (exp, 0), before);
465 END_ALTERNATIVES (before, alt);
470 struct alternatives *alt = alternatives;
471 words tmp = ALLOC_WORDS (2 * num_current_words);
472 words when_true = tmp;
473 words when_false = tmp + num_current_words;
474 #ifdef ENABLE_JC1_CHECKING
475 if (TREE_CODE (alt->block) != LOOP_EXPR)
478 check_bool_init (TREE_OPERAND (exp, 0), before, when_false, when_true);
479 done_alternative (when_true, alt);
480 COPY (before, when_false);
484 case LABELED_BLOCK_EXPR:
486 struct alternatives alt;
487 BEGIN_ALTERNATIVES (before, alt);
489 if (LABELED_BLOCK_BODY (exp))
490 check_init (LABELED_BLOCK_BODY (exp), before);
491 done_alternative (before, &alt);
492 END_ALTERNATIVES (before, alt);
495 case EXIT_BLOCK_EXPR:
497 tree block = TREE_OPERAND (exp, 0);
498 struct alternatives *alt = alternatives;
499 while (alt->block != block)
501 done_alternative (before, alt);
507 struct alternatives alt;
508 check_init (TREE_OPERAND (exp, 0), before);
509 BEGIN_ALTERNATIVES (before, alt);
510 alt.saved = ALLOC_WORDS (num_current_words);
511 COPY (alt.saved, before);
513 check_init (TREE_OPERAND (exp, 1), before);
514 done_alternative (before, &alt);
515 FREE_WORDS (alt.saved);
516 END_ALTERNATIVES (before, alt);
523 struct alternatives *alt = alternatives;
524 while (TREE_CODE (alt->block) != SWITCH_EXPR)
526 COPYN (before, alt->saved, WORDS_NEEDED (alt->num_locals));
527 for (i = alt->num_locals; i < num_current_locals; i++)
528 CLEAR_BIT (before, i);
532 case CLEANUP_POINT_EXPR:
534 struct alternatives alt;
535 BEGIN_ALTERNATIVES (before, alt);
536 CLEAR_ALL (alt.combined);
537 check_init (TREE_OPERAND (exp, 0), before);
538 UNION (alt.combined, alt.combined, before);
539 END_ALTERNATIVES (before, alt);
542 case WITH_CLEANUP_EXPR:
544 struct alternatives *alt = alternatives;
545 #ifdef ENABLE_JC1_CHECKING
546 if (TREE_CODE (alt->block) != CLEANUP_POINT_EXPR)
549 check_init (TREE_OPERAND (exp, 0), before);
550 UNION (alt->combined, alt->combined, before);
551 check_init (TREE_OPERAND (exp, 1), alt->combined);
557 tree try_clause = TREE_OPERAND (exp, 0);
558 tree clause = TREE_OPERAND (exp, 1);
559 words save = ALLOC_WORDS (num_current_words);
560 words tmp = ALLOC_WORDS (num_current_words);
561 struct alternatives alt;
562 BEGIN_ALTERNATIVES (before, alt);
565 check_init (try_clause, tmp);
566 done_alternative (tmp, &alt);
567 for ( ; clause != NULL_TREE; clause = TREE_CHAIN (clause))
569 tree catch_clause = TREE_OPERAND (clause, 0);
571 check_init (catch_clause, tmp);
572 done_alternative (tmp, &alt);
576 END_ALTERNATIVES (before, alt);
580 case TRY_FINALLY_EXPR:
582 words tmp = ALLOC_WORDS (num_current_words);
584 check_init (TREE_OPERAND (exp, 0), before);
585 check_init (TREE_OPERAND (exp, 1), tmp);
586 UNION (before, before, tmp);
593 if (TREE_OPERAND (exp, 0))
594 check_init (TREE_OPERAND (exp, 0), before);
595 goto never_continues;
603 case TRUTH_ANDIF_EXPR:
604 case TRUTH_ORIF_EXPR:
606 words tmp = ALLOC_WORDS (2 * num_current_words);
607 words when_true = tmp;
608 words when_false = tmp + num_current_words;
609 check_bool_init (exp, before, when_false, when_true);
610 INTERSECT (before, when_false, when_true);
614 case UNARY_PLUS_EXPR:
629 case PREDECREMENT_EXPR:
630 case PREINCREMENT_EXPR:
631 case POSTDECREMENT_EXPR:
632 case POSTINCREMENT_EXPR:
633 case NON_LVALUE_EXPR:
634 case INSTANCEOF_EXPR:
640 /* Avoid needless recursion. */
641 exp = TREE_OPERAND (exp, 0);
645 if (IS_INIT_CHECKED (exp))
647 IS_INIT_CHECKED (exp) = 1;
648 exp = TREE_OPERAND (exp, 0);
683 check_init (TREE_OPERAND (exp, 0), before);
684 /* Avoid needless recursion, especially for COMPOUND_EXPR. */
685 exp = TREE_OPERAND (exp, 1);
694 case JAVA_EXC_OBJ_EXPR:
700 tree func = TREE_OPERAND (exp, 0);
701 tree x = TREE_OPERAND (exp, 1);
702 if (TREE_CODE (func) == ADDR_EXPR)
703 func = TREE_OPERAND (func, 0);
704 check_init (func, before);
706 for ( ; x != NULL_TREE; x = TREE_CHAIN (x))
707 check_init (TREE_VALUE (x), before);
708 if (func == throw_node)
709 goto never_continues;
715 tree x = CONSTRUCTOR_ELTS (TREE_OPERAND (exp, 0));
716 for ( ; x != NULL_TREE; x = TREE_CHAIN (x))
717 check_init (TREE_VALUE (x), before);
721 case EXPR_WITH_FILE_LOCATION:
723 const char *saved_input_filename = input_filename;
724 tree saved_wfl = wfl;
725 tree body = EXPR_WFL_NODE (exp);
726 int saved_lineno = lineno;
727 if (body == empty_stmt_node)
730 input_filename = EXPR_WFL_FILENAME (exp);
731 lineno = EXPR_WFL_LINENO (exp);
732 check_init (body, before);
733 input_filename = saved_input_filename;
734 lineno = saved_lineno;
741 ("internal error in check-init: tree code not implemented: %s",
742 tree_code_name [(int) TREE_CODE (exp)]);
747 check_for_initialization (body)
751 check_init (body, &before);
755 /* Call for every element in DECL_FUNCTION_INITIALIZED_CLASS_TABLE of
756 a method to consider whether the type indirectly described by ENTRY
757 is definitly initialized and thus remembered as such. */
760 attach_initialized_static_class (entry, ptr)
761 struct hash_entry *entry;
764 struct init_test_hash_entry *ite = (struct init_test_hash_entry *) entry;
765 tree fndecl = DECL_CONTEXT (ite->init_test_decl);
766 int index = DECL_BIT_INDEX (ite->init_test_decl);
768 /* If the initializer flag has been definitly assigned (not taking
769 into account its first mandatory assignment which has been
770 already added but escaped analysis.) */
771 if (fndecl && METHOD_STATIC (fndecl)
772 && (DECL_INITIAL (ite->init_test_decl) == boolean_true_node
773 || (index >= 0 && SET_P (((word *) ptr), index))))
774 hash_lookup (&DECL_FUNCTION_INITIALIZED_CLASS_TABLE (fndecl),
775 entry->key, TRUE, NULL);