diff options
Diffstat (limited to 'gcc/ada/init.c')
-rw-r--r-- | gcc/ada/init.c | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/gcc/ada/init.c b/gcc/ada/init.c index e943837..d61086e 100644 --- a/gcc/ada/init.c +++ b/gcc/ada/init.c @@ -1508,6 +1508,14 @@ __gnat_set_stack_limit (void) #endif } +#ifdef IN_RTS +extern int SYS$IEEE_SET_FP_CONTROL (void *, void *, void *); +#define K_TRUE 1 +#define __int64 long long +#define __NEW_STARLET +#include <vms/ieeedef.h> +#endif + /* Feature logical name and global variable address pair. If we ever add another feature logical to this list, the feature struct will need to be enhanced to take into account @@ -1517,9 +1525,21 @@ struct feature { int *gl_addr; }; -/* Default values for GNAT features set by environment. */ +/* Default values for GNAT features set by environment or binder. */ int __gl_heap_size = 64; +/* Default float format is 'I' meaning IEEE. If gnatbind detetcts that a + VAX Float format is specified, it will set this global variable to 'V'. + Subsequently __gnat_set_features will test the variable and if set for + VAX Float will call a Starlet function to enable trapping for invalid + operation, drivide by zero, and overflow. This will prevent the VMS runtime + (specifically OTS$CHECK_FP_MODE) from complaining about inconsistent + floating point settings in a mixed language program. Ideally the setting + would be determined at link time based on setttings in the object files, + however the VMS linker seems to take the setting from the first object + in the link, e.g. pcrt0.o which is float representation neutral. */ +char __gl_float_format = 'I'; + /* Array feature logical names and global variable addresses. */ static const struct feature features[] = { @@ -1532,6 +1552,12 @@ __gnat_set_features (void) { int i; char buff[16]; +#ifdef IN_RTS + IEEE clrmsk, setmsk, prvmsk; + + clrmsk.ieee$q_flags = 0LL; + setmsk.ieee$q_flags = 0LL; +#endif /* Loop through features array and test name for enable/disable. */ for (i = 0; features[i].name; i++) @@ -1551,6 +1577,16 @@ __gnat_set_features (void) /* Features to artificially limit the stack size. */ __gnat_set_stack_limit (); +#ifdef IN_RTS + if (__gl_float_format == 'V') + { + setmsk.ieee$v_trap_enable_inv = K_TRUE; + setmsk.ieee$v_trap_enable_dze = K_TRUE; + setmsk.ieee$v_trap_enable_ovf = K_TRUE; + SYS$IEEE_SET_FP_CONTROL (&clrmsk, &setmsk, &prvmsk); + } +#endif + __gnat_features_set = 1; } |