[Ada] The environ macro is broken on vxworks7r2 SR0610
authorDoug Rupp <rupp@adacore.com>
Wed, 10 Jul 2019 09:01:13 +0000 (09:01 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 10 Jul 2019 09:01:13 +0000 (09:01 +0000)
In SR0610, the TCB is made private, so the task environ field used by
the environ macro is no longer visible.  Arguably this is a bug, however
a more correct approach is to use accessor functions to retrieve this
field and not use the environ macro, thus avoiding the problem.

2019-07-10  Doug Rupp  <rupp@adacore.com>

gcc/ada/

* env.c (__gnat_environ): Reformulate to also work for
vxworks7r2 SR0610.

From-SVN: r273332

gcc/ada/ChangeLog
gcc/ada/env.c

index 88c25be67385f44cef820205960bb5a948fa01fc..e4034e42f6ac5002100219be3ad2c74e9f8d4d40 100644 (file)
@@ -1,3 +1,8 @@
+2019-07-10  Doug Rupp  <rupp@adacore.com>
+
+       * env.c (__gnat_environ): Reformulate to also work for
+       vxworks7r2 SR0610.
+
 2019-07-10  Patrick Bernardi  <bernardi@adacore.com>
 
        * Makefile.rtl: Handle vxworks7r2 ppc target
index cf839f5668265faf723d46079aa8641259b5d052..04e861e19e9d26d550a08469450fd477cf40e85e 100644 (file)
@@ -60,6 +60,9 @@
 #endif
 
 #if defined (__vxworks)
+  #include <vxWorks.h>
+  #include <version.h>
+
   #if defined (__RTP__)
     /* On VxWorks 6 Real-Time process mode, environ is defined in unistd.h.  */
     #include <unistd.h>
        envLib.h on VxWorks MILS and VxWorks 653.  */
     #include <vThreadsData.h>
     #include <envLib.h>
-  #else
-    /* This should work for kernel mode on both VxWorks 5 and VxWorks 6.  */
+  #elif (_WRS_VXWORKS_MAJOR <= 6)
     #include <envLib.h>
-
-    /* In that mode environ is a macro which reference the following symbol.
-       As the symbol is not defined in any VxWorks include files we declare
-       it as extern.  */
+    /* In that mode the following symbol is not defined in any VxWorks
+       include files, prior to vxWorks 7, so we declare it as extern.  */
     extern char** ppGlobalEnviron;
+  #elif (_WRS_VXWORKS_MAJOR >= 7)
+    /* This should work for kernel mode on VxWorks 7.x.  In 7.2 the tcb
+       is made private, so accessor functions must be used, in 7.0 it
+       is optional but there is no way to distinguish between 7.2
+       and 7.0 since the version.h header file was never updated.  */
+    #include <envLib.h>
+    #include <taskLibCommon.h>
   #endif
 #endif
 
@@ -223,7 +230,18 @@ __gnat_environ (void)
   extern char **environ;
   return environ;
 #else
-  return environ;
+  #if defined (__RTP__) || defined (VTHREADS) || (_WRS_VXWORKS_MAJOR <= 6)
+    return environ;
+  #elif (_WRS_VXWORKS_MAJOR >= 7)
+    char **task_environ;
+
+    task_environ = envGet (taskIdSelf ());
+
+    if (task_environ == NULL)
+       return ppGlobalEnviron;
+    else
+       return task_environ;
+  #endif
 #endif
 }