Commit 4ec3e8ca authored by Richard Levitte's avatar Richard Levitte
Browse files

For VMS, implement the possibility to choose 64-bit pointers with

different options:
"64"		The build system will choose /POINTER_SIZE=64=ARGV if
		the compiler supports it, otherwise /POINTER_SIZE=64.
"64="		The build system will force /POINTER_SIZE=64.
"64=ARGV"	The build system will force /POINTER_SIZE=64=ARGV.
parent 5d0137aa
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -328,6 +328,8 @@ $ entrycount=0
$   loop:
$     read /end=loop_end /err=loop_end libnum line
$     lin = f$edit( line, "COMPRESS,TRIM")
$!    Skip a "#" comment line.
$     if (f$extract( 0, 1, lin) .eqs. "#") then goto loop
$     entrynum = f$int(f$element( 1, " ", lin))
$     entryinfo = f$element( 2, " ", lin)
$     curentry = f$element( 0, " ", lin)
+35 −14
Original line number Diff line number Diff line
@@ -40,11 +40,15 @@ $!
$!  P5, if defined, sets a choice of programs to compile.
$!
$!  P6, if defined, specifies the C pointer size.  Ignored on VAX.
$!      ("64=ARGV" gives more efficient code with HP C V7.3 or newer.)
$!      Supported values are:
$!
$!      ""      Compile with default (/NOPOINTER_SIZE)
$!      32      Compile with /POINTER_SIZE=32 (SHORT)
$!      64      Compile with /POINTER_SIZE=64[=ARGV] (LONG[=ARGV])
$!               (Automatically select ARGV if compiler supports it.)
$!      64=      Compile with /POINTER_SIZE=64 (LONG).
$!      64=ARGV  Compile with /POINTER_SIZE=64=ARGV (LONG=ARGV).
$!
$!  P7, if defined, specifies a directory where ZLIB files (zlib.h,
$!  libz.olb) may be found.  Optionally, a non-default object library
@@ -597,13 +601,22 @@ $ IF (P6 .EQS. "32")
$   THEN
$     POINTER_SIZE = "/POINTER_SIZE=32"
$   ELSE
$     IF (P6 .EQS. "64")
$     POINTER_SIZE = F$EDIT( P6, "COLLAPSE, UPCASE")
$     IF ((POINTER_SIZE .EQS. "64") .OR. -
       (POINTER_SIZE .EQS. "64=") .OR. -
       (POINTER_SIZE .EQS. "64=ARGV"))
$     THEN
$       POINTER_SIZE = "/POINTER_SIZE=64"
$       ARCHD = ARCH+ "_64"
$       LIB32 = ""
$       IF (F$EXTRACT( 2, 1, POINTER_SIZE) .EQS. "=")
$       THEN
$!         Explicit user choice: "64" or "64=ARGV".
$          IF (POINTER_SIZE .EQS. "64=") THEN POINTER_SIZE = "64"
$       ELSE
$	SET NOON
$	DEFINE /USER SYS$OUTPUT NL:
$	DEFINE /USER SYS$ERROR NL:
$	CC /POINTER_SIZE=64=ARGV NL:
$         DEFINE /USER_MODE SYS$OUTPUT NL:
$         DEFINE /USER_MODE SYS$ERROR NL:
$         CC /NOLIST /NOOBJECT /POINTER_SIZE=64=ARGV NL:
$	IF ($STATUS .AND. %X0FFF0000) .EQ. %X00030000
$	THEN
$	  ! If we got here, it means DCL complained like this:
@@ -615,14 +628,15 @@ $ ! have been deassigned automatically. However, when DCL
$	  ! complains, they aren't, so we do it here (it might be
$	  ! unnecessary, but just in case there will be another error
$	  ! message further on that we don't want to miss)
$	  DEASSIGN/USER SYS$ERROR
$	  DEASSIGN/USER SYS$OUTPUT
$           DEASSIGN /USER_MODE SYS$ERROR
$           DEASSIGN /USER_MODE SYS$OUTPUT
$	ELSE
$	  POINTER_SIZE = POINTER_SIZE + "=ARGV"
$	ENDIF
$	SET ON
$       ARCHD = ARCH+ "_64"
$       LIB32 = ""
$       ENDIF
$       POINTER_SIZE = "/POINTER_SIZE=''POINTER_SIZE'"
$!
$     ELSE
$!
$!      Tell The User Entered An Invalid Option.
@@ -631,9 +645,16 @@ $ WRITE SYS$OUTPUT ""
$       WRITE SYS$OUTPUT "The Option ", P6, -
         " Is Invalid.  The Valid Options Are:"
$       WRITE SYS$OUTPUT ""
$       WRITE SYS$OUTPUT "    """"  :  Compile with default (short) pointers."
$       WRITE SYS$OUTPUT "    32  :  Compile with 32-bit (short) pointers."
$       WRITE SYS$OUTPUT "    64  :  Compile with 64-bit (long) pointers."
$       WRITE SYS$OUTPUT -
         "    """"  :  Compile with default (short) pointers."
$       WRITE SYS$OUTPUT -
         "    32  :  Compile with 32-bit (short) pointers."
$       WRITE SYS$OUTPUT -
         "    64       :  Compile with 64-bit (long) pointers (auto ARGV)."
$       WRITE SYS$OUTPUT -
         "    64=      :  Compile with 64-bit (long) pointers (no ARGV)."
$       WRITE SYS$OUTPUT -
         "    64=ARGV  :  Compile with 64-bit (long) pointers (ARGV)."
$       WRITE SYS$OUTPUT ""
$! 
$!      Time To EXIT.
+35 −29
Original line number Diff line number Diff line
@@ -212,8 +212,13 @@ static void lock_dbg_cb(int mode, int type, const char *file, int line)
		}
	}

#if defined( OPENSSL_SYS_VMS) && (__INITIAL_POINTER_SIZE == 64)
# define ARGV _Argv
#else
# define ARGV Argv
#endif

int main(int Argc, char *_Argv[])
int main(int Argc, char *ARGV[])
	{
	ARGS arg;
#define PROG_NAME_SIZE	39
@@ -228,25 +233,33 @@ int main(int Argc, char *_Argv[])
	LHASH_OF(FUNCTION) *prog=NULL;
	long errline;

#if defined( OPENSSL_SYS_VMS) && !defined( VMS_TRUST_ARGV)
	/* 2011-03-08 SMS.
	 * "HP C V7.3-009 on OpenVMS Alpha V8.3" with 64-bit
	 * pointers (at least) may not NULL-terminate argv[]
	 * as expected.  If necessary, use a (properly)
	 * NULL-terminated duplicate of argv[].
	 */
	/* 2011-03-20 RL.
	 * Additionally, when the argument vector is full of
	 * 32-bit pointers and we have a 64-bit pointer size
	 * everywhere else, we need to make a copy of it using
	 * 64-bit pointers.  Hence the odd conditinal.
#if defined( OPENSSL_SYS_VMS) && (__INITIAL_POINTER_SIZE == 64)
	/* 2011-03-22 SMS.
	 * If we have 32-bit pointers everywhere, then we're safe, and
	 * we bypass this mess, as on non-VMS systems.  (See ARGV,
	 * above.)
	 * Problem 1: Compaq/HP C before V7.3 always used 32-bit
	 * pointers for argv[].
	 * Fix 1: For a 32-bit argv[], when we're using 64-bit pointers
	 * everywhere else, we always allocate and use a 64-bit
	 * duplicate of argv[].
	 * Problem 2: Compaq/HP C V7.3 (Alpha, IA64) before ECO1 failed
	 * to NULL-terminate a 64-bit argv[].  (As this was written, the
	 * compiler ECO was available only on IA64.)
	 * Fix 2: Unless advised not to (VMS_TRUST_ARGV), we test a
	 * 64-bit argv[argc] for NULL, and, if necessary, use a
	 * (properly) NULL-terminated (64-bit) duplicate of argv[].
	 * The same code is used in either case to duplicate argv[].
	 * Some of these decisions could be handled in preprocessing,
	 * but the code tends to get even uglier, and the penalty for
	 * deciding at compile- or run-time is tiny.
	 */
	char **Argv = NULL;
	int free_Argv = 0;

	if (_Argv[ Argc] != NULL
# if defined(__INITIAL_POINTER_SIZE)
		|| sizeof(_Argv) < (__INITIAL_POINTER_SIZE / 8)
	if ((sizeof( _Argv) < 8)        /* 32-bit argv[]. */
# if !defined( VMS_TRUST_ARGV)
	 || (_Argv[ Argc] != NULL)      /* Untrusted argv[argc] not NULL. */
# endif
		)
		{
@@ -256,24 +269,17 @@ int main(int Argc, char *_Argv[])
			{ ret = -1; goto end; }
		for(i = 0; i < Argc; i++)
			Argv[i] = _Argv[i];
		Argv[ Argc] = NULL;
		Argv[ Argc] = NULL;     /* Certain NULL termination. */
		free_Argv = 1;
		}
	else
		{
		/* 2011-03-20 RL.
		 * If we didn't copy the argument vector, then simply
		 * assign our variable.  This will never happen when
		 * the argument vector pointer size was smaller than
		 * the initial pointer size, so even if the case might
		 * look unsafe, it isn't, it's just there to shut the
		 * compiler up.
		 */
		/* Use the known-good 32-bit argv[] (which needs the
		 * type cast to satisfy the compiler), or the trusted or
		 * tested-good 64-bit argv[] as-is. */
		Argv = (char **)_Argv;
		}
#else
	char **Argv = _Argv;
#endif
#endif /* defined( OPENSSL_SYS_VMS) && (__INITIAL_POINTER_SIZE == 64) */

	arg.data=NULL;
	arg.count=0;
@@ -420,7 +426,7 @@ end:
		BIO_free(bio_err);
		bio_err=NULL;
		}
#if defined( OPENSSL_SYS_VMS) && !defined( VMS_TRUST_ARGV)
#if defined( OPENSSL_SYS_VMS) && (__INITIAL_POINTER_SIZE == 64)
	/* Free any duplicate Argv[] storage. */
	if (free_Argv)
		{
+21 −8
Original line number Diff line number Diff line
@@ -52,7 +52,10 @@ $! Supported values are:
$!
$!      ""      Compile with default (/NOPOINTER_SIZE)
$!      32      Compile with /POINTER_SIZE=32 (SHORT)
$!      64      Compile with /POINTER_SIZE=64[=ARGV] (LONG[=ARGV])
$!      64       Compile with /POINTER_SIZE=64[=ARGV] (LONG[=ARGV]).
$!               (Automatically select ARGV if compiler supports it.)
$!      64=      Compile with /POINTER_SIZE=64 (LONG).
$!      64=ARGV  Compile with /POINTER_SIZE=64=ARGV (LONG=ARGV).
$!
$!  P8, if defined, specifies a directory where ZLIB files (zlib.h,
$!  libz.olb) may be found.  Optionally, a non-default object library
@@ -979,11 +982,14 @@ $ IF (P7 .EQS. "32")
$   THEN
$     POINTER_SIZE = "/POINTER_SIZE=32"
$   ELSE
$     IF (P7 .EQS. "64")
$     POINTER_SIZE = F$EDIT( P7, "COLLAPSE, UPCASE")
$     IF ((POINTER_SIZE .EQS. "64") .OR. -
       (POINTER_SIZE .EQS. "64=") .OR. -
       (POINTER_SIZE .EQS. "64=ARGV"))
$     THEN
$       POINTER_SIZE = "/POINTER_SIZE=64"
$       ARCHD = ARCH+ "_64"
$       LIB32 = ""
$       POINTER_SIZE = "/POINTER_SIZE=64"
$     ELSE
$!
$!      Tell The User Entered An Invalid Option.
@@ -992,9 +998,16 @@ $ WRITE SYS$OUTPUT ""
$       WRITE SYS$OUTPUT "The Option ", P7, -
         " Is Invalid.  The Valid Options Are:"
$       WRITE SYS$OUTPUT ""
$       WRITE SYS$OUTPUT "    """"  :  Compile with default (short) pointers."
$       WRITE SYS$OUTPUT "    32  :  Compile with 32-bit (short) pointers."
$       WRITE SYS$OUTPUT "    64  :  Compile with 64-bit (long) pointers."
$       WRITE SYS$OUTPUT -
         "    """"       :  Compile with default (short) pointers."
$       WRITE SYS$OUTPUT -
         "    32       :  Compile with 32-bit (short) pointers."
$       WRITE SYS$OUTPUT -
         "    64       :  Compile with 64-bit (long) pointers (auto ARGV)."
$       WRITE SYS$OUTPUT -
         "    64=      :  Compile with 64-bit (long) pointers (no ARGV)."
$       WRITE SYS$OUTPUT -
         "    64=ARGV  :  Compile with 64-bit (long) pointers (ARGV)."
$       WRITE SYS$OUTPUT ""
$! 
$!      Time To EXIT.
+21 −8
Original line number Diff line number Diff line
@@ -34,6 +34,9 @@ $!
$!	""	Compile with default (/NOPOINTER_SIZE)
$!	32	Compile with /POINTER_SIZE=32 (SHORT)
$!	64	Compile with /POINTER_SIZE=64[=ARGV] (LONG[=ARGV])
$!               (Automatically select ARGV if compiler supports it.)
$!      64=      Compile with /POINTER_SIZE=64 (LONG).
$!      64=ARGV  Compile with /POINTER_SIZE=64=ARGV (LONG=ARGV).
$!
$!  P8, if defined, specifies a directory where ZLIB files (zlib.h,
$!  libz.olb) may be found.  Optionally, a non-default object library
@@ -608,11 +611,14 @@ $ IF (OPT_POINTER_SIZE .EQS. "32")
$   THEN
$     POINTER_SIZE = "/POINTER_SIZE=32"
$   ELSE
$     IF (OPT_POINTER_SIZE .EQS. "64")
$     POINTER_SIZE = F$EDIT( OPT_POINTER_SIZE, "COLLAPSE, UPCASE")
$     IF ((POINTER_SIZE .EQS. "64") .OR. -
       (POINTER_SIZE .EQS. "64=") .OR. -
       (POINTER_SIZE .EQS. "64=ARGV"))
$     THEN
$       POINTER_SIZE = "/POINTER_SIZE=64"
$       ARCHD = ARCH+ "_64"
$       LIB32 = ""
$       POINTER_SIZE = "/POINTER_SIZE=64"
$     ELSE
$!
$!      Tell The User Entered An Invalid Option.
@@ -621,9 +627,16 @@ $ WRITE SYS$OUTPUT ""
$       WRITE SYS$OUTPUT "The Option ", OPT_POINTER_SIZE, -
         " Is Invalid.  The Valid Options Are:"
$       WRITE SYS$OUTPUT ""
$       WRITE SYS$OUTPUT "    """"  :  Compile with default (short) pointers."
$       WRITE SYS$OUTPUT "    32  :  Compile with 32-bit (short) pointers."
$       WRITE SYS$OUTPUT "    64  :  Compile with 64-bit (long) pointers."
$       WRITE SYS$OUTPUT -
         "    """"       :  Compile with default (short) pointers."
$       WRITE SYS$OUTPUT -
         "    32       :  Compile with 32-bit (short) pointers."
$       WRITE SYS$OUTPUT -
         "    64       :  Compile with 64-bit (long) pointers (auto ARGV)."
$       WRITE SYS$OUTPUT -
         "    64=      :  Compile with 64-bit (long) pointers (no ARGV)."
$       WRITE SYS$OUTPUT -
         "    64=ARGV  :  Compile with 64-bit (long) pointers (ARGV)."
$       WRITE SYS$OUTPUT ""
$! 
$!      Time To EXIT.
@@ -742,7 +755,7 @@ $ CCDEFS = "TCPIP_TYPE_''OPT_TCPIP_LIB',DSO_VMS"
$ IF F$TYPE(USER_CCDEFS) .NES. "" THEN CCDEFS = CCDEFS + "," + USER_CCDEFS
$ CCEXTRAFLAGS = ""
$ IF F$TYPE(USER_CCFLAGS) .NES. "" THEN CCEXTRAFLAGS = USER_CCFLAGS
$ CCDISABLEWARNINGS = "LONGLONGTYPE,LONGLONGSUFX"
$ CCDISABLEWARNINGS = "" !!! "LONGLONGTYPE,LONGLONGSUFX"
$ IF F$TYPE(USER_CCDISABLEWARNINGS) .NES. "" THEN -
	CCDISABLEWARNINGS = CCDISABLEWARNINGS + "," + USER_CCDISABLEWARNINGS
$!
Loading