Skip to content

Commit 53e5a63

Browse files
rorthtru
authored andcommitted
[Driver] Select newest GCC installation on Solaris
As described in Issue #53709 <#53709>, since 28d58d8 <https://reviews.llvm.org/rG28d58d8fe2094af6902dee7b4d68ec30a3e9d737> `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 (cherry picked from commit ae84ad1)
1 parent f1f9dd3 commit 53e5a63

File tree

2 files changed

+156
-1
lines changed

2 files changed

+156
-1
lines changed

clang/lib/Driver/ToolChains/Gnu.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2227,6 +2227,7 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
22272227
// so we need to find those /usr/gcc/*/lib/gcc libdirs and go with
22282228
// /usr/gcc/<version> as a prefix.
22292229

2230+
SmallVector<std::pair<GCCVersion, std::string>, 8> SolarisPrefixes;
22302231
std::string PrefixDir = concat(SysRoot, "/usr/gcc");
22312232
std::error_code EC;
22322233
for (llvm::vfs::directory_iterator LI = D.getVFS().dir_begin(PrefixDir, EC),
@@ -2244,8 +2245,13 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
22442245
if (!D.getVFS().exists(CandidateLibPath))
22452246
continue;
22462247

2247-
Prefixes.push_back(CandidatePrefix);
2248+
SolarisPrefixes.emplace_back(
2249+
std::make_pair(CandidateVersion, CandidatePrefix));
22482250
}
2251+
// Sort in reverse order so GCCInstallationDetector::init picks the latest.
2252+
std::sort(SolarisPrefixes.rbegin(), SolarisPrefixes.rend());
2253+
for (auto p : SolarisPrefixes)
2254+
Prefixes.emplace_back(p.second);
22492255
return;
22502256
}
22512257

clang/unittests/Driver/ToolChainTest.cpp

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,155 @@ TEST(ToolChainTest, VFSGCCInstallationRelativeDir) {
168168
S);
169169
}
170170

171+
TEST(ToolChainTest, VFSSolarisMultiGCCInstallation) {
172+
IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
173+
174+
IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
175+
struct TestDiagnosticConsumer : public DiagnosticConsumer {};
176+
IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> InMemoryFileSystem(
177+
new llvm::vfs::InMemoryFileSystem);
178+
179+
const char *EmptyFiles[] = {
180+
// Sort entries so the latest version doesn't come first.
181+
"/usr/gcc/7/lib/gcc/sparcv9-sun-solaris2.11/7.5.0/32/crtbegin.o",
182+
"/usr/gcc/7/lib/gcc/sparcv9-sun-solaris2.11/7.5.0/crtbegin.o",
183+
"/usr/gcc/7/lib/gcc/x86_64-pc-solaris2.11/7.5.0/32/crtbegin.o",
184+
"/usr/gcc/7/lib/gcc/x86_64-pc-solaris2.11/7.5.0/crtbegin.o",
185+
"/usr/gcc/11/lib/gcc/sparcv9-sun-solaris2.11/11.4.0/crtbegin.o",
186+
"/usr/gcc/11/lib/gcc/sparcv9-sun-solaris2.11/11.4.0/sparcv8plus/"
187+
"crtbegin.o",
188+
"/usr/gcc/11/lib/gcc/x86_64-pc-solaris2.11/11.4.0/32/crtbegin.o",
189+
"/usr/gcc/11/lib/gcc/x86_64-pc-solaris2.11/11.4.0/crtbegin.o",
190+
"/usr/gcc/4.7/lib/gcc/i386-pc-solaris2.11/4.7.3/amd64/crtbegin.o",
191+
"/usr/gcc/4.7/lib/gcc/i386-pc-solaris2.11/4.7.3/crtbegin.o",
192+
"/usr/gcc/4.7/lib/gcc/sparc-sun-solaris2.11/4.7.3/crtbegin.o",
193+
"/usr/gcc/4.7/lib/gcc/sparc-sun-solaris2.11/4.7.3/sparcv9/crtbegin.o",
194+
};
195+
196+
for (const char *Path : EmptyFiles)
197+
InMemoryFileSystem->addFile(Path, 0,
198+
llvm::MemoryBuffer::getMemBuffer("\n"));
199+
200+
{
201+
DiagnosticsEngine Diags(DiagID, &*DiagOpts, new TestDiagnosticConsumer);
202+
Driver TheDriver("/bin/clang", "i386-pc-solaris2.11", Diags,
203+
"clang LLVM compiler", InMemoryFileSystem);
204+
std::unique_ptr<Compilation> C(
205+
TheDriver.BuildCompilation({"-v", "--gcc-toolchain=", "--sysroot="}));
206+
ASSERT_TRUE(C);
207+
std::string S;
208+
{
209+
llvm::raw_string_ostream OS(S);
210+
C->getDefaultToolChain().printVerboseInfo(OS);
211+
}
212+
if (is_style_windows(llvm::sys::path::Style::native))
213+
std::replace(S.begin(), S.end(), '\\', '/');
214+
EXPECT_EQ("Found candidate GCC installation: "
215+
"/usr/gcc/11/lib/gcc/x86_64-pc-solaris2.11/11.4.0\n"
216+
"Selected GCC installation: "
217+
"/usr/gcc/11/lib/gcc/x86_64-pc-solaris2.11/11.4.0\n"
218+
"Candidate multilib: .;@m64\n"
219+
"Candidate multilib: 32;@m32\n"
220+
"Selected multilib: 32;@m32\n",
221+
S);
222+
}
223+
224+
{
225+
DiagnosticsEngine Diags(DiagID, &*DiagOpts, new TestDiagnosticConsumer);
226+
Driver TheDriver("/bin/clang", "amd64-pc-solaris2.11", Diags,
227+
"clang LLVM compiler", InMemoryFileSystem);
228+
std::unique_ptr<Compilation> C(
229+
TheDriver.BuildCompilation({"-v", "--gcc-toolchain=", "--sysroot="}));
230+
ASSERT_TRUE(C);
231+
std::string S;
232+
{
233+
llvm::raw_string_ostream OS(S);
234+
C->getDefaultToolChain().printVerboseInfo(OS);
235+
}
236+
if (is_style_windows(llvm::sys::path::Style::native))
237+
std::replace(S.begin(), S.end(), '\\', '/');
238+
EXPECT_EQ("Found candidate GCC installation: "
239+
"/usr/gcc/11/lib/gcc/x86_64-pc-solaris2.11/11.4.0\n"
240+
"Selected GCC installation: "
241+
"/usr/gcc/11/lib/gcc/x86_64-pc-solaris2.11/11.4.0\n"
242+
"Candidate multilib: .;@m64\n"
243+
"Candidate multilib: 32;@m32\n"
244+
"Selected multilib: .;@m64\n",
245+
S);
246+
}
247+
248+
{
249+
DiagnosticsEngine Diags(DiagID, &*DiagOpts, new TestDiagnosticConsumer);
250+
Driver TheDriver("/bin/clang", "x86_64-pc-solaris2.11", Diags,
251+
"clang LLVM compiler", InMemoryFileSystem);
252+
std::unique_ptr<Compilation> C(
253+
TheDriver.BuildCompilation({"-v", "--gcc-toolchain=", "--sysroot="}));
254+
ASSERT_TRUE(C);
255+
std::string S;
256+
{
257+
llvm::raw_string_ostream OS(S);
258+
C->getDefaultToolChain().printVerboseInfo(OS);
259+
}
260+
if (is_style_windows(llvm::sys::path::Style::native))
261+
std::replace(S.begin(), S.end(), '\\', '/');
262+
EXPECT_EQ("Found candidate GCC installation: "
263+
"/usr/gcc/11/lib/gcc/x86_64-pc-solaris2.11/11.4.0\n"
264+
"Selected GCC installation: "
265+
"/usr/gcc/11/lib/gcc/x86_64-pc-solaris2.11/11.4.0\n"
266+
"Candidate multilib: .;@m64\n"
267+
"Candidate multilib: 32;@m32\n"
268+
"Selected multilib: .;@m64\n",
269+
S);
270+
}
271+
272+
{
273+
DiagnosticsEngine Diags(DiagID, &*DiagOpts, new TestDiagnosticConsumer);
274+
Driver TheDriver("/bin/clang", "sparc-sun-solaris2.11", Diags,
275+
"clang LLVM compiler", InMemoryFileSystem);
276+
std::unique_ptr<Compilation> C(
277+
TheDriver.BuildCompilation({"-v", "--gcc-toolchain=", "--sysroot="}));
278+
ASSERT_TRUE(C);
279+
std::string S;
280+
{
281+
llvm::raw_string_ostream OS(S);
282+
C->getDefaultToolChain().printVerboseInfo(OS);
283+
}
284+
if (is_style_windows(llvm::sys::path::Style::native))
285+
std::replace(S.begin(), S.end(), '\\', '/');
286+
EXPECT_EQ("Found candidate GCC installation: "
287+
"/usr/gcc/11/lib/gcc/sparcv9-sun-solaris2.11/11.4.0\n"
288+
"Selected GCC installation: "
289+
"/usr/gcc/11/lib/gcc/sparcv9-sun-solaris2.11/11.4.0\n"
290+
"Candidate multilib: .;@m64\n"
291+
"Candidate multilib: sparcv8plus;@m32\n"
292+
"Selected multilib: sparcv8plus;@m32\n",
293+
S);
294+
}
295+
{
296+
DiagnosticsEngine Diags(DiagID, &*DiagOpts, new TestDiagnosticConsumer);
297+
Driver TheDriver("/bin/clang", "sparcv9-sun-solaris2.11", Diags,
298+
"clang LLVM compiler", InMemoryFileSystem);
299+
std::unique_ptr<Compilation> C(
300+
TheDriver.BuildCompilation({"-v", "--gcc-toolchain=", "--sysroot="}));
301+
ASSERT_TRUE(C);
302+
std::string S;
303+
{
304+
llvm::raw_string_ostream OS(S);
305+
C->getDefaultToolChain().printVerboseInfo(OS);
306+
}
307+
if (is_style_windows(llvm::sys::path::Style::native))
308+
std::replace(S.begin(), S.end(), '\\', '/');
309+
EXPECT_EQ("Found candidate GCC installation: "
310+
"/usr/gcc/11/lib/gcc/sparcv9-sun-solaris2.11/11.4.0\n"
311+
"Selected GCC installation: "
312+
"/usr/gcc/11/lib/gcc/sparcv9-sun-solaris2.11/11.4.0\n"
313+
"Candidate multilib: .;@m64\n"
314+
"Candidate multilib: sparcv8plus;@m32\n"
315+
"Selected multilib: .;@m64\n",
316+
S);
317+
}
318+
}
319+
171320
TEST(ToolChainTest, DefaultDriverMode) {
172321
IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
173322

0 commit comments

Comments
 (0)