diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Parse/ParsePragma.cpp | 203 | ||||
-rw-r--r-- | clang/lib/Parse/ParsePragma.h | 153 | ||||
-rw-r--r-- | clang/lib/Parse/Parser.cpp | 91 |
3 files changed, 204 insertions, 243 deletions
diff --git a/clang/lib/Parse/ParsePragma.cpp b/clang/lib/Parse/ParsePragma.cpp index 90929d69188..6a1b5fff54a 100644 --- a/clang/lib/Parse/ParsePragma.cpp +++ b/clang/lib/Parse/ParsePragma.cpp @@ -11,7 +11,6 @@ // //===----------------------------------------------------------------------===// -#include "ParsePragma.h" #include "clang/Lex/Preprocessor.h" #include "clang/Parse/ParseDiagnostic.h" #include "clang/Parse/Parser.h" @@ -19,6 +18,208 @@ #include "llvm/ADT/StringSwitch.h" using namespace clang; +namespace { + +struct PragmaAlignHandler : public PragmaHandler { + explicit PragmaAlignHandler() : PragmaHandler("align") {} + virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, + Token &FirstToken); +}; + +struct PragmaGCCVisibilityHandler : public PragmaHandler { + explicit PragmaGCCVisibilityHandler() : PragmaHandler("visibility") {} + virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, + Token &FirstToken); +}; + +struct PragmaOptionsHandler : public PragmaHandler { + explicit PragmaOptionsHandler() : PragmaHandler("options") {} + virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, + Token &FirstToken); +}; + +struct PragmaPackHandler : public PragmaHandler { + explicit PragmaPackHandler() : PragmaHandler("pack") {} + virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, + Token &FirstToken); +}; + +struct PragmaMSStructHandler : public PragmaHandler { + explicit PragmaMSStructHandler() : PragmaHandler("ms_struct") {} + virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, + Token &FirstToken); +}; + +struct PragmaUnusedHandler : public PragmaHandler { + PragmaUnusedHandler() : PragmaHandler("unused") {} + virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, + Token &FirstToken); +}; + +struct PragmaWeakHandler : public PragmaHandler { + explicit PragmaWeakHandler() : PragmaHandler("weak") {} + virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, + Token &FirstToken); +}; + +struct PragmaRedefineExtnameHandler : public PragmaHandler { + explicit PragmaRedefineExtnameHandler() : PragmaHandler("redefine_extname") {} + virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, + Token &FirstToken); +}; + +struct PragmaOpenCLExtensionHandler : public PragmaHandler { + PragmaOpenCLExtensionHandler() : PragmaHandler("EXTENSION") {} + virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, + Token &FirstToken); +}; + + +struct PragmaFPContractHandler : public PragmaHandler { + PragmaFPContractHandler() : PragmaHandler("FP_CONTRACT") {} + virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, + Token &FirstToken); +}; + +struct PragmaNoOpenMPHandler : public PragmaHandler { + PragmaNoOpenMPHandler() : PragmaHandler("omp") { } + virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, + Token &FirstToken); +}; + +struct PragmaOpenMPHandler : public PragmaHandler { + PragmaOpenMPHandler() : PragmaHandler("omp") { } + virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, + Token &FirstToken); +}; + +/// PragmaCommentHandler - "\#pragma comment ...". +struct PragmaCommentHandler : public PragmaHandler { + PragmaCommentHandler(Sema &Actions) + : PragmaHandler("comment"), Actions(Actions) {} + virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, + Token &FirstToken); +private: + Sema &Actions; +}; + +struct PragmaDetectMismatchHandler : public PragmaHandler { + PragmaDetectMismatchHandler(Sema &Actions) + : PragmaHandler("detect_mismatch"), Actions(Actions) {} + virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, + Token &FirstToken); +private: + Sema &Actions; +}; + +struct PragmaMSPointersToMembers : public PragmaHandler { + explicit PragmaMSPointersToMembers() : PragmaHandler("pointers_to_members") {} + virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, + Token &FirstToken); +}; + +struct PragmaMSVtorDisp : public PragmaHandler { + explicit PragmaMSVtorDisp() : PragmaHandler("vtordisp") {} + virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, + Token &FirstToken); +}; + +} // end namespace + +void Parser::initializePragmaHandlers() { + AlignHandler.reset(new PragmaAlignHandler()); + PP.AddPragmaHandler(AlignHandler.get()); + + GCCVisibilityHandler.reset(new PragmaGCCVisibilityHandler()); + PP.AddPragmaHandler("GCC", GCCVisibilityHandler.get()); + + OptionsHandler.reset(new PragmaOptionsHandler()); + PP.AddPragmaHandler(OptionsHandler.get()); + + PackHandler.reset(new PragmaPackHandler()); + PP.AddPragmaHandler(PackHandler.get()); + + MSStructHandler.reset(new PragmaMSStructHandler()); + PP.AddPragmaHandler(MSStructHandler.get()); + + UnusedHandler.reset(new PragmaUnusedHandler()); + PP.AddPragmaHandler(UnusedHandler.get()); + + WeakHandler.reset(new PragmaWeakHandler()); + PP.AddPragmaHandler(WeakHandler.get()); + + RedefineExtnameHandler.reset(new PragmaRedefineExtnameHandler()); + PP.AddPragmaHandler(RedefineExtnameHandler.get()); + + FPContractHandler.reset(new PragmaFPContractHandler()); + PP.AddPragmaHandler("STDC", FPContractHandler.get()); + + if (getLangOpts().OpenCL) { + OpenCLExtensionHandler.reset(new PragmaOpenCLExtensionHandler()); + PP.AddPragmaHandler("OPENCL", OpenCLExtensionHandler.get()); + + PP.AddPragmaHandler("OPENCL", FPContractHandler.get()); + } + if (getLangOpts().OpenMP) + OpenMPHandler.reset(new PragmaOpenMPHandler()); + else + OpenMPHandler.reset(new PragmaNoOpenMPHandler()); + PP.AddPragmaHandler(OpenMPHandler.get()); + + if (getLangOpts().MicrosoftExt) { + MSCommentHandler.reset(new PragmaCommentHandler(Actions)); + PP.AddPragmaHandler(MSCommentHandler.get()); + MSDetectMismatchHandler.reset(new PragmaDetectMismatchHandler(Actions)); + PP.AddPragmaHandler(MSDetectMismatchHandler.get()); + MSPointersToMembers.reset(new PragmaMSPointersToMembers()); + PP.AddPragmaHandler(MSPointersToMembers.get()); + MSVtorDisp.reset(new PragmaMSVtorDisp()); + PP.AddPragmaHandler(MSVtorDisp.get()); + } +} + +void Parser::resetPragmaHandlers() { + // Remove the pragma handlers we installed. + PP.RemovePragmaHandler(AlignHandler.get()); + AlignHandler.reset(); + PP.RemovePragmaHandler("GCC", GCCVisibilityHandler.get()); + GCCVisibilityHandler.reset(); + PP.RemovePragmaHandler(OptionsHandler.get()); + OptionsHandler.reset(); + PP.RemovePragmaHandler(PackHandler.get()); + PackHandler.reset(); + PP.RemovePragmaHandler(MSStructHandler.get()); + MSStructHandler.reset(); + PP.RemovePragmaHandler(UnusedHandler.get()); + UnusedHandler.reset(); + PP.RemovePragmaHandler(WeakHandler.get()); + WeakHandler.reset(); + PP.RemovePragmaHandler(RedefineExtnameHandler.get()); + RedefineExtnameHandler.reset(); + + if (getLangOpts().OpenCL) { + PP.RemovePragmaHandler("OPENCL", OpenCLExtensionHandler.get()); + OpenCLExtensionHandler.reset(); + PP.RemovePragmaHandler("OPENCL", FPContractHandler.get()); + } + PP.RemovePragmaHandler(OpenMPHandler.get()); + OpenMPHandler.reset(); + + if (getLangOpts().MicrosoftExt) { + PP.RemovePragmaHandler(MSCommentHandler.get()); + MSCommentHandler.reset(); + PP.RemovePragmaHandler(MSDetectMismatchHandler.get()); + MSDetectMismatchHandler.reset(); + PP.RemovePragmaHandler(MSPointersToMembers.get()); + MSPointersToMembers.reset(); + PP.RemovePragmaHandler(MSVtorDisp.get()); + MSVtorDisp.reset(); + } + + PP.RemovePragmaHandler("STDC", FPContractHandler.get()); + FPContractHandler.reset(); +} + /// \brief Handle the annotation token produced for #pragma unused(...) /// /// Each annot_pragma_unused is followed by the argument token so e.g. diff --git a/clang/lib/Parse/ParsePragma.h b/clang/lib/Parse/ParsePragma.h deleted file mode 100644 index 73db5725042..00000000000 --- a/clang/lib/Parse/ParsePragma.h +++ /dev/null @@ -1,153 +0,0 @@ -//===---- ParserPragmas.h - Language specific pragmas -----------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines #pragma handlers for language specific pragmas. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_PARSE_PARSEPRAGMA_H -#define LLVM_CLANG_PARSE_PARSEPRAGMA_H - -#include "clang/Lex/Pragma.h" - -namespace clang { - class Sema; - class Parser; - -class PragmaAlignHandler : public PragmaHandler { -public: - explicit PragmaAlignHandler() : PragmaHandler("align") {} - - virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, - Token &FirstToken); -}; - -class PragmaGCCVisibilityHandler : public PragmaHandler { -public: - explicit PragmaGCCVisibilityHandler() : PragmaHandler("visibility") {} - - virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, - Token &FirstToken); -}; - -class PragmaOptionsHandler : public PragmaHandler { -public: - explicit PragmaOptionsHandler() : PragmaHandler("options") {} - - virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, - Token &FirstToken); -}; - -class PragmaPackHandler : public PragmaHandler { -public: - explicit PragmaPackHandler() : PragmaHandler("pack") {} - - virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, - Token &FirstToken); -}; - -class PragmaMSStructHandler : public PragmaHandler { -public: - explicit PragmaMSStructHandler() : PragmaHandler("ms_struct") {} - - virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, - Token &FirstToken); -}; - -class PragmaUnusedHandler : public PragmaHandler { -public: - PragmaUnusedHandler() : PragmaHandler("unused") {} - - virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, - Token &FirstToken); -}; - -class PragmaWeakHandler : public PragmaHandler { -public: - explicit PragmaWeakHandler() : PragmaHandler("weak") {} - - virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, - Token &FirstToken); -}; - -class PragmaRedefineExtnameHandler : public PragmaHandler { -public: - explicit PragmaRedefineExtnameHandler() : PragmaHandler("redefine_extname") {} - - virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, - Token &FirstToken); -}; - -class PragmaOpenCLExtensionHandler : public PragmaHandler { -public: - PragmaOpenCLExtensionHandler() : PragmaHandler("EXTENSION") {} - virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, - Token &FirstToken); -}; - - -class PragmaFPContractHandler : public PragmaHandler { -public: - PragmaFPContractHandler() : PragmaHandler("FP_CONTRACT") {} - virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, - Token &FirstToken); -}; - -class PragmaNoOpenMPHandler : public PragmaHandler { -public: - PragmaNoOpenMPHandler() : PragmaHandler("omp") { } - virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, - Token &FirstToken); -}; - -class PragmaOpenMPHandler : public PragmaHandler { -public: - PragmaOpenMPHandler() : PragmaHandler("omp") { } - virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, - Token &FirstToken); -}; - -/// PragmaCommentHandler - "\#pragma comment ...". -class PragmaCommentHandler : public PragmaHandler { -public: - PragmaCommentHandler(Sema &Actions) - : PragmaHandler("comment"), Actions(Actions) {} - virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, - Token &FirstToken); -private: - Sema &Actions; -}; - -class PragmaDetectMismatchHandler : public PragmaHandler { -public: - PragmaDetectMismatchHandler(Sema &Actions) - : PragmaHandler("detect_mismatch"), Actions(Actions) {} - virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, - Token &FirstToken); -private: - Sema &Actions; -}; - -class PragmaMSPointersToMembers : public PragmaHandler { -public: - explicit PragmaMSPointersToMembers() : PragmaHandler("pointers_to_members") {} - virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, - Token &FirstToken); -}; - -class PragmaMSVtorDisp : public PragmaHandler { -public: - explicit PragmaMSVtorDisp() : PragmaHandler("vtordisp") {} - virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, - Token &FirstToken); -}; - -} // end namespace clang - -#endif diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp index 5752959a5a3..71f5b845ddd 100644 --- a/clang/lib/Parse/Parser.cpp +++ b/clang/lib/Parse/Parser.cpp @@ -12,7 +12,6 @@ //===----------------------------------------------------------------------===// #include "clang/Parse/Parser.h" -#include "ParsePragma.h" #include "RAIIObjectsForParser.h" #include "clang/AST/ASTConsumer.h" #include "clang/AST/ASTContext.h" @@ -64,55 +63,7 @@ Parser::Parser(Preprocessor &pp, Sema &actions, bool skipFunctionBodies) // Add #pragma handlers. These are removed and destroyed in the // destructor. - AlignHandler.reset(new PragmaAlignHandler()); - PP.AddPragmaHandler(AlignHandler.get()); - - GCCVisibilityHandler.reset(new PragmaGCCVisibilityHandler()); - PP.AddPragmaHandler("GCC", GCCVisibilityHandler.get()); - - OptionsHandler.reset(new PragmaOptionsHandler()); - PP.AddPragmaHandler(OptionsHandler.get()); - - PackHandler.reset(new PragmaPackHandler()); - PP.AddPragmaHandler(PackHandler.get()); - - MSStructHandler.reset(new PragmaMSStructHandler()); - PP.AddPragmaHandler(MSStructHandler.get()); - - UnusedHandler.reset(new PragmaUnusedHandler()); - PP.AddPragmaHandler(UnusedHandler.get()); - - WeakHandler.reset(new PragmaWeakHandler()); - PP.AddPragmaHandler(WeakHandler.get()); - - RedefineExtnameHandler.reset(new PragmaRedefineExtnameHandler()); - PP.AddPragmaHandler(RedefineExtnameHandler.get()); - - FPContractHandler.reset(new PragmaFPContractHandler()); - PP.AddPragmaHandler("STDC", FPContractHandler.get()); - - if (getLangOpts().OpenCL) { - OpenCLExtensionHandler.reset(new PragmaOpenCLExtensionHandler()); - PP.AddPragmaHandler("OPENCL", OpenCLExtensionHandler.get()); - - PP.AddPragmaHandler("OPENCL", FPContractHandler.get()); - } - if (getLangOpts().OpenMP) - OpenMPHandler.reset(new PragmaOpenMPHandler()); - else - OpenMPHandler.reset(new PragmaNoOpenMPHandler()); - PP.AddPragmaHandler(OpenMPHandler.get()); - - if (getLangOpts().MicrosoftExt) { - MSCommentHandler.reset(new PragmaCommentHandler(actions)); - PP.AddPragmaHandler(MSCommentHandler.get()); - MSDetectMismatchHandler.reset(new PragmaDetectMismatchHandler(actions)); - PP.AddPragmaHandler(MSDetectMismatchHandler.get()); - MSPointersToMembers.reset(new PragmaMSPointersToMembers()); - PP.AddPragmaHandler(MSPointersToMembers.get()); - MSVtorDisp.reset(new PragmaMSVtorDisp()); - PP.AddPragmaHandler(MSVtorDisp.get()); - } + initializePragmaHandlers(); CommentSemaHandler.reset(new ActionCommentHandler(actions)); PP.addCommentHandler(CommentSemaHandler.get()); @@ -456,45 +407,7 @@ Parser::~Parser() { for (unsigned i = 0, e = NumCachedScopes; i != e; ++i) delete ScopeCache[i]; - // Remove the pragma handlers we installed. - PP.RemovePragmaHandler(AlignHandler.get()); - AlignHandler.reset(); - PP.RemovePragmaHandler("GCC", GCCVisibilityHandler.get()); - GCCVisibilityHandler.reset(); - PP.RemovePragmaHandler(OptionsHandler.get()); - OptionsHandler.reset(); - PP.RemovePragmaHandler(PackHandler.get()); - PackHandler.reset(); - PP.RemovePragmaHandler(MSStructHandler.get()); - MSStructHandler.reset(); - PP.RemovePragmaHandler(UnusedHandler.get()); - UnusedHandler.reset(); - PP.RemovePragmaHandler(WeakHandler.get()); - WeakHandler.reset(); - PP.RemovePragmaHandler(RedefineExtnameHandler.get()); - RedefineExtnameHandler.reset(); - - if (getLangOpts().OpenCL) { - PP.RemovePragmaHandler("OPENCL", OpenCLExtensionHandler.get()); - OpenCLExtensionHandler.reset(); - PP.RemovePragmaHandler("OPENCL", FPContractHandler.get()); - } - PP.RemovePragmaHandler(OpenMPHandler.get()); - OpenMPHandler.reset(); - - if (getLangOpts().MicrosoftExt) { - PP.RemovePragmaHandler(MSCommentHandler.get()); - MSCommentHandler.reset(); - PP.RemovePragmaHandler(MSDetectMismatchHandler.get()); - MSDetectMismatchHandler.reset(); - PP.RemovePragmaHandler(MSPointersToMembers.get()); - MSPointersToMembers.reset(); - PP.RemovePragmaHandler(MSVtorDisp.get()); - MSVtorDisp.reset(); - } - - PP.RemovePragmaHandler("STDC", FPContractHandler.get()); - FPContractHandler.reset(); + resetPragmaHandlers(); PP.removeCommentHandler(CommentSemaHandler.get()); |