From b8dd608a9ca83b9c321dce3ca0d18e8aeea987af Mon Sep 17 00:00:00 2001 From: Changqing Li Date: Tue, 7 Dec 2021 04:08:22 +0000 Subject: [PATCH] Fix lib paths for OpenEmbedded Host Under OpenEmbedded Host, while building with clang-native, it cannot find the GCCInstallPath, which causing following error: [snip] compiler-rt-native/13.0.1-r0/recipe-sysroot-native/usr/bin/clang -target x86_64-linux -isystem/path/to/x86_64-linux/compiler-rt-native/13.0.1-r0/recipe-sysroot-native/usr/include -O2 -pipe /path/to/compiler-rt-native/13.0.1-r0/recipe-sysroot-native/usr/share/cmake-3.21/Modules/CMakeCCompilerABI.c` hosttools/ld: cannot find crtbeginS.o: No such file or directory [snip] Before this patch: compiler-rt-native/13.0.1-r0/recipe-sysroot-native/usr/bin/clang clang version 13.0.1 (https://github.com/llvm/llvm-project 08e3a5ccd952edee36b3c002e3a29c6b1b5153de) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /build/tmp-glibc/work/x86_64-linux/compiler-rt-native/13.0.1-r0/recipe-sysroot-native/usr/bin Found candidate GCC installation: /usr/lib/gcc/x86_64-wrs-linux/10.2.0 After this patch: compiler-rt-native/13.0.1-r0/recipe-sysroot-native/usr/bin/clang clang version 13.0.1 (https://github.com/llvm/llvm-project 08e3a5ccd952edee36b3c002e3a29c6b1b5153de) Thread model: posix InstalledDir: /build/tmp-glibc/work/x86_64-linux/compiler-rt-native/13.0.1-r0/recipe-sysroot-native/usr/bin Found candidate GCC installation: /usr/lib/gcc/x86_64-wrs-linux/10.2.0 Found candidate GCC installation: /usr/lib/x86_64-wrs-linux/10.2.0 Selected GCC installation: /usr/lib/x86_64-wrs-linux/10.2.0 Candidate multilib: .;@m64 Selected multilib: .;@m64 Summary: For OpenEmbedded Host, sysroots are of the form/usr/lib//x.y.z. Take x86-64 as example, the default triple is x86_64-unknown-linux-gnu. For clang-native, the target vendor is '-unknown', need to test current distro to follow above form. Upstream-Status: Inappropriate [oe specific] Signed-off-by: Changqing Li Signed-off-by: Khem Raj --- clang/lib/Driver/ToolChains/Gnu.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp index 77f5c3f58a8b..0ec2dadafc05 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -18,6 +18,7 @@ #include "Linux.h" #include "clang/Config/config.h" // for GCC_INSTALL_PREFIX #include "clang/Driver/Compilation.h" +#include "clang/Driver/Distro.h" #include "clang/Driver/Driver.h" #include "clang/Driver/DriverDiagnostic.h" #include "clang/Driver/Options.h" @@ -2682,6 +2683,7 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple( const llvm::Triple &TargetTriple, const ArgList &Args, const std::string &LibDir, StringRef CandidateTriple, bool NeedsBiarchSuffix, bool GCCDirExists, bool GCCCrossDirExists) { + Distro Distro(D.getVFS(), TargetTriple); // Locations relative to the system lib directory where GCC's triple-specific // directories might reside. struct GCCLibSuffix { @@ -2699,7 +2701,8 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple( // files in that location, not just GCC installation data. {CandidateTriple.str(), "..", TargetTriple.getVendor() == llvm::Triple::Freescale || - TargetTriple.getVendor() == llvm::Triple::OpenEmbedded}, + TargetTriple.getVendor() == llvm::Triple::OpenEmbedded || + Distro.IsOpenEmbedded()}, // This is the normal place. {"gcc/" + CandidateTriple.str(), "../..", GCCDirExists},