From 515de929ba778d5d3b47448647ce5d33f873ea6d Mon Sep 17 00:00:00 2001 From: Jun Yuan Tan Date: Tue, 9 Nov 2021 11:10:42 +0800 Subject: [PATCH 34/34] clang: Fix how driver finds GCC installation path on OpenEmbedded Fix how Clang Driver finds GCC installation path on OpenEmbedded - For RISCV (riscv{32,64}) we define new two multi-lib options without any subdirectories (e.g., lib32/ilp32d or lib64/lp64d). OpenEmbedded GCC builds don't use them. - Modify how Clang Driver finds GCC installation path. This is important because GCC files on OpenEmbedded are in two different directories: (1) /usr/bin/../lib/gcc/riscv64-oe-linux/9.2.0 (2) /usr/lib/riscv64-oe-linux/9.2.0 Clang Driver will check (1) first. The directory exist, but will produce no valid multi-libs and there will be no multi-lib selected. (2) contains actual GCC run-time objects/libraries, but because the path has exact same GCC version (9.2.0) it will be skipped. We modify the approach by allowing to check other directories with the same GCC version. We also avoid picking GCC installation path if it results in an empty multi-lib list. Rebased to LLVM 14.0.0 by Jun Yuan Tan Signed-off-by: David Abdurachmanov Signed-off-by: Khem Raj Signed-off-by: Jun Yuan Tan --- clang/lib/Driver/ToolChains/Gnu.cpp | 33 +++++++++++++++++++---------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp index fc65d92e8ea0..fc99318e757d 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -1652,18 +1652,29 @@ static void findRISCVMultilibs(const Driver &D, return findRISCVBareMetalMultilibs(D, TargetTriple, Path, Args, Result); FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS()); - Multilib Ilp32 = makeMultilib("lib32/ilp32").flag("+m32").flag("+mabi=ilp32"); - Multilib Ilp32f = + MultilibSet RISCVMultilibs; + + if (TargetTriple.getVendor() == llvm::Triple::OpenEmbedded) { + Multilib OpenEmbeddedIlp32d = makeMultilib("").flag("+m32").flag("+mabi=ilp32d"); + Multilib OpenEmbeddedLp64d = makeMultilib("").flag("+m64").flag("+mabi=lp64d"); + RISCVMultilibs = + MultilibSet() + .Either({OpenEmbeddedIlp32d, OpenEmbeddedLp64d}) + .FilterOut(NonExistent); + } else { + Multilib Ilp32 = makeMultilib("lib32/ilp32").flag("+m32").flag("+mabi=ilp32"); + Multilib Ilp32f = makeMultilib("lib32/ilp32f").flag("+m32").flag("+mabi=ilp32f"); - Multilib Ilp32d = + Multilib Ilp32d = makeMultilib("lib32/ilp32d").flag("+m32").flag("+mabi=ilp32d"); - Multilib Lp64 = makeMultilib("lib64/lp64").flag("+m64").flag("+mabi=lp64"); - Multilib Lp64f = makeMultilib("lib64/lp64f").flag("+m64").flag("+mabi=lp64f"); - Multilib Lp64d = makeMultilib("lib64/lp64d").flag("+m64").flag("+mabi=lp64d"); - MultilibSet RISCVMultilibs = - MultilibSet() - .Either({Ilp32, Ilp32f, Ilp32d, Lp64, Lp64f, Lp64d}) - .FilterOut(NonExistent); + Multilib Lp64 = makeMultilib("lib64/lp64").flag("+m64").flag("+mabi=lp64"); + Multilib Lp64f = makeMultilib("lib64/lp64f").flag("+m64").flag("+mabi=lp64f"); + Multilib Lp64d = makeMultilib("lib64/lp64d").flag("+m64").flag("+mabi=lp64d"); + RISCVMultilibs = + MultilibSet() + .Either({Ilp32, Ilp32f, Ilp32d, Lp64, Lp64f, Lp64d}) + .FilterOut(NonExistent); + } Multilib::flags_list Flags; bool IsRV64 = TargetTriple.getArch() == llvm::Triple::riscv64; @@ -2566,7 +2577,7 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple( continue; // Saw this path before; no need to look at it again. if (CandidateVersion.isOlderThan(4, 1, 1)) continue; - if (CandidateVersion <= Version) + if (CandidateVersion < Version) continue; if (!ScanGCCForMultilibs(TargetTriple, Args, LI->path(), -- 2.33.1