From: Nathan Froyd Date: Fri, 6 May 2011 03:47:57 +0000 (+0000) Subject: generalize build_case_label to the rest of the compiler X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3d528853ba1106b3cbd6eca4316ab2825416b9a6;p=gcc.git generalize build_case_label to the rest of the compiler generalize build_case_label to the rest of the compiler gcc/ada/ * gcc-interface/trans.c (Case_Statement_to_gnu): Call build_case_label. gcc/ * except.c (sjlj_emit_dispatch_table): Call build_case_label. * gimplify.c (gimplify_switch_expr): Likewise. * omp-low.c (expand_omp_sections): Likewise. * tree-eh.c (lower_try_finally_switch): Likewise. (lower_eh_dispatch): Likewise. * tree.h (build_case_label): Declare. * tree.c (build_case_label): Define. gcc/c-family/ * c-common.c (c_add_case_label): Omit the loc argument to build_case_label. * c-common.h (build_case_label): Remove. * c-semantics.c (build_case_label): Remove. gcc/cp/ * decl.c (finish_case_label): Omit the loc argument to build_case_label. gcc/fortran/ * trans-decl.c (gfc_trans_entry_master_switch): Call build_case_label. * trans-io.c (add_case): Likewise. * trans-stmt.c (gfc_trans_integer_select): Likewise. (gfc_trans_character_select): Likewise. gcc/go/ * go-gcc.cc (Gcc_backend::switch_statement): Call build_case_label. gcc/java/ * expr.c (expand_java_switch): Call build_case_label. (expand_java_add_case): Likewise. From-SVN: r173467 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 297306e610e..2d5bd492966 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2011-05-05 Nathan Froyd + + * except.c (sjlj_emit_dispatch_table): Call build_case_label. + * gimplify.c (gimplify_switch_expr): Likewise. + * omp-low.c (expand_omp_sections): Likewise. + * tree-eh.c (lower_try_finally_switch): Likewise. + (lower_eh_dispatch): Likewise. + * tree.h (build_case_label): Declare. + * tree.c (build_case_label): Define. + 2011-05-05 Jason Merrill PR c++/40975 diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 922460c27c3..18c56d0af99 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2011-05-05 Nathan Froyd + + * gcc-interface/trans.c (Case_Statement_to_gnu): Call + build_case_label. + 2011-05-05 Nathan Froyd * gcc-interface/decl.c (intrin_arglists_compatible_p): Use iterators diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 06b778b27ba..dc79c6fd270 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -2028,9 +2028,8 @@ Case_Statement_to_gnu (Node_Id gnat_node) if ((!gnu_low || TREE_CODE (gnu_low) == INTEGER_CST) && (!gnu_high || TREE_CODE (gnu_high) == INTEGER_CST)) { - add_stmt_with_node (build3 - (CASE_LABEL_EXPR, void_type_node, - gnu_low, gnu_high, + add_stmt_with_node (build_case_label + (gnu_low, gnu_high, create_artificial_label (input_location)), gnat_choice); choices_added_p = true; diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index d3edc6cdd74..9fa7e29b82b 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,10 @@ +2011-05-05 Nathan Froyd + + * c-common.c (c_add_case_label): Omit the loc argument to + build_case_label. + * c-common.h (build_case_label): Remove. + * c-semantics.c (build_case_label): Remove. + 2011-05-05 Joseph Myers * c-objc.h (objc_start_method_definition): Update prototype. diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 207f77be451..41cb7176554 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -5327,7 +5327,7 @@ c_add_case_label (location_t loc, splay_tree cases, tree cond, tree orig_type, } /* Add a CASE_LABEL to the statement-tree. */ - case_label = add_stmt (build_case_label (loc, low_value, high_value, label)); + case_label = add_stmt (build_case_label (low_value, high_value, label)); /* Register this case label in the splay tree. */ splay_tree_insert (cases, (splay_tree_key) low_value, diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h index ad6da6be4a8..420b877f09d 100644 --- a/gcc/c-family/c-common.h +++ b/gcc/c-family/c-common.h @@ -831,7 +831,6 @@ extern void warn_for_omitted_condop (location_t, tree); extern tree do_case (location_t, tree, tree); extern tree build_stmt (location_t, enum tree_code, ...); -extern tree build_case_label (location_t, tree, tree, tree); extern tree build_real_imag_expr (location_t, enum tree_code, tree); /* These functions must be defined by each front-end which implements diff --git a/gcc/c-family/c-semantics.c b/gcc/c-family/c-semantics.c index 0f9f51e061d..a5bd9bacb08 100644 --- a/gcc/c-family/c-semantics.c +++ b/gcc/c-family/c-semantics.c @@ -131,15 +131,6 @@ build_stmt (location_t loc, enum tree_code code, ...) return ret; } -/* Create a CASE_LABEL_EXPR tree node and return it. */ - -tree -build_case_label (location_t loc, - tree low_value, tree high_value, tree label_decl) -{ - return build_stmt (loc, CASE_LABEL_EXPR, low_value, high_value, label_decl); -} - /* Build a REALPART_EXPR or IMAGPART_EXPR, according to CODE, from ARG. */ tree diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 20057c5bc6e..9dbb57f1049 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2011-05-05 Nathan Froyd + + * decl.c (finish_case_label): Omit the loc argument to + build_case_label. + 2011-05-05 Jason Merrill * cp-tree.h (REFERENCE_REF_P): Just check the type. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index c5184e06773..3622c2ceae6 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -2970,7 +2970,7 @@ finish_case_label (location_t loc, tree low_value, tree high_value) /* For templates, just add the case label; we'll do semantic analysis at instantiation-time. */ label = build_decl (loc, LABEL_DECL, NULL_TREE, NULL_TREE); - return add_stmt (build_case_label (loc, low_value, high_value, label)); + return add_stmt (build_case_label (low_value, high_value, label)); } /* Find the condition on which this switch statement depends. */ diff --git a/gcc/except.c b/gcc/except.c index b722fb74921..9578e2e907f 100644 --- a/gcc/except.c +++ b/gcc/except.c @@ -1285,12 +1285,11 @@ sjlj_emit_dispatch_table (rtx dispatch_label, int num_dispatch) if (num_dispatch > 1) { - tree t_label, case_elt; + tree t_label, case_elt, t; t_label = create_artificial_label (UNKNOWN_LOCATION); - case_elt = build3 (CASE_LABEL_EXPR, void_type_node, - build_int_cst (integer_type_node, disp_index), - NULL, t_label); + t = build_int_cst (integer_type_node, disp_index); + case_elt = build_case_label (t, NULL, t_label); gimple_switch_set_label (switch_stmt, disp_index, case_elt); label = label_rtx (t_label); diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 00774f4f779..da6d2ab6331 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2011-05-05 Nathan Froyd + + * trans-decl.c (gfc_trans_entry_master_switch): Call build_case_label. + * trans-io.c (add_case): Likewise. + * trans-stmt.c (gfc_trans_integer_select): Likewise. + (gfc_trans_character_select): Likewise. + 2011-05-05 Eric Botcazou * trans-decl.c (trans_function_start): Do not set diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 2452927628e..63f03de5ae1 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -4347,7 +4347,7 @@ gfc_trans_entry_master_switch (gfc_entry_list * el) /* Add the case label. */ label = gfc_build_label_decl (NULL_TREE); val = build_int_cst (gfc_array_index_type, el->id); - tmp = build3_v (CASE_LABEL_EXPR, val, NULL_TREE, label); + tmp = build_case_label (val, NULL_TREE, label); gfc_add_expr_to_block (&block, tmp); /* And jump to the actual entry point. */ diff --git a/gcc/fortran/trans-io.c b/gcc/fortran/trans-io.c index 07df5d8d887..4e019a36c51 100644 --- a/gcc/fortran/trans-io.c +++ b/gcc/fortran/trans-io.c @@ -832,7 +832,7 @@ add_case (int label_value, gfc_st_label * label, stmtblock_t * body) tmp = gfc_build_label_decl (NULL_TREE); /* And the case itself. */ - tmp = build3_v (CASE_LABEL_EXPR, value, NULL_TREE, tmp); + tmp = build_case_label (value, NULL_TREE, tmp); gfc_add_expr_to_block (body, tmp); /* Jump to the label. */ diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c index 9147d889ac6..d2a0a5fc90d 100644 --- a/gcc/fortran/trans-stmt.c +++ b/gcc/fortran/trans-stmt.c @@ -1770,8 +1770,7 @@ gfc_trans_integer_select (gfc_code * code) /* Add this case label. Add parameter 'label', make it match GCC backend. */ - tmp = fold_build3_loc (input_location, CASE_LABEL_EXPR, - void_type_node, low, high, label); + tmp = build_case_label (low, high, label); gfc_add_expr_to_block (&body, tmp); } @@ -2048,8 +2047,7 @@ gfc_trans_character_select (gfc_code *code) /* Add this case label. Add parameter 'label', make it match GCC backend. */ - tmp = fold_build3_loc (input_location, CASE_LABEL_EXPR, - void_type_node, low, high, label); + tmp = build_case_label (low, high, label); gfc_add_expr_to_block (&body, tmp); } @@ -2128,12 +2126,10 @@ gfc_trans_character_select (gfc_code *code) for (d = c->ext.block.case_list; d; d = d->next) { label = gfc_build_label_decl (NULL_TREE); - tmp = fold_build3_loc (input_location, CASE_LABEL_EXPR, - void_type_node, - (d->low == NULL && d->high == NULL) - ? NULL : build_int_cst (integer_type_node, - d->n), - NULL, label); + tmp = build_case_label ((d->low == NULL && d->high == NULL) + ? NULL + : build_int_cst (integer_type_node, d->n), + NULL, label); gfc_add_expr_to_block (&body, tmp); } diff --git a/gcc/gimplify.c b/gcc/gimplify.c index c4b84c17198..700aa238e69 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -1584,10 +1584,11 @@ gimplify_switch_expr (tree *expr_p, gimple_seq *pre_p) break; } if (i == len) - default_case = build3 (CASE_LABEL_EXPR, void_type_node, - NULL_TREE, NULL_TREE, - CASE_LABEL (VEC_index (tree, - labels, 0))); + { + tree label = CASE_LABEL (VEC_index (tree, labels, 0)); + default_case = build_case_label (NULL_TREE, NULL_TREE, + label); + } } } @@ -1596,9 +1597,8 @@ gimplify_switch_expr (tree *expr_p, gimple_seq *pre_p) gimple new_default; default_case - = build3 (CASE_LABEL_EXPR, void_type_node, - NULL_TREE, NULL_TREE, - create_artificial_label (UNKNOWN_LOCATION)); + = build_case_label (NULL_TREE, NULL_TREE, + create_artificial_label (UNKNOWN_LOCATION)); new_default = gimple_build_label (CASE_LABEL (default_case)); gimplify_seq_add_stmt (&switch_body_seq, new_default); } diff --git a/gcc/go/ChangeLog b/gcc/go/ChangeLog index 6c53224083e..6df65976ccb 100644 --- a/gcc/go/ChangeLog +++ b/gcc/go/ChangeLog @@ -1,3 +1,7 @@ +2011-05-05 Nathan Froyd + + * go-gcc.cc (Gcc_backend::switch_statement): Call build_case_label. + 2011-05-04 Ian Lance Taylor * go-gcc.cc (Gcc_backend::struct_type): Call fill_in_struct. diff --git a/gcc/go/go-gcc.cc b/gcc/go/go-gcc.cc index 18c0bbae52e..f5a6fb579ac 100644 --- a/gcc/go/go-gcc.cc +++ b/gcc/go/go-gcc.cc @@ -835,8 +835,7 @@ Gcc_backend::switch_statement( ? EXPR_LOCATION((*ps)->get_tree()) : UNKNOWN_LOCATION); tree label = create_artificial_label(loc); - tree c = build3_loc(loc, CASE_LABEL_EXPR, void_type_node, NULL_TREE, - NULL_TREE, label); + tree c = build_case_label(NULL_TREE, NULL_TREE, label); append_to_statement_list(c, &stmt_list); } else @@ -850,8 +849,7 @@ Gcc_backend::switch_statement( return this->error_statement(); source_location loc = EXPR_LOCATION(t); tree label = create_artificial_label(loc); - tree c = build3_loc(loc, CASE_LABEL_EXPR, void_type_node, - (*pcv)->get_tree(), NULL_TREE, label); + tree c = build_case_label((*pcv)->get_tree(), NULL_TREE, label); append_to_statement_list(c, &stmt_list); } } diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index da52f91b76f..7dea6e43f54 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,8 @@ +2011-05-05 Nathan Froyd + + * expr.c (expand_java_switch): Call build_case_label. + (expand_java_add_case): Likewise. + 2011-04-29 Richard Guenther PR middle-end/48819 diff --git a/gcc/java/expr.c b/gcc/java/expr.c index 53feab5ced3..3be1cff7d3f 100644 --- a/gcc/java/expr.c +++ b/gcc/java/expr.c @@ -1874,8 +1874,8 @@ expand_java_switch (tree selector, int default_pc) NULL_TREE, NULL_TREE); java_add_stmt (switch_expr); - x = build3 (CASE_LABEL_EXPR, void_type_node, NULL_TREE, NULL_TREE, - create_artificial_label (input_location)); + x = build_case_label (NULL_TREE, NULL_TREE, + create_artificial_label (input_location)); append_to_statement_list (x, &SWITCH_BODY (switch_expr)); x = build1 (GOTO_EXPR, void_type_node, lookup_label (default_pc)); @@ -1891,8 +1891,8 @@ expand_java_add_case (tree switch_expr, int match, int target_pc) value = build_int_cst (TREE_TYPE (switch_expr), match); - x = build3 (CASE_LABEL_EXPR, void_type_node, value, NULL_TREE, - create_artificial_label (input_location)); + x = build_case_label (value, NULL_TREE, + create_artificial_label (input_location)); append_to_statement_list (x, &SWITCH_BODY (switch_expr)); x = build1 (GOTO_EXPR, void_type_node, lookup_label (target_pc)); diff --git a/gcc/omp-low.c b/gcc/omp-low.c index fc2cff85488..e4bf141b908 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -4774,8 +4774,7 @@ expand_omp_sections (struct omp_region *region) i = 0; if (exit_reachable) { - t = build3 (CASE_LABEL_EXPR, void_type_node, - build_int_cst (unsigned_type_node, 0), NULL, l2); + t = build_case_label (build_int_cst (unsigned_type_node, 0), NULL, l2); VEC_quick_push (tree, label_vec, t); i++; } @@ -4800,7 +4799,7 @@ expand_omp_sections (struct omp_region *region) t = gimple_block_label (s_entry_bb); u = build_int_cst (unsigned_type_node, casei); - u = build3 (CASE_LABEL_EXPR, void_type_node, u, NULL, t); + u = build_case_label (u, NULL, t); VEC_quick_push (tree, label_vec, u); si = gsi_last_bb (s_entry_bb); @@ -4821,7 +4820,7 @@ expand_omp_sections (struct omp_region *region) /* Error handling code goes in DEFAULT_BB. */ t = gimple_block_label (default_bb); - u = build3 (CASE_LABEL_EXPR, void_type_node, NULL, NULL, t); + u = build_case_label (NULL, NULL, t); make_edge (l0_bb, default_bb, 0); stmt = gimple_build_switch_vec (vmain, u, label_vec); diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c index ceb2ff4cd02..cd6c428c172 100644 --- a/gcc/tree-eh.c +++ b/gcc/tree-eh.c @@ -1340,9 +1340,9 @@ lower_try_finally_switch (struct leh_state *state, struct leh_tf_state *tf) fallthru_index)); gimple_seq_add_stmt (&tf->top_p_seq, x); - last_case = build3 (CASE_LABEL_EXPR, void_type_node, - build_int_cst (integer_type_node, fallthru_index), - NULL, create_artificial_label (tf_loc)); + tmp = build_int_cst (integer_type_node, fallthru_index); + last_case = build_case_label (tmp, NULL, + create_artificial_label (tf_loc)); VEC_quick_push (tree, case_label_vec, last_case); last_case_index++; @@ -1365,9 +1365,9 @@ lower_try_finally_switch (struct leh_state *state, struct leh_tf_state *tf) x = gimple_build_goto (finally_label); gimple_seq_add_stmt (&eh_seq, x); - last_case = build3 (CASE_LABEL_EXPR, void_type_node, - build_int_cst (integer_type_node, eh_index), - NULL, create_artificial_label (tf_loc)); + tmp = build_int_cst (integer_type_node, eh_index); + last_case = build_case_label (tmp, NULL, + create_artificial_label (tf_loc)); VEC_quick_push (tree, case_label_vec, last_case); last_case_index++; @@ -1419,9 +1419,9 @@ lower_try_finally_switch (struct leh_state *state, struct leh_tf_state *tf) { tree case_lab; void **slot; - case_lab = build3 (CASE_LABEL_EXPR, void_type_node, - build_int_cst (integer_type_node, switch_id), - NULL, create_artificial_label (tf_loc)); + tmp = build_int_cst (integer_type_node, switch_id); + case_lab = build_case_label (tmp, NULL, + create_artificial_label (tf_loc)); /* We store the cont_stmt in the pointer map, so that we can recover it in the loop below. */ if (!cont_map) @@ -3132,8 +3132,8 @@ lower_eh_dispatch (basic_block src, gimple stmt) blocks at the end of this pass. */ if (! pointer_set_contains (seen_values, TREE_VALUE (flt_node))) { - tree t = build3 (CASE_LABEL_EXPR, void_type_node, - TREE_VALUE (flt_node), NULL, lab); + tree t = build_case_label (TREE_VALUE (flt_node), + NULL, lab); VEC_safe_push (tree, heap, labels, t); pointer_set_insert (seen_values, TREE_VALUE (flt_node)); have_label = true; @@ -3181,8 +3181,7 @@ lower_eh_dispatch (basic_block src, gimple stmt) gsi_insert_before (&gsi, x, GSI_SAME_STMT); /* Turn the default label into a default case. */ - default_label = build3 (CASE_LABEL_EXPR, void_type_node, - NULL, NULL, default_label); + default_label = build_case_label (NULL, NULL, default_label); sort_case_labels (labels); x = gimple_build_switch_vec (filter, default_label, labels); diff --git a/gcc/tree.c b/gcc/tree.c index baf6f2b7ac8..7fd078db1a2 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -1653,6 +1653,23 @@ make_tree_binfo_stat (unsigned base_binfos MEM_STAT_DECL) return t; } +/* Create a CASE_LABEL_EXPR tree node and return it. */ + +tree +build_case_label (tree low_value, tree high_value, tree label_decl) +{ + tree t = make_node (CASE_LABEL_EXPR); + + TREE_TYPE (t) = void_type_node; + SET_EXPR_LOCATION (t, DECL_SOURCE_LOCATION (label_decl)); + + CASE_LOW (t) = low_value; + CASE_HIGH (t) = high_value; + CASE_LABEL (t) = label_decl; + CASE_CHAIN (t) = NULL_TREE; + + return t; +} /* Build a newly constructed TREE_VEC node of length LEN. */ diff --git a/gcc/tree.h b/gcc/tree.h index ef427606cde..d0cd3e05b25 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -4036,6 +4036,10 @@ extern tree copy_node_stat (tree MEM_STAT_DECL); extern tree copy_list (tree); +/* Make a CASE_LABEL_EXPR. */ + +extern tree build_case_label (tree, tree, tree); + /* Make a BINFO. */ extern tree make_tree_binfo_stat (unsigned MEM_STAT_DECL); #define make_tree_binfo(t) make_tree_binfo_stat (t MEM_STAT_INFO)