[PATCH] [graphite] use debug_printer throughout graphite.

hiraditya hiraditya@msn.com
Wed Oct 7 12:55:00 GMT 2015


The debug_printer provides an elegant way to represent debug related
statements, so we are extending its usage throughout graphite infrastructure.
No functional changes intended. Passes regtest and bootstrap.

gcc/ChangeLog:

2015-10-07  hiraditya  <hiraditya@msn.com>

        * graphite-isl-ast-to-gimple.c (graphite_regenerate_ast_isl): Use debug_printer.
        * graphite-optimize-isl.c (get_schedule_for_band): Same.
        (optimize_isl): Same.
        * graphite-scop-detection.c (canonicalize_loop_closed_ssa): Rename db to dbgs.
        (scop_detection::merge_sese): Same.
        (scop_detection::build_scop_depth): Same.
        (scop_detection::build_scop_breadth): Same.
        (scop_detection::loop_is_valid_scop): Same.
        (scop_detection::add_scop): Same.
        (scop_detection::harmful_stmt_in_region): Same.
        (scop_detection::remove_subscops): Same.
        (scop_detection::remove_intersecting_scops): Same.
        (stmt_has_side_effects): Same.
        (scop_detection::graphite_can_represent_stmt): Same.
        (scop_detection::stmt_simple_for_scop_p): Same.
        (scop_detection::loop_body_is_valid_scop): Same.
        (build_scops): Same.
        (debug_printer): Move the declaration to sese.h
        * graphite.c (graphite_initialize): Initialize the dump_file for debug_printer.
        (graphite_finalize): Use debug_printer.
        (graphite_transform_loops): Use debug_printer.
        * sese.h: Move the declaration of debug_printer here.
---
 gcc/graphite-isl-ast-to-gimple.c | 28 +++++-------
 gcc/graphite-optimize-isl.c      | 13 +++---
 gcc/graphite-scop-detection.c    | 94 +++++++++++++---------------------------
 gcc/graphite.c                   | 49 +++++++++------------
 gcc/sese.h                       | 34 +++++++++++++++
 5 files changed, 99 insertions(+), 119 deletions(-)

diff --git a/gcc/graphite-isl-ast-to-gimple.c b/gcc/graphite-isl-ast-to-gimple.c
index 12e6c61..f986866 100644
--- a/gcc/graphite-isl-ast-to-gimple.c
+++ b/gcc/graphite-isl-ast-to-gimple.c
@@ -1153,12 +1153,9 @@ graphite_regenerate_ast_isl (scop_p scop)
   graphite_regenerate_error = false;
   root_node = scop_to_isl_ast (scop, ip);
 
-  if (dump_file && (dump_flags & TDF_DETAILS))
-    {
-      fprintf (dump_file, "\nISL AST generated by ISL: \n");
-      print_isl_ast_node (dump_file, root_node, scop->isl_context);
-      fprintf (dump_file, "\n");
-    }
+  DEBUG_PRINT (dbgs << "\nISL AST generated by ISL: \n";
+    print_isl_ast_node (dump_file, root_node, scop->isl_context);
+    dbgs << "\n");
 
   recompute_all_dominators ();
   graphite_verify ();
@@ -1200,18 +1197,13 @@ graphite_regenerate_ast_isl (scop_p scop)
   isl_ast_node_free (root_node);
   timevar_pop (TV_GRAPHITE_CODE_GEN);
 
-  if (dump_file && (dump_flags & TDF_DETAILS))
-    {
-      loop_p loop;
-      int num_no_dependency = 0;
-
-      FOR_EACH_LOOP (loop, 0)
-	if (loop->can_be_parallel)
-	  num_no_dependency++;
-
-      fprintf (dump_file, "\n%d loops carried no dependency.\n",
-	       num_no_dependency);
-    }
+  DEBUG_PRINT (
+    loop_p loop;
+    int num_no_dependency = 0;
+    FOR_EACH_LOOP (loop, 0)
+      if (loop->can_be_parallel)
+	num_no_dependency++;
+    dbgs << num_no_dependency << " loops carried no dependency.\n");
 
   return !graphite_regenerate_error;
 }
