Commit 32e0627f by Doug Rupp Committed by Pierre-Marie de Rodat

[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.

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

gcc/ada/

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

From-SVN: r273332
parent c03c0267
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> 2019-07-10 Patrick Bernardi <bernardi@adacore.com>
* Makefile.rtl: Handle vxworks7r2 ppc target * Makefile.rtl: Handle vxworks7r2 ppc target
......
...@@ -60,6 +60,9 @@ ...@@ -60,6 +60,9 @@
#endif #endif
#if defined (__vxworks) #if defined (__vxworks)
#include <vxWorks.h>
#include <version.h>
#if defined (__RTP__) #if defined (__RTP__)
/* On VxWorks 6 Real-Time process mode, environ is defined in unistd.h. */ /* On VxWorks 6 Real-Time process mode, environ is defined in unistd.h. */
#include <unistd.h> #include <unistd.h>
...@@ -69,14 +72,18 @@ ...@@ -69,14 +72,18 @@
envLib.h on VxWorks MILS and VxWorks 653. */ envLib.h on VxWorks MILS and VxWorks 653. */
#include <vThreadsData.h> #include <vThreadsData.h>
#include <envLib.h> #include <envLib.h>
#else #elif (_WRS_VXWORKS_MAJOR <= 6)
/* This should work for kernel mode on both VxWorks 5 and VxWorks 6. */
#include <envLib.h> #include <envLib.h>
/* In that mode the following symbol is not defined in any VxWorks
/* In that mode environ is a macro which reference the following symbol. include files, prior to vxWorks 7, so we declare it as extern. */
As the symbol is not defined in any VxWorks include files we declare
it as extern. */
extern char** ppGlobalEnviron; 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
#endif #endif
...@@ -223,7 +230,18 @@ __gnat_environ (void) ...@@ -223,7 +230,18 @@ __gnat_environ (void)
extern char **environ; extern char **environ;
return environ; return environ;
#else #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 #endif
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment