Break out default pbytes argument to read and get_view routines,
authorIan Lance Taylor <iant@google.com>
Tue, 25 Sep 2007 00:27:29 +0000 (00:27 +0000)
committerIan Lance Taylor <iant@google.com>
Tue, 25 Sep 2007 00:27:29 +0000 (00:27 +0000)
adding new routines.

gold/archive.cc
gold/archive.h
gold/fileread.cc
gold/fileread.h
gold/readsyms.cc
gold/script.cc

index ef6ff74..f7194f8 100644 (file)
@@ -329,8 +329,9 @@ Archive::include_all_members(Symbol_table* symtab, Layout* layout,
   while (true)
     {
       off_t bytes;
-      const unsigned char* p = this->get_view(off, sizeof(Archive_header),
-                                              &bytes);
+      const unsigned char* p = this->get_view_and_size(off,
+                                                      sizeof(Archive_header),
+                                                      &bytes);
       if (bytes < sizeof(Archive_header))
         {
           if (bytes != 0)
@@ -379,9 +380,8 @@ Archive::include_member(Symbol_table* symtab, Layout* layout,
   // Read enough of the file to pick up the entire ELF header.
   int ehdr_size = elfcpp::Elf_sizes<64>::ehdr_size;
   off_t bytes;
-  const unsigned char* p = this->input_file_->file().get_view(memoff,
-                                                             ehdr_size,
-                                                             &bytes);
+  const unsigned char* p =
+    this->input_file_->file().get_view_and_size(memoff, ehdr_size, &bytes);
   if (bytes < 4)
     {
       fprintf(stderr, _("%s: %s: member at %ld is not an ELF object"),
index 8c35d22..7fa1d11 100644 (file)
@@ -98,8 +98,12 @@ class Archive
 
   // Get a view into the underlying file.
   const unsigned char*
-  get_view(off_t start, off_t size, off_t* pbytes = NULL)
-  { return this->input_file_->file().get_view(start, size, pbytes); }
+  get_view(off_t start, off_t size)
+  { return this->input_file_->file().get_view(start, size); }
+
+  const unsigned char*
+  get_view_and_size(off_t start, off_t size, off_t* pbytes)
+  { return this->input_file_->file().get_view_and_size(start, size, pbytes); }
 
   // Read the archive symbol map.
   void
index 8fad789..a39d530 100644 (file)
@@ -202,8 +202,25 @@ File_read::do_read(off_t start, off_t size, void* p, off_t* pbytes)
   return bytes;
 }
 
+// Read data from the file.
+
 void
-File_read::read(off_t start, off_t size, void* p, off_t* pbytes)
+File_read::read(off_t start, off_t size, void* p)
+{
+  gold_assert(this->lock_count_ > 0);
+
+  File_read::View* pv = this->find_view(start, size);
+  if (pv != NULL)
+    {
+      memcpy(p, pv->data() + (start - pv->start()), size);
+      return;
+    }
+
+  this->do_read(start, size, p, NULL);
+}
+
+void
+File_read::read_up_to(off_t start, off_t size, void* p, off_t* pbytes)
 {
   gold_assert(this->lock_count_ > 0);
 
@@ -286,7 +303,15 @@ File_read::find_or_make_view(off_t start, off_t size, off_t* pbytes)
 // mmap.
 
 const unsigned char*
-File_read::get_view(off_t start, off_t size, off_t* pbytes)
+File_read::get_view(off_t start, off_t size)
+{
+  gold_assert(this->lock_count_ > 0);
+  File_read::View* pv = this->find_or_make_view(start, size, NULL);
+  return pv->data() + (start - pv->start());
+}
+
+const unsigned char*
+File_read::get_view_and_size(off_t start, off_t size, off_t* pbytes)
 {
   gold_assert(this->lock_count_ > 0);
   File_read::View* pv = this->find_or_make_view(start, size, pbytes);
@@ -294,10 +319,10 @@ File_read::get_view(off_t start, off_t size, off_t* pbytes)
 }
 
 File_view*
-File_read::get_lasting_view(off_t start, off_t size, off_t* pbytes)
+File_read::get_lasting_view(off_t start, off_t size)
 {
   gold_assert(this->lock_count_ > 0);
-  File_read::View* pv = this->find_or_make_view(start, size, pbytes);
+  File_read::View* pv = this->find_or_make_view(start, size, NULL);
   pv->lock();
   return new File_view(*this, pv, pv->data() + (start - pv->start()));
 }
index b2bb468..a77721d 100644 (file)
@@ -80,24 +80,37 @@ class File_read
   bool
   is_locked();
 
-  // Return a view into the file.  The pointer will remain valid until
-  // the File_read is unlocked.  If PBYTES is NULL, it is an error if
-  // we can not read enough data.  Otherwise *PBYTES is set to the
-  // number of bytes read.
+  // Return a view into the file starting at file offset START for
+  // SIZE bytes.  The pointer will remain valid until the File_read is
+  // unlocked.  It is an error if we can not read enough data from the
+  // file.
   const unsigned char*
-  get_view(off_t start, off_t size, off_t* pbytes = NULL);
+  get_view(off_t start, off_t size);
 
-  // Read data from the file into the buffer P.  PBYTES is as in
-  // get_view.
+  // Return a view into the file starting at file offset START, for up
+  // to SIZE bytes.  Set *PBYTES to the number of bytes read.  This
+  // may be less than SIZE.  The pointer will remain valid until the
+  // File_read is unlocked.
+  const unsigned char*
+  get_view_and_size(off_t start, off_t size, off_t* pbytes);
+
+  // Read data from the file into the buffer P starting at file offset
+  // START for SIZE bytes.
+  void
+  read(off_t start, off_t size, void* p);
+
+  // Read up to SIZE bytes from the file into the buffer P starting at
+  // file offset START.  Set *PBYTES to the number of bytes read.
   void
-  read(off_t start, off_t size, void* p, off_t* pbytes = NULL);
+  read_up_to(off_t start, off_t size, void* p, off_t* pbytes);
 
-  // Return a lasting view into the file.  This is allocated with new,
-  // and the caller is responsible for deleting it when done.  The
-  // data associated with this view will remain valid until the view
-  // is deleted.  PBYTES is handled as with get_view.
+  // Return a lasting view into the file starting at file offset START
+  // for SIZE bytes.  This is allocated with new, and the caller is
+  // responsible for deleting it when done.  The data associated with
+  // this view will remain valid until the view is deleted.  It is an
+  // error if we can not read enough data from the file.
   File_view*
-  get_lasting_view(off_t start, off_t size, off_t *pbytes = NULL);
+  get_lasting_view(off_t start, off_t size);
 
  private:
   // This class may not be copied.
index 0e406fd..58e3385 100644 (file)
@@ -88,7 +88,8 @@ Read_symbols::run(Workqueue* workqueue)
 
   int ehdr_size = elfcpp::Elf_sizes<64>::ehdr_size;
   off_t bytes;
-  const unsigned char* p = input_file->file().get_view(0, ehdr_size, &bytes);
+  const unsigned char* p = input_file->file().get_view_and_size(0, ehdr_size,
+                                                               &bytes);
   if (bytes >= 4)
     {
       static unsigned char elfmagic[4] =
index 582f6b7..53cd493 100644 (file)
@@ -305,7 +305,7 @@ Lex::read_file(std::string* contents)
   unsigned char buf[BUFSIZ];
   do
     {
-      this->input_file_->file().read(off, sizeof buf, buf, &got);
+      this->input_file_->file().read_up_to(off, sizeof buf, buf, &got);
       contents->append(reinterpret_cast<char*>(&buf[0]), got);
       off += got;
     }