From 7c0640fa36c37d0e17b1db3ab9b1c66792f8a5fb Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Wed, 6 Jun 2012 22:12:47 +0000 Subject: [PATCH] gold/ * configure.ac: Add check for fallocate. * configure: Regenerate. * config.in: Regenerate. * options.h (class General_options): Add --mmap-output-file and --posix-fallocate options. * output.cc: (posix_fallocate): Remove; replace with... (gold_fallocate): New function. (Output_file::map_no_anonymous): Call gold_fallocate. (Output_file::map): Check --mmap-output-file option. --- gold/ChangeLog | 13 +++++++++++++ gold/config.in | 3 +++ gold/configure | 3 ++- gold/configure.ac | 2 +- gold/options.h | 9 +++++++++ gold/output.cc | 40 ++++++++++++++++++++++++---------------- 6 files changed, 52 insertions(+), 18 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 6752c13bea5..3d93e223226 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,16 @@ +2012-06-06 Cary Coutant + + * configure.ac: Add check for fallocate. + * configure: Regenerate. + * config.in: Regenerate. + + * options.h (class General_options): Add --mmap-output-file and + --posix-fallocate options. + * output.cc: (posix_fallocate): Remove; replace with... + (gold_fallocate): New function. + (Output_file::map_no_anonymous): Call gold_fallocate. + (Output_file::map): Check --mmap-output-file option. + 2012-06-05 Jing Yu * gold.h (textdomain): Add do {} to empty while(0). diff --git a/gold/config.in b/gold/config.in index dd0a0da335b..ff4d5ee5b9e 100644 --- a/gold/config.in +++ b/gold/config.in @@ -79,6 +79,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_EXT_HASH_SET +/* Define to 1 if you have the `fallocate' function. */ +#undef HAVE_FALLOCATE + /* Define to 1 if you have the `ffsll' function. */ #undef HAVE_FFSLL diff --git a/gold/configure b/gold/configure index dec02dc896b..b84234a8483 100755 --- a/gold/configure +++ b/gold/configure @@ -3222,6 +3222,7 @@ am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' ac_config_headers="$ac_config_headers config.h:config.in" +# PR 14072 @@ -7123,7 +7124,7 @@ fi done -for ac_func in mallinfo posix_fallocate readv sysconf times +for ac_func in mallinfo posix_fallocate fallocate readv sysconf times do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var" diff --git a/gold/configure.ac b/gold/configure.ac index a2c4875eb42..fdea6291edb 100644 --- a/gold/configure.ac +++ b/gold/configure.ac @@ -499,7 +499,7 @@ AC_LANG_PUSH(C++) AC_CHECK_HEADERS(tr1/unordered_set tr1/unordered_map) AC_CHECK_HEADERS(ext/hash_map ext/hash_set) AC_CHECK_HEADERS(byteswap.h) -AC_CHECK_FUNCS(mallinfo posix_fallocate readv sysconf times) +AC_CHECK_FUNCS(mallinfo posix_fallocate fallocate readv sysconf times) AC_CHECK_DECLS([basename, ffs, asprintf, vasprintf, snprintf, vsnprintf, strverscmp, strndup, memmem]) # Use of ::std::tr1::unordered_map::rehash causes undefined symbols diff --git a/gold/options.h b/gold/options.h index b244bd54b39..6463b809dde 100644 --- a/gold/options.h +++ b/gold/options.h @@ -889,6 +889,10 @@ class General_options DEFINE_string(m, options::EXACTLY_ONE_DASH, 'm', "", N_("Set GNU linker emulation; obsolete"), N_("EMULATION")); + DEFINE_bool(mmap_output_file, options::TWO_DASHES, '\0', true, + N_("Map the output file for writing (default)."), + N_("Do not map the output file for writing.")); + DEFINE_bool(print_map, options::TWO_DASHES, 'M', false, N_("Write map file on standard output"), NULL); DEFINE_string(Map, options::ONE_DASH, '\0', NULL, N_("Write map file"), @@ -939,6 +943,11 @@ class General_options N_("Pass an option to the plugin"), N_("OPTION")); #endif + DEFINE_bool(posix_fallocate, options::TWO_DASHES, '\0', true, + N_("Use posix_fallocate to reserve space in the output file" + " (default)."), + N_("Use fallocate or ftruncate to reserve space.")); + DEFINE_bool(preread_archive_symbols, options::TWO_DASHES, '\0', false, N_("Preread archive symbols when multi-threaded"), NULL); diff --git a/gold/output.cc b/gold/output.cc index 2236916054a..99890ebae1e 100644 --- a/gold/output.cc +++ b/gold/output.cc @@ -111,20 +111,6 @@ extern "C" void *gold_mremap(void *, size_t, size_t, int); # define MREMAP_MAYMOVE 1 #endif -#ifndef HAVE_POSIX_FALLOCATE -// A dummy, non general, version of posix_fallocate. Here we just set -// the file size and hope that there is enough disk space. FIXME: We -// could allocate disk space by walking block by block and writing a -// zero byte into each block. -static int -posix_fallocate(int o, off_t offset, off_t len) -{ - if (ftruncate(o, offset + len) < 0) - return errno; - return 0; -} -#endif // !defined(HAVE_POSIX_FALLOCATE) - // Mingw does not have S_ISLNK. #ifndef S_ISLNK # define S_ISLNK(mode) 0 @@ -133,6 +119,27 @@ posix_fallocate(int o, off_t offset, off_t len) namespace gold { +// A wrapper around posix_fallocate. If we don't have posix_fallocate, +// or the --no-posix-fallocate option is set, we try the fallocate +// system call directly. If that fails, we use ftruncate to set +// the file size and hope that there is enough disk space. + +static int +gold_fallocate(int o, off_t offset, off_t len) +{ +#ifdef HAVE_POSIX_FALLOCATE + if (parameters->options().posix_fallocate()) + return ::posix_fallocate(o, offset, len); +#endif // defined(HAVE_POSIX_FALLOCATE) +#ifdef HAVE_FALLOCATE + if (::fallocate(o, 0, offset, len) == 0) + return 0; +#endif // defined(HAVE_FALLOCATE) + if (::ftruncate(o, offset + len) < 0) + return errno; + return 0; +} + // Output_data variables. bool Output_data::allocated_sizes_are_fixed; @@ -5014,7 +5021,7 @@ Output_file::map_no_anonymous(bool writable) // but that would be a more significant performance hit. if (writable) { - int err = ::posix_fallocate(o, 0, this->file_size_); + int err = gold_fallocate(o, 0, this->file_size_); if (err != 0) gold_fatal(_("%s: %s"), this->name_, strerror(err)); } @@ -5041,7 +5048,8 @@ Output_file::map_no_anonymous(bool writable) void Output_file::map() { - if (this->map_no_anonymous(true)) + if (parameters->options().mmap_output_file() + && this->map_no_anonymous(true)) return; // The mmap call might fail because of file system issues: the file -- 2.30.2