Clang Project

clang_source_code/include/clang/Frontend/CompilerInvocation.h
1//===- CompilerInvocation.h - Compiler Invocation Helper Data ---*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_CLANG_FRONTEND_COMPILERINVOCATION_H
10#define LLVM_CLANG_FRONTEND_COMPILERINVOCATION_H
11
12#include "clang/Basic/CodeGenOptions.h"
13#include "clang/Basic/DiagnosticOptions.h"
14#include "clang/Basic/FileSystemOptions.h"
15#include "clang/Basic/LLVM.h"
16#include "clang/Basic/LangOptions.h"
17#include "clang/Frontend/DependencyOutputOptions.h"
18#include "clang/Frontend/FrontendOptions.h"
19#include "clang/Frontend/LangStandard.h"
20#include "clang/Frontend/MigratorOptions.h"
21#include "clang/Frontend/PreprocessorOutputOptions.h"
22#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
23#include "llvm/ADT/IntrusiveRefCntPtr.h"
24#include <memory>
25#include <string>
26
27namespace llvm {
28
29class Triple;
30
31namespace opt {
32
33class ArgList;
34
35// namespace opt
36
37namespace vfs {
38
39class FileSystem;
40
41// namespace vfs
42
43// namespace llvm
44
45namespace clang {
46
47class DiagnosticsEngine;
48class HeaderSearchOptions;
49class PreprocessorOptions;
50class TargetOptions;
51
52/// Fill out Opts based on the options given in Args.
53///
54/// Args must have been created from the OptTable returned by
55/// createCC1OptTable().
56///
57/// When errors are encountered, return false and, if Diags is non-null,
58/// report the error(s).
59bool ParseDiagnosticArgs(DiagnosticOptions &Optsllvm::opt::ArgList &Args,
60                         DiagnosticsEngine *Diags = nullptr,
61                         bool DefaultDiagColor = true,
62                         bool DefaultShowOpt = true);
63
64class CompilerInvocationBase {
65public:
66  /// Options controlling the language variant.
67  std::shared_ptr<LangOptionsLangOpts;
68
69  /// Options controlling the target.
70  std::shared_ptr<TargetOptionsTargetOpts;
71
72  /// Options controlling the diagnostic engine.
73  IntrusiveRefCntPtr<DiagnosticOptionsDiagnosticOpts;
74
75  /// Options controlling the \#include directive.
76  std::shared_ptr<HeaderSearchOptionsHeaderSearchOpts;
77
78  /// Options controlling the preprocessor (aside from \#include handling).
79  std::shared_ptr<PreprocessorOptionsPreprocessorOpts;
80
81  CompilerInvocationBase();
82  CompilerInvocationBase(const CompilerInvocationBase &X);
83  CompilerInvocationBase &operator=(const CompilerInvocationBase &) = delete;
84  ~CompilerInvocationBase();
85
86  LangOptions *getLangOpts() { return LangOpts.get(); }
87  const LangOptions *getLangOpts() const { return LangOpts.get(); }
88
89  TargetOptions &getTargetOpts() { return *TargetOpts.get(); }
90  const TargetOptions &getTargetOpts() const { return *TargetOpts.get(); }
91
92  DiagnosticOptions &getDiagnosticOpts() const { return *DiagnosticOpts; }
93
94  HeaderSearchOptions &getHeaderSearchOpts() { return *HeaderSearchOpts; }
95
96  const HeaderSearchOptions &getHeaderSearchOpts() const {
97    return *HeaderSearchOpts;
98  }
99
100  std::shared_ptr<HeaderSearchOptionsgetHeaderSearchOptsPtr() const {
101    return HeaderSearchOpts;
102  }
103
104  std::shared_ptr<PreprocessorOptionsgetPreprocessorOptsPtr() {
105    return PreprocessorOpts;
106  }
107
108  PreprocessorOptions &getPreprocessorOpts() { return *PreprocessorOpts; }
109
110  const PreprocessorOptions &getPreprocessorOpts() const {
111    return *PreprocessorOpts;
112  }
113};
114
115/// Helper class for holding the data necessary to invoke the compiler.
116///
117/// This class is designed to represent an abstract "invocation" of the
118/// compiler, including data such as the include paths, the code generation
119/// options, the warning flags, and so on.
120class CompilerInvocation : public CompilerInvocationBase {
121  /// Options controlling the static analyzer.
122  AnalyzerOptionsRef AnalyzerOpts;
123
124  MigratorOptions MigratorOpts;
125
126  /// Options controlling IRgen and the backend.
127  CodeGenOptions CodeGenOpts;
128
129  /// Options controlling dependency output.
130  DependencyOutputOptions DependencyOutputOpts;
131
132  /// Options controlling file system operations.
133  FileSystemOptions FileSystemOpts;
134
135  /// Options controlling the frontend itself.
136  FrontendOptions FrontendOpts;
137
138  /// Options controlling preprocessed output.
139  PreprocessorOutputOptions PreprocessorOutputOpts;
140
141public:
142  CompilerInvocation() : AnalyzerOpts(new AnalyzerOptions()) {}
143
144  /// @name Utility Methods
145  /// @{
146
147  /// Create a compiler invocation from a list of input options.
148  /// \returns true on success.
149  ///
150  /// \param [out] Res - The resulting invocation.
151  /// \param ArgBegin - The first element in the argument vector.
152  /// \param ArgEnd - The last element in the argument vector.
153  /// \param Diags - The diagnostic engine to use for errors.
154  static bool CreateFromArgs(CompilerInvocation &Res,
155                             const charconst *ArgBegin,
156                             const charconst *ArgEnd,
157                             DiagnosticsEngine &Diags);
158
159  /// Get the directory where the compiler headers
160  /// reside, relative to the compiler binary (found by the passed in
161  /// arguments).
162  ///
163  /// \param Argv0 - The program path (from argv[0]), for finding the builtin
164  /// compiler path.
165  /// \param MainAddr - The address of main (or some other function in the main
166  /// executable), for finding the builtin compiler path.
167  static std::string GetResourcesPath(const char *Argv0void *MainAddr);
168
169  /// Set language defaults for the given input language and
170  /// language standard in the given LangOptions object.
171  ///
172  /// \param Opts - The LangOptions object to set up.
173  /// \param IK - The input language.
174  /// \param T - The target triple.
175  /// \param PPOpts - The PreprocessorOptions affected.
176  /// \param LangStd - The input language standard.
177  static void setLangDefaults(LangOptions &OptsInputKind IK,
178                   const llvm::Triple &TPreprocessorOptions &PPOpts,
179                   LangStandard::Kind LangStd = LangStandard::lang_unspecified);
180
181  /// Retrieve a module hash string that is suitable for uniquely
182  /// identifying the conditions under which the module was built.
183  std::string getModuleHash() const;
184
185  /// @}
186  /// @name Option Subgroups
187  /// @{
188
189  AnalyzerOptionsRef getAnalyzerOpts() const { return AnalyzerOpts; }
190
191  MigratorOptions &getMigratorOpts() { return MigratorOpts; }
192  const MigratorOptions &getMigratorOpts() const { return MigratorOpts; }
193
194  CodeGenOptions &getCodeGenOpts() { return CodeGenOpts; }
195  const CodeGenOptions &getCodeGenOpts() const { return CodeGenOpts; }
196
197  DependencyOutputOptions &getDependencyOutputOpts() {
198    return DependencyOutputOpts;
199  }
200
201  const DependencyOutputOptions &getDependencyOutputOpts() const {
202    return DependencyOutputOpts;
203  }
204
205  FileSystemOptions &getFileSystemOpts() { return FileSystemOpts; }
206
207  const FileSystemOptions &getFileSystemOpts() const {
208    return FileSystemOpts;
209  }
210
211  FrontendOptions &getFrontendOpts() { return FrontendOpts; }
212  const FrontendOptions &getFrontendOpts() const { return FrontendOpts; }
213
214  PreprocessorOutputOptions &getPreprocessorOutputOpts() {
215    return PreprocessorOutputOpts;
216  }
217
218  const PreprocessorOutputOptions &getPreprocessorOutputOpts() const {
219    return PreprocessorOutputOpts;
220  }
221
222  /// @}
223};
224
225IntrusiveRefCntPtr<llvm::vfs::FileSystem>
226createVFSFromCompilerInvocation(const CompilerInvocation &CI,
227                                DiagnosticsEngine &Diags);
228
229IntrusiveRefCntPtr<llvm::vfs::FileSystemcreateVFSFromCompilerInvocation(
230    const CompilerInvocation &CIDiagnosticsEngine &Diags,
231    IntrusiveRefCntPtr<llvm::vfs::FileSystemBaseFS);
232
233// namespace clang
234
235#endif // LLVM_CLANG_FRONTEND_COMPILERINVOCATION_H
236
clang::CompilerInvocationBase::LangOpts
clang::CompilerInvocationBase::TargetOpts
clang::CompilerInvocationBase::DiagnosticOpts
clang::CompilerInvocationBase::HeaderSearchOpts
clang::CompilerInvocationBase::PreprocessorOpts
clang::CompilerInvocationBase::getLangOpts
clang::CompilerInvocationBase::getLangOpts
clang::CompilerInvocationBase::getTargetOpts
clang::CompilerInvocationBase::getTargetOpts
clang::CompilerInvocationBase::getDiagnosticOpts
clang::CompilerInvocationBase::getHeaderSearchOpts
clang::CompilerInvocationBase::getHeaderSearchOpts
clang::CompilerInvocationBase::getHeaderSearchOptsPtr
clang::CompilerInvocationBase::getPreprocessorOptsPtr
clang::CompilerInvocationBase::getPreprocessorOpts
clang::CompilerInvocationBase::getPreprocessorOpts
clang::CompilerInvocation::AnalyzerOpts
clang::CompilerInvocation::MigratorOpts
clang::CompilerInvocation::CodeGenOpts
clang::CompilerInvocation::DependencyOutputOpts
clang::CompilerInvocation::FileSystemOpts
clang::CompilerInvocation::FrontendOpts
clang::CompilerInvocation::PreprocessorOutputOpts
clang::CompilerInvocation::CreateFromArgs
clang::CompilerInvocation::GetResourcesPath
clang::CompilerInvocation::setLangDefaults
clang::CompilerInvocation::getModuleHash
clang::CompilerInvocation::getAnalyzerOpts
clang::CompilerInvocation::getMigratorOpts
clang::CompilerInvocation::getMigratorOpts
clang::CompilerInvocation::getCodeGenOpts
clang::CompilerInvocation::getCodeGenOpts
clang::CompilerInvocation::getDependencyOutputOpts
clang::CompilerInvocation::getDependencyOutputOpts
clang::CompilerInvocation::getFileSystemOpts
clang::CompilerInvocation::getFileSystemOpts
clang::CompilerInvocation::getFrontendOpts
clang::CompilerInvocation::getFrontendOpts
clang::CompilerInvocation::getPreprocessorOutputOpts
clang::CompilerInvocation::getPreprocessorOutputOpts