]> CyberLeo.Net >> Repos - FreeBSD/releng/9.0.git/blob - contrib/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp
Copy stable/9 to releng/9.0 as part of the FreeBSD 9.0-RELEASE release
[FreeBSD/releng/9.0.git] / contrib / llvm / tools / clang / lib / Frontend / CompilerInstance.cpp
1 //===--- CompilerInstance.cpp ---------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "clang/Frontend/CompilerInstance.h"
11 #include "clang/Sema/Sema.h"
12 #include "clang/AST/ASTConsumer.h"
13 #include "clang/AST/ASTContext.h"
14 #include "clang/Basic/Diagnostic.h"
15 #include "clang/Basic/FileManager.h"
16 #include "clang/Basic/SourceManager.h"
17 #include "clang/Basic/TargetInfo.h"
18 #include "clang/Basic/Version.h"
19 #include "clang/Lex/HeaderSearch.h"
20 #include "clang/Lex/Preprocessor.h"
21 #include "clang/Lex/PTHManager.h"
22 #include "clang/Frontend/ChainedDiagnosticConsumer.h"
23 #include "clang/Frontend/FrontendAction.h"
24 #include "clang/Frontend/FrontendActions.h"
25 #include "clang/Frontend/FrontendDiagnostic.h"
26 #include "clang/Frontend/LogDiagnosticPrinter.h"
27 #include "clang/Frontend/TextDiagnosticPrinter.h"
28 #include "clang/Frontend/VerifyDiagnosticConsumer.h"
29 #include "clang/Frontend/Utils.h"
30 #include "clang/Serialization/ASTReader.h"
31 #include "clang/Sema/CodeCompleteConsumer.h"
32 #include "llvm/Support/FileSystem.h"
33 #include "llvm/Support/MemoryBuffer.h"
34 #include "llvm/Support/raw_ostream.h"
35 #include "llvm/ADT/Statistic.h"
36 #include "llvm/Support/Timer.h"
37 #include "llvm/Support/Host.h"
38 #include "llvm/Support/Path.h"
39 #include "llvm/Support/Program.h"
40 #include "llvm/Support/Signals.h"
41 #include "llvm/Support/system_error.h"
42 #include "llvm/Support/CrashRecoveryContext.h"
43 #include "llvm/Config/config.h"
44
45 // Support for FileLockManager
46 #include <fstream>
47 #include <sys/types.h>
48 #include <sys/stat.h>
49
50 #if LLVM_ON_WIN32
51 #include <windows.h>
52 #endif
53 #if LLVM_ON_UNIX
54 #include <unistd.h>
55 #endif
56
57 using namespace clang;
58
59 CompilerInstance::CompilerInstance()
60   : Invocation(new CompilerInvocation()), ModuleManager(0) {
61 }
62
63 CompilerInstance::~CompilerInstance() {
64 }
65
66 void CompilerInstance::setInvocation(CompilerInvocation *Value) {
67   Invocation = Value;
68 }
69
70 void CompilerInstance::setDiagnostics(DiagnosticsEngine *Value) {
71   Diagnostics = Value;
72 }
73
74 void CompilerInstance::setTarget(TargetInfo *Value) {
75   Target = Value;
76 }
77
78 void CompilerInstance::setFileManager(FileManager *Value) {
79   FileMgr = Value;
80 }
81
82 void CompilerInstance::setSourceManager(SourceManager *Value) {
83   SourceMgr = Value;
84 }
85
86 void CompilerInstance::setPreprocessor(Preprocessor *Value) { PP = Value; }
87
88 void CompilerInstance::setASTContext(ASTContext *Value) { Context = Value; }
89
90 void CompilerInstance::setSema(Sema *S) {
91   TheSema.reset(S);
92 }
93
94 void CompilerInstance::setASTConsumer(ASTConsumer *Value) {
95   Consumer.reset(Value);
96 }
97
98 void CompilerInstance::setCodeCompletionConsumer(CodeCompleteConsumer *Value) {
99   CompletionConsumer.reset(Value);
100 }
101
102 // Diagnostics
103 static void SetUpBuildDumpLog(const DiagnosticOptions &DiagOpts,
104                               unsigned argc, const char* const *argv,
105                               DiagnosticsEngine &Diags) {
106   std::string ErrorInfo;
107   llvm::OwningPtr<raw_ostream> OS(
108     new llvm::raw_fd_ostream(DiagOpts.DumpBuildInformation.c_str(), ErrorInfo));
109   if (!ErrorInfo.empty()) {
110     Diags.Report(diag::err_fe_unable_to_open_logfile)
111                  << DiagOpts.DumpBuildInformation << ErrorInfo;
112     return;
113   }
114
115   (*OS) << "clang -cc1 command line arguments: ";
116   for (unsigned i = 0; i != argc; ++i)
117     (*OS) << argv[i] << ' ';
118   (*OS) << '\n';
119
120   // Chain in a diagnostic client which will log the diagnostics.
121   DiagnosticConsumer *Logger =
122     new TextDiagnosticPrinter(*OS.take(), DiagOpts, /*OwnsOutputStream=*/true);
123   Diags.setClient(new ChainedDiagnosticConsumer(Diags.takeClient(), Logger));
124 }
125
126 static void SetUpDiagnosticLog(const DiagnosticOptions &DiagOpts,
127                                const CodeGenOptions *CodeGenOpts,
128                                DiagnosticsEngine &Diags) {
129   std::string ErrorInfo;
130   bool OwnsStream = false;
131   raw_ostream *OS = &llvm::errs();
132   if (DiagOpts.DiagnosticLogFile != "-") {
133     // Create the output stream.
134     llvm::raw_fd_ostream *FileOS(
135       new llvm::raw_fd_ostream(DiagOpts.DiagnosticLogFile.c_str(),
136                                ErrorInfo, llvm::raw_fd_ostream::F_Append));
137     if (!ErrorInfo.empty()) {
138       Diags.Report(diag::warn_fe_cc_log_diagnostics_failure)
139         << DiagOpts.DumpBuildInformation << ErrorInfo;
140     } else {
141       FileOS->SetUnbuffered();
142       FileOS->SetUseAtomicWrites(true);
143       OS = FileOS;
144       OwnsStream = true;
145     }
146   }
147
148   // Chain in the diagnostic client which will log the diagnostics.
149   LogDiagnosticPrinter *Logger = new LogDiagnosticPrinter(*OS, DiagOpts,
150                                                           OwnsStream);
151   if (CodeGenOpts)
152     Logger->setDwarfDebugFlags(CodeGenOpts->DwarfDebugFlags);
153   Diags.setClient(new ChainedDiagnosticConsumer(Diags.takeClient(), Logger));
154 }
155
156 void CompilerInstance::createDiagnostics(int Argc, const char* const *Argv,
157                                          DiagnosticConsumer *Client,
158                                          bool ShouldOwnClient,
159                                          bool ShouldCloneClient) {
160   Diagnostics = createDiagnostics(getDiagnosticOpts(), Argc, Argv, Client,
161                                   ShouldOwnClient, ShouldCloneClient,
162                                   &getCodeGenOpts());
163 }
164
165 llvm::IntrusiveRefCntPtr<DiagnosticsEngine>
166 CompilerInstance::createDiagnostics(const DiagnosticOptions &Opts,
167                                     int Argc, const char* const *Argv,
168                                     DiagnosticConsumer *Client,
169                                     bool ShouldOwnClient,
170                                     bool ShouldCloneClient,
171                                     const CodeGenOptions *CodeGenOpts) {
172   llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
173   llvm::IntrusiveRefCntPtr<DiagnosticsEngine>
174       Diags(new DiagnosticsEngine(DiagID));
175
176   // Create the diagnostic client for reporting errors or for
177   // implementing -verify.
178   if (Client) {
179     if (ShouldCloneClient)
180       Diags->setClient(Client->clone(*Diags), ShouldOwnClient);
181     else
182       Diags->setClient(Client, ShouldOwnClient);
183   } else
184     Diags->setClient(new TextDiagnosticPrinter(llvm::errs(), Opts));
185
186   // Chain in -verify checker, if requested.
187   if (Opts.VerifyDiagnostics)
188     Diags->setClient(new VerifyDiagnosticConsumer(*Diags));
189
190   // Chain in -diagnostic-log-file dumper, if requested.
191   if (!Opts.DiagnosticLogFile.empty())
192     SetUpDiagnosticLog(Opts, CodeGenOpts, *Diags);
193
194   if (!Opts.DumpBuildInformation.empty())
195     SetUpBuildDumpLog(Opts, Argc, Argv, *Diags);
196
197   // Configure our handling of diagnostics.
198   ProcessWarningOptions(*Diags, Opts);
199
200   return Diags;
201 }
202
203 // File Manager
204
205 void CompilerInstance::createFileManager() {
206   FileMgr = new FileManager(getFileSystemOpts());
207 }
208
209 // Source Manager
210
211 void CompilerInstance::createSourceManager(FileManager &FileMgr) {
212   SourceMgr = new SourceManager(getDiagnostics(), FileMgr);
213 }
214
215 // Preprocessor
216
217 void CompilerInstance::createPreprocessor() {
218   const PreprocessorOptions &PPOpts = getPreprocessorOpts();
219
220   // Create a PTH manager if we are using some form of a token cache.
221   PTHManager *PTHMgr = 0;
222   if (!PPOpts.TokenCache.empty())
223     PTHMgr = PTHManager::Create(PPOpts.TokenCache, getDiagnostics());
224
225   // Create the Preprocessor.
226   HeaderSearch *HeaderInfo = new HeaderSearch(getFileManager());
227   PP = new Preprocessor(getDiagnostics(), getLangOpts(), &getTarget(),
228                         getSourceManager(), *HeaderInfo, *this, PTHMgr,
229                         /*OwnsHeaderSearch=*/true);
230
231   // Note that this is different then passing PTHMgr to Preprocessor's ctor.
232   // That argument is used as the IdentifierInfoLookup argument to
233   // IdentifierTable's ctor.
234   if (PTHMgr) {
235     PTHMgr->setPreprocessor(&*PP);
236     PP->setPTHManager(PTHMgr);
237   }
238
239   if (PPOpts.DetailedRecord)
240     PP->createPreprocessingRecord(
241                                   PPOpts.DetailedRecordIncludesNestedMacroExpansions);
242
243   InitializePreprocessor(*PP, PPOpts, getHeaderSearchOpts(), getFrontendOpts());
244
245   // Set up the module path, including the hash for the
246   // module-creation options.
247   llvm::SmallString<256> SpecificModuleCache(
248                            getHeaderSearchOpts().ModuleCachePath);
249   if (!getHeaderSearchOpts().DisableModuleHash)
250     llvm::sys::path::append(SpecificModuleCache,
251                             getInvocation().getModuleHash());
252   PP->getHeaderSearchInfo().configureModules(SpecificModuleCache,
253     getPreprocessorOpts().ModuleBuildPath.empty()
254       ? std::string()
255       : getPreprocessorOpts().ModuleBuildPath.back());
256
257   // Handle generating dependencies, if requested.
258   const DependencyOutputOptions &DepOpts = getDependencyOutputOpts();
259   if (!DepOpts.OutputFile.empty())
260     AttachDependencyFileGen(*PP, DepOpts);
261
262   // Handle generating header include information, if requested.
263   if (DepOpts.ShowHeaderIncludes)
264     AttachHeaderIncludeGen(*PP);
265   if (!DepOpts.HeaderIncludeOutputFile.empty()) {
266     StringRef OutputPath = DepOpts.HeaderIncludeOutputFile;
267     if (OutputPath == "-")
268       OutputPath = "";
269     AttachHeaderIncludeGen(*PP, /*ShowAllHeaders=*/true, OutputPath,
270                            /*ShowDepth=*/false);
271   }
272 }
273
274 // ASTContext
275
276 void CompilerInstance::createASTContext() {
277   Preprocessor &PP = getPreprocessor();
278   Context = new ASTContext(getLangOpts(), PP.getSourceManager(),
279                            &getTarget(), PP.getIdentifierTable(),
280                            PP.getSelectorTable(), PP.getBuiltinInfo(),
281                            /*size_reserve=*/ 0);
282 }
283
284 // ExternalASTSource
285
286 void CompilerInstance::createPCHExternalASTSource(StringRef Path,
287                                                   bool DisablePCHValidation,
288                                                   bool DisableStatCache,
289                                                  void *DeserializationListener){
290   llvm::OwningPtr<ExternalASTSource> Source;
291   bool Preamble = getPreprocessorOpts().PrecompiledPreambleBytes.first != 0;
292   Source.reset(createPCHExternalASTSource(Path, getHeaderSearchOpts().Sysroot,
293                                           DisablePCHValidation,
294                                           DisableStatCache,
295                                           getPreprocessor(), getASTContext(),
296                                           DeserializationListener,
297                                           Preamble));
298   ModuleManager = static_cast<ASTReader*>(Source.get());
299   getASTContext().setExternalSource(Source);
300 }
301
302 ExternalASTSource *
303 CompilerInstance::createPCHExternalASTSource(StringRef Path,
304                                              const std::string &Sysroot,
305                                              bool DisablePCHValidation,
306                                              bool DisableStatCache,
307                                              Preprocessor &PP,
308                                              ASTContext &Context,
309                                              void *DeserializationListener,
310                                              bool Preamble) {
311   llvm::OwningPtr<ASTReader> Reader;
312   Reader.reset(new ASTReader(PP, Context,
313                              Sysroot.empty() ? "" : Sysroot.c_str(),
314                              DisablePCHValidation, DisableStatCache));
315
316   Reader->setDeserializationListener(
317             static_cast<ASTDeserializationListener *>(DeserializationListener));
318   switch (Reader->ReadAST(Path,
319                           Preamble ? serialization::MK_Preamble
320                                    : serialization::MK_PCH)) {
321   case ASTReader::Success:
322     // Set the predefines buffer as suggested by the PCH reader. Typically, the
323     // predefines buffer will be empty.
324     PP.setPredefines(Reader->getSuggestedPredefines());
325     return Reader.take();
326
327   case ASTReader::Failure:
328     // Unrecoverable failure: don't even try to process the input file.
329     break;
330
331   case ASTReader::IgnorePCH:
332     // No suitable PCH file could be found. Return an error.
333     break;
334   }
335
336   return 0;
337 }
338
339 // Code Completion
340
341 static bool EnableCodeCompletion(Preprocessor &PP,
342                                  const std::string &Filename,
343                                  unsigned Line,
344                                  unsigned Column) {
345   // Tell the source manager to chop off the given file at a specific
346   // line and column.
347   const FileEntry *Entry = PP.getFileManager().getFile(Filename);
348   if (!Entry) {
349     PP.getDiagnostics().Report(diag::err_fe_invalid_code_complete_file)
350       << Filename;
351     return true;
352   }
353
354   // Truncate the named file at the given line/column.
355   PP.SetCodeCompletionPoint(Entry, Line, Column);
356   return false;
357 }
358
359 void CompilerInstance::createCodeCompletionConsumer() {
360   const ParsedSourceLocation &Loc = getFrontendOpts().CodeCompletionAt;
361   if (!CompletionConsumer) {
362     CompletionConsumer.reset(
363       createCodeCompletionConsumer(getPreprocessor(),
364                                    Loc.FileName, Loc.Line, Loc.Column,
365                                    getFrontendOpts().ShowMacrosInCodeCompletion,
366                              getFrontendOpts().ShowCodePatternsInCodeCompletion,
367                            getFrontendOpts().ShowGlobalSymbolsInCodeCompletion,
368                                    llvm::outs()));
369     if (!CompletionConsumer)
370       return;
371   } else if (EnableCodeCompletion(getPreprocessor(), Loc.FileName,
372                                   Loc.Line, Loc.Column)) {
373     CompletionConsumer.reset();
374     return;
375   }
376
377   if (CompletionConsumer->isOutputBinary() &&
378       llvm::sys::Program::ChangeStdoutToBinary()) {
379     getPreprocessor().getDiagnostics().Report(diag::err_fe_stdout_binary);
380     CompletionConsumer.reset();
381   }
382 }
383
384 void CompilerInstance::createFrontendTimer() {
385   FrontendTimer.reset(new llvm::Timer("Clang front-end timer"));
386 }
387
388 CodeCompleteConsumer *
389 CompilerInstance::createCodeCompletionConsumer(Preprocessor &PP,
390                                                const std::string &Filename,
391                                                unsigned Line,
392                                                unsigned Column,
393                                                bool ShowMacros,
394                                                bool ShowCodePatterns,
395                                                bool ShowGlobals,
396                                                raw_ostream &OS) {
397   if (EnableCodeCompletion(PP, Filename, Line, Column))
398     return 0;
399
400   // Set up the creation routine for code-completion.
401   return new PrintingCodeCompleteConsumer(ShowMacros, ShowCodePatterns,
402                                           ShowGlobals, OS);
403 }
404
405 void CompilerInstance::createSema(TranslationUnitKind TUKind,
406                                   CodeCompleteConsumer *CompletionConsumer) {
407   TheSema.reset(new Sema(getPreprocessor(), getASTContext(), getASTConsumer(),
408                          TUKind, CompletionConsumer));
409 }
410
411 // Output Files
412
413 void CompilerInstance::addOutputFile(const OutputFile &OutFile) {
414   assert(OutFile.OS && "Attempt to add empty stream to output list!");
415   OutputFiles.push_back(OutFile);
416 }
417
418 void CompilerInstance::clearOutputFiles(bool EraseFiles) {
419   for (std::list<OutputFile>::iterator
420          it = OutputFiles.begin(), ie = OutputFiles.end(); it != ie; ++it) {
421     delete it->OS;
422     if (!it->TempFilename.empty()) {
423       if (EraseFiles) {
424         bool existed;
425         llvm::sys::fs::remove(it->TempFilename, existed);
426       } else {
427         llvm::SmallString<128> NewOutFile(it->Filename);
428
429         // If '-working-directory' was passed, the output filename should be
430         // relative to that.
431         FileMgr->FixupRelativePath(NewOutFile);
432         if (llvm::error_code ec = llvm::sys::fs::rename(it->TempFilename,
433                                                         NewOutFile.str())) {
434           getDiagnostics().Report(diag::err_fe_unable_to_rename_temp)
435             << it->TempFilename << it->Filename << ec.message();
436
437           bool existed;
438           llvm::sys::fs::remove(it->TempFilename, existed);
439         }
440       }
441     } else if (!it->Filename.empty() && EraseFiles)
442       llvm::sys::Path(it->Filename).eraseFromDisk();
443
444   }
445   OutputFiles.clear();
446 }
447
448 llvm::raw_fd_ostream *
449 CompilerInstance::createDefaultOutputFile(bool Binary,
450                                           StringRef InFile,
451                                           StringRef Extension) {
452   return createOutputFile(getFrontendOpts().OutputFile, Binary,
453                           /*RemoveFileOnSignal=*/true, InFile, Extension);
454 }
455
456 llvm::raw_fd_ostream *
457 CompilerInstance::createOutputFile(StringRef OutputPath,
458                                    bool Binary, bool RemoveFileOnSignal,
459                                    StringRef InFile,
460                                    StringRef Extension,
461                                    bool UseTemporary) {
462   std::string Error, OutputPathName, TempPathName;
463   llvm::raw_fd_ostream *OS = createOutputFile(OutputPath, Error, Binary,
464                                               RemoveFileOnSignal,
465                                               InFile, Extension,
466                                               UseTemporary,
467                                               &OutputPathName,
468                                               &TempPathName);
469   if (!OS) {
470     getDiagnostics().Report(diag::err_fe_unable_to_open_output)
471       << OutputPath << Error;
472     return 0;
473   }
474
475   // Add the output file -- but don't try to remove "-", since this means we are
476   // using stdin.
477   addOutputFile(OutputFile((OutputPathName != "-") ? OutputPathName : "",
478                 TempPathName, OS));
479
480   return OS;
481 }
482
483 llvm::raw_fd_ostream *
484 CompilerInstance::createOutputFile(StringRef OutputPath,
485                                    std::string &Error,
486                                    bool Binary,
487                                    bool RemoveFileOnSignal,
488                                    StringRef InFile,
489                                    StringRef Extension,
490                                    bool UseTemporary,
491                                    std::string *ResultPathName,
492                                    std::string *TempPathName) {
493   std::string OutFile, TempFile;
494   if (!OutputPath.empty()) {
495     OutFile = OutputPath;
496   } else if (InFile == "-") {
497     OutFile = "-";
498   } else if (!Extension.empty()) {
499     llvm::sys::Path Path(InFile);
500     Path.eraseSuffix();
501     Path.appendSuffix(Extension);
502     OutFile = Path.str();
503   } else {
504     OutFile = "-";
505   }
506
507   llvm::OwningPtr<llvm::raw_fd_ostream> OS;
508   std::string OSFile;
509
510   if (UseTemporary && OutFile != "-") {
511     llvm::sys::Path OutPath(OutFile);
512     // Only create the temporary if we can actually write to OutPath, otherwise
513     // we want to fail early.
514     bool Exists;
515     if ((llvm::sys::fs::exists(OutPath.str(), Exists) || !Exists) ||
516         (OutPath.isRegularFile() && OutPath.canWrite())) {
517       // Create a temporary file.
518       llvm::SmallString<128> TempPath;
519       TempPath = OutFile;
520       TempPath += "-%%%%%%%%";
521       int fd;
522       if (llvm::sys::fs::unique_file(TempPath.str(), fd, TempPath,
523                                /*makeAbsolute=*/false) == llvm::errc::success) {
524         OS.reset(new llvm::raw_fd_ostream(fd, /*shouldClose=*/true));
525         OSFile = TempFile = TempPath.str();
526       }
527     }
528   }
529
530   if (!OS) {
531     OSFile = OutFile;
532     OS.reset(
533       new llvm::raw_fd_ostream(OSFile.c_str(), Error,
534                                (Binary ? llvm::raw_fd_ostream::F_Binary : 0)));
535     if (!Error.empty())
536       return 0;
537   }
538
539   // Make sure the out stream file gets removed if we crash.
540   if (RemoveFileOnSignal)
541     llvm::sys::RemoveFileOnSignal(llvm::sys::Path(OSFile));
542
543   if (ResultPathName)
544     *ResultPathName = OutFile;
545   if (TempPathName)
546     *TempPathName = TempFile;
547
548   return OS.take();
549 }
550
551 // Initialization Utilities
552
553 bool CompilerInstance::InitializeSourceManager(StringRef InputFile) {
554   return InitializeSourceManager(InputFile, getDiagnostics(), getFileManager(),
555                                  getSourceManager(), getFrontendOpts());
556 }
557
558 bool CompilerInstance::InitializeSourceManager(StringRef InputFile,
559                                                DiagnosticsEngine &Diags,
560                                                FileManager &FileMgr,
561                                                SourceManager &SourceMgr,
562                                                const FrontendOptions &Opts) {
563   // Figure out where to get and map in the main file.
564   if (InputFile != "-") {
565     const FileEntry *File = FileMgr.getFile(InputFile);
566     if (!File) {
567       Diags.Report(diag::err_fe_error_reading) << InputFile;
568       return false;
569     }
570     SourceMgr.createMainFileID(File);
571   } else {
572     llvm::OwningPtr<llvm::MemoryBuffer> SB;
573     if (llvm::MemoryBuffer::getSTDIN(SB)) {
574       // FIXME: Give ec.message() in this diag.
575       Diags.Report(diag::err_fe_error_reading_stdin);
576       return false;
577     }
578     const FileEntry *File = FileMgr.getVirtualFile(SB->getBufferIdentifier(),
579                                                    SB->getBufferSize(), 0);
580     SourceMgr.createMainFileID(File);
581     SourceMgr.overrideFileContents(File, SB.take());
582   }
583
584   assert(!SourceMgr.getMainFileID().isInvalid() &&
585          "Couldn't establish MainFileID!");
586   return true;
587 }
588
589 // High-Level Operations
590
591 bool CompilerInstance::ExecuteAction(FrontendAction &Act) {
592   assert(hasDiagnostics() && "Diagnostics engine is not initialized!");
593   assert(!getFrontendOpts().ShowHelp && "Client must handle '-help'!");
594   assert(!getFrontendOpts().ShowVersion && "Client must handle '-version'!");
595
596   // FIXME: Take this as an argument, once all the APIs we used have moved to
597   // taking it as an input instead of hard-coding llvm::errs.
598   raw_ostream &OS = llvm::errs();
599
600   // Create the target instance.
601   setTarget(TargetInfo::CreateTargetInfo(getDiagnostics(), getTargetOpts()));
602   if (!hasTarget())
603     return false;
604
605   // Inform the target of the language options.
606   //
607   // FIXME: We shouldn't need to do this, the target should be immutable once
608   // created. This complexity should be lifted elsewhere.
609   getTarget().setForcedLangOptions(getLangOpts());
610
611   // Validate/process some options.
612   if (getHeaderSearchOpts().Verbose)
613     OS << "clang -cc1 version " CLANG_VERSION_STRING
614        << " based upon " << PACKAGE_STRING
615        << " hosted on " << llvm::sys::getHostTriple() << "\n";
616
617   if (getFrontendOpts().ShowTimers)
618     createFrontendTimer();
619
620   if (getFrontendOpts().ShowStats)
621     llvm::EnableStatistics();
622
623   for (unsigned i = 0, e = getFrontendOpts().Inputs.size(); i != e; ++i) {
624     const std::string &InFile = getFrontendOpts().Inputs[i].second;
625
626     // Reset the ID tables if we are reusing the SourceManager.
627     if (hasSourceManager())
628       getSourceManager().clearIDTables();
629
630     if (Act.BeginSourceFile(*this, InFile, getFrontendOpts().Inputs[i].first)) {
631       Act.Execute();
632       Act.EndSourceFile();
633     }
634   }
635
636   if (getDiagnosticOpts().ShowCarets) {
637     // We can have multiple diagnostics sharing one diagnostic client.
638     // Get the total number of warnings/errors from the client.
639     unsigned NumWarnings = getDiagnostics().getClient()->getNumWarnings();
640     unsigned NumErrors = getDiagnostics().getClient()->getNumErrors();
641
642     if (NumWarnings)
643       OS << NumWarnings << " warning" << (NumWarnings == 1 ? "" : "s");
644     if (NumWarnings && NumErrors)
645       OS << " and ";
646     if (NumErrors)
647       OS << NumErrors << " error" << (NumErrors == 1 ? "" : "s");
648     if (NumWarnings || NumErrors)
649       OS << " generated.\n";
650   }
651
652   if (getFrontendOpts().ShowStats && hasFileManager()) {
653     getFileManager().PrintStats();
654     OS << "\n";
655   }
656
657   return !getDiagnostics().getClient()->getNumErrors();
658 }
659
660 /// \brief Determine the appropriate source input kind based on language
661 /// options.
662 static InputKind getSourceInputKindFromOptions(const LangOptions &LangOpts) {
663   if (LangOpts.OpenCL)
664     return IK_OpenCL;
665   if (LangOpts.CUDA)
666     return IK_CUDA;
667   if (LangOpts.ObjC1)
668     return LangOpts.CPlusPlus? IK_ObjCXX : IK_ObjC;
669   return LangOpts.CPlusPlus? IK_CXX : IK_C;
670 }
671
672 namespace {
673   struct CompileModuleData {
674     CompilerInstance &Instance;
675     GeneratePCHAction &CreateModuleAction;
676   };
677 }
678
679 /// \brief Helper function that executes the module-generating action under
680 /// a crash recovery context.
681 static void doCompileModule(void *UserData) {
682   CompileModuleData &Data = *reinterpret_cast<CompileModuleData *>(UserData);
683   Data.Instance.ExecuteAction(Data.CreateModuleAction);
684 }
685
686 namespace {
687   /// \brief Class that manages the creation of a lock file to aid
688   /// implicit coordination between different processes.
689   ///
690   /// The implicit coordination works by creating a ".lock" file alongside
691   /// the file that we're coordinating for, using the atomicity of the file
692   /// system to ensure that only a single process can create that ".lock" file.
693   /// When the lock file is removed, the owning process has finished the
694   /// operation.
695   class LockFileManager {
696   public:
697     /// \brief Describes the state of a lock file.
698     enum LockFileState {
699       /// \brief The lock file has been created and is owned by this instance
700       /// of the object.
701       LFS_Owned,
702       /// \brief The lock file already exists and is owned by some other
703       /// instance.
704       LFS_Shared,
705       /// \brief An error occurred while trying to create or find the lock
706       /// file.
707       LFS_Error
708     };
709
710   private:
711     llvm::SmallString<128> LockFileName;
712     llvm::SmallString<128> UniqueLockFileName;
713
714     llvm::Optional<std::pair<std::string, int> > Owner;
715     llvm::Optional<llvm::error_code> Error;
716
717     LockFileManager(const LockFileManager &);
718     LockFileManager &operator=(const LockFileManager &);
719
720     static llvm::Optional<std::pair<std::string, int> >
721     readLockFile(StringRef LockFileName);
722
723     static bool processStillExecuting(StringRef Hostname, int PID);
724
725   public:
726
727     LockFileManager(StringRef FileName);
728     ~LockFileManager();
729
730     /// \brief Determine the state of the lock file.
731     LockFileState getState() const;
732
733     operator LockFileState() const { return getState(); }
734
735     /// \brief For a shared lock, wait until the owner releases the lock.
736     void waitForUnlock();
737   };
738 }
739
740 /// \brief Attempt to read the lock file with the given name, if it exists.
741 ///
742 /// \param LockFileName The name of the lock file to read.
743 ///
744 /// \returns The process ID of the process that owns this lock file
745 llvm::Optional<std::pair<std::string, int> >
746 LockFileManager::readLockFile(StringRef LockFileName) {
747   // Check whether the lock file exists. If not, clearly there's nothing
748   // to read, so we just return.
749   bool Exists = false;
750   if (llvm::sys::fs::exists(LockFileName, Exists) || !Exists)
751     return llvm::Optional<std::pair<std::string, int> >();
752
753   // Read the owning host and PID out of the lock file. If it appears that the
754   // owning process is dead, the lock file is invalid.
755   int PID = 0;
756   std::string Hostname;
757   std::ifstream Input(LockFileName.str().c_str());
758   if (Input >> Hostname >> PID && PID > 0 &&
759       processStillExecuting(Hostname, PID))
760     return std::make_pair(Hostname, PID);
761
762   // Delete the lock file. It's invalid anyway.
763   bool Existed;
764   llvm::sys::fs::remove(LockFileName, Existed);
765   return llvm::Optional<std::pair<std::string, int> >();
766 }
767
768 bool LockFileManager::processStillExecuting(StringRef Hostname, int PID) {
769 #if LLVM_ON_UNIX
770   char MyHostname[256];
771   MyHostname[255] = 0;
772   MyHostname[0] = 0;
773   gethostname(MyHostname, 255);
774   // Check whether the process is dead. If so, we're done.
775   if (MyHostname == Hostname && getsid(PID) == -1 && errno == ESRCH)
776     return false;
777 #endif
778
779   return true;
780 }
781
782 LockFileManager::LockFileManager(StringRef FileName)
783 {
784   LockFileName = FileName;
785   LockFileName += ".lock";
786
787   // If the lock file already exists, don't bother to try to create our own
788   // lock file; it won't work anyway. Just figure out who owns this lock file.
789   if ((Owner = readLockFile(LockFileName)))
790     return;
791
792   // Create a lock file that is unique to this instance.
793   UniqueLockFileName = LockFileName;
794   UniqueLockFileName += "-%%%%%%%%";
795   int UniqueLockFileID;
796   if (llvm::error_code EC
797         = llvm::sys::fs::unique_file(UniqueLockFileName.str(),
798                                      UniqueLockFileID,
799                                      UniqueLockFileName,
800                                      /*makeAbsolute=*/false)) {
801     Error = EC;
802     return;
803   }
804
805   // Write our process ID to our unique lock file.
806   {
807     llvm::raw_fd_ostream Out(UniqueLockFileID, /*shouldClose=*/true);
808
809 #if LLVM_ON_UNIX
810     // FIXME: move getpid() call into LLVM
811     char hostname[256];
812     hostname[255] = 0;
813     hostname[0] = 0;
814     gethostname(hostname, 255);
815     Out << hostname << ' ' << getpid();
816 #else
817     Out << "localhost 1";
818 #endif
819     Out.close();
820
821     if (Out.has_error()) {
822       // We failed to write out PID, so make up an excuse, remove the
823       // unique lock file, and fail.
824       Error = llvm::make_error_code(llvm::errc::no_space_on_device);
825       bool Existed;
826       llvm::sys::fs::remove(UniqueLockFileName.c_str(), Existed);
827       return;
828     }
829   }
830
831   // Create a hard link from the lock file name. If this succeeds, we're done.
832   llvm::error_code EC
833     = llvm::sys::fs::create_hard_link(UniqueLockFileName.str(),
834                                       LockFileName.str());
835   if (EC == llvm::errc::success)
836     return;
837
838   // Creating the hard link failed.
839
840 #ifdef LLVM_ON_UNIX
841   // The creation of the hard link may appear to fail, but if stat'ing the
842   // unique file returns a link count of 2, then we can still declare success.
843   struct stat StatBuf;
844   if (stat(UniqueLockFileName.c_str(), &StatBuf) == 0 &&
845       StatBuf.st_nlink == 2)
846     return;
847 #endif
848
849   // Someone else managed to create the lock file first. Wipe out our unique
850   // lock file (it's useless now) and read the process ID from the lock file.
851   bool Existed;
852   llvm::sys::fs::remove(UniqueLockFileName.str(), Existed);
853   if ((Owner = readLockFile(LockFileName)))
854     return;
855
856   // There is a lock file that nobody owns; try to clean it up and report
857   // an error.
858   llvm::sys::fs::remove(LockFileName.str(), Existed);
859   Error = EC;
860 }
861
862 LockFileManager::LockFileState LockFileManager::getState() const {
863   if (Owner)
864     return LFS_Shared;
865
866   if (Error)
867     return LFS_Error;
868
869   return LFS_Owned;
870 }
871
872 LockFileManager::~LockFileManager() {
873   if (getState() != LFS_Owned)
874     return;
875
876   // Since we own the lock, remove the lock file and our own unique lock file.
877   bool Existed;
878   llvm::sys::fs::remove(LockFileName.str(), Existed);
879   llvm::sys::fs::remove(UniqueLockFileName.str(), Existed);
880 }
881
882 void LockFileManager::waitForUnlock() {
883   if (getState() != LFS_Shared)
884     return;
885
886 #if LLVM_ON_WIN32
887   unsigned long Interval = 1;
888 #else
889   struct timespec Interval;
890   Interval.tv_sec = 0;
891   Interval.tv_nsec = 1000000;
892 #endif
893   // Don't wait more than an hour for the file to appear.
894   const unsigned MaxSeconds = 3600;
895   do {
896     // Sleep for the designated interval, to allow the owning process time to
897     // finish up and
898     // FIXME: Should we hook in to system APIs to get a notification when the
899     // lock file is deleted?
900 #if LLVM_ON_WIN32
901     Sleep(Interval);
902 #else
903     nanosleep(&Interval, NULL);
904 #endif
905     // If the file no longer exists, we're done.
906     bool Exists = false;
907     if (!llvm::sys::fs::exists(LockFileName.str(), Exists) && !Exists)
908       return;
909
910     if (!processStillExecuting((*Owner).first, (*Owner).second))
911       return;
912
913     // Exponentially increase the time we wait for the lock to be removed.
914 #if LLVM_ON_WIN32
915     Interval *= 2;
916 #else
917     Interval.tv_sec *= 2;
918     Interval.tv_nsec *= 2;
919     if (Interval.tv_nsec >= 1000000000) {
920       ++Interval.tv_sec;
921       Interval.tv_nsec -= 1000000000;
922     }
923 #endif
924   } while (
925 #if LLVM_ON_WIN32
926            Interval < MaxSeconds * 1000
927 #else
928            Interval.tv_sec < (time_t)MaxSeconds
929 #endif
930            );
931
932   // Give up.
933 }
934
935 /// \brief Compile a module file for the given module name with the given
936 /// umbrella header, using the options provided by the importing compiler
937 /// instance.
938 static void compileModule(CompilerInstance &ImportingInstance,
939                           StringRef ModuleName,
940                           StringRef ModuleFileName,
941                           StringRef UmbrellaHeader) {
942   LockFileManager Locked(ModuleFileName);
943   switch (Locked) {
944   case LockFileManager::LFS_Error:
945     return;
946
947   case LockFileManager::LFS_Owned:
948     // We're responsible for building the module ourselves. Do so below.
949     break;
950
951   case LockFileManager::LFS_Shared:
952     // Someone else is responsible for building the module. Wait for them to
953     // finish.
954     Locked.waitForUnlock();
955     break;
956   }
957
958   // Construct a compiler invocation for creating this module.
959   llvm::IntrusiveRefCntPtr<CompilerInvocation> Invocation
960     (new CompilerInvocation(ImportingInstance.getInvocation()));
961
962   // For any options that aren't intended to affect how a module is built,
963   // reset them to their default values.
964   Invocation->getLangOpts().resetNonModularOptions();
965   Invocation->getPreprocessorOpts().resetNonModularOptions();
966
967   // Note that this module is part of the module build path, so that we
968   // can detect cycles in the module graph.
969   Invocation->getPreprocessorOpts().ModuleBuildPath.push_back(ModuleName);
970
971   // Set up the inputs/outputs so that we build the module from its umbrella
972   // header.
973   FrontendOptions &FrontendOpts = Invocation->getFrontendOpts();
974   FrontendOpts.OutputFile = ModuleFileName.str();
975   FrontendOpts.DisableFree = false;
976   FrontendOpts.Inputs.clear();
977   FrontendOpts.Inputs.push_back(
978     std::make_pair(getSourceInputKindFromOptions(Invocation->getLangOpts()),
979                                                  UmbrellaHeader));
980
981   Invocation->getDiagnosticOpts().VerifyDiagnostics = 0;
982
983
984   assert(ImportingInstance.getInvocation().getModuleHash() ==
985            Invocation->getModuleHash() && "Module hash mismatch!");
986
987   // Construct a compiler instance that will be used to actually create the
988   // module.
989   CompilerInstance Instance;
990   Instance.setInvocation(&*Invocation);
991   Instance.createDiagnostics(/*argc=*/0, /*argv=*/0,
992                              &ImportingInstance.getDiagnosticClient(),
993                              /*ShouldOwnClient=*/true,
994                              /*ShouldCloneClient=*/true);
995
996   // Construct a module-generating action.
997   GeneratePCHAction CreateModuleAction(true);
998
999   // Execute the action to actually build the module in-place. Use a separate
1000   // thread so that we get a stack large enough.
1001   const unsigned ThreadStackSize = 8 << 20;
1002   llvm::CrashRecoveryContext CRC;
1003   CompileModuleData Data = { Instance, CreateModuleAction };
1004   CRC.RunSafelyOnThread(&doCompileModule, &Data, ThreadStackSize);
1005 }
1006
1007 ModuleKey CompilerInstance::loadModule(SourceLocation ImportLoc,
1008                                        IdentifierInfo &ModuleName,
1009                                        SourceLocation ModuleNameLoc) {
1010   // Determine what file we're searching from.
1011   SourceManager &SourceMgr = getSourceManager();
1012   SourceLocation ExpandedImportLoc = SourceMgr.getExpansionLoc(ImportLoc);
1013   const FileEntry *CurFile
1014     = SourceMgr.getFileEntryForID(SourceMgr.getFileID(ExpandedImportLoc));
1015   if (!CurFile)
1016     CurFile = SourceMgr.getFileEntryForID(SourceMgr.getMainFileID());
1017
1018   // Search for a module with the given name.
1019   std::string UmbrellaHeader;
1020   std::string ModuleFileName;
1021   const FileEntry *ModuleFile
1022     = PP->getHeaderSearchInfo().lookupModule(ModuleName.getName(),
1023                                              &ModuleFileName,
1024                                              &UmbrellaHeader);
1025
1026   bool BuildingModule = false;
1027   if (!ModuleFile && !UmbrellaHeader.empty()) {
1028     // We didn't find the module, but there is an umbrella header that
1029     // can be used to create the module file. Create a separate compilation
1030     // module to do so.
1031
1032     // Check whether there is a cycle in the module graph.
1033     SmallVectorImpl<std::string> &ModuleBuildPath
1034       = getPreprocessorOpts().ModuleBuildPath;
1035     SmallVectorImpl<std::string>::iterator Pos
1036       = std::find(ModuleBuildPath.begin(), ModuleBuildPath.end(),
1037                   ModuleName.getName());
1038     if (Pos != ModuleBuildPath.end()) {
1039       llvm::SmallString<256> CyclePath;
1040       for (; Pos != ModuleBuildPath.end(); ++Pos) {
1041         CyclePath += *Pos;
1042         CyclePath += " -> ";
1043       }
1044       CyclePath += ModuleName.getName();
1045
1046       getDiagnostics().Report(ModuleNameLoc, diag::err_module_cycle)
1047         << ModuleName.getName() << CyclePath;
1048       return 0;
1049     }
1050
1051     getDiagnostics().Report(ModuleNameLoc, diag::warn_module_build)
1052       << ModuleName.getName();
1053     BuildingModule = true;
1054     compileModule(*this, ModuleName.getName(), ModuleFileName, UmbrellaHeader);
1055     ModuleFile = PP->getHeaderSearchInfo().lookupModule(ModuleName.getName());
1056   }
1057
1058   if (!ModuleFile) {
1059     getDiagnostics().Report(ModuleNameLoc,
1060                             BuildingModule? diag::err_module_not_built
1061                                           : diag::err_module_not_found)
1062       << ModuleName.getName()
1063       << SourceRange(ImportLoc, ModuleNameLoc);
1064     return 0;
1065   }
1066
1067   // If we don't already have an ASTReader, create one now.
1068   if (!ModuleManager) {
1069     if (!hasASTContext())
1070       createASTContext();
1071
1072     std::string Sysroot = getHeaderSearchOpts().Sysroot;
1073     const PreprocessorOptions &PPOpts = getPreprocessorOpts();
1074     ModuleManager = new ASTReader(getPreprocessor(), *Context,
1075                                   Sysroot.empty() ? "" : Sysroot.c_str(),
1076                                   PPOpts.DisablePCHValidation,
1077                                   PPOpts.DisableStatCache);
1078     if (hasASTConsumer()) {
1079       ModuleManager->setDeserializationListener(
1080         getASTConsumer().GetASTDeserializationListener());
1081       getASTContext().setASTMutationListener(
1082         getASTConsumer().GetASTMutationListener());
1083     }
1084     llvm::OwningPtr<ExternalASTSource> Source;
1085     Source.reset(ModuleManager);
1086     getASTContext().setExternalSource(Source);
1087     if (hasSema())
1088       ModuleManager->InitializeSema(getSema());
1089     if (hasASTConsumer())
1090       ModuleManager->StartTranslationUnit(&getASTConsumer());
1091   }
1092
1093   // Try to load the module we found.
1094   switch (ModuleManager->ReadAST(ModuleFile->getName(),
1095                                  serialization::MK_Module)) {
1096   case ASTReader::Success:
1097     break;
1098
1099   case ASTReader::IgnorePCH:
1100     // FIXME: The ASTReader will already have complained, but can we showhorn
1101     // that diagnostic information into a more useful form?
1102     return 0;
1103
1104   case ASTReader::Failure:
1105     // Already complained.
1106     return 0;
1107   }
1108
1109   // FIXME: The module file's FileEntry makes a poor key indeed!
1110   return (ModuleKey)ModuleFile;
1111 }
1112