From 412222d910b7776967c56d97482e863fcd6c7aa0 Mon Sep 17 00:00:00 2001
From: Ian Lance Taylor <ian@airs.com>
Date: Mon, 20 Oct 1997 19:23:09 +0000
Subject: [PATCH] various evax patches

---
 bfd/ChangeLog     |  26 ++++++++-
 bfd/configure.com | 135 ++++++++++++++++++++++++++++++++++++++++++++++
 bfd/evax-alpha.c  |   2 -
 bfd/evax-egsd.c   |  34 +++++++-----
 bfd/evax-emh.c    |   6 +--
 bfd/evax-etir.c   |  13 ++---
 bfd/evax-misc.c   |  31 +++++++----
 bfd/evax.h        |   7 +--
 8 files changed, 215 insertions(+), 39 deletions(-)
 create mode 100644 bfd/configure.com

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index b2402957df8..aca3517ea02 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,6 +1,30 @@
 Mon Oct 20 15:01:27 1997  Klaus K"ampf  <kkaempf@progis.de>
 
-	* evax-egsd.c: make section flags dec c compatible
+	* evax-egsd.c: Weak symbols are global.
+
+	* evax-emh.c: Use proper casts.
+
+	* evax-egsd.c (_bfd_evax_write_egsd): Remove unneeded uname.
+
+	* evax-egsd.c: Section names and symbols have different
+	length restrictions. Add length parameter to
+	_bfd_evax_length_hash_symbol.
+	* evax-etir.c: Likewise.
+	* evax-misc.c (_bfd_evax_length_hash_symbol): Add length
+	parameter.
+	* evax.h (EOBJ_S_C_SECSIZ): Define.
+
+	* evax-alpha.c: Remove duplicate test.
+
+	* evax-emh.c: SYS$ functions are upper-case.
+
+	* evax-egsd.c: Create separate sections for common symbols.
+	* evax-etir.c: Don't output common section.
+	* evax.h: Bump up section count.
+
+	* configure.com: Use 64bit integers with DEC C.
+
+	* evax-egsd.c: Make section flags dec c compatible.
 
 Mon Oct 20 09:38:31 1997  Jeffrey A Law  (law@cygnus.com)
 
diff --git a/bfd/configure.com b/bfd/configure.com
new file mode 100644
index 00000000000..b4d648626f3
--- /dev/null
+++ b/bfd/configure.com
@@ -0,0 +1,135 @@
+$!
+$! This file configures the bfd library for use with openVMS/Alpha
+$! We do not use the configure script, since we do not have /bin/sh
+$! to execute it.
+$!
+$! Written by Klaus K"ampf (kkaempf@progis.de)
+$!
+$arch_indx = 1 + ((f$getsyi("CPU").ge.128).and.1)      ! vax==1, alpha==2
+$arch = f$element(arch_indx,"|","|VAX|Alpha|")
+$if arch .eqs. "VAX"
+$then
+$ write sys$output "Target VAX not supported."
+$ exit 2
+$endif
+$!
+$! copy bfd-in2.h to bfd.h, replacing @ macros
+$!
+$ edit/tpu/nojournal/nosection/nodisplay/command=sys$input -
+        []bfd-in2.h /output=[]bfd.h
+$DECK
+!
+!  Copy file, changing lines with macros (@@)
+!
+!
+   vfile := CREATE_BUFFER("vfile", "VERSION.");
+   POSITION(BEGINNING_OF(vfile));
+   vers := CURRENT_LINE;
+
+   file := CREATE_BUFFER("file", GET_INFO(COMMAND_LINE, "file_name"));
+   rang := CREATE_RANGE(BEGINNING_OF(file), END_OF(file));
+
+   match_pos := SEARCH_QUIETLY('@VERSION@', FORWARD, EXACT, rang);
+   IF match_pos <> 0 THEN;
+      POSITION(BEGINNING_OF(match_pos));
+      ERASE(match_pos);
+      COPY_TEXT(vers);
+   ENDIF;
+   match_pos := SEARCH_QUIETLY('@wordsize@', FORWARD, EXACT, rang);
+   IF match_pos <> 0 THEN;
+      POSITION(BEGINNING_OF(match_pos));
+      ERASE(match_pos);
+      COPY_TEXT('64');
+   ENDIF;
+   match_pos := SEARCH_QUIETLY('@BFD_HOST_64BIT_LONG@', FORWARD, EXACT, rang);
+   IF match_pos <> 0 THEN;
+      POSITION(BEGINNING_OF(match_pos));
+      ERASE(match_pos);
+      COPY_TEXT('0');
+   ENDIF;
+   match_pos := SEARCH_QUIETLY('@BFD_HOST_64_BIT_DEFINED@', FORWARD, EXACT, rang);
+   IF match_pos <> 0 THEN;
+      POSITION(BEGINNING_OF(match_pos));
+      ERASE(match_pos);
+      COPY_TEXT('__DECC');
+      SPLIT_LINE;
+      COPY_TEXT('#include <ints.h>');
+   ENDIF;
+   match_pos := SEARCH_QUIETLY('@BFD_HOST_64_BIT@', FORWARD, EXACT, rang);
+   IF match_pos <> 0 THEN;
+      POSITION(BEGINNING_OF(match_pos));
+      ERASE(match_pos);
+      COPY_TEXT('int64');
+   ENDIF;
+   match_pos := SEARCH_QUIETLY('@BFD_HOST_U_64_BIT@', FORWARD, EXACT, rang);
+   IF match_pos <> 0 THEN;
+      POSITION(BEGINNING_OF(match_pos));
+      ERASE(match_pos);
+      COPY_TEXT('uint64');
+   ENDIF;
+   WRITE_FILE(file, GET_INFO(COMMAND_LINE, "output_file"));
+   QUIT
+$  EOD
+$ write sys$output "Generated `bfd.h' from `bfd-in2.h'."
+$!
+$!
+$! create targmatch.h
+$!
+$ open/write tfile []targmatch.h
+$ write tfile "{ " + """alpha-*-*vms*""" + ","
+$ write tfile "#if defined (SELECT_VECS)"
+$ write tfile "SELECT_VECS"
+$ write tfile "#else"
+$ write tfile "UNSUPPORTED_TARGET"
+$ write tfile "#endif"
+$ write tfile "},"
+$ close tfile
+$ write sys$output "Generated `targmatch.h'"
+$!
+$!
+$! create config.h
+$!
+$ create []config.h
+/* config.h-vms.  Generated by hand by Klaus K�mpf, kkaempf@didymus.rmi.de.  */
+/* config.in.  Generated automatically from configure.in by autoheader.  */
+/* Whether malloc must be declared even if <stdlib.h> is included.  */
+/* #undef NEED_DECLARATION_MALLOC */
+/* Whether free must be declared even if <stdlib.h> is included.  */
+/* #undef NEED_DECLARATION_FREE */
+/* Define if you have a working `mmap' system call.  */
+/* #define HAVE_MMAP 1 */
+/* Do we need to use the b modifier when opening binary files?  */
+/* #undef USE_BINARY_FOPEN */
+/* Name of host specific header file to include in trad-core.c.  */
+/* #undef TRAD_HEADER */
+/* Define only if <sys/procfs.h> is available *and* it defines prstatus_t.  */
+/* #undef HAVE_SYS_PROCFS_H */
+/* Do we really want to use mmap if it's available?  */
+/* #undef USE_MMAP */
+/* Define if you have the fcntl function.  */
+#define HAVE_FCNTL 1
+/* Define if you have the getpagesize function.  */
+#define HAVE_GETPAGESIZE 1
+/* Define if you have the madvise function.  */
+#define HAVE_MADVISE 1
+/* Define if you have the mprotect function.  */
+#define HAVE_MPROTECT 1
+/* Define if you have the <fcntl.h> header file.  */
+#define HAVE_FCNTL_H 1
+/* Define if you have the <stddef.h> header file.  */
+#define HAVE_STDDEF_H 1
+/* Define if you have the <stdlib.h> header file.  */
+#define HAVE_STDLIB_H 1
+/* Define if you have the <string.h> header file.  */
+#define HAVE_STRING_H 1
+/* Define if you have the <strings.h> header file.  */
+#define HAVE_STRINGS_H 1
+/* Define if you have the <sys/file.h> header file.  */
+#define HAVE_SYS_FILE_H 1
+/* Define if you have the <time.h> header file.  */
+#define HAVE_TIME_H 1
+/* Define if you have the <unistd.h> header file.  */
+#define HAVE_UNISTD_H 1
+$!
+$ write sys$output "Generated `config.h'"
+
diff --git a/bfd/evax-alpha.c b/bfd/evax-alpha.c
index a6f694f9502..8c8a04585db 100644
--- a/bfd/evax-alpha.c
+++ b/bfd/evax-alpha.c
@@ -1109,8 +1109,6 @@ evax_get_symbol_info (abfd, symbol, ret)
     ret->type = 'A';
   else if (bfd_is_und_section (sec))
     ret->type = 'U';
-  else if (bfd_is_abs_section (sec))
-    ret->type = 'A';
   else if (bfd_is_ind_section (sec))
     ret->type = 'I';
   else if (bfd_get_section_flags (abfd, sec) & SEC_CODE)
diff --git a/bfd/evax-egsd.c b/bfd/evax-egsd.c
index cd1203996dd..7109485743e 100644
--- a/bfd/evax-egsd.c
+++ b/bfd/evax-egsd.c
@@ -402,7 +402,6 @@ _bfd_evax_write_egsd (abfd)
   char dummy_name[10];
   char *sname;
   flagword new_flags, old_flags;
-  char uname[200];
   char *nptr, *uptr;
 
 #if EVAX_DEBUG
@@ -481,12 +480,20 @@ _bfd_evax_write_egsd (abfd)
 	  else if ((*sname == 'l') && (strcmp (sname, "lcomm") == 0))
 	    sname = EVAX_LOCAL_NAME;
 	}
+      else
+	sname = _bfd_evax_length_hash_symbol (abfd, sname, EOBJ_S_C_SECSIZ);
 
       _bfd_evax_output_begin (abfd, EGSD_S_C_PSC, -1);
       _bfd_evax_output_short (abfd, section->alignment_power & 0xff);
-      _bfd_evax_output_short (abfd,
-			      evax_esecflag_by_name (sname,
-						     section->_raw_size));
+      if (bfd_is_com_section (section))
+	{
+	  new_flags = (EGPS_S_V_OVR|EGPS_S_V_REL|EGPS_S_V_GBL|EGPS_S_V_RD|EGPS_S_V_WRT|EGPS_S_V_NOMOD|EGPS_S_V_COM);
+	}
+      else
+	{
+	  new_flags = evax_esecflag_by_name (sname, section->_raw_size);
+	}
+      _bfd_evax_output_short (abfd, new_flags);
       _bfd_evax_output_long (abfd, section->_raw_size);
       _bfd_evax_output_counted (abfd, sname);
       _bfd_evax_output_flush (abfd);
@@ -514,15 +521,10 @@ _bfd_evax_write_egsd (abfd)
 	}
       old_flags = symbol->flags;
 
-      if ((*(symbol->section->name+1) == 'c')
-	 && (strcmp (symbol->section->name+1, "comm") == 0)
-	 && (strcmp (symbol->name, ".comm") != 0))
-	old_flags |= BSF_GLOBAL;
-
       if (old_flags & BSF_FILE)
 	continue;
 
-      if (((old_flags & BSF_GLOBAL) == 0)		/* not xdef */
+      if (((old_flags & (BSF_GLOBAL|BSF_WEAK)) == 0)	/* not xdef */
 	  && (!bfd_is_und_section (symbol->section)))	/* and not xref */
 	continue;					/* dont output */
 
@@ -542,14 +544,18 @@ _bfd_evax_write_egsd (abfd)
       _bfd_evax_output_short (abfd, 0);			/* data type, alignment */
 
       new_flags = 0;
+
       if (old_flags & BSF_WEAK)
 	new_flags |= EGSY_S_V_WEAK;
+      if (bfd_is_com_section (symbol->section))		/* .comm  */
+	new_flags |= (EGSY_S_V_WEAK|EGSY_S_V_COMM);
+
       if (old_flags & BSF_FUNCTION)
 	{
 	  new_flags |= EGSY_S_V_NORM;
 	  new_flags |= EGSY_S_V_REL;
 	}
-      if (old_flags & BSF_GLOBAL)
+      if (old_flags & (BSF_GLOBAL|BSF_WEAK))
 	{
 	  new_flags |= EGSY_S_V_DEF;
 	  if (!bfd_is_abs_section (symbol->section))
@@ -557,7 +563,7 @@ _bfd_evax_write_egsd (abfd)
 	}
       _bfd_evax_output_short (abfd, new_flags);
 
-      if (old_flags & BSF_GLOBAL)			/* symbol definition */
+      if (old_flags & (BSF_GLOBAL|BSF_WEAK))		/* symbol definition */
 	{
 	  if (old_flags & BSF_FUNCTION)
 	    {
@@ -574,10 +580,10 @@ _bfd_evax_write_egsd (abfd)
 	      _bfd_evax_output_quad (abfd, symbol->value);	/* L_VALUE */
 	      _bfd_evax_output_quad (abfd, 0);			/* L_CODE_ADDRESS */
 	      _bfd_evax_output_long (abfd, 0);			/* L_CA_PSINDX */
-	      _bfd_evax_output_long (abfd, symbol->section->index);/* L_PSINDX, FIXME */
+	      _bfd_evax_output_long (abfd, symbol->section->index);/* L_PSINDX */
 	    }
 	}
-      _bfd_evax_output_counted (abfd, _bfd_evax_length_hash_symbol (abfd, symbol->name));
+      _bfd_evax_output_counted (abfd, _bfd_evax_length_hash_symbol (abfd, symbol->name, EOBJ_S_C_SYMSIZ));
 
       _bfd_evax_output_flush (abfd);
 
diff --git a/bfd/evax-emh.c b/bfd/evax-emh.c
index 288889c909e..2b500062222 100644
--- a/bfd/evax-emh.c
+++ b/bfd/evax-emh.c
@@ -159,7 +159,7 @@ get_vms_time_string ()
   } Descriptor;
   Descriptor.Size = 17;
   Descriptor.Ptr = tbuf;
-  sys$asctim (0, &Descriptor, 0, 0);
+  SYS$ASCTIM (0, &Descriptor, 0, 0);
 #endif /* not VMS */
 
 #if EVAX_DEBUG
@@ -273,7 +273,7 @@ _bfd_evax_write_emh (abfd)
 	      continue;
 	    }
 
-	  _bfd_evax_output_dump (abfd, (char *)symbol->name, strlen (symbol->name));
+	  _bfd_evax_output_dump (abfd, (unsigned char *)symbol->name, strlen (symbol->name));
 	  if (had_case)
 	    break;
 	  had_file = 1;
@@ -281,7 +281,7 @@ _bfd_evax_write_emh (abfd)
     }
 
   if (symnum == abfd->symcount)
-    _bfd_evax_output_dump (abfd, "noname", 6);
+    _bfd_evax_output_dump (abfd, (unsigned char *)"noname", 6);
 
   _bfd_evax_output_flush (abfd);
 
diff --git a/bfd/evax-etir.c b/bfd/evax-etir.c
index 2e64c28ccfe..187353b8068 100644
--- a/bfd/evax-etir.c
+++ b/bfd/evax-etir.c
@@ -1172,7 +1172,8 @@ _bfd_evax_write_etir (abfd)
 #endif
 	}
 
-      if (section->flags & SEC_HAS_CONTENTS)
+      if ((section->flags & SEC_HAS_CONTENTS)
+	&& (! bfd_is_com_section (section)))
 	{
 	  bfd_vma vaddr;		/* virtual addr in section */
 
@@ -1246,7 +1247,7 @@ _bfd_evax_write_etir (abfd)
 							    ETIR_S_C_STO_GBL_LW,
 							    -1);
 				    _bfd_evax_output_counted (abfd,
-							      _bfd_evax_length_hash_symbol (abfd, sym->name));
+							      _bfd_evax_length_hash_symbol (abfd, sym->name, EOBJ_S_C_SYMSIZ));
 				    _bfd_evax_output_flush (abfd);
 				  }
 				else if (bfd_is_abs_section (sym->section))
@@ -1312,7 +1313,7 @@ _bfd_evax_write_etir (abfd)
 							    ETIR_S_C_STO_GBL,
 							    -1);
 				    _bfd_evax_output_counted (abfd,
-							      _bfd_evax_length_hash_symbol (abfd, sym->name));
+							      _bfd_evax_length_hash_symbol (abfd, sym->name, EOBJ_S_C_SYMSIZ));
 				    _bfd_evax_output_flush (abfd);
 				  }
 				else if (bfd_is_abs_section (sym->section))
@@ -1374,7 +1375,7 @@ _bfd_evax_write_etir (abfd)
 				evax_output_long(abfd, (unsigned long)(sec->index));
 				evax_output_quad(abfd, (uquad)addr);
 
-				evax_output_counted(abfd, _bfd_evax_length_hash_symbol (abfd, sym->name));
+				evax_output_counted(abfd, _bfd_evax_length_hash_symbol (abfd, sym->name, EOBJ_S_C_SYMSIZ));
 				evax_output_flush(abfd);
 #endif
 			      }
@@ -1394,7 +1395,7 @@ _bfd_evax_write_etir (abfd)
 						       (unsigned long)PRIV(evax_linkage_index));
 				PRIV(evax_linkage_index) += 2;
 				_bfd_evax_output_counted (abfd,
-							  _bfd_evax_length_hash_symbol (abfd, sym->name));
+							  _bfd_evax_length_hash_symbol (abfd, sym->name, EOBJ_S_C_SYMSIZ));
 				_bfd_evax_output_byte (abfd, 0);
 				_bfd_evax_output_flush (abfd);
 			      }
@@ -1415,7 +1416,7 @@ _bfd_evax_write_etir (abfd)
 							ETIR_S_C_STO_CA,
 							-1);
 				_bfd_evax_output_counted (abfd,
-							  _bfd_evax_length_hash_symbol (abfd, sym->name));
+							  _bfd_evax_length_hash_symbol (abfd, sym->name, EOBJ_S_C_SYMSIZ));
 				_bfd_evax_output_flush (abfd);
 			      }
 			      break;
diff --git a/bfd/evax-misc.c b/bfd/evax-misc.c
index 4e2862d0e28..33dd3992396 100644
--- a/bfd/evax-misc.c
+++ b/bfd/evax-misc.c
@@ -972,12 +972,13 @@ hash_string (ptr)
   return hash;
 }
 
-/* Generate a length-hashed VMS symbol name (limited to 64 chars).  */
+/* Generate a length-hashed VMS symbol name (limited to maxlen chars).  */
 
 char *
-_bfd_evax_length_hash_symbol (abfd, in)
+_bfd_evax_length_hash_symbol (abfd, in, maxlen)
      bfd *abfd;
      const char *in;
+     int maxlen;
 {
   long int init;
   long int result;
@@ -986,45 +987,55 @@ _bfd_evax_length_hash_symbol (abfd, in)
   char *new_name;
   const char *old_name;
   int i;
-  static char outbuf[65];
+  static char outbuf[EOBJ_S_C_SYMSIZ+1];
   char *out = outbuf;
 
 #if EVAX_DEBUG
   evax_debug(4, "_bfd_evax_length_hash_symbol \"%s\"\n", in);
 #endif
 
+  if (maxlen > EOBJ_S_C_SYMSIZ)
+    maxlen = EOBJ_S_C_SYMSIZ;
+
   new_name = out;		/* save this for later.  */
 
   /* We may need to truncate the symbol, save the hash for later.  */
 
   in_len = strlen (in);
 
-  result = (in_len > 64) ? hash_string (in) : 0;
+  result = (in_len > maxlen) ? hash_string (in) : 0;
 
   old_name = in;
 
   /* Do the length checking.  */
 
-  if (in_len <= 64)
-    i = in_len;
+  if (in_len <= maxlen)
+    {
+      i = in_len;
+    }
+  else
+    {
+      if (PRIV(flag_hash_long_names))
+	i = maxlen-9;
       else
-    i = 55;
+	i = maxlen;
+    }
 
   strncpy (out, in, i);
   in += i;
   out += i;
 
-  if ((in_len > 64)
+  if ((in_len > maxlen)
       && PRIV(flag_hash_long_names))
     sprintf (out, "_%08x", result);
   else
-  *out = 0;
+    *out = 0;
 
 #if EVAX_DEBUG
   evax_debug(4, "--> [%d]\"%s\"\n", strlen (outbuf), outbuf);
 #endif
 
-  if (in_len > 64
+  if (in_len > maxlen
 	&& PRIV(flag_hash_long_names)
 	&& PRIV(flag_show_after_trunc))
     printf ("Symbol %s replaced by %s\n", old_name, new_name);
diff --git a/bfd/evax.h b/bfd/evax.h
index f59ce554306..945989899f6 100644
--- a/bfd/evax.h
+++ b/bfd/evax.h
@@ -195,7 +195,8 @@ extern int _bfd_evax_write_edbg PARAMS ((bfd *abfd));
 #define EOBJ_S_C_SUBTYP 4
 #define EOBJ_S_C_MAXRECSIZ 8192   /*Maximum legal record size         */
 #define EOBJ_S_C_STRLVL 2         /*Structure level                   */
-#define EOBJ_S_C_SYMSIZ 64        /*Maxymum symbol length             */
+#define EOBJ_S_C_SYMSIZ 64        /*Maximum symbol length		*/
+#define EOBJ_S_C_SECSIZ 31	  /*Maximum section name length		*/
 #define EOBJ_S_C_STOREPLIM -1     /*Maximum repeat count on store commands  */
 #define EOBJ_S_C_PSCALILIM 16     /*Maximum p-sect alignment          */
 
@@ -278,7 +279,7 @@ struct location_struct {
 };
 #define LOCATION_SAVE_SIZE 32
 
-#define EVAX_SECTION_COUNT 32
+#define EVAX_SECTION_COUNT 1024
 
 struct evax_private_data_struct {
   boolean fixup_done;			/* Flag to indicate if all
@@ -377,6 +378,6 @@ extern void _bfd_evax_output_counted PARAMS ((bfd *abfd, char *value));
 extern void _bfd_evax_output_dump PARAMS ((bfd *abfd, unsigned char *data,
 					   int length));
 extern void _bfd_evax_output_fill PARAMS ((bfd *abfd, int value, int length));
-extern char *_bfd_evax_length_hash_symbol PARAMS ((bfd *abfd, const char *in));
+extern char *_bfd_evax_length_hash_symbol PARAMS ((bfd *abfd, const char *in, int maxlen));
 
 #endif /* EVAX_H */