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_: