2012/11/5 Richard Smith <richard-l...@metafoo.co.uk> > Author: rsmith > Date: Mon Nov 5 19:12:02 2012 > New Revision: 167429 > > URL: http://llvm.org/viewvc/llvm-project?rev=167429&view=rev > Log: > Per discussion on cfe-commits, treat -faddress-sanitizer, > -fno-address-sanitizer, -fthread-sanitizer, -fno-thread-sanitizer, and > -fcatch-undefined-behavior as deprecated: produce a warning if they are > used > pointing to the corresponding -fsanitize= option. In passing add the > missing > '-' to some diagnostics. > > Modified: > cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td > cfe/trunk/lib/Driver/Tools.cpp > cfe/trunk/test/Driver/fsanitize.c > > Modified: cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td?rev=167429&r1=167428&r2=167429&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td (original) > +++ cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td Mon Nov 5 > 19:12:02 2012 > @@ -121,6 +121,8 @@ > InGroup<DiagGroup<"unused-command-line-argument">>; > def warn_drv_clang_unsupported : Warning< > "the clang compiler does not support '%0'">; > +def warn_drv_deprecated_arg : Warning< > + "argument '%0' is deprecated, use '%1' instead">, InGroup<Deprecated>; > def warn_drv_assuming_mfloat_abi_is : Warning< > "unknown platform, assuming -mfloat-abi=%0">; > def warn_ignoring_ftabstop_value : Warning< > > Modified: cfe/trunk/lib/Driver/Tools.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=167429&r1=167428&r2=167429&view=diff > > ============================================================================== > --- cfe/trunk/lib/Driver/Tools.cpp (original) > +++ cfe/trunk/lib/Driver/Tools.cpp Mon Nov 5 19:12:02 2012 > @@ -1522,9 +1522,10 @@ > /// Produce an argument string from argument \p A, which shows how it > provides a > /// value in \p Mask. For instance, the argument > "-fsanitize=address,alignment" > /// with mask \c NeedsUbsanRt would produce "-fsanitize=alignment". > -static std::string describeSanitizeArg(const Arg *A, unsigned Mask) { > +static std::string describeSanitizeArg(const ArgList &Args, const Arg *A, > + unsigned Mask) { > if (!A->getOption().matches(options::OPT_fsanitize_EQ)) > - return A->getOption().getName(); > + return A->getAsString(Args); > > for (unsigned I = 0, N = A->getNumValues(); I != N; ++I) > if (SanitizerArgs::parse(A->getValue(I)) & Mask) > @@ -1541,22 +1542,29 @@ > > for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; > ++I) { > unsigned Add = 0, Remove = 0; > - if ((*I)->getOption().matches(options::OPT_faddress_sanitizer)) > + const char *DeprecatedReplacement = 0; > + if ((*I)->getOption().matches(options::OPT_faddress_sanitizer)) { > Add = SanitizerArgs::Address; > - else if > ((*I)->getOption().matches(options::OPT_fno_address_sanitizer)) > + DeprecatedReplacement = "-fsanitize=address"; > + } else if > ((*I)->getOption().matches(options::OPT_fno_address_sanitizer)) { > Remove = SanitizerArgs::Address; > - else if ((*I)->getOption().matches(options::OPT_fthread_sanitizer)) > + DeprecatedReplacement = "-fno-sanitize=address"; > + } else if ((*I)->getOption().matches(options::OPT_fthread_sanitizer)) > { > Add = SanitizerArgs::Thread; > - else if ((*I)->getOption().matches(options::OPT_fno_thread_sanitizer)) > + DeprecatedReplacement = "-fsanitize=thread"; > + } else if > ((*I)->getOption().matches(options::OPT_fno_thread_sanitizer)) { > Remove = SanitizerArgs::Thread; > - else if > ((*I)->getOption().matches(options::OPT_fcatch_undefined_behavior)) > + DeprecatedReplacement = "-fno-sanitize=thread"; > + } else if > ((*I)->getOption().matches(options::OPT_fcatch_undefined_behavior)) { > Add = SanitizerArgs::Undefined; > - else if ((*I)->getOption().matches(options::OPT_fsanitize_EQ)) > + DeprecatedReplacement = "-fsanitize=undefined"; > + } else if ((*I)->getOption().matches(options::OPT_fsanitize_EQ)) { > Add = SanitizerArgs::parse(D, *I); > - else if ((*I)->getOption().matches(options::OPT_fno_sanitize_EQ)) > + } else if ((*I)->getOption().matches(options::OPT_fno_sanitize_EQ)) { > Remove = SanitizerArgs::parse(D, *I); > - else > + } else { > continue; > + } > > (*I)->claim(); > > @@ -1566,6 +1574,12 @@ > if (Add & SanitizerArgs::NeedsAsanRt) AsanArg = *I; > if (Add & SanitizerArgs::NeedsTsanRt) TsanArg = *I; > if (Add & SanitizerArgs::NeedsUbsanRt) UbsanArg = *I; > + > + // If this is a deprecated synonym, produce a warning directing users > + // towards the new spelling. > + if (DeprecatedReplacement) > + D.Diag(diag::warn_drv_deprecated_arg) > + << (*I)->getAsString(Args) << DeprecatedReplacement; > } > > // Only one runtime library can be used at once. > @@ -1575,10 +1589,10 @@ > bool NeedsUbsan = Sanitize.needsUbsanRt(); > if (NeedsAsan + NeedsTsan + NeedsUbsan > 1) > D.Diag(diag::err_drv_argument_not_allowed_with) > - << describeSanitizeArg(NeedsAsan ? AsanArg : TsanArg, > + << describeSanitizeArg(Args, NeedsAsan ? AsanArg : TsanArg, > NeedsAsan ? SanitizerArgs::NeedsAsanRt > : SanitizerArgs::NeedsTsanRt) > - << describeSanitizeArg(NeedsUbsan ? UbsanArg : TsanArg, > + << describeSanitizeArg(Args, NeedsUbsan ? UbsanArg : TsanArg, > NeedsUbsan ? SanitizerArgs::NeedsUbsanRt > : SanitizerArgs::NeedsTsanRt); > > @@ -2671,7 +2685,7 @@ > llvm::StringRef NoRttiArg = > Args.getLastArg(options::OPT_mkernel, > options::OPT_fapple_kext, > - options::OPT_fno_rtti)->getOption().getName(); > + options::OPT_fno_rtti)->getAsString(Args); >
Richard, Arg::getAsString() is incompatible to StringRef. Fixed in 167494.
_______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits