This reworks the option to use the Enum support we have now and
adds a =one case (to eventually get rid of one LTO operation mode,
=none ...).  I was tempted to support -flto-partition=<number>
and get rid of --param lto-partitions (thereby also supporting =1),
but that param specifies the maximum number of partitions and
still uses the balanced algorithm, thus the result would be
confusing (and of little use I suppose, as opposed to =1 which should
give you the same answer as =none).

Not tested yet, queued for stage1.

Thanks,
Richard.

2014-04-01  Richard Biener  <rguent...@suse.de>

        * common.opt (lto_partition_model): New enum.
        (flto-partition=): Merge separate options with a single with argument,
        add -flto-partition=one support.
        * flag-types.h (enum lto_partition_model): Declare.
        * opts.c (finish_options): Remove duplicate -flto-partition=
        option check.
        * lto-wrapper.c (run_gcc): Adjust.

        lto/
        * lto.c: Include params.h.
        (do_whole_program_analysis): Switch on flag_lto_partition value,
        add support for LTO_PARTITION_ONE.
        * lto-partition.h (lto_balanced_map): Adjust.
        * lto-partition.c (lto_balanced_map): Get number of desired
        partitions as argument to support -flto-partition=one.



Index: gcc/common.opt
===================================================================
--- gcc/common.opt      (revision 208978)
+++ gcc/common.opt      (working copy)
@@ -1491,21 +1491,27 @@ flto=
 Common RejectNegative Joined Var(flag_lto)
 Link-time optimization with number of parallel jobs or jobserver.
 
-flto-partition=1to1
-Common Var(flag_lto_partition_1to1)
-Partition symbols and vars at linktime based on object files they originate 
from
-
-flto-partition=balanced
-Common Var(flag_lto_partition_balanced)
-Partition functions and vars at linktime into approximately same sized buckets
-
-flto-partition=max
-Common Var(flag_lto_partition_max)
-Put every symbol into separate partition
-
-flto-partition=none
-Common Var(flag_lto_partition_none)
-Disable partioning and streaming
+Enum
+Name(lto_partition_model) Type(enum lto_partition_model) UnknownError(unknown 
LTO partitioning model %qs)
+
+EnumValue
+Enum(lto_partition_model) String(none) Value(LTO_PARTITION_NONE)
+
+EnumValue
+Enum(lto_partition_model) String(one) Value(LTO_PARTITION_ONE)
+
+EnumValue
+Enum(lto_partition_model) String(balanced) Value(LTO_PARTITION_BALANCED)
+
+EnumValue
+Enum(lto_partition_model) String(1to1) Value(LTO_PARTITION_1TO1)
+
+EnumValue
+Enum(lto_partition_model) String(max) Value(LTO_PARTITION_MAX)
+
+flto-partition=
+Common Joined RejectNegative Enum(lto_partition_model) Var(flag_lto_partition) 
Init(LTO_PARTITION_BALANCED)
+Specify the algorithm to partition symbols and vars at linktime
 
 ; The initial value of -1 comes from Z_DEFAULT_COMPRESSION in zlib.h.
 flto-compression-level=
Index: gcc/flag-types.h
===================================================================
--- gcc/flag-types.h    (revision 208978)
+++ gcc/flag-types.h    (working copy)
@@ -229,4 +229,14 @@ enum vtv_priority {
   VTV_STANDARD_PRIORITY = 1,
   VTV_PREINIT_PRIORITY  = 2
 };
+
+/* flag_lto_partition initialization values.  */
+enum lto_partition_model {
+  LTO_PARTITION_NONE = 0,
+  LTO_PARTITION_ONE = 1,
+  LTO_PARTITION_BALANCED = 2,
+  LTO_PARTITION_1TO1 = 3,
+  LTO_PARTITION_MAX = 4
+};
+
 #endif /* ! GCC_FLAG_TYPES_H */
Index: gcc/opts.c
===================================================================
--- gcc/opts.c  (revision 208978)
+++ gcc/opts.c  (working copy)
@@ -824,14 +824,6 @@ finish_options (struct gcc_options *opts
          opts->x_flag_fat_lto_objects = 1;
        }
     }
-  if ((opts->x_flag_lto_partition_balanced != 0) + 
(opts->x_flag_lto_partition_1to1 != 0)
-       + (opts->x_flag_lto_partition_none != 0) >= 1)
-    {
-      if ((opts->x_flag_lto_partition_balanced != 0)
-          + (opts->x_flag_lto_partition_1to1 != 0)
-          + (opts->x_flag_lto_partition_none != 0) > 1)
-       error_at (loc, "only one -flto-partition value can be specified");
-    }
 
   /* We initialize opts->x_flag_split_stack to -1 so that targets can set a
      default value if they choose based on other options.  */
Index: gcc/lto/lto.c
===================================================================
--- gcc/lto/lto.c       (revision 208978)
+++ gcc/lto/lto.c       (working copy)
@@ -49,6 +49,7 @@ along with GCC; see the file COPYING3.
 #include "data-streamer.h"
 #include "context.h"
 #include "pass_manager.h"
+#include "params.h"
 
 
 /* Number of parallel tasks to run, -1 if we want to use GNU Make jobserver.  
*/
@@ -3266,12 +3268,16 @@ do_whole_program_analysis (void)
   timevar_pop (TV_WHOPR_WPA);
 
   timevar_push (TV_WHOPR_PARTITIONING);
-  if (flag_lto_partition_1to1)
+  if (flag_lto_partition == LTO_PARTITION_1TO1)
     lto_1_to_1_map ();
-  else if (flag_lto_partition_max)
+  else if (flag_lto_partition == LTO_PARTITION_MAX)
     lto_max_map ();
+  else if (flag_lto_partition == LTO_PARTITION_ONE)
+    lto_balanced_map (1);
+  else if (flag_lto_partition == LTO_PARTITION_BALANCED)
+    lto_balanced_map (PARAM_VALUE (PARAM_LTO_PARTITIONS));
   else
-    lto_balanced_map ();
+    gcc_unreachable ();
 
   /* AUX pointers are used by partitioning code to bookkeep number of
      partitions symbol is in.  This is no longer needed.  */
Index: gcc/lto/lto-partition.c
===================================================================
--- gcc/lto/lto-partition.c     (revision 208978)
+++ gcc/lto/lto-partition.c     (working copy)
@@ -415,7 +415,7 @@ varpool_node_cmp (const void *pa, const
    and in-partition calls was reached.  */
 
 void
-lto_balanced_map (void)
+lto_balanced_map (int n_lto_partitions)
 {
   int n_nodes = 0;
   int n_varpool_nodes = 0, varpool_pos = 0, best_varpool_pos = 0;
@@ -472,7 +472,7 @@ lto_balanced_map (void)
     }
 
   /* Compute partition size and create the first partition.  */
-  partition_size = total_size / PARAM_VALUE (PARAM_LTO_PARTITIONS);
+  partition_size = total_size / n_lto_partitions;
   if (partition_size < PARAM_VALUE (MIN_PARTITION_SIZE))
     partition_size = PARAM_VALUE (MIN_PARTITION_SIZE);
   npartitions = 1;
@@ -699,9 +699,8 @@ lto_balanced_map (void)
 
          /* Since the size of partitions is just approximate, update the size 
after
             we finished current one.  */
-         if (npartitions < PARAM_VALUE (PARAM_LTO_PARTITIONS))
-           partition_size = total_size
-             / (PARAM_VALUE (PARAM_LTO_PARTITIONS) - npartitions);
+         if (npartitions < n_lto_partitions)
+           partition_size = total_size / (n_lto_partitions - npartitions);
          else
            partition_size = INT_MAX;
 
Index: gcc/lto/lto-partition.h
===================================================================
--- gcc/lto/lto-partition.h     (revision 208978)
+++ gcc/lto/lto-partition.h     (working copy)
@@ -34,7 +34,7 @@ extern vec<ltrans_partition> ltrans_part
 
 void lto_1_to_1_map (void);
 void lto_max_map (void);
-void lto_balanced_map (void);
+void lto_balanced_map (int);
 void lto_promote_cross_file_statics (void);
 void free_ltrans_partitions (void);
 void lto_promote_statics_nonwpa (void);
Index: gcc/lto-wrapper.c
===================================================================
--- gcc/lto-wrapper.c   (revision 208978)
+++ gcc/lto-wrapper.c   (working copy)
@@ -657,9 +657,7 @@ run_gcc (unsigned argc, char *argv[])
          /* Drop arguments that we want to take from the link line.  */
          case OPT_flto_:
          case OPT_flto:
-         case OPT_flto_partition_none:
-         case OPT_flto_partition_1to1:
-         case OPT_flto_partition_balanced:
+         case OPT_flto_partition_:
              continue;
 
          default:
@@ -727,8 +725,9 @@ run_gcc (unsigned argc, char *argv[])
          verbose = 1;
          break;
 
-       case OPT_flto_partition_none:
-         no_partition = true;
+       case OPT_flto_partition_:
+         if (strcmp (option->arg, "none") == 0)
+           no_partition = true;
          break;
 
        case OPT_flto_:

Reply via email to