summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gold/ChangeLog9
-rw-r--r--gold/fileread.cc16
-rw-r--r--gold/fileread.h8
3 files changed, 24 insertions, 9 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index b0e90a118d6..c02a174494e 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,12 @@
+2011-03-08 Ian Lance Taylor <iant@google.com>
+
+ PR gold/12525
+ * fileread.cc: #include <climits>.
+ (GOLD_IOV_MAX): Define.
+ (File_read::read_multiple): Limit number of entries by iov_max.
+ * fileread.h (class File_read): Always set max_readv_entries to
+ 128.
+
2011-03-07 Ian Lance Taylor <iant@google.com>
PR gold/12525
diff --git a/gold/fileread.cc b/gold/fileread.cc
index 14a02b2f52f..654e47b4249 100644
--- a/gold/fileread.cc
+++ b/gold/fileread.cc
@@ -1,6 +1,6 @@
// fileread.cc -- read files for gold
-// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
@@ -24,6 +24,7 @@
#include <cstring>
#include <cerrno>
+#include <climits>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
@@ -605,11 +606,22 @@ File_read::do_readv(off_t base, const Read_multiple& rm, size_t start,
got, want, static_cast<long long>(base + first_offset));
}
+// Portable IOV_MAX.
+
+#if !defined(HAVE_READV)
+#define GOLD_IOV_MAX 1
+#elif defined(IOV_MAX)
+#define GOLD_IOV_MAX IOV_MAX
+#else
+#define GOLD_IOV_MAX (File_read::max_readv_entries * 2)
+#endif
+
// Read several pieces of data from the file.
void
File_read::read_multiple(off_t base, const Read_multiple& rm)
{
+ static size_t iov_max = GOLD_IOV_MAX;
size_t count = rm.size();
size_t i = 0;
while (i < count)
@@ -622,7 +634,7 @@ File_read::read_multiple(off_t base, const Read_multiple& rm)
size_t j;
for (j = i + 1; j < count; ++j)
{
- if (j - i >= File_read::max_readv_entries)
+ if (j - i >= File_read::max_readv_entries || j - i >= iov_max / 2)
break;
const Read_multiple_entry& j_entry(rm[j]);
off_t j_off = j_entry.file_offset;
diff --git a/gold/fileread.h b/gold/fileread.h
index a972af9ee75..d2ac9276f3a 100644
--- a/gold/fileread.h
+++ b/gold/fileread.h
@@ -1,6 +1,6 @@
// fileread.h -- read files for gold -*- C++ -*-
-// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
@@ -399,13 +399,7 @@ class File_read
{ return (file_size + (page_size - 1)) & ~ (page_size - 1); }
// The maximum number of entries we will pass to ::readv.
-#ifdef HAVE_READV
static const size_t max_readv_entries = 128;
-#else
- // On targets that don't have readv set the max to 1 so readv is not
- // used.
- static const size_t max_readv_entries = 1;
-#endif
// Use readv to read data.
void