Break out default pbytes argument to read and get_view routines,

adding new routines.
This commit is contained in:
Ian Lance Taylor
2007-09-25 00:27:29 +00:00
parent 5f67a19ce6
commit ba45d2478b
6 changed files with 69 additions and 26 deletions

View File

@ -329,7 +329,8 @@ Archive::include_all_members(Symbol_table* symtab, Layout* layout,
while (true) while (true)
{ {
off_t bytes; off_t bytes;
const unsigned char* p = this->get_view(off, sizeof(Archive_header), const unsigned char* p = this->get_view_and_size(off,
sizeof(Archive_header),
&bytes); &bytes);
if (bytes < sizeof(Archive_header)) if (bytes < sizeof(Archive_header))
{ {
@ -379,9 +380,8 @@ Archive::include_member(Symbol_table* symtab, Layout* layout,
// Read enough of the file to pick up the entire ELF header. // Read enough of the file to pick up the entire ELF header.
int ehdr_size = elfcpp::Elf_sizes<64>::ehdr_size; int ehdr_size = elfcpp::Elf_sizes<64>::ehdr_size;
off_t bytes; off_t bytes;
const unsigned char* p = this->input_file_->file().get_view(memoff, const unsigned char* p =
ehdr_size, this->input_file_->file().get_view_and_size(memoff, ehdr_size, &bytes);
&bytes);
if (bytes < 4) if (bytes < 4)
{ {
fprintf(stderr, _("%s: %s: member at %ld is not an ELF object"), fprintf(stderr, _("%s: %s: member at %ld is not an ELF object"),

View File

@ -98,8 +98,12 @@ class Archive
// Get a view into the underlying file. // Get a view into the underlying file.
const unsigned char* const unsigned char*
get_view(off_t start, off_t size, off_t* pbytes = NULL) get_view(off_t start, off_t size)
{ return this->input_file_->file().get_view(start, size, pbytes); } { 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. // Read the archive symbol map.
void void

View File

@ -202,8 +202,25 @@ File_read::do_read(off_t start, off_t size, void* p, off_t* pbytes)
return bytes; return bytes;
} }
// Read data from the file.
void 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); 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. // mmap.
const unsigned char* 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); 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, pbytes);
@ -294,10 +319,10 @@ File_read::get_view(off_t start, off_t size, off_t* pbytes)
} }
File_view* 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); 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(); pv->lock();
return new File_view(*this, pv, pv->data() + (start - pv->start())); return new File_view(*this, pv, pv->data() + (start - pv->start()));
} }

View File

@ -80,24 +80,37 @@ class File_read
bool bool
is_locked(); is_locked();
// Return a view into the file. The pointer will remain valid until // Return a view into the file starting at file offset START for
// the File_read is unlocked. If PBYTES is NULL, it is an error if // SIZE bytes. The pointer will remain valid until the File_read is
// we can not read enough data. Otherwise *PBYTES is set to the // unlocked. It is an error if we can not read enough data from the
// number of bytes read. // file.
const unsigned char* 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 // Return a view into the file starting at file offset START, for up
// get_view. // 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 void
read(off_t start, off_t size, void* p, off_t* pbytes = NULL); read(off_t start, off_t size, void* p);
// Return a lasting view into the file. This is allocated with new, // Read up to SIZE bytes from the file into the buffer P starting at
// and the caller is responsible for deleting it when done. The // file offset START. Set *PBYTES to the number of bytes read.
// data associated with this view will remain valid until the view void
// is deleted. PBYTES is handled as with get_view. read_up_to(off_t start, off_t size, void* p, off_t* pbytes);
// 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* 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: private:
// This class may not be copied. // This class may not be copied.

View File

@ -88,7 +88,8 @@ Read_symbols::run(Workqueue* workqueue)
int ehdr_size = elfcpp::Elf_sizes<64>::ehdr_size; int ehdr_size = elfcpp::Elf_sizes<64>::ehdr_size;
off_t bytes; 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) if (bytes >= 4)
{ {
static unsigned char elfmagic[4] = static unsigned char elfmagic[4] =

View File

@ -305,7 +305,7 @@ Lex::read_file(std::string* contents)
unsigned char buf[BUFSIZ]; unsigned char buf[BUFSIZ];
do 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); contents->append(reinterpret_cast<char*>(&buf[0]), got);
off += got; off += got;
} }