Hi!

Currently the driver responds to -mdynamic-no-pic, but not to 
-mno-dynamic-no-pic which tripped up a recent change to GCC bootstrap, since 
xcode 6.2 clang errors on "-mno-dynamic-no-pic".

The patch attached, fixes this by adding the missing option.
While I was in the vicinity, I fixed the FIXME for the missing warning about 
dynamic-no-pic overriding PIC and PIE.

The result is compatible with gcc-4.2.1 (and modern GCC trunk).

Testcase amendments are included for the new option and warning.

OK to apply?
Iain

diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td 
b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 9a055b8..176d5b7 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -168,6 +168,9 @@ def warn_drv_enabling_rtti_with_exceptions : Warning<
 def warn_drv_disabling_vptr_no_rtti_default : Warning<
   "implicitly disabling vptr sanitizer because rtti wasn't enabled">,
   InGroup<DiagGroup<"auto-disable-vptr-sanitizer">>;
+def warn_mdynamic_no_pic_override : Warning<
+  "'-mdynamic-no-pic' overrides '-fpic', '-fPIC', '-fpie' or '-fPIE'">,
+  InGroup<UnusedCommandLineArgument>;
 
 def note_drv_command_failed_diag_msg : Note<
   "diagnostic msg: %0">;
diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 4e1afbe..16022ea 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -1136,6 +1136,7 @@ def mcmodel_EQ : Joined<["-"], "mcmodel=">, 
Group<m_Group>;
 def mconstant_cfstrings : Flag<["-"], "mconstant-cfstrings">, 
Group<clang_ignored_m_Group>;
 def mcpu_EQ : Joined<["-"], "mcpu=">, Group<m_Group>;
 def mdynamic_no_pic : Joined<["-"], "mdynamic-no-pic">, Group<m_Group>;
+def mno_dynamic_no_pic : Joined<["-"], "mno-dynamic-no-pic">, Group<m_Group>;
 def mfix_and_continue : Flag<["-"], "mfix-and-continue">, 
Group<clang_ignored_m_Group>;
 def mieee_fp : Flag<["-"], "mieee-fp">, Group<clang_ignored_m_Group>;
 def minline_all_stringops : Flag<["-"], "minline-all-stringops">, 
Group<clang_ignored_m_Group>;
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp
index 7b661a7..d81f584 100644
--- a/clang/lib/Driver/Tools.cpp
+++ b/clang/lib/Driver/Tools.cpp
@@ -2836,14 +2836,27 @@ void Clang::ConstructJob(Compilation &C, const 
JobAction &JA,
   if (Args.hasArg(options::OPT_static))
     PIC = PIE = false;
 
-  if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
-    // This is a very special mode. It trumps the other modes, almost no one
-    // uses it, and it isn't even valid on any OS but Darwin.
-    if (!getToolChain().getTriple().isOSDarwin())
-      D.Diag(diag::err_drv_unsupported_opt_for_target)
-        << A->getSpelling() << getToolChain().getTriple().str();
+  // Deal with the special case of mdynamic-no-pic.
+  bool IsDynamicNoPic = false;
+  if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic,
+                               options::OPT_mno_dynamic_no_pic)) {
+    if (A->getOption().getID() == options::OPT_mdynamic_no_pic) {
+      // This is a very special mode which isn't valid on any OS but
+      // Darwin.
+      if (getToolChain().getTriple().isOSDarwin())
+        IsDynamicNoPic = true;
+      else
+        D.Diag(diag::err_drv_unsupported_opt_for_target)
+          << A->getSpelling() << getToolChain().getTriple().str();
+    }
+  }
 
-    // FIXME: Warn when this flag trumps some other PIC or PIE flag.
+  if (IsDynamicNoPic) {
+    // This mode trumps all other PIC and PIE modes.  The only current use
+    // case is for 32bit binaries (on Darwin, as noted above).
+    // Warn if it's presented along with any other PIC or PIE option.
+    if (LastPICArg)
+      D.Diag(diag::warn_mdynamic_no_pic_override);
 
     CmdArgs.push_back("-mrelocation-model");
     CmdArgs.push_back("dynamic-no-pic");
diff --git a/clang/test/Driver/pic.c b/clang/test/Driver/pic.c
index 3a14d61..10d8ee9 100644
--- a/clang/test/Driver/pic.c
+++ b/clang/test/Driver/pic.c
@@ -42,6 +42,8 @@
 //
 // CHECK-NO-UNUSED-ARG-NOT: argument unused during compilation
 //
+// CHECK-DARWIN-DYNAMIC-NO-PIC-OVERRIDE: warning: '-mdynamic-no-pic' overrides 
'-fpic', '-fPIC', '-fpie' or '-fPIE'
+//
 // 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 \
@@ -187,12 +189,21 @@
 // RUN:   | FileCheck %s --check-prefix=CHECK-DYNAMIC-NO-PIC-32
 // RUN: %clang -c %s -target i386-apple-darwin -mdynamic-no-pic -fpie -### 
2>&1 \
 // RUN:   | FileCheck %s --check-prefix=CHECK-DYNAMIC-NO-PIC-32
+// RUN: %clang -c %s -target i386-apple-darwin -mdynamic-no-pic \
+// RUN: -mno-dynamic-no-pic -### 2>&1 | FileCheck %s --check-prefix=CHECK-PIC2
+// RUN: %clang -c %s -target i386-apple-darwin -mdynamic-no-pic -fPIC  -### 
2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-DARWIN-DYNAMIC-NO-PIC-OVERRIDE
+//
 // RUN: %clang -c %s -target x86_64-apple-darwin -mdynamic-no-pic -### 2>&1 \
 // RUN:   | FileCheck %s --check-prefix=CHECK-DYNAMIC-NO-PIC-64
 // RUN: %clang -c %s -target x86_64-apple-darwin -mdynamic-no-pic -fno-pic 
-### 2>&1 \
 // RUN:   | FileCheck %s --check-prefix=CHECK-DYNAMIC-NO-PIC-64
 // RUN: %clang -c %s -target x86_64-apple-darwin -mdynamic-no-pic -fpie -### 
2>&1 \
 // RUN:   | FileCheck %s --check-prefix=CHECK-DYNAMIC-NO-PIC-64
+// RUN: %clang -c %s -target x86_64-apple-darwin -mdynamic-no-pic \
+// RUN: -mno-dynamic-no-pic -### 2>&1 | FileCheck %s --check-prefix=CHECK-PIC2
+// RUN: %clang -c %s -target x86_64-apple-darwin -mdynamic-no-pic -fPIC  -### 
2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-DARWIN-DYNAMIC-NO-PIC-OVERRIDE
 //
 // Checks for ARM+Apple+IOS including -fapple-kext, -mkernel, and iphoneos
 // version boundaries.

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to