bfd/
authorAlan Modra <amodra@gmail.com>
Fri, 15 Dec 2006 04:13:37 +0000 (04:13 +0000)
committerAlan Modra <amodra@gmail.com>
Fri, 15 Dec 2006 04:13:37 +0000 (04:13 +0000)
* 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
bfd/bfd-in2.h
bfd/elf32-spu.c
bfd/opncls.c
gdb/ChangeLog
gdb/spu-linux-nat.c

index 58a7552475da9f8dfacae1b3bd10781a9df3835c..312fef6ffc4e725e6c96fcce951003f068d29966 100644 (file)
@@ -1,3 +1,11 @@
+2006-12-15  Alan Modra  <amodra@bigpond.net.au>
+
+       * 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  <amodra@bigpond.net.au>
 
        * elf-bfd.h (struct bfd_elf_section_data): Clarify sec_group
index 480b2d7221f60d1fedf6bb0c8d1a63b9cf27ac3b..32eb6c9335ee8a1c09bd92fb01a94b9f20851ad3 100644 (file)
@@ -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);
 
index 5eb0f0523a51c511f2c079e6ddc73a45ff0d6039..5d0c0f76ef1604a2fc262e9f8a0b27802532e6ce 100644 (file)
@@ -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;
 }
index 4131f9d278ae92d5669b5344c27451bb8d588452..4002f5f1bba384d130dbbb93982a7e8bbcdc8661 100644 (file)
@@ -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
        <<bfd_close>>.  @var{close} either succeeds returning 0, or
        fails returning -1 (setting <<bfd_error>>).
 
+       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 <<bfd_error>>).
+
        If <<bfd_openr_iovec>> returns <<NULL>> then an error has
        occurred.  Possible errors are <<bfd_error_no_memory>>,
        <<bfd_error_invalid_target>> and <<bfd_error_system_call>>.
@@ -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;
index 049a48426e7e527b9497332b4a201f10894e4b5c..134112af4ea2daf5b6fc2bb348183ff47a0e7f1c 100644 (file)
@@ -1,3 +1,8 @@
+2006-12-15  Alan Modra  <amodra@bigpond.net.au>
+
+       * spu-linux-nat.c (spu_bfd_iovec_stat): New function.
+       (spu_bfd_open): Adjust bfd_openr_iovec call.
+
 2006-12-13  Jim Blandy  <jimb@codesourcery.com>
 
        * value.c (value_copy): Copy the full 'location' contents, instead
index fd3673c6a234a6c9eb1a066eea33c49a2584f1ae..99144b75dadebf153baf15142e9bdd8c3297e941 100644 (file)
@@ -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 ("<in-memory>"), "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;