1 //===--- Pragma.h - Pragma registration and handling ------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines the PragmaHandler and PragmaTable interfaces.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_CLANG_PRAGMA_H
15 #define LLVM_CLANG_PRAGMA_H
17 #include "llvm/ADT/StringMap.h"
18 #include "llvm/ADT/StringRef.h"
26 class PragmaNamespace;
28 /// PragmaHandler - Instances of this interface defined to handle the various
29 /// pragmas that the language front-end uses. Each handler optionally has a
30 /// name (e.g. "pack") and the HandlePragma method is invoked when a pragma with
31 /// that identifier is found. If a handler does not match any of the declared
32 /// pragmas the handler with a null identifier is invoked, if it exists.
34 /// Note that the PragmaNamespace class can be used to subdivide pragmas, e.g.
35 /// we treat "#pragma STDC" and "#pragma GCC" as namespaces that contain other
40 explicit PragmaHandler(llvm::StringRef name) : Name(name) {}
42 virtual ~PragmaHandler();
44 llvm::StringRef getName() const { return Name; }
45 virtual void HandlePragma(Preprocessor &PP, Token &FirstToken) = 0;
47 /// getIfNamespace - If this is a namespace, return it. This is equivalent to
48 /// using a dynamic_cast, but doesn't require RTTI.
49 virtual PragmaNamespace *getIfNamespace() { return 0; }
52 /// EmptyPragmaHandler - A pragma handler which takes no action, which can be
53 /// used to ignore particular pragmas.
54 class EmptyPragmaHandler : public PragmaHandler {
58 virtual void HandlePragma(Preprocessor &PP, Token &FirstToken);
61 /// PragmaNamespace - This PragmaHandler subdivides the namespace of pragmas,
62 /// allowing hierarchical pragmas to be defined. Common examples of namespaces
63 /// are "#pragma GCC", "#pragma STDC", and "#pragma omp", but any namespaces may
64 /// be (potentially recursively) defined.
65 class PragmaNamespace : public PragmaHandler {
66 /// Handlers - This is a map of the handlers in this namespace with their name
69 llvm::StringMap<PragmaHandler*> Handlers;
71 explicit PragmaNamespace(llvm::StringRef Name) : PragmaHandler(Name) {}
72 virtual ~PragmaNamespace();
74 /// FindHandler - Check to see if there is already a handler for the
75 /// specified name. If not, return the handler for the null name if it
76 /// exists, otherwise return null. If IgnoreNull is true (the default) then
77 /// the null handler isn't returned on failure to match.
78 PragmaHandler *FindHandler(llvm::StringRef Name,
79 bool IgnoreNull = true) const;
81 /// AddPragma - Add a pragma to this namespace.
83 void AddPragma(PragmaHandler *Handler);
85 /// RemovePragmaHandler - Remove the given handler from the
87 void RemovePragmaHandler(PragmaHandler *Handler);
90 return Handlers.empty();
93 virtual void HandlePragma(Preprocessor &PP, Token &FirstToken);
95 virtual PragmaNamespace *getIfNamespace() { return this; }
99 } // end namespace clang