From 9dd834653b811ad20382e98a87dff824980c9916 Mon Sep 17 00:00:00 2001 From: dim Date: Sun, 21 Jun 2015 14:00:56 +0000 Subject: Vendor import of clang trunk r240225: https://llvm.org/svn/llvm-project/cfe/trunk@240225 --- lib/Tooling/Tooling.cpp | 95 +++++++++++++++++++++++++++---------------------- 1 file changed, 52 insertions(+), 43 deletions(-) (limited to 'lib/Tooling/Tooling.cpp') diff --git a/lib/Tooling/Tooling.cpp b/lib/Tooling/Tooling.cpp index e100003..f9cb7c6 100644 --- a/lib/Tooling/Tooling.cpp +++ b/lib/Tooling/Tooling.cpp @@ -105,9 +105,10 @@ clang::CompilerInvocation *newInvocation( } bool runToolOnCode(clang::FrontendAction *ToolAction, const Twine &Code, - const Twine &FileName) { - return runToolOnCodeWithArgs( - ToolAction, Code, std::vector(), FileName); + const Twine &FileName, + std::shared_ptr PCHContainerOps) { + return runToolOnCodeWithArgs(ToolAction, Code, std::vector(), + FileName, PCHContainerOps); } static std::vector @@ -121,17 +122,18 @@ getSyntaxOnlyToolArgs(const std::vector &ExtraArgs, return Args; } -bool runToolOnCodeWithArgs(clang::FrontendAction *ToolAction, const Twine &Code, - const std::vector &Args, - const Twine &FileName, - const FileContentMappings &VirtualMappedFiles) { +bool runToolOnCodeWithArgs( + clang::FrontendAction *ToolAction, const Twine &Code, + const std::vector &Args, const Twine &FileName, + std::shared_ptr PCHContainerOps, + const FileContentMappings &VirtualMappedFiles) { SmallString<16> FileNameStorage; StringRef FileNameRef = FileName.toNullTerminatedStringRef(FileNameStorage); llvm::IntrusiveRefCntPtr Files( new FileManager(FileSystemOptions())); ToolInvocation Invocation(getSyntaxOnlyToolArgs(Args, FileNameRef), - ToolAction, Files.get()); + ToolAction, Files.get(), PCHContainerOps); SmallString<1024> CodeStorage; Invocation.mapVirtualFile(FileNameRef, @@ -173,21 +175,18 @@ public: } -ToolInvocation::ToolInvocation(std::vector CommandLine, - ToolAction *Action, FileManager *Files) - : CommandLine(std::move(CommandLine)), - Action(Action), - OwnsAction(false), - Files(Files), - DiagConsumer(nullptr) {} +ToolInvocation::ToolInvocation( + std::vector CommandLine, ToolAction *Action, + FileManager *Files, std::shared_ptr PCHContainerOps) + : CommandLine(std::move(CommandLine)), Action(Action), OwnsAction(false), + Files(Files), PCHContainerOps(PCHContainerOps), DiagConsumer(nullptr) {} -ToolInvocation::ToolInvocation(std::vector CommandLine, - FrontendAction *FAction, FileManager *Files) +ToolInvocation::ToolInvocation( + std::vector CommandLine, FrontendAction *FAction, + FileManager *Files, std::shared_ptr PCHContainerOps) : CommandLine(std::move(CommandLine)), - Action(new SingleFrontendActionFactory(FAction)), - OwnsAction(true), - Files(Files), - DiagConsumer(nullptr) {} + Action(new SingleFrontendActionFactory(FAction)), OwnsAction(true), + Files(Files), PCHContainerOps(PCHContainerOps), DiagConsumer(nullptr) {} ToolInvocation::~ToolInvocation() { if (OwnsAction) @@ -232,13 +231,14 @@ bool ToolInvocation::run() { Invocation->getPreprocessorOpts().addRemappedFile(It.getKey(), Input.release()); } - return runInvocation(BinaryName, Compilation.get(), Invocation.release()); + return runInvocation(BinaryName, Compilation.get(), Invocation.release(), + PCHContainerOps); } bool ToolInvocation::runInvocation( - const char *BinaryName, - clang::driver::Compilation *Compilation, - clang::CompilerInvocation *Invocation) { + const char *BinaryName, clang::driver::Compilation *Compilation, + clang::CompilerInvocation *Invocation, + std::shared_ptr PCHContainerOps) { // Show the invocation, with -v. if (Invocation->getHeaderSearchOpts().Verbose) { llvm::errs() << "clang Invocation:\n"; @@ -246,14 +246,16 @@ bool ToolInvocation::runInvocation( llvm::errs() << "\n"; } - return Action->runInvocation(Invocation, Files, DiagConsumer); + return Action->runInvocation(Invocation, Files, PCHContainerOps, + DiagConsumer); } -bool FrontendActionFactory::runInvocation(CompilerInvocation *Invocation, - FileManager *Files, - DiagnosticConsumer *DiagConsumer) { +bool FrontendActionFactory::runInvocation( + CompilerInvocation *Invocation, FileManager *Files, + std::shared_ptr PCHContainerOps, + DiagnosticConsumer *DiagConsumer) { // Create a compiler instance to handle the actual work. - clang::CompilerInstance Compiler; + clang::CompilerInstance Compiler(PCHContainerOps); Compiler.setInvocation(Invocation); Compiler.setFileManager(Files); @@ -276,8 +278,10 @@ bool FrontendActionFactory::runInvocation(CompilerInvocation *Invocation, } ClangTool::ClangTool(const CompilationDatabase &Compilations, - ArrayRef SourcePaths) + ArrayRef SourcePaths, + std::shared_ptr PCHContainerOps) : Compilations(Compilations), SourcePaths(SourcePaths), + PCHContainerOps(PCHContainerOps), Files(new FileManager(FileSystemOptions())), DiagConsumer(nullptr) { appendArgumentsAdjuster(getClangStripOutputAdjuster()); appendArgumentsAdjuster(getClangSyntaxOnlyAdjuster()); @@ -357,7 +361,8 @@ int ClangTool::run(ToolAction *Action) { // FIXME: We need a callback mechanism for the tool writer to output a // customized message for each file. DEBUG({ llvm::dbgs() << "Processing: " << File << ".\n"; }); - ToolInvocation Invocation(std::move(CommandLine), Action, Files.get()); + ToolInvocation Invocation(std::move(CommandLine), Action, Files.get(), + PCHContainerOps); Invocation.setDiagnosticConsumer(DiagConsumer); for (const auto &MappedFile : MappedFileContents) Invocation.mapVirtualFile(MappedFile.first, MappedFile.second); @@ -385,12 +390,14 @@ public: ASTBuilderAction(std::vector> &ASTs) : ASTs(ASTs) {} bool runInvocation(CompilerInvocation *Invocation, FileManager *Files, + std::shared_ptr PCHContainerOps, DiagnosticConsumer *DiagConsumer) override { // FIXME: This should use the provided FileManager. std::unique_ptr AST = ASTUnit::LoadFromCompilerInvocation( - Invocation, CompilerInstance::createDiagnostics( - &Invocation->getDiagnosticOpts(), DiagConsumer, - /*ShouldOwnClient=*/false)); + Invocation, PCHContainerOps, + CompilerInstance::createDiagnostics(&Invocation->getDiagnosticOpts(), + DiagConsumer, + /*ShouldOwnClient=*/false)); if (!AST) return false; @@ -406,22 +413,24 @@ int ClangTool::buildASTs(std::vector> &ASTs) { return run(&Action); } -std::unique_ptr buildASTFromCode(const Twine &Code, - const Twine &FileName) { - return buildASTFromCodeWithArgs(Code, std::vector(), FileName); +std::unique_ptr +buildASTFromCode(const Twine &Code, const Twine &FileName, + std::shared_ptr PCHContainerOps) { + return buildASTFromCodeWithArgs(Code, std::vector(), FileName, + PCHContainerOps); } -std::unique_ptr -buildASTFromCodeWithArgs(const Twine &Code, - const std::vector &Args, - const Twine &FileName) { +std::unique_ptr buildASTFromCodeWithArgs( + const Twine &Code, const std::vector &Args, + const Twine &FileName, + std::shared_ptr PCHContainerOps) { SmallString<16> FileNameStorage; StringRef FileNameRef = FileName.toNullTerminatedStringRef(FileNameStorage); std::vector> ASTs; ASTBuilderAction Action(ASTs); ToolInvocation Invocation(getSyntaxOnlyToolArgs(Args, FileNameRef), &Action, - nullptr); + nullptr, PCHContainerOps); SmallString<1024> CodeStorage; Invocation.mapVirtualFile(FileNameRef, -- cgit v1.1