From a926da49b9cad0ac6473455fb5fb39fcf5d3f2f2 Mon Sep 17 00:00:00 2001 From: w00657280 Date: Sun, 27 Apr 2025 21:20:46 +0800 Subject: [PATCH] =?UTF-8?q?fix:llvm19=E7=BC=96=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: w00657280 --- clang/include/clang/Driver/Driver.h | 13 +++++ clang/lib/Driver/ToolChains/Gnu.cpp | 4 +- clang/lib/Driver/ToolChains/Linux.cpp | 9 +++- clang/lib/Driver/ToolChains/OHOS.cpp | 6 +-- .../lib/sanitizer_common/sanitizer_errno.h | 2 +- llvm-build/build.py | 48 ++++++++++++++++--- 6 files changed, 69 insertions(+), 13 deletions(-) diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h index 04b46782467d..1e28fd0974c3 100644 --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -160,6 +160,9 @@ public: /// Target and driver mode components extracted from clang executable name. ParsedClangName ClangNameParts; + /// The path to the installed clang directory, if any. + std::string InstalledDir; + /// The path to the compiler resource directory. std::string ResourceDir; @@ -424,6 +427,16 @@ public: return ClangExecutable.c_str(); } + + /// Get the path to where the clang executable was installed. + const char *getInstalledDir() const { + if (!InstalledDir.empty()) + return InstalledDir.c_str(); + return Dir.c_str(); + } + void setInstalledDir(StringRef Value) { InstalledDir = std::string(Value); } + + bool isSaveTempsEnabled() const { return SaveTemps != SaveTempsNone; } bool isSaveTempsObj() const { return SaveTemps == SaveTempsObj; } diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp index 5e9a655eaf82..f16575070152 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -3055,7 +3055,9 @@ Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D, Triple, Args), RocmInstallation(D, Triple, Args) { - getProgramPaths().push_back(getDriver().Dir); + getProgramPaths().push_back(getDriver().getInstalledDir()); + if (getDriver().getInstalledDir() != getDriver().Dir) + getProgramPaths().push_back(getDriver().Dir); } Generic_GCC::~Generic_GCC() {} diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp index 35bf39069605..8bfacc603a46 100644 --- a/clang/lib/Driver/ToolChains/Linux.cpp +++ b/clang/lib/Driver/ToolChains/Linux.cpp @@ -347,6 +347,13 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) Generic_GCC::AddMultiarchPaths(D, SysRoot, OSLibDir, Paths); + // The deprecated -DLLVM_ENABLE_PROJECTS=libcxx configuration installs + // libc++.so in D.Dir+"/../lib/". Detect this path. + // TODO Remove once LLVM_ENABLE_PROJECTS=libcxx is unsupported. + if (StringRef(D.Dir).starts_with(SysRoot) && + D.getVFS().exists(D.Dir + "/../lib/libc++.so")) + addPathIfExists(D, D.Dir + "/../lib", Paths); + addPathIfExists(D, concat(SysRoot, "/lib"), Paths); addPathIfExists(D, concat(SysRoot, "/usr/lib"), Paths); } @@ -388,7 +395,7 @@ std::string Linux::computeSysRoot() const { if (getTriple().isAndroid()) { // Android toolchains typically include a sysroot at ../sysroot relative to // the clang binary. - const StringRef ClangDir = getDriver().Dir; + const StringRef ClangDir = getDriver().getInstalledDir(); std::string AndroidSysRootPath = (ClangDir + "/../sysroot").str(); if (getVFS().exists(AndroidSysRootPath)) return AndroidSysRootPath; diff --git a/clang/lib/Driver/ToolChains/OHOS.cpp b/clang/lib/Driver/ToolChains/OHOS.cpp index 16dce34272d0..449ae8ed0df0 100644 --- a/clang/lib/Driver/ToolChains/OHOS.cpp +++ b/clang/lib/Driver/ToolChains/OHOS.cpp @@ -281,12 +281,12 @@ std::string OHOS::computeSysRoot() const { std::string SysRoot = !getDriver().SysRoot.empty() ? getDriver().SysRoot - : makePath({getDriver().Dir, "..", "..", "sysroot"}); - if (!llvm::sys::fs::exists(SysRoot)) + : makePath({getDriver().getInstalledDir(), "..", "..", "sysroot"}); + if (!getVFS().exists(SysRoot)) return std::string(); std::string ArchRoot = makePath({SysRoot, getMultiarchTriple(getTriple())}); - return llvm::sys::fs::exists(ArchRoot) ? ArchRoot : SysRoot; + return getVFS().exists(ArchRoot) ? ArchRoot : SysRoot; } ToolChain::path_list OHOS::getRuntimePaths() const { diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_errno.h b/compiler-rt/lib/sanitizer_common/sanitizer_errno.h index e85533c0fd8a..46c85364cef5 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_errno.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_errno.h @@ -23,7 +23,7 @@ #if SANITIZER_FREEBSD || SANITIZER_APPLE # define __errno_location __error -#elif SANITIZER_ANDROID || SANITIZER_NETBSD || SANITIZER_OHOS +#elif SANITIZER_ANDROID || SANITIZER_NETBSD # define __errno_location __errno #elif SANITIZER_SOLARIS # define __errno_location ___errno diff --git a/llvm-build/build.py b/llvm-build/build.py index 183c396f8d83..c29da65d887f 100755 --- a/llvm-build/build.py +++ b/llvm-build/build.py @@ -102,8 +102,11 @@ class BuildConfig(): self.MINGW_TRIPLE = 'x86_64-windows-gnu' self.build_libs_with_hb = self.build_libs_flags == 'OH' or self.build_libs_flags == 'BOTH' - self.ARCHIVE_EXTENSION = '.tar.' + self.compression_format - self.ARCHIVE_OPTION = '-c' + ('j' if self.compression_format == "bz2" else 'z') + #self.ARCHIVE_EXTENSION = '.tar.' + self.compression_format + #self.ARCHIVE_OPTION = '-c' + ('j' if self.compression_format == "bz2" else 'z') + self.ARCHIVE_EXTENSION = '.tar.gz' + self.ARCHIVE_OPTION = '-cvz' + self.LIBXML2_VERSION = None self.NCURSES_VERSION = None self.LIBEDIT_VERSION = None @@ -1703,6 +1706,8 @@ class LlvmLibs(BuildUtils): rt_cflags.append('-fstack-protector-strong') rt_cflags.append('-funwind-tables') rt_cflags.append('-fno-omit-frame-pointer') + if llvm_triple == 'aarch64-linux-ohos' or llvm_triple == 'aarch64-unknown-linux-ohos': + rt_cflags.append('-mbranch-protection=bti') rt_defines = defines.copy() rt_defines['OHOS'] = '1' @@ -1809,13 +1814,16 @@ class LlvmLibs(BuildUtils): suffix = '-' + multilib_suffix if multilib_suffix else '' crt_path = self.merge_out_path('lib', 'clangrt-%s%s' % (llvm_triple, suffix)) - crt_install = os.path.join(llvm_install, 'lib', 'clang', self.build_config.VERSION) + crt_install = os.path.join(llvm_install, 'lib', 'clang', '19') crt_extra_flags = [] if not self.build_config.target_debug: # Remove absolute paths from compiler-rt debug info emitted with -gline-tables-only crt_extra_flags = ['-ffile-prefix-map=%s=.' % self.build_config.REPOROOT_DIR] + if llvm_triple == 'aarch64-linux-ohos' or llvm_triple == 'aarch64-unknown-linux-ohos': + cflags.append('-mbranch-protection=bti') + crt_defines = defines.copy() crt_defines['CMAKE_EXE_LINKER_FLAGS'] = ' '.join(ldflags) crt_defines['CMAKE_SHARED_LINKER_FLAGS'] = ' '.join(ldflags) @@ -1992,7 +2000,7 @@ class LlvmLibs(BuildUtils): self.logger().info('Building lldb for %s', arch) lldb_path = self.merge_out_path('lib', 'lldb-server-%s' % llvm_triple) - crt_install = os.path.join(llvm_install, 'lib', 'clang', self.build_config.VERSION) + crt_install = os.path.join(llvm_install, 'lib', 'clang', '19') out_dir = os.path.join(lldb_path, 'bin') lldb_ldflags = list(ldflags) @@ -2464,6 +2472,26 @@ class LlvmPackage(BuildUtils): def __init__(self, build_config): super(LlvmPackage, self).__init__(build_config) + def move_libcxx(self, llvm_install, libcxx_install_dir): + src_aarch64_cxx_shared_dir = os.path.join(libcxx_install_dir, 'lib', 'aarch64-unknown-linux-ohos', 'libc++_shared.so') + src_aarch64_cxx_static_dir = os.path.join(libcxx_install_dir, 'lib', 'aarch64-unknown-linux-ohos', 'libc++_static.a') + src_x86_cxx_shared_dir = os.path.join(libcxx_install_dir, 'lib', 'x86_64-unknown-linux-ohos', 'libc++_shared.so') + src_x86_cxx_static_dir = os.path.join(libcxx_install_dir, 'lib', 'x86_64-unknown-linux-ohos', 'libc++_static.a') + + dst_aarch64_dir = os.path.join(llvm_install, 'lib', 'aarch64-unknown-linux-ohos') + dst_x86_dir = os.path.join(llvm_install, 'lib', 'x86_64-unknown-linux-ohos') + if os.path.exists(src_aarch64_cxx_shared_dir) and os.path.exists(dst_aarch64_dir): + shutil.copy2(src_aarch64_cxx_shared_dir, dst_aarch64_dir) + + if os.path.exists(src_aarch64_cxx_static_dir) and os.path.exists(dst_aarch64_dir): + shutil.copy2(src_aarch64_cxx_static_dir, dst_aarch64_dir) + + if os.path.exists(src_x86_cxx_shared_dir) and os.path.exists(dst_x86_dir): + shutil.copy2(src_x86_cxx_shared_dir, dst_x86_dir) + + if os.path.exists(src_x86_cxx_static_dir) and os.path.exists(dst_x86_dir): + shutil.copy2(src_x86_cxx_static_dir, dst_x86_dir) + def copy_lldb_tools_to_llvm_install(self, tools, lldb_path, crt_install, llvm_triple): dst_dir = os.path.join(crt_install, 'bin', llvm_triple) self.check_create_dir(dst_dir) @@ -2487,7 +2515,8 @@ class LlvmPackage(BuildUtils): #Package libcxx-ndk for host in hosts_list: - tarball_name = 'libcxx-ndk-%s-%s' % (self.build_config.build_name, host) + #tarball_name = 'libcxx-ndk-%s-%s' % (self.build_config.build_name, host) + tarball_name = 'libcxx-ndk-%s' % (host) package_path = '%s%s' % (self.merge_packages_path(tarball_name), self.build_config.ARCHIVE_EXTENSION) self.logger().info('Packaging %s', package_path) args = ['tar', self.build_config.ARCHIVE_OPTION, '-h', '-C', self.build_config.OUT_PATH, '-f', package_path, 'libcxx-ndk'] @@ -2812,7 +2841,8 @@ class LlvmPackage(BuildUtils): # Package ohos NDK if os.path.exists(self.merge_out_path('sysroot')): - tarball_ndk_name = 'ohos-sysroot-%s' % self.build_config.build_name + #tarball_ndk_name = 'ohos-sysroot-%s' % self.build_config.build_name + tarball_ndk_name = 'ohos-sysroot' package_ndk_path = '%s%s' % (self.merge_packages_path(tarball_ndk_name), self.build_config.ARCHIVE_EXTENSION) self.logger().info('Packaging %s', package_ndk_path) args = ['tar', self.build_config.ARCHIVE_OPTION, '-h', '-C', self.build_config.OUT_PATH, '-f', package_ndk_path, 'sysroot'] @@ -2973,7 +3003,8 @@ class LlvmPackage(BuildUtils): def package_operation(self, build_dir, host): self.logger().info('Packaging for other environments.') - package_name = 'clang-%s' % self.build_config.build_name + #package_name = 'clang-%s' % self.build_config.build_name + package_name = 'llvm' self.set_clang_version(build_dir) if host.startswith('windows'): @@ -3089,6 +3120,7 @@ def main(): not build_config.build_only and ('windows' not in args.no_build) llvm_install = build_utils.merge_out_path('llvm-install') + libcxx_ndk_install = build_utils.merge_out_path('libcxx-ndk') llvm_make = build_utils.merge_out_path('llvm_make') windows64_install = build_utils.merge_out_path('windows-x86_64-install') llvm_path = llvm_install if not build_config.build_only else \ @@ -3253,6 +3285,8 @@ def main(): if build_config.build_gtest_libs: llvm_libs.build_gtest(llvm_path, llvm_install) + llvm_package.move_libcxx(llvm_install, libcxx_ndk_install) + if build_config.do_package: if build_utils.host_is_linux(): llvm_package.package_libcxx() -- Gitee