diff options
Diffstat (limited to 'clang/examples/AnnotateFunctions/AnnotateFunctions.cpp')
-rw-r--r-- | clang/examples/AnnotateFunctions/AnnotateFunctions.cpp | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/clang/examples/AnnotateFunctions/AnnotateFunctions.cpp b/clang/examples/AnnotateFunctions/AnnotateFunctions.cpp index f2e7322183a..375f18f8e09 100644 --- a/clang/examples/AnnotateFunctions/AnnotateFunctions.cpp +++ b/clang/examples/AnnotateFunctions/AnnotateFunctions.cpp @@ -7,20 +7,29 @@ // //===----------------------------------------------------------------------===// // -// Example clang plugin which adds an annotation to every function. +// Example clang plugin which adds an annotation to every function in +// translation units that start with #pragma enable_annotate. // //===----------------------------------------------------------------------===// #include "clang/Frontend/FrontendPluginRegistry.h" #include "clang/AST/AST.h" #include "clang/AST/ASTConsumer.h" +#include "clang/Lex/Preprocessor.h" +#include "clang/Lex/LexDiagnostic.h" using namespace clang; namespace { +static bool EnableAnnotate = false; +static bool HandledDecl = false; + class AnnotateFunctionsConsumer : public ASTConsumer { public: bool HandleTopLevelDecl(DeclGroupRef DG) override { + HandledDecl = true; + if (!EnableAnnotate) + return true; for (auto D : DG) if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) FD->addAttr(AnnotateAttr::CreateImplicit(FD->getASTContext(), @@ -46,7 +55,34 @@ public: } }; +class PragmaAnnotateHandler : public PragmaHandler { +public: + PragmaAnnotateHandler() : PragmaHandler("enable_annotate") { } + + void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, + Token &PragmaTok) override { + + Token Tok; + PP.LexUnexpandedToken(Tok); + if (Tok.isNot(tok::eod)) + PP.Diag(Tok, diag::ext_pp_extra_tokens_at_eol) << "pragma"; + + if (HandledDecl) { + DiagnosticsEngine &D = PP.getDiagnostics(); + unsigned ID = D.getCustomDiagID( + DiagnosticsEngine::Error, + "#pragma enable_annotate not allowed after declarations"); + D.Report(PragmaTok.getLocation(), ID); + } + + EnableAnnotate = true; + } +}; + } static FrontendPluginRegistry::Add<AnnotateFunctionsAction> X("annotate-fns", "annotate functions"); + +static PragmaHandlerRegistry::Add<PragmaAnnotateHandler> +Y("enable_annotate","enable annotation"); |