[clang] 0d7eba1 - [Driver] Allow target override containing . in executable name

Fangrui Song via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 26 16:52:37 PDT 2022


Author: Dan McGregor
Date: 2022-10-26T16:52:32-07:00
New Revision: 0d7eba1aeed853798bd8012f786c305e83a97b67

URL: https://github.com/llvm/llvm-project/commit/0d7eba1aeed853798bd8012f786c305e83a97b67
DIFF: https://github.com/llvm/llvm-project/commit/0d7eba1aeed853798bd8012f786c305e83a97b67.diff

LOG: [Driver] Allow target override containing . in executable name

The gcc compatible driver has support for overriding the default
target based on the driver's executable name, for instance
x86_64-pc-linux-gnu-clang will set the default target to
x86_64-pc-linux-gnu.

Previously, this failed when the target contained a minor version, for
example x86_64-pc-freebsd13.1, so instead of finding the file's
stem, use the whole file name, but strip off any '.exe' from the tail.

Reviewed By: MaskRay

Differential Revision: https://reviews.llvm.org/D135284

Added: 
    

Modified: 
    clang/lib/Driver/ToolChain.cpp
    clang/test/Driver/target-override.c

Removed: 
    


################################################################################
diff  --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index f060b2d460eab..695741f73dcc9 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -198,7 +198,7 @@ static const DriverSuffix *FindDriverSuffix(StringRef ProgName, size_t &Pos) {
 /// Normalize the program name from argv[0] by stripping the file extension if
 /// present and lower-casing the string on Windows.
 static std::string normalizeProgramName(llvm::StringRef Argv0) {
-  std::string ProgName = std::string(llvm::sys::path::stem(Argv0));
+  std::string ProgName = std::string(llvm::sys::path::filename(Argv0));
   if (is_style_windows(llvm::sys::path::Style::native)) {
     // Transform to lowercase for case insensitive file systems.
     std::transform(ProgName.begin(), ProgName.end(), ProgName.begin(),
@@ -217,6 +217,13 @@ static const DriverSuffix *parseDriverSuffix(StringRef ProgName, size_t &Pos) {
   // added via -target as implicit first argument.
   const DriverSuffix *DS = FindDriverSuffix(ProgName, Pos);
 
+  if (!DS && ProgName.endswith(".exe")) {
+    // Try again after stripping the executable suffix:
+    // clang++.exe -> clang++
+    ProgName = ProgName.drop_back(StringRef(".exe").size());
+    DS = FindDriverSuffix(ProgName, Pos);
+  }
+
   if (!DS) {
     // Try again after stripping any trailing version number:
     // clang++3.5 -> clang++

diff  --git a/clang/test/Driver/target-override.c b/clang/test/Driver/target-override.c
index aef89cc9a9dd2..2c605ac9a03da 100644
--- a/clang/test/Driver/target-override.c
+++ b/clang/test/Driver/target-override.c
@@ -3,6 +3,7 @@
 
 // RUN: rm -rf %t && mkdir %t
 // RUN: ln -s %clang %t/i386-clang
+// RUN: ln -s %clang %t/x86_64-pc-freebsd13.1-clang
 
 // Check if invocation of "foo-clang" adds option "-target foo".
 //
@@ -13,3 +14,7 @@
 //
 // RUN: %t/i386-clang -c --target=x86_64 -### %s 2>&1 | FileCheck -check-prefix CHECK-TG2 %s
 // CHECK-TG2: Target: x86_64
+
+/// Check if invocation of "arch-vendor-osX.Y-clang" adds option "-target arch-vendor-osX.Y".
+// RUN: %t/x86_64-pc-freebsd13.1-clang -c -### %s 2>&1 | FileCheck -check-prefix CHECK-TG3 %s
+// CHECK-TG3: Target: x86_64-pc-freebsd13.1


        


More information about the cfe-commits mailing list