[PATCH] D110142: [clang][Driver] Correct runtime path for Arm hard float targets

David Spickett via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 21 04:26:58 PDT 2021


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;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D110142.373854.patch
Type: text/x-patch
Size: 4230 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210921/bc5bcf03/attachment-0001.bin>


More information about the cfe-commits mailing list