126266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar//===--- FrontendOptions.h --------------------------------------*- C++ -*-===//
226266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar//
326266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar//                     The LLVM Compiler Infrastructure
426266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar//
526266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar// This file is distributed under the University of Illinois Open Source
626266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar// License. See LICENSE.TXT for details.
726266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar//
826266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar//===----------------------------------------------------------------------===//
926266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar
1026266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar#ifndef LLVM_CLANG_FRONTEND_FRONTENDOPTIONS_H
1126266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar#define LLVM_CLANG_FRONTEND_FRONTENDOPTIONS_H
1226266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar
13c86804bc9c3f1953520b59084c9ad75104aba123Daniel Dunbar#include "clang/Frontend/CommandLineSourceLoc.h"
14a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar#include "clang/Serialization/ModuleFileExtension.h"
15d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko#include "clang/Sema/CodeCompleteOptions.h"
16fbe2fafe317a757031e4f24026a77dd305607d32Daniel Dunbar#include "llvm/ADT/StringRef.h"
1726266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar#include <string>
1826266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar#include <vector>
1926266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar
208616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidisnamespace llvm {
218616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidisclass MemoryBuffer;
228616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis}
238616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis
2426266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbarnamespace clang {
2526266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar
269a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbarnamespace frontend {
279a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar  enum ActionKind {
28171af64ef10ae816ed2a4f15f5d17aca1d71769fAlexander Kornienko    ASTDeclList,            ///< Parse ASTs and list Decl nodes.
299a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar    ASTDump,                ///< Parse ASTs and dump them.
309a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar    ASTPrint,               ///< Parse ASTs and print them.
319a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar    ASTView,                ///< Parse ASTs and view them in Graphviz.
329a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar    DumpRawTokens,          ///< Dump out raw tokens.
339a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar    DumpTokens,             ///< Dump out preprocessed tokens.
349a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar    EmitAssembly,           ///< Emit a .s file.
359a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar    EmitBC,                 ///< Emit a .bc file.
369a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar    EmitHTML,               ///< Translate input source into HTML.
379a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar    EmitLLVM,               ///< Emit a .ll file.
3832148cef25570a4fbe3ad0ec497ce3ae2cf1b774Daniel Dunbar    EmitLLVMOnly,           ///< Generate LLVM IR, but do not emit anything.
3932148cef25570a4fbe3ad0ec497ce3ae2cf1b774Daniel Dunbar    EmitCodeGenOnly,        ///< Generate machine code, but don't emit anything.
40da1573f95902a42aa4d11e8f45ab98ec7e27bc28Daniel Dunbar    EmitObj,                ///< Emit a .o file.
419a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar    FixIt,                  ///< Parse and apply any fixits to the source.
42467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor    GenerateModule,         ///< Generate pre-compiled module.
439a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar    GeneratePCH,            ///< Generate pre-compiled header.
449a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar    GeneratePTH,            ///< Generate pre-tokenized header.
452758595023c5c7c0495f19260089f975022c50dcDaniel Dunbar    InitOnly,               ///< Only execute frontend initialization.
46c544ba09695e300f31355af342258bd57619e737Douglas Gregor    ModuleFileInfo,         ///< Dump information about a module file.
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    VerifyPCH,              ///< Load and verify that a PCH file is usable.
489a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar    ParseSyntaxOnly,        ///< Parse and perform semantic analysis.
49d10c5b88334d860d19284032a7126dc2219f57edDaniel Dunbar    PluginAction,           ///< Run a plugin action, \see ActionName.
509a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar    PrintDeclContext,       ///< Print DeclContext and their Decls.
51f033f1da4a34f8df6e95e9929dc04ff54bb8fb01Douglas Gregor    PrintPreamble,          ///< Print the "preamble" of the input file
529a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar    PrintPreprocessedInput, ///< -E mode.
53809d1be9820039b4cf6efa48246a0d70ffa13394James Dennett    RewriteMacros,          ///< Expand macros but not \#includes.
549a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar    RewriteObjC,            ///< ObjC->C Rewriter.
559a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar    RewriteTest,            ///< Rewriter playground
569a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar    RunAnalysis,            ///< Run one or more source code analyses.
5730660a898545416f0fea2d717f16f75640001e38Ted Kremenek    MigrateSource,          ///< Run migrator.
589a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar    RunPreprocessorOnly     ///< Just lex, no output.
599a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar  };
609a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar}
619a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar
621f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregorenum InputKind {
631f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  IK_None,
641f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  IK_Asm,
651f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  IK_C,
661f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  IK_CXX,
671f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  IK_ObjC,
681f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  IK_ObjCXX,
691f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  IK_PreprocessedC,
701f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  IK_PreprocessedCXX,
711f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  IK_PreprocessedObjC,
721f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  IK_PreprocessedObjCXX,
731f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  IK_OpenCL,
741f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  IK_CUDA,
753ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  IK_PreprocessedCuda,
761f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  IK_AST,
771f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  IK_LLVM_IR
781f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor};
791f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor
801f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor
811f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor/// \brief An input file for the front end.
828616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidisclass FrontendInputFile {
831f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  /// \brief The file name, or "-" to read from standard input.
841f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  std::string File;
851f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor
868616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis  llvm::MemoryBuffer *Buffer;
878616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis
881f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  /// \brief The kind of input, e.g., C source, AST file, LLVM IR.
891f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  InputKind Kind;
901f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor
91a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor  /// \brief Whether we're dealing with a 'system' input (vs. a 'user' input).
92a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor  bool IsSystem;
938616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis
948616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidispublic:
95a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  FrontendInputFile() : Buffer(nullptr), Kind(IK_None), IsSystem(false) { }
96a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor  FrontendInputFile(StringRef File, InputKind Kind, bool IsSystem = false)
976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    : File(File.str()), Buffer(nullptr), Kind(Kind), IsSystem(IsSystem) { }
988616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis  FrontendInputFile(llvm::MemoryBuffer *buffer, InputKind Kind,
998616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis                    bool IsSystem = false)
1008616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis    : Buffer(buffer), Kind(Kind), IsSystem(IsSystem) { }
1018616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis
1028616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis  InputKind getKind() const { return Kind; }
1038616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis  bool isSystem() const { return IsSystem; }
1048616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis
1056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool isEmpty() const { return File.empty() && Buffer == nullptr; }
1068616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis  bool isFile() const { return !isBuffer(); }
1076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool isBuffer() const { return Buffer != nullptr; }
1088616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis
1098616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis  StringRef getFile() const {
1108616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis    assert(isFile());
1118616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis    return File;
1128616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis  }
1138616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis  llvm::MemoryBuffer *getBuffer() const {
1148616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis    assert(isBuffer());
1158616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis    return Buffer;
1168616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis  }
1171f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor};
118d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko
11926266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar/// FrontendOptions - Options for controlling the behavior of the frontend.
12026266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbarclass FrontendOptions {
12126266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbarpublic:
122914474ca51d202369241a81013208833a6bb3f12Daniel Dunbar  unsigned DisableFree : 1;                ///< Disable memory freeing on exit.
123914474ca51d202369241a81013208833a6bb3f12Daniel Dunbar  unsigned RelocatablePCH : 1;             ///< When generating PCH files,
1243c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl                                           /// instruct the AST writer to create
125914474ca51d202369241a81013208833a6bb3f12Daniel Dunbar                                           /// relocatable PCH files.
1269b5e9ae08defd14441acca1d7d4502b933bf6c5aDaniel Dunbar  unsigned ShowHelp : 1;                   ///< Show the -help text.
127914474ca51d202369241a81013208833a6bb3f12Daniel Dunbar  unsigned ShowStats : 1;                  ///< Show frontend performance
128914474ca51d202369241a81013208833a6bb3f12Daniel Dunbar                                           /// metrics and statistics.
129914474ca51d202369241a81013208833a6bb3f12Daniel Dunbar  unsigned ShowTimers : 1;                 ///< Show timers for individual
130914474ca51d202369241a81013208833a6bb3f12Daniel Dunbar                                           /// actions.
1319b5e9ae08defd14441acca1d7d4502b933bf6c5aDaniel Dunbar  unsigned ShowVersion : 1;                ///< Show the -version text.
1321450f265fcc84a7ca64dd9f3b8d4492c5bd55e23Nick Lewycky  unsigned FixWhatYouCan : 1;              ///< Apply fixes even if there are
1331450f265fcc84a7ca64dd9f3b8d4492c5bd55e23Nick Lewycky                                           /// unfixable errors.
13461d679ab2831b161c857cf3f974312fbd4ef1efdArgyrios Kyrtzidis  unsigned FixOnlyWarnings : 1;            ///< Apply fixes only for warnings.
13561d679ab2831b161c857cf3f974312fbd4ef1efdArgyrios Kyrtzidis  unsigned FixAndRecompile : 1;            ///< Apply fixes and recompile.
13661d679ab2831b161c857cf3f974312fbd4ef1efdArgyrios Kyrtzidis  unsigned FixToTemporaries : 1;           ///< Apply fixes to temporary files.
1377ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis  unsigned ARCMTMigrateEmitARCErrors : 1;  /// Emit ARC errors even if the
1387ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis                                           /// migrator can fix them
1396a91d385618ea4d28236c496f540a26877c95525Erik Verbruggen  unsigned SkipFunctionBodies : 1;         ///< Skip over function bodies to
1406a91d385618ea4d28236c496f540a26877c95525Erik Verbruggen                                           /// speed up parsing in cases you do
1416a91d385618ea4d28236c496f540a26877c95525Erik Verbruggen                                           /// not need them (e.g. with code
1426a91d385618ea4d28236c496f540a26877c95525Erik Verbruggen                                           /// completion).
143f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor  unsigned UseGlobalModuleIndex : 1;       ///< Whether we can use the
144f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor                                           ///< global module index if available.
145f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor  unsigned GenerateGlobalModuleIndex : 1;  ///< Whether we can generate the
146f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor                                           ///< global module index if needed.
147176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  unsigned ASTDumpDecls : 1;               ///< Whether we include declaration
148176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                           ///< dumps in AST dumps.
149ab297ccbcc51d5197d4ddb4e99b7bc8868d38314Richard Smith  unsigned ASTDumpLookups : 1;             ///< Whether we include lookup table
150ab297ccbcc51d5197d4ddb4e99b7bc8868d38314Richard Smith                                           ///< dumps in AST dumps.
151a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  unsigned BuildingImplicitModule : 1;     ///< Whether we are performing an
152a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar                                           ///< implicit module build.
153a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  unsigned ModulesEmbedAllFiles : 1;       ///< Whether we should embed all used
154a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar                                           ///< files into the PCM file.
155f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor
156d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko  CodeCompleteOptions CodeCompleteOpts;
157d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko
158f85e193739c953358c865005855253af4f68a497John McCall  enum {
159f85e193739c953358c865005855253af4f68a497John McCall    ARCMT_None,
160f85e193739c953358c865005855253af4f68a497John McCall    ARCMT_Check,
16169325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis    ARCMT_Modify,
16269325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis    ARCMT_Migrate
163f85e193739c953358c865005855253af4f68a497John McCall  } ARCMTAction;
164f85e193739c953358c865005855253af4f68a497John McCall
16530660a898545416f0fea2d717f16f75640001e38Ted Kremenek  enum {
16630660a898545416f0fea2d717f16f75640001e38Ted Kremenek    ObjCMT_None = 0,
16730660a898545416f0fea2d717f16f75640001e38Ted Kremenek    /// \brief Enable migration to modern ObjC literals.
16830660a898545416f0fea2d717f16f75640001e38Ted Kremenek    ObjCMT_Literals = 0x1,
16930660a898545416f0fea2d717f16f75640001e38Ted Kremenek    /// \brief Enable migration to modern ObjC subscripting.
170d412999a3da6387dbfaf00f7647132082e94310eFariborz Jahanian    ObjCMT_Subscripting = 0x2,
1715b98aba1d74184923da32016c3abbc20e9a7686dFariborz Jahanian    /// \brief Enable migration to modern ObjC readonly property.
172081099d302b79d1746c7a39da14e3265971eb718Fariborz Jahanian    ObjCMT_ReadonlyProperty = 0x4,
173081099d302b79d1746c7a39da14e3265971eb718Fariborz Jahanian    /// \brief Enable migration to modern ObjC readwrite property.
174081099d302b79d1746c7a39da14e3265971eb718Fariborz Jahanian    ObjCMT_ReadwriteProperty = 0x8,
175081099d302b79d1746c7a39da14e3265971eb718Fariborz Jahanian    /// \brief Enable migration to modern ObjC property.
176081099d302b79d1746c7a39da14e3265971eb718Fariborz Jahanian    ObjCMT_Property = (ObjCMT_ReadonlyProperty | ObjCMT_ReadwriteProperty),
177081099d302b79d1746c7a39da14e3265971eb718Fariborz Jahanian    /// \brief Enable annotation of ObjCMethods of all kinds.
178081099d302b79d1746c7a39da14e3265971eb718Fariborz Jahanian    ObjCMT_Annotation = 0x10,
179081099d302b79d1746c7a39da14e3265971eb718Fariborz Jahanian    /// \brief Enable migration of ObjC methods to 'instancetype'.
180081099d302b79d1746c7a39da14e3265971eb718Fariborz Jahanian    ObjCMT_Instancetype = 0x20,
181081099d302b79d1746c7a39da14e3265971eb718Fariborz Jahanian    /// \brief Enable migration to NS_ENUM/NS_OPTIONS macros.
182081099d302b79d1746c7a39da14e3265971eb718Fariborz Jahanian    ObjCMT_NsMacros = 0x40,
183081099d302b79d1746c7a39da14e3265971eb718Fariborz Jahanian    /// \brief Enable migration to add conforming protocols.
184081099d302b79d1746c7a39da14e3265971eb718Fariborz Jahanian    ObjCMT_ProtocolConformance = 0x80,
18539ebb02cb0bd342ced56de6d19aa9992aa0371b8Fariborz Jahanian    /// \brief prefer 'atomic' property over 'nonatomic'.
18639ebb02cb0bd342ced56de6d19aa9992aa0371b8Fariborz Jahanian    ObjCMT_AtomicProperty = 0x100,
187cd569f2788ece55b9f790b6900164e2b2d5d966cFariborz Jahanian    /// \brief annotate property with NS_RETURNS_INNER_POINTER
188cd569f2788ece55b9f790b6900164e2b2d5d966cFariborz Jahanian    ObjCMT_ReturnsInnerPointerProperty = 0x200,
1895d2a20671954f55f765b96375e8bcd38367cb3baFariborz Jahanian    /// \brief use NS_NONATOMIC_IOSONLY for property 'atomic' attribute
1905d2a20671954f55f765b96375e8bcd38367cb3baFariborz Jahanian    ObjCMT_NsAtomicIOSOnlyProperty = 0x400,
191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    /// \brief Enable inferring NS_DESIGNATED_INITIALIZER for ObjC methods.
192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    ObjCMT_DesignatedInitializer = 0x800,
193176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    /// \brief Enable converting setter/getter expressions to property-dot syntx.
194176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ObjCMT_PropertyDotSyntax = 0x1000,
195081099d302b79d1746c7a39da14e3265971eb718Fariborz Jahanian    ObjCMT_MigrateDecls = (ObjCMT_ReadonlyProperty | ObjCMT_ReadwriteProperty |
196081099d302b79d1746c7a39da14e3265971eb718Fariborz Jahanian                           ObjCMT_Annotation | ObjCMT_Instancetype |
1975d2a20671954f55f765b96375e8bcd38367cb3baFariborz Jahanian                           ObjCMT_NsMacros | ObjCMT_ProtocolConformance |
198651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                           ObjCMT_NsAtomicIOSOnlyProperty |
199651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                           ObjCMT_DesignatedInitializer),
200176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ObjCMT_MigrateAll = (ObjCMT_Literals | ObjCMT_Subscripting |
201176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                         ObjCMT_MigrateDecls | ObjCMT_PropertyDotSyntax)
20230660a898545416f0fea2d717f16f75640001e38Ted Kremenek  };
20330660a898545416f0fea2d717f16f75640001e38Ted Kremenek  unsigned ObjCMTAction;
2042c050f6a68c4f871d26be63f8d598f1b64a8e16fArgyrios Kyrtzidis  std::string ObjCMTWhiteListPath;
20530660a898545416f0fea2d717f16f75640001e38Ted Kremenek
20630660a898545416f0fea2d717f16f75640001e38Ted Kremenek  std::string MTMigrateDir;
2077ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis  std::string ARCMTMigrateReportOut;
20869325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis
209fbe2fafe317a757031e4f24026a77dd305607d32Daniel Dunbar  /// The input files and their types.
2101f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  std::vector<FrontendInputFile> Inputs;
21126266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar
21226266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar  /// The output file, if any.
21326266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar  std::string OutputFile;
21426266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar
215ba5f6eced29937e4e4851a2c0980744768413d66Nick Lewycky  /// If given, the new suffix for fix-it rewritten files.
216ba5f6eced29937e4e4851a2c0980744768413d66Nick Lewycky  std::string FixItSuffix;
217c86804bc9c3f1953520b59084c9ad75104aba123Daniel Dunbar
218e34a052d642ba7830174b1a51787251d7f704f80Alexander Kornienko  /// If given, filter dumped AST Decl nodes by this substring.
219e34a052d642ba7830174b1a51787251d7f704f80Alexander Kornienko  std::string ASTDumpFilter;
220e34a052d642ba7830174b1a51787251d7f704f80Alexander Kornienko
221914474ca51d202369241a81013208833a6bb3f12Daniel Dunbar  /// If given, enable code completion at the provided location.
222914474ca51d202369241a81013208833a6bb3f12Daniel Dunbar  ParsedSourceLocation CodeCompletionAt;
223914474ca51d202369241a81013208833a6bb3f12Daniel Dunbar
2249a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar  /// The frontend action to perform.
2259a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar  frontend::ActionKind ProgramAction;
2269a8a83b8fe5be9a4ca20ec6eeaafaf201ce594f9Daniel Dunbar
227d10c5b88334d860d19284032a7126dc2219f57edDaniel Dunbar  /// The name of the action to run when using a plugin action.
228d10c5b88334d860d19284032a7126dc2219f57edDaniel Dunbar  std::string ActionName;
229d10c5b88334d860d19284032a7126dc2219f57edDaniel Dunbar
230f25649c74397d2620e6ac61f1045261644707c80Nico Weber  /// Args to pass to the plugin
2313177aae51a21f61ab483c52f97124bdb707da7f1Daniel Dunbar  std::vector<std::string> PluginArgs;
2323177aae51a21f61ab483c52f97124bdb707da7f1Daniel Dunbar
2335aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber  /// The list of plugin actions to run in addition to the normal action.
2345aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber  std::vector<std::string> AddPluginActions;
2355aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber
236f25649c74397d2620e6ac61f1045261644707c80Nico Weber  /// Args to pass to the additional plugins
237f25649c74397d2620e6ac61f1045261644707c80Nico Weber  std::vector<std::vector<std::string> > AddPluginArgs;
238f25649c74397d2620e6ac61f1045261644707c80Nico Weber
239efba227cc5459554eca466aafe786b5132dcb68cDaniel Dunbar  /// The list of plugins to load.
240efba227cc5459554eca466aafe786b5132dcb68cDaniel Dunbar  std::vector<std::string> Plugins;
241efba227cc5459554eca466aafe786b5132dcb68cDaniel Dunbar
242a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  /// The list of module file extensions.
243a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  std::vector<IntrusiveRefCntPtr<ModuleFileExtension>> ModuleFileExtensions;
244a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
2450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  /// \brief The list of module map files to load before processing the input.
2460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  std::vector<std::string> ModuleMapFiles;
2470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
248176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief The list of additional prebuilt module files to load before
249176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// processing the input.
250176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  std::vector<std::string> ModuleFiles;
251176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
252a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  /// \brief The list of files to embed into the compiled module file.
253a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  std::vector<std::string> ModulesEmbedFiles;
254a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
2559bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  /// \brief The list of AST files to merge.
2569bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  std::vector<std::string> ASTMergeFiles;
2579bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
2583f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar  /// \brief A list of arguments to forward to LLVM's option processing; this
2593f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar  /// should only be used for debugging and experimental features.
2603f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar  std::vector<std::string> LLVMArgs;
2613f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar
262453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  /// \brief File name of the file that will provide record layouts
263453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  /// (in the format produced by -fdump-record-layouts).
264453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor  std::string OverrideRecordLayoutsFile;
265a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
266a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  /// \brief Auxiliary triple for CUDA compilation.
267a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  std::string AuxTriple;
268a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
26926266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbarpublic:
27096e12a264f9268a5fb73020a5d318474f0bfe429Richard Smith  FrontendOptions() :
27196e12a264f9268a5fb73020a5d318474f0bfe429Richard Smith    DisableFree(false), RelocatablePCH(false), ShowHelp(false),
27296e12a264f9268a5fb73020a5d318474f0bfe429Richard Smith    ShowStats(false), ShowTimers(false), ShowVersion(false),
27396e12a264f9268a5fb73020a5d318474f0bfe429Richard Smith    FixWhatYouCan(false), FixOnlyWarnings(false), FixAndRecompile(false),
27496e12a264f9268a5fb73020a5d318474f0bfe429Richard Smith    FixToTemporaries(false), ARCMTMigrateEmitARCErrors(false),
27520c6f2eae500242d3aef5daaa55d440a0786a1fdDouglas Gregor    SkipFunctionBodies(false), UseGlobalModuleIndex(true),
276176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    GenerateGlobalModuleIndex(true), ASTDumpDecls(false), ASTDumpLookups(false),
277a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    BuildingImplicitModule(false), ModulesEmbedAllFiles(false),
278a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor    ARCMTAction(ARCMT_None), ObjCMTAction(ObjCMT_None),
279a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor    ProgramAction(frontend::ParseSyntaxOnly)
28096e12a264f9268a5fb73020a5d318474f0bfe429Richard Smith  {}
281fbe2fafe317a757031e4f24026a77dd305607d32Daniel Dunbar
282fbe2fafe317a757031e4f24026a77dd305607d32Daniel Dunbar  /// getInputKindForExtension - Return the appropriate input kind for a file
283fbe2fafe317a757031e4f24026a77dd305607d32Daniel Dunbar  /// extension. For example, "c" would return IK_C.
284fbe2fafe317a757031e4f24026a77dd305607d32Daniel Dunbar  ///
285fbe2fafe317a757031e4f24026a77dd305607d32Daniel Dunbar  /// \return The input kind for the extension, or IK_None if the extension is
286fbe2fafe317a757031e4f24026a77dd305607d32Daniel Dunbar  /// not recognized.
287686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  static InputKind getInputKindForExtension(StringRef Extension);
28826266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar};
28926266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar
29026266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar}  // end namespace clang
29126266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar
29226266885d6eba8ee197577dd42a8e68a0e4dd2e8Daniel Dunbar#endif
293