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

Reply via email to