generalize build_case_label to the rest of the compiler
authorNathan Froyd <froydnj@codesourcery.com>
Fri, 6 May 2011 03:47:57 +0000 (03:47 +0000)
committerNathan Froyd <froydnj@gcc.gnu.org>
Fri, 6 May 2011 03:47:57 +0000 (03:47 +0000)
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

23 files changed:
gcc/ChangeLog
gcc/ada/ChangeLog
gcc/ada/gcc-interface/trans.c
gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/c-family/c-common.h
gcc/c-family/c-semantics.c
gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/except.c
gcc/fortran/ChangeLog
gcc/fortran/trans-decl.c
gcc/fortran/trans-io.c
gcc/fortran/trans-stmt.c
gcc/gimplify.c
gcc/go/ChangeLog
gcc/go/go-gcc.cc
gcc/java/ChangeLog
gcc/java/expr.c
gcc/omp-low.c
gcc/tree-eh.c
gcc/tree.c
gcc/tree.h

index 297306e610e093625d6857467abf57752f746bf4..2d5bd492966f9821e23c27b5e8b60be84601b3e1 100644 (file)
@@ -1,3 +1,13 @@
+2011-05-05  Nathan Froyd  <froydnj@codesourcery.com>
+
+       * 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  <jason@redhat.com>
 
        PR c++/40975
index 922460c27c3b23e89d57eb8ae74a413db57a356e..18c56d0af994ad8896cc9906bd681b48ebffb0e1 100644 (file)
@@ -1,3 +1,8 @@
+2011-05-05  Nathan Froyd  <froydnj@codesourcery.com>
+
+       * gcc-interface/trans.c (Case_Statement_to_gnu): Call
+       build_case_label.
+
 2011-05-05  Nathan Froyd  <froydnj@codesourcery.com>
 
        * gcc-interface/decl.c (intrin_arglists_compatible_p): Use iterators
index 06b778b27baf5538f1f6561af481c1f887515d11..dc79c6fd27087ef0e51cffe7107d5d275c55cf56 100644 (file)
@@ -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;
index d3edc6cdd742e6c096a78d6695358eaa714985d3..9fa7e29b82b525d2efece8c4ab79f9cb7012b587 100644 (file)
@@ -1,3 +1,10 @@
+2011-05-05  Nathan Froyd  <froydnj@codesourcery.com>
+
+       * 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  <joseph@codesourcery.com>
 
        * c-objc.h (objc_start_method_definition): Update prototype.
index 207f77be451d2041aeb7aad7501c54c2620fd5d0..41cb7176554d1f8dd8f6df51604e636290b6314b 100644 (file)
@@ -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,
index ad6da6be4a8056af7e7c4c32f4bad6d198f396f1..420b877f09d5caff3eeb833d8aae1e03dafa3447 100644 (file)
@@ -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
index 0f9f51e061de9bd9b9c42c806566849576bc8e14..a5bd9bacb088f15c17d68e0c738b57356a39e90d 100644 (file)
@@ -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
index 20057c5bc6e7430dacb5d98a822c54e90c6a3de1..9dbb57f1049d055177dd9c31bf23b9e77101b4d2 100644 (file)
@@ -1,3 +1,8 @@
+2011-05-05  Nathan Froyd  <froydnj@codesourcery.com>
+
+       * decl.c (finish_case_label): Omit the loc argument to
+       build_case_label.
+
 2011-05-05  Jason Merrill  <jason@redhat.com>
 
        * cp-tree.h (REFERENCE_REF_P): Just check the type.
index c5184e067731e976dd21008bbb82c78b63a5669c..3622c2ceae6d579b5e26f80f30b6b7159376d3eb 100644 (file)
@@ -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.  */
index b722fb749215ef7757bef9056caf5232085e6702..9578e2e907fe330d22c77adf8334131704fa7391 100644 (file)
@@ -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);
index 00774f4f7797cbf46beda6a6b2c47f54170eeaad..da6d2ab6331745671c3f16ee5211e17654c77ae7 100644 (file)
@@ -1,3 +1,10 @@
+2011-05-05  Nathan Froyd  <froydnj@codesourcery.com>
+
+       * 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  <ebotcazou@adacore.com>
 
        * trans-decl.c (trans_function_start): Do not set
index 2452927628e34ea33e872c20107d932452315941..63f03de5ae180a863ea3b06f20bfcb85fed0c08f 100644 (file)
@@ -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.  */
index 07df5d8d8879f61412c635613f4f7b8021d25a52..4e019a36c514980fc84556c1342256152eab8ace 100644 (file)
@@ -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.  */
index 9147d889ac601847a692456f0f5fa35d636a74f2..d2a0a5fc90de0c3859bca2513ffb9c5916dc71d0 100644 (file)
@@ -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);
         }
 
index c4b84c1719826b037d30f44c3ecfbe1879d540d1..700aa238e699b0d109b5623d2932711df0c8041a 100644 (file)
@@ -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);
            }
index 6c53224083e6f0c4f6ad945538ef19bac66ae960..6df65976ccbdf11337b3fe330293bb9ffc2d541b 100644 (file)
@@ -1,3 +1,7 @@
+2011-05-05  Nathan Froyd  <froydnj@codesourcery.com>
+
+       * go-gcc.cc (Gcc_backend::switch_statement): Call build_case_label.
+
 2011-05-04  Ian Lance Taylor  <iant@google.com>
 
        * go-gcc.cc (Gcc_backend::struct_type): Call fill_in_struct.
index 18c0bbae52ebd74ffa68fd60e4a1070d28804d5e..f5a6fb579ac002f49abd93e9c145c7b24cc0bf4b 100644 (file)
@@ -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);
            }
        }
index da52f91b76f646f91c159786e367cd0d564d061f..7dea6e43f543694b830fd89d169da71f37abda6d 100644 (file)
@@ -1,3 +1,8 @@
+2011-05-05  Nathan Froyd  <froydnj@codesourcery.com>
+
+       * expr.c (expand_java_switch): Call build_case_label.
+       (expand_java_add_case): Likewise.
+
 2011-04-29  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/48819
index 53feab5ced3f3da969d922bcededc3374fd25c28..3be1cff7d3fa21042176ceb0b2b5661a0686d59e 100644 (file)
@@ -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));
index fc2cff8548806797b28f3128e79c8185c299e55c..e4bf141b908cb41883d92a7013820fabc9b741ce 100644 (file)
@@ -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);
index ceb2ff4cd022dddb5b623f90fde5d75b77486e05..cd6c428c1725a481a68acd3fb14444276dcf41ae 100644 (file)
@@ -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);
index baf6f2b7ac8547a5f449a2ba3d1c6d7ac034d3ef..7fd078db1a27980c32d34b3a2e1ce4b3afebbcce 100644 (file)
@@ -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.  */
 
index ef427606cde8a873dd08160f90c7329122ccc76c..d0cd3e05b25e071f5c921384f08624f9bcdbe70f 100644 (file)
@@ -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)