From 0427b4e815f6cdcc0ba24691807c211305c8f3c5 Mon Sep 17 00:00:00 2001 From: Jun Yuan Tan Date: Tue, 9 Nov 2021 10:33:07 +0800 Subject: [PATCH 17/34] clang: Fix resource dir location for cross toolchains When clang looks for the resources directory, it does so based on the binary location and assumes that the containing directory is a sibling to lib. The Yocto cross.bbclass defines the default bindir as ${exec_prefix}/bin/${CROSS_TARGET_SYS_DIR}. ex: /usr/bin/aarch64-poky-linux/. This causes clang to form a path that looks like /usr/bin/lib/clang/... As a fix for this, check the parent directory name. If that is "bin", then use that directory's parent. Rebased to LLVM 14.0.0 by Jun Yuan Tan Signed-off-by: Jim Broadus Signed-off-by: Khem Raj Signed-off-by: Jun Yuan Tan --- clang/lib/Driver/Driver.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index b2fb21b7052a..7e8c64a62f7e 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -122,7 +122,13 @@ std::string Driver::GetResourcesPath(StringRef BinaryPath, // With a static-library build of libclang, LibClangPath will contain the // path of the embedding binary, which for LLVM binaries will be in bin/. // ../lib gets us to lib/ in both cases. - P = llvm::sys::path::parent_path(Dir); + Dir = std::string(llvm::sys::path::parent_path(Dir)); + + // OE cross toolchains are installed, by default, in a subdir of bin. + if (llvm::sys::path::filename(Dir) == "bin") { + Dir = std::string(llvm::sys::path::parent_path(Dir)); + } + P = Dir; llvm::sys::path::append(P, Twine("lib") + CLANG_LIBDIR_SUFFIX, "clang", CLANG_VERSION_STRING); } -- 2.33.1