This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Ada] The environ macro is broken on vxworks7r2 SR0610


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.

Tested on x86_64-pc-linux-gnu, committed on trunk

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

gcc/ada/

	* env.c (__gnat_environ): Reformulate to also work for
	vxworks7r2 SR0610.
--- gcc/ada/env.c
+++ gcc/ada/env.c
@@ -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>
@@ -69,14 +72,18 @@
        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
 }
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]