diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -446,7 +446,7 @@ FileType Type = ToolChain::FT_Static) const; // Returns target specific runtime path if it exists. - virtual std::string getRuntimePath() const; + virtual std::string getRuntimePath(const llvm::opt::ArgList &Args) const; // Returns target specific standard library path if it exists. virtual std::string getStdlibPath() const; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1830,7 +1830,7 @@ } if (C.getArgs().hasArg(options::OPT_print_runtime_dir)) { - std::string CandidateRuntimePath = TC.getRuntimePath(); + std::string CandidateRuntimePath = TC.getRuntimePath(C.getArgs()); if (getVFS().exists(CandidateRuntimePath)) llvm::outs() << CandidateRuntimePath << '\n'; else diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -75,7 +75,7 @@ const ArgList &Args) : D(D), Triple(T), Args(Args), CachedRTTIArg(GetRTTIArgument(Args)), CachedRTTIMode(CalculateRTTIMode(Args, Triple, CachedRTTIArg)) { - std::string RuntimePath = getRuntimePath(); + std::string RuntimePath = getRuntimePath(Args); if (getVFS().exists(RuntimePath)) getLibraryPaths().push_back(RuntimePath); @@ -487,9 +487,13 @@ return Args.MakeArgString(getCompilerRT(Args, Component, Type)); } -std::string ToolChain::getRuntimePath() const { +std::string ToolChain::getRuntimePath(const llvm::opt::ArgList &Args) const { + llvm::Triple triple = getTriple(); + RegisterEffectiveTriple TripleRAII(*this, triple); + auto arch_name = getArchNameForCompilerRTLib(*this, Args); + triple.setArchName(arch_name); SmallString<128> P(D.ResourceDir); - llvm::sys::path::append(P, "lib", getTripleString()); + llvm::sys::path::append(P, "lib", triple.getTriple()); return std::string(P.str()); } diff --git a/clang/test/Driver/Inputs/arm_float_abi_runtime_path/lib/arm-pc-windows-msvc/.keep b/clang/test/Driver/Inputs/arm_float_abi_runtime_path/lib/arm-pc-windows-msvc/.keep new file mode 100644 diff --git a/clang/test/Driver/Inputs/arm_float_abi_runtime_path/lib/arm-unknown-linux-gnueabi/.keep b/clang/test/Driver/Inputs/arm_float_abi_runtime_path/lib/arm-unknown-linux-gnueabi/.keep new file mode 100644 diff --git a/clang/test/Driver/Inputs/arm_float_abi_runtime_path/lib/armhf-unknown-linux-gnueabihf/.keep b/clang/test/Driver/Inputs/arm_float_abi_runtime_path/lib/armhf-unknown-linux-gnueabihf/.keep new file mode 100644 diff --git a/clang/test/Driver/arm-float-abi-runtime-path.c b/clang/test/Driver/arm-float-abi-runtime-path.c new file mode 100644 --- /dev/null +++ b/clang/test/Driver/arm-float-abi-runtime-path.c @@ -0,0 +1,25 @@ +// REQUIRES: arm-registered-target + +// RUN: %clang %s -target armv8l-unknown-linux-gnueabihf -print-runtime-dir \ +// RUN: -resource-dir=%S/Inputs/arm_float_abi_runtime_path 2>&1 | FileCheck -check-prefix=ARMHF %s +// RUN: %clang %s -target arm-unknown-linux-gnueabihf -print-runtime-dir \ +// RUN: -resource-dir=%S/Inputs/arm_float_abi_runtime_path 2>&1 | FileCheck -check-prefix=ARMHF %s +// RUN: %clang %s -target armv7-unknown-linux-gnueabihf -print-runtime-dir \ +// RUN: -resource-dir=%S/Inputs/arm_float_abi_runtime_path 2>&1 | FileCheck -check-prefix=ARMHF %s + +// RUN: %clang %s -target armv8l-unknown-linux-gnueabi -print-runtime-dir \ +// RUN: -resource-dir=%S/Inputs/arm_float_abi_runtime_path 2>&1 | FileCheck -check-prefix=ARM %s +// RUN: %clang %s -target arm-unknown-linux-gnueabi -print-runtime-dir \ +// RUN: -resource-dir=%S/Inputs/arm_float_abi_runtime_path 2>&1 | FileCheck -check-prefix=ARM %s +// RUN: %clang %s -target armv7-unknown-linux-gnueabi -print-runtime-dir \ +// RUN: -resource-dir=%S/Inputs/arm_float_abi_runtime_path 2>&1 | FileCheck -check-prefix=ARM %s + +// RUN: %clang %s -target arm-pc-windows-msvc -print-runtime-dir \ +// RUN: -resource-dir=%S/Inputs/arm_float_abi_runtime_path 2>&1 | FileCheck -check-prefix=WINDOWS %s +/// armhf-pc... isn't recognised so just check that the float-abi option is ignored +// RUN: %clang %s -target arm-pc-windows-msvc -mfloat-abi=hard -print-runtime-dir \ +// RUN: -resource-dir=%S/Inputs/arm_float_abi_runtime_path 2>&1 | FileCheck -check-prefix=WINDOWS %s + +// ARMHF: lib{{/|\\}}armhf-unknown-linux-gnueabihf{{$}} +// ARM: lib{{/|\\}}arm-unknown-linux-gnueabi{{$}} +// WINDOWS: lib{{/|\\}}arm-pc-windows-msvc{{$}}