summaryrefslogtreecommitdiffstats
path: root/clang/examples/AnnotateFunctions/AnnotateFunctions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/examples/AnnotateFunctions/AnnotateFunctions.cpp')
-rw-r--r--clang/examples/AnnotateFunctions/AnnotateFunctions.cpp38
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");
OpenPOWER on IntegriCloud