diff options
Diffstat (limited to 'contrib/llvm/tools/clang/include/clang/Frontend')
20 files changed, 511 insertions, 403 deletions
diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/ASTConsumers.h b/contrib/llvm/tools/clang/include/clang/Frontend/ASTConsumers.h index 9163a20..2d1df44 100644 --- a/contrib/llvm/tools/clang/include/clang/Frontend/ASTConsumers.h +++ b/contrib/llvm/tools/clang/include/clang/Frontend/ASTConsumers.h @@ -29,6 +29,7 @@ class CodeGenOptions; class Diagnostic; class FileManager; class LangOptions; +class PCHReader; class Preprocessor; class TargetOptions; @@ -57,25 +58,12 @@ ASTConsumer *CreateASTViewer(); // to stderr; this is intended for debugging. ASTConsumer *CreateDeclContextPrinter(); -// ObjC rewriter: attempts tp rewrite ObjC constructs into pure C code. -// This is considered experimental, and only works with Apple's ObjC runtime. -ASTConsumer *CreateObjCRewriter(const std::string &InFile, - llvm::raw_ostream *OS, - Diagnostic &Diags, - const LangOptions &LOpts, - bool SilenceRewriteMacroWarning); - -/// CreateHTMLPrinter - Create an AST consumer which rewrites source code to -/// HTML with syntax highlighting suitable for viewing in a web-browser. -ASTConsumer *CreateHTMLPrinter(llvm::raw_ostream *OS, Preprocessor &PP, - bool SyntaxHighlight = true, - bool HighlightMacros = true); - // PCH generator: generates a precompiled header file; this file can be used // later with the PCHReader (clang -cc1 option -include-pch) to speed up compile // times. ASTConsumer *CreatePCHGenerator(const Preprocessor &PP, llvm::raw_ostream *OS, + PCHReader *Chain, const char *isysroot = 0); // Inheritance viewer: for C++ code, creates a graph of the inheritance diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/AnalysisConsumer.h b/contrib/llvm/tools/clang/include/clang/Frontend/AnalyzerOptions.h index 2cbdf36..ab4aed9 100644 --- a/contrib/llvm/tools/clang/include/clang/Frontend/AnalysisConsumer.h +++ b/contrib/llvm/tools/clang/include/clang/Frontend/AnalyzerOptions.h @@ -1,4 +1,4 @@ -//===--- AnalysisConsumer.h - Front-end Analysis Engine Hooks ---*- C++ -*-===// +//===--- AnalyzerOptions.h - Analysis Engine Options ------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -7,13 +7,13 @@ // //===----------------------------------------------------------------------===// // -// This header contains the functions necessary for a front-end to run various -// analyses. +// This header contains the structures necessary for a front-end to specify +// various analyses. // //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_FRONTEND_ANALYSISCONSUMER_H -#define LLVM_CLANG_FRONTEND_ANALYSISCONSUMER_H +#ifndef LLVM_CLANG_FRONTEND_ANALYZEROPTIONS_H +#define LLVM_CLANG_FRONTEND_ANALYZEROPTIONS_H #include <string> #include <vector> @@ -72,6 +72,7 @@ public: unsigned VisualizeEGUbi : 1; unsigned EnableExperimentalChecks : 1; unsigned EnableExperimentalInternalChecks : 1; + unsigned EnableIdempotentOperationChecker : 1; unsigned InlineCall : 1; public: @@ -92,13 +93,6 @@ public: } }; -/// CreateAnalysisConsumer - Creates an ASTConsumer to run various code -/// analysis passes. (The set of analyses run is controlled by command-line -/// options.) -ASTConsumer* CreateAnalysisConsumer(const Preprocessor &pp, - const std::string &output, - const AnalyzerOptions& Opts); - } #endif diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/CodeGenAction.h b/contrib/llvm/tools/clang/include/clang/Frontend/CodeGenAction.h deleted file mode 100644 index dfc117a..0000000 --- a/contrib/llvm/tools/clang/include/clang/Frontend/CodeGenAction.h +++ /dev/null @@ -1,70 +0,0 @@ -//===--- CodeGenAction.h - LLVM Code Generation Frontend Action -*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "clang/Frontend/FrontendAction.h" -#include "llvm/ADT/OwningPtr.h" - -namespace llvm { - class Module; -} - -namespace clang { - -class CodeGenAction : public ASTFrontendAction { -private: - unsigned Act; - llvm::OwningPtr<llvm::Module> TheModule; - -protected: - CodeGenAction(unsigned _Act); - - virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, - llvm::StringRef InFile); - - virtual void EndSourceFileAction(); - -public: - ~CodeGenAction(); - - /// takeModule - Take the generated LLVM module, for use after the action has - /// been run. The result may be null on failure. - llvm::Module *takeModule(); -}; - -class EmitAssemblyAction : public CodeGenAction { -public: - EmitAssemblyAction(); -}; - -class EmitBCAction : public CodeGenAction { -public: - EmitBCAction(); -}; - -class EmitLLVMAction : public CodeGenAction { -public: - EmitLLVMAction(); -}; - -class EmitLLVMOnlyAction : public CodeGenAction { -public: - EmitLLVMOnlyAction(); -}; - -class EmitCodeGenOnlyAction : public CodeGenAction { -public: - EmitCodeGenOnlyAction(); -}; - -class EmitObjAction : public CodeGenAction { -public: - EmitObjAction(); -}; - -} diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/CodeGenOptions.h b/contrib/llvm/tools/clang/include/clang/Frontend/CodeGenOptions.h new file mode 100644 index 0000000..2918f4e --- /dev/null +++ b/contrib/llvm/tools/clang/include/clang/Frontend/CodeGenOptions.h @@ -0,0 +1,141 @@ +//===--- CodeGenOptions.h ---------------------------------------*- 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 the CodeGenOptions interface. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_FRONTEND_CODEGENOPTIONS_H +#define LLVM_CLANG_FRONTEND_CODEGENOPTIONS_H + +#include <string> + +namespace clang { + +/// CodeGenOptions - Track various options which control how the code +/// is optimized and passed to the backend. +class CodeGenOptions { +public: + enum InliningMethod { + NoInlining, // Perform no inlining whatsoever. + NormalInlining, // Use the standard function inlining pass. + OnlyAlwaysInlining // Only run the always inlining pass. + }; + + enum ObjCDispatchMethodKind { + Legacy = 0, + NonLegacy = 1, + Mixed = 2 + }; + + unsigned AsmVerbose : 1; /// -dA, -fverbose-asm. + unsigned CXAAtExit : 1; /// Use __cxa_atexit for calling destructors. + unsigned CXXCtorDtorAliases: 1; /// Emit complete ctors/dtors as linker + /// aliases to base ctors when possible. + unsigned DataSections : 1; /// Set when -fdata-sections is enabled + unsigned DebugInfo : 1; /// Should generate debug info (-g). + unsigned DisableFPElim : 1; /// Set when -fomit-frame-pointer is enabled. + unsigned DisableLLVMOpts : 1; /// Don't run any optimizations, for use in + /// getting .bc files that correspond to the + /// internal state before optimizations are + /// done. + unsigned DisableRedZone : 1; /// Set when -mno-red-zone is enabled. + unsigned FunctionSections : 1; /// Set when -ffunction-sections is enabled + unsigned InstrumentFunctions : 1; /// Set when -finstrument-functions is enabled + unsigned MergeAllConstants : 1; /// Merge identical constants. + unsigned NoCommon : 1; /// Set when -fno-common or C++ is enabled. + unsigned NoImplicitFloat : 1; /// Set when -mno-implicit-float is enabled. + unsigned NoZeroInitializedInBSS : 1; /// -fno-zero-initialized-in-bss + unsigned ObjCDispatchMethod : 2; /// Method of Objective-C dispatch to use. + unsigned OmitLeafFramePointer : 1; /// Set when -momit-leaf-frame-pointer is + /// enabled. + unsigned OptimizationLevel : 3; /// The -O[0-4] option specified. + unsigned OptimizeSize : 1; /// If -Os is specified. + unsigned RelaxAll : 1; /// Relax all machine code instructions. + unsigned SimplifyLibCalls : 1; /// Set when -fbuiltin is enabled. + unsigned SoftFloat : 1; /// -soft-float. + unsigned TimePasses : 1; /// Set when -ftime-report is enabled. + unsigned UnitAtATime : 1; /// Unused. For mirroring GCC optimization + /// selection. + unsigned UnrollLoops : 1; /// Control whether loops are unrolled. + unsigned UnwindTables : 1; /// Emit unwind tables. + unsigned VerifyModule : 1; /// Control whether the module should be run + /// through the LLVM Verifier. + unsigned EmitDeclMetadata : 1; /// Emit special metadata indicating what Decl* + /// various IR entities came from. Only useful + /// when running CodeGen as a subroutine. + + /// The code model to use (-mcmodel). + std::string CodeModel; + + /// Enable additional debugging information. + std::string DebugPass; + + /// The string to embed in the debug information for the compile unit, if + /// non-empty. + std::string DwarfDebugFlags; + + /// The ABI to use for passing floating point arguments. + std::string FloatABI; + + /// The float precision limit to use, if non-empty. + std::string LimitFloatPrecision; + + /// The kind of inlining to perform. + InliningMethod Inlining; + + /// The user provided name for the "main file", if non-empty. This is useful + /// in situations where the input file name does not match the original input + /// file, for example with -save-temps. + std::string MainFileName; + + /// The name of the relocation model to use. + std::string RelocationModel; + +public: + CodeGenOptions() { + AsmVerbose = 0; + CXAAtExit = 1; + CXXCtorDtorAliases = 0; + DataSections = 0; + DebugInfo = 0; + DisableFPElim = 0; + DisableLLVMOpts = 0; + DisableRedZone = 0; + FunctionSections = 0; + MergeAllConstants = 1; + NoCommon = 0; + NoImplicitFloat = 0; + NoZeroInitializedInBSS = 0; + ObjCDispatchMethod = Legacy; + OmitLeafFramePointer = 0; + OptimizationLevel = 0; + OptimizeSize = 0; + RelaxAll = 0; + SimplifyLibCalls = 1; + SoftFloat = 0; + TimePasses = 0; + UnitAtATime = 1; + UnrollLoops = 0; + UnwindTables = 0; + VerifyModule = 1; + EmitDeclMetadata = 0; + + Inlining = NoInlining; + RelocationModel = "pic"; + } + + ObjCDispatchMethodKind getObjCDispatchMethod() const { + return ObjCDispatchMethodKind(ObjCDispatchMethod); + } +}; + +} // end namespace clang + +#endif diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/CompilerInstance.h b/contrib/llvm/tools/clang/include/clang/Frontend/CompilerInstance.h index 06dc800..54ce8bf 100644 --- a/contrib/llvm/tools/clang/include/clang/Frontend/CompilerInstance.h +++ b/contrib/llvm/tools/clang/include/clang/Frontend/CompilerInstance.h @@ -34,6 +34,7 @@ class DiagnosticClient; class ExternalASTSource; class FileManager; class FrontendAction; +class PCHReader; class Preprocessor; class SourceManager; class TargetInfo; @@ -96,6 +97,9 @@ class CompilerInstance { /// The list of active output files. std::list< std::pair<std::string, llvm::raw_ostream*> > OutputFiles; + /// The PCH reader. Not owned; the ASTContext owns this. + PCHReader *Reader; + void operator=(const CompilerInstance &); // DO NOT IMPLEMENT CompilerInstance(const CompilerInstance&); // DO NOT IMPLEMENT public: @@ -507,6 +511,9 @@ public: createPCHExternalASTSource(llvm::StringRef Path, const std::string &Sysroot, Preprocessor &PP, ASTContext &Context); + /// Get the PCH reader, if any. + PCHReader *getPCHReader() { return Reader; } + /// Create a code completion consumer using the invocation; note that this /// will cause the source manager to truncate the input source file at the /// completion point. diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/CompilerInvocation.h b/contrib/llvm/tools/clang/include/clang/Frontend/CompilerInvocation.h index f5a9053..d558ad3 100644 --- a/contrib/llvm/tools/clang/include/clang/Frontend/CompilerInvocation.h +++ b/contrib/llvm/tools/clang/include/clang/Frontend/CompilerInvocation.h @@ -12,8 +12,8 @@ #include "clang/Basic/LangOptions.h" #include "clang/Basic/TargetOptions.h" -#include "clang/CodeGen/CodeGenOptions.h" -#include "clang/Frontend/AnalysisConsumer.h" +#include "clang/Frontend/AnalyzerOptions.h" +#include "clang/Frontend/CodeGenOptions.h" #include "clang/Frontend/DependencyOutputOptions.h" #include "clang/Frontend/DiagnosticOptions.h" #include "clang/Frontend/FrontendOptions.h" diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/DiagnosticOptions.h b/contrib/llvm/tools/clang/include/clang/Frontend/DiagnosticOptions.h index 8eb66e5..516dc67 100644 --- a/contrib/llvm/tools/clang/include/clang/Frontend/DiagnosticOptions.h +++ b/contrib/llvm/tools/clang/include/clang/Frontend/DiagnosticOptions.h @@ -10,6 +10,8 @@ #ifndef LLVM_CLANG_FRONTEND_DIAGNOSTICOPTIONS_H #define LLVM_CLANG_FRONTEND_DIAGNOSTICOPTIONS_H +#include "clang/Basic/Diagnostic.h" + #include <string> #include <vector> @@ -33,6 +35,8 @@ public: unsigned ShowCategories : 2; /// Show categories: 0 -> none, 1 -> Number, /// 2 -> Full Name. unsigned ShowColors : 1; /// Show diagnostics with ANSI color sequences. + unsigned ShowOverloads : 1; /// Overload candidates to show. Values from + /// Diagnostic::OverloadsShown unsigned VerifyDiagnostics: 1; /// Check that diagnostics match the expected /// diagnostics, indicated by markers in the /// input source file. @@ -72,6 +76,7 @@ public: PedanticErrors = 0; ShowCarets = 1; ShowColors = 0; + ShowOverloads = Diagnostic::Ovl_All; ShowColumn = 1; ShowFixits = 1; ShowLocation = 1; diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/FixItRewriter.h b/contrib/llvm/tools/clang/include/clang/Frontend/FixItRewriter.h deleted file mode 100644 index b432d74..0000000 --- a/contrib/llvm/tools/clang/include/clang/Frontend/FixItRewriter.h +++ /dev/null @@ -1,104 +0,0 @@ -//===--- FixItRewriter.h - Fix-It Rewriter Diagnostic Client ----*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This is a diagnostic client adaptor that performs rewrites as -// suggested by code modification hints attached to diagnostics. It -// then forwards any diagnostics to the adapted diagnostic client. -// -//===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_FRONTEND_FIX_IT_REWRITER_H -#define LLVM_CLANG_FRONTEND_FIX_IT_REWRITER_H - -#include "clang/Basic/Diagnostic.h" -#include "clang/Basic/SourceLocation.h" -#include "clang/Rewrite/Rewriter.h" -#include "llvm/ADT/SmallVector.h" - -namespace llvm { class raw_ostream; } - -namespace clang { - -class SourceManager; -class FileEntry; - -class FixItPathRewriter { -public: - virtual ~FixItPathRewriter(); - - /// \brief This file is about to be rewritten. Return the name of the file - /// that is okay to write to. - virtual std::string RewriteFilename(const std::string &Filename) = 0; -}; - -class FixItRewriter : public DiagnosticClient { - /// \brief The diagnostics machinery. - Diagnostic &Diags; - - /// \brief The rewriter used to perform the various code - /// modifications. - Rewriter Rewrite; - - /// \brief The diagnostic client that performs the actual formatting - /// of error messages. - DiagnosticClient *Client; - - /// \brief Turn an input path into an output path. NULL implies overwriting - /// the original. - FixItPathRewriter *PathRewriter; - - /// \brief The number of rewriter failures. - unsigned NumFailures; - -public: - typedef Rewriter::buffer_iterator iterator; - - /// \brief Initialize a new fix-it rewriter. - FixItRewriter(Diagnostic &Diags, SourceManager &SourceMgr, - const LangOptions &LangOpts, FixItPathRewriter *PathRewriter); - - /// \brief Destroy the fix-it rewriter. - ~FixItRewriter(); - - /// \brief Check whether there are modifications for a given file. - bool IsModified(FileID ID) const { - return Rewrite.getRewriteBufferFor(ID) != NULL; - } - - // Iteration over files with changes. - iterator buffer_begin() { return Rewrite.buffer_begin(); } - iterator buffer_end() { return Rewrite.buffer_end(); } - - /// \brief Write a single modified source file. - /// - /// \returns true if there was an error, false otherwise. - bool WriteFixedFile(FileID ID, llvm::raw_ostream &OS); - - /// \brief Write the modified source files. - /// - /// \returns true if there was an error, false otherwise. - bool WriteFixedFiles(); - - /// IncludeInDiagnosticCounts - This method (whose default implementation - /// returns true) indicates whether the diagnostics handled by this - /// DiagnosticClient should be included in the number of diagnostics - /// reported by Diagnostic. - virtual bool IncludeInDiagnosticCounts() const; - - /// HandleDiagnostic - Handle this diagnostic, reporting it to the user or - /// capturing it to a log as needed. - virtual void HandleDiagnostic(Diagnostic::Level DiagLevel, - const DiagnosticInfo &Info); - - /// \brief Emit a diagnostic via the adapted diagnostic client. - void Diag(FullSourceLoc Loc, unsigned DiagID); -}; - -} - -#endif // LLVM_CLANG_FRONTEND_FIX_IT_REWRITER_H diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/FrontendAction.h b/contrib/llvm/tools/clang/include/clang/Frontend/FrontendAction.h index 7b7db37..f6a68bf 100644 --- a/contrib/llvm/tools/clang/include/clang/Frontend/FrontendAction.h +++ b/contrib/llvm/tools/clang/include/clang/Frontend/FrontendAction.h @@ -13,17 +13,40 @@ #include "llvm/ADT/StringRef.h" #include "llvm/ADT/OwningPtr.h" #include <string> +#include <vector> + +namespace llvm { + class raw_ostream; +} namespace clang { -class ASTUnit; class ASTConsumer; -class CompilerInstance; class ASTMergeAction; +class ASTUnit; +class CompilerInstance; + +enum InputKind { + IK_None, + IK_Asm, + IK_C, + IK_CXX, + IK_ObjC, + IK_ObjCXX, + IK_PreprocessedC, + IK_PreprocessedCXX, + IK_PreprocessedObjC, + IK_PreprocessedObjCXX, + IK_OpenCL, + IK_AST, + IK_LLVM_IR +}; + /// FrontendAction - Abstract base class for actions which can be performed by /// the frontend. class FrontendAction { std::string CurrentFile; + InputKind CurrentFileKind; llvm::OwningPtr<ASTUnit> CurrentASTUnit; CompilerInstance *Instance; friend class ASTMergeAction; @@ -101,6 +124,11 @@ public: return CurrentFile; } + InputKind getCurrentFileKind() const { + assert(!CurrentFile.empty() && "No current file!"); + return CurrentFileKind; + } + ASTUnit &getCurrentASTUnit() const { assert(!CurrentASTUnit && "No current AST unit!"); return *CurrentASTUnit; @@ -110,7 +138,7 @@ public: return CurrentASTUnit.take(); } - void setCurrentFile(llvm::StringRef Value, ASTUnit *AST = 0); + void setCurrentFile(llvm::StringRef Value, InputKind Kind, ASTUnit *AST = 0); /// @} /// @name Supported Modes @@ -128,8 +156,11 @@ public: /// hasPCHSupport - Does this action support use with PCH? virtual bool hasPCHSupport() const { return !usesPreprocessorOnly(); } - /// hasASTSupport - Does this action support use with AST files? - virtual bool hasASTSupport() const { return !usesPreprocessorOnly(); } + /// hasASTFileSupport - Does this action support use with AST files? + virtual bool hasASTFileSupport() const { return !usesPreprocessorOnly(); } + + /// hasIRSupport - Does this action support use with IR files? + virtual bool hasIRSupport() const { return false; } /// hasCodeCompletionSupport - Does this action support use with code /// completion? @@ -150,17 +181,18 @@ public: /// \param Filename - The input filename, which will be made available to /// clients via \see getCurrentFile(). /// - /// \param IsAST - Indicates whether this is an AST input. AST inputs require - /// special handling, since the AST file itself contains several objects which - /// would normally be owned by the CompilerInstance. When processing AST input - /// files, these objects should generally not be initialized in the - /// CompilerInstance -- they will automatically be shared with the AST file in - /// between \see BeginSourceFile() and \see EndSourceFile(). + /// \param InputKind - The type of input. Some input kinds are handled + /// specially, for example AST inputs, since the AST file itself contains + /// several objects which would normally be owned by the + /// CompilerInstance. When processing AST input files, these objects should + /// generally not be initialized in the CompilerInstance -- they will + /// automatically be shared with the AST file in between \see + /// BeginSourceFile() and \see EndSourceFile(). /// /// \return True on success; the compilation of this file should be aborted /// and neither Execute nor EndSourceFile should be called. bool BeginSourceFile(CompilerInstance &CI, llvm::StringRef Filename, - bool IsAST = false); + InputKind Kind); /// Execute - Set the source managers main input file, and run the action. void Execute(); @@ -175,6 +207,7 @@ public: /// ASTFrontendAction - Abstract base class to use for AST consumer based /// frontend actions. class ASTFrontendAction : public FrontendAction { +protected: /// ExecuteAction - Implement the ExecuteAction interface by running Sema on /// the already initialized AST consumer. /// @@ -186,6 +219,16 @@ public: virtual bool usesPreprocessorOnly() const { return false; } }; +class PluginASTAction : public ASTFrontendAction { +protected: + virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, + llvm::StringRef InFile) = 0; + +public: + virtual bool ParseArgs(const std::vector<std::string>& arg) = 0; + virtual void PrintHelp(llvm::raw_ostream&) = 0; +}; + /// PreprocessorFrontendAction - Abstract base class to use for preprocessor /// based frontend actions. class PreprocessorFrontendAction : public FrontendAction { diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/FrontendActions.h b/contrib/llvm/tools/clang/include/clang/Frontend/FrontendActions.h index cee1c1d..26262cf 100644 --- a/contrib/llvm/tools/clang/include/clang/Frontend/FrontendActions.h +++ b/contrib/llvm/tools/clang/include/clang/Frontend/FrontendActions.h @@ -15,8 +15,6 @@ #include <vector> namespace clang { -class FixItRewriter; -class FixItPathRewriter; //===----------------------------------------------------------------------===// // Custom Consumer Actions @@ -38,12 +36,6 @@ public: // AST Consumer Actions //===----------------------------------------------------------------------===// -class AnalysisAction : public ASTFrontendAction { -protected: - virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, - llvm::StringRef InFile); -}; - class ASTPrintAction : public ASTFrontendAction { protected: virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, @@ -74,26 +66,6 @@ protected: llvm::StringRef InFile); }; -class FixItAction : public ASTFrontendAction { -protected: - llvm::OwningPtr<FixItRewriter> Rewriter; - llvm::OwningPtr<FixItPathRewriter> PathRewriter; - - virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, - llvm::StringRef InFile); - - virtual bool BeginSourceFileAction(CompilerInstance &CI, - llvm::StringRef Filename); - - virtual void EndSourceFileAction(); - - virtual bool hasASTSupport() const { return false; } - -public: - FixItAction(); - ~FixItAction(); -}; - class GeneratePCHAction : public ASTFrontendAction { protected: virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, @@ -101,13 +73,7 @@ protected: virtual bool usesCompleteTranslationUnit() { return false; } - virtual bool hasASTSupport() const { return false; } -}; - -class HTMLPrintAction : public ASTFrontendAction { -protected: - virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, - llvm::StringRef InFile); + virtual bool hasASTFileSupport() const { return false; } }; class InheritanceViewAction : public ASTFrontendAction { @@ -116,12 +82,6 @@ protected: llvm::StringRef InFile); }; -class RewriteObjCAction : public ASTFrontendAction { -protected: - virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, - llvm::StringRef InFile); -}; - class SyntaxOnlyAction : public ASTFrontendAction { protected: virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, @@ -170,7 +130,7 @@ public: virtual bool usesPreprocessorOnly() const; virtual bool usesCompleteTranslationUnit(); virtual bool hasPCHSupport() const; - virtual bool hasASTSupport() const; + virtual bool hasASTFileSupport() const; virtual bool hasCodeCompletionSupport() const; }; @@ -215,16 +175,6 @@ protected: virtual bool hasPCHSupport() const { return true; } }; -class RewriteMacrosAction : public PreprocessorFrontendAction { -protected: - void ExecuteAction(); -}; - -class RewriteTestAction : public PreprocessorFrontendAction { -protected: - void ExecuteAction(); -}; - } // end namespace clang #endif diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/FrontendOptions.h b/contrib/llvm/tools/clang/include/clang/Frontend/FrontendOptions.h index c43e680..4010ea6 100644 --- a/contrib/llvm/tools/clang/include/clang/Frontend/FrontendOptions.h +++ b/contrib/llvm/tools/clang/include/clang/Frontend/FrontendOptions.h @@ -11,6 +11,7 @@ #define LLVM_CLANG_FRONTEND_FRONTENDOPTIONS_H #include "clang/Frontend/CommandLineSourceLoc.h" +#include "clang/Frontend/FrontendAction.h" #include "llvm/ADT/StringRef.h" #include <string> #include <vector> @@ -55,27 +56,15 @@ namespace frontend { /// FrontendOptions - Options for controlling the behavior of the frontend. class FrontendOptions { public: - enum InputKind { - IK_None, - IK_Asm, - IK_C, - IK_CXX, - IK_ObjC, - IK_ObjCXX, - IK_PreprocessedC, - IK_PreprocessedCXX, - IK_PreprocessedObjC, - IK_PreprocessedObjCXX, - IK_OpenCL, - IK_AST - }; - unsigned DebugCodeCompletionPrinter : 1; ///< Use the debug printer for code /// completion results. unsigned DisableFree : 1; ///< Disable memory freeing on exit. unsigned RelocatablePCH : 1; ///< When generating PCH files, /// instruct the PCH writer to create /// relocatable PCH files. + unsigned ChainedPCH : 1; ///< When generating PCH files, + /// instruct the PCH writer to create + /// chained PCH files. unsigned ShowHelp : 1; ///< Show the -help text. unsigned ShowMacrosInCodeCompletion : 1; ///< Show macros in code completion /// results. @@ -108,6 +97,9 @@ public: /// The name of the action to run when using a plugin action. std::string ActionName; + /// Arg to pass to the plugin + std::vector<std::string> PluginArgs; + /// The list of plugins to load. std::vector<std::string> Plugins; @@ -125,6 +117,7 @@ public: ProgramAction = frontend::ParseSyntaxOnly; ActionName = ""; RelocatablePCH = 0; + ChainedPCH = 0; ShowHelp = 0; ShowMacrosInCodeCompletion = 0; ShowCodePatternsInCodeCompletion = 0; diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/FrontendPluginRegistry.h b/contrib/llvm/tools/clang/include/clang/Frontend/FrontendPluginRegistry.h index 8341492..ec925ad 100644 --- a/contrib/llvm/tools/clang/include/clang/Frontend/FrontendPluginRegistry.h +++ b/contrib/llvm/tools/clang/include/clang/Frontend/FrontendPluginRegistry.h @@ -16,7 +16,7 @@ namespace clang { /// The frontend plugin registry. -typedef llvm::Registry<FrontendAction> FrontendPluginRegistry; +typedef llvm::Registry<PluginASTAction> FrontendPluginRegistry; } // end namespace clang diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/PCHBitCodes.h b/contrib/llvm/tools/clang/include/clang/Frontend/PCHBitCodes.h index 2493cfd..27a2b7d 100644 --- a/contrib/llvm/tools/clang/include/clang/Frontend/PCHBitCodes.h +++ b/contrib/llvm/tools/clang/include/clang/Frontend/PCHBitCodes.h @@ -30,10 +30,10 @@ namespace clang { /// designed for the previous version could not support reading /// the new version), this number should be increased. /// - /// Version 3 of PCH files also requires that the version control branch and + /// Version 4 of PCH files also requires that the version control branch and /// revision match exactly, since there is no backward compatibility of /// PCH files at this time. - const unsigned VERSION_MAJOR = 3; + const unsigned VERSION_MAJOR = 4; /// \brief PCH minor version number supported by this version of /// Clang. @@ -47,7 +47,7 @@ namespace clang { /// \brief An ID number that refers to a declaration in a PCH file. /// - /// The ID numbers of types are consecutive (in order of + /// The ID numbers of declarations are consecutive (in order of /// discovery) and start at 2. 0 is reserved for NULL, and 1 is /// reserved for the translation unit declaration. typedef uint32_t DeclID; @@ -226,7 +226,18 @@ namespace clang { /// \brief Record code for the table of offsets to macro definition /// entries in the preprocessing record. - MACRO_DEFINITION_OFFSETS = 23 + MACRO_DEFINITION_OFFSETS = 23, + + /// \brief Record code for the array of VTable uses. + VTABLE_USES = 24, + + /// \brief Record code for the array of dynamic classes. + DYNAMIC_CLASSES = 25, + + /// \brief Record code for the chained PCH metadata, including the + /// PCH version and the name of the PCH this is chained to. + CHAINED_METADATA = 26 + }; /// \brief Record types used within a source manager block. @@ -417,7 +428,17 @@ namespace clang { /// \brief An InjectedClassNameType record. TYPE_INJECTED_CLASS_NAME = 27, /// \brief An ObjCObjectType record. - TYPE_OBJC_OBJECT = 28 + TYPE_OBJC_OBJECT = 28, + /// \brief An TemplateTypeParmType record. + TYPE_TEMPLATE_TYPE_PARM = 29, + /// \brief An TemplateSpecializationType record. + TYPE_TEMPLATE_SPECIALIZATION = 30, + /// \brief A DependentNameType record. + TYPE_DEPENDENT_NAME = 31, + /// \brief A DependentTemplateSpecializationType record. + TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION = 32, + /// \brief A DependentSizedArrayType record. + TYPE_DEPENDENT_SIZED_ARRAY = 33 }; /// \brief The type IDs for special types constructed by semantic @@ -457,7 +478,9 @@ namespace clang { /// \brief Objective-C "SEL" redefinition type SPECIAL_TYPE_OBJC_SEL_REDEFINITION = 14, /// \brief NSConstantString type - SPECIAL_TYPE_NS_CONSTANT_STRING = 15 + SPECIAL_TYPE_NS_CONSTANT_STRING = 15, + /// \brief Whether __[u]int128_t identifier is installed. + SPECIAL_TYPE_INT128_INSTALLED = 16 }; /// \brief Record codes for each kind of declaration. @@ -562,12 +585,13 @@ namespace clang { DECL_CXX_DESTRUCTOR, /// \brief A CXXConversionDecl record. DECL_CXX_CONVERSION, + /// \brief An AccessSpecDecl record. + DECL_ACCESS_SPEC, // FIXME: Implement serialization for these decl types. This just // allocates the order in which DECL_FRIEND, DECL_FRIEND_TEMPLATE, - DECL_TEMPLATE, DECL_CLASS_TEMPLATE, DECL_CLASS_TEMPLATE_SPECIALIZATION, DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION, @@ -641,6 +665,8 @@ namespace clang { EXPR_CHARACTER_LITERAL, /// \brief A ParenExpr record. EXPR_PAREN, + /// \brief A ParenListExpr record. + EXPR_PAREN_LIST, /// \brief A UnaryOperator record. EXPR_UNARY_OPERATOR, /// \brief An OffsetOfExpr record. @@ -736,6 +762,8 @@ namespace clang { EXPR_CXX_MEMBER_CALL, /// \brief A CXXConstructExpr record. EXPR_CXX_CONSTRUCT, + /// \brief A CXXTemporaryObjectExpr record. + EXPR_CXX_TEMPORARY_OBJECT, // \brief A CXXStaticCastExpr record. EXPR_CXX_STATIC_CAST, // \brief A CXXDynamicCastExpr record. @@ -755,11 +783,22 @@ namespace clang { EXPR_CXX_THROW, // CXXThrowExpr EXPR_CXX_DEFAULT_ARG, // CXXDefaultArgExpr EXPR_CXX_BIND_TEMPORARY, // CXXBindTemporaryExpr - // - EXPR_CXX_ZERO_INIT_VALUE, // CXXZeroInitValueExpr + EXPR_CXX_BIND_REFERENCE, // CXXBindReferenceExpr + + EXPR_CXX_SCALAR_VALUE_INIT, // CXXScalarValueInitExpr EXPR_CXX_NEW, // CXXNewExpr + EXPR_CXX_DELETE, // CXXDeleteExpr + EXPR_CXX_PSEUDO_DESTRUCTOR, // CXXPseudoDestructorExpr + + EXPR_CXX_EXPR_WITH_TEMPORARIES, // CXXExprWithTemporaries - EXPR_CXX_EXPR_WITH_TEMPORARIES // CXXExprWithTemporaries + EXPR_CXX_DEPENDENT_SCOPE_MEMBER, // CXXDependentScopeMemberExpr + EXPR_CXX_DEPENDENT_SCOPE_DECL_REF, // DependentScopeDeclRefExpr + EXPR_CXX_UNRESOLVED_CONSTRUCT, // CXXUnresolvedConstructExpr + EXPR_CXX_UNRESOLVED_MEMBER, // UnresolvedMemberExpr + EXPR_CXX_UNRESOLVED_LOOKUP, // UnresolvedLookupExpr + + EXPR_CXX_UNARY_TYPE_TRAIT // UnaryTypeTraitExpr }; /// \brief The kinds of designators that can occur in a diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/PCHDeserializationListener.h b/contrib/llvm/tools/clang/include/clang/Frontend/PCHDeserializationListener.h new file mode 100644 index 0000000..c9b90e2 --- /dev/null +++ b/contrib/llvm/tools/clang/include/clang/Frontend/PCHDeserializationListener.h @@ -0,0 +1,36 @@ +//===- PCHDeserializationListener.h - Decl/Type PCH Read Events -*- 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 the PCHDeserializationListener class, which is notified +// by the PCHReader whenever a type or declaration is deserialized. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_FRONTEND_PCH_DESERIALIZATION_LISTENER_H +#define LLVM_CLANG_FRONTEND_PCH_DESERIALIZATION_LISTENER_H + +#include "clang/Frontend/PCHBitCodes.h" + +namespace clang { + +class Decl; +class QualType; + +class PCHDeserializationListener { +protected: + ~PCHDeserializationListener() {} + +public: + virtual void TypeRead(pch::TypeID ID, QualType T) = 0; + virtual void DeclRead(pch::DeclID ID, const Decl *D) = 0; +}; + +} + +#endif diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/PCHReader.h b/contrib/llvm/tools/clang/include/clang/Frontend/PCHReader.h index e144738..47e871f 100644 --- a/contrib/llvm/tools/clang/include/clang/Frontend/PCHReader.h +++ b/contrib/llvm/tools/clang/include/clang/Frontend/PCHReader.h @@ -59,12 +59,22 @@ class GotoStmt; class LabelStmt; class MacroDefinition; class NamedDecl; +class PCHDeserializationListener; class Preprocessor; class Sema; class SwitchCase; class PCHReader; struct HeaderFileInfo; +struct PCHPredefinesBlock { + /// \brief The file ID for this predefines buffer in a PCH file. + FileID BufferID; + + /// \brief This predefines buffer in a PCH file. + llvm::StringRef Data; +}; +typedef llvm::SmallVector<PCHPredefinesBlock, 2> PCHPredefinesBlocks; + /// \brief Abstract interface for callback invocations by the PCHReader. /// /// While reading a PCH file, the PCHReader will call the methods of the @@ -91,10 +101,7 @@ public: /// \brief Receives the contents of the predefines buffer. /// - /// \param PCHPredef The start of the predefines buffer in the PCH - /// file. - /// - /// \param PCHBufferID The FileID for the PCH predefines buffer. + /// \param Buffers Information about the predefines buffers. /// /// \param OriginalFileName The original file name for the PCH, which will /// appear as an entry in the predefines buffer. @@ -103,8 +110,7 @@ public: /// here. /// /// \returns true to indicate the predefines are invalid or false otherwise. - virtual bool ReadPredefinesBuffer(llvm::StringRef PCHPredef, - FileID PCHBufferID, + virtual bool ReadPredefinesBuffer(const PCHPredefinesBlocks &Buffers, llvm::StringRef OriginalFileName, std::string &SuggestedPredefines) { return false; @@ -131,8 +137,7 @@ public: virtual bool ReadLanguageOptions(const LangOptions &LangOpts); virtual bool ReadTargetTriple(llvm::StringRef Triple); - virtual bool ReadPredefinesBuffer(llvm::StringRef PCHPredef, - FileID PCHBufferID, + virtual bool ReadPredefinesBuffer(const PCHPredefinesBlocks &Buffers, llvm::StringRef OriginalFileName, std::string &SuggestedPredefines); virtual void ReadHeaderFileInfo(const HeaderFileInfo &HFI, unsigned ID); @@ -165,9 +170,12 @@ public: enum PCHReadResult { Success, Failure, IgnorePCH }; friend class PCHValidator; private: - /// \ brief The receiver of some callbacks invoked by PCHReader. + /// \brief The receiver of some callbacks invoked by PCHReader. llvm::OwningPtr<PCHReaderListener> Listener; + /// \brief The receiver of deserialization events. + PCHDeserializationListener *DeserializationListener; + SourceManager &SourceMgr; FileManager &FileMgr; Diagnostic &Diags; @@ -321,7 +329,7 @@ private: /// file. llvm::SmallVector<uint64_t, 16> TentativeDefinitions; - /// \brief The set of tentative definitions stored in the the PCH + /// \brief The set of unused static functions stored in the the PCH /// file. llvm::SmallVector<uint64_t, 16> UnusedStaticFuncs; @@ -333,6 +341,12 @@ private: /// PCH file. llvm::SmallVector<uint64_t, 4> ExtVectorDecls; + /// \brief The set of VTable uses of CXXRecordDecls stored in the PCH file. + llvm::SmallVector<uint64_t, 64> VTableUses; + + /// \brief The set of dynamic CXXRecord declarations stored in the PCH file. + llvm::SmallVector<uint64_t, 16> DynamicClasses; + /// \brief The set of Objective-C category definitions stored in the /// the PCH file. llvm::SmallVector<uint64_t, 4> ObjCCategoryImpls; @@ -447,17 +461,39 @@ private: /// "Interesting" declarations are those that have data that may /// need to be emitted, such as inline function definitions or /// Objective-C protocols. - llvm::SmallVector<Decl *, 16> InterestingDecls; + std::deque<Decl *> InterestingDecls; - /// \brief The file ID for the predefines buffer in the PCH file. - FileID PCHPredefinesBufferID; + /// \brief When reading a Stmt tree, Stmt operands are placed in this stack. + llvm::SmallVector<Stmt *, 16> StmtStack; - /// \brief Pointer to the beginning of the predefines buffer in the - /// PCH file. - const char *PCHPredefines; + /// \brief What kind of records we are reading. + enum ReadingKind { + Read_Decl, Read_Type, Read_Stmt + }; - /// \brief Length of the predefines buffer in the PCH file. - unsigned PCHPredefinesLen; + /// \brief What kind of records we are reading. + ReadingKind ReadingKind; + + /// \brief RAII object to change the reading kind. + class ReadingKindTracker { + PCHReader &Reader; + enum ReadingKind PrevKind; + + ReadingKindTracker(const ReadingKindTracker&); // do not implement + ReadingKindTracker &operator=(const ReadingKindTracker&);// do not implement + + public: + ReadingKindTracker(enum ReadingKind newKind, PCHReader &reader) + : Reader(reader), PrevKind(Reader.ReadingKind) { + Reader.ReadingKind = newKind; + } + + ~ReadingKindTracker() { Reader.ReadingKind = PrevKind; } + }; + + /// \brief All predefines buffers in all PCH files, to be treated as if + /// concatenated. + PCHPredefinesBlocks PCHPredefinesBuffers; /// \brief Suggested contents of the predefines buffer, after this /// PCH file has been processed. @@ -469,10 +505,13 @@ private: /// predefines buffer may contain additional definitions. std::string SuggestedPredefines; + /// \brief Reads a statement from the specified cursor. + Stmt *ReadStmtFromStream(llvm::BitstreamCursor &Cursor); + void MaybeAddSystemRootToFilename(std::string &Filename); PCHReadResult ReadPCHBlock(); - bool CheckPredefinesBuffer(llvm::StringRef PCHPredef, FileID PCHBufferID); + bool CheckPredefinesBuffers(); bool ParseLineTable(llvm::SmallVectorImpl<uint64_t> &Record); PCHReadResult ReadSourceManagerBlock(); PCHReadResult ReadSLocEntryRecord(unsigned ID); @@ -482,6 +521,8 @@ private: void LoadedDecl(unsigned Index, Decl *D); Decl *ReadDeclRecord(uint64_t Offset, unsigned Index); + void PassInterestingDeclsToConsumer(); + /// \brief Produce an error diagnostic and return true. /// /// This routine should only be used for fatal errors that have to @@ -537,6 +578,10 @@ public: Listener.reset(listener); } + void setDeserializationListener(PCHDeserializationListener *Listener) { + DeserializationListener = Listener; + } + /// \brief Set the Preprocessor to use. void setPreprocessor(Preprocessor &pp); @@ -544,7 +589,7 @@ public: void InitializeContext(ASTContext &Context); /// \brief Retrieve the name of the PCH file - const std::string &getFileName() { return FileName; } + const std::string &getFileName() const { return FileName; } /// \brief Retrieve the name of the original source file name const std::string &getOriginalSourceFile() { return OriginalFileName; } @@ -563,36 +608,61 @@ public: /// \brief Read preprocessed entities into the virtual void ReadPreprocessedEntities(); + /// \brief Returns the number of types found in this file. + unsigned getTotalNumTypes() const { + return static_cast<unsigned>(TypesLoaded.size()); + } + + /// \brief Returns the number of declarations found in this file. + unsigned getTotalNumDecls() const { + return static_cast<unsigned>(DeclsLoaded.size()); + } + /// \brief Reads a TemplateArgumentLocInfo appropriate for the /// given TemplateArgument kind. TemplateArgumentLocInfo GetTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind, const RecordData &Record, unsigned &Idx); + /// \brief Reads a TemplateArgumentLoc. + TemplateArgumentLoc ReadTemplateArgumentLoc(const RecordData &Record, + unsigned &Idx); + /// \brief Reads a declarator info from the given record. - virtual TypeSourceInfo *GetTypeSourceInfo(const RecordData &Record, - unsigned &Idx); + TypeSourceInfo *GetTypeSourceInfo(const RecordData &Record, + unsigned &Idx); + + /// \brief Resolve and return the translation unit declaration. + TranslationUnitDecl *GetTranslationUnitDecl(); /// \brief Resolve a type ID into a type, potentially building a new /// type. - virtual QualType GetType(pch::TypeID ID); + QualType GetType(pch::TypeID ID); /// \brief Resolve a declaration ID into a declaration, potentially /// building a new declaration. - virtual Decl *GetDecl(pch::DeclID ID); + Decl *GetDecl(pch::DeclID ID); + virtual Decl *GetExternalDecl(uint32_t ID); /// \brief Resolve the offset of a statement into a statement. /// /// This operation will read a new statement from the external /// source each time it is called, and is meant to be used via a /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). - virtual Stmt *GetDeclStmt(uint64_t Offset); + virtual Stmt *GetExternalDeclStmt(uint64_t Offset); /// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the /// specified cursor. Read the abbreviations that are at the top of the block /// and then leave the cursor pointing into the block. bool ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor, unsigned BlockID); + /// \brief Finds all the visible declarations with a given name. + /// The current implementation of this method just loads the entire + /// lookup table as unmaterialized references. + virtual DeclContext::lookup_result + FindExternalVisibleDeclsByName(const DeclContext *DC, + DeclarationName Name); + /// \brief Read all of the declarations lexically stored in a /// declaration context. /// @@ -606,27 +676,8 @@ public: /// /// \returns true if there was an error while reading the /// declarations for this declaration context. - virtual bool ReadDeclsLexicallyInContext(DeclContext *DC, - llvm::SmallVectorImpl<pch::DeclID> &Decls); - - /// \brief Read all of the declarations visible from a declaration - /// context. - /// - /// \param DC The declaration context whose visible declarations - /// will be read. - /// - /// \param Decls A vector of visible declaration structures, - /// providing the mapping from each name visible in the declaration - /// context to the declaration IDs of declarations with that name. - /// - /// \returns true if there was an error while reading the - /// declarations for this declaration context. - /// - /// FIXME: Using this intermediate data structure results in an - /// extraneous copying of the data. Could we pass in a reference to - /// the StoredDeclsMap instead? - virtual bool ReadDeclsVisibleInContext(DeclContext *DC, - llvm::SmallVectorImpl<VisibleDeclaration> & Decls); + virtual bool FindExternalLexicalDecls(const DeclContext *DC, + llvm::SmallVectorImpl<Decl*> &Decls); /// \brief Function that will be invoked when we begin parsing a new /// translation unit involving this external AST source. @@ -691,8 +742,8 @@ public: Selector DecodeSelector(unsigned Idx); - virtual Selector GetSelector(uint32_t ID); - virtual uint32_t GetNumKnownSelectors(); + virtual Selector GetExternalSelector(uint32_t ID); + uint32_t GetNumExternalSelectors(); Selector GetSelector(const RecordData &Record, unsigned &Idx) { return DecodeSelector(Record[Idx++]); @@ -704,6 +755,28 @@ public: NestedNameSpecifier *ReadNestedNameSpecifier(const RecordData &Record, unsigned &Idx); + /// \brief Read a template name. + TemplateName ReadTemplateName(const RecordData &Record, unsigned &Idx); + + /// \brief Read a template argument. + TemplateArgument ReadTemplateArgument(const RecordData &Record,unsigned &Idx); + + /// \brief Read a template parameter list. + TemplateParameterList *ReadTemplateParameterList(const RecordData &Record, + unsigned &Idx); + + /// \brief Read a template argument array. + void + ReadTemplateArgumentList(llvm::SmallVector<TemplateArgument, 8> &TemplArgs, + const RecordData &Record, unsigned &Idx); + + /// \brief Read a UnresolvedSet structure. + void ReadUnresolvedSet(UnresolvedSetImpl &Set, + const RecordData &Record, unsigned &Idx); + + /// \brief Read a C++ base specifier. + CXXBaseSpecifier ReadCXXBaseSpecifier(const RecordData &Record,unsigned &Idx); + /// \brief Read a source location. SourceLocation ReadSourceLocation(const RecordData &Record, unsigned& Idx) { return SourceLocation::getFromRawEncoding(Record[Idx++]); @@ -729,20 +802,25 @@ public: /// \brief Reads attributes from the current stream position. Attr *ReadAttributes(); - /// \brief ReadDeclExpr - Reads an expression from the current decl cursor. - Expr *ReadDeclExpr(); + /// \brief Reads a statement. + Stmt *ReadStmt(); - /// \brief ReadTypeExpr - Reads an expression from the current type cursor. - Expr *ReadTypeExpr(); + /// \brief Reads an expression. + Expr *ReadExpr(); - /// \brief Reads a statement from the specified cursor. - Stmt *ReadStmt(llvm::BitstreamCursor &Cursor); - - /// \brief Read a statement from the current DeclCursor. - Stmt *ReadDeclStmt() { - return ReadStmt(DeclsCursor); + /// \brief Reads a sub-statement operand during statement reading. + Stmt *ReadSubStmt() { + assert(ReadingKind == Read_Stmt && + "Should be called only during statement reading!"); + // Subexpressions are stored from last to first, so the next Stmt we need + // is at the back of the stack. + assert(!StmtStack.empty() && "Read too many sub statements!"); + return StmtStack.pop_back_val(); } + /// \brief Reads a sub-expression operand during statement reading. + Expr *ReadSubExpr(); + /// \brief Reads the macro record located at the given offset. void ReadMacroRecord(uint64_t Offset); diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/PCHWriter.h b/contrib/llvm/tools/clang/include/clang/Frontend/PCHWriter.h index 85f53b9..70ad1d7 100644 --- a/contrib/llvm/tools/clang/include/clang/Frontend/PCHWriter.h +++ b/contrib/llvm/tools/clang/include/clang/Frontend/PCHWriter.h @@ -17,7 +17,9 @@ #include "clang/AST/Decl.h" #include "clang/AST/DeclarationName.h" +#include "clang/AST/TemplateBase.h" #include "clang/Frontend/PCHBitCodes.h" +#include "clang/Frontend/PCHDeserializationListener.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallVector.h" #include <map> @@ -38,6 +40,7 @@ class CXXBaseOrMemberInitializer; class LabelStmt; class MacroDefinition; class MemorizeStatCalls; +class PCHReader; class Preprocessor; class Sema; class SourceManager; @@ -69,7 +72,7 @@ struct UnsafeQualTypeDenseMapInfo { /// representation of a given abstract syntax tree and its supporting /// data structures. This bitstream can be de-serialized via an /// instance of the PCHReader class. -class PCHWriter { +class PCHWriter : public PCHDeserializationListener { public: typedef llvm::SmallVector<uint64_t, 64> RecordData; @@ -77,6 +80,9 @@ private: /// \brief The bitstream writer used to emit this precompiled header. llvm::BitstreamWriter &Stream; + /// \brief The reader of existing PCH files, if we're chaining. + PCHReader *Chain; + /// \brief Stores a declaration or a type to be written to the PCH file. class DeclOrType { public: @@ -188,7 +194,11 @@ private: /// \brief Statements that we've encountered while serializing a /// declaration or type. - llvm::SmallVector<Stmt *, 8> StmtsToEmit; + llvm::SmallVector<Stmt *, 16> StmtsToEmit; + + /// \brief Statements collection to use for PCHWriter::AddStmt(). + /// It will point to StmtsToEmit unless it is overriden. + llvm::SmallVector<Stmt *, 16> *CollectedStmts; /// \brief Mapping from SwitchCase statements to IDs. std::map<SwitchCase *, unsigned> SwitchCaseIDs; @@ -210,10 +220,13 @@ private: /// file. unsigned NumVisibleDeclContexts; + /// \brief Write the given subexpression to the bitstream. + void WriteSubStmt(Stmt *S); + void WriteBlockInfoBlock(); void WriteMetadata(ASTContext &Context, const char *isysroot); void WriteLanguageOptions(const LangOptions &LangOpts); - void WriteStatCache(MemorizeStatCalls &StatCalls, const char* isysroot); + void WriteStatCache(MemorizeStatCalls &StatCalls); void WriteSourceManagerBlock(SourceManager &SourceMgr, const Preprocessor &PP, const char* isysroot); @@ -229,11 +242,16 @@ private: unsigned ParmVarDeclAbbrev; void WriteDeclsBlockAbbrevs(); void WriteDecl(ASTContext &Context, Decl *D); + + void WritePCHCore(Sema &SemaRef, MemorizeStatCalls *StatCalls, + const char* isysroot); + void WritePCHChain(Sema &SemaRef, MemorizeStatCalls *StatCalls, + const char* isysroot); public: /// \brief Create a new precompiled header writer that outputs to /// the given bitstream. - PCHWriter(llvm::BitstreamWriter &Stream); + PCHWriter(llvm::BitstreamWriter &Stream, PCHReader *Chain); /// \brief Write a precompiled header for the given semantic analysis. /// @@ -299,6 +317,11 @@ public: /// \brief Emits a reference to a declarator info. void AddTypeSourceInfo(TypeSourceInfo *TInfo, RecordData &Record); + /// \brief Emits a template argument location info. + void AddTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind, + const TemplateArgumentLocInfo &Arg, + RecordData &Record); + /// \brief Emits a template argument location. void AddTemplateArgumentLoc(const TemplateArgumentLoc &Arg, RecordData &Record); @@ -315,6 +338,26 @@ public: /// \brief Emit a nested name specifier. void AddNestedNameSpecifier(NestedNameSpecifier *NNS, RecordData &Record); + + /// \brief Emit a template name. + void AddTemplateName(TemplateName Name, RecordData &Record); + + /// \brief Emit a template argument. + void AddTemplateArgument(const TemplateArgument &Arg, RecordData &Record); + + /// \brief Emit a template parameter list. + void AddTemplateParameterList(const TemplateParameterList *TemplateParams, + RecordData &Record); + + /// \brief Emit a template argument list. + void AddTemplateArgumentList(const TemplateArgumentList *TemplateArgs, + RecordData &Record); + + /// \brief Emit a UnresolvedSet structure. + void AddUnresolvedSet(const UnresolvedSetImpl &Set, RecordData &Record); + + /// brief Emit a C++ base specifier. + void AddCXXBaseSpecifier(const CXXBaseSpecifier &Base, RecordData &Record); /// \brief Add a string to the given record. void AddString(const std::string &Str, RecordData &Record); @@ -335,10 +378,9 @@ public: /// type or declaration has been written, call FlushStmts() to write /// the corresponding statements just after the type or /// declaration. - void AddStmt(Stmt *S) { StmtsToEmit.push_back(S); } - - /// \brief Write the given subexpression to the bitstream. - void WriteSubStmt(Stmt *S); + void AddStmt(Stmt *S) { + CollectedStmts->push_back(S); + } /// \brief Flush all of the statements and expressions that have /// been added to the queue via AddStmt(). @@ -355,6 +397,10 @@ public: unsigned GetLabelID(LabelStmt *S); unsigned getParmVarDeclAbbrev() const { return ParmVarDeclAbbrev; } + + // PCHDeserializationListener implementation + void TypeRead(pch::TypeID ID, QualType T); + void DeclRead(pch::DeclID ID, const Decl *D); }; } // end namespace clang diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/PathDiagnosticClients.h b/contrib/llvm/tools/clang/include/clang/Frontend/PathDiagnosticClients.h deleted file mode 100644 index f8d2eeb..0000000 --- a/contrib/llvm/tools/clang/include/clang/Frontend/PathDiagnosticClients.h +++ /dev/null @@ -1,32 +0,0 @@ -//===--- PathDiagnosticClients.h - Path Diagnostic Clients ------*- 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 the interface to create different path diagostic clients. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_FRONTEND_PATH_DIAGNOSTIC_CLIENTS_H -#define LLVM_CLANG_FRONTEND_PATH_DIAGNOSTIC_CLiENTS_H - -#include <string> - -namespace clang { - -class PathDiagnosticClient; -class Preprocessor; - -PathDiagnosticClient* -CreateHTMLDiagnosticClient(const std::string& prefix, const Preprocessor &PP); - -PathDiagnosticClient* -CreatePlistDiagnosticClient(const std::string& prefix, const Preprocessor &PP, - PathDiagnosticClient *SubPD = 0); - -} // end clang namespace -#endif diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/TextDiagnosticPrinter.h b/contrib/llvm/tools/clang/include/clang/Frontend/TextDiagnosticPrinter.h index ec4392f..f530294 100644 --- a/contrib/llvm/tools/clang/include/clang/Frontend/TextDiagnosticPrinter.h +++ b/contrib/llvm/tools/clang/include/clang/Frontend/TextDiagnosticPrinter.h @@ -18,14 +18,9 @@ #include "clang/Basic/Diagnostic.h" #include "clang/Basic/SourceLocation.h" -namespace llvm { - class raw_ostream; -} - namespace clang { class DiagnosticOptions; class LangOptions; -class SourceManager; class TextDiagnosticPrinter : public DiagnosticClient { llvm::raw_ostream &OS; @@ -60,14 +55,14 @@ public: void PrintIncludeStack(SourceLocation Loc, const SourceManager &SM); - void HighlightRange(const SourceRange &R, + void HighlightRange(const CharSourceRange &R, const SourceManager &SrcMgr, unsigned LineNo, FileID FID, std::string &CaretLine, const std::string &SourceLine); void EmitCaretDiagnostic(SourceLocation Loc, - SourceRange *Ranges, unsigned NumRanges, + CharSourceRange *Ranges, unsigned NumRanges, const SourceManager &SM, const FixItHint *Hints, unsigned NumHints, diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/TypeXML.def b/contrib/llvm/tools/clang/include/clang/Frontend/TypeXML.def index 069d718..e8cb4a6 100644 --- a/contrib/llvm/tools/clang/include/clang/Frontend/TypeXML.def +++ b/contrib/llvm/tools/clang/include/clang/Frontend/TypeXML.def @@ -253,6 +253,11 @@ NODE_XML(DependentNameType, "DependentNameType") ID_ATTRIBUTE_XML END_NODE_XML +NODE_XML(DependentTemplateSpecializationType, + "DependentTemplateSpecializationType") + ID_ATTRIBUTE_XML +END_NODE_XML + NODE_XML(ObjCInterfaceType, "ObjCInterfaceType") ID_ATTRIBUTE_XML END_NODE_XML diff --git a/contrib/llvm/tools/clang/include/clang/Frontend/Utils.h b/contrib/llvm/tools/clang/include/clang/Frontend/Utils.h index c1d4831..f37cc01 100644 --- a/contrib/llvm/tools/clang/include/clang/Frontend/Utils.h +++ b/contrib/llvm/tools/clang/include/clang/Frontend/Utils.h @@ -65,12 +65,6 @@ void ProcessWarningOptions(Diagnostic &Diags, const DiagnosticOptions &Opts); void DoPrintPreprocessedInput(Preprocessor &PP, llvm::raw_ostream* OS, const PreprocessorOutputOptions &Opts); -/// RewriteMacrosInInput - Implement -rewrite-macros mode. -void RewriteMacrosInInput(Preprocessor &PP, llvm::raw_ostream* OS); - -/// RewriteMacrosInInput - A simple test for the TokenRewriter class. -void DoRewriteTest(Preprocessor &PP, llvm::raw_ostream* OS); - /// CreatePrintParserActionsAction - Return the actions implementation that /// implements the -parse-print-callbacks option. MinimalAction *CreatePrintParserActionsAction(Preprocessor &PP, |