From ae84ad15efd7ef7da95146e900ec72ceadf98058 Mon Sep 17 00:00:00 2001 From: Rainer Orth Date: Wed, 16 Aug 2023 09:57:59 +0200 Subject: [Driver] Select newest GCC installation on Solaris As described in Issue #53709 , since 28d58d8fe2094af6902dee7b4d68ec30a3e9d737 `clang` doesn't find the latest of several parallel GCC installations on Solaris, but only the first in directory order, which is pretty random. This patch sorts GCC installations in reverse version order so the latest is picked. Tested on `sparcv9-sun-solaris2.11`, `amd64-pc-solaris2.11`, and `x86_64-pc-linux-gnu`. Differential Revision: https://reviews.llvm.org/D157275 --- clang/unittests/Driver/ToolChainTest.cpp | 149 +++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) (limited to 'clang/unittests/Driver/ToolChainTest.cpp') diff --git a/clang/unittests/Driver/ToolChainTest.cpp b/clang/unittests/Driver/ToolChainTest.cpp index 8d3853a..bf61d42 100644 --- a/clang/unittests/Driver/ToolChainTest.cpp +++ b/clang/unittests/Driver/ToolChainTest.cpp @@ -168,6 +168,155 @@ TEST(ToolChainTest, VFSGCCInstallationRelativeDir) { S); } +TEST(ToolChainTest, VFSSolarisMultiGCCInstallation) { + IntrusiveRefCntPtr DiagOpts = new DiagnosticOptions(); + + IntrusiveRefCntPtr DiagID(new DiagnosticIDs()); + struct TestDiagnosticConsumer : public DiagnosticConsumer {}; + IntrusiveRefCntPtr InMemoryFileSystem( + new llvm::vfs::InMemoryFileSystem); + + const char *EmptyFiles[] = { + // Sort entries so the latest version doesn't come first. + "/usr/gcc/7/lib/gcc/sparcv9-sun-solaris2.11/7.5.0/32/crtbegin.o", + "/usr/gcc/7/lib/gcc/sparcv9-sun-solaris2.11/7.5.0/crtbegin.o", + "/usr/gcc/7/lib/gcc/x86_64-pc-solaris2.11/7.5.0/32/crtbegin.o", + "/usr/gcc/7/lib/gcc/x86_64-pc-solaris2.11/7.5.0/crtbegin.o", + "/usr/gcc/11/lib/gcc/sparcv9-sun-solaris2.11/11.4.0/crtbegin.o", + "/usr/gcc/11/lib/gcc/sparcv9-sun-solaris2.11/11.4.0/sparcv8plus/" + "crtbegin.o", + "/usr/gcc/11/lib/gcc/x86_64-pc-solaris2.11/11.4.0/32/crtbegin.o", + "/usr/gcc/11/lib/gcc/x86_64-pc-solaris2.11/11.4.0/crtbegin.o", + "/usr/gcc/4.7/lib/gcc/i386-pc-solaris2.11/4.7.3/amd64/crtbegin.o", + "/usr/gcc/4.7/lib/gcc/i386-pc-solaris2.11/4.7.3/crtbegin.o", + "/usr/gcc/4.7/lib/gcc/sparc-sun-solaris2.11/4.7.3/crtbegin.o", + "/usr/gcc/4.7/lib/gcc/sparc-sun-solaris2.11/4.7.3/sparcv9/crtbegin.o", + }; + + for (const char *Path : EmptyFiles) + InMemoryFileSystem->addFile(Path, 0, + llvm::MemoryBuffer::getMemBuffer("\n")); + + { + DiagnosticsEngine Diags(DiagID, &*DiagOpts, new TestDiagnosticConsumer); + Driver TheDriver("/bin/clang", "i386-pc-solaris2.11", Diags, + "clang LLVM compiler", InMemoryFileSystem); + std::unique_ptr C( + TheDriver.BuildCompilation({"-v", "--gcc-toolchain=", "--sysroot="})); + ASSERT_TRUE(C); + std::string S; + { + llvm::raw_string_ostream OS(S); + C->getDefaultToolChain().printVerboseInfo(OS); + } + if (is_style_windows(llvm::sys::path::Style::native)) + std::replace(S.begin(), S.end(), '\\', '/'); + EXPECT_EQ("Found candidate GCC installation: " + "/usr/gcc/11/lib/gcc/x86_64-pc-solaris2.11/11.4.0\n" + "Selected GCC installation: " + "/usr/gcc/11/lib/gcc/x86_64-pc-solaris2.11/11.4.0\n" + "Candidate multilib: .;@m64\n" + "Candidate multilib: 32;@m32\n" + "Selected multilib: 32;@m32\n", + S); + } + + { + DiagnosticsEngine Diags(DiagID, &*DiagOpts, new TestDiagnosticConsumer); + Driver TheDriver("/bin/clang", "amd64-pc-solaris2.11", Diags, + "clang LLVM compiler", InMemoryFileSystem); + std::unique_ptr C( + TheDriver.BuildCompilation({"-v", "--gcc-toolchain=", "--sysroot="})); + ASSERT_TRUE(C); + std::string S; + { + llvm::raw_string_ostream OS(S); + C->getDefaultToolChain().printVerboseInfo(OS); + } + if (is_style_windows(llvm::sys::path::Style::native)) + std::replace(S.begin(), S.end(), '\\', '/'); + EXPECT_EQ("Found candidate GCC installation: " + "/usr/gcc/11/lib/gcc/x86_64-pc-solaris2.11/11.4.0\n" + "Selected GCC installation: " + "/usr/gcc/11/lib/gcc/x86_64-pc-solaris2.11/11.4.0\n" + "Candidate multilib: .;@m64\n" + "Candidate multilib: 32;@m32\n" + "Selected multilib: .;@m64\n", + S); + } + + { + DiagnosticsEngine Diags(DiagID, &*DiagOpts, new TestDiagnosticConsumer); + Driver TheDriver("/bin/clang", "x86_64-pc-solaris2.11", Diags, + "clang LLVM compiler", InMemoryFileSystem); + std::unique_ptr C( + TheDriver.BuildCompilation({"-v", "--gcc-toolchain=", "--sysroot="})); + ASSERT_TRUE(C); + std::string S; + { + llvm::raw_string_ostream OS(S); + C->getDefaultToolChain().printVerboseInfo(OS); + } + if (is_style_windows(llvm::sys::path::Style::native)) + std::replace(S.begin(), S.end(), '\\', '/'); + EXPECT_EQ("Found candidate GCC installation: " + "/usr/gcc/11/lib/gcc/x86_64-pc-solaris2.11/11.4.0\n" + "Selected GCC installation: " + "/usr/gcc/11/lib/gcc/x86_64-pc-solaris2.11/11.4.0\n" + "Candidate multilib: .;@m64\n" + "Candidate multilib: 32;@m32\n" + "Selected multilib: .;@m64\n", + S); + } + + { + DiagnosticsEngine Diags(DiagID, &*DiagOpts, new TestDiagnosticConsumer); + Driver TheDriver("/bin/clang", "sparc-sun-solaris2.11", Diags, + "clang LLVM compiler", InMemoryFileSystem); + std::unique_ptr C( + TheDriver.BuildCompilation({"-v", "--gcc-toolchain=", "--sysroot="})); + ASSERT_TRUE(C); + std::string S; + { + llvm::raw_string_ostream OS(S); + C->getDefaultToolChain().printVerboseInfo(OS); + } + if (is_style_windows(llvm::sys::path::Style::native)) + std::replace(S.begin(), S.end(), '\\', '/'); + EXPECT_EQ("Found candidate GCC installation: " + "/usr/gcc/11/lib/gcc/sparcv9-sun-solaris2.11/11.4.0\n" + "Selected GCC installation: " + "/usr/gcc/11/lib/gcc/sparcv9-sun-solaris2.11/11.4.0\n" + "Candidate multilib: .;@m64\n" + "Candidate multilib: sparcv8plus;@m32\n" + "Selected multilib: sparcv8plus;@m32\n", + S); + } + { + DiagnosticsEngine Diags(DiagID, &*DiagOpts, new TestDiagnosticConsumer); + Driver TheDriver("/bin/clang", "sparcv9-sun-solaris2.11", Diags, + "clang LLVM compiler", InMemoryFileSystem); + std::unique_ptr C( + TheDriver.BuildCompilation({"-v", "--gcc-toolchain=", "--sysroot="})); + ASSERT_TRUE(C); + std::string S; + { + llvm::raw_string_ostream OS(S); + C->getDefaultToolChain().printVerboseInfo(OS); + } + if (is_style_windows(llvm::sys::path::Style::native)) + std::replace(S.begin(), S.end(), '\\', '/'); + EXPECT_EQ("Found candidate GCC installation: " + "/usr/gcc/11/lib/gcc/sparcv9-sun-solaris2.11/11.4.0\n" + "Selected GCC installation: " + "/usr/gcc/11/lib/gcc/sparcv9-sun-solaris2.11/11.4.0\n" + "Candidate multilib: .;@m64\n" + "Candidate multilib: sparcv8plus;@m32\n" + "Selected multilib: .;@m64\n", + S); + } +} + TEST(ToolChainTest, DefaultDriverMode) { IntrusiveRefCntPtr DiagOpts = new DiagnosticOptions(); -- cgit v1.1