2010-04-01 Tristan Gingold <gingold@adacore.com>
authorTristan Gingold <gingold@adacore.com>
Thu, 1 Apr 2010 09:47:14 +0000 (09:47 +0000)
committerTristan Gingold <gingold@adacore.com>
Thu, 1 Apr 2010 09:47:14 +0000 (09:47 +0000)
* vms.h: Include time.h. Add prototypes for vms_get_module_name,
vms_time_to_time_t and vms_rawtime_to_time_t.
* vms.c (vms_alpha_vec): Add archives support.
* vms-misc.c: Include safe-ctype.h
(vms_get_module_name): New function.
(vms_time_to_time_t, vms_rawtime_to_time_t): Ditto.
* vms-hdr.c (_bfd_vms_write_hdr): Put module name creation to the
vms_get_module_name function.  Use this function.
* targets.c: Declare vms_lib_txt_vec.  Add it to _bfd_target_vector.
* libbfd-in.h: Add prototype for _bfd_append_relative_path.
Add prototypes for vms-lib.c
* libbfd.h: Regenerate.
* configure.in (TDEFINES): Add an entry for vms_lib_txt_vec.  Add
vms-lib.lo to vms_alpha_vec.
* config.bfd (targ_cpu): Add targ_selvecs for alpha*-*-*vms*.
* configure: Regenerate.
* bfd.c: Add selective_search field.
* bfd-in2.h: Regenerate.
* archive.c (append_relative_path): Rename to
_bfd_append_relative_path and make it public.
(_bfd_get_elt_at_filepos): Adjust for above renaming.
* Makefile.am (BFD32_BACKENDS): Add vms-lib.lo
(BFD32_BACKENDS_CFILES): Add vms-lib.c
* Makefile.in: Regenerate.

16 files changed:
bfd/ChangeLog
bfd/Makefile.am
bfd/Makefile.in
bfd/archive.c
bfd/bfd-in2.h
bfd/bfd.c
bfd/config.bfd
bfd/configure
bfd/configure.in
bfd/libbfd-in.h
bfd/libbfd.h
bfd/targets.c
bfd/vms-hdr.c
bfd/vms-misc.c
bfd/vms.c
bfd/vms.h

index 68bd72cbb9562db7c21c68e7cad498ffb90f3834..de1ed790eb0398634d49b25f0cd195729a10fe74 100644 (file)
@@ -1,3 +1,30 @@
+2010-04-01  Tristan Gingold  <gingold@adacore.com>
+
+       * vms.h: Include time.h. Add prototypes for vms_get_module_name,
+       vms_time_to_time_t and vms_rawtime_to_time_t.
+       * vms.c (vms_alpha_vec): Add archives support.
+       * vms-misc.c: Include safe-ctype.h
+       (vms_get_module_name): New function.
+       (vms_time_to_time_t, vms_rawtime_to_time_t): Ditto.
+       * vms-hdr.c (_bfd_vms_write_hdr): Put module name creation to the
+       vms_get_module_name function.  Use this function.
+       * targets.c: Declare vms_lib_txt_vec.  Add it to _bfd_target_vector.
+       * libbfd-in.h: Add prototype for _bfd_append_relative_path.
+       Add prototypes for vms-lib.c
+       * libbfd.h: Regenerate.
+       * configure.in (TDEFINES): Add an entry for vms_lib_txt_vec.  Add
+       vms-lib.lo to vms_alpha_vec.
+       * config.bfd (targ_cpu): Add targ_selvecs for alpha*-*-*vms*.
+       * configure: Regenerate.
+       * bfd.c: Add selective_search field.
+       * bfd-in2.h: Regenerate.
+       * archive.c (append_relative_path): Rename to
+       _bfd_append_relative_path and make it public.
+       (_bfd_get_elt_at_filepos): Adjust for above renaming.
+       * Makefile.am (BFD32_BACKENDS): Add vms-lib.lo
+       (BFD32_BACKENDS_CFILES): Add vms-lib.c
+       * Makefile.in: Regenerate.
+
 2010-04-01  Jakub Jelinek  <jakub@redhat.com>
 
        * dwarf2.c (read_attribute_value): Handle CU version 4
index b1ef71e23319eab88f4fea922c2b7a05d5e73721..ac38177ed0c1974d5a00326ce201222cd813707b 100644 (file)
@@ -393,6 +393,7 @@ BFD32_BACKENDS = \
        versados.lo \
        vms-gsd.lo \
        vms-hdr.lo \
+       vms-lib.lo \
        vms-misc.lo \
        vms-tir.lo \
        vms.lo \
@@ -577,6 +578,7 @@ BFD32_BACKENDS_CFILES = \
        versados.c \
        vms-gsd.c \
        vms-hdr.c \
+       vms-lib.c \
        vms-misc.c \
        vms-tir.c \
        vms.c \
index 93489ba07e9645414d2e058dc8f53a1a1a7b9845..ed626c957dd3eb26a5cf9cedce120a135765eadb 100644 (file)
@@ -690,6 +690,7 @@ BFD32_BACKENDS = \
        versados.lo \
        vms-gsd.lo \
        vms-hdr.lo \
+       vms-lib.lo \
        vms-misc.lo \
        vms-tir.lo \
        vms.lo \
@@ -874,6 +875,7 @@ BFD32_BACKENDS_CFILES = \
        versados.c \
        vms-gsd.c \
        vms-hdr.c \
+       vms-lib.c \
        vms-misc.c \
        vms-tir.c \
        vms.c \
@@ -1488,6 +1490,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/versados.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vms-gsd.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vms-hdr.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vms-lib.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vms-misc.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vms-tir.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vms.Plo@am__quote@
index 15eea03629b78b78391c9d137745a4fb0bb856bf..e6c1e8385324d0930fd095aa54297a8db6d5c91e 100644 (file)
@@ -536,8 +536,8 @@ _bfd_generic_read_ar_hdr_mag (bfd *abfd, const char *mag)
 /* Append the relative pathname for a member of the thin archive
    to the pathname of the directory containing the archive.  */
 
-static char *
-append_relative_path (bfd *arch, char *elt_name)
+char *
+_bfd_append_relative_path (bfd *arch, char *elt_name)
 {
   const char *arch_name = arch->filename;
   const char *base_name = lbasename (arch_name);
@@ -591,7 +591,7 @@ _bfd_get_elt_at_filepos (bfd *archive, file_ptr filepos)
       /* This is a proxy entry for an external file.  */
       if (! IS_ABSOLUTE_PATH (filename))
         {
-          filename = append_relative_path (archive, filename);
+          filename = _bfd_append_relative_path (archive, filename);
           if (filename == NULL)
             return NULL;
         }
index abf4c177d08e13e35ff3b7fba915a9a18a21236b..9cf4f643449f405e893e155196236be38c948025 100644 (file)
@@ -5119,6 +5119,10 @@ struct bfd
 
   /* Set if this is a thin archive.  */
   unsigned int is_thin_archive : 1;
+
+  /* Set if only required symbols should be added in the link hash table for
+     this object.  Used by VMS linkers.  */
+  unsigned int selective_search : 1;
 };
 
 typedef enum bfd_error
index eef9f3615b6382fc9a100a9c0eb0fcd63768b971..771989b75899383357744d03a6ba63dbf14c0d92 100644 (file)
--- a/bfd/bfd.c
+++ b/bfd/bfd.c
@@ -286,6 +286,10 @@ CODE_FRAGMENT
 .
 .  {* Set if this is a thin archive.  *}
 .  unsigned int is_thin_archive : 1;
+.
+.  {* Set if only required symbols should be added in the link hash table for
+.     this object.  Used by VMS linkers.  *}
+.  unsigned int selective_search : 1;
 .};
 .
 */
index 2e29fa30098f19af734cdfe53627d8928d7e708c..1c1c9886aa612a1ef95235d27f7ab43f65d7e8b7 100644 (file)
@@ -177,6 +177,7 @@ case "${targ}" in
     ;;
   alpha*-*-*vms*)
     targ_defvec=vms_alpha_vec
+    targ_selvecs=vms_lib_txt_vec
     want64=true
     ;;
   alpha*-*-*)
index a78e77062a9919154e983f2ce34da396b3cf3305..0f73da3c25767773000ec61f32d67ae9db37cef7 100755 (executable)
@@ -15260,7 +15260,8 @@ do
     vax1knetbsd_vec)           tb="$tb vax1knetbsd.lo aout32.lo" ;;
     vaxbsd_vec)                        tb="$tb vaxbsd.lo aout32.lo" ;;
     versados_vec)              tb="$tb versados.lo" ;;
-    vms_alpha_vec)             tb="$tb vms.lo vms-hdr.lo vms-gsd.lo vms-tir.lo vms-misc.lo"; target_size=64 ;;
+    vms_alpha_vec)             tb="$tb vms.lo vms-hdr.lo vms-gsd.lo vms-tir.lo vms-misc.lo vms-lib.lo"; target_size=64 ;;
+    vms_lib_txt_vec)           tb="$tb vms-lib.lo vms-misc.lo" ;;
     vms_vax_vec)               tb="$tb vms.lo vms-hdr.lo vms-gsd.lo vms-tir.lo vms-misc.lo" ;;
     w65_vec)                   tb="$tb coff-w65.lo reloc16.lo" ;;
     we32kcoff_vec)             tb="$tb coff-we32k.lo" ;;
index 717ce46c102ea1f97cde69a6fe25e60ec52a3eac..dfbd0a2ee820dce67b58c632d008e04dcea352c6 100644 (file)
@@ -919,7 +919,8 @@ do
     vax1knetbsd_vec)           tb="$tb vax1knetbsd.lo aout32.lo" ;;
     vaxbsd_vec)                        tb="$tb vaxbsd.lo aout32.lo" ;;
     versados_vec)              tb="$tb versados.lo" ;;
-    vms_alpha_vec)             tb="$tb vms.lo vms-hdr.lo vms-gsd.lo vms-tir.lo vms-misc.lo"; target_size=64 ;;
+    vms_alpha_vec)             tb="$tb vms.lo vms-hdr.lo vms-gsd.lo vms-tir.lo vms-misc.lo vms-lib.lo"; target_size=64 ;;
+    vms_lib_txt_vec)           tb="$tb vms-lib.lo vms-misc.lo" ;;
     vms_vax_vec)               tb="$tb vms.lo vms-hdr.lo vms-gsd.lo vms-tir.lo vms-misc.lo" ;;
     w65_vec)                   tb="$tb coff-w65.lo reloc16.lo" ;;
     we32kcoff_vec)             tb="$tb coff-we32k.lo" ;;
index d74ebbbf6510cba1140a7445903d75c3eae19ee7..89d0df6905c258844672b55adf56845118a8b127 100644 (file)
@@ -137,6 +137,8 @@ bfd_boolean _bfd_add_bfd_to_archive_cache
   (bfd *, file_ptr, bfd *);
 bfd_boolean _bfd_generic_mkarchive
   (bfd *abfd);
+char *_bfd_append_relative_path
+  (bfd *arch, char *elt_name);
 const bfd_target *bfd_generic_archive_p
   (bfd *abfd);
 bfd_boolean bfd_slurp_armap
@@ -351,6 +353,30 @@ extern bfd_boolean _bfd_archive_bsd44_construct_extended_name_table
 #define _bfd_archive_bsd44_update_armap_timestamp \
   _bfd_archive_bsd_update_armap_timestamp
 
+/* Routines to use for BFD_JUMP_TABLE_ARCHIVE to get VMS style
+   archives.  Use BFD_JUMP_TABLE_ARCHIVE (_bfd_vms_lib).  Some of them
+   are irrelevant and never called, so defined as NULL.  */
+
+extern bfd_boolean _bfd_vms_lib_write_archive_contents (bfd *arch);
+#define _bfd_vms_lib_slurp_armap NULL
+#define _bfd_vms_lib_slurp_extended_name_table NULL
+#define _bfd_vms_lib_construct_extended_name_table NULL
+#define _bfd_vms_lib_truncate_arname NULL
+#define _bfd_vms_lib_write_armap NULL
+#define _bfd_vms_lib_read_ar_hdr NULL
+#define _bfd_vms_lib_write_ar_hdr NULL
+extern bfd *_bfd_vms_lib_openr_next_archived_file (bfd *, bfd *);
+extern bfd *_bfd_vms_lib_get_elt_at_index (bfd *, symindex);
+extern int _bfd_vms_lib_generic_stat_arch_elt (bfd *, struct stat *);
+#define _bfd_vms_lib_update_armap_timestamp bfd_true
+
+/* Extra routines for VMS style archives.  */
+
+extern symindex _bfd_vms_lib_find_symbol (bfd *, const char *);
+extern bfd *_bfd_vms_lib_get_imagelib_file (bfd *);
+extern const bfd_target *_bfd_vms_lib_alpha_archive_p (bfd *abfd);
+extern bfd_boolean _bfd_vms_lib_mkarchive (bfd *abfd);
+
 /* Routines to use for BFD_JUMP_TABLE_SYMBOLS where there is no symbol
    support.  Use BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols).  */
 
index d37f03822a85d34f00665da4b2f0b1097fd57d38..c02063a360fcebcf509f7432aa0537506f61889b 100644 (file)
@@ -142,6 +142,8 @@ bfd_boolean _bfd_add_bfd_to_archive_cache
   (bfd *, file_ptr, bfd *);
 bfd_boolean _bfd_generic_mkarchive
   (bfd *abfd);
+char *_bfd_append_relative_path
+  (bfd *arch, char *elt_name);
 const bfd_target *bfd_generic_archive_p
   (bfd *abfd);
 bfd_boolean bfd_slurp_armap
@@ -356,6 +358,30 @@ extern bfd_boolean _bfd_archive_bsd44_construct_extended_name_table
 #define _bfd_archive_bsd44_update_armap_timestamp \
   _bfd_archive_bsd_update_armap_timestamp
 
+/* Routines to use for BFD_JUMP_TABLE_ARCHIVE to get VMS style
+   archives.  Use BFD_JUMP_TABLE_ARCHIVE (_bfd_vms_lib).  Some of them
+   are irrelevant and never called, so defined as NULL.  */
+
+extern bfd_boolean _bfd_vms_lib_write_archive_contents (bfd *arch);
+#define _bfd_vms_lib_slurp_armap NULL
+#define _bfd_vms_lib_slurp_extended_name_table NULL
+#define _bfd_vms_lib_construct_extended_name_table NULL
+#define _bfd_vms_lib_truncate_arname NULL
+#define _bfd_vms_lib_write_armap NULL
+#define _bfd_vms_lib_read_ar_hdr NULL
+#define _bfd_vms_lib_write_ar_hdr NULL
+extern bfd *_bfd_vms_lib_openr_next_archived_file (bfd *, bfd *);
+extern bfd *_bfd_vms_lib_get_elt_at_index (bfd *, symindex);
+extern int _bfd_vms_lib_generic_stat_arch_elt (bfd *, struct stat *);
+#define _bfd_vms_lib_update_armap_timestamp bfd_true
+
+/* Extra routines for VMS style archives.  */
+
+extern symindex _bfd_vms_lib_find_symbol (bfd *, const char *);
+extern bfd *_bfd_vms_lib_get_imagelib_file (bfd *);
+extern const bfd_target *_bfd_vms_lib_alpha_archive_p (bfd *abfd);
+extern bfd_boolean _bfd_vms_lib_mkarchive (bfd *abfd);
+
 /* Routines to use for BFD_JUMP_TABLE_SYMBOLS where there is no symbol
    support.  Use BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols).  */
 
index 1196b4f263d3fcf07f17908170e3d55c0ed7f0b8..5ee73c46e74d892fb6a8827b4e525c06b24f02bd 100644 (file)
@@ -827,6 +827,7 @@ extern const bfd_target vaxnetbsd_vec;
 extern const bfd_target vax1knetbsd_vec;
 extern const bfd_target versados_vec;
 extern const bfd_target vms_alpha_vec;
+extern const bfd_target vms_lib_txt_vec;
 extern const bfd_target vms_vax_vec;
 extern const bfd_target w65_vec;
 extern const bfd_target we32kcoff_vec;
@@ -1227,6 +1228,7 @@ static const bfd_target * const _bfd_target_vector[] =
 #ifdef BFD64
        &vms_alpha_vec,
 #endif
+        &vms_lib_txt_vec,
        &vms_vax_vec,
        &w65_vec,
        &we32kcoff_vec,
index 4ac5b9779d24a1204fb04e7d5233c4af0c58fd04..343f53ec3b03979aa310704f5284f52674caf007 100644 (file)
@@ -237,43 +237,9 @@ _bfd_vms_write_hdr (bfd *abfd, int objtype)
   /* Create module name from filename.  */
   if (bfd_get_filename (abfd) != 0)
     {
-      /* Strip path and suffix information.  */
-      char *fname, *fout, *fptr;
-
-      fptr = bfd_get_filename (abfd);
-      fname = strdup (fptr);
-
-      /* Strip VMS path.  */
-      fout = strrchr (fname, ']');
-      if (fout == NULL)
-       fout = strchr (fname, ':');
-      if (fout != NULL)
-       fout++;
-      else
-       fout = fname;
-
-      /* Strip UNIX path.  */
-      fptr = strrchr (fout, '/');
-      if (fptr != NULL)
-       fout = fptr + 1;
-
-      /* Strip suffix.  */
-      fptr = strrchr (fout, '.');
-      if (fptr != 0)
-       *fptr = 0;
-
-      /* Convert to upper case and truncate at 31 characters.
-         (VMS object file format restricts module name length to 31).  */
-      fptr = fout;
-      while (*fptr != 0)
-       {
-         *fptr = TOUPPER (*fptr);
-         fptr++;
-         if (*fptr == ';' || (fptr - fout) >= 31)
-           *fptr = 0;
-       }
-      _bfd_vms_output_counted (abfd, fout);
-      free (fname);
+      char *module = vms_get_module_name (bfd_get_filename (abfd), TRUE);
+      _bfd_vms_output_counted (abfd, module);
+      free (module);
     }
   else
     _bfd_vms_output_counted (abfd, "NONAME");
index 47e598559b181c763930feee88e53f951fc4f414..96463243b23f8cc037c2f3a5d360d4fc632bc3b7 100644 (file)
@@ -30,6 +30,7 @@
 #include "bfd.h"
 #include "bfdlink.h"
 #include "libbfd.h"
+#include "safe-ctype.h"
 
 #include "vms.h"
 
@@ -1045,3 +1046,93 @@ _bfd_vms_enter_symbol (bfd * abfd, char *name)
 #endif
   return entry;
 }
+
+/* Create module name from filename (ie, extract the basename and convert it
+   in upper cases).  Works on both VMS and UNIX pathes.
+   The result has to be free().  */
+
+char *
+vms_get_module_name (const char *filename, bfd_boolean upcase)
+{
+  char *fname, *fptr;
+  const char *fout;
+
+  /* Strip VMS path.  */
+  fout = strrchr (filename, ']');
+  if (fout == NULL)
+    fout = strchr (filename, ':');
+  if (fout != NULL)
+    fout++;
+  else
+    fout = filename;
+      
+  /* Strip UNIX path.  */
+  fptr = strrchr (fout, '/');
+  if (fptr != NULL)
+    fout = fptr + 1;
+  
+  fname = strdup (fout);
+
+  /* Strip suffix.  */
+  fptr = strrchr (fname, '.');
+  if (fptr != 0)
+    *fptr = 0;
+  
+  /* Convert to upper case and truncate at 31 characters.
+     (VMS object file format restricts module name length to 31).  */
+  fptr = fname;
+  for (fptr = fname; *fptr != 0; fptr++)
+    {
+      if (*fptr == ';' || (fptr - fname) >= 31)
+        {
+          *fptr = 0;
+          break;
+        }
+      if (upcase)
+        *fptr = TOUPPER (*fptr);
+    }
+  return fname;
+}
+
+/* Convert a raw VMS time to a unix time.  */
+
+time_t
+vms_time_to_time_t (unsigned int hi, unsigned int lo)
+{
+  const unsigned int off = 3506716800U;
+  const unsigned int factor = 10000000;
+  unsigned int tmp;
+  unsigned int rlo;
+  int i;
+
+  /* First convert to seconds.  */
+  tmp = hi % factor;
+  hi = hi / factor;
+  rlo = 0;
+  for (i = 0; i < 4; i++)
+    {
+      tmp = (tmp << 8) | (lo >> 24);
+      lo <<= 8;
+
+      rlo = (rlo << 8) | (tmp / factor);
+      tmp %= factor;
+    }
+  lo = rlo;
+
+  /* Return 0 in case of overflow.  */
+  if (lo > off && hi > 1)
+    return 0;
+
+  return lo - off;
+}
+
+/* Convert a raw (stored in a buffer) VMS time to a unix time.  */
+
+time_t
+vms_rawtime_to_time_t (unsigned char *buf)
+{
+  unsigned int hi = bfd_getl32 (buf + 4);
+  unsigned int lo = bfd_getl32 (buf + 0);
+
+  return vms_time_to_time_t (hi, lo);
+}
index 176705e10ec12310695933ae511c69c73d17126c..c63e17525f5d359bcd366291258c2e2e7c966a14 100644 (file)
--- a/bfd/vms.c
+++ b/bfd/vms.c
@@ -1450,16 +1450,16 @@ const bfd_target vms_alpha_vec =
   bfd_getl16, bfd_getl_signed_16, bfd_putl16,
 
   {_bfd_dummy_target, vms_object_p,            /* bfd_check_format.  */
-   _bfd_dummy_target, _bfd_dummy_target},
+   _bfd_vms_lib_alpha_archive_p, _bfd_dummy_target},
   {bfd_false, vms_mkobject,                    /* bfd_set_format.  */
-   bfd_false, bfd_false},
+   _bfd_vms_lib_mkarchive, bfd_false},
   {bfd_false, vms_write_object_contents,       /* bfd_write_contents.  */
-   bfd_false, bfd_false},
+   _bfd_vms_lib_write_archive_contents, bfd_false},
 
   BFD_JUMP_TABLE_GENERIC (vms),
   BFD_JUMP_TABLE_COPY (vms),
   BFD_JUMP_TABLE_CORE (_bfd_nocore),
-  BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
+  BFD_JUMP_TABLE_ARCHIVE (_bfd_vms_lib),
   BFD_JUMP_TABLE_SYMBOLS (vms),
   BFD_JUMP_TABLE_RELOCS (vms),
   BFD_JUMP_TABLE_WRITE (vms),
index 8733e4f98c644801d877e6d901957823731247f0..a40e85ebbcf5f020c20fb36e319856cd46242c13 100644 (file)
--- a/bfd/vms.h
+++ b/bfd/vms.h
@@ -23,6 +23,8 @@
    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
    MA 02110-1301, USA.  */
 
+#include <time.h>
+
 #undef vms
 #ifndef VMS_H
 #define VMS_H
@@ -480,6 +482,10 @@ extern int _bfd_vms_write_tbt (bfd *abfd, int objtype);
 extern int _bfd_vms_get_object_record (bfd *abfd);
 extern int _bfd_vms_get_first_record (bfd *abfd);
 
+extern char *vms_get_module_name (const char *filename, bfd_boolean);
+extern time_t vms_time_to_time_t (unsigned int hi, unsigned int lo);
+extern time_t vms_rawtime_to_time_t (unsigned char *buf);
+
 /* vms-hdr.c.  */
 
 extern int _bfd_vms_slurp_hdr (bfd *abfd, int objtype);