r327959 - [ms] Parse #pragma optimize and ignore it behind its own flag

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Thu Mar 22 02:35:21 PDT 2018


This is a bit confusing, I think. We use -Wignored-pragmas for pragmas
that clang doesn't parse, and also for ignored #pragma intrinsics.

-Wunknown-pragmas isn't used that much, but there is e.g. "pragma STDC
FENV_ACCESS ON is not supported, ignoring pragma". Note that the text
says it's unsupported and ignored, not that it's unknown.

In terms of warning name, -Wignored-pragmas, seems a better fit, so
maybe we should leave it as is.

On Wed, Mar 21, 2018 at 9:56 PM, Hans Wennborg <hans at chromium.org> wrote:
> Not sure either, but I think the ignored warning is used for pragmas
> that clang fails to parse, so maybe unsupported is better.
>
> On Wed, Mar 21, 2018 at 9:33 PM, Nico Weber <thakis at chromium.org> wrote:
>> Ah! Hm, maybe that's the better group for this anyway? Not sure.
>>
>> On Wed, Mar 21, 2018, 9:03 PM Hans Wennborg <hans at chromium.org> wrote:
>>>
>>> Aw, rats. I put it under -Wignored-pragmas rather than
>>> -Wunsupported-pragmas, because I was looking at #pragma intrinsic.
>>>
>>> I'll take a look at this again tomorrow.
>>>
>>> On Wed, Mar 21, 2018 at 5:18 PM, Nico Weber via cfe-commits
>>> <cfe-commits at lists.llvm.org> wrote:
>>> > From the bot changes, it seems that -Wunknown-pragma doesn't disable
>>> > this
>>> > new warning. Shouldn't it do that?
>>> >
>>> > On Tue, Mar 20, 2018, 9:55 AM Hans Wennborg via cfe-commits
>>> > <cfe-commits at lists.llvm.org> wrote:
>>> >>
>>> >> Author: hans
>>> >> Date: Tue Mar 20 01:53:11 2018
>>> >> New Revision: 327959
>>> >>
>>> >> URL: http://llvm.org/viewvc/llvm-project?rev=327959&view=rev
>>> >> Log:
>>> >> [ms] Parse #pragma optimize and ignore it behind its own flag
>>> >>
>>> >> This allows users to turn off warnings about this pragma specifically,
>>> >> while still receiving warnings about other ignored pragmas.
>>> >>
>>> >> Differential Revision: https://reviews.llvm.org/D44630
>>> >>
>>> >> Modified:
>>> >>     cfe/trunk/include/clang/Basic/DiagnosticGroups.td
>>> >>     cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
>>> >>     cfe/trunk/include/clang/Parse/Parser.h
>>> >>     cfe/trunk/lib/Parse/ParsePragma.cpp
>>> >>     cfe/trunk/test/Preprocessor/pragma_microsoft.c
>>> >>
>>> >> Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td
>>> >> URL:
>>> >>
>>> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=327959&r1=327958&r2=327959&view=diff
>>> >>
>>> >>
>>> >> ==============================================================================
>>> >> --- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original)
>>> >> +++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Tue Mar 20
>>> >> 01:53:11
>>> >> 2018
>>> >> @@ -515,8 +515,13 @@ def UninitializedStaticSelfInit : DiagGr
>>> >>  def Uninitialized  : DiagGroup<"uninitialized",
>>> >> [UninitializedSometimes,
>>> >>
>>> >> UninitializedStaticSelfInit]>;
>>> >>  def IgnoredPragmaIntrinsic : DiagGroup<"ignored-pragma-intrinsic">;
>>> >> +// #pragma optimize is often used to avoid to work around MSVC codegen
>>> >> bugs or
>>> >> +// to disable inlining. It's not completely clear what alternative to
>>> >> suggest
>>> >> +// (#pragma clang optimize, noinline) so suggest nothing for now.
>>> >> +def IgnoredPragmaOptimize : DiagGroup<"ignored-pragma-optimize">;
>>> >>  def UnknownPragmas : DiagGroup<"unknown-pragmas">;
>>> >> -def IgnoredPragmas : DiagGroup<"ignored-pragmas",
>>> >> [IgnoredPragmaIntrinsic]>;
>>> >> +def IgnoredPragmas : DiagGroup<"ignored-pragmas",
>>> >> +    [IgnoredPragmaIntrinsic, IgnoredPragmaOptimize]>;
>>> >>  def PragmaClangAttribute : DiagGroup<"pragma-clang-attribute">;
>>> >>  def PragmaPackSuspiciousInclude :
>>> >> DiagGroup<"pragma-pack-suspicious-include">;
>>> >>  def PragmaPack : DiagGroup<"pragma-pack",
>>> >> [PragmaPackSuspiciousInclude]>;
>>> >>
>>> >> Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
>>> >> URL:
>>> >>
>>> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td?rev=327959&r1=327958&r2=327959&view=diff
>>> >>
>>> >>
>>> >> ==============================================================================
>>> >> --- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td (original)
>>> >> +++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td Tue Mar 20
>>> >> 01:53:11 2018
>>> >> @@ -895,6 +895,12 @@ def warn_pragma_expected_rparen : Warnin
>>> >>    "missing ')' after '#pragma %0' - ignoring">,
>>> >> InGroup<IgnoredPragmas>;
>>> >>  def warn_pragma_expected_identifier : Warning<
>>> >>    "expected identifier in '#pragma %0' - ignored">,
>>> >> InGroup<IgnoredPragmas>;
>>> >> +def warn_pragma_expected_string : Warning<
>>> >> +  "expected string literal in '#pragma %0' - ignoring">,
>>> >> InGroup<IgnoredPragmas>;
>>> >> +def warn_pragma_missing_argument : Warning<
>>> >> +  "missing argument to '#pragma %0'%select{|; expected %2}1">,
>>> >> InGroup<IgnoredPragmas>;
>>> >> +def warn_pragma_invalid_argument : Warning<
>>> >> +  "unexpected argument '%0' to '#pragma %1'%select{|; expected %3}2">,
>>> >> InGroup<IgnoredPragmas>;
>>> >>
>>> >>  // '#pragma clang section' related errors
>>> >>  def err_pragma_expected_clang_section_name : Error<
>>> >> @@ -923,6 +929,8 @@ def warn_pragma_ms_struct : Warning<
>>> >>  def warn_pragma_extra_tokens_at_eol : Warning<
>>> >>    "extra tokens at end of '#pragma %0' - ignored">,
>>> >>    InGroup<IgnoredPragmas>;
>>> >> +def warn_pragma_expected_comma : Warning<
>>> >> +  "expected ',' in '#pragma %0'">, InGroup<IgnoredPragmas>;
>>> >>  def warn_pragma_expected_punc : Warning<
>>> >>    "expected ')' or ',' in '#pragma %0'">, InGroup<IgnoredPragmas>;
>>> >>  def warn_pragma_expected_non_wide_string : Warning<
>>> >> @@ -960,6 +968,10 @@ def warn_pragma_pack_malformed : Warning
>>> >>  def warn_pragma_intrinsic_builtin : Warning<
>>> >>    "%0 is not a recognized builtin%select{|; consider including
>>> >> <intrin.h>
>>> >> to access non-builtin intrinsics}1">,
>>> >>    InGroup<IgnoredPragmaIntrinsic>;
>>> >> +// - #pragma optimize
>>> >> +def warn_pragma_optimize : Warning<
>>> >> +  "'#pragma optimize' is not supported">,
>>> >> +  InGroup<IgnoredPragmaOptimize>;
>>> >>  // - #pragma unused
>>> >>  def warn_pragma_unused_expected_var : Warning<
>>> >>    "expected '#pragma unused' argument to be a variable name">,
>>> >>
>>> >> Modified: cfe/trunk/include/clang/Parse/Parser.h
>>> >> URL:
>>> >>
>>> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=327959&r1=327958&r2=327959&view=diff
>>> >>
>>> >>
>>> >> ==============================================================================
>>> >> --- cfe/trunk/include/clang/Parse/Parser.h (original)
>>> >> +++ cfe/trunk/include/clang/Parse/Parser.h Tue Mar 20 01:53:11 2018
>>> >> @@ -179,6 +179,7 @@ class Parser : public CodeCompletionHand
>>> >>    std::unique_ptr<PragmaHandler> MSSection;
>>> >>    std::unique_ptr<PragmaHandler> MSRuntimeChecks;
>>> >>    std::unique_ptr<PragmaHandler> MSIntrinsic;
>>> >> +  std::unique_ptr<PragmaHandler> MSOptimize;
>>> >>    std::unique_ptr<PragmaHandler> CUDAForceHostDeviceHandler;
>>> >>    std::unique_ptr<PragmaHandler> OptimizeHandler;
>>> >>    std::unique_ptr<PragmaHandler> LoopHintHandler;
>>> >>
>>> >> Modified: cfe/trunk/lib/Parse/ParsePragma.cpp
>>> >> URL:
>>> >>
>>> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParsePragma.cpp?rev=327959&r1=327958&r2=327959&view=diff
>>> >>
>>> >>
>>> >> ==============================================================================
>>> >> --- cfe/trunk/lib/Parse/ParsePragma.cpp (original)
>>> >> +++ cfe/trunk/lib/Parse/ParsePragma.cpp Tue Mar 20 01:53:11 2018
>>> >> @@ -220,6 +220,12 @@ struct PragmaMSIntrinsicHandler : public
>>> >>                      Token &FirstToken) override;
>>> >>  };
>>> >>
>>> >> +struct PragmaMSOptimizeHandler : public PragmaHandler {
>>> >> +  PragmaMSOptimizeHandler() : PragmaHandler("optimize") {}
>>> >> +  void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
>>> >> +                    Token &FirstToken) override;
>>> >> +};
>>> >> +
>>> >>  struct PragmaForceCUDAHostDeviceHandler : public PragmaHandler {
>>> >>    PragmaForceCUDAHostDeviceHandler(Sema &Actions)
>>> >>        : PragmaHandler("force_cuda_host_device"), Actions(Actions) {}
>>> >> @@ -324,6 +330,8 @@ void Parser::initializePragmaHandlers()
>>> >>      PP.AddPragmaHandler(MSRuntimeChecks.get());
>>> >>      MSIntrinsic.reset(new PragmaMSIntrinsicHandler());
>>> >>      PP.AddPragmaHandler(MSIntrinsic.get());
>>> >> +    MSOptimize.reset(new PragmaMSOptimizeHandler());
>>> >> +    PP.AddPragmaHandler(MSOptimize.get());
>>> >>    }
>>> >>
>>> >>    if (getLangOpts().CUDA) {
>>> >> @@ -410,6 +418,8 @@ void Parser::resetPragmaHandlers() {
>>> >>      MSRuntimeChecks.reset();
>>> >>      PP.RemovePragmaHandler(MSIntrinsic.get());
>>> >>      MSIntrinsic.reset();
>>> >> +    PP.RemovePragmaHandler(MSOptimize.get());
>>> >> +    MSOptimize.reset();
>>> >>    }
>>> >>
>>> >>    if (getLangOpts().CUDA) {
>>> >> @@ -2949,6 +2959,61 @@ void PragmaMSIntrinsicHandler::HandlePra
>>> >>      PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol)
>>> >>          << "intrinsic";
>>> >>  }
>>> >> +
>>> >> +// #pragma optimize("gsty", on|off)
>>> >> +void PragmaMSOptimizeHandler::HandlePragma(Preprocessor &PP,
>>> >> +                                           PragmaIntroducerKind
>>> >> Introducer,
>>> >> +                                           Token &Tok) {
>>> >> +  SourceLocation StartLoc = Tok.getLocation();
>>> >> +  PP.Lex(Tok);
>>> >> +
>>> >> +  if (Tok.isNot(tok::l_paren)) {
>>> >> +    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_lparen) <<
>>> >> "optimize";
>>> >> +    return;
>>> >> +  }
>>> >> +  PP.Lex(Tok);
>>> >> +
>>> >> +  if (Tok.isNot(tok::string_literal)) {
>>> >> +    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_string) <<
>>> >> "optimize";
>>> >> +    return;
>>> >> +  }
>>> >> +  // We could syntax check the string but it's probably not worth the
>>> >> effort.
>>> >> +  PP.Lex(Tok);
>>> >> +
>>> >> +  if (Tok.isNot(tok::comma)) {
>>> >> +    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_comma) <<
>>> >> "optimize";
>>> >> +    return;
>>> >> +  }
>>> >> +  PP.Lex(Tok);
>>> >> +
>>> >> +  if (Tok.is(tok::eod) || Tok.is(tok::r_paren)) {
>>> >> +    PP.Diag(Tok.getLocation(), diag::warn_pragma_missing_argument)
>>> >> +        << "optimize" << /*Expected=*/true << "'on' or 'off'";
>>> >> +    return;
>>> >> +  }
>>> >> +  IdentifierInfo *II = Tok.getIdentifierInfo();
>>> >> +  if (!II || (!II->isStr("on") && !II->isStr("off"))) {
>>> >> +    PP.Diag(Tok.getLocation(), diag::warn_pragma_invalid_argument)
>>> >> +        << PP.getSpelling(Tok) << "optimize" << /*Expected=*/true
>>> >> +        << "'on' or 'off'";
>>> >> +    return;
>>> >> +  }
>>> >> +  PP.Lex(Tok);
>>> >> +
>>> >> +  if (Tok.isNot(tok::r_paren)) {
>>> >> +    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_rparen) <<
>>> >> "optimize";
>>> >> +    return;
>>> >> +  }
>>> >> +  PP.Lex(Tok);
>>> >> +
>>> >> +  if (Tok.isNot(tok::eod)) {
>>> >> +    PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol)
>>> >> +        << "optimize";
>>> >> +    return;
>>> >> +  }
>>> >> +  PP.Diag(StartLoc, diag::warn_pragma_optimize);
>>> >> +}
>>> >> +
>>> >>  void PragmaForceCUDAHostDeviceHandler::HandlePragma(
>>> >>      Preprocessor &PP, PragmaIntroducerKind Introducer, Token &Tok) {
>>> >>    Token FirstTok = Tok;
>>> >>
>>> >> Modified: cfe/trunk/test/Preprocessor/pragma_microsoft.c
>>> >> URL:
>>> >>
>>> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/pragma_microsoft.c?rev=327959&r1=327958&r2=327959&view=diff
>>> >>
>>> >>
>>> >> ==============================================================================
>>> >> --- cfe/trunk/test/Preprocessor/pragma_microsoft.c (original)
>>> >> +++ cfe/trunk/test/Preprocessor/pragma_microsoft.c Tue Mar 20 01:53:11
>>> >> 2018
>>> >> @@ -190,3 +190,11 @@ void g() {}
>>> >>  #pragma intrinsic(asdf) // no-warning
>>> >>  #pragma clang diagnostic pop
>>> >>  #pragma intrinsic(asdf) // expected-warning {{'asdf' is not a
>>> >> recognized
>>> >> builtin; consider including <intrin.h>}}
>>> >> +
>>> >> +#pragma optimize          // expected-warning{{missing '(' after
>>> >> '#pragma
>>> >> optimize'}}
>>> >> +#pragma optimize(         // expected-warning{{expected string literal
>>> >> in
>>> >> '#pragma optimize'}}
>>> >> +#pragma optimize(a        // expected-warning{{expected string literal
>>> >> in
>>> >> '#pragma optimize'}}
>>> >> +#pragma optimize("g"      // expected-warning{{expected ',' in
>>> >> '#pragma
>>> >> optimize'}}
>>> >> +#pragma optimize("g",     // expected-warning{{missing argument to
>>> >> '#pragma optimize'; expected 'on' or 'off'}}
>>> >> +#pragma optimize("g",xyz  // expected-warning{{unexpected argument
>>> >> 'xyz'
>>> >> to '#pragma optimize'; expected 'on' or 'off'}}
>>> >> +#pragma optimize("g",on)  // expected-warning{{#pragma optimize' is
>>> >> not
>>> >> supported}}
>>> >>
>>> >>
>>> >> _______________________________________________
>>> >> cfe-commits mailing list
>>> >> cfe-commits at lists.llvm.org
>>> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>> >
>>> >
>>> > _______________________________________________
>>> > cfe-commits mailing list
>>> > cfe-commits at lists.llvm.org
>>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>> >


More information about the cfe-commits mailing list