bool ToolInvocation::runInvocation( const char *BinaryName, clang::driver::Compilation *Compilation, clang::CompilerInvocation *Invocation, const clang::driver::ArgStringList &CC1Args, clang::FrontendAction *ToolAction) { llvm::OwningPtr<clang::FrontendAction> ScopedToolAction(ToolAction); // Show the invocation, with -v. if (Invocation->getHeaderSearchOpts().Verbose) { llvm::errs() << "clang Invocation:\n"; Compilation->PrintJob(llvm::errs(), Compilation->getJobs(), "\n", true); llvm::errs() << "\n"; } // Create a compiler instance to handle the actual work. clang::CompilerInstance Compiler; Compiler.setInvocation(Invocation); Compiler.setFileManager(Files); // FIXME: What about LangOpts? // Create the compilers actual diagnostics engine. Compiler.createDiagnostics(CC1Args.size(), const_cast<char**>(CC1Args.data())); if (!Compiler.hasDiagnostics()) return false; Compiler.createSourceManager(*Files); addFileMappingsTo(Compiler.getSourceManager()); // Infer the builtin include path if unspecified. if (Compiler.getHeaderSearchOpts().UseBuiltinIncludes && Compiler.getHeaderSearchOpts().ResourceDir.empty()) { // This just needs to be some symbol in the binary. void *const SymbolAddr = &StaticSymbol; Compiler.getHeaderSearchOpts().ResourceDir = clang::CompilerInvocation::GetResourcesPath(BinaryName, SymbolAddr); } const bool Success = Compiler.ExecuteAction(*ToolAction); Compiler.resetAndLeakFileManager(); return Success; }
bool ToolInvocation::runInvocation( const char *BinaryName, clang::driver::Compilation *Compilation, clang::CompilerInvocation *Invocation) { // Show the invocation, with -v. if (Invocation->getHeaderSearchOpts().Verbose) { llvm::errs() << "clang Invocation:\n"; Compilation->PrintJob(llvm::errs(), Compilation->getJobs(), "\n", true); llvm::errs() << "\n"; } // Create a compiler instance to handle the actual work. clang::CompilerInstance Compiler; Compiler.setInvocation(Invocation); Compiler.setFileManager(Files); // FIXME: What about LangOpts? // ToolAction can have lifetime requirements for Compiler or its members, and // we need to ensure it's deleted earlier than Compiler. So we pass it to an // OwningPtr declared after the Compiler variable. OwningPtr<FrontendAction> ScopedToolAction(ToolAction.take()); // Create the compilers actual diagnostics engine. Compiler.createDiagnostics(); if (!Compiler.hasDiagnostics()) return false; Compiler.createSourceManager(*Files); addFileMappingsTo(Compiler.getSourceManager()); const bool Success = Compiler.ExecuteAction(*ScopedToolAction); Compiler.resetAndLeakFileManager(); Files->clearStatCaches(); return Success; }