mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-07 07:58:54 +08:00
Break out default pbytes argument to read and get_view routines,
adding new routines.
This commit is contained in:
@ -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"),
|
||||||
|
@ -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
|
||||||
|
@ -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()));
|
||||||
}
|
}
|
||||||
|
@ -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.
|
||||||
|
@ -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] =
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user