CompilerInstance.cpp revision f482d59386dbc70716f7a5f65adb37ff86b501e6
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" 28a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar#include "llvm/System/Path.h" 292a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbarusing namespace clang; 302a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar 312a79e162a3fde25c1941151a67966830d873f2dbDaniel DunbarCompilerInstance::CompilerInstance(llvm::LLVMContext *_LLVMContext, 322a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar bool _OwnsLLVMContext) 332a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar : LLVMContext(_LLVMContext), 342a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar OwnsLLVMContext(_OwnsLLVMContext) { 35c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar } 362a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar 372a79e162a3fde25c1941151a67966830d873f2dbDaniel DunbarCompilerInstance::~CompilerInstance() { 382a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar if (OwnsLLVMContext) 392a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar delete LLVMContext; 402a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar} 4116b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar 420fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// Diagnostics 430fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 440fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbarstatic void SetUpBuildDumpLog(const DiagnosticOptions &DiagOpts, 450fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar unsigned argc, char **argv, 460fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar llvm::OwningPtr<DiagnosticClient> &DiagClient) { 470fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar std::string ErrorInfo; 480fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar llvm::raw_ostream *OS = 490fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar new llvm::raw_fd_ostream(DiagOpts.DumpBuildInformation.c_str(), ErrorInfo); 500fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar if (!ErrorInfo.empty()) { 510fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar // FIXME: Do not fail like this. 520fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar llvm::errs() << "error opening -dump-build-information file '" 530fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar << DiagOpts.DumpBuildInformation << "', option ignored!\n"; 540fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar delete OS; 550fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar return; 560fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar } 570fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 580fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar (*OS) << "clang-cc command line arguments: "; 590fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar for (unsigned i = 0; i != argc; ++i) 600fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar (*OS) << argv[i] << ' '; 610fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar (*OS) << '\n'; 620fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 630fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar // Chain in a diagnostic client which will log the diagnostics. 640fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar DiagnosticClient *Logger = 650fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar new TextDiagnosticPrinter(*OS, DiagOpts, /*OwnsOutputStream=*/true); 660fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar DiagClient.reset(new ChainedDiagnosticClient(DiagClient.take(), Logger)); 670fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar} 680fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 690fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbarvoid CompilerInstance::createDiagnostics(int Argc, char **Argv) { 700fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar Diagnostics.reset(createDiagnostics(getDiagnosticOpts(), Argc, Argv)); 710fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 720fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar if (Diagnostics) 730fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar DiagClient.reset(Diagnostics->getClient()); 740fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar} 750fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 760fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel DunbarDiagnostic *CompilerInstance::createDiagnostics(const DiagnosticOptions &Opts, 770fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar int Argc, char **Argv) { 780fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar // Create the diagnostic client for reporting errors or for 790fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar // implementing -verify. 800fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar llvm::OwningPtr<DiagnosticClient> DiagClient; 810fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar if (Opts.VerifyDiagnostics) { 820fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar // When checking diagnostics, just buffer them up. 830fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar DiagClient.reset(new TextDiagnosticBuffer()); 840fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar } else { 850fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar DiagClient.reset(new TextDiagnosticPrinter(llvm::errs(), Opts)); 860fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar } 870fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 880fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar if (!Opts.DumpBuildInformation.empty()) 890fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar SetUpBuildDumpLog(Opts, Argc, Argv, DiagClient); 900fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 910fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar // Configure our handling of diagnostics. 920fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar Diagnostic *Diags = new Diagnostic(DiagClient.take()); 930fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar if (ProcessWarningOptions(*Diags, Opts)) 940fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar return 0; 950fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 960fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar return Diags; 970fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar} 980fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 990fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// File Manager 1000fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 10116b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbarvoid CompilerInstance::createFileManager() { 10216b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar FileMgr.reset(new FileManager()); 10316b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar} 10416b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar 1050fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// Source Manager 1060fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 10716b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbarvoid CompilerInstance::createSourceManager() { 10816b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar SourceMgr.reset(new SourceManager()); 10916b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar} 11022dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar 1110fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// Preprocessor 1120fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 11322dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbarvoid CompilerInstance::createPreprocessor() { 11422dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar PP.reset(createPreprocessor(getDiagnostics(), getLangOpts(), 11522dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar getPreprocessorOpts(), getHeaderSearchOpts(), 11622dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar getDependencyOutputOpts(), getTarget(), 11722dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar getSourceManager(), getFileManager())); 11822dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar} 11922dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar 12022dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel DunbarPreprocessor * 12122dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel DunbarCompilerInstance::createPreprocessor(Diagnostic &Diags, 12222dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar const LangOptions &LangInfo, 12322dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar const PreprocessorOptions &PPOpts, 12422dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar const HeaderSearchOptions &HSOpts, 12522dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar const DependencyOutputOptions &DepOpts, 12622dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar const TargetInfo &Target, 12722dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar SourceManager &SourceMgr, 12822dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar FileManager &FileMgr) { 12922dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // Create a PTH manager if we are using some form of a token cache. 13022dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar PTHManager *PTHMgr = 0; 13122dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar if (!PPOpts.getTokenCache().empty()) 13222dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar PTHMgr = PTHManager::Create(PPOpts.getTokenCache(), Diags); 13322dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar 13422dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // FIXME: Don't fail like this. 13522dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar if (Diags.hasErrorOccurred()) 13622dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar exit(1); 13722dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar 13822dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // Create the Preprocessor. 13922dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar HeaderSearch *HeaderInfo = new HeaderSearch(FileMgr); 14022dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar Preprocessor *PP = new Preprocessor(Diags, LangInfo, Target, 14122dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar SourceMgr, *HeaderInfo, PTHMgr, 14222dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar /*OwnsHeaderSearch=*/true); 14322dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar 14422dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // Note that this is different then passing PTHMgr to Preprocessor's ctor. 14522dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // That argument is used as the IdentifierInfoLookup argument to 14622dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // IdentifierTable's ctor. 14722dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar if (PTHMgr) { 14822dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar PTHMgr->setPreprocessor(PP); 14922dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar PP->setPTHManager(PTHMgr); 15022dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar } 15122dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar 15222dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar InitializePreprocessor(*PP, PPOpts, HSOpts); 15322dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar 15422dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // Handle generating dependencies, if requested. 15522dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar if (!DepOpts.OutputFile.empty()) 15622dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar AttachDependencyFileGen(*PP, DepOpts); 15722dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar 15822dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar return PP; 15922dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar} 1605eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar 1615eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar// ASTContext 1625eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar 1635eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbarvoid CompilerInstance::createASTContext() { 1645eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar Preprocessor &PP = getPreprocessor(); 1655eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar Context.reset(new ASTContext(getLangOpts(), PP.getSourceManager(), 1665eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar getTarget(), PP.getIdentifierTable(), 1675eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar PP.getSelectorTable(), PP.getBuiltinInfo(), 1685eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar /*FreeMemory=*/ !getFrontendOpts().DisableFree, 1695eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar /*size_reserve=*/ 0)); 1705eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar} 1710f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 1720f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar// ExternalASTSource 1730f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 1740f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbarvoid CompilerInstance::createPCHExternalASTSource(llvm::StringRef Path) { 1750f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar llvm::OwningPtr<ExternalASTSource> Source; 1760f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar Source.reset(createPCHExternalASTSource(Path, getHeaderSearchOpts().Sysroot, 1770f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar getPreprocessor(), getASTContext())); 1780f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar getASTContext().setExternalSource(Source); 1790f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar} 1800f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 1810f800391ffbfe3820e1c60246a09a97e5f065179Daniel DunbarExternalASTSource * 1820f800391ffbfe3820e1c60246a09a97e5f065179Daniel DunbarCompilerInstance::createPCHExternalASTSource(llvm::StringRef Path, 1830f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar const std::string &Sysroot, 1840f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar Preprocessor &PP, 1850f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar ASTContext &Context) { 1860f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar llvm::OwningPtr<PCHReader> Reader; 1870f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar Reader.reset(new PCHReader(PP, &Context, 1880f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar Sysroot.empty() ? 0 : Sysroot.c_str())); 1890f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 1900f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar switch (Reader->ReadPCH(Path)) { 1910f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar case PCHReader::Success: 1920f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // Set the predefines buffer as suggested by the PCH reader. Typically, the 1930f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // predefines buffer will be empty. 1940f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar PP.setPredefines(Reader->getSuggestedPredefines()); 1950f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar return Reader.take(); 1960f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 1970f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar case PCHReader::Failure: 1980f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // Unrecoverable failure: don't even try to process the input file. 1990f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar break; 2000f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 2010f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar case PCHReader::IgnorePCH: 2020f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // No suitable PCH file could be found. Return an error. 2030f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar break; 2040f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar } 2050f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 2060f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar return 0; 2070f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar} 208c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 209c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar// Code Completion 210c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 211c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbarvoid CompilerInstance::createCodeCompletionConsumer() { 212c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar const ParsedSourceLocation &Loc = getFrontendOpts().CodeCompletionAt; 213c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar CompletionConsumer.reset( 214c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar createCodeCompletionConsumer(getPreprocessor(), 215c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar Loc.FileName, Loc.Line, Loc.Column, 216c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar getFrontendOpts().DebugCodeCompletionPrinter, 217c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar getFrontendOpts().ShowMacrosInCodeCompletion, 218c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar llvm::outs())); 219c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar} 220c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 221c2f484f1f05216a9a427ac84b5773789a4661111Daniel DunbarCodeCompleteConsumer * 222c2f484f1f05216a9a427ac84b5773789a4661111Daniel DunbarCompilerInstance::createCodeCompletionConsumer(Preprocessor &PP, 223c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar const std::string &Filename, 224c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar unsigned Line, 225c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar unsigned Column, 226c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar bool UseDebugPrinter, 227c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar bool ShowMacros, 228c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar llvm::raw_ostream &OS) { 229c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar // Tell the source manager to chop off the given file at a specific 230c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar // line and column. 231c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar const FileEntry *Entry = PP.getFileManager().getFile(Filename); 232c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar if (!Entry) { 233c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar PP.getDiagnostics().Report(diag::err_fe_invalid_code_complete_file) 234c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar << Filename; 235c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar return 0; 236c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar } 237c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 238c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar // Truncate the named file at the given line/column. 239c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar PP.getSourceManager().truncateFileAt(Entry, Line, Column); 240c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 241c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar // Set up the creation routine for code-completion. 242c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar if (UseDebugPrinter) 243c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar return new PrintingCodeCompleteConsumer(ShowMacros, OS); 244c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar else 245c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar return new CIndexCodeCompleteConsumer(ShowMacros, OS); 246c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar} 247a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar 248a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar// Output Files 249a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar 250a9204831639e31474b927681b97c46781b758a1aDaniel Dunbarvoid CompilerInstance::addOutputFile(llvm::StringRef Path, 251a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar llvm::raw_ostream *OS) { 252a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar assert(OS && "Attempt to add empty stream to output list!"); 253a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar OutputFiles.push_back(std::make_pair(Path, OS)); 254a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar} 255a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar 256a9204831639e31474b927681b97c46781b758a1aDaniel Dunbarvoid CompilerInstance::ClearOutputFiles(bool EraseFiles) { 257a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar for (std::list< std::pair<std::string, llvm::raw_ostream*> >::iterator 258a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar it = OutputFiles.begin(), ie = OutputFiles.end(); it != ie; ++it) { 259a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar delete it->second; 260a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar if (EraseFiles && !it->first.empty()) 261a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar llvm::sys::Path(it->first).eraseFromDisk(); 262a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar } 263a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar OutputFiles.clear(); 264a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar} 265a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar 266f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbarllvm::raw_fd_ostream * 267f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel DunbarCompilerInstance::createDefaultOutputFile(bool Binary, 268f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar llvm::StringRef InFile, 269f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar llvm::StringRef Extension) { 270f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar return createOutputFile(getFrontendOpts().OutputFile, Binary, 271f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar InFile, Extension); 272f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar} 273f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 274f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbarllvm::raw_fd_ostream * 275f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel DunbarCompilerInstance::createOutputFile(llvm::StringRef OutputPath, 276f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar bool Binary, 277f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar llvm::StringRef InFile, 278f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar llvm::StringRef Extension) { 279f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar std::string Error, OutputPathName; 280f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar llvm::raw_fd_ostream *OS = createOutputFile(OutputPath, Error, Binary, 281f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar InFile, Extension, 282f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar &OutputPathName); 283f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar if (!OS) { 284f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar // FIXME: Don't fail this way. 285f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar llvm::errs() << "ERROR: " << Error << "\n"; 286f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar ::exit(1); 287f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } 288f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 289f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar // Add the output file -- but don't try to remove "-", since this means we are 290f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar // using stdin. 291f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar addOutputFile((OutputPathName != "-") ? OutputPathName : "", OS); 292f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 293f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar return OS; 294f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar} 295f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 296f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbarllvm::raw_fd_ostream * 297f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel DunbarCompilerInstance::createOutputFile(llvm::StringRef OutputPath, 298f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar std::string &Error, 299f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar bool Binary, 300f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar llvm::StringRef InFile, 301f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar llvm::StringRef Extension, 302f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar std::string *ResultPathName) { 303f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar std::string OutFile; 304f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar if (!OutputPath.empty()) { 305f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar OutFile = OutputPath; 306f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } else if (InFile == "-") { 307f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar OutFile = "-"; 308f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } else if (!Extension.empty()) { 309f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar llvm::sys::Path Path(InFile); 310f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar Path.eraseSuffix(); 311f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar Path.appendSuffix(Extension); 312f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar OutFile = Path.str(); 313f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } else { 314f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar OutFile = "-"; 315f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } 316f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 317f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar llvm::raw_fd_ostream *OS = 318f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar new llvm::raw_fd_ostream(OutFile.c_str(), Error, 319f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar (Binary ? llvm::raw_fd_ostream::F_Binary : 0)); 320f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar if (!OS) 321f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar return 0; 322f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 323f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar if (ResultPathName) 324f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar *ResultPathName = OutFile; 325f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 326f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar return OS; 327f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar} 328