adding new routines.
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)
// 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"),
// 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
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);
// 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);
}
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()));
}
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.
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] =
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;
}