diff --git a/gcc/graphite-optimize-isl.c b/gcc/graphite-optimize-isl.c
index 2bae417..03ab5e9 100644
--- a/gcc/graphite-optimize-isl.c
+++ b/gcc/graphite-optimize-isl.c
@@ -177,14 +177,12 @@ get_schedule_for_band (isl_band *band, int *dimensions)
   /* It does not make any sense to tile a band with just one dimension.  */
   if (*dimensions == 1)
     {
-      if (dump_file && dump_flags)
-	fprintf (dump_file, "not tiled\n");
+      DEBUG_PRINT (dbgs << "not tiled\n");
       return partial_schedule;
     }
 
-  if (dump_file && dump_flags)
-    fprintf (dump_file, "tiled by %d\n",
-	     PARAM_VALUE (PARAM_LOOP_BLOCK_TILE_SIZE));
+  DEBUG_PRINT (dbgs << "tiled by %d\n"
+		    << PARAM_VALUE (PARAM_LOOP_BLOCK_TILE_SIZE));
 
   ctx = isl_union_map_get_ctx (partial_schedule);
   space = isl_union_map_get_space (partial_schedule);
@@ -348,9 +346,8 @@ optimize_isl (scop_p scop)
   isl_ctx_set_max_operations (scop->isl_context, old_max_operations);
   if (!schedule || isl_ctx_last_error (scop->isl_context) == isl_error_quota)
     {
-      if (dump_file && dump_flags)
-	fprintf (dump_file, "ISL timed out at %d operations\n",
-		 max_operations);
+      DEBUG_PRINT (dbgs << "ISL timed out at " << max_operations
+			<< " operations\n");
       if (schedule)
 	isl_schedule_free (schedule);
       return false;
diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c
index 700f6d0..675cc14 100644
--- a/gcc/graphite-scop-detection.c
+++ b/gcc/graphite-scop-detection.c
@@ -56,38 +56,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "graphite-scop-detection.h"
 #include "gimple-pretty-print.h"
 
-class debug_printer
-{
-private:
-  FILE *dump_file;
-
-public:
-  void
-  set_dump_file (FILE *f)
-  {
-    gcc_assert (f);
-    dump_file = f;
-  }
-
-  friend debug_printer &
-  operator<< (debug_printer &output, int i)
-  {
-    fprintf (output.dump_file, "%d", i);
-    return output;
-  }
-  friend debug_printer &
-  operator<< (debug_printer &output, const char *s)
-  {
-    fprintf (output.dump_file, "%s", s);
-    return output;
-  }
-} dp;
-
-#define DEBUG_PRINT(args) do \
-    {								\
-      if (dump_file && (dump_flags & TDF_DETAILS)) { args; }	\
-    } while (0);
-
+debug_printer dbgs;
 
 /* Return true if BB is empty, contains only DEBUG_INSNs.  */
 
@@ -216,7 +185,7 @@ canonicalize_loop_closed_ssa (loop_p loop)
   if (single_pred_p (bb))
     {
       e = split_block_after_labels (bb);
-      DEBUG_PRINT (dp << "\nSplitting bb_" << bb->index);
+      DEBUG_PRINT (dbgs << "\nSplitting bb_" << bb->index);
       make_close_phi_nodes_unique (e->src);
     }
   else
@@ -225,7 +194,7 @@ canonicalize_loop_closed_ssa (loop_p loop)
       basic_block close = split_edge (e);
 
       e = single_succ_edge (close);
-      DEBUG_PRINT (dp << "\nSplitting edge (" << e->src->index << ","
+      DEBUG_PRINT (dbgs << "\nSplitting edge (" << e->src->index << ","
 		      << e->dest->index << ")\n");
 
       for (psi = gsi_start_phis (bb); !gsi_end_p (psi); gsi_next (&psi))
@@ -638,8 +607,8 @@ scop_detection::merge_sese (sese_l first, sese_l second) const
   if (!second)
     return first;
 
-  DEBUG_PRINT (dp << "[try-merging-sese] s1: "; print_sese (dump_file, first);
-	       dp << "[try-merging-sese] s2: ";
+  DEBUG_PRINT (dbgs << "[try-merging-sese] s1: "; print_sese (dump_file, first);
+	       dbgs << "[try-merging-sese] s2: ";
 	       print_sese (dump_file, second));
 
   /* Assumption: Both the sese's should be at the same loop depth or one scop
@@ -682,7 +651,7 @@ scop_detection::merge_sese (sese_l first, sese_l second) const
       || !dominated_by_p (CDI_DOMINATORS, get_exit_bb (combined),
                          get_entry_bb (combined)))
     {
-      DEBUG_PRINT (dp << "[scop-detection-fail] cannot merge seses.\n");
+      DEBUG_PRINT (dbgs << "[scop-detection-fail] cannot merge seses.\n");
       return invalid_sese;
     }
 
@@ -697,7 +666,7 @@ scop_detection::merge_sese (sese_l first, sese_l second) const
 	combined.exit = single_succ_edge (imm_succ);
       else
 	{
-	  DEBUG_PRINT (dp << "\n[scop-detection-fail] Discarding SCoP because "
+	  DEBUG_PRINT (dbgs << "\n[scop-detection-fail] Discarding SCoP because "
 			  << "no single exit (empty succ) for sese exit";
 		       print_sese (dump_file, combined));
 	  return invalid_sese;
@@ -708,7 +677,7 @@ scop_detection::merge_sese (sese_l first, sese_l second) const
   if (harmful_stmt_in_region (combined))
     return invalid_sese;
 
-  DEBUG_PRINT (dp << "[merged-sese] s1: "; print_sese (dump_file, combined));
+  DEBUG_PRINT (dbgs << "[merged-sese] s1: "; print_sese (dump_file, combined));
 
   return combined;
 }
@@ -721,7 +690,7 @@ scop_detection::build_scop_depth (sese_l s, loop_p loop)
   if (!loop)
     return s;
 
-  DEBUG_PRINT (dp << "\n[Depth loop_" << loop->num << "]");
+  DEBUG_PRINT (dbgs << "\n[Depth loop_" << loop->num << "]");
   s = build_scop_depth (s, loop->inner);
 
   sese_l s2 = merge_sese (s, get_sese (loop));
@@ -746,7 +715,7 @@ scop_detection::build_scop_breadth (sese_l s1, loop_p loop)
 {
   if (!loop)
     return s1;
-  DEBUG_PRINT (dp << "\n[Breadth loop_" << loop->num << "]");
+  DEBUG_PRINT (dbgs << "\n[Breadth loop_" << loop->num << "]");
   gcc_assert (s1);
 
   loop_p l = loop;
@@ -816,14 +785,14 @@ scop_detection::loop_is_valid_scop (loop_p loop, sese_l scop) const
 
   if (!can_represent_loop (loop, scop))
     {
-      DEBUG_PRINT (dp << "[scop-detection-fail] cannot represent loop_"
+      DEBUG_PRINT (dbgs << "[scop-detection-fail] cannot represent loop_"
 		      << loop->num << "\n");
       return false;
     }
 
   if (loop_body_is_valid_scop (loop, scop))
     {
-      DEBUG_PRINT (dp << "[valid-scop] loop_" << loop->num
+      DEBUG_PRINT (dbgs << "[valid-scop] loop_" << loop->num
 		      << "is a valid scop.\n");
       return true;
     }
@@ -856,14 +825,14 @@ scop_detection::add_scop (sese_l s)
   /* Do not add scops with only one loop.  */
   if (region_has_one_loop (s))
     {
-      DEBUG_PRINT (dp << "\n[scop-detection-fail] Discarding one loop SCoP";
+      DEBUG_PRINT (dbgs << "\n[scop-detection-fail] Discarding one loop SCoP";
 		   print_sese (dump_file, s));
       return;
     }
 
   if (get_exit_bb (s) == EXIT_BLOCK_PTR_FOR_FN (cfun))
     {
-      DEBUG_PRINT (dp << "\n[scop-detection-fail] "
+      DEBUG_PRINT (dbgs << "\n[scop-detection-fail] "
 		      << "Discarding SCoP exiting to return";
 		   print_sese (dump_file, s));
       return;
@@ -876,7 +845,7 @@ scop_detection::add_scop (sese_l s)
   remove_intersecting_scops (s);
 
   scops.safe_push (s);
-  DEBUG_PRINT (dp << "\nAdding SCoP "; print_sese (dump_file, s));
+  DEBUG_PRINT (dbgs << "\nAdding SCoP "; print_sese (dump_file, s));
 }
 
 /* Return true when a statement in SCOP cannot be represented by Graphite.
@@ -890,7 +859,7 @@ scop_detection::harmful_stmt_in_region (sese_l scop) const
   basic_block exit_bb = get_exit_bb (scop);
   basic_block entry_bb = get_entry_bb (scop);
 
-  DEBUG_PRINT (dp << "\n[checking-harmful-bbs] ";
+  DEBUG_PRINT (dbgs << "\n[checking-harmful-bbs] ";
 	       print_sese (dump_file, scop));
   gcc_assert (dominated_by_p (CDI_DOMINATORS, exit_bb, entry_bb));
 
@@ -905,7 +874,7 @@ scop_detection::harmful_stmt_in_region (sese_l scop) const
   basic_block bb;
   FOR_EACH_VEC_ELT (dom, i, bb)
     {
-      DEBUG_PRINT (dp << "\nVisiting bb_" << bb->index);
+      DEBUG_PRINT (dbgs << "\nVisiting bb_" << bb->index);
 
       /* We don't want to analyze any bb outside sese.  */
       if (!dominated_by_p (CDI_POST_DOMINATORS, bb, exit_bb))
@@ -940,7 +909,7 @@ scop_detection::remove_subscops (sese_l s1)
     {
       if (subsumes (s1, s2))
 	{
-	  DEBUG_PRINT (dp << "\nRemoving sub-SCoP";
+	  DEBUG_PRINT (dbgs << "\nRemoving sub-SCoP";
 		       print_sese (dump_file, s2));
 	  scops.unordered_remove (j);
 	}
@@ -975,8 +944,8 @@ scop_detection::remove_intersecting_scops (sese_l s1)
     {
       if (intersects (s1, s2))
 	{
-	  DEBUG_PRINT (dp << "\nRemoving intersecting SCoP";
-		       print_sese (dump_file, s2); dp << "Intersects with:";
+	  DEBUG_PRINT (dbgs << "\nRemoving intersecting SCoP";
+		       print_sese (dump_file, s2); dbgs << "Intersects with:";
 		       print_sese (dump_file, s1));
 	  scops.unordered_remove (j);
 	}
@@ -1161,7 +1130,7 @@ stmt_has_side_effects (gimple *stmt)
 	  && !(gimple_call_flags (stmt) & (ECF_CONST | ECF_PURE)))
       || (gimple_code (stmt) == GIMPLE_ASM))
     {
-      DEBUG_PRINT (dp << "[scop-detection-fail] "
+      DEBUG_PRINT (dbgs << "[scop-detection-fail] "
 		      << "Statement has side-effects:\n";
 	print_gimple_stmt (dump_file, stmt, 0, TDF_VOPS | TDF_MEMSYMS));
       return true;
@@ -1195,7 +1164,7 @@ scop_detection::graphite_can_represent_stmt (sese_l scop, gimple *stmt,
 	      || code == EQ_EXPR
 	      || code == NE_EXPR))
 	  {
-	    DEBUG_PRINT (dp << "[scop-detection-fail] "
+	    DEBUG_PRINT (dbgs << "[scop-detection-fail] "
 			    << "Graphite cannot handle cond stmt:\n";
 			 print_gimple_stmt (dump_file, stmt, 0,
 					    TDF_VOPS | TDF_MEMSYMS));
@@ -1209,7 +1178,7 @@ scop_detection::graphite_can_represent_stmt (sese_l scop, gimple *stmt,
 		/* We can only constrain on integer type.  */
 		|| (TREE_CODE (TREE_TYPE (op)) != INTEGER_TYPE))
 	      {
-		DEBUG_PRINT (dp << "[scop-detection-fail] "
+		DEBUG_PRINT (dbgs << "[scop-detection-fail] "
 				<< "Graphite cannot represent stmt:\n";
 			     print_gimple_stmt (dump_file, stmt, 0,
 						TDF_VOPS | TDF_MEMSYMS));
@@ -1227,7 +1196,7 @@ scop_detection::graphite_can_represent_stmt (sese_l scop, gimple *stmt,
     default:
       /* These nodes cut a new scope.  */
       DEBUG_PRINT (
-	  dp << "[scop-detection-fail] "
+	  dbgs << "[scop-detection-fail] "
 	     << "Gimple stmt not handled in Graphite:\n";
 	  print_gimple_stmt (dump_file, stmt, 0, TDF_VOPS | TDF_MEMSYMS));
       return false;
@@ -1254,7 +1223,7 @@ scop_detection::stmt_simple_for_scop_p (sese_l scop, gimple *stmt,
 
   if (!stmt_has_simple_data_refs_p (scop, stmt))
     {
-      DEBUG_PRINT (dp << "[scop-detection-fail] "
+      DEBUG_PRINT (dbgs << "[scop-detection-fail] "
 		      << "Graphite cannot handle data-refs in stmt:\n";
 	print_gimple_stmt (dump_file, stmt, 0, TDF_VOPS|TDF_MEMSYMS););
       return false;
@@ -1483,14 +1452,14 @@ scop_detection::loop_body_is_valid_scop (loop_p loop, sese_l scop) const
 {
   if (!loop_ivs_can_be_represented (loop))
     {
-      DEBUG_PRINT (dp << "[scop-detection-fail] loop_" << loop->num
+      DEBUG_PRINT (dbgs << "[scop-detection-fail] loop_" << loop->num
 		      << "IV cannot be represented.\n");
       return false;
     }
 
   if (!loop_nest_has_data_refs (loop))
     {
-      DEBUG_PRINT (dp << "[scop-detection-fail] loop_" << loop->num
+      DEBUG_PRINT (dbgs << "[scop-detection-fail] loop_" << loop->num
 		      << "does not have any data reference.\n");
       return false;
     }
@@ -1868,9 +1837,6 @@ sese_dom_walker::after_dom_children (basic_block bb)
 void
 build_scops (vec<scop_p> *scops)
 {
-  if (dump_file)
-    dp.set_dump_file (dump_file);
-
   canonicalize_loop_closed_ssa_form ();
 
   scop_detection sb;
@@ -1889,7 +1855,7 @@ build_scops (vec<scop_p> *scops)
 	 to any loops.  */
       if (sb.nb_pbbs_in_loops (scop) == 0)
 	{
-	  DEBUG_PRINT (dp << "[scop-detection-fail] no data references.\n");
+	  DEBUG_PRINT (dbgs << "[scop-detection-fail] no data references.\n");
 	  free_scop (scop);
 	  continue;
 	}
@@ -1904,7 +1870,7 @@ build_scops (vec<scop_p> *scops)
 
       if (scop_nb_params (scop) > max_dim)
 	{
-	  DEBUG_PRINT (dp << "[scop-detection-fail] too many parameters: "
+	  DEBUG_PRINT (dbgs << "[scop-detection-fail] too many parameters: "
 		          << scop_nb_params (scop)
 		          << " larger than --param graphite-max-nb-scop-params="
 		          << max_dim << ".\n");
@@ -1916,7 +1882,7 @@ build_scops (vec<scop_p> *scops)
       scops->safe_push (scop);
     }
 
-  DEBUG_PRINT (dp << "number of SCoPs: " << (scops ? scops->length () : 0););
+  DEBUG_PRINT (dbgs << "number of SCoPs: " << (scops ? scops->length () : 0););
 }
 
 #endif /* HAVE_isl */
diff --git a/gcc/graphite.c b/gcc/graphite.c
index 9489f8d..17bdac2 100644
--- a/gcc/graphite.c
+++ b/gcc/graphite.c
@@ -223,20 +223,15 @@ graphite_initialize (isl_ctx *ctx)
 	 should be removed when the SCOP detection is faster.  */
       || (nbbs > max_bbs))
     {
-      if (dump_file && (dump_flags & TDF_DETAILS))
-	{
-	  if (nloops <= min_loops)
-	    fprintf (dump_file, "\nFunction does not have enough loops: "
-		     "PARAM_GRAPHITE_MIN_LOOPS_PER_FUNCTION = %d.\n",
-		     min_loops);
-
-	  else if (nbbs > max_bbs)
-	    fprintf (dump_file, "\nFunction has too many basic blocks: "
-		     "PARAM_GRAPHITE_MAX_BBS_PER_FUNCTION = %d.\n", max_bbs);
-
-	  fprintf (dump_file, "\nnumber of SCoPs: 0\n");
-	  print_global_statistics (dump_file);
-	}
+      DEBUG_PRINT (
+	if (nloops <= min_loops)
+	  dbgs << "\nFunction does not have enough loops: "
+	       << "PARAM_GRAPHITE_MIN_LOOPS_PER_FUNCTION = " << min_loops << "\n";
+	else if (nbbs > max_bbs)
+	  dbgs << "\nFunction has too many basic blocks: "
+	       << "PARAM_GRAPHITE_MAX_BBS_PER_FUNCTION = " << max_bbs << "\n";
+	dbgs << "\nnumber of SCoPs: 0\n";
+	print_global_statistics (dump_file));
 
       isl_ctx_free (ctx);
       return false;
@@ -246,11 +241,8 @@ graphite_initialize (isl_ctx *ctx)
   recompute_all_dominators ();
   initialize_original_copy_tables ();
 
-  if (dump_file && dump_flags)
-    {
-      dump_function_to_file (current_function_decl, dump_file, dump_flags);
-      print_loops (dump_file, 3);
-    }
+  DEBUG_PRINT (dump_function_to_file (current_function_decl, dump_file, dump_flags);
+    print_loops (dump_file, 3));
 
   return true;
 }
@@ -273,9 +265,7 @@ graphite_finalize (bool need_cfg_cleanup_p)
     }
 
   free_original_copy_tables ();
-
-  if (dump_file && dump_flags)
-    print_loops (dump_file, 3);
+  DEBUG_PRINT (print_loops (dump_file, 3));
 }
 
 /* Deletes all scops in SCOPS.  */
@@ -293,6 +283,7 @@ free_scops (vec<scop_p> scops)
 }
 
 isl_ctx *the_isl_ctx;
+extern debug_printer dbgs;
 
 /* Perform a set of linear transforms on the loops of the current
    function.  */
@@ -306,6 +297,10 @@ graphite_transform_loops (void)
   vec<scop_p> scops = vNULL;
   isl_ctx *ctx;
 
+  /* Set the file to put the debug messages.  */
+  if (dump_file)
+    dbgs.set_dump_file (dump_file);
+
   /* If a function is parallel it was most probably already run through graphite
      once. No need to run again.  */
   if (parallelized_function_p (cfun->decl))
@@ -319,11 +314,8 @@ graphite_transform_loops (void)
   the_isl_ctx = ctx;
   build_scops (&scops);
 
-  if (dump_file && (dump_flags & TDF_DETAILS))
-    {
-      print_graphite_statistics (dump_file, scops);
-      print_global_statistics (dump_file);
-    }
+  DEBUG_PRINT (print_graphite_statistics (dump_file, scops);
+    print_global_statistics (dump_file));
 
   FOR_EACH_VEC_ELT (scops, i, scop)
     if (dbg_cnt (graphite_scop))
@@ -331,8 +323,7 @@ graphite_transform_loops (void)
 	scop->isl_context = ctx;
 	build_poly_scop (scop);
 
-	if (dump_file && dump_flags)
-	  print_scop (dump_file, scop, 3);
+	DEBUG_PRINT (print_scop (dump_file, scop, 3));
 
 	if (POLY_SCOP_P (scop)
 	    && apply_poly_transforms (scop)
diff --git a/gcc/sese.h b/gcc/sese.h
index 1478bd8..a32763c 100644
--- a/gcc/sese.h
+++ b/gcc/sese.h
@@ -387,4 +387,38 @@ scev_analyzable_p (tree def, sese_l &region)
 	|| evolution_function_is_affine_p (scev));
 }
 
+class debug_printer
+{
+private:
+  FILE *dump_file;
+
+public:
+  void
+  set_dump_file (FILE *f)
+  {
+    gcc_assert (f);
+    dump_file = f;
+  }
+
+  friend debug_printer &
+  operator<< (debug_printer &output, int i)
+  {
+    fprintf (output.dump_file, "%d", i);
+    return output;
+  }
+  friend debug_printer &
+  operator<< (debug_printer &output, const char *s)
+  {
+    fprintf (output.dump_file, "%s", s);
+    return output;
+  }
+};
+
+extern debug_printer dbgs;
+
+#define DEBUG_PRINT(args) do \
+    {								\
+      if (dump_file && (dump_flags & TDF_DETAILS)) { args; }	\
+    } while (0);
+
 #endif
-- 
2.1.4



More information about the Gcc-patches mailing list