MaskRay updated this revision to Diff 378040.
MaskRay added a comment.
Herald added a subscriber: abrachet.
Hard-code Fuchsia to use normalized triple
fuchsia.c uses --target=x86_64-fuchsia but expects to find
x86_64-unknown-fuchsia path.
Linux should respect --target= and do no normalization.
---
Debian/Ubuntu are currently in an unfortunate case, and I think the patch is
needed to fix it.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D110663/new/
https://reviews.llvm.org/D110663
Files:
clang/lib/Driver/Driver.cpp
clang/lib/Driver/ToolChain.cpp
clang/lib/Driver/ToolChains/Gnu.cpp
clang/test/Driver/Inputs/debian_per_target_tree/usr/lib/llvm-14/lib/x86_64-linux-gnu/.keep
clang/test/Driver/linux-cross.cpp
Index: clang/test/Driver/linux-cross.cpp
===================================================================
--- clang/test/Driver/linux-cross.cpp
+++ clang/test/Driver/linux-cross.cpp
@@ -152,19 +152,20 @@
// DEBIAN_AARCH64-SAME: {{^}} "-L[[SYSROOT]]/usr/lib"
/// Test native x86-64 with -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=on.
-/// FIXME -internal-isystem .*bin/../include/x86_64-linux-gnu/c++/v1 and -L[[PREFIX]]/bin/../lib/x86_64-linux-gnu are missing.
// RUN: %clang -### %s --target=x86_64-linux-gnu --sysroot=%S/Inputs/debian_multiarch_tree \
// RUN: -ccc-install-dir %S/Inputs/debian_per_target_tree/usr/lib/llvm-14/bin -resource-dir=%S/Inputs/debian_per_target_tree/usr/lib/llvm-14/lib/clang/14.0.0 \
// RUN: --stdlib=libc++ --rtlib=compiler-rt 2>&1 | FileCheck %s --check-prefix=DEBIAN_X86_64_PER_TARGET
// DEBIAN_X86_64_PER_TARGET: "-resource-dir" "[[RESOURCE:[^"]+]]"
// DEBIAN_X86_64_PER_TARGET: "-internal-isystem"
-// DEBIAN_X86_64_PER_TARGET-SAME: {{^}} "[[PREFIX:[^"]+llvm-14]]/bin/../include/c++/v1"
+// DEBIAN_X86_64_PER_TARGET-SAME: {{^}} "[[PREFIX:[^"]+llvm-14]]/bin/../include/x86_64-linux-gnu/c++/v1"
+// DEBIAN_X86_64_PER_TARGET-SAME: {{^}} "-internal-isystem" "[[PREFIX]]/bin/../include/c++/v1"
// DEBIAN_X86_64_PER_TARGET-SAME: {{^}} "-internal-isystem" "[[RESOURCE]]/include"
// DEBIAN_X86_64_PER_TARGET-SAME: {{^}} "-internal-isystem" "[[SYSROOT:[^"]+]]/usr/local/include"
// DEBIAN_X86_64_PER_TARGET-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/lib/gcc/x86_64-linux-gnu/10/../../../../x86_64-linux-gnu/include"
// DEBIAN_X86_64_PER_TARGET: "-L
-// DEBIAN_X86_64_PER_TARGET-SAME: {{^}}[[SYSROOT]]/usr/lib/gcc/x86_64-linux-gnu/10"
+// DEBIAN_X86_64_PER_TARGET-SAME: {{^}}[[PREFIX]]/bin/../lib/x86_64-linux-gnu"
+// DEBIAN_X86_64_PER_TARGET-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/gcc/x86_64-linux-gnu/10"
/// Debian patches MULTILIB_OSDIRNAMES (../lib64 -> ../lib), so gcc uses 'lib' instead of 'lib64'.
/// This difference does not matter in practice.
// DEBIAN_X86_64_PER_TARGET-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/gcc/x86_64-linux-gnu/10/../../../../lib64"
@@ -177,21 +178,23 @@
/// $sysroot/lib and $sysroot/usr/lib. Fallback when GCC installation is unavailable.
// DEBIAN_X86_64_PER_TARGET-SAME: {{^}} "-L[[SYSROOT]]/lib"
// DEBIAN_X86_64_PER_TARGET-SAME: {{^}} "-L[[SYSROOT]]/usr/lib"
+// DEBIAN_X86_64_PER_TARGET-SAME: "[[RESOURCE]]/lib/x86_64-linux-gnu/libclang_rt.builtins.a"
/// Test -m32.
-/// FIXME -internal-isystem .*bin/../include/i386-linux-gnu/c++/v1 and -L[[PREFIX]]/bin/../lib/i386-linux-gnu are missing.
// RUN: %clang -### %s --target=x86_64-linux-gnu -m32 --sysroot=%S/Inputs/debian_multiarch_tree \
// RUN: -ccc-install-dir %S/Inputs/debian_per_target_tree/usr/lib/llvm-14/bin -resource-dir=%S/Inputs/debian_per_target_tree/usr/lib/llvm-14/lib/clang/14.0.0 \
// RUN: --stdlib=libc++ --rtlib=compiler-rt 2>&1 | FileCheck %s --check-prefix=DEBIAN_X86_64_M32_PER_TARGET
// DEBIAN_X86_64_M32_PER_TARGET: "-resource-dir" "[[RESOURCE:[^"]+]]"
// DEBIAN_X86_64_M32_PER_TARGET: "-internal-isystem"
-// DEBIAN_X86_64_M32_PER_TARGET-SAME: {{^}} "[[PREFIX:[^"]+llvm-14]]/bin/../include/c++/v1"
+// DEBIAN_X86_64_M32_PER_TARGET-SAME: {{^}} "[[PREFIX:[^"]+llvm-14]]/bin/../include/i386-linux-gnu/c++/v1"
+// DEBIAN_X86_64_M32_PER_TARGET-SAME: {{^}} "-internal-isystem" "[[PREFIX]]/bin/../include/c++/v1"
// DEBIAN_X86_64_M32_PER_TARGET-SAME: {{^}} "-internal-isystem" "[[RESOURCE]]/include"
// DEBIAN_X86_64_M32_PER_TARGET-SAME: {{^}} "-internal-isystem" "[[SYSROOT:[^"]+]]/usr/local/include"
// DEBIAN_X86_64_M32_PER_TARGET-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/lib/gcc/x86_64-linux-gnu/10/../../../../x86_64-linux-gnu/include"
// DEBIAN_X86_64_M32_PER_TARGET: "-L
-// DEBIAN_X86_64_M32_PER_TARGET-SAME: {{^}}[[SYSROOT]]/usr/lib/gcc/x86_64-linux-gnu/10/32"
+// DEBIAN_X86_64_M32_PER_TARGET-SAME: {{^}}[[PREFIX]]/bin/../lib/i386-linux-gnu"
+// DEBIAN_X86_64_M32_PER_TARGET-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/gcc/x86_64-linux-gnu/10/32"
// DEBIAN_X86_64_M32_PER_TARGET-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/gcc/x86_64-linux-gnu/10/../../../../lib32"
// DEBIAN_X86_64_M32_PER_TARGET-SAME: {{^}} "-L[[SYSROOT]]/lib/i386-linux-gnu"
// DEBIAN_X86_64_M32_PER_TARGET-SAME: {{^}} "-L[[SYSROOT]]/lib/../lib32"
@@ -199,6 +202,7 @@
// DEBIAN_X86_64_M32_PER_TARGET-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/../lib32"
// DEBIAN_X86_64_M32_PER_TARGET-SAME: {{^}} "-L[[SYSROOT]]/lib"
// DEBIAN_X86_64_M32_PER_TARGET-SAME: {{^}} "-L[[SYSROOT]]/usr/lib"
+// DEBIAN_X86_64_M32_PER_TARGET-SAME: "[[RESOURCE]]/lib/i386-linux-gnu/libclang_rt.builtins.a"
/// LDSO_ARCH is i386 for all x86-32 variants.
// RUN: %clang -### %s --target=i686-linux-musl --sysroot= \
Index: clang/lib/Driver/ToolChains/Gnu.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Gnu.cpp
+++ clang/lib/Driver/ToolChains/Gnu.cpp
@@ -2910,7 +2910,8 @@
return false;
// First add the per-target include path if it exists.
- std::string TargetDir = Path + "/" + Target + "/c++/" + Version;
+ std::string TargetDir =
+ Path + "/" + D.getTargetTriple() + "/c++/" + Version;
if (D.getVFS().exists(TargetDir))
addSystemInclude(DriverArgs, CC1Args, TargetDir);
Index: clang/lib/Driver/ToolChain.cpp
===================================================================
--- clang/lib/Driver/ToolChain.cpp
+++ clang/lib/Driver/ToolChain.cpp
@@ -488,15 +488,20 @@
}
std::string ToolChain::getRuntimePath() const {
- SmallString<128> P(D.ResourceDir);
- llvm::sys::path::append(P, "lib", getTripleString());
- return std::string(P.str());
+ // Use unnormalized D.getTargetTriple() (from --target= or
+ // LLVM_DEFAULT_TARGET_TRIPLE, with a small set of Clang specific multilib
+ // transformation).
+ // This is essential when LLVM_DEFAULT_TARGET_TRIPLE uses Debian multiarch
+ // style "x86_64-linux-gnu" (no vendor part).
+ SmallString<128> P;
+ llvm::sys::path::append(P, D.ResourceDir, "lib", D.getTargetTriple());
+ return std::string(P);
}
std::string ToolChain::getStdlibPath() const {
- SmallString<128> P(D.Dir);
- llvm::sys::path::append(P, "..", "lib", getTripleString());
- return std::string(P.str());
+ SmallString<128> P;
+ llvm::sys::path::append(P, D.Dir, "..", "lib", D.getTargetTriple());
+ return std::string(P);
}
std::string ToolChain::getArchSpecificLibPath() const {
Index: clang/lib/Driver/Driver.cpp
===================================================================
--- clang/lib/Driver/Driver.cpp
+++ clang/lib/Driver/Driver.cpp
@@ -423,15 +423,15 @@
///
/// This routine provides the logic to compute a target triple from various
/// args passed to the driver and the default triple string.
-static llvm::Triple computeTargetTriple(const Driver &D,
- StringRef TargetTriple,
- const ArgList &Args,
- StringRef DarwinArchName = "") {
+static llvm::Triple computeTargetTriple(
+ const Driver &D, StringRef TargetTriple, const ArgList &Args,
+ llvm::Triple *UnnormalizedTriple = nullptr, StringRef DarwinArchName = "") {
// FIXME: Already done in Compilation *Driver::BuildCompilation
if (const Arg *A = Args.getLastArg(options::OPT_target))
TargetTriple = A->getValue();
llvm::Triple Target(llvm::Triple::normalize(TargetTriple));
+ llvm::Triple Unnormalized(TargetTriple);
// GNU/Hurd's triples should have been -hurd-gnu*, but were historically made
// -gnu* only, and we can not change this, so we have to detect that case as
@@ -495,6 +495,14 @@
}
}
+ // llvm-project's runtime libraries support a small subset of GCC multilib
+ // combinations, currently just -m32/-m64. Transform the unnormalized triple
+ // to construct include and library paths.
+ auto SetArch = [&](llvm::Triple::ArchType Type) {
+ Target.setArch(Type);
+ Unnormalized.setArch(Type);
+ };
+
// Handle pseudo-target flags '-m64', '-mx32', '-m32' and '-m16'.
Arg *A = Args.getLastArg(options::OPT_m64, options::OPT_mx32,
options::OPT_m32, options::OPT_m16);
@@ -527,7 +535,7 @@
}
if (AT != llvm::Triple::UnknownArch && AT != Target.getArch())
- Target.setArch(AT);
+ SetArch(AT);
}
// Handle -miamcu flag.
@@ -583,6 +591,9 @@
Target.setArch(llvm::Triple::riscv64);
}
+ if (UnnormalizedTriple)
+ *UnnormalizedTriple = Unnormalized;
+
return Target;
}
@@ -1183,9 +1194,18 @@
// Perform the default argument translations.
DerivedArgList *TranslatedArgs = TranslateInputArgs(*UArgs);
+ // Unnormalized is --target= or LLVM_DEFAULT_TARGET_TRIPLE, with a small set
+ // of Clang specific multilib transformation.
+ llvm::Triple Unnormalized;
+ const llvm::Triple Normalized =
+ computeTargetTriple(*this, TargetTriple, *UArgs, &Unnormalized);
+ // Fuchsia prefers to use normalized triples.
+ if (Normalized.isOSFuchsia())
+ TargetTriple = Normalized.str();
+ else
+ TargetTriple = Unnormalized.str();
// Owned by the host.
- const ToolChain &TC = getToolChain(
- *UArgs, computeTargetTriple(*this, TargetTriple, *UArgs));
+ const ToolChain &TC = getToolChain(*UArgs, Normalized);
// The compilation takes ownership of Args.
Compilation *C = new Compilation(*this, TC, UArgs.release(), TranslatedArgs,
@@ -4629,8 +4649,8 @@
if (!ArchName.empty())
TC = &getToolChain(C.getArgs(),
- computeTargetTriple(*this, TargetTriple,
- C.getArgs(), ArchName));
+ computeTargetTriple(*this, TargetTriple, C.getArgs(),
+ nullptr, ArchName));
else
TC = &C.getDefaultToolChain();
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits