1//===-- CompilerInstance.h - Clang Compiler Instance ------------*- C++ -*-===//
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#ifndef LLVM_CLANG_FRONTEND_COMPILERINSTANCE_H_
11#define LLVM_CLANG_FRONTEND_COMPILERINSTANCE_H_
12
13#include "clang/Frontend/CompilerInvocation.h"
14#include "clang/Basic/SourceManager.h"
15#include "clang/Lex/ModuleLoader.h"
16#include "llvm/ADT/ArrayRef.h"
17#include "llvm/ADT/DenseMap.h"
18#include "llvm/ADT/IntrusiveRefCntPtr.h"
19#include "llvm/ADT/StringRef.h"
20#include "llvm/ADT/OwningPtr.h"
21#include <cassert>
22#include <list>
23#include <string>
24#include <utility>
25
26namespace llvm {
27class raw_fd_ostream;
28class Timer;
29}
30
31namespace clang {
32class ASTContext;
33class ASTConsumer;
34class ASTReader;
35class CodeCompleteConsumer;
36class DiagnosticsEngine;
37class DiagnosticConsumer;
38class ExternalASTSource;
39class FileEntry;
40class FileManager;
41class FrontendAction;
42class Module;
43class Preprocessor;
44class Sema;
45class SourceManager;
46class TargetInfo;
47
48/// CompilerInstance - Helper class for managing a single instance of the Clang
49/// compiler.
50///
51/// The CompilerInstance serves two purposes:
52///  (1) It manages the various objects which are necessary to run the compiler,
53///      for example the preprocessor, the target information, and the AST
54///      context.
55///  (2) It provides utility routines for constructing and manipulating the
56///      common Clang objects.
57///
58/// The compiler instance generally owns the instance of all the objects that it
59/// manages. However, clients can still share objects by manually setting the
60/// object and retaking ownership prior to destroying the CompilerInstance.
61///
62/// The compiler instance is intended to simplify clients, but not to lock them
63/// in to the compiler instance for everything. When possible, utility functions
64/// come in two forms; a short form that reuses the CompilerInstance objects,
65/// and a long form that takes explicit instances of any required objects.
66class CompilerInstance : public ModuleLoader {
67  /// The options used in this compiler instance.
68  IntrusiveRefCntPtr<CompilerInvocation> Invocation;
69
70  /// The diagnostics engine instance.
71  IntrusiveRefCntPtr<DiagnosticsEngine> Diagnostics;
72
73  /// The target being compiled for.
74  IntrusiveRefCntPtr<TargetInfo> Target;
75
76  /// The file manager.
77  IntrusiveRefCntPtr<FileManager> FileMgr;
78
79  /// The source manager.
80  IntrusiveRefCntPtr<SourceManager> SourceMgr;
81
82  /// The preprocessor.
83  IntrusiveRefCntPtr<Preprocessor> PP;
84
85  /// The AST context.
86  IntrusiveRefCntPtr<ASTContext> Context;
87
88  /// The AST consumer.
89  OwningPtr<ASTConsumer> Consumer;
90
91  /// The code completion consumer.
92  OwningPtr<CodeCompleteConsumer> CompletionConsumer;
93
94  /// \brief The semantic analysis object.
95  OwningPtr<Sema> TheSema;
96
97  /// \brief The frontend timer
98  OwningPtr<llvm::Timer> FrontendTimer;
99
100  /// \brief Non-owning reference to the ASTReader, if one exists.
101  ASTReader *ModuleManager;
102
103  /// \brief The set of top-level modules that has already been loaded,
104  /// along with the module map
105  llvm::DenseMap<const IdentifierInfo *, Module *> KnownModules;
106
107  /// \brief The location of the module-import keyword for the last module
108  /// import.
109  SourceLocation LastModuleImportLoc;
110
111  /// \brief The result of the last module import.
112  ///
113  Module *LastModuleImportResult;
114
115  /// \brief Holds information about the output file.
116  ///
117  /// If TempFilename is not empty we must rename it to Filename at the end.
118  /// TempFilename may be empty and Filename non empty if creating the temporary
119  /// failed.
120  struct OutputFile {
121    std::string Filename;
122    std::string TempFilename;
123    raw_ostream *OS;
124
125    OutputFile(const std::string &filename, const std::string &tempFilename,
126               raw_ostream *os)
127      : Filename(filename), TempFilename(tempFilename), OS(os) { }
128  };
129
130  /// The list of active output files.
131  std::list<OutputFile> OutputFiles;
132
133  void operator=(const CompilerInstance &);  // DO NOT IMPLEMENT
134  CompilerInstance(const CompilerInstance&); // DO NOT IMPLEMENT
135public:
136  CompilerInstance();
137  ~CompilerInstance();
138
139  /// @name High-Level Operations
140  /// {
141
142  /// ExecuteAction - Execute the provided action against the compiler's
143  /// CompilerInvocation object.
144  ///
145  /// This function makes the following assumptions:
146  ///
147  ///  - The invocation options should be initialized. This function does not
148  ///    handle the '-help' or '-version' options, clients should handle those
149  ///    directly.
150  ///
151  ///  - The diagnostics engine should have already been created by the client.
152  ///
153  ///  - No other CompilerInstance state should have been initialized (this is
154  ///    an unchecked error).
155  ///
156  ///  - Clients should have initialized any LLVM target features that may be
157  ///    required.
158  ///
159  ///  - Clients should eventually call llvm_shutdown() upon the completion of
160  ///    this routine to ensure that any managed objects are properly destroyed.
161  ///
162  /// Note that this routine may write output to 'stderr'.
163  ///
164  /// \param Act - The action to execute.
165  /// \return - True on success.
166  //
167  // FIXME: This function should take the stream to write any debugging /
168  // verbose output to as an argument.
169  //
170  // FIXME: Eliminate the llvm_shutdown requirement, that should either be part
171  // of the context or else not CompilerInstance specific.
172  bool ExecuteAction(FrontendAction &Act);
173
174  /// }
175  /// @name Compiler Invocation and Options
176  /// {
177
178  bool hasInvocation() const { return Invocation != 0; }
179
180  CompilerInvocation &getInvocation() {
181    assert(Invocation && "Compiler instance has no invocation!");
182    return *Invocation;
183  }
184
185  /// setInvocation - Replace the current invocation.
186  void setInvocation(CompilerInvocation *Value);
187
188  /// }
189  /// @name Forwarding Methods
190  /// {
191
192  AnalyzerOptionsRef getAnalyzerOpts() {
193    return Invocation->getAnalyzerOpts();
194  }
195
196  CodeGenOptions &getCodeGenOpts() {
197    return Invocation->getCodeGenOpts();
198  }
199  const CodeGenOptions &getCodeGenOpts() const {
200    return Invocation->getCodeGenOpts();
201  }
202
203  DependencyOutputOptions &getDependencyOutputOpts() {
204    return Invocation->getDependencyOutputOpts();
205  }
206  const DependencyOutputOptions &getDependencyOutputOpts() const {
207    return Invocation->getDependencyOutputOpts();
208  }
209
210  DiagnosticOptions &getDiagnosticOpts() {
211    return Invocation->getDiagnosticOpts();
212  }
213  const DiagnosticOptions &getDiagnosticOpts() const {
214    return Invocation->getDiagnosticOpts();
215  }
216
217  const FileSystemOptions &getFileSystemOpts() const {
218    return Invocation->getFileSystemOpts();
219  }
220
221  FrontendOptions &getFrontendOpts() {
222    return Invocation->getFrontendOpts();
223  }
224  const FrontendOptions &getFrontendOpts() const {
225    return Invocation->getFrontendOpts();
226  }
227
228  HeaderSearchOptions &getHeaderSearchOpts() {
229    return Invocation->getHeaderSearchOpts();
230  }
231  const HeaderSearchOptions &getHeaderSearchOpts() const {
232    return Invocation->getHeaderSearchOpts();
233  }
234
235  LangOptions &getLangOpts() {
236    return *Invocation->getLangOpts();
237  }
238  const LangOptions &getLangOpts() const {
239    return *Invocation->getLangOpts();
240  }
241
242  PreprocessorOptions &getPreprocessorOpts() {
243    return Invocation->getPreprocessorOpts();
244  }
245  const PreprocessorOptions &getPreprocessorOpts() const {
246    return Invocation->getPreprocessorOpts();
247  }
248
249  PreprocessorOutputOptions &getPreprocessorOutputOpts() {
250    return Invocation->getPreprocessorOutputOpts();
251  }
252  const PreprocessorOutputOptions &getPreprocessorOutputOpts() const {
253    return Invocation->getPreprocessorOutputOpts();
254  }
255
256  TargetOptions &getTargetOpts() {
257    return Invocation->getTargetOpts();
258  }
259  const TargetOptions &getTargetOpts() const {
260    return Invocation->getTargetOpts();
261  }
262
263  /// }
264  /// @name Diagnostics Engine
265  /// {
266
267  bool hasDiagnostics() const { return Diagnostics != 0; }
268
269  /// Get the current diagnostics engine.
270  DiagnosticsEngine &getDiagnostics() const {
271    assert(Diagnostics && "Compiler instance has no diagnostics!");
272    return *Diagnostics;
273  }
274
275  /// setDiagnostics - Replace the current diagnostics engine.
276  void setDiagnostics(DiagnosticsEngine *Value);
277
278  DiagnosticConsumer &getDiagnosticClient() const {
279    assert(Diagnostics && Diagnostics->getClient() &&
280           "Compiler instance has no diagnostic client!");
281    return *Diagnostics->getClient();
282  }
283
284  /// }
285  /// @name Target Info
286  /// {
287
288  bool hasTarget() const { return Target != 0; }
289
290  TargetInfo &getTarget() const {
291    assert(Target && "Compiler instance has no target!");
292    return *Target;
293  }
294
295  /// Replace the current diagnostics engine.
296  void setTarget(TargetInfo *Value);
297
298  /// }
299  /// @name File Manager
300  /// {
301
302  bool hasFileManager() const { return FileMgr != 0; }
303
304  /// Return the current file manager to the caller.
305  FileManager &getFileManager() const {
306    assert(FileMgr && "Compiler instance has no file manager!");
307    return *FileMgr;
308  }
309
310  void resetAndLeakFileManager() {
311    FileMgr.resetWithoutRelease();
312  }
313
314  /// setFileManager - Replace the current file manager.
315  void setFileManager(FileManager *Value);
316
317  /// }
318  /// @name Source Manager
319  /// {
320
321  bool hasSourceManager() const { return SourceMgr != 0; }
322
323  /// Return the current source manager.
324  SourceManager &getSourceManager() const {
325    assert(SourceMgr && "Compiler instance has no source manager!");
326    return *SourceMgr;
327  }
328
329  void resetAndLeakSourceManager() {
330    SourceMgr.resetWithoutRelease();
331  }
332
333  /// setSourceManager - Replace the current source manager.
334  void setSourceManager(SourceManager *Value);
335
336  /// }
337  /// @name Preprocessor
338  /// {
339
340  bool hasPreprocessor() const { return PP != 0; }
341
342  /// Return the current preprocessor.
343  Preprocessor &getPreprocessor() const {
344    assert(PP && "Compiler instance has no preprocessor!");
345    return *PP;
346  }
347
348  void resetAndLeakPreprocessor() {
349    PP.resetWithoutRelease();
350  }
351
352  /// Replace the current preprocessor.
353  void setPreprocessor(Preprocessor *Value);
354
355  /// }
356  /// @name ASTContext
357  /// {
358
359  bool hasASTContext() const { return Context != 0; }
360
361  ASTContext &getASTContext() const {
362    assert(Context && "Compiler instance has no AST context!");
363    return *Context;
364  }
365
366  void resetAndLeakASTContext() {
367    Context.resetWithoutRelease();
368  }
369
370  /// setASTContext - Replace the current AST context.
371  void setASTContext(ASTContext *Value);
372
373  /// \brief Replace the current Sema; the compiler instance takes ownership
374  /// of S.
375  void setSema(Sema *S);
376
377  /// }
378  /// @name ASTConsumer
379  /// {
380
381  bool hasASTConsumer() const { return Consumer != 0; }
382
383  ASTConsumer &getASTConsumer() const {
384    assert(Consumer && "Compiler instance has no AST consumer!");
385    return *Consumer;
386  }
387
388  /// takeASTConsumer - Remove the current AST consumer and give ownership to
389  /// the caller.
390  ASTConsumer *takeASTConsumer() { return Consumer.take(); }
391
392  /// setASTConsumer - Replace the current AST consumer; the compiler instance
393  /// takes ownership of \arg Value.
394  void setASTConsumer(ASTConsumer *Value);
395
396  /// }
397  /// @name Semantic analysis
398  /// {
399  bool hasSema() const { return TheSema != 0; }
400
401  Sema &getSema() const {
402    assert(TheSema && "Compiler instance has no Sema object!");
403    return *TheSema;
404  }
405
406  Sema *takeSema() { return TheSema.take(); }
407
408  /// }
409  /// @name Module Management
410  /// {
411
412  ASTReader *getModuleManager() const { return ModuleManager; }
413
414  /// }
415  /// @name Code Completion
416  /// {
417
418  bool hasCodeCompletionConsumer() const { return CompletionConsumer != 0; }
419
420  CodeCompleteConsumer &getCodeCompletionConsumer() const {
421    assert(CompletionConsumer &&
422           "Compiler instance has no code completion consumer!");
423    return *CompletionConsumer;
424  }
425
426  /// takeCodeCompletionConsumer - Remove the current code completion consumer
427  /// and give ownership to the caller.
428  CodeCompleteConsumer *takeCodeCompletionConsumer() {
429    return CompletionConsumer.take();
430  }
431
432  /// setCodeCompletionConsumer - Replace the current code completion consumer;
433  /// the compiler instance takes ownership of \arg Value.
434  void setCodeCompletionConsumer(CodeCompleteConsumer *Value);
435
436  /// }
437  /// @name Frontend timer
438  /// {
439
440  bool hasFrontendTimer() const { return FrontendTimer != 0; }
441
442  llvm::Timer &getFrontendTimer() const {
443    assert(FrontendTimer && "Compiler instance has no frontend timer!");
444    return *FrontendTimer;
445  }
446
447  /// }
448  /// @name Output Files
449  /// {
450
451  /// addOutputFile - Add an output file onto the list of tracked output files.
452  ///
453  /// \param OutFile - The output file info.
454  void addOutputFile(const OutputFile &OutFile);
455
456  /// clearOutputFiles - Clear the output file list, destroying the contained
457  /// output streams.
458  ///
459  /// \param EraseFiles - If true, attempt to erase the files from disk.
460  void clearOutputFiles(bool EraseFiles);
461
462  /// }
463  /// @name Construction Utility Methods
464  /// {
465
466  /// Create the diagnostics engine using the invocation's diagnostic options
467  /// and replace any existing one with it.
468  ///
469  /// Note that this routine also replaces the diagnostic client,
470  /// allocating one if one is not provided.
471  ///
472  /// \param Client If non-NULL, a diagnostic client that will be
473  /// attached to (and, then, owned by) the DiagnosticsEngine inside this AST
474  /// unit.
475  ///
476  /// \param ShouldOwnClient If Client is non-NULL, specifies whether
477  /// the diagnostic object should take ownership of the client.
478  ///
479  /// \param ShouldCloneClient If Client is non-NULL, specifies whether that
480  /// client should be cloned.
481  void createDiagnostics(int Argc, const char* const *Argv,
482                         DiagnosticConsumer *Client = 0,
483                         bool ShouldOwnClient = true,
484                         bool ShouldCloneClient = true);
485
486  /// Create a DiagnosticsEngine object with a the TextDiagnosticPrinter.
487  ///
488  /// The \arg Argc and \arg Argv arguments are used only for logging purposes,
489  /// when the diagnostic options indicate that the compiler should output
490  /// logging information.
491  ///
492  /// If no diagnostic client is provided, this creates a
493  /// DiagnosticConsumer that is owned by the returned diagnostic
494  /// object, if using directly the caller is responsible for
495  /// releasing the returned DiagnosticsEngine's client eventually.
496  ///
497  /// \param Opts - The diagnostic options; note that the created text
498  /// diagnostic object contains a reference to these options and its lifetime
499  /// must extend past that of the diagnostic engine.
500  ///
501  /// \param Client If non-NULL, a diagnostic client that will be
502  /// attached to (and, then, owned by) the returned DiagnosticsEngine
503  /// object.
504  ///
505  /// \param CodeGenOpts If non-NULL, the code gen options in use, which may be
506  /// used by some diagnostics printers (for logging purposes only).
507  ///
508  /// \return The new object on success, or null on failure.
509  static IntrusiveRefCntPtr<DiagnosticsEngine>
510  createDiagnostics(const DiagnosticOptions &Opts, int Argc,
511                    const char* const *Argv,
512                    DiagnosticConsumer *Client = 0,
513                    bool ShouldOwnClient = true,
514                    bool ShouldCloneClient = true,
515                    const CodeGenOptions *CodeGenOpts = 0);
516
517  /// Create the file manager and replace any existing one with it.
518  void createFileManager();
519
520  /// Create the source manager and replace any existing one with it.
521  void createSourceManager(FileManager &FileMgr);
522
523  /// Create the preprocessor, using the invocation, file, and source managers,
524  /// and replace any existing one with it.
525  void createPreprocessor();
526
527  /// Create the AST context.
528  void createASTContext();
529
530  /// Create an external AST source to read a PCH file and attach it to the AST
531  /// context.
532  void createPCHExternalASTSource(StringRef Path,
533                                  bool DisablePCHValidation,
534                                  bool DisableStatCache,
535                                  bool AllowPCHWithCompilerErrors,
536                                  void *DeserializationListener);
537
538  /// Create an external AST source to read a PCH file.
539  ///
540  /// \return - The new object on success, or null on failure.
541  static ExternalASTSource *
542  createPCHExternalASTSource(StringRef Path, const std::string &Sysroot,
543                             bool DisablePCHValidation,
544                             bool DisableStatCache,
545                             bool AllowPCHWithCompilerErrors,
546                             Preprocessor &PP, ASTContext &Context,
547                             void *DeserializationListener, bool Preamble);
548
549  /// Create a code completion consumer using the invocation; note that this
550  /// will cause the source manager to truncate the input source file at the
551  /// completion point.
552  void createCodeCompletionConsumer();
553
554  /// Create a code completion consumer to print code completion results, at
555  /// \arg Filename, \arg Line, and \arg Column, to the given output stream \arg
556  /// OS.
557  static CodeCompleteConsumer *
558  createCodeCompletionConsumer(Preprocessor &PP, const std::string &Filename,
559                               unsigned Line, unsigned Column,
560                               const CodeCompleteOptions &Opts,
561                               raw_ostream &OS);
562
563  /// \brief Create the Sema object to be used for parsing.
564  void createSema(TranslationUnitKind TUKind,
565                  CodeCompleteConsumer *CompletionConsumer);
566
567  /// Create the frontend timer and replace any existing one with it.
568  void createFrontendTimer();
569
570  /// Create the default output file (from the invocation's options) and add it
571  /// to the list of tracked output files.
572  ///
573  /// The files created by this function always use temporary files to write to
574  /// their result (that is, the data is written to a temporary file which will
575  /// atomically replace the target output on success).
576  ///
577  /// \return - Null on error.
578  llvm::raw_fd_ostream *
579  createDefaultOutputFile(bool Binary = true, StringRef BaseInput = "",
580                          StringRef Extension = "");
581
582  /// Create a new output file and add it to the list of tracked output files,
583  /// optionally deriving the output path name.
584  ///
585  /// \return - Null on error.
586  llvm::raw_fd_ostream *
587  createOutputFile(StringRef OutputPath,
588                   bool Binary = true, bool RemoveFileOnSignal = true,
589                   StringRef BaseInput = "",
590                   StringRef Extension = "",
591                   bool UseTemporary = false,
592                   bool CreateMissingDirectories = false);
593
594  /// Create a new output file, optionally deriving the output path name.
595  ///
596  /// If \arg OutputPath is empty, then createOutputFile will derive an output
597  /// path location as \arg BaseInput, with any suffix removed, and \arg
598  /// Extension appended. If OutputPath is not stdout and \arg UseTemporary
599  /// is true, createOutputFile will create a new temporary file that must be
600  /// renamed to OutputPath in the end.
601  ///
602  /// \param OutputPath - If given, the path to the output file.
603  /// \param Error [out] - On failure, the error message.
604  /// \param BaseInput - If \arg OutputPath is empty, the input path name to use
605  /// for deriving the output path.
606  /// \param Extension - The extension to use for derived output names.
607  /// \param Binary - The mode to open the file in.
608  /// \param RemoveFileOnSignal - Whether the file should be registered with
609  /// llvm::sys::RemoveFileOnSignal. Note that this is not safe for
610  /// multithreaded use, as the underlying signal mechanism is not reentrant
611  /// \param UseTemporary - Create a new temporary file that must be renamed to
612  /// OutputPath in the end.
613  /// \param CreateMissingDirectories - When \arg UseTemporary is true, create
614  /// missing directories in the output path.
615  /// \param ResultPathName [out] - If given, the result path name will be
616  /// stored here on success.
617  /// \param TempPathName [out] - If given, the temporary file path name
618  /// will be stored here on success.
619  static llvm::raw_fd_ostream *
620  createOutputFile(StringRef OutputPath, std::string &Error,
621                   bool Binary = true, bool RemoveFileOnSignal = true,
622                   StringRef BaseInput = "",
623                   StringRef Extension = "",
624                   bool UseTemporary = false,
625                   bool CreateMissingDirectories = false,
626                   std::string *ResultPathName = 0,
627                   std::string *TempPathName = 0);
628
629  /// }
630  /// @name Initialization Utility Methods
631  /// {
632
633  /// InitializeSourceManager - Initialize the source manager to set InputFile
634  /// as the main file.
635  ///
636  /// \return True on success.
637  bool InitializeSourceManager(StringRef InputFile,
638         SrcMgr::CharacteristicKind Kind = SrcMgr::C_User);
639
640  /// InitializeSourceManager - Initialize the source manager to set InputFile
641  /// as the main file.
642  ///
643  /// \return True on success.
644  static bool InitializeSourceManager(StringRef InputFile,
645                SrcMgr::CharacteristicKind Kind,
646                DiagnosticsEngine &Diags,
647                FileManager &FileMgr,
648                SourceManager &SourceMgr,
649                const FrontendOptions &Opts);
650
651  /// }
652
653  virtual Module *loadModule(SourceLocation ImportLoc, ModuleIdPath Path,
654                             Module::NameVisibilityKind Visibility,
655                             bool IsInclusionDirective);
656};
657
658} // end namespace clang
659
660#endif
661