]> granicus.if.org Git - clang/commitdiff
One more follow-up to r179082 - parse PIC/PIE arguments even on platfroms that force...
authorAlexey Samsonov <samsonov@google.com>
Tue, 9 Apr 2013 12:28:19 +0000 (12:28 +0000)
committerAlexey Samsonov <samsonov@google.com>
Tue, 9 Apr 2013 12:28:19 +0000 (12:28 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@179092 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Driver/Tools.cpp
test/Driver/pic.c

index bf0528575003e7941052ddec4366cb8979e775fb..02ebc0448fed3d7dd0e25ef417f63a53717e6df9 100644 (file)
@@ -1996,22 +1996,23 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
   bool PIC = PIE || getToolChain().isPICDefault();
   bool IsPICLevelTwo = PIC;
 
+  // For the PIC and PIE flag options, this logic is different from the
+  // legacy logic in very old versions of GCC, as that logic was just
+  // a bug no one had ever fixed. This logic is both more rational and
+  // consistent with GCC's new logic now that the bugs are fixed. The last
+  // argument relating to either PIC or PIE wins, and no other argument is
+  // used. If the last argument is any flavor of the '-fno-...' arguments,
+  // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
+  // at the same level.
+  Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
+                                 options::OPT_fpic, options::OPT_fno_pic,
+                                 options::OPT_fPIE, options::OPT_fno_PIE,
+                                 options::OPT_fpie, options::OPT_fno_pie);
   // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
   // is forced, then neither PIC nor PIE flags will have no effect.
   if (!getToolChain().isPICDefaultForced()) {
-    // For the PIC and PIE flag options, this logic is different from the
-    // legacy logic in very old versions of GCC, as that logic was just
-    // a bug no one had ever fixed. This logic is both more rational and
-    // consistent with GCC's new logic now that the bugs are fixed. The last
-    // argument relating to either PIC or PIE wins, and no other argument is
-    // used. If the last argument is any flavor of the '-fno-...' arguments,
-    // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
-    // at the same level.
-    if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
-                                 options::OPT_fpic, options::OPT_fno_pic,
-                                 options::OPT_fPIE, options::OPT_fno_PIE,
-                                 options::OPT_fpie, options::OPT_fno_pie)) {
-      Option O = A->getOption();
+    if (LastPICArg) {
+      Option O = LastPICArg->getOption();
       if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
           O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
         PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
index 8ba931954b1d21d54e329bdfc9ce7ef0dc17e074..3faed2d18faf27cd2b6b9f694286f7abdf46889b 100644 (file)
@@ -36,6 +36,8 @@
 //
 // CHECK-NO-PIE-NOT: "-pie"
 //
+// CHECK-NO-UNUSED-ARG-NOT: argument unused during compilation
+//
 // RUN: %clang -c %s -target i386-unknown-unknown -### 2>&1 \
 // RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
 // RUN: %clang -c %s -target i386-unknown-unknown -fpic -### 2>&1 \
 // RUN:   | FileCheck %s --check-prefix=CHECK-PIC2
 // RUN: %clang -c %s -target x86_64-apple-darwin -fPIE -### 2>&1 \
 // RUN:   | FileCheck %s --check-prefix=CHECK-PIC2
+// RUN: %clang -c %s -target x86_64-apple-darwin -fPIC -### 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-NO-UNUSED-ARG
 //
 // Darwin gets even more special with '-mdynamic-no-pic'. This flag is only
 // valid on Darwin, and it's behavior is very strange but needs to remain