* bfd/bfd.m4 (BFD_HAVE_TIME_TYPE_MEMBER,
authorNick Clifton <nickc@redhat.com>
Wed, 1 Jul 2009 15:02:28 +0000 (15:02 +0000)
committerNick Clifton <nickc@redhat.com>
Wed, 1 Jul 2009 15:02:28 +0000 (15:02 +0000)
        BFD_HAVE_SYS_STAT_TYPE_MEMBER): New config functions.
        * bfd/configure.in: Use them.
        * bfd/configure: Regenerate.
        * bfd/config.in: Regnerate.
        * bfd/vmsutil.c: Include sysdep.h, remove ansidecl.h.
        #define _BSD_SOURCE. Add comments.
        (vms_file_stats_name): Calculate creation date based on available
        runtime data. Return 1 for version instead of 0.

bfd/ChangeLog
bfd/bfd.m4
bfd/config.in
bfd/configure
bfd/configure.in
bfd/elf-m10300.c
bfd/reloc.c
bfd/vmsutil.c

index aca27d5..57af98c 100644 (file)
@@ -1,3 +1,15 @@
+2009-07-01  Douglas B Rupp  <rupp@gnat.com>
+
+       * bfd/bfd.m4 (BFD_HAVE_TIME_TYPE_MEMBER,
+       BFD_HAVE_SYS_STAT_TYPE_MEMBER): New config functions.
+       * bfd/configure.in: Use them.
+       * bfd/configure: Regenerate.
+       * bfd/config.in: Regnerate.
+       * bfd/vmsutil.c: Include sysdep.h, remove ansidecl.h.
+       #define _BSD_SOURCE. Add comments.
+       (vms_file_stats_name): Calculate creation date based on available
+       runtime data. Return 1 for version instead of 0.
+
 2009-07-01  Nick Clifton  <nickc@redhat.com>
 
        PR 10072
index 1d7d53a..96f03d4 100644 (file)
@@ -20,7 +20,6 @@ AC_DEFUN([BFD_HAVE_SYS_PROCFS_TYPE],
  AC_MSG_RESULT($bfd_cv_have_sys_procfs_type_$1)
 ])
 
-
 dnl Check for existence of member $2 in type $1 in sys/procfs.h
 
 AC_DEFUN([BFD_HAVE_SYS_PROCFS_TYPE_MEMBER],
@@ -40,3 +39,40 @@ AC_DEFUN([BFD_HAVE_SYS_PROCFS_TYPE_MEMBER],
  AC_MSG_RESULT($bfd_cv_have_sys_procfs_type_member_$1_$2)
 ])
 
+dnl Check for existence of member $2 in type $1 in time.h
+
+AC_DEFUN([BFD_HAVE_TIME_TYPE_MEMBER],
+[AC_MSG_CHECKING([for $1.$2 in time.h])
+ AC_CACHE_VAL(bfd_cv_have_time_type_member_$2,
+   [AC_TRY_COMPILE([
+#define _BSD_SOURCE 1
+#include <time.h>],
+      [$1 avar; void* aref = (void*) &avar.$2],
+      bfd_cv_have_time_type_member_$2=yes,
+      bfd_cv_have_time_type_member_$2=no
+   )])
+ if test $bfd_cv_have_time_type_member_$2 = yes; then
+   AC_DEFINE([HAVE_]translit($2, [a-z], [A-Z]), 1,
+            [Define if <time.h> has $1.$2.])
+ fi
+ AC_MSG_RESULT($bfd_cv_have_time_type_member_$2)
+])
+
+dnl Check for existence of member $2.$3 in type $1 in sys/stat.h
+
+AC_DEFUN([BFD_HAVE_SYS_STAT_TYPE_MEMBER],
+[AC_MSG_CHECKING([for $1.$2.$3 in sys/stat.h])
+ AC_CACHE_VAL(bfd_cv_have_sys_stat_type_member_$2_$3,
+   [AC_TRY_COMPILE([
+#define _BSD_SOURCE 1
+#include <sys/stat.h>],
+      [$1 avar; void* aref = (void*) &avar.$2.$3],
+      bfd_cv_have_sys_stat_type_member_$2_$3=yes,
+      bfd_cv_have_sys_stat_type_member_$2_$3=no
+   )])
+ if test $bfd_cv_have_sys_stat_type_member_$2_$3 = yes; then
+   AC_DEFINE([HAVE_]translit($2, [a-z], [A-Z])[_]translit($3, [a-z], [A-Z]), 1,
+            [Define if <sys/stat.h> has $1.$2.$3])
+ fi
+ AC_MSG_RESULT($bfd_cv_have_sys_stat_type_member_$2_$3)
+])
index d1797ae..c9137c7 100644 (file)
 /* Define if struct core_dumpx has member c_impl */
 #undef HAVE_ST_C_IMPL
 
+/* Define if <sys/stat.h> has struct stat.st_mtim.tv_nsec */
+#undef HAVE_ST_MTIM_TV_NSEC
+
+/* Define if <sys/stat.h> has struct stat.st_mtim.tv_sec */
+#undef HAVE_ST_MTIM_TV_SEC
+
 /* Define to 1 if you have the `sysconf' function. */
 #undef HAVE_SYSCONF
 
 /* Define to 1 if you have the <time.h> header file. */
 #undef HAVE_TIME_H
 
+/* Define if <time.h> has struct tm.tm_gmtoff. */
+#undef HAVE_TM_GMTOFF
+
 /* Define to 1 if you have the <unistd.h> header file. */
 #undef HAVE_UNISTD_H
 
index c3ef346..91fbd0d 100755 (executable)
@@ -14119,7 +14119,8 @@ done
 
 
 
-for ac_header in fcntl.h sys/file.h sys/time.h
+
+for ac_header in fcntl.h sys/file.h sys/time.h sys/stat.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
 if eval "test \"\${$as_ac_Header+set}\" = set"; then
 
 
 
+# Support for VMS timestamps via cross compile
+
+if test "$ac_cv_header_time_h" = yes; then
+  echo "$as_me:$LINENO: checking for struct tm.tm_gmtoff in time.h" >&5
+echo $ECHO_N "checking for struct tm.tm_gmtoff in time.h... $ECHO_C" >&6
+ if test "${bfd_cv_have_time_type_member_tm_gmtoff+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#define _BSD_SOURCE 1
+#include <time.h>
+int
+main ()
+{
+struct tm avar; void* aref = (void*) &avar.tm_gmtoff
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bfd_cv_have_time_type_member_tm_gmtoff=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+bfd_cv_have_time_type_member_tm_gmtoff=no
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+ if test $bfd_cv_have_time_type_member_tm_gmtoff = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_TM_GMTOFF 1
+_ACEOF
+
+ fi
+ echo "$as_me:$LINENO: result: $bfd_cv_have_time_type_member_tm_gmtoff" >&5
+echo "${ECHO_T}$bfd_cv_have_time_type_member_tm_gmtoff" >&6
+
+fi
+
+if test "$ac_cv_header_sys_stat_h" = yes; then
+    echo "$as_me:$LINENO: checking for struct stat.st_mtim.tv_sec in sys/stat.h" >&5
+echo $ECHO_N "checking for struct stat.st_mtim.tv_sec in sys/stat.h... $ECHO_C" >&6
+ if test "${bfd_cv_have_sys_stat_type_member_st_mtim_tv_sec+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#define _BSD_SOURCE 1
+#include <sys/stat.h>
+int
+main ()
+{
+struct stat avar; void* aref = (void*) &avar.st_mtim.tv_sec
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bfd_cv_have_sys_stat_type_member_st_mtim_tv_sec=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+bfd_cv_have_sys_stat_type_member_st_mtim_tv_sec=no
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+ if test $bfd_cv_have_sys_stat_type_member_st_mtim_tv_sec = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ST_MTIM_TV_SEC 1
+_ACEOF
+
+ fi
+ echo "$as_me:$LINENO: result: $bfd_cv_have_sys_stat_type_member_st_mtim_tv_sec" >&5
+echo "${ECHO_T}$bfd_cv_have_sys_stat_type_member_st_mtim_tv_sec" >&6
+
+    echo "$as_me:$LINENO: checking for struct stat.st_mtim.tv_nsec in sys/stat.h" >&5
+echo $ECHO_N "checking for struct stat.st_mtim.tv_nsec in sys/stat.h... $ECHO_C" >&6
+ if test "${bfd_cv_have_sys_stat_type_member_st_mtim_tv_nsec+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#define _BSD_SOURCE 1
+#include <sys/stat.h>
+int
+main ()
+{
+struct stat avar; void* aref = (void*) &avar.st_mtim.tv_nsec
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bfd_cv_have_sys_stat_type_member_st_mtim_tv_nsec=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+bfd_cv_have_sys_stat_type_member_st_mtim_tv_nsec=no
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+ if test $bfd_cv_have_sys_stat_type_member_st_mtim_tv_nsec = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ST_MTIM_TV_NSEC 1
+_ACEOF
+
+ fi
+ echo "$as_me:$LINENO: result: $bfd_cv_have_sys_stat_type_member_st_mtim_tv_nsec" >&5
+echo "${ECHO_T}$bfd_cv_have_sys_stat_type_member_st_mtim_tv_nsec" >&6
+
+fi
+
 # Link in zlib if we can.  This allows us to read compressed debug sections.
 # This is used only by compress.c.
 echo "$as_me:$LINENO: checking for library containing zlibVersion" >&5
index 146785e..11cc83a 100644 (file)
@@ -197,7 +197,7 @@ AC_SUBST(BFD_HOSTPTR_T)
 BFD_CC_FOR_BUILD
 
 AC_CHECK_HEADERS(alloca.h stddef.h string.h strings.h stdlib.h time.h unistd.h)
-AC_CHECK_HEADERS(fcntl.h sys/file.h sys/time.h)
+AC_CHECK_HEADERS(fcntl.h sys/file.h sys/time.h sys/stat.h)
 GCC_HEADER_STDINT(bfd_stdint.h)
 AC_HEADER_TIME
 AC_HEADER_DIRENT
@@ -223,6 +223,17 @@ AC_CHECK_DECLS(strstr)
 AC_CHECK_DECLS(snprintf)
 AC_CHECK_DECLS(vsnprintf)
 
+# Support for VMS timestamps via cross compile
+
+if test "$ac_cv_header_time_h" = yes; then
+  BFD_HAVE_TIME_TYPE_MEMBER(struct tm, tm_gmtoff)
+fi
+
+if test "$ac_cv_header_sys_stat_h" = yes; then
+    BFD_HAVE_SYS_STAT_TYPE_MEMBER(struct stat, st_mtim, tv_sec)
+    BFD_HAVE_SYS_STAT_TYPE_MEMBER(struct stat, st_mtim, tv_nsec)
+fi
+
 # Link in zlib if we can.  This allows us to read compressed debug sections.
 # This is used only by compress.c.
 AC_SEARCH_LIBS(zlibVersion, z, [AC_CHECK_HEADERS(zlib.h)])
index 354a503..015e614 100644 (file)
@@ -1493,7 +1493,7 @@ mn10300_elf_relocate_section (bfd *output_bfd,
                      /* _32 relocs in executables force _COPY relocs,
                         such that the address of the symbol ends up
                         being local.  */
-                     && !info->executable                    
+                     && !info->executable
                      && !SYMBOL_REFERENCES_LOCAL (info, hh)
                      && ((input_section->flags & SEC_ALLOC) != 0
                          /* DWARF will emit R_MN10300_32 relocations
index cc20a87..1f105de 100644 (file)
@@ -5190,7 +5190,7 @@ ENUM
    BFD_RELOC_MACH_O_PAIR
 ENUMDOC
  Mach-O generic relocations.
-   
+
 ENDSENUM
   BFD_RELOC_UNUSED
 CODE_FRAGMENT
index ff4383a..3dbfb8c 100644 (file)
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
 
-#include "ansidecl.h"
+#include "sysdep.h"
 #include "vmsutil.h"
 
+/* The purspose of the two alternate versions below is to have one that
+   works for native VMS and one that works on an NFS mounted filesystem
+   (Unix Server/VMS client).  The main issue being to generate the special
+   VMS file timestamps for the debug info.  */
+
 #ifdef VMS
 #define __NEW_STARLET 1
 #include <vms/starlet.h>
@@ -89,12 +94,16 @@ to_vms_file_spec (char *filespec)
   return vms_filespec;
 }
 
-#else
+#else /* not VMS */
+
+#define _BSD_SOURCE 1
 #include <sys/stat.h>
 #include <time.h>
-#define VMS_EPOCH_OFFSET 35067168000000000LL
-#define VMS_GRANULARITY_FACTOR 10000000
-#endif
+
+#define VMS_EPOCH_OFFSET        35067168000000000LL
+#define VMS_GRANULARITY_FACTOR  10000000
+
+#endif /* VMS */
 
 /* Return VMS file date, size, format, version given a name.  */
 
@@ -232,19 +241,50 @@ vms_file_stats_name (const char *filename,
                   (512 * (recattr.fat$w_efblkl - 1)) +
                   recattr.fat$w_ffbyte;
   if (rfo) *rfo = recattr.fat$v_rtype;
-  if (ver) *ver = strtol (strrchr (ascnamebuff, ';')+1, 0, 10);
+  if (ver) *ver = strtol (strrchr (ascnamebuff, ';') + 1, 0, 10);
+#else /* not VMS */
 
-  return 0;
-#else
   struct stat buff;
+  struct tm *ts;
+  long long gmtoff, secs, nsecs;
 
   if ((stat (filename, &buff)) != 0)
      return 1;
 
   if (cdt)
     {
-      *cdt = (long long) (buff.st_mtime * VMS_GRANULARITY_FACTOR)
-                         + VMS_EPOCH_OFFSET;
+      ts = localtime (& buff.st_mtime);
+
+#ifdef HAVE_TM_GMTOFF
+       gmtoff = ts->tm_gmtoff;
+#else
+       {
+         extern long timezone;
+
+         if (ts->tm_isdst == 1)
+           gmtoff = - (timezone - 3600);
+         else
+           gmtoff = - timezone;
+       }
+#endif
+
+#ifdef HAVE_ST_MTIM_TV_SEC
+      secs = buff.st_mtim.tv_sec;
+#else
+      secs = buff.st_mtime;
+#endif
+
+#ifdef HAVE_ST_MTIM_TV_NSEC
+      nsecs = buff.st_mtim.tv_nsec;
+#else
+      nsecs = 0;
+#endif
+
+      /* VMS timestamps are stored in local time to 100 nsec accuracy, but by
+        experiment I found timestamps truncated to (at least) microseconds
+        on an NFS mounted filesystem, hence the adjustment below. DBR. */
+      *cdt = ((secs + gmtoff) * VMS_GRANULARITY_FACTOR)
+       + (nsecs / 1000 * 10) + VMS_EPOCH_OFFSET;
     }
 
   if (siz)
@@ -253,10 +293,13 @@ vms_file_stats_name (const char *filename,
   if (rfo)
     *rfo = 2; /* Stream LF format.  */
 
+  /* Returning a file version of 0 is never correct for debug info, version 1
+     will be correct if file editing is done only on the Unix side.  If editing
+     is done on the VMS side, then its TBD.  */
   if (ver)
-    *ver = 0;
+    *ver = 1;
+#endif /* VMS */
 
   return 0;
-#endif
 }