Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 14 | pmbaty | 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/Basic/LangStandard.h" |
||
| 18 | #include "clang/Frontend/DependencyOutputOptions.h" |
||
| 19 | #include "clang/Frontend/FrontendOptions.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 "llvm/ADT/ArrayRef.h" |
||
| 25 | #include <memory> |
||
| 26 | #include <string> |
||
| 27 | |||
| 28 | namespace llvm { |
||
| 29 | |||
| 30 | class Triple; |
||
| 31 | |||
| 32 | namespace opt { |
||
| 33 | |||
| 34 | class ArgList; |
||
| 35 | |||
| 36 | } // namespace opt |
||
| 37 | |||
| 38 | namespace vfs { |
||
| 39 | |||
| 40 | class FileSystem; |
||
| 41 | |||
| 42 | } // namespace vfs |
||
| 43 | |||
| 44 | } // namespace llvm |
||
| 45 | |||
| 46 | namespace clang { |
||
| 47 | |||
| 48 | class DiagnosticsEngine; |
||
| 49 | class HeaderSearchOptions; |
||
| 50 | class PreprocessorOptions; |
||
| 51 | class TargetOptions; |
||
| 52 | |||
| 53 | // This lets us create the DiagnosticsEngine with a properly-filled-out |
||
| 54 | // DiagnosticOptions instance. |
||
| 55 | std::unique_ptr<DiagnosticOptions> |
||
| 56 | CreateAndPopulateDiagOpts(ArrayRef<const char *> Argv); |
||
| 57 | |||
| 58 | /// Fill out Opts based on the options given in Args. |
||
| 59 | /// |
||
| 60 | /// Args must have been created from the OptTable returned by |
||
| 61 | /// createCC1OptTable(). |
||
| 62 | /// |
||
| 63 | /// When errors are encountered, return false and, if Diags is non-null, |
||
| 64 | /// report the error(s). |
||
| 65 | bool ParseDiagnosticArgs(DiagnosticOptions &Opts, llvm::opt::ArgList &Args, |
||
| 66 | DiagnosticsEngine *Diags = nullptr, |
||
| 67 | bool DefaultDiagColor = true); |
||
| 68 | |||
| 69 | /// The base class of CompilerInvocation with reference semantics. |
||
| 70 | /// |
||
| 71 | /// This class stores option objects behind reference-counted pointers. This is |
||
| 72 | /// useful for clients that want to keep some option object around even after |
||
| 73 | /// CompilerInvocation gets destroyed, without making a copy. |
||
| 74 | /// |
||
| 75 | /// This is a separate class so that we can implement the copy constructor and |
||
| 76 | /// assignment here and leave them defaulted in the rest of CompilerInvocation. |
||
| 77 | class CompilerInvocationRefBase { |
||
| 78 | public: |
||
| 79 | /// Options controlling the language variant. |
||
| 80 | std::shared_ptr<LangOptions> LangOpts; |
||
| 81 | |||
| 82 | /// Options controlling the target. |
||
| 83 | std::shared_ptr<TargetOptions> TargetOpts; |
||
| 84 | |||
| 85 | /// Options controlling the diagnostic engine. |
||
| 86 | IntrusiveRefCntPtr<DiagnosticOptions> DiagnosticOpts; |
||
| 87 | |||
| 88 | /// Options controlling the \#include directive. |
||
| 89 | std::shared_ptr<HeaderSearchOptions> HeaderSearchOpts; |
||
| 90 | |||
| 91 | /// Options controlling the preprocessor (aside from \#include handling). |
||
| 92 | std::shared_ptr<PreprocessorOptions> PreprocessorOpts; |
||
| 93 | |||
| 94 | /// Options controlling the static analyzer. |
||
| 95 | AnalyzerOptionsRef AnalyzerOpts; |
||
| 96 | |||
| 97 | CompilerInvocationRefBase(); |
||
| 98 | CompilerInvocationRefBase(const CompilerInvocationRefBase &X); |
||
| 99 | CompilerInvocationRefBase(CompilerInvocationRefBase &&X); |
||
| 100 | CompilerInvocationRefBase &operator=(CompilerInvocationRefBase X); |
||
| 101 | CompilerInvocationRefBase &operator=(CompilerInvocationRefBase &&X); |
||
| 102 | ~CompilerInvocationRefBase(); |
||
| 103 | |||
| 104 | LangOptions *getLangOpts() { return LangOpts.get(); } |
||
| 105 | const LangOptions *getLangOpts() const { return LangOpts.get(); } |
||
| 106 | |||
| 107 | TargetOptions &getTargetOpts() { return *TargetOpts.get(); } |
||
| 108 | const TargetOptions &getTargetOpts() const { return *TargetOpts.get(); } |
||
| 109 | |||
| 110 | DiagnosticOptions &getDiagnosticOpts() const { return *DiagnosticOpts; } |
||
| 111 | |||
| 112 | HeaderSearchOptions &getHeaderSearchOpts() { return *HeaderSearchOpts; } |
||
| 113 | |||
| 114 | const HeaderSearchOptions &getHeaderSearchOpts() const { |
||
| 115 | return *HeaderSearchOpts; |
||
| 116 | } |
||
| 117 | |||
| 118 | std::shared_ptr<HeaderSearchOptions> getHeaderSearchOptsPtr() const { |
||
| 119 | return HeaderSearchOpts; |
||
| 120 | } |
||
| 121 | |||
| 122 | std::shared_ptr<PreprocessorOptions> getPreprocessorOptsPtr() { |
||
| 123 | return PreprocessorOpts; |
||
| 124 | } |
||
| 125 | |||
| 126 | PreprocessorOptions &getPreprocessorOpts() { return *PreprocessorOpts; } |
||
| 127 | |||
| 128 | const PreprocessorOptions &getPreprocessorOpts() const { |
||
| 129 | return *PreprocessorOpts; |
||
| 130 | } |
||
| 131 | |||
| 132 | AnalyzerOptionsRef getAnalyzerOpts() const { return AnalyzerOpts; } |
||
| 133 | }; |
||
| 134 | |||
| 135 | /// The base class of CompilerInvocation with value semantics. |
||
| 136 | class CompilerInvocationValueBase { |
||
| 137 | protected: |
||
| 138 | MigratorOptions MigratorOpts; |
||
| 139 | |||
| 140 | /// Options controlling IRgen and the backend. |
||
| 141 | CodeGenOptions CodeGenOpts; |
||
| 142 | |||
| 143 | /// Options controlling dependency output. |
||
| 144 | DependencyOutputOptions DependencyOutputOpts; |
||
| 145 | |||
| 146 | /// Options controlling file system operations. |
||
| 147 | FileSystemOptions FileSystemOpts; |
||
| 148 | |||
| 149 | /// Options controlling the frontend itself. |
||
| 150 | FrontendOptions FrontendOpts; |
||
| 151 | |||
| 152 | /// Options controlling preprocessed output. |
||
| 153 | PreprocessorOutputOptions PreprocessorOutputOpts; |
||
| 154 | |||
| 155 | public: |
||
| 156 | MigratorOptions &getMigratorOpts() { return MigratorOpts; } |
||
| 157 | const MigratorOptions &getMigratorOpts() const { return MigratorOpts; } |
||
| 158 | |||
| 159 | CodeGenOptions &getCodeGenOpts() { return CodeGenOpts; } |
||
| 160 | const CodeGenOptions &getCodeGenOpts() const { return CodeGenOpts; } |
||
| 161 | |||
| 162 | DependencyOutputOptions &getDependencyOutputOpts() { |
||
| 163 | return DependencyOutputOpts; |
||
| 164 | } |
||
| 165 | |||
| 166 | const DependencyOutputOptions &getDependencyOutputOpts() const { |
||
| 167 | return DependencyOutputOpts; |
||
| 168 | } |
||
| 169 | |||
| 170 | FileSystemOptions &getFileSystemOpts() { return FileSystemOpts; } |
||
| 171 | |||
| 172 | const FileSystemOptions &getFileSystemOpts() const { |
||
| 173 | return FileSystemOpts; |
||
| 174 | } |
||
| 175 | |||
| 176 | FrontendOptions &getFrontendOpts() { return FrontendOpts; } |
||
| 177 | const FrontendOptions &getFrontendOpts() const { return FrontendOpts; } |
||
| 178 | |||
| 179 | PreprocessorOutputOptions &getPreprocessorOutputOpts() { |
||
| 180 | return PreprocessorOutputOpts; |
||
| 181 | } |
||
| 182 | |||
| 183 | const PreprocessorOutputOptions &getPreprocessorOutputOpts() const { |
||
| 184 | return PreprocessorOutputOpts; |
||
| 185 | } |
||
| 186 | }; |
||
| 187 | |||
| 188 | /// Helper class for holding the data necessary to invoke the compiler. |
||
| 189 | /// |
||
| 190 | /// This class is designed to represent an abstract "invocation" of the |
||
| 191 | /// compiler, including data such as the include paths, the code generation |
||
| 192 | /// options, the warning flags, and so on. |
||
| 193 | class CompilerInvocation : public CompilerInvocationRefBase, |
||
| 194 | public CompilerInvocationValueBase { |
||
| 195 | public: |
||
| 196 | /// Create a compiler invocation from a list of input options. |
||
| 197 | /// \returns true on success. |
||
| 198 | /// |
||
| 199 | /// \returns false if an error was encountered while parsing the arguments |
||
| 200 | /// and attempts to recover and continue parsing the rest of the arguments. |
||
| 201 | /// The recovery is best-effort and only guarantees that \p Res will end up in |
||
| 202 | /// one of the vaild-to-access (albeit arbitrary) states. |
||
| 203 | /// |
||
| 204 | /// \param [out] Res - The resulting invocation. |
||
| 205 | /// \param [in] CommandLineArgs - Array of argument strings, this must not |
||
| 206 | /// contain "-cc1". |
||
| 207 | static bool CreateFromArgs(CompilerInvocation &Res, |
||
| 208 | ArrayRef<const char *> CommandLineArgs, |
||
| 209 | DiagnosticsEngine &Diags, |
||
| 210 | const char *Argv0 = nullptr); |
||
| 211 | |||
| 212 | /// Get the directory where the compiler headers |
||
| 213 | /// reside, relative to the compiler binary (found by the passed in |
||
| 214 | /// arguments). |
||
| 215 | /// |
||
| 216 | /// \param Argv0 - The program path (from argv[0]), for finding the builtin |
||
| 217 | /// compiler path. |
||
| 218 | /// \param MainAddr - The address of main (or some other function in the main |
||
| 219 | /// executable), for finding the builtin compiler path. |
||
| 220 | static std::string GetResourcesPath(const char *Argv0, void *MainAddr); |
||
| 221 | |||
| 222 | /// Retrieve a module hash string that is suitable for uniquely |
||
| 223 | /// identifying the conditions under which the module was built. |
||
| 224 | std::string getModuleHash() const; |
||
| 225 | |||
| 226 | using StringAllocator = llvm::function_ref<const char *(const llvm::Twine &)>; |
||
| 227 | /// Generate cc1-compatible command line arguments from this instance. |
||
| 228 | /// |
||
| 229 | /// \param [out] Args - The generated arguments. Note that the caller is |
||
| 230 | /// responsible for inserting the path to the clang executable and "-cc1" if |
||
| 231 | /// desired. |
||
| 232 | /// \param SA - A function that given a Twine can allocate storage for a given |
||
| 233 | /// command line argument and return a pointer to the newly allocated string. |
||
| 234 | /// The returned pointer is what gets appended to Args. |
||
| 235 | void generateCC1CommandLine(llvm::SmallVectorImpl<const char *> &Args, |
||
| 236 | StringAllocator SA) const; |
||
| 237 | |||
| 238 | /// Generate cc1-compatible command line arguments from this instance, |
||
| 239 | /// wrapping the result as a std::vector<std::string>. |
||
| 240 | /// |
||
| 241 | /// This is a (less-efficient) wrapper over generateCC1CommandLine(). |
||
| 242 | std::vector<std::string> getCC1CommandLine() const; |
||
| 243 | |||
| 244 | /// Reset all of the options that are not considered when building a |
||
| 245 | /// module. |
||
| 246 | void resetNonModularOptions(); |
||
| 247 | |||
| 248 | /// Disable implicit modules and canonicalize options that are only used by |
||
| 249 | /// implicit modules. |
||
| 250 | void clearImplicitModuleBuildOptions(); |
||
| 251 | |||
| 252 | private: |
||
| 253 | static bool CreateFromArgsImpl(CompilerInvocation &Res, |
||
| 254 | ArrayRef<const char *> CommandLineArgs, |
||
| 255 | DiagnosticsEngine &Diags, const char *Argv0); |
||
| 256 | |||
| 257 | /// Generate command line options from DiagnosticOptions. |
||
| 258 | static void GenerateDiagnosticArgs(const DiagnosticOptions &Opts, |
||
| 259 | SmallVectorImpl<const char *> &Args, |
||
| 260 | StringAllocator SA, bool DefaultDiagColor); |
||
| 261 | |||
| 262 | /// Parse command line options that map to LangOptions. |
||
| 263 | static bool ParseLangArgs(LangOptions &Opts, llvm::opt::ArgList &Args, |
||
| 264 | InputKind IK, const llvm::Triple &T, |
||
| 265 | std::vector<std::string> &Includes, |
||
| 266 | DiagnosticsEngine &Diags); |
||
| 267 | |||
| 268 | /// Generate command line options from LangOptions. |
||
| 269 | static void GenerateLangArgs(const LangOptions &Opts, |
||
| 270 | SmallVectorImpl<const char *> &Args, |
||
| 271 | StringAllocator SA, const llvm::Triple &T, |
||
| 272 | InputKind IK); |
||
| 273 | |||
| 274 | /// Parse command line options that map to CodeGenOptions. |
||
| 275 | static bool ParseCodeGenArgs(CodeGenOptions &Opts, llvm::opt::ArgList &Args, |
||
| 276 | InputKind IK, DiagnosticsEngine &Diags, |
||
| 277 | const llvm::Triple &T, |
||
| 278 | const std::string &OutputFile, |
||
| 279 | const LangOptions &LangOptsRef); |
||
| 280 | |||
| 281 | // Generate command line options from CodeGenOptions. |
||
| 282 | static void GenerateCodeGenArgs(const CodeGenOptions &Opts, |
||
| 283 | SmallVectorImpl<const char *> &Args, |
||
| 284 | StringAllocator SA, const llvm::Triple &T, |
||
| 285 | const std::string &OutputFile, |
||
| 286 | const LangOptions *LangOpts); |
||
| 287 | }; |
||
| 288 | |||
| 289 | IntrusiveRefCntPtr<llvm::vfs::FileSystem> |
||
| 290 | createVFSFromCompilerInvocation(const CompilerInvocation &CI, |
||
| 291 | DiagnosticsEngine &Diags); |
||
| 292 | |||
| 293 | IntrusiveRefCntPtr<llvm::vfs::FileSystem> createVFSFromCompilerInvocation( |
||
| 294 | const CompilerInvocation &CI, DiagnosticsEngine &Diags, |
||
| 295 | IntrusiveRefCntPtr<llvm::vfs::FileSystem> BaseFS); |
||
| 296 | |||
| 297 | IntrusiveRefCntPtr<llvm::vfs::FileSystem> |
||
| 298 | createVFSFromOverlayFiles(ArrayRef<std::string> VFSOverlayFiles, |
||
| 299 | DiagnosticsEngine &Diags, |
||
| 300 | IntrusiveRefCntPtr<llvm::vfs::FileSystem> BaseFS); |
||
| 301 | |||
| 302 | } // namespace clang |
||
| 303 | |||
| 304 | #endif // LLVM_CLANG_FRONTEND_COMPILERINVOCATION_H |