2012/11/5 Richard Smith <span dir="ltr"><<a href="mailto:richard-llvm@metafoo.co.uk" target="_blank">richard-llvm@metafoo.co.uk</a>></span><br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Author: rsmith<br>
Date: Mon Nov  5 19:12:02 2012<br>
New Revision: 167429<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=167429&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=167429&view=rev</a><br>
Log:<br>
Per discussion on cfe-commits, treat -faddress-sanitizer,<br>
-fno-address-sanitizer, -fthread-sanitizer, -fno-thread-sanitizer, and<br>
-fcatch-undefined-behavior as deprecated: produce a warning if they are used<br>
pointing to the corresponding -fsanitize= option. In passing add the missing<br>
'-' to some diagnostics.<br>
<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td<br>
    cfe/trunk/lib/Driver/Tools.cpp<br>
    cfe/trunk/test/Driver/fsanitize.c<br>
<br>
Modified: cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td?rev=167429&r1=167428&r2=167429&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td?rev=167429&r1=167428&r2=167429&view=diff</a><br>


==============================================================================<br>
--- cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td (original)<br>
+++ cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td Mon Nov  5 19:12:02 2012<br>
@@ -121,6 +121,8 @@<br>
   InGroup<DiagGroup<"unused-command-line-argument">>;<br>
 def warn_drv_clang_unsupported : Warning<<br>
   "the clang compiler does not support '%0'">;<br>
+def warn_drv_deprecated_arg : Warning<<br>
+  "argument '%0' is deprecated, use '%1' instead">, InGroup<Deprecated>;<br>
 def warn_drv_assuming_mfloat_abi_is : Warning<<br>
   "unknown platform, assuming -mfloat-abi=%0">;<br>
 def warn_ignoring_ftabstop_value : Warning<<br>
<br>
Modified: cfe/trunk/lib/Driver/Tools.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=167429&r1=167428&r2=167429&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=167429&r1=167428&r2=167429&view=diff</a><br>


==============================================================================<br>
--- cfe/trunk/lib/Driver/Tools.cpp (original)<br>
+++ cfe/trunk/lib/Driver/Tools.cpp Mon Nov  5 19:12:02 2012<br>
@@ -1522,9 +1522,10 @@<br>
 /// Produce an argument string from argument \p A, which shows how it provides a<br>
 /// value in \p Mask. For instance, the argument "-fsanitize=address,alignment"<br>
 /// with mask \c NeedsUbsanRt would produce "-fsanitize=alignment".<br>
-static std::string describeSanitizeArg(const Arg *A, unsigned Mask) {<br>
+static std::string describeSanitizeArg(const ArgList &Args, const Arg *A,<br>
+                                       unsigned Mask) {<br>
   if (!A->getOption().matches(options::OPT_fsanitize_EQ))<br>
-    return A->getOption().getName();<br>
+    return A->getAsString(Args);<br>
<br>
   for (unsigned I = 0, N = A->getNumValues(); I != N; ++I)<br>
     if (SanitizerArgs::parse(A->getValue(I)) & Mask)<br>
@@ -1541,22 +1542,29 @@<br>
<br>
   for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {<br>
     unsigned Add = 0, Remove = 0;<br>
-    if ((*I)->getOption().matches(options::OPT_faddress_sanitizer))<br>
+    const char *DeprecatedReplacement = 0;<br>
+    if ((*I)->getOption().matches(options::OPT_faddress_sanitizer)) {<br>
       Add = SanitizerArgs::Address;<br>
-    else if ((*I)->getOption().matches(options::OPT_fno_address_sanitizer))<br>
+      DeprecatedReplacement = "-fsanitize=address";<br>
+    } else if ((*I)->getOption().matches(options::OPT_fno_address_sanitizer)) {<br>
       Remove = SanitizerArgs::Address;<br>
-    else if ((*I)->getOption().matches(options::OPT_fthread_sanitizer))<br>
+      DeprecatedReplacement = "-fno-sanitize=address";<br>
+    } else if ((*I)->getOption().matches(options::OPT_fthread_sanitizer)) {<br>
       Add = SanitizerArgs::Thread;<br>
-    else if ((*I)->getOption().matches(options::OPT_fno_thread_sanitizer))<br>
+      DeprecatedReplacement = "-fsanitize=thread";<br>
+    } else if ((*I)->getOption().matches(options::OPT_fno_thread_sanitizer)) {<br>
       Remove = SanitizerArgs::Thread;<br>
-    else if ((*I)->getOption().matches(options::OPT_fcatch_undefined_behavior))<br>
+      DeprecatedReplacement = "-fno-sanitize=thread";<br>
+    } else if ((*I)->getOption().matches(options::OPT_fcatch_undefined_behavior)) {<br>
       Add = SanitizerArgs::Undefined;<br>
-    else if ((*I)->getOption().matches(options::OPT_fsanitize_EQ))<br>
+      DeprecatedReplacement = "-fsanitize=undefined";<br>
+    } else if ((*I)->getOption().matches(options::OPT_fsanitize_EQ)) {<br>
       Add = SanitizerArgs::parse(D, *I);<br>
-    else if ((*I)->getOption().matches(options::OPT_fno_sanitize_EQ))<br>
+    } else if ((*I)->getOption().matches(options::OPT_fno_sanitize_EQ)) {<br>
       Remove = SanitizerArgs::parse(D, *I);<br>
-    else<br>
+    } else {<br>
       continue;<br>
+    }<br>
<br>
     (*I)->claim();<br>
<br>
@@ -1566,6 +1574,12 @@<br>
     if (Add & SanitizerArgs::NeedsAsanRt) AsanArg = *I;<br>
     if (Add & SanitizerArgs::NeedsTsanRt) TsanArg = *I;<br>
     if (Add & SanitizerArgs::NeedsUbsanRt) UbsanArg = *I;<br>
+<br>
+    // If this is a deprecated synonym, produce a warning directing users<br>
+    // towards the new spelling.<br>
+    if (DeprecatedReplacement)<br>
+      D.Diag(diag::warn_drv_deprecated_arg)<br>
+        << (*I)->getAsString(Args) << DeprecatedReplacement;<br>
   }<br>
<br>
   // Only one runtime library can be used at once.<br>
@@ -1575,10 +1589,10 @@<br>
   bool NeedsUbsan = Sanitize.needsUbsanRt();<br>
   if (NeedsAsan + NeedsTsan + NeedsUbsan > 1)<br>
     D.Diag(diag::err_drv_argument_not_allowed_with)<br>
-      << describeSanitizeArg(NeedsAsan ? AsanArg : TsanArg,<br>
+      << describeSanitizeArg(Args, NeedsAsan ? AsanArg : TsanArg,<br>
                              NeedsAsan ? SanitizerArgs::NeedsAsanRt<br>
                                        : SanitizerArgs::NeedsTsanRt)<br>
-      << describeSanitizeArg(NeedsUbsan ? UbsanArg : TsanArg,<br>
+      << describeSanitizeArg(Args, NeedsUbsan ? UbsanArg : TsanArg,<br>
                              NeedsUbsan ? SanitizerArgs::NeedsUbsanRt<br>
                                         : SanitizerArgs::NeedsTsanRt);<br>
<br>
@@ -2671,7 +2685,7 @@<br>
       llvm::StringRef NoRttiArg =<br>
         Args.getLastArg(options::OPT_mkernel,<br>
                         options::OPT_fapple_kext,<br>
-                        options::OPT_fno_rtti)->getOption().getName();<br>
+                        options::OPT_fno_rtti)->getAsString(Args);<br></blockquote><div><br></div><div>Richard, Arg::getAsString() is incompatible to StringRef. Fixed in 167494.</div></div></div>