diff options
author | Alexander Monakov <amonakov@gcc.gnu.org> | 2017-09-21 15:58:14 +0300 |
---|---|---|
committer | Alexander Monakov <amonakov@gcc.gnu.org> | 2017-09-21 15:58:14 +0300 |
commit | edabe3d8b479e47a1bb3ed495f2a1d94b0ecbb2d (patch) | |
tree | 77c21e6b5ad04bf112b599f048ac60ed9a06a9b8 | |
parent | 9acb459230318eb2f786dc0b974812884a2f3d54 (diff) |
toplev: read from /dev/urandom only when needed
* toplev.h (set_random_seed): Adjust return type.
* toplev.c (init_local_tick): Move eager initialization of random_seed
to get_random_seed. Adjust comment.
(init_random_seed): Inline to get_random_seed, delete.
(get_random_seed): Initialize random_seed lazily.
(set_random_seed): Do not return previous value.
(print_switch_value): Do not call get_random_seed.
From-SVN: r253069
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/toplev.c | 52 | ||||
-rw-r--r-- | gcc/toplev.h | 2 |
3 files changed, 28 insertions, 38 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 90dc208d572..7c0674d5ad7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,14 @@ -2017-09-21 Evgeny Kudryashov <kudryashov@ispras.ru> +2017-09-21 Alexander Monakov <amonakov@ispras.ru> + + * toplev.h (set_random_seed): Adjust return type. + * toplev.c (init_local_tick): Move eager initialization of random_seed + to get_random_seed. Adjust comment. + (init_random_seed): Inline to get_random_seed, delete. + (get_random_seed): Initialize random_seed lazily. + (set_random_seed): Do not return previous value. + (print_switch_value): Do not call get_random_seed. + +2017-09-21 Evgeny Kudryashov <kudryashov@ispras.ru> * cgraph.c (delete_function_version): New, broken out from... (cgraph_node::delete_function_version): ...here. Rename to diff --git a/gcc/toplev.c b/gcc/toplev.c index 6f48e10850d..bee79d313b2 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -239,7 +239,7 @@ announce_function (tree decl) } } -/* Initialize local_tick with a random number or -1 if +/* Initialize local_tick with the time of day, or -1 if flag_random_seed is set. */ static void @@ -247,19 +247,6 @@ init_local_tick (void) { if (!flag_random_seed) { - /* Try urandom first. Time of day is too likely to collide. - In case of any error we just use the local tick. */ - - int fd = open ("/dev/urandom", O_RDONLY); - if (fd >= 0) - { - if (read (fd, &random_seed, sizeof (random_seed)) - != sizeof (random_seed)) - random_seed = 0; - close (fd); - } - - /* Now get the tick anyways */ #ifdef HAVE_GETTIMEOFDAY { struct timeval tv; @@ -280,34 +267,33 @@ init_local_tick (void) local_tick = -1; } -/* Set up a default flag_random_seed and local_tick, unless the user - already specified one. Must be called after init_local_tick. */ - -static void -init_random_seed (void) -{ - if (!random_seed) - random_seed = local_tick ^ getpid (); /* Old racey fallback method */ -} - /* Obtain the random_seed. Unless NOINIT, initialize it if it's not provided in the command line. */ HOST_WIDE_INT get_random_seed (bool noinit) { - if (!flag_random_seed && !noinit) - init_random_seed (); + if (!random_seed && !noinit) + { + int fd = open ("/dev/urandom", O_RDONLY); + if (fd >= 0) + { + if (read (fd, &random_seed, sizeof (random_seed)) + != sizeof (random_seed)) + random_seed = 0; + close (fd); + } + if (!random_seed) + random_seed = local_tick ^ getpid (); + } return random_seed; } -/* Modify the random_seed string to VAL. Return its previous - value. */ +/* Set flag_random_seed to VAL, and if non-null, reinitialize random_seed. */ -const char * +void set_random_seed (const char *val) { - const char *old = flag_random_seed; flag_random_seed = val; if (flag_random_seed) { @@ -318,7 +304,6 @@ set_random_seed (const char *val) if (!(endp > flag_random_seed && *endp == 0)) random_seed = crc32_string (0, flag_random_seed); } - return old; } /* Handler for fatal signals, such as SIGSEGV. These are transformed @@ -818,11 +803,6 @@ print_switch_values (print_switch_fn_type print_fn) int pos = 0; size_t j; - /* Fill in the -frandom-seed option, if the user didn't pass it, so - that it can be printed below. This helps reproducibility. */ - if (!flag_random_seed) - init_random_seed (); - /* Print the options as passed. */ pos = print_single_switch (print_fn, pos, SWITCH_TYPE_DESCRIPTIVE, _("options passed: ")); diff --git a/gcc/toplev.h b/gcc/toplev.h index 2f6b587d233..aed806eb28f 100644 --- a/gcc/toplev.h +++ b/gcc/toplev.h @@ -91,7 +91,7 @@ extern bool set_src_pwd (const char *); /* Functions used to manipulate the random seed. */ extern HOST_WIDE_INT get_random_seed (bool); -extern const char *set_random_seed (const char *); +extern void set_random_seed (const char *); extern void initialize_rtl (void); |