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>