diff options
author | Richard Levitte <levitte@openssl.org> | 2011-03-25 09:40:18 +0000 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2011-03-25 09:40:18 +0000 |
commit | f819147028b01459c0ad28d623a380bdb95656ca (patch) | |
tree | 32a20e9675b6fed0256c78f7e3a4822e0a624572 /apps | |
parent | a530963f05c4f7f30b36f040b2fb78b450b1871f (diff) |
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.
Diffstat (limited to 'apps')
-rw-r--r-- | apps/makeapps.com | 49 | ||||
-rw-r--r-- | apps/openssl.c | 64 |
2 files changed, 70 insertions, 43 deletions
diff --git a/apps/makeapps.com b/apps/makeapps.com index ad02169216..d2dd51298f 100644 --- a/apps/makeapps.com +++ b/apps/makeapps.com @@ -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. @@ -832,8 +853,8 @@ $! $ CC = "CC" $ IF ARCH.EQS."VAX" .AND. F$TRNLNM("DECC$CC_DEFAULT").NES."/DECC" - THEN CC = "CC/DECC" -$ CC = CC + "/''CC_OPTIMIZE'/''DEBUGGER'/STANDARD=RELAXED"+ - - "''POINTER_SIZE'/NOLIST/PREFIX=ALL" + - +$ CC = CC + "/''CC_OPTIMIZE' /''DEBUGGER' /STANDARD=RELAXED"+ - + "''POINTER_SIZE' /NOLIST /PREFIX=ALL" + - "/INCLUDE=(''CC_INCLUDES')" + CCEXTRAFLAGS $! $! Define The Linker Options File Name. diff --git a/apps/openssl.c b/apps/openssl.c index 950c9c8bf2..dab057bbff 100644 --- a/apps/openssl.c +++ b/apps/openssl.c @@ -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) { |