diff options
| author | Reid Kleckner <reid@kleckner.net> | 2013-04-23 13:15:51 +0000 |
|---|---|---|
| committer | Reid Kleckner <reid@kleckner.net> | 2013-04-23 13:15:51 +0000 |
| commit | de0c26046daa855ff67fb5b77a26b79f6ff225e8 (patch) | |
| tree | fed0469c4d34738d375fcaaa04a114af815d4542 /llvm/unittests/Support/ProgramTest.cpp | |
| parent | f36c5a843156d7f194c2833a9d663ca682bb018c (diff) | |
| download | llvm-de0c26046daa855ff67fb5b77a26b79f6ff225e8.zip llvm-de0c26046daa855ff67fb5b77a26b79f6ff225e8.tar.gz llvm-de0c26046daa855ff67fb5b77a26b79f6ff225e8.tar.bz2 | |
Un-revert the environ copy in ProgramTest after fixing it on OS X
This was r180041 and r180046, which was reverted in r180066.
Re-committing this should fix the dragonegg bootstrap, which I presume
needs LD_LIBRARY_PATH to be propagated to the child.
Tested on Linux, Windows, and Mac OS 10.6.
llvm-svn: 180099
Diffstat (limited to 'llvm/unittests/Support/ProgramTest.cpp')
| -rwxr-xr-x | llvm/unittests/Support/ProgramTest.cpp | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/llvm/unittests/Support/ProgramTest.cpp b/llvm/unittests/Support/ProgramTest.cpp index 03083aa..80b0334 100755 --- a/llvm/unittests/Support/ProgramTest.cpp +++ b/llvm/unittests/Support/ProgramTest.cpp @@ -13,6 +13,12 @@ #include "gtest/gtest.h" #include <stdlib.h> +#ifdef __APPLE__ +# include <crt_externs.h> +#else +// Forward declare environ in case it's not provided by stdlib.h. +extern char **environ; +#endif namespace { @@ -24,6 +30,21 @@ ProgramTestStringArg1("program-test-string-arg1"); static cl::opt<std::string> ProgramTestStringArg2("program-test-string-arg2"); +static void CopyEnvironment(std::vector<const char *> &out) { +#ifdef __APPLE__ + // _NSGetEnviron() only works from the main exe on Mac. Fortunately the test + // should be in the executable. + char **envp = *_NSGetEnviron(); +#else + // environ seems to work for Windows and most other Unices. + char **envp = environ; +#endif + while (*envp != 0) { + out.push_back(*envp); + ++envp; + } +} + TEST(ProgramTest, CreateProcessTrailingSlash) { if (getenv("LLVM_PROGRAM_TEST_CHILD")) { if (ProgramTestStringArg1 == "has\\\\ trailing\\" && @@ -43,7 +64,13 @@ TEST(ProgramTest, CreateProcessTrailingSlash) { "-program-test-string-arg2", "has\\\\ trailing\\", 0 }; - const char *envp[] = { "LLVM_PROGRAM_TEST_CHILD=1", 0 }; + + // Add LLVM_PROGRAM_TEST_CHILD to the environment of the child. + std::vector<const char *> envp; + CopyEnvironment(envp); + envp.push_back("LLVM_PROGRAM_TEST_CHILD=1"); + envp.push_back(0); + std::string error; bool ExecutionFailed; // Redirect stdout and stdin to NUL, but let stderr through. @@ -53,7 +80,7 @@ TEST(ProgramTest, CreateProcessTrailingSlash) { Path nul("/dev/null"); #endif const Path *redirects[] = { &nul, &nul, 0 }; - int rc = Program::ExecuteAndWait(my_exe, argv, envp, redirects, + int rc = Program::ExecuteAndWait(my_exe, argv, &envp[0], redirects, /*secondsToWait=*/10, /*memoryLimit=*/0, &error, &ExecutionFailed); EXPECT_FALSE(ExecutionFailed) << error; |
