qiucf created this revision. qiucf added reviewers: hubert.reinterpretcast, jsji, nemanjai, collinbaker, rpenacob. Herald added a project: All. qiucf requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
In some cases, we need to set alternative toolchain path other than the default with system (headers, libraries, dynamic linker prefix, `ld` path, etc.), but keep `sysroot` at the same time. This patch introduces a new option `--overlay-platform-toolchain` to set up such alternative toolchain path. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D121992 Files: clang/include/clang/Driver/Driver.h clang/include/clang/Driver/Options.td clang/lib/Driver/Driver.cpp clang/lib/Driver/ToolChains/Gnu.cpp clang/lib/Driver/ToolChains/Linux.cpp clang/test/Driver/Inputs/powerpc64le-linux-gnu-tree/gcc-11.2.0/include/.keep clang/test/Driver/Inputs/powerpc64le-linux-gnu-tree/gcc-11.2.0/lib64/.keep clang/test/Driver/gcc-toolchain.cpp
Index: clang/test/Driver/gcc-toolchain.cpp =================================================================== --- clang/test/Driver/gcc-toolchain.cpp +++ clang/test/Driver/gcc-toolchain.cpp @@ -37,3 +37,15 @@ // AARCH64: Inputs{{[^"]+}}aarch64-suse-linux/{{[^"]+}}crt1.o" // NO_AARCH64-NOT: Inputs{{[^"]+}}aarch64-suse-linux/{{[^"]+}}crt1.o" + +/// Test option to add 'overlay platform toolchain' +// RUN: %clangxx %s -### --target=powerpc64le-linux-gnu \ +// RUN: --overlay-platform-toolchain=%S/Inputs/powerpc64le-linux-gnu-tree/gcc-11.2.0 \ +// RUN: 2>&1 | FileCheck %s --check-prefix=OVERLAY + +// OVERLAY: "-internal-externc-isystem" +// OVERLAY: "[[TOOLCHAIN:[^"]+]]/powerpc64le-linux-gnu-tree/gcc-11.2.0/include" +// OVERLAY: "-dynamic-linker" +// OVERLAY: "[[TOOLCHAIN]]/powerpc64le-linux-gnu-tree/gcc-11.2.0/lib64/ld64.so.2" +// OVERLAY: "-L[[TOOLCHAIN]]/powerpc64le-linux-gnu-tree/gcc-11.2.0/lib/../lib64" +// OVERLAY: "-L[[TOOLCHAIN]]/powerpc64le-linux-gnu-tree/gcc-11.2.0/lib" Index: clang/lib/Driver/ToolChains/Linux.cpp =================================================================== --- clang/lib/Driver/ToolChains/Linux.cpp +++ clang/lib/Driver/ToolChains/Linux.cpp @@ -261,6 +261,16 @@ const std::string OSLibDir = std::string(getOSLibDir(Triple, Args)); const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot); + if (!D.OverlayToolChainPath.empty()) { + const std::string &ExtraPath = D.OverlayToolChainPath; + addPathIfExists(D, ExtraPath + "/lib/" + MultiarchTriple, Paths); + addPathIfExists(D, ExtraPath + "/lib/../" + OSLibDir, Paths); + addPathIfExists(D, ExtraPath + "/usr/lib/" + MultiarchTriple, Paths); + addPathIfExists(D, ExtraPath + "/usr/lib/../" + OSLibDir, Paths); + addPathIfExists(D, ExtraPath + "/lib", Paths); + addPathIfExists(D, ExtraPath + "/usr/lib", Paths); + } + // mips32: Debian multilib, we use /libo32, while in other case, /lib is // used. We need add both libo32 and /lib. if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel) { @@ -567,6 +577,10 @@ if (DriverArgs.hasArg(options::OPT_nostdlibinc)) return; + if (!D.OverlayToolChainPath.empty()) + addExternCSystemInclude(DriverArgs, CC1Args, + D.OverlayToolChainPath + "/include"); + // LOCAL_INCLUDE_DIR addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include"); // TOOL_INCLUDE_DIR Index: clang/lib/Driver/ToolChains/Gnu.cpp =================================================================== --- clang/lib/Driver/ToolChains/Gnu.cpp +++ clang/lib/Driver/ToolChains/Gnu.cpp @@ -1867,6 +1867,10 @@ if (A) return A->getValue(); + if (const Arg *X = Args.getLastArg( + clang::driver::options::OPT__overlay_platform_toolchain_EQ)) + return X->getValue(); + // If we have a SysRoot, ignore GCC_INSTALL_PREFIX. // GCC_INSTALL_PREFIX specifies the gcc installation for the default // sysroot and is likely not valid with a different sysroot. Index: clang/lib/Driver/Driver.cpp =================================================================== --- clang/lib/Driver/Driver.cpp +++ clang/lib/Driver/Driver.cpp @@ -1208,6 +1208,11 @@ CompilerPath = Split.second; } } + if (const Arg *A = + Args.getLastArg(options::OPT__overlay_platform_toolchain_EQ)) { + OverlayToolChainPath = A->getValue(); + DyldPrefix = A->getValue(); + } if (const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) SysRoot = A->getValue(); if (const Arg *A = Args.getLastArg(options::OPT__dyld_prefix_EQ)) Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -4178,6 +4178,8 @@ def _output_class_directory : Separate<["--"], "output-class-directory">, Alias<foutput_class_dir_EQ>; def _output_EQ : Joined<["--"], "output=">, Alias<o>; def _output : Separate<["--"], "output">, Alias<o>; +def _overlay_platform_toolchain_EQ : Joined<["--"], "overlay-platform-toolchain=">; +def _overlay_platform_toolchain : Separate<["--"], "overlay-platform-toolchain">, Alias<_overlay_platform_toolchain_EQ>; def _param : Separate<["--"], "param">, Group<CompileOnly_Group>; def _param_EQ : Joined<["--"], "param=">, Alias<_param>; def _precompile : Flag<["--"], "precompile">, Flags<[NoXarchOption]>, Index: clang/include/clang/Driver/Driver.h =================================================================== --- clang/include/clang/Driver/Driver.h +++ clang/include/clang/Driver/Driver.h @@ -149,6 +149,9 @@ typedef SmallVector<std::string, 4> prefix_list; prefix_list PrefixDirs; + /// Alternative toolchain path in prior to sysroot. + std::string OverlayToolChainPath; + /// sysroot, if present std::string SysRoot;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits