diff options
author | Doug Rupp <rupp@adacore.com> | 2019-07-10 09:01:13 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2019-07-10 09:01:13 +0000 |
commit | 32e0627f99f4212695ec13b6d50ca48d1c29ded3 (patch) | |
tree | 6a89b9d7da5262bb14586a342bb423d17748b6c7 /gcc | |
parent | c03c026753c3cfb102435842e53c0a4773aedc75 (diff) | |
download | gcc-32e0627f99f4212695ec13b6d50ca48d1c29ded3.zip gcc-32e0627f99f4212695ec13b6d50ca48d1c29ded3.tar.gz gcc-32e0627f99f4212695ec13b6d50ca48d1c29ded3.tar.bz2 |
[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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/ada/env.c | 32 |
2 files changed, 30 insertions, 7 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 88c25be..e4034e4 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -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 diff --git a/gcc/ada/env.c b/gcc/ada/env.c index cf839f5..04e861e 100644 --- a/gcc/ada/env.c +++ b/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 } |