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 <r...@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
}