123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- FrontendOptions.h ----------------------------------------*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_CLANG_FRONTEND_FRONTENDOPTIONS_H
- #define LLVM_CLANG_FRONTEND_FRONTENDOPTIONS_H
- #include "clang/AST/ASTDumperUtils.h"
- #include "clang/Basic/LangStandard.h"
- #include "clang/Frontend/CommandLineSourceLoc.h"
- #include "clang/Sema/CodeCompleteOptions.h"
- #include "clang/Serialization/ModuleFileExtension.h"
- #include "llvm/ADT/StringRef.h"
- #include "llvm/Support/MemoryBuffer.h"
- #include <cassert>
- #include <map>
- #include <memory>
- #include <optional>
- #include <string>
- #include <vector>
- namespace llvm {
- class MemoryBuffer;
- } // namespace llvm
- namespace clang {
- namespace frontend {
- enum ActionKind {
- /// Parse ASTs and list Decl nodes.
- ASTDeclList,
- /// Parse ASTs and dump them.
- ASTDump,
- /// Parse ASTs and print them.
- ASTPrint,
- /// Parse ASTs and view them in Graphviz.
- ASTView,
- /// Dump the compiler configuration.
- DumpCompilerOptions,
- /// Dump out raw tokens.
- DumpRawTokens,
- /// Dump out preprocessed tokens.
- DumpTokens,
- /// Emit a .s file.
- EmitAssembly,
- /// Emit a .bc file.
- EmitBC,
- /// Translate input source into HTML.
- EmitHTML,
- /// Emit a .ll file.
- EmitLLVM,
- /// Generate LLVM IR, but do not emit anything.
- EmitLLVMOnly,
- /// Generate machine code, but don't emit anything.
- EmitCodeGenOnly,
- /// Emit a .o file.
- EmitObj,
- // Extract API information
- ExtractAPI,
- /// Parse and apply any fixits to the source.
- FixIt,
- /// Generate pre-compiled module from a module map.
- GenerateModule,
- /// Generate pre-compiled module from a C++ module interface file.
- GenerateModuleInterface,
- /// Generate a C++20 header unit module from a header file.
- GenerateHeaderUnit,
- /// Generate pre-compiled header.
- GeneratePCH,
- /// Generate Interface Stub Files.
- GenerateInterfaceStubs,
- /// Only execute frontend initialization.
- InitOnly,
- /// Dump information about a module file.
- ModuleFileInfo,
- /// Load and verify that a PCH file is usable.
- VerifyPCH,
- /// Parse and perform semantic analysis.
- ParseSyntaxOnly,
- /// Run a plugin action, \see ActionName.
- PluginAction,
- /// Print the "preamble" of the input file
- PrintPreamble,
- /// -E mode.
- PrintPreprocessedInput,
- /// Expand macros but not \#includes.
- RewriteMacros,
- /// ObjC->C Rewriter.
- RewriteObjC,
- /// Rewriter playground
- RewriteTest,
- /// Run one or more source code analyses.
- RunAnalysis,
- /// Dump template instantiations
- TemplightDump,
- /// Run migrator.
- MigrateSource,
- /// Just lex, no output.
- RunPreprocessorOnly,
- /// Print the output of the dependency directives source minimizer.
- PrintDependencyDirectivesSourceMinimizerOutput
- };
- } // namespace frontend
- /// The kind of a file that we've been handed as an input.
- class InputKind {
- private:
- Language Lang;
- unsigned Fmt : 3;
- unsigned Preprocessed : 1;
- unsigned HeaderUnit : 3;
- unsigned IsHeader : 1;
- public:
- /// The input file format.
- enum Format {
- Source,
- ModuleMap,
- Precompiled
- };
- // If we are building a header unit, what kind it is; this affects whether
- // we look for the file in the user or system include search paths before
- // flagging a missing input.
- enum HeaderUnitKind {
- HeaderUnit_None,
- HeaderUnit_User,
- HeaderUnit_System,
- HeaderUnit_Abs
- };
- constexpr InputKind(Language L = Language::Unknown, Format F = Source,
- bool PP = false, HeaderUnitKind HU = HeaderUnit_None,
- bool HD = false)
- : Lang(L), Fmt(F), Preprocessed(PP), HeaderUnit(HU), IsHeader(HD) {}
- Language getLanguage() const { return static_cast<Language>(Lang); }
- Format getFormat() const { return static_cast<Format>(Fmt); }
- HeaderUnitKind getHeaderUnitKind() const {
- return static_cast<HeaderUnitKind>(HeaderUnit);
- }
- bool isPreprocessed() const { return Preprocessed; }
- bool isHeader() const { return IsHeader; }
- bool isHeaderUnit() const { return HeaderUnit != HeaderUnit_None; }
- /// Is the input kind fully-unknown?
- bool isUnknown() const { return Lang == Language::Unknown && Fmt == Source; }
- /// Is the language of the input some dialect of Objective-C?
- bool isObjectiveC() const {
- return Lang == Language::ObjC || Lang == Language::ObjCXX;
- }
- InputKind getPreprocessed() const {
- return InputKind(getLanguage(), getFormat(), true, getHeaderUnitKind(),
- isHeader());
- }
- InputKind getHeader() const {
- return InputKind(getLanguage(), getFormat(), isPreprocessed(),
- getHeaderUnitKind(), true);
- }
- InputKind withHeaderUnit(HeaderUnitKind HU) const {
- return InputKind(getLanguage(), getFormat(), isPreprocessed(), HU,
- isHeader());
- }
- InputKind withFormat(Format F) const {
- return InputKind(getLanguage(), F, isPreprocessed(), getHeaderUnitKind(),
- isHeader());
- }
- };
- /// An input file for the front end.
- class FrontendInputFile {
- /// The file name, or "-" to read from standard input.
- std::string File;
- /// The input, if it comes from a buffer rather than a file. This object
- /// does not own the buffer, and the caller is responsible for ensuring
- /// that it outlives any users.
- std::optional<llvm::MemoryBufferRef> Buffer;
- /// The kind of input, e.g., C source, AST file, LLVM IR.
- InputKind Kind;
- /// Whether we're dealing with a 'system' input (vs. a 'user' input).
- bool IsSystem = false;
- public:
- FrontendInputFile() = default;
- FrontendInputFile(StringRef File, InputKind Kind, bool IsSystem = false)
- : File(File.str()), Kind(Kind), IsSystem(IsSystem) {}
- FrontendInputFile(llvm::MemoryBufferRef Buffer, InputKind Kind,
- bool IsSystem = false)
- : Buffer(Buffer), Kind(Kind), IsSystem(IsSystem) {}
- InputKind getKind() const { return Kind; }
- bool isSystem() const { return IsSystem; }
- bool isEmpty() const { return File.empty() && Buffer == std::nullopt; }
- bool isFile() const { return !isBuffer(); }
- bool isBuffer() const { return Buffer != std::nullopt; }
- bool isPreprocessed() const { return Kind.isPreprocessed(); }
- bool isHeader() const { return Kind.isHeader(); }
- InputKind::HeaderUnitKind getHeaderUnitKind() const {
- return Kind.getHeaderUnitKind();
- }
- StringRef getFile() const {
- assert(isFile());
- return File;
- }
- llvm::MemoryBufferRef getBuffer() const {
- assert(isBuffer());
- return *Buffer;
- }
- };
- /// FrontendOptions - Options for controlling the behavior of the frontend.
- class FrontendOptions {
- public:
- /// Disable memory freeing on exit.
- unsigned DisableFree : 1;
- /// When generating PCH files, instruct the AST writer to create relocatable
- /// PCH files.
- unsigned RelocatablePCH : 1;
- /// Show the -help text.
- unsigned ShowHelp : 1;
- /// Show frontend performance metrics and statistics.
- unsigned ShowStats : 1;
- /// print the supported cpus for the current target
- unsigned PrintSupportedCPUs : 1;
- /// Output time trace profile.
- unsigned TimeTrace : 1;
- /// Show the -version text.
- unsigned ShowVersion : 1;
- /// Apply fixes even if there are unfixable errors.
- unsigned FixWhatYouCan : 1;
- /// Apply fixes only for warnings.
- unsigned FixOnlyWarnings : 1;
- /// Apply fixes and recompile.
- unsigned FixAndRecompile : 1;
- /// Apply fixes to temporary files.
- unsigned FixToTemporaries : 1;
- /// Emit ARC errors even if the migrator can fix them.
- unsigned ARCMTMigrateEmitARCErrors : 1;
- /// Skip over function bodies to speed up parsing in cases you do not need
- /// them (e.g. with code completion).
- unsigned SkipFunctionBodies : 1;
- /// Whether we can use the global module index if available.
- unsigned UseGlobalModuleIndex : 1;
- /// Whether we can generate the global module index if needed.
- unsigned GenerateGlobalModuleIndex : 1;
- /// Whether we include declaration dumps in AST dumps.
- unsigned ASTDumpDecls : 1;
- /// Whether we deserialize all decls when forming AST dumps.
- unsigned ASTDumpAll : 1;
- /// Whether we include lookup table dumps in AST dumps.
- unsigned ASTDumpLookups : 1;
- /// Whether we include declaration type dumps in AST dumps.
- unsigned ASTDumpDeclTypes : 1;
- /// Whether we are performing an implicit module build.
- unsigned BuildingImplicitModule : 1;
- /// Whether to use a filesystem lock when building implicit modules.
- unsigned BuildingImplicitModuleUsesLock : 1;
- /// Whether we should embed all used files into the PCM file.
- unsigned ModulesEmbedAllFiles : 1;
- /// Whether timestamps should be written to the produced PCH file.
- unsigned IncludeTimestamps : 1;
- /// Should a temporary file be used during compilation.
- unsigned UseTemporary : 1;
- /// When using -emit-module, treat the modulemap as a system module.
- unsigned IsSystemModule : 1;
- /// Output (and read) PCM files regardless of compiler errors.
- unsigned AllowPCMWithCompilerErrors : 1;
- /// Whether to share the FileManager when building modules.
- unsigned ModulesShareFileManager : 1;
- CodeCompleteOptions CodeCompleteOpts;
- /// Specifies the output format of the AST.
- ASTDumpOutputFormat ASTDumpFormat = ADOF_Default;
- enum {
- ARCMT_None,
- ARCMT_Check,
- ARCMT_Modify,
- ARCMT_Migrate
- } ARCMTAction = ARCMT_None;
- enum {
- ObjCMT_None = 0,
- /// Enable migration to modern ObjC literals.
- ObjCMT_Literals = 0x1,
- /// Enable migration to modern ObjC subscripting.
- ObjCMT_Subscripting = 0x2,
- /// Enable migration to modern ObjC readonly property.
- ObjCMT_ReadonlyProperty = 0x4,
- /// Enable migration to modern ObjC readwrite property.
- ObjCMT_ReadwriteProperty = 0x8,
- /// Enable migration to modern ObjC property.
- ObjCMT_Property = (ObjCMT_ReadonlyProperty | ObjCMT_ReadwriteProperty),
- /// Enable annotation of ObjCMethods of all kinds.
- ObjCMT_Annotation = 0x10,
- /// Enable migration of ObjC methods to 'instancetype'.
- ObjCMT_Instancetype = 0x20,
- /// Enable migration to NS_ENUM/NS_OPTIONS macros.
- ObjCMT_NsMacros = 0x40,
- /// Enable migration to add conforming protocols.
- ObjCMT_ProtocolConformance = 0x80,
- /// prefer 'atomic' property over 'nonatomic'.
- ObjCMT_AtomicProperty = 0x100,
- /// annotate property with NS_RETURNS_INNER_POINTER
- ObjCMT_ReturnsInnerPointerProperty = 0x200,
- /// use NS_NONATOMIC_IOSONLY for property 'atomic' attribute
- ObjCMT_NsAtomicIOSOnlyProperty = 0x400,
- /// Enable inferring NS_DESIGNATED_INITIALIZER for ObjC methods.
- ObjCMT_DesignatedInitializer = 0x800,
- /// Enable converting setter/getter expressions to property-dot syntx.
- ObjCMT_PropertyDotSyntax = 0x1000,
- ObjCMT_MigrateDecls = (ObjCMT_ReadonlyProperty | ObjCMT_ReadwriteProperty |
- ObjCMT_Annotation | ObjCMT_Instancetype |
- ObjCMT_NsMacros | ObjCMT_ProtocolConformance |
- ObjCMT_NsAtomicIOSOnlyProperty |
- ObjCMT_DesignatedInitializer),
- ObjCMT_MigrateAll = (ObjCMT_Literals | ObjCMT_Subscripting |
- ObjCMT_MigrateDecls | ObjCMT_PropertyDotSyntax)
- };
- unsigned ObjCMTAction = ObjCMT_None;
- std::string ObjCMTAllowListPath;
- std::string MTMigrateDir;
- std::string ARCMTMigrateReportOut;
- /// The input kind, either specified via -x argument or deduced from the input
- /// file name.
- InputKind DashX;
- /// The input files and their types.
- SmallVector<FrontendInputFile, 0> Inputs;
- /// When the input is a module map, the original module map file from which
- /// that map was inferred, if any (for umbrella modules).
- std::string OriginalModuleMap;
- /// The output file, if any.
- std::string OutputFile;
- /// If given, the new suffix for fix-it rewritten files.
- std::string FixItSuffix;
- /// If given, filter dumped AST Decl nodes by this substring.
- std::string ASTDumpFilter;
- /// If given, enable code completion at the provided location.
- ParsedSourceLocation CodeCompletionAt;
- /// The frontend action to perform.
- frontend::ActionKind ProgramAction = frontend::ParseSyntaxOnly;
- /// The name of the action to run when using a plugin action.
- std::string ActionName;
- // Currently this is only used as part of the `-extract-api` action.
- /// The name of the product the input files belong too.
- std::string ProductName;
- // Currently this is only used as part of the `-extract-api` action.
- /// The file providing a list of APIs to ignore when extracting documentation
- std::string ExtractAPIIgnoresFile;
- /// Args to pass to the plugins
- std::map<std::string, std::vector<std::string>> PluginArgs;
- /// The list of plugin actions to run in addition to the normal action.
- std::vector<std::string> AddPluginActions;
- /// The list of plugins to load.
- std::vector<std::string> Plugins;
- /// The list of module file extensions.
- std::vector<std::shared_ptr<ModuleFileExtension>> ModuleFileExtensions;
- /// The list of module map files to load before processing the input.
- std::vector<std::string> ModuleMapFiles;
- /// The list of additional prebuilt module files to load before
- /// processing the input.
- std::vector<std::string> ModuleFiles;
- /// The list of files to embed into the compiled module file.
- std::vector<std::string> ModulesEmbedFiles;
- /// The list of AST files to merge.
- std::vector<std::string> ASTMergeFiles;
- /// A list of arguments to forward to LLVM's option processing; this
- /// should only be used for debugging and experimental features.
- std::vector<std::string> LLVMArgs;
- /// File name of the file that will provide record layouts
- /// (in the format produced by -fdump-record-layouts).
- std::string OverrideRecordLayoutsFile;
- /// Auxiliary triple for CUDA/HIP compilation.
- std::string AuxTriple;
- /// Auxiliary target CPU for CUDA/HIP compilation.
- std::optional<std::string> AuxTargetCPU;
- /// Auxiliary target features for CUDA/HIP compilation.
- std::optional<std::vector<std::string>> AuxTargetFeatures;
- /// Filename to write statistics to.
- std::string StatsFile;
- /// Minimum time granularity (in microseconds) traced by time profiler.
- unsigned TimeTraceGranularity;
- /// Path which stores the output files for -ftime-trace
- std::string TimeTracePath;
- public:
- FrontendOptions()
- : DisableFree(false), RelocatablePCH(false), ShowHelp(false),
- ShowStats(false), TimeTrace(false), ShowVersion(false),
- FixWhatYouCan(false), FixOnlyWarnings(false), FixAndRecompile(false),
- FixToTemporaries(false), ARCMTMigrateEmitARCErrors(false),
- SkipFunctionBodies(false), UseGlobalModuleIndex(true),
- GenerateGlobalModuleIndex(true), ASTDumpDecls(false),
- ASTDumpLookups(false), BuildingImplicitModule(false),
- BuildingImplicitModuleUsesLock(true), ModulesEmbedAllFiles(false),
- IncludeTimestamps(true), UseTemporary(true),
- AllowPCMWithCompilerErrors(false), ModulesShareFileManager(true),
- TimeTraceGranularity(500) {}
- /// getInputKindForExtension - Return the appropriate input kind for a file
- /// extension. For example, "c" would return Language::C.
- ///
- /// \return The input kind for the extension, or Language::Unknown if the
- /// extension is not recognized.
- static InputKind getInputKindForExtension(StringRef Extension);
- };
- } // namespace clang
- #endif // LLVM_CLANG_FRONTEND_FRONTENDOPTIONS_H
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|