From f6cf9273b303df38238008c8be44bed4633afd9c Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Fri, 15 Dec 2006 04:13:37 +0000 Subject: [PATCH] bfd/ * opncls.c (bfd_openr_iovec): Add "stat" parameter. (struct opncls): Add "stat" field. (opncls_bstat): Call vec->stat. * bfd-in2.h: Regenerate. * elf32-spu.c (spu_elf_open_builtin_lib): Adjust. gdb/ * spu-linux-nat.c (spu_bfd_iovec_stat): New function. (spu_bfd_open): Adjust bfd_openr_iovec call. --- bfd/ChangeLog | 8 ++++++++ bfd/bfd-in2.h | 5 ++++- bfd/elf32-spu.c | 1 + bfd/opncls.c | 25 +++++++++++++++++++++---- gdb/ChangeLog | 5 +++++ gdb/spu-linux-nat.c | 15 ++++++++++++++- 6 files changed, 53 insertions(+), 6 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 58a7552..312fef6 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2006-12-15 Alan Modra + + * opncls.c (bfd_openr_iovec): Add "stat" parameter. + (struct opncls): Add "stat" field. + (opncls_bstat): Call vec->stat. + * bfd-in2.h: Regenerate. + * elf32-spu.c (spu_elf_open_builtin_lib): Adjust. + 2006-12-14 Alan Modra * elf-bfd.h (struct bfd_elf_section_data): Clarify sec_group diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 480b2d7..32eb6c9 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -970,7 +970,10 @@ bfd *bfd_openr_iovec (const char *filename, const char *target, file_ptr nbytes, file_ptr offset), int (*close) (struct bfd *nbfd, - void *stream)); + void *stream), + int (*stat) (struct bfd *abfd, + void *stream, + struct stat *sb)); bfd *bfd_openw (const char *filename, const char *target); diff --git a/bfd/elf32-spu.c b/bfd/elf32-spu.c index 5eb0f05..5d0c0f7 100644 --- a/bfd/elf32-spu.c +++ b/bfd/elf32-spu.c @@ -1090,6 +1090,7 @@ spu_elf_open_builtin_lib (bfd **ovl_bfd, const struct _ovl_stream *stream) ovl_mgr_open, (void *) stream, ovl_mgr_pread, + NULL, NULL); return *ovl_bfd != NULL; } diff --git a/bfd/opncls.c b/bfd/opncls.c index 4131f9d..4002f5f 100644 --- a/bfd/opncls.c +++ b/bfd/opncls.c @@ -384,7 +384,10 @@ SYNOPSIS file_ptr nbytes, file_ptr offset), int (*close) (struct bfd *nbfd, - void *stream)); + void *stream), + int (*stat) (struct bfd *abfd, + void *stream, + struct stat *sb)); DESCRIPTION @@ -411,6 +414,10 @@ DESCRIPTION <>. @var{close} either succeeds returning 0, or fails returning -1 (setting <>). + Calls @var{stat} to fill in a stat structure for bfd_stat, + bfd_get_size, and bfd_get_mtime calls. @var{stat} returns 0 + on success, or returns -1 on failure (setting <>). + If <> returns <> then an error has occurred. Possible errors are <>, <> and <>. @@ -423,6 +430,7 @@ struct opncls file_ptr (*pread) (struct bfd *abfd, void *stream, void *buf, file_ptr nbytes, file_ptr offset); int (*close) (struct bfd *abfd, void *stream); + int (*stat) (struct bfd *abfd, void *stream, struct stat *sb); file_ptr where; }; @@ -485,10 +493,15 @@ opncls_bflush (struct bfd *abfd ATTRIBUTE_UNUSED) } static int -opncls_bstat (struct bfd *abfd ATTRIBUTE_UNUSED, struct stat *sb) +opncls_bstat (struct bfd *abfd, struct stat *sb) { + struct opncls *vec = abfd->iostream; + memset (sb, 0, sizeof (*sb)); - return 0; + if (vec->stat == NULL) + return 0; + + return (vec->stat) (abfd, vec->stream, sb); } static const struct bfd_iovec opncls_iovec = { @@ -507,7 +520,10 @@ bfd_openr_iovec (const char *filename, const char *target, file_ptr nbytes, file_ptr offset), int (*close) (struct bfd *nbfd, - void *stream)) + void *stream), + int (*stat) (struct bfd *abfd, + void *stream, + struct stat *sb)) { bfd *nbfd; const bfd_target *target_vec; @@ -539,6 +555,7 @@ bfd_openr_iovec (const char *filename, const char *target, vec->stream = stream; vec->pread = pread; vec->close = close; + vec->stat = stat; nbfd->iovec = &opncls_iovec; nbfd->iostream = vec; diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 049a484..134112a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2006-12-15 Alan Modra + + * spu-linux-nat.c (spu_bfd_iovec_stat): New function. + (spu_bfd_open): Adjust bfd_openr_iovec call. + 2006-12-13 Jim Blandy * value.c (value_copy): Copy the full 'location' contents, instead diff --git a/gdb/spu-linux-nat.c b/gdb/spu-linux-nat.c index fd3673c..99144b7 100644 --- a/gdb/spu-linux-nat.c +++ b/gdb/spu-linux-nat.c @@ -281,6 +281,18 @@ spu_bfd_iovec_pread (struct bfd *abfd, void *stream, void *buf, return nbytes; } +static int +spu_bfd_iovec_stat (struct bfd *abfd, void *stream, struct stat *sb) +{ + /* We don't have an easy way of finding the size of embedded spu + images. We could parse the in-memory ELF header and section + table to find the extent of the last section but that seems + pointless when the size is needed only for checks of other + parsed values in dbxread.c. */ + sb->st_size = INT_MAX; + return 0; +} + static bfd * spu_bfd_open (CORE_ADDR addr) { @@ -291,7 +303,8 @@ spu_bfd_open (CORE_ADDR addr) nbfd = bfd_openr_iovec (xstrdup (""), "elf32-spu", spu_bfd_iovec_open, open_closure, - spu_bfd_iovec_pread, spu_bfd_iovec_close); + spu_bfd_iovec_pread, spu_bfd_iovec_close, + spu_bfd_iovec_stat); if (!nbfd) return NULL; -- 2.7.4