DavidSpickett updated this revision to Diff 373854. DavidSpickett added a comment.
Added a test. I have not checked what adding an -mfloat-abi that doesn't match the ABI part of the triple does because then we'd need to modify the ABI part of the triple as well. Which might be the correct thing to do in the end but I'll wait and see what people think. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D110142/new/ https://reviews.llvm.org/D110142 Files: clang/include/clang/Driver/ToolChain.h clang/lib/Driver/Driver.cpp clang/lib/Driver/ToolChain.cpp clang/test/Driver/Inputs/arm_float_abi_runtime_path/lib/arm-pc-windows-msvc/.keep clang/test/Driver/Inputs/arm_float_abi_runtime_path/lib/arm-unknown-linux-gnueabi/.keep clang/test/Driver/Inputs/arm_float_abi_runtime_path/lib/armhf-unknown-linux-gnueabihf/.keep clang/test/Driver/arm-float-abi-runtime-path.c Index: clang/test/Driver/arm-float-abi-runtime-path.c =================================================================== --- /dev/null +++ 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{{$}} Index: clang/lib/Driver/ToolChain.cpp =================================================================== --- clang/lib/Driver/ToolChain.cpp +++ 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()); } Index: clang/lib/Driver/Driver.cpp =================================================================== --- clang/lib/Driver/Driver.cpp +++ 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 Index: clang/include/clang/Driver/ToolChain.h =================================================================== --- clang/include/clang/Driver/ToolChain.h +++ 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;
Index: clang/test/Driver/arm-float-abi-runtime-path.c =================================================================== --- /dev/null +++ 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{{$}} Index: clang/lib/Driver/ToolChain.cpp =================================================================== --- clang/lib/Driver/ToolChain.cpp +++ 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()); } Index: clang/lib/Driver/Driver.cpp =================================================================== --- clang/lib/Driver/Driver.cpp +++ 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 Index: clang/include/clang/Driver/ToolChain.h =================================================================== --- clang/include/clang/Driver/ToolChain.h +++ 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;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits