CompilerInstance.cpp revision c2f484f1f05216a9a427ac84b5773789a4661111
12a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar//===--- CompilerInstance.cpp ---------------------------------------------===// 22a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar// 32a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar// The LLVM Compiler Infrastructure 42a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar// 52a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar// This file is distributed under the University of Illinois Open Source 62a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar// License. See LICENSE.TXT for details. 72a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar// 82a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar//===----------------------------------------------------------------------===// 92a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar 102a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar#include "clang/Frontend/CompilerInstance.h" 115eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar#include "clang/AST/ASTContext.h" 122a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar#include "clang/Basic/Diagnostic.h" 1316b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar#include "clang/Basic/FileManager.h" 1416b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar#include "clang/Basic/SourceManager.h" 152a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar#include "clang/Basic/TargetInfo.h" 1622dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar#include "clang/Lex/HeaderSearch.h" 1722dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar#include "clang/Lex/Preprocessor.h" 1822dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar#include "clang/Lex/PTHManager.h" 190fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar#include "clang/Frontend/ChainedDiagnosticClient.h" 200f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar#include "clang/Frontend/PCHReader.h" 21c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar#include "clang/Frontend/FrontendDiagnostic.h" 220fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar#include "clang/Frontend/TextDiagnosticBuffer.h" 230fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar#include "clang/Frontend/TextDiagnosticPrinter.h" 2422dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar#include "clang/Frontend/Utils.h" 25c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar#include "clang/Sema/CodeCompleteConsumer.h" 262a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar#include "llvm/LLVMContext.h" 270fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar#include "llvm/Support/raw_ostream.h" 282a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbarusing namespace clang; 292a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar 302a79e162a3fde25c1941151a67966830d873f2dbDaniel DunbarCompilerInstance::CompilerInstance(llvm::LLVMContext *_LLVMContext, 312a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar bool _OwnsLLVMContext) 322a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar : LLVMContext(_LLVMContext), 332a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar OwnsLLVMContext(_OwnsLLVMContext) { 34c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar } 352a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar 362a79e162a3fde25c1941151a67966830d873f2dbDaniel DunbarCompilerInstance::~CompilerInstance() { 372a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar if (OwnsLLVMContext) 382a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar delete LLVMContext; 392a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar} 4016b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar 410fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// Diagnostics 420fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 430fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbarstatic void SetUpBuildDumpLog(const DiagnosticOptions &DiagOpts, 440fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar unsigned argc, char **argv, 450fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar llvm::OwningPtr<DiagnosticClient> &DiagClient) { 460fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar std::string ErrorInfo; 470fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar llvm::raw_ostream *OS = 480fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar new llvm::raw_fd_ostream(DiagOpts.DumpBuildInformation.c_str(), ErrorInfo); 490fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar if (!ErrorInfo.empty()) { 500fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar // FIXME: Do not fail like this. 510fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar llvm::errs() << "error opening -dump-build-information file '" 520fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar << DiagOpts.DumpBuildInformation << "', option ignored!\n"; 530fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar delete OS; 540fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar return; 550fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar } 560fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 570fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar (*OS) << "clang-cc command line arguments: "; 580fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar for (unsigned i = 0; i != argc; ++i) 590fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar (*OS) << argv[i] << ' '; 600fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar (*OS) << '\n'; 610fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 620fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar // Chain in a diagnostic client which will log the diagnostics. 630fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar DiagnosticClient *Logger = 640fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar new TextDiagnosticPrinter(*OS, DiagOpts, /*OwnsOutputStream=*/true); 650fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar DiagClient.reset(new ChainedDiagnosticClient(DiagClient.take(), Logger)); 660fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar} 670fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 680fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbarvoid CompilerInstance::createDiagnostics(int Argc, char **Argv) { 690fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar Diagnostics.reset(createDiagnostics(getDiagnosticOpts(), Argc, Argv)); 700fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 710fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar if (Diagnostics) 720fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar DiagClient.reset(Diagnostics->getClient()); 730fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar} 740fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 750fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel DunbarDiagnostic *CompilerInstance::createDiagnostics(const DiagnosticOptions &Opts, 760fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar int Argc, char **Argv) { 770fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar // Create the diagnostic client for reporting errors or for 780fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar // implementing -verify. 790fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar llvm::OwningPtr<DiagnosticClient> DiagClient; 800fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar if (Opts.VerifyDiagnostics) { 810fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar // When checking diagnostics, just buffer them up. 820fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar DiagClient.reset(new TextDiagnosticBuffer()); 830fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar } else { 840fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar DiagClient.reset(new TextDiagnosticPrinter(llvm::errs(), Opts)); 850fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar } 860fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 870fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar if (!Opts.DumpBuildInformation.empty()) 880fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar SetUpBuildDumpLog(Opts, Argc, Argv, DiagClient); 890fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 900fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar // Configure our handling of diagnostics. 910fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar Diagnostic *Diags = new Diagnostic(DiagClient.take()); 920fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar if (ProcessWarningOptions(*Diags, Opts)) 930fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar return 0; 940fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 950fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar return Diags; 960fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar} 970fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 980fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// File Manager 990fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 10016b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbarvoid CompilerInstance::createFileManager() { 10116b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar FileMgr.reset(new FileManager()); 10216b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar} 10316b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar 1040fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// Source Manager 1050fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 10616b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbarvoid CompilerInstance::createSourceManager() { 10716b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar SourceMgr.reset(new SourceManager()); 10816b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar} 10922dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar 1100fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// Preprocessor 1110fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 11222dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbarvoid CompilerInstance::createPreprocessor() { 11322dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar PP.reset(createPreprocessor(getDiagnostics(), getLangOpts(), 11422dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar getPreprocessorOpts(), getHeaderSearchOpts(), 11522dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar getDependencyOutputOpts(), getTarget(), 11622dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar getSourceManager(), getFileManager())); 11722dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar} 11822dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar 11922dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel DunbarPreprocessor * 12022dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel DunbarCompilerInstance::createPreprocessor(Diagnostic &Diags, 12122dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar const LangOptions &LangInfo, 12222dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar const PreprocessorOptions &PPOpts, 12322dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar const HeaderSearchOptions &HSOpts, 12422dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar const DependencyOutputOptions &DepOpts, 12522dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar const TargetInfo &Target, 12622dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar SourceManager &SourceMgr, 12722dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar FileManager &FileMgr) { 12822dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // Create a PTH manager if we are using some form of a token cache. 12922dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar PTHManager *PTHMgr = 0; 13022dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar if (!PPOpts.getTokenCache().empty()) 13122dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar PTHMgr = PTHManager::Create(PPOpts.getTokenCache(), Diags); 13222dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar 13322dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // FIXME: Don't fail like this. 13422dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar if (Diags.hasErrorOccurred()) 13522dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar exit(1); 13622dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar 13722dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // Create the Preprocessor. 13822dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar HeaderSearch *HeaderInfo = new HeaderSearch(FileMgr); 13922dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar Preprocessor *PP = new Preprocessor(Diags, LangInfo, Target, 14022dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar SourceMgr, *HeaderInfo, PTHMgr, 14122dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar /*OwnsHeaderSearch=*/true); 14222dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar 14322dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // Note that this is different then passing PTHMgr to Preprocessor's ctor. 14422dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // That argument is used as the IdentifierInfoLookup argument to 14522dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // IdentifierTable's ctor. 14622dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar if (PTHMgr) { 14722dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar PTHMgr->setPreprocessor(PP); 14822dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar PP->setPTHManager(PTHMgr); 14922dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar } 15022dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar 15122dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar InitializePreprocessor(*PP, PPOpts, HSOpts); 15222dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar 15322dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // Handle generating dependencies, if requested. 15422dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar if (!DepOpts.OutputFile.empty()) 15522dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar AttachDependencyFileGen(*PP, DepOpts); 15622dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar 15722dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar return PP; 15822dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar} 1595eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar 1605eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar// ASTContext 1615eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar 1625eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbarvoid CompilerInstance::createASTContext() { 1635eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar Preprocessor &PP = getPreprocessor(); 1645eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar Context.reset(new ASTContext(getLangOpts(), PP.getSourceManager(), 1655eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar getTarget(), PP.getIdentifierTable(), 1665eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar PP.getSelectorTable(), PP.getBuiltinInfo(), 1675eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar /*FreeMemory=*/ !getFrontendOpts().DisableFree, 1685eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar /*size_reserve=*/ 0)); 1695eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar} 1700f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 1710f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar// ExternalASTSource 1720f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 1730f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbarvoid CompilerInstance::createPCHExternalASTSource(llvm::StringRef Path) { 1740f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar llvm::OwningPtr<ExternalASTSource> Source; 1750f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar Source.reset(createPCHExternalASTSource(Path, getHeaderSearchOpts().Sysroot, 1760f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar getPreprocessor(), getASTContext())); 1770f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar getASTContext().setExternalSource(Source); 1780f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar} 1790f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 1800f800391ffbfe3820e1c60246a09a97e5f065179Daniel DunbarExternalASTSource * 1810f800391ffbfe3820e1c60246a09a97e5f065179Daniel DunbarCompilerInstance::createPCHExternalASTSource(llvm::StringRef Path, 1820f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar const std::string &Sysroot, 1830f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar Preprocessor &PP, 1840f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar ASTContext &Context) { 1850f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar llvm::OwningPtr<PCHReader> Reader; 1860f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar Reader.reset(new PCHReader(PP, &Context, 1870f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar Sysroot.empty() ? 0 : Sysroot.c_str())); 1880f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 1890f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar switch (Reader->ReadPCH(Path)) { 1900f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar case PCHReader::Success: 1910f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // Set the predefines buffer as suggested by the PCH reader. Typically, the 1920f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // predefines buffer will be empty. 1930f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar PP.setPredefines(Reader->getSuggestedPredefines()); 1940f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar return Reader.take(); 1950f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 1960f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar case PCHReader::Failure: 1970f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // Unrecoverable failure: don't even try to process the input file. 1980f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar break; 1990f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 2000f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar case PCHReader::IgnorePCH: 2010f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // No suitable PCH file could be found. Return an error. 2020f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar break; 2030f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar } 2040f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 2050f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar return 0; 2060f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar} 207c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 208c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar// Code Completion 209c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 210c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbarvoid CompilerInstance::createCodeCompletionConsumer() { 211c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar const ParsedSourceLocation &Loc = getFrontendOpts().CodeCompletionAt; 212c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar CompletionConsumer.reset( 213c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar createCodeCompletionConsumer(getPreprocessor(), 214c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar Loc.FileName, Loc.Line, Loc.Column, 215c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar getFrontendOpts().DebugCodeCompletionPrinter, 216c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar getFrontendOpts().ShowMacrosInCodeCompletion, 217c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar llvm::outs())); 218c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar} 219c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 220c2f484f1f05216a9a427ac84b5773789a4661111Daniel DunbarCodeCompleteConsumer * 221c2f484f1f05216a9a427ac84b5773789a4661111Daniel DunbarCompilerInstance::createCodeCompletionConsumer(Preprocessor &PP, 222c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar const std::string &Filename, 223c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar unsigned Line, 224c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar unsigned Column, 225c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar bool UseDebugPrinter, 226c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar bool ShowMacros, 227c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar llvm::raw_ostream &OS) { 228c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar // Tell the source manager to chop off the given file at a specific 229c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar // line and column. 230c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar const FileEntry *Entry = PP.getFileManager().getFile(Filename); 231c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar if (!Entry) { 232c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar PP.getDiagnostics().Report(diag::err_fe_invalid_code_complete_file) 233c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar << Filename; 234c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar return 0; 235c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar } 236c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 237c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar // Truncate the named file at the given line/column. 238c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar PP.getSourceManager().truncateFileAt(Entry, Line, Column); 239c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 240c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar // Set up the creation routine for code-completion. 241c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar if (UseDebugPrinter) 242c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar return new PrintingCodeCompleteConsumer(ShowMacros, OS); 243c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar else 244c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar return new CIndexCodeCompleteConsumer(ShowMacros, OS); 245c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar} 246