]> granicus.if.org Git - clang/commitdiff
Put target deduced from executable name at the start of argument list
authorSerge Pavlov <sepavloff@gmail.com>
Wed, 20 Sep 2017 15:22:27 +0000 (15:22 +0000)
committerSerge Pavlov <sepavloff@gmail.com>
Wed, 20 Sep 2017 15:22:27 +0000 (15:22 +0000)
When clang is called as 'target-clang', put deduced target option at
the start of argument list so that option '--target=' specified in command
line could override it.

This change fixes PR34671.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@313760 91177308-0d34-0410-b5e6-96231b3b80d8

test/Driver/target-override.c [new file with mode: 0644]
tools/driver/driver.cpp

diff --git a/test/Driver/target-override.c b/test/Driver/target-override.c
new file mode 100644 (file)
index 0000000..49ca90f
--- /dev/null
@@ -0,0 +1,16 @@
+// REQUIRES: shell
+// REQUIRES: x86-registered-target
+
+// RUN: mkdir -p %T/testbin
+// RUN: [ ! -s %T/testbin/i386-clang ] || rm %T/testbin/i386-clang
+// RUN: ln -s %clang %T/testbin/i386-clang
+
+// Check if invocation of "foo-clang" adds option "-target foo".
+//
+// RUN: %T/testbin/i386-clang -c -no-canonical-prefixes %s -### 2>&1 | FileCheck -check-prefix CHECK-TG1 %s
+// CHECK-TG1: Target: i386
+
+// Check if invocation of "foo-clang -target bar" overrides option "-target foo".
+//
+// RUN: %T/testbin/i386-clang -c -no-canonical-prefixes -target x86_64 %s -### 2>&1 | FileCheck -check-prefix CHECK-TG2 %s
+// CHECK-TG2: Target: x86_64
index e1461f112b143b628ecc2fd4fe1c7aca73f8506d..fa757da9535c20fbc63a4a814643caedb87e9fed 100644 (file)
@@ -209,16 +209,23 @@ extern int cc1as_main(ArrayRef<const char *> Argv, const char *Argv0,
 static void insertTargetAndModeArgs(const ParsedClangName &NameParts,
                                     SmallVectorImpl<const char *> &ArgVector,
                                     std::set<std::string> &SavedStrings) {
+  // Put target and mode arguments at the start of argument list so that
+  // arguments specified in command line could override them. Avoid putting
+  // them at index 0, as an option like '-cc1' must remain the first.
+  auto InsertionPoint = ArgVector.begin();
+  if (InsertionPoint != ArgVector.end())
+    ++InsertionPoint;
+
   if (NameParts.DriverMode) {
     // Add the mode flag to the arguments.
-    ArgVector.insert(ArgVector.end(),
+    ArgVector.insert(InsertionPoint,
                      GetStableCStr(SavedStrings, NameParts.DriverMode));
   }
 
   if (NameParts.TargetIsValid) {
     const char *arr[] = {"-target", GetStableCStr(SavedStrings,
                                                   NameParts.TargetPrefix)};
-    ArgVector.insert(ArgVector.end(), std::begin(arr), std::end(arr));
+    ArgVector.insert(InsertionPoint, std::begin(arr), std::end(arr));
   }
 }