xref: /freebsd/contrib/llvm-project/clang/include/clang/Frontend/FrontendOptions.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1  //===- FrontendOptions.h ----------------------------------------*- 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_FRONTENDOPTIONS_H
10  #define LLVM_CLANG_FRONTEND_FRONTENDOPTIONS_H
11  
12  #include "clang/AST/ASTDumperUtils.h"
13  #include "clang/Basic/LangStandard.h"
14  #include "clang/Frontend/CommandLineSourceLoc.h"
15  #include "clang/Sema/CodeCompleteOptions.h"
16  #include "clang/Serialization/ModuleFileExtension.h"
17  #include "llvm/ADT/StringRef.h"
18  #include "llvm/Support/Compiler.h"
19  #include "llvm/Support/MemoryBuffer.h"
20  #include <cassert>
21  #include <map>
22  #include <memory>
23  #include <optional>
24  #include <string>
25  #include <vector>
26  
27  namespace llvm {
28  
29  class MemoryBuffer;
30  
31  } // namespace llvm
32  
33  namespace clang {
34  
35  namespace frontend {
36  
37  enum ActionKind {
38    /// Parse ASTs and list Decl nodes.
39    ASTDeclList,
40  
41    /// Parse ASTs and dump them.
42    ASTDump,
43  
44    /// Parse ASTs and print them.
45    ASTPrint,
46  
47    /// Parse ASTs and view them in Graphviz.
48    ASTView,
49  
50    /// Dump the compiler configuration.
51    DumpCompilerOptions,
52  
53    /// Dump out raw tokens.
54    DumpRawTokens,
55  
56    /// Dump out preprocessed tokens.
57    DumpTokens,
58  
59    /// Emit a .s file.
60    EmitAssembly,
61  
62    /// Emit a .bc file.
63    EmitBC,
64  
65    /// Translate input source into HTML.
66    EmitHTML,
67  
68    /// Emit a .cir file
69    EmitCIR,
70  
71    /// Emit a .ll file.
72    EmitLLVM,
73  
74    /// Generate LLVM IR, but do not emit anything.
75    EmitLLVMOnly,
76  
77    /// Generate machine code, but don't emit anything.
78    EmitCodeGenOnly,
79  
80    /// Emit a .o file.
81    EmitObj,
82  
83    // Extract API information
84    ExtractAPI,
85  
86    /// Parse and apply any fixits to the source.
87    FixIt,
88  
89    /// Generate pre-compiled module from a module map.
90    GenerateModule,
91  
92    /// Generate pre-compiled module from a standard C++ module interface unit.
93    GenerateModuleInterface,
94  
95    /// Generate reduced module interface for a standard C++ module interface
96    /// unit.
97    GenerateReducedModuleInterface,
98  
99    /// Generate a C++20 header unit module from a header file.
100    GenerateHeaderUnit,
101  
102    /// Generate pre-compiled header.
103    GeneratePCH,
104  
105    /// Generate Interface Stub Files.
106    GenerateInterfaceStubs,
107  
108    /// Only execute frontend initialization.
109    InitOnly,
110  
111    /// Dump information about a module file.
112    ModuleFileInfo,
113  
114    /// Load and verify that a PCH file is usable.
115    VerifyPCH,
116  
117    /// Parse and perform semantic analysis.
118    ParseSyntaxOnly,
119  
120    /// Run a plugin action, \see ActionName.
121    PluginAction,
122  
123    /// Print the "preamble" of the input file
124    PrintPreamble,
125  
126    /// -E mode.
127    PrintPreprocessedInput,
128  
129    /// Expand macros but not \#includes.
130    RewriteMacros,
131  
132    /// ObjC->C Rewriter.
133    RewriteObjC,
134  
135    /// Rewriter playground
136    RewriteTest,
137  
138    /// Run one or more source code analyses.
139    RunAnalysis,
140  
141    /// Dump template instantiations
142    TemplightDump,
143  
144    /// Run migrator.
145    MigrateSource,
146  
147    /// Just lex, no output.
148    RunPreprocessorOnly,
149  
150    /// Print the output of the dependency directives source minimizer.
151    PrintDependencyDirectivesSourceMinimizerOutput
152  };
153  
154  } // namespace frontend
155  
156  /// The kind of a file that we've been handed as an input.
157  class InputKind {
158  public:
159    /// The input file format.
160    enum Format {
161      Source,
162      ModuleMap,
163      Precompiled
164    };
165  
166    // If we are building a header unit, what kind it is; this affects whether
167    // we look for the file in the user or system include search paths before
168    // flagging a missing input.
169    enum HeaderUnitKind {
170      HeaderUnit_None,
171      HeaderUnit_User,
172      HeaderUnit_System,
173      HeaderUnit_Abs
174    };
175  
176  private:
177    Language Lang;
178    LLVM_PREFERRED_TYPE(Format)
179    unsigned Fmt : 3;
180    LLVM_PREFERRED_TYPE(bool)
181    unsigned Preprocessed : 1;
182    LLVM_PREFERRED_TYPE(HeaderUnitKind)
183    unsigned HeaderUnit : 3;
184    LLVM_PREFERRED_TYPE(bool)
185    unsigned IsHeader : 1;
186  
187  public:
188    constexpr InputKind(Language L = Language::Unknown, Format F = Source,
189                        bool PP = false, HeaderUnitKind HU = HeaderUnit_None,
190                        bool HD = false)
Lang(L)191        : Lang(L), Fmt(F), Preprocessed(PP), HeaderUnit(HU), IsHeader(HD) {}
192  
getLanguage()193    Language getLanguage() const { return static_cast<Language>(Lang); }
getFormat()194    Format getFormat() const { return static_cast<Format>(Fmt); }
getHeaderUnitKind()195    HeaderUnitKind getHeaderUnitKind() const {
196      return static_cast<HeaderUnitKind>(HeaderUnit);
197    }
isPreprocessed()198    bool isPreprocessed() const { return Preprocessed; }
isHeader()199    bool isHeader() const { return IsHeader; }
isHeaderUnit()200    bool isHeaderUnit() const { return HeaderUnit != HeaderUnit_None; }
201  
202    /// Is the input kind fully-unknown?
isUnknown()203    bool isUnknown() const { return Lang == Language::Unknown && Fmt == Source; }
204  
205    /// Is the language of the input some dialect of Objective-C?
isObjectiveC()206    bool isObjectiveC() const {
207      return Lang == Language::ObjC || Lang == Language::ObjCXX;
208    }
209  
getPreprocessed()210    InputKind getPreprocessed() const {
211      return InputKind(getLanguage(), getFormat(), true, getHeaderUnitKind(),
212                       isHeader());
213    }
214  
getHeader()215    InputKind getHeader() const {
216      return InputKind(getLanguage(), getFormat(), isPreprocessed(),
217                       getHeaderUnitKind(), true);
218    }
219  
withHeaderUnit(HeaderUnitKind HU)220    InputKind withHeaderUnit(HeaderUnitKind HU) const {
221      return InputKind(getLanguage(), getFormat(), isPreprocessed(), HU,
222                       isHeader());
223    }
224  
withFormat(Format F)225    InputKind withFormat(Format F) const {
226      return InputKind(getLanguage(), F, isPreprocessed(), getHeaderUnitKind(),
227                       isHeader());
228    }
229  };
230  
231  /// An input file for the front end.
232  class FrontendInputFile {
233    /// The file name, or "-" to read from standard input.
234    std::string File;
235  
236    /// The input, if it comes from a buffer rather than a file. This object
237    /// does not own the buffer, and the caller is responsible for ensuring
238    /// that it outlives any users.
239    std::optional<llvm::MemoryBufferRef> Buffer;
240  
241    /// The kind of input, e.g., C source, AST file, LLVM IR.
242    InputKind Kind;
243  
244    /// Whether we're dealing with a 'system' input (vs. a 'user' input).
245    bool IsSystem = false;
246  
247  public:
248    FrontendInputFile() = default;
249    FrontendInputFile(StringRef File, InputKind Kind, bool IsSystem = false)
250        : File(File.str()), Kind(Kind), IsSystem(IsSystem) {}
251    FrontendInputFile(llvm::MemoryBufferRef Buffer, InputKind Kind,
252                      bool IsSystem = false)
Buffer(Buffer)253        : Buffer(Buffer), Kind(Kind), IsSystem(IsSystem) {}
254  
getKind()255    InputKind getKind() const { return Kind; }
isSystem()256    bool isSystem() const { return IsSystem; }
257  
isEmpty()258    bool isEmpty() const { return File.empty() && Buffer == std::nullopt; }
isFile()259    bool isFile() const { return !isBuffer(); }
isBuffer()260    bool isBuffer() const { return Buffer != std::nullopt; }
isPreprocessed()261    bool isPreprocessed() const { return Kind.isPreprocessed(); }
isHeader()262    bool isHeader() const { return Kind.isHeader(); }
getHeaderUnitKind()263    InputKind::HeaderUnitKind getHeaderUnitKind() const {
264      return Kind.getHeaderUnitKind();
265    }
266  
getFile()267    StringRef getFile() const {
268      assert(isFile());
269      return File;
270    }
271  
getBuffer()272    llvm::MemoryBufferRef getBuffer() const {
273      assert(isBuffer());
274      return *Buffer;
275    }
276  };
277  
278  /// FrontendOptions - Options for controlling the behavior of the frontend.
279  class FrontendOptions {
280  public:
281    /// Disable memory freeing on exit.
282    LLVM_PREFERRED_TYPE(bool)
283    unsigned DisableFree : 1;
284  
285    /// When generating PCH files, instruct the AST writer to create relocatable
286    /// PCH files.
287    LLVM_PREFERRED_TYPE(bool)
288    unsigned RelocatablePCH : 1;
289  
290    /// Show the -help text.
291    LLVM_PREFERRED_TYPE(bool)
292    unsigned ShowHelp : 1;
293  
294    /// Show frontend performance metrics and statistics.
295    LLVM_PREFERRED_TYPE(bool)
296    unsigned ShowStats : 1;
297  
298    LLVM_PREFERRED_TYPE(bool)
299    unsigned AppendStats : 1;
300  
301    /// print the supported cpus for the current target
302    LLVM_PREFERRED_TYPE(bool)
303    unsigned PrintSupportedCPUs : 1;
304  
305    /// Print the supported extensions for the current target.
306    LLVM_PREFERRED_TYPE(bool)
307    unsigned PrintSupportedExtensions : 1;
308  
309    /// Print the extensions enabled for the current target.
310    LLVM_PREFERRED_TYPE(bool)
311    unsigned PrintEnabledExtensions : 1;
312  
313    /// Show the -version text.
314    LLVM_PREFERRED_TYPE(bool)
315    unsigned ShowVersion : 1;
316  
317    /// Apply fixes even if there are unfixable errors.
318    LLVM_PREFERRED_TYPE(bool)
319    unsigned FixWhatYouCan : 1;
320  
321    /// Apply fixes only for warnings.
322    LLVM_PREFERRED_TYPE(bool)
323    unsigned FixOnlyWarnings : 1;
324  
325    /// Apply fixes and recompile.
326    LLVM_PREFERRED_TYPE(bool)
327    unsigned FixAndRecompile : 1;
328  
329    /// Apply fixes to temporary files.
330    LLVM_PREFERRED_TYPE(bool)
331    unsigned FixToTemporaries : 1;
332  
333    /// Emit ARC errors even if the migrator can fix them.
334    LLVM_PREFERRED_TYPE(bool)
335    unsigned ARCMTMigrateEmitARCErrors : 1;
336  
337    /// Skip over function bodies to speed up parsing in cases you do not need
338    /// them (e.g. with code completion).
339    LLVM_PREFERRED_TYPE(bool)
340    unsigned SkipFunctionBodies : 1;
341  
342    /// Whether we can use the global module index if available.
343    LLVM_PREFERRED_TYPE(bool)
344    unsigned UseGlobalModuleIndex : 1;
345  
346    /// Whether we can generate the global module index if needed.
347    LLVM_PREFERRED_TYPE(bool)
348    unsigned GenerateGlobalModuleIndex : 1;
349  
350    /// Whether we include declaration dumps in AST dumps.
351    LLVM_PREFERRED_TYPE(bool)
352    unsigned ASTDumpDecls : 1;
353  
354    /// Whether we deserialize all decls when forming AST dumps.
355    LLVM_PREFERRED_TYPE(bool)
356    unsigned ASTDumpAll : 1;
357  
358    /// Whether we include lookup table dumps in AST dumps.
359    LLVM_PREFERRED_TYPE(bool)
360    unsigned ASTDumpLookups : 1;
361  
362    /// Whether we include declaration type dumps in AST dumps.
363    LLVM_PREFERRED_TYPE(bool)
364    unsigned ASTDumpDeclTypes : 1;
365  
366    /// Whether we are performing an implicit module build.
367    LLVM_PREFERRED_TYPE(bool)
368    unsigned BuildingImplicitModule : 1;
369  
370    /// Whether to use a filesystem lock when building implicit modules.
371    LLVM_PREFERRED_TYPE(bool)
372    unsigned BuildingImplicitModuleUsesLock : 1;
373  
374    /// Whether we should embed all used files into the PCM file.
375    LLVM_PREFERRED_TYPE(bool)
376    unsigned ModulesEmbedAllFiles : 1;
377  
378    /// Whether timestamps should be written to the produced PCH file.
379    LLVM_PREFERRED_TYPE(bool)
380    unsigned IncludeTimestamps : 1;
381  
382    /// Should a temporary file be used during compilation.
383    LLVM_PREFERRED_TYPE(bool)
384    unsigned UseTemporary : 1;
385  
386    /// When using -emit-module, treat the modulemap as a system module.
387    LLVM_PREFERRED_TYPE(bool)
388    unsigned IsSystemModule : 1;
389  
390    /// Output (and read) PCM files regardless of compiler errors.
391    LLVM_PREFERRED_TYPE(bool)
392    unsigned AllowPCMWithCompilerErrors : 1;
393  
394    /// Whether to share the FileManager when building modules.
395    LLVM_PREFERRED_TYPE(bool)
396    unsigned ModulesShareFileManager : 1;
397  
398    /// Whether to emit symbol graph files as a side effect of compilation.
399    LLVM_PREFERRED_TYPE(bool)
400    unsigned EmitSymbolGraph : 1;
401  
402    /// Whether to emit additional symbol graphs for extended modules.
403    LLVM_PREFERRED_TYPE(bool)
404    unsigned EmitExtensionSymbolGraphs : 1;
405  
406    /// Whether to emit symbol labels for testing in generated symbol graphs
407    LLVM_PREFERRED_TYPE(bool)
408    unsigned EmitSymbolGraphSymbolLabelsForTesting : 1;
409  
410    /// Whether to emit symbol labels for testing in generated symbol graphs
411    LLVM_PREFERRED_TYPE(bool)
412    unsigned EmitPrettySymbolGraphs : 1;
413  
414    /// Whether to generate reduced BMI for C++20 named modules.
415    LLVM_PREFERRED_TYPE(bool)
416    unsigned GenReducedBMI : 1;
417  
418    /// Use Clang IR pipeline to emit code
419    LLVM_PREFERRED_TYPE(bool)
420    unsigned UseClangIRPipeline : 1;
421  
422    CodeCompleteOptions CodeCompleteOpts;
423  
424    /// Specifies the output format of the AST.
425    ASTDumpOutputFormat ASTDumpFormat = ADOF_Default;
426  
427    enum {
428      ARCMT_None,
429      ARCMT_Check,
430      ARCMT_Modify,
431      ARCMT_Migrate
432    } ARCMTAction = ARCMT_None;
433  
434    enum {
435      ObjCMT_None = 0,
436  
437      /// Enable migration to modern ObjC literals.
438      ObjCMT_Literals = 0x1,
439  
440      /// Enable migration to modern ObjC subscripting.
441      ObjCMT_Subscripting = 0x2,
442  
443      /// Enable migration to modern ObjC readonly property.
444      ObjCMT_ReadonlyProperty = 0x4,
445  
446      /// Enable migration to modern ObjC readwrite property.
447      ObjCMT_ReadwriteProperty = 0x8,
448  
449      /// Enable migration to modern ObjC property.
450      ObjCMT_Property = (ObjCMT_ReadonlyProperty | ObjCMT_ReadwriteProperty),
451  
452      /// Enable annotation of ObjCMethods of all kinds.
453      ObjCMT_Annotation = 0x10,
454  
455      /// Enable migration of ObjC methods to 'instancetype'.
456      ObjCMT_Instancetype = 0x20,
457  
458      /// Enable migration to NS_ENUM/NS_OPTIONS macros.
459      ObjCMT_NsMacros = 0x40,
460  
461      /// Enable migration to add conforming protocols.
462      ObjCMT_ProtocolConformance = 0x80,
463  
464      /// prefer 'atomic' property over 'nonatomic'.
465      ObjCMT_AtomicProperty = 0x100,
466  
467      /// annotate property with NS_RETURNS_INNER_POINTER
468      ObjCMT_ReturnsInnerPointerProperty = 0x200,
469  
470      /// use NS_NONATOMIC_IOSONLY for property 'atomic' attribute
471      ObjCMT_NsAtomicIOSOnlyProperty = 0x400,
472  
473      /// Enable inferring NS_DESIGNATED_INITIALIZER for ObjC methods.
474      ObjCMT_DesignatedInitializer = 0x800,
475  
476      /// Enable converting setter/getter expressions to property-dot syntx.
477      ObjCMT_PropertyDotSyntax = 0x1000,
478  
479      ObjCMT_MigrateDecls = (ObjCMT_ReadonlyProperty | ObjCMT_ReadwriteProperty |
480                             ObjCMT_Annotation | ObjCMT_Instancetype |
481                             ObjCMT_NsMacros | ObjCMT_ProtocolConformance |
482                             ObjCMT_NsAtomicIOSOnlyProperty |
483                             ObjCMT_DesignatedInitializer),
484      ObjCMT_MigrateAll = (ObjCMT_Literals | ObjCMT_Subscripting |
485                           ObjCMT_MigrateDecls | ObjCMT_PropertyDotSyntax)
486    };
487    unsigned ObjCMTAction = ObjCMT_None;
488    std::string ObjCMTAllowListPath;
489  
490    std::string MTMigrateDir;
491    std::string ARCMTMigrateReportOut;
492  
493    /// The input kind, either specified via -x argument or deduced from the input
494    /// file name.
495    InputKind DashX;
496  
497    /// The input files and their types.
498    SmallVector<FrontendInputFile, 0> Inputs;
499  
500    /// When the input is a module map, the original module map file from which
501    /// that map was inferred, if any (for umbrella modules).
502    std::string OriginalModuleMap;
503  
504    /// The output file, if any.
505    std::string OutputFile;
506  
507    /// If given, the new suffix for fix-it rewritten files.
508    std::string FixItSuffix;
509  
510    /// If given, filter dumped AST Decl nodes by this substring.
511    std::string ASTDumpFilter;
512  
513    /// If given, enable code completion at the provided location.
514    ParsedSourceLocation CodeCompletionAt;
515  
516    /// The frontend action to perform.
517    frontend::ActionKind ProgramAction = frontend::ParseSyntaxOnly;
518  
519    /// The name of the action to run when using a plugin action.
520    std::string ActionName;
521  
522    // Currently this is only used as part of the `-extract-api` action.
523    /// The name of the product the input files belong too.
524    std::string ProductName;
525  
526    // Currently this is only used as part of the `-extract-api` action.
527    // A comma separated list of files providing a list of APIs to
528    // ignore when extracting documentation.
529    std::vector<std::string> ExtractAPIIgnoresFileList;
530  
531    // Location of output directory where symbol graph information would
532    // be dumped. This overrides regular -o output file specification
533    std::string SymbolGraphOutputDir;
534  
535    /// Args to pass to the plugins
536    std::map<std::string, std::vector<std::string>> PluginArgs;
537  
538    /// The list of plugin actions to run in addition to the normal action.
539    std::vector<std::string> AddPluginActions;
540  
541    /// The list of plugins to load.
542    std::vector<std::string> Plugins;
543  
544    /// The list of module file extensions.
545    std::vector<std::shared_ptr<ModuleFileExtension>> ModuleFileExtensions;
546  
547    /// The list of module map files to load before processing the input.
548    std::vector<std::string> ModuleMapFiles;
549  
550    /// The list of additional prebuilt module files to load before
551    /// processing the input.
552    std::vector<std::string> ModuleFiles;
553  
554    /// The list of files to embed into the compiled module file.
555    std::vector<std::string> ModulesEmbedFiles;
556  
557    /// The list of AST files to merge.
558    std::vector<std::string> ASTMergeFiles;
559  
560    /// A list of arguments to forward to LLVM's option processing; this
561    /// should only be used for debugging and experimental features.
562    std::vector<std::string> LLVMArgs;
563  
564    /// File name of the file that will provide record layouts
565    /// (in the format produced by -fdump-record-layouts).
566    std::string OverrideRecordLayoutsFile;
567  
568    /// Auxiliary triple for CUDA/HIP compilation.
569    std::string AuxTriple;
570  
571    /// Auxiliary target CPU for CUDA/HIP compilation.
572    std::optional<std::string> AuxTargetCPU;
573  
574    /// Auxiliary target features for CUDA/HIP compilation.
575    std::optional<std::vector<std::string>> AuxTargetFeatures;
576  
577    /// Filename to write statistics to.
578    std::string StatsFile;
579  
580    /// Minimum time granularity (in microseconds) traced by time profiler.
581    unsigned TimeTraceGranularity;
582  
583    /// Make time trace capture verbose event details (e.g. source filenames).
584    /// This can increase the size of the output by 2-3 times.
585    LLVM_PREFERRED_TYPE(bool)
586    unsigned TimeTraceVerbose : 1;
587  
588    /// Path which stores the output files for -ftime-trace
589    std::string TimeTracePath;
590  
591    /// Output Path for module output file.
592    std::string ModuleOutputPath;
593  
594  public:
FrontendOptions()595    FrontendOptions()
596        : DisableFree(false), RelocatablePCH(false), ShowHelp(false),
597          ShowStats(false), AppendStats(false), ShowVersion(false),
598          FixWhatYouCan(false), FixOnlyWarnings(false), FixAndRecompile(false),
599          FixToTemporaries(false), ARCMTMigrateEmitARCErrors(false),
600          SkipFunctionBodies(false), UseGlobalModuleIndex(true),
601          GenerateGlobalModuleIndex(true), ASTDumpDecls(false),
602          ASTDumpLookups(false), BuildingImplicitModule(false),
603          BuildingImplicitModuleUsesLock(true), ModulesEmbedAllFiles(false),
604          IncludeTimestamps(true), UseTemporary(true),
605          AllowPCMWithCompilerErrors(false), ModulesShareFileManager(true),
606          EmitSymbolGraph(false), EmitExtensionSymbolGraphs(false),
607          EmitSymbolGraphSymbolLabelsForTesting(false),
608          EmitPrettySymbolGraphs(false), GenReducedBMI(false),
609          UseClangIRPipeline(false), TimeTraceGranularity(500),
610          TimeTraceVerbose(false) {}
611  
612    /// getInputKindForExtension - Return the appropriate input kind for a file
613    /// extension. For example, "c" would return Language::C.
614    ///
615    /// \return The input kind for the extension, or Language::Unknown if the
616    /// extension is not recognized.
617    static InputKind getInputKindForExtension(StringRef Extension);
618  };
619  
620  } // namespace clang
621  
622  #endif // LLVM_CLANG_FRONTEND_FRONTENDOPTIONS_H
623