1b3375cba7938e01895bb504e7e48ad94a2e07dd1Daniel Dunbar//===--- CompilerInvocation.cpp -------------------------------------------===// 2b3375cba7938e01895bb504e7e48ad94a2e07dd1Daniel Dunbar// 3b3375cba7938e01895bb504e7e48ad94a2e07dd1Daniel Dunbar// The LLVM Compiler Infrastructure 4b3375cba7938e01895bb504e7e48ad94a2e07dd1Daniel Dunbar// 5b3375cba7938e01895bb504e7e48ad94a2e07dd1Daniel Dunbar// This file is distributed under the University of Illinois Open Source 6b3375cba7938e01895bb504e7e48ad94a2e07dd1Daniel Dunbar// License. See LICENSE.TXT for details. 7b3375cba7938e01895bb504e7e48ad94a2e07dd1Daniel Dunbar// 8b3375cba7938e01895bb504e7e48ad94a2e07dd1Daniel Dunbar//===----------------------------------------------------------------------===// 9b3375cba7938e01895bb504e7e48ad94a2e07dd1Daniel Dunbar 1087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "TestModuleFileExtension.h" 114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/Basic/Builtins.h" 12389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis#include "clang/Basic/FileManager.h" 1355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/Version.h" 140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#include "clang/Config/config.h" 1556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h" 1655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Driver/Options.h" 17b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "clang/Driver/Util.h" 184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/Frontend/CompilerInvocation.h" 196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include "clang/Frontend/FrontendDiagnostic.h" 2056ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar#include "clang/Frontend/LangStandard.h" 21b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "clang/Frontend/Utils.h" 2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/HeaderSearchOptions.h" 236ab7cd853e9c15cf986a8a7c3db1f8d20e275409Sebastian Redl#include "clang/Serialization/ASTReader.h" 2487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/Serialization/ModuleFileExtension.h" 25984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor#include "llvm/ADT/Hashing.h" 26c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#include "llvm/ADT/STLExtras.h" 270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#include "llvm/ADT/SmallVector.h" 28b3375cba7938e01895bb504e7e48ad94a2e07dd1Daniel Dunbar#include "llvm/ADT/StringExtras.h" 2956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar#include "llvm/ADT/StringSwitch.h" 302dc14532b641bae011a374e2c6c393d2196c1411Duncan Sands#include "llvm/ADT/Triple.h" 3187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "llvm/Linker/Linker.h" 32b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/Arg.h" 33b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/ArgList.h" 34b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/OptTable.h" 35b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/Option.h" 364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "llvm/ProfileData/InstrProfReader.h" 376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include "llvm/Support/CodeGen.h" 38b3375cba7938e01895bb504e7e48ad94a2e07dd1Daniel Dunbar#include "llvm/Support/ErrorHandling.h" 39ac1db6b2bde50e9a0f3846243f654f6c13682725Rafael Espindola#include "llvm/Support/FileSystem.h" 4003013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Host.h" 4103013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Path.h" 422956ef43da9c0e7bce8fae4a015255a2c19458bbNico Rieck#include "llvm/Support/Process.h" 4387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "llvm/Target/TargetOptions.h" 444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "llvm/Support/ScopedPrinter.h" 45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include <atomic> 46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include <memory> 47d8f681e135ebd536e25a60cdb23f4d531f1f993eDouglas Gregor#include <sys/stat.h> 48c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#include <system_error> 49b3375cba7938e01895bb504e7e48ad94a2e07dd1Daniel Dunbarusing namespace clang; 50b3375cba7938e01895bb504e7e48ad94a2e07dd1Daniel Dunbar 51d3b74d9ca4f239a7a90ad193378c494306c57352Ted Kremenek//===----------------------------------------------------------------------===// 52d3b74d9ca4f239a7a90ad193378c494306c57352Ted Kremenek// Initialization. 53d3b74d9ca4f239a7a90ad193378c494306c57352Ted Kremenek//===----------------------------------------------------------------------===// 54d3b74d9ca4f239a7a90ad193378c494306c57352Ted Kremenek 558a0c5c2ec5c5496cfb01d2c86bd50991866a7356Ted KremenekCompilerInvocationBase::CompilerInvocationBase() 5602c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor : LangOpts(new LangOptions()), TargetOpts(new TargetOptions()), 57c042edd54face617a3b9d0b4b9d5a3ff229d0f48Douglas Gregor DiagnosticOpts(new DiagnosticOptions()), 5814e71f04136de056c08ffb9ccd44b4ca391cc8a5Douglas Gregor HeaderSearchOpts(new HeaderSearchOptions()), 5914e71f04136de056c08ffb9ccd44b4ca391cc8a5Douglas Gregor PreprocessorOpts(new PreprocessorOptions()) {} 60d3b74d9ca4f239a7a90ad193378c494306c57352Ted Kremenek 618a0c5c2ec5c5496cfb01d2c86bd50991866a7356Ted KremenekCompilerInvocationBase::CompilerInvocationBase(const CompilerInvocationBase &X) 62c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith : RefCountedBase<CompilerInvocation>(), 6387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LangOpts(new LangOptions(*X.getLangOpts())), 6402c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor TargetOpts(new TargetOptions(X.getTargetOpts())), 65c042edd54face617a3b9d0b4b9d5a3ff229d0f48Douglas Gregor DiagnosticOpts(new DiagnosticOptions(X.getDiagnosticOpts())), 6614e71f04136de056c08ffb9ccd44b4ca391cc8a5Douglas Gregor HeaderSearchOpts(new HeaderSearchOptions(X.getHeaderSearchOpts())), 6714e71f04136de056c08ffb9ccd44b4ca391cc8a5Douglas Gregor PreprocessorOpts(new PreprocessorOptions(X.getPreprocessorOpts())) {} 68d3b74d9ca4f239a7a90ad193378c494306c57352Ted Kremenek 696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesCompilerInvocationBase::~CompilerInvocationBase() {} 706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 71d3b74d9ca4f239a7a90ad193378c494306c57352Ted Kremenek//===----------------------------------------------------------------------===// 727c3f8b3dafebc87b4b1492276f63b6cabbc7c59bRichard Smith// Deserialization (from args) 7356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar//===----------------------------------------------------------------------===// 7456ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 7556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbarusing namespace clang::driver; 76bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloyusing namespace clang::driver::options; 77b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknerusing namespace llvm::opt; 7856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 7956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar// 8056ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 810a3c03cb1fbc1f84f851d6ad642d22b978b031fdPeter Collingbournestatic unsigned getOptimizationLevel(ArgList &Args, InputKind IK, 82d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine &Diags) { 8361e07861dd3a70c31f658bad8c4b911994e4933bPeter Collingbourne unsigned DefaultOpt = 0; 8461e07861dd3a70c31f658bad8c4b911994e4933bPeter Collingbourne if (IK == IK_OpenCL && !Args.hasArg(OPT_cl_opt_disable)) 8561e07861dd3a70c31f658bad8c4b911994e4933bPeter Collingbourne DefaultOpt = 2; 86bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy 87bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { 88bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy if (A->getOption().matches(options::OPT_O0)) 89bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy return 0; 90bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy 91d4fc9de6f7d9a56bdc2ec51d9cbbfd7d3cb0cf0aChad Rosier if (A->getOption().matches(options::OPT_Ofast)) 92d4fc9de6f7d9a56bdc2ec51d9cbbfd7d3cb0cf0aChad Rosier return 3; 93d4fc9de6f7d9a56bdc2ec51d9cbbfd7d3cb0cf0aChad Rosier 94bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy assert (A->getOption().matches(options::OPT_O)); 95bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy 96cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko StringRef S(A->getValue()); 97bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy if (S == "s" || S == "z" || S.empty()) 98bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy return 2; 99bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy 100b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner return getLastArgIntValue(Args, OPT_O, DefaultOpt, Diags); 101bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy } 102bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy 103bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy return DefaultOpt; 104bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy} 105bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy 10605422365baa8e603237f865e0de52f73f8b77235Chad Rosierstatic unsigned getOptimizationLevelSize(ArgList &Args) { 107bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { 108bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy if (A->getOption().matches(options::OPT_O)) { 1091d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith switch (A->getValue()[0]) { 110bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy default: 111bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy return 0; 112bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy case 's': 113bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy return 1; 114bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy case 'z': 115bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy return 2; 116bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy } 117bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy } 118bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy } 119bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy return 0; 120bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy} 121bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy 122176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstatic void addDiagnosticArgs(ArgList &Args, OptSpecifier Group, 123176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines OptSpecifier GroupWithValue, 124176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::vector<std::string> &Diagnostics) { 125176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (Arg *A : Args.filtered(Group)) { 126bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy if (A->getOption().getKind() == Option::FlagClass) { 127176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // The argument is a pure flag (such as OPT_Wall or OPT_Wdeprecated). Add 128176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // its name (minus the "W" or "R" at the beginning) to the warning list. 129176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diagnostics.push_back(A->getOption().getName().drop_front(1)); 130176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else if (A->getOption().matches(GroupWithValue)) { 131176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // This is -Wfoo= or -Rfoo=, where foo is the name of the diagnostic group. 132176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diagnostics.push_back(A->getOption().getName().drop_front(1).rtrim("=-")); 133bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy } else { 134176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Otherwise, add its value (for OPT_W_Joined and similar). 135176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (const char *Arg : A->getValues()) 136b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Diagnostics.emplace_back(Arg); 137bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy } 138bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy } 1390a3c03cb1fbc1f84f851d6ad642d22b978b031fdPeter Collingbourne} 1400a3c03cb1fbc1f84f851d6ad642d22b978b031fdPeter Collingbourne 1414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic void getAllNoBuiltinFuncValues(ArgList &Args, 1424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar std::vector<std::string> &Funcs) { 1434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SmallVector<const char *, 8> Values; 1444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (const auto &Arg : Args) { 1454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const Option &O = Arg->getOption(); 1464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (O.matches(options::OPT_fno_builtin_)) { 1474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const char *FuncName = Arg->getValue(); 1484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Builtin::Context::isBuiltinFunc(FuncName)) 1494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Values.push_back(FuncName); 1504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 1514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 1524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Funcs.insert(Funcs.end(), Values.begin(), Values.end()); 1534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 1544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1558fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmithstatic bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args, 156d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine &Diags) { 157bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy using namespace options; 1588fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith bool Success = true; 15956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar if (Arg *A = Args.getLastArg(OPT_analyzer_store)) { 1601d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef Name = A->getValue(); 16156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar AnalysisStores Value = llvm::StringSwitch<AnalysisStores>(Name) 16256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar#define ANALYSIS_STORE(NAME, CMDFLAG, DESC, CREATFN) \ 16356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar .Case(CMDFLAG, NAME##Model) 164987695a5ddd78beca784d4e503ffbc2dc879181aTed Kremenek#include "clang/StaticAnalyzer/Core/Analyses.def" 16556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar .Default(NumStores); 1668fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith if (Value == NumStores) { 16756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Diags.Report(diag::err_drv_invalid_value) 168bfbb39deabba4f7b8c89d69a28653074c8936086Daniel Dunbar << A->getAsString(Args) << Name; 1698fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith Success = false; 1708fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith } else { 17156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.AnalysisStoreOpt = Value; 1728fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith } 17356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar } 17456ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 17556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar if (Arg *A = Args.getLastArg(OPT_analyzer_constraints)) { 1761d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef Name = A->getValue(); 17756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar AnalysisConstraints Value = llvm::StringSwitch<AnalysisConstraints>(Name) 17856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \ 17956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar .Case(CMDFLAG, NAME##Model) 180987695a5ddd78beca784d4e503ffbc2dc879181aTed Kremenek#include "clang/StaticAnalyzer/Core/Analyses.def" 18156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar .Default(NumConstraints); 1828fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith if (Value == NumConstraints) { 18356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Diags.Report(diag::err_drv_invalid_value) 184bfbb39deabba4f7b8c89d69a28653074c8936086Daniel Dunbar << A->getAsString(Args) << Name; 1858fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith Success = false; 1868fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith } else { 18756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.AnalysisConstraintsOpt = Value; 1888fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith } 18956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar } 19056ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 19156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar if (Arg *A = Args.getLastArg(OPT_analyzer_output)) { 1921d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef Name = A->getValue(); 19356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar AnalysisDiagClients Value = llvm::StringSwitch<AnalysisDiagClients>(Name) 1945fba5a789a238c29ef811a39a39be722443ec1b1Jordan Rose#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \ 19556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar .Case(CMDFLAG, PD_##NAME) 196987695a5ddd78beca784d4e503ffbc2dc879181aTed Kremenek#include "clang/StaticAnalyzer/Core/Analyses.def" 19756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar .Default(NUM_ANALYSIS_DIAG_CLIENTS); 1988fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith if (Value == NUM_ANALYSIS_DIAG_CLIENTS) { 19956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Diags.Report(diag::err_drv_invalid_value) 200bfbb39deabba4f7b8c89d69a28653074c8936086Daniel Dunbar << A->getAsString(Args) << Name; 2018fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith Success = false; 2028fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith } else { 20356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.AnalysisDiagOpt = Value; 2048fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith } 20556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar } 20656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 207d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks if (Arg *A = Args.getLastArg(OPT_analyzer_purge)) { 2081d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef Name = A->getValue(); 209d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks AnalysisPurgeMode Value = llvm::StringSwitch<AnalysisPurgeMode>(Name) 210d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \ 211d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks .Case(CMDFLAG, NAME) 212987695a5ddd78beca784d4e503ffbc2dc879181aTed Kremenek#include "clang/StaticAnalyzer/Core/Analyses.def" 213d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks .Default(NumPurgeModes); 2148fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith if (Value == NumPurgeModes) { 215d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks Diags.Report(diag::err_drv_invalid_value) 216d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks << A->getAsString(Args) << Name; 2178fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith Success = false; 2188fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith } else { 219d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks Opts.AnalysisPurgeOpt = Value; 2208fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith } 221d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks } 222d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks 22366253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks if (Arg *A = Args.getLastArg(OPT_analyzer_inlining_mode)) { 2241d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef Name = A->getValue(); 22566253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks AnalysisInliningMode Value = llvm::StringSwitch<AnalysisInliningMode>(Name) 22666253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \ 22766253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks .Case(CMDFLAG, NAME) 228987695a5ddd78beca784d4e503ffbc2dc879181aTed Kremenek#include "clang/StaticAnalyzer/Core/Analyses.def" 22966253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks .Default(NumInliningModes); 23066253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks if (Value == NumInliningModes) { 23166253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks Diags.Report(diag::err_drv_invalid_value) 23266253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks << A->getAsString(Args) << Name; 23366253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks Success = false; 23466253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks } else { 23566253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks Opts.InliningMode = Value; 23666253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks } 23766253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks } 23866253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks 239116f3640daee424dfcdbe55e80be5a67476be4b0Argyrios Kyrtzidis Opts.ShowCheckerHelp = Args.hasArg(OPT_analyzer_checker_help); 240176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Opts.DisableAllChecks = Args.hasArg(OPT_analyzer_disable_all_checks); 241176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2423b8a04004afa46057a9af4afbd086be71d619793Ted Kremenek Opts.visualizeExplodedGraphWithGraphViz = 2433b8a04004afa46057a9af4afbd086be71d619793Ted Kremenek Args.hasArg(OPT_analyzer_viz_egraph_graphviz); 2443b8a04004afa46057a9af4afbd086be71d619793Ted Kremenek Opts.visualizeExplodedGraphWithUbiGraph = 2453b8a04004afa46057a9af4afbd086be71d619793Ted Kremenek Args.hasArg(OPT_analyzer_viz_egraph_ubigraph); 246b47dbcbc12430fdf3e5a5b9f59cdec5480e89e75Anna Zaks Opts.NoRetryExhausted = Args.hasArg(OPT_analyzer_disable_retry_exhausted); 24756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.AnalyzeAll = Args.hasArg(OPT_analyzer_opt_analyze_headers); 24856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.AnalyzerDisplayProgress = Args.hasArg(OPT_analyzer_display_progress); 249fc576514d06c46a7cac49500169411d82f38d04bTed Kremenek Opts.AnalyzeNestedBlocks = 250fc576514d06c46a7cac49500169411d82f38d04bTed Kremenek Args.hasArg(OPT_analyzer_opt_analyze_nested_blocks); 2510caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek Opts.eagerlyAssumeBinOpBifurcation = Args.hasArg(OPT_analyzer_eagerly_assume); 25203e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Opts.AnalyzeSpecificFunction = Args.getLastArgValue(OPT_analyze_function); 2539b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek Opts.UnoptimizedCFG = Args.hasArg(OPT_analysis_UnoptimizedCFG); 25456ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.TrimGraph = Args.hasArg(OPT_trim_egraph); 255b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner Opts.maxBlockVisitOnPath = 256b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner getLastArgIntValue(Args, OPT_analyzer_max_loop, 4, Diags); 25781fb169f42769e02c7425b23885a261c025fd5e6Anna Zaks Opts.PrintStats = Args.hasArg(OPT_analyzer_stats); 2588235f9c9c8b3d1737d1c6bd57f7ba3f616b92392Anna Zaks Opts.InlineMaxStackDepth = 259b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner getLastArgIntValue(Args, OPT_analyzer_inline_max_stack_depth, 260b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner Opts.InlineMaxStackDepth, Diags); 26143dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis 26243dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis Opts.CheckersControlList.clear(); 263b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Arg *A : 264b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Args.filtered(OPT_analyzer_checker, OPT_analyzer_disable_checker)) { 26543dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis A->claim(); 26643dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis bool enable = (A->getOption().getID() == OPT_analyzer_checker); 26738c8fe705ec4a8efa8992b99ab6d264fff14ca36Argyrios Kyrtzidis // We can have a list of comma separated checker names, e.g: 26838c8fe705ec4a8efa8992b99ab6d264fff14ca36Argyrios Kyrtzidis // '-analyzer-checker=cocoa,unix' 2691d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef checkerList = A->getValue(); 2705f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<StringRef, 4> checkers; 27138c8fe705ec4a8efa8992b99ab6d264fff14ca36Argyrios Kyrtzidis checkerList.split(checkers, ","); 272b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (StringRef checker : checkers) 273b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.CheckersControlList.emplace_back(checker, enable); 27443dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis } 2750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 2767b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek // Go through the analyzer configuration options. 277b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Arg *A : Args.filtered(OPT_analyzer_config)) { 2787b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek A->claim(); 2797b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek // We can have a list of comma separated config names, e.g: 280318cc3c07eaca04d319be841e9e3bac35d1ff9f5Ted Kremenek // '-analyzer-config key1=val1,key2=val2' 2811d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef configList = A->getValue(); 2827b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek SmallVector<StringRef, 4> configVals; 2837b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek configList.split(configVals, ","); 2847b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek for (unsigned i = 0, e = configVals.size(); i != e; ++i) { 2857b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek StringRef key, val; 286651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::tie(key, val) = configVals[i].split("="); 2877b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek if (val.empty()) { 2887b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek Diags.Report(SourceLocation(), 2897b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek diag::err_analyzer_config_no_value) << configVals[i]; 2907b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek Success = false; 2917b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek break; 2927b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek } 293318cc3c07eaca04d319be841e9e3bac35d1ff9f5Ted Kremenek if (val.find('=') != StringRef::npos) { 2947b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek Diags.Report(SourceLocation(), 2957b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek diag::err_analyzer_config_multiple_values) 2967b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek << configVals[i]; 2977b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek Success = false; 2987b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek break; 2997b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek } 3007b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek Opts.Config[key] = val; 3017b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek } 3027b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek } 3038fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith 3048fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith return Success; 30556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar} 30656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 307b5c6babd3d8e0233b8ea5a4eb1e2700e30c0d396Fariborz Jahanianstatic bool ParseMigratorArgs(MigratorOptions &Opts, ArgList &Args) { 308b5c6babd3d8e0233b8ea5a4eb1e2700e30c0d396Fariborz Jahanian Opts.NoNSAllocReallocError = Args.hasArg(OPT_migrator_no_nsalloc_error); 309bbdfad581fa300fa0d162d968ec14de3c95fc760Fariborz Jahanian Opts.NoFinalizeRemoval = Args.hasArg(OPT_migrator_no_finalize_removal); 310b5c6babd3d8e0233b8ea5a4eb1e2700e30c0d396Fariborz Jahanian return true; 311b5c6babd3d8e0233b8ea5a4eb1e2700e30c0d396Fariborz Jahanian} 312b5c6babd3d8e0233b8ea5a4eb1e2700e30c0d396Fariborz Jahanian 3136ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenkostatic void ParseCommentArgs(CommentOptions &Opts, ArgList &Args) { 3146ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko Opts.BlockCommandNames = Args.getAllArgValues(OPT_fcomment_block_commands); 3156fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko Opts.ParseAllComments = Args.hasArg(OPT_fparse_all_comments); 3166ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko} 3176ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko 3186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic StringRef getCodeModel(ArgList &Args, DiagnosticsEngine &Diags) { 3196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Arg *A = Args.getLastArg(OPT_mcode_model)) { 3206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines StringRef Value = A->getValue(); 3216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Value == "small" || Value == "kernel" || Value == "medium" || 3226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Value == "large") 3236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Value; 3246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Value; 3256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 3266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return "default"; 3276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 3286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 329c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \brief Create a new Regex instance out of the string value in \p RpassArg. 330c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// It returns a pointer to the newly generated Regex instance. 331c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstatic std::shared_ptr<llvm::Regex> 332c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesGenerateOptimizationRemarkRegex(DiagnosticsEngine &Diags, ArgList &Args, 333c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Arg *RpassArg) { 334c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines StringRef Val = RpassArg->getValue(); 335c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines std::string RegexError; 336c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines std::shared_ptr<llvm::Regex> Pattern = std::make_shared<llvm::Regex>(Val); 337c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (!Pattern->isValid(RegexError)) { 338c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Diags.Report(diag::err_drv_optimization_remark_pattern) 339c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines << RegexError << RpassArg->getAsString(Args); 340c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Pattern.reset(); 341c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 342c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return Pattern; 343c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} 344c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 345b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarstatic bool parseDiagnosticLevelMask(StringRef FlagName, 346b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar const std::vector<std::string> &Levels, 347b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DiagnosticsEngine *Diags, 348b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DiagnosticLevelMask &M) { 349b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar bool Success = true; 350b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const auto &Level : Levels) { 351b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DiagnosticLevelMask const PM = 352b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::StringSwitch<DiagnosticLevelMask>(Level) 353b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar .Case("note", DiagnosticLevelMask::Note) 354b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar .Case("remark", DiagnosticLevelMask::Remark) 355b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar .Case("warning", DiagnosticLevelMask::Warning) 356b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar .Case("error", DiagnosticLevelMask::Error) 357b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar .Default(DiagnosticLevelMask::None); 358b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (PM == DiagnosticLevelMask::None) { 359b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Success = false; 360b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (Diags) 361b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Diags->Report(diag::err_drv_invalid_value) << FlagName << Level; 362b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 363b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar M = M | PM; 364b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 365b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return Success; 366b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 367b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 3680e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic void parseSanitizerKinds(StringRef FlagName, 3690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines const std::vector<std::string> &Sanitizers, 3700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DiagnosticsEngine &Diags, SanitizerSet &S) { 3710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines for (const auto &Sanitizer : Sanitizers) { 372b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SanitizerMask K = parseSanitizerValue(Sanitizer, /*AllowGroups=*/false); 373b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (K == 0) 3740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Diags.Report(diag::err_drv_invalid_value) << FlagName << Sanitizer; 3750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines else 3760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines S.set(K, true); 3770e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 3780e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 3790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 3804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Set the profile kind for fprofile-instrument. 3814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic void setPGOInstrumentor(CodeGenOptions &Opts, ArgList &Args, 3824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DiagnosticsEngine &Diags) { 3834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Arg *A = Args.getLastArg(OPT_fprofile_instrument_EQ); 3844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (A == nullptr) 3854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 3864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StringRef S = A->getValue(); 3874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned I = llvm::StringSwitch<unsigned>(S) 3884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("none", CodeGenOptions::ProfileNone) 3894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("clang", CodeGenOptions::ProfileClangInstr) 3904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("llvm", CodeGenOptions::ProfileIRInstr) 3914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Default(~0U); 3924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (I == ~0U) { 3934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Diags.Report(diag::err_drv_invalid_pgo_instrumentor) << A->getAsString(Args) 3944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar << S; 3954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 3964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 3974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CodeGenOptions::ProfileInstrKind Instrumentor = 3984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar static_cast<CodeGenOptions::ProfileInstrKind>(I); 3994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.setProfileInstr(Instrumentor); 4004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 4014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 4024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Set the profile kind using fprofile-instrument-use-path. 4034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic void setPGOUseInstrumentor(CodeGenOptions &Opts, 4044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const Twine &ProfileName) { 4054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar auto ReaderOrErr = llvm::IndexedInstrProfReader::create(ProfileName); 4064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // In error, return silently and let Clang PGOUse report the error message. 4074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (auto E = ReaderOrErr.takeError()) { 4084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::consumeError(std::move(E)); 4094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.setProfileUse(CodeGenOptions::ProfileClangInstr); 4104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 4114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 4124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar std::unique_ptr<llvm::IndexedInstrProfReader> PGOReader = 4134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar std::move(ReaderOrErr.get()); 4144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (PGOReader->isIRLevelProfile()) 4154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.setProfileUse(CodeGenOptions::ProfileIRInstr); 4164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else 4174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.setProfileUse(CodeGenOptions::ProfileClangInstr); 4184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 4194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 4208fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmithstatic bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, 421651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DiagnosticsEngine &Diags, 422651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const TargetOptions &TargetOpts) { 423bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy using namespace options; 4248fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith bool Success = true; 42587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::Triple Triple = llvm::Triple(TargetOpts.Triple); 4260a3c03cb1fbc1f84f851d6ad642d22b978b031fdPeter Collingbourne 4270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines unsigned OptimizationLevel = getOptimizationLevel(Args, IK, Diags); 428762e567ee54171662111534108aebf8f1c0b303cSylvestre Ledru // TODO: This could be done in Driver 429762e567ee54171662111534108aebf8f1c0b303cSylvestre Ledru unsigned MaxOptLevel = 3; 4300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (OptimizationLevel > MaxOptLevel) { 4310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // If the optimization level is not supported, fall back on the default 4320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // optimization 433762e567ee54171662111534108aebf8f1c0b303cSylvestre Ledru Diags.Report(diag::warn_drv_optimization_value) 434762e567ee54171662111534108aebf8f1c0b303cSylvestre Ledru << Args.getLastArg(OPT_O)->getAsString(Args) << "-O" << MaxOptLevel; 4350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines OptimizationLevel = MaxOptLevel; 43656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar } 4370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.OptimizationLevel = OptimizationLevel; 43856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 43956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar // We must always run at least the always inlining pass. 4404cdad3151bfb2075c6bdbfe89fbb08f31a90a45bDouglas Gregor Opts.setInlining( 4414cdad3151bfb2075c6bdbfe89fbb08f31a90a45bDouglas Gregor (Opts.OptimizationLevel > 1) ? CodeGenOptions::NormalInlining 4424cdad3151bfb2075c6bdbfe89fbb08f31a90a45bDouglas Gregor : CodeGenOptions::OnlyAlwaysInlining); 443634a4b1b045b13e7ddfa57934cf2b85d4348f77fChad Rosier // -fno-inline-functions overrides OptimizationLevel > 1. 444fc055f943d154c9b7463f43a3b59e093723362c9Chad Rosier Opts.NoInline = Args.hasArg(OPT_fno_inline); 4454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Arg* InlineArg = Args.getLastArg(options::OPT_finline_functions, 4464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar options::OPT_finline_hint_functions, 4474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar options::OPT_fno_inline_functions)) { 4484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const Option& InlineOpt = InlineArg->getOption(); 4494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (InlineOpt.matches(options::OPT_finline_functions)) 4504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.setInlining(CodeGenOptions::NormalInlining); 4514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else if (InlineOpt.matches(options::OPT_finline_hint_functions)) 4524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.setInlining(CodeGenOptions::OnlyHintInlining); 4534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else 4544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.setInlining(CodeGenOptions::OnlyAlwaysInlining); 4554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 45656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 4573ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (Arg *A = Args.getLastArg(OPT_fveclib)) { 4583ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar StringRef Name = A->getValue(); 4593ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (Name == "Accelerate") 4603ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Opts.setVecLib(CodeGenOptions::Accelerate); 4613ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar else if (Name == "none") 4623ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Opts.setVecLib(CodeGenOptions::NoLibrary); 4633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar else 4643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name; 4653ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 4663ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 46787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Arg *A = Args.getLastArg(OPT_debug_info_kind_EQ)) { 4684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned Val = 4694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::StringSwitch<unsigned>(A->getValue()) 4704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("line-tables-only", codegenoptions::DebugLineTablesOnly) 4714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("limited", codegenoptions::LimitedDebugInfo) 4724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("standalone", codegenoptions::FullDebugInfo) 4734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Default(~0U); 4744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Val == ~0U) 4754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) 4764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar << A->getValue(); 4774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else 4784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.setDebugInfo(static_cast<codegenoptions::DebugInfoKind>(Val)); 4793a70cd6e1cc414856e41ce5509aa61c89bf472dcAlexey Samsonov } 48087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Arg *A = Args.getLastArg(OPT_debugger_tuning_EQ)) { 4814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned Val = llvm::StringSwitch<unsigned>(A->getValue()) 4824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("gdb", unsigned(llvm::DebuggerKind::GDB)) 4834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("lldb", unsigned(llvm::DebuggerKind::LLDB)) 4844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("sce", unsigned(llvm::DebuggerKind::SCE)) 4854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Default(~0U); 4864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Val == ~0U) 4874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) 4884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar << A->getValue(); 4894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else 4904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.setDebuggerTuning(static_cast<llvm::DebuggerKind>(Val)); 49187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 49287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.DwarfVersion = getLastArgIntValue(Args, OPT_dwarf_version_EQ, 0, Diags); 493da3301eec823fe770bfa49a1cb19649506caa698Eric Christopher Opts.DebugColumnInfo = Args.hasArg(OPT_dwarf_column_info); 49487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.EmitCodeView = Args.hasArg(OPT_gcodeview); 4954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.WholeProgramVTables = Args.hasArg(OPT_fwhole_program_vtables); 4964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.LTOVisibilityPublicStd = Args.hasArg(OPT_flto_visibility_public_std); 497ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher Opts.SplitDwarfFile = Args.getLastArgValue(OPT_split_dwarf_file); 49887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.DebugTypeExtRefs = Args.hasArg(OPT_dwarf_ext_refs); 4994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.DebugExplicitImport = Triple.isPS4CPU(); 50087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 50187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ)) 50287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.DebugPrefixMap.insert(StringRef(Arg).split('=')); 5033a70cd6e1cc414856e41ce5509aa61c89bf472dcAlexey Samsonov 50458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (const Arg *A = 50558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar Args.getLastArg(OPT_emit_llvm_uselists, OPT_no_emit_llvm_uselists)) 50658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar Opts.EmitLLVMUseLists = A->getOption().getID() == OPT_emit_llvm_uselists; 50758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 50856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.DisableLLVMOpts = Args.hasArg(OPT_disable_llvm_optzns); 50987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.DisableLLVMPasses = Args.hasArg(OPT_disable_llvm_passes); 51056ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.DisableRedZone = Args.hasArg(OPT_disable_red_zone); 51132096695c76033a6b0b1747c439f7378a11e8312John McCall Opts.ForbidGuardVariables = Args.hasArg(OPT_fforbid_guard_variables); 512e26bdb91b7e3912ffe895b78a446db94471a59ddDaniel Dunbar Opts.UseRegisterSizedBitfieldAccess = Args.hasArg( 513e26bdb91b7e3912ffe895b78a446db94471a59ddDaniel Dunbar OPT_fuse_register_sized_bitfield_access); 514b82e117e4af1062b9f0d1aab89abf4aa804558f1Chad Rosier Opts.RelaxedAliasing = Args.hasArg(OPT_relaxed_aliasing); 51596d6c4596587df59821da10270d2102da4a49b73Manman Ren Opts.StructPathTBAA = !Args.hasArg(OPT_no_struct_path_tbaa); 51603e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Opts.DwarfDebugFlags = Args.getLastArgValue(OPT_dwarf_debug_flags); 51756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.MergeAllConstants = !Args.hasArg(OPT_fno_merge_all_constants); 51856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.NoCommon = Args.hasArg(OPT_fno_common); 51956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.NoImplicitFloat = Args.hasArg(OPT_no_implicit_float); 52005422365baa8e603237f865e0de52f73f8b77235Chad Rosier Opts.OptimizeSize = getOptimizationLevelSize(Args); 5216b0cf67ae72a9ebb90e94cc9a14e09364a2b3466Daniel Dunbar Opts.SimplifyLibCalls = !(Args.hasArg(OPT_fno_builtin) || 5226b0cf67ae72a9ebb90e94cc9a14e09364a2b3466Daniel Dunbar Args.hasArg(OPT_ffreestanding)); 5234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Opts.SimplifyLibCalls) 5244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar getAllNoBuiltinFuncValues(Args, Opts.NoBuiltinFuncs); 525b26404a7505dab7ec3a16f6e3b85f95cfd59ba93Chandler Carruth Opts.UnrollLoops = 526b26404a7505dab7ec3a16f6e3b85f95cfd59ba93Chandler Carruth Args.hasFlag(OPT_funroll_loops, OPT_fno_unroll_loops, 5274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar (Opts.OptimizationLevel > 1)); 528ce5b5f13a6c90904040b29b9eb765bb7cd736f0bHal Finkel Opts.RerollLoops = Args.hasArg(OPT_freroll_loops); 52956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 530651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Opts.DisableIntegratedAS = Args.hasArg(OPT_fno_integrated_as); 531f4910132078b4b8852fc46657f3150ed472f4654Daniel Dunbar Opts.Autolink = !Args.hasArg(OPT_fno_autolink); 532b85a9ec6df63f30bbdef9a3975b1d31a680b15c1Diego Novillo Opts.SampleProfileFile = Args.getLastArgValue(OPT_fprofile_sample_use_EQ); 5334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 5344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar setPGOInstrumentor(Opts, Args, Diags); 5354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.InstrProfileOutput = 5364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Args.getLastArgValue(OPT_fprofile_instrument_path_EQ); 5374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.ProfileInstrumentUsePath = 5384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Args.getLastArgValue(OPT_fprofile_instrument_use_path_EQ); 5394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!Opts.ProfileInstrumentUsePath.empty()) 5404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar setPGOUseInstrumentor(Opts, Opts.ProfileInstrumentUsePath); 5414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 54287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.CoverageMapping = 54387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Args.hasFlag(OPT_fcoverage_mapping, OPT_fno_coverage_mapping, false); 544176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Opts.DumpCoverageMapping = Args.hasArg(OPT_dump_coverage_mapping); 54556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.AsmVerbose = Args.hasArg(OPT_masm_verbose); 5464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new); 547f85e193739c953358c865005855253af4f68a497John McCall Opts.ObjCAutoRefCountExceptions = Args.hasArg(OPT_fobjc_arc_exceptions); 548efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar Opts.CXAAtExit = !Args.hasArg(OPT_fno_use_cxa_atexit); 549efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar Opts.CXXCtorDtorAliases = Args.hasArg(OPT_mconstructor_aliases); 5506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Opts.CodeModel = getCodeModel(Args, Diags); 55103e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Opts.DebugPass = Args.getLastArgValue(OPT_mdebug_pass); 55287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.DisableFPElim = 55387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar (Args.hasArg(OPT_mdisable_fp_elim) || Args.hasArg(OPT_pg)); 55473b8d4bdd68372bff9eddc5a02675ee345a8a94fNick Lewycky Opts.DisableFree = Args.hasArg(OPT_disable_free); 5554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.DiscardValueNames = Args.hasArg(OPT_discard_value_names); 5561db772bd68502e0dabbd8efeb7f7c64a4ab2e37aNick Lewycky Opts.DisableTailCalls = Args.hasArg(OPT_mdisable_tail_calls); 55703e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Opts.FloatABI = Args.getLastArgValue(OPT_mfloat_abi); 5584400cb8c548a90c472444b57690117563f4be195Peter Collingbourne Opts.LessPreciseFPMAD = Args.hasArg(OPT_cl_mad_enable); 55903e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Opts.LimitFloatPrecision = Args.getLastArgValue(OPT_mlimit_float_precision); 560001f628a693960380e37c2b58a1009da77d7e425Daniel Dunbar Opts.NoInfsFPMath = (Args.hasArg(OPT_menable_no_infinities) || 5610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Args.hasArg(OPT_cl_finite_math_only) || 562001f628a693960380e37c2b58a1009da77d7e425Daniel Dunbar Args.hasArg(OPT_cl_fast_relaxed_math)); 563001f628a693960380e37c2b58a1009da77d7e425Daniel Dunbar Opts.NoNaNsFPMath = (Args.hasArg(OPT_menable_no_nans) || 5640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Args.hasArg(OPT_cl_unsafe_math_optimizations) || 5650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Args.hasArg(OPT_cl_finite_math_only) || 566001f628a693960380e37c2b58a1009da77d7e425Daniel Dunbar Args.hasArg(OPT_cl_fast_relaxed_math)); 5674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.NoSignedZeros = (Args.hasArg(OPT_fno_signed_zeros) || 5684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Args.hasArg(OPT_cl_no_signed_zeros)); 56958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar Opts.ReciprocalMath = Args.hasArg(OPT_freciprocal_math); 57056ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_mno_zero_initialized_in_bss); 5713c66d30d513106bb794990c5e4ba36a31ac19f15Daniel Dunbar Opts.BackendOptions = Args.getAllArgValues(OPT_backend_option); 572b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner Opts.NumRegisterParameters = getLastArgIntValue(Args, OPT_mregparm, 0, Diags); 573c3b9014c7236a15cf467662264b243a22c420312Nick Lewycky Opts.NoExecStack = Args.hasArg(OPT_mno_exec_stack); 574176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Opts.FatalWarnings = Args.hasArg(OPT_massembler_fatal_warnings); 5753105627bd76d6a0cc5ee305c99f4c96519bac9acEric Christopher Opts.EnableSegmentedStacks = Args.hasArg(OPT_split_stacks); 5764ecc9b73b3716775ed4e09091e300796a9a72378Daniel Dunbar Opts.RelaxAll = Args.hasArg(OPT_mrelax_all); 57787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.IncrementalLinkerCompatible = 57887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Args.hasArg(OPT_mincremental_linker_compatible); 5791ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar Opts.OmitLeafFramePointer = Args.hasArg(OPT_momit_leaf_frame_pointer); 580969323239f16589329d091a2b8ef200fcfe7c9e9Daniel Dunbar Opts.SaveTempLabels = Args.hasArg(OPT_msave_temp_labels); 581ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky Opts.NoDwarfDirectoryAsm = Args.hasArg(OPT_fno_dwarf_directory_asm); 58256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.SoftFloat = Args.hasArg(OPT_msoft_float); 58382fe6aea407a5a09a6131452ce622087ba83880dChandler Carruth Opts.StrictEnums = Args.hasArg(OPT_fstrict_enums); 58487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.StrictVTablePointers = Args.hasArg(OPT_fstrict_vtable_pointers); 585abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth Opts.UnsafeFPMath = Args.hasArg(OPT_menable_unsafe_fp_math) || 586abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth Args.hasArg(OPT_cl_unsafe_math_optimizations) || 587f0840820b4e28fd0cc04d737382811d7372cb832Peter Collingbourne Args.hasArg(OPT_cl_fast_relaxed_math); 58856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.UnwindTables = Args.hasArg(OPT_munwind_tables); 58903e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Opts.RelocationModel = Args.getLastArgValue(OPT_mrelocation_model, "pic"); 590176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Opts.ThreadModel = Args.getLastArgValue(OPT_mthread_model, "posix"); 591176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Opts.ThreadModel != "posix" && Opts.ThreadModel != "single") 592176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diags.Report(diag::err_drv_invalid_value) 593176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines << Args.getLastArg(OPT_mthread_model)->getAsString(Args) 594176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines << Opts.ThreadModel; 59571fd6cc843719cab528a5df0899ad3d15cb9297fBob Wilson Opts.TrapFuncName = Args.getLastArgValue(OPT_ftrap_function_EQ); 5968af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola Opts.UseInitArray = Args.hasArg(OPT_fuse_init_array); 59756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 598ff05979144fc199e229aaeb1d248867d87d0d866Nick Lewycky Opts.FunctionSections = Args.hasFlag(OPT_ffunction_sections, 599ff05979144fc199e229aaeb1d248867d87d0d866Nick Lewycky OPT_fno_function_sections, false); 600ff05979144fc199e229aaeb1d248867d87d0d866Nick Lewycky Opts.DataSections = Args.hasFlag(OPT_fdata_sections, 601ff05979144fc199e229aaeb1d248867d87d0d866Nick Lewycky OPT_fno_data_sections, false); 6020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.UniqueSectionNames = Args.hasFlag(OPT_funique_section_names, 6030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines OPT_fno_unique_section_names, true); 6040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 605176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Opts.MergeFunctions = Args.hasArg(OPT_fmerge_functions); 606bbea7168326d810eff18dfb8bc43c7790fd55010Chris Lattner 6074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.NoUseJumpTables = Args.hasArg(OPT_fno_jump_tables); 6084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 60987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.PrepareForLTO = Args.hasArg(OPT_flto, OPT_flto_EQ); 61087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const Arg *A = Args.getLastArg(OPT_flto, OPT_flto_EQ); 6114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.EmitSummaryIndex = A && A->containsValue("thin"); 61287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Arg *A = Args.getLastArg(OPT_fthinlto_index_EQ)) { 61387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (IK != IK_LLVM_IR) 61487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Diags.Report(diag::err_drv_argument_only_allowed_with) 61587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar << A->getAsString(Args) << "-x ir"; 61687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.ThinLTOIndexFile = Args.getLastArgValue(OPT_fthinlto_index_EQ); 61787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 61887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 6190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.MSVolatile = Args.hasArg(OPT_fms_volatile); 6200e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 621fdf137b9073aa52423183fe886d072bc3b7d3889Nick Lewycky Opts.VectorizeBB = Args.hasArg(OPT_vectorize_slp_aggressive); 622fdf137b9073aa52423183fe886d072bc3b7d3889Nick Lewycky Opts.VectorizeLoop = Args.hasArg(OPT_vectorize_loops); 623fdf137b9073aa52423183fe886d072bc3b7d3889Nick Lewycky Opts.VectorizeSLP = Args.hasArg(OPT_vectorize_slp); 624fdf137b9073aa52423183fe886d072bc3b7d3889Nick Lewycky 62503e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Opts.MainFileName = Args.getLastArgValue(OPT_main_file_name); 626824e19ed926d7aa1296a007d0607ac4437e3c4a9John McCall Opts.VerifyModule = !Args.hasArg(OPT_disable_llvm_verifier); 627f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar 628f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky Opts.DisableGCov = Args.hasArg(OPT_test_coverage); 629e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky Opts.EmitGcovArcs = Args.hasArg(OPT_femit_coverage_data); 630e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky Opts.EmitGcovNotes = Args.hasArg(OPT_femit_coverage_notes); 6310f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky if (Opts.EmitGcovArcs || Opts.EmitGcovNotes) { 632176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Opts.CoverageFile = Args.getLastArgValue(OPT_coverage_file); 6330f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky Opts.CoverageExtraChecksum = Args.hasArg(OPT_coverage_cfg_checksum); 63483c546afef39d6b7be69f3f399804ebf037c4022Nick Lewycky Opts.CoverageNoFunctionNamesInData = 63583c546afef39d6b7be69f3f399804ebf037c4022Nick Lewycky Args.hasArg(OPT_coverage_no_function_names_in_data); 6363ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Opts.CoverageExitBlockBeforeBody = 6373ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Args.hasArg(OPT_coverage_exit_block_before_body); 6380f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky if (Args.hasArg(OPT_coverage_version_EQ)) { 6390f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky StringRef CoverageVersion = Args.getLastArgValue(OPT_coverage_version_EQ); 6400f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky if (CoverageVersion.size() != 4) { 6410f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky Diags.Report(diag::err_drv_invalid_value) 6420f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky << Args.getLastArg(OPT_coverage_version_EQ)->getAsString(Args) 6430f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky << CoverageVersion; 6440f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky } else { 645c3ae583a9a2e0e5c862a94b678c7cdfaab46a981Nick Lewycky memcpy(Opts.CoverageVersion, CoverageVersion.data(), 4); 6460f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky } 6470f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky } 6480f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky } 6494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Handle -fembed-bitcode option. 6504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Arg *A = Args.getLastArg(OPT_fembed_bitcode_EQ)) { 6514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StringRef Name = A->getValue(); 6524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned Model = llvm::StringSwitch<unsigned>(Name) 6534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("off", CodeGenOptions::Embed_Off) 6544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("all", CodeGenOptions::Embed_All) 6554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("bitcode", CodeGenOptions::Embed_Bitcode) 6564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("marker", CodeGenOptions::Embed_Marker) 6574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Default(~0U); 6584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Model == ~0U) { 6594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name; 6604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Success = false; 6614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else 6624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.setEmbedBitcode( 6634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar static_cast<CodeGenOptions::EmbedBitcodeKind>(Model)); 6644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 6654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // FIXME: For backend options that are not yet recorded as function 6664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // attributes in the IR, keep track of them so we can embed them in a 6674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // separate data section and use them when building the bitcode. 6684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Opts.getEmbedBitcode() == CodeGenOptions::Embed_All) { 6694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (const auto &A : Args) { 6704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Do not encode output and input. 6714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (A->getOption().getID() == options::OPT_o || 6724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar A->getOption().getID() == options::OPT_INPUT || 6734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar A->getOption().getID() == options::OPT_x || 6744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar A->getOption().getID() == options::OPT_fembed_bitcode || 6754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar (A->getOption().getGroup().isValid() && 6764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar A->getOption().getGroup().getID() == options::OPT_W_Group)) 6774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar continue; 6784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArgStringList ASL; 6794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar A->render(Args, ASL); 6804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (const auto &arg : ASL) { 6814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StringRef ArgStr(arg); 6824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.CmdArgs.insert(Opts.CmdArgs.end(), ArgStr.begin(), ArgStr.end()); 6834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // using \00 to seperate each commandline options. 6844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.CmdArgs.push_back('\0'); 6854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 6864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 6874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 6880f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky 6890f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky Opts.InstrumentFunctions = Args.hasArg(OPT_finstrument_functions); 6904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.XRayInstrumentFunctions = Args.hasArg(OPT_fxray_instrument); 6914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.XRayInstructionThreshold = 6924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar getLastArgIntValue(Args, OPT_fxray_instruction_threshold_, 200, Diags); 6930f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky Opts.InstrumentForProfiling = Args.hasArg(OPT_pg); 6940f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky Opts.EmitOpenCLArgMetadata = Args.hasArg(OPT_cl_kernel_arg_info); 695651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Opts.CompressDebugSections = Args.hasArg(OPT_compress_debug_sections); 6964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.RelaxELFRelocations = Args.hasArg(OPT_mrelax_relocations); 6977c4fd9121f5885096fd3258d20a984e3f08f8603Nick Lewycky Opts.DebugCompilationDir = Args.getLastArgValue(OPT_fdebug_compilation_dir); 69887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto A : Args.filtered(OPT_mlink_bitcode_file, OPT_mlink_cuda_bitcode)) { 69987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned LinkFlags = llvm::Linker::Flags::None; 70087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (A->getOption().matches(OPT_mlink_cuda_bitcode)) 70187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LinkFlags = llvm::Linker::Flags::LinkOnlyNeeded | 70287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::Linker::Flags::InternalizeLinkedSymbols; 70387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.LinkBitcodeFiles.push_back(std::make_pair(LinkFlags, A->getValue())); 70487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 705b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.SanitizeCoverageType = 706b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar getLastArgIntValue(Args, OPT_fsanitize_coverage_type, 0, Diags); 707b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.SanitizeCoverageIndirectCalls = 708b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Args.hasArg(OPT_fsanitize_coverage_indirect_calls); 709b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.SanitizeCoverageTraceBB = Args.hasArg(OPT_fsanitize_coverage_trace_bb); 710b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.SanitizeCoverageTraceCmp = Args.hasArg(OPT_fsanitize_coverage_trace_cmp); 711b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.SanitizeCoverage8bitCounters = 712b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Args.hasArg(OPT_fsanitize_coverage_8bit_counters); 7134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.SanitizeCoverageTracePC = Args.hasArg(OPT_fsanitize_coverage_trace_pc); 7144bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov Opts.SanitizeMemoryTrackOrigins = 715651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getLastArgIntValue(Args, OPT_fsanitize_memory_track_origins_EQ, 0, Diags); 71687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.SanitizeMemoryUseAfterDtor = 71787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Args.hasArg(OPT_fsanitize_memory_use_after_dtor); 71887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.SanitizeCfiCrossDso = Args.hasArg(OPT_fsanitize_cfi_cross_dso); 7194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.SanitizeStats = Args.hasArg(OPT_fsanitize_stats); 7204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.SanitizeAddressUseAfterScope = 7214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Args.hasArg(OPT_fsanitize_address_use_after_scope); 722a7afeb040416c0eaac19b92db914913a788044f5Chad Rosier Opts.SSPBufferSize = 723b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner getLastArgIntValue(Args, OPT_stack_protector_buffer_size, 8, Diags); 7244e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky Opts.StackRealignment = Args.hasArg(OPT_mstackrealign); 725e9d11dbfe1f3286c5f8a2f2fc8ac759f63890655Joerg Sonnenberger if (Arg *A = Args.getLastArg(OPT_mstack_alignment)) { 7261d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef Val = A->getValue(); 7274cdad3151bfb2075c6bdbfe89fbb08f31a90a45bDouglas Gregor unsigned StackAlignment = Opts.StackAlignment; 7284cdad3151bfb2075c6bdbfe89fbb08f31a90a45bDouglas Gregor Val.getAsInteger(10, StackAlignment); 7294cdad3151bfb2075c6bdbfe89fbb08f31a90a45bDouglas Gregor Opts.StackAlignment = StackAlignment; 730e9d11dbfe1f3286c5f8a2f2fc8ac759f63890655Joerg Sonnenberger } 7317255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner 7320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Arg *A = Args.getLastArg(OPT_mstack_probe_size)) { 7330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines StringRef Val = A->getValue(); 7340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines unsigned StackProbeSize = Opts.StackProbeSize; 7350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Val.getAsInteger(0, StackProbeSize); 7360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.StackProbeSize = StackProbeSize; 7370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 7380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 739f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar if (Arg *A = Args.getLastArg(OPT_fobjc_dispatch_method_EQ)) { 7401d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef Name = A->getValue(); 741f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar unsigned Method = llvm::StringSwitch<unsigned>(Name) 742f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar .Case("legacy", CodeGenOptions::Legacy) 743f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar .Case("non-legacy", CodeGenOptions::NonLegacy) 744f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar .Case("mixed", CodeGenOptions::Mixed) 745f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar .Default(~0U); 7468fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith if (Method == ~0U) { 747f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name; 7488fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith Success = false; 7498fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith } else { 7504cdad3151bfb2075c6bdbfe89fbb08f31a90a45bDouglas Gregor Opts.setObjCDispatchMethod( 7514cdad3151bfb2075c6bdbfe89fbb08f31a90a45bDouglas Gregor static_cast<CodeGenOptions::ObjCDispatchMethodKind>(Method)); 7528fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith } 753f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar } 7548fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith 75587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.EmulatedTLS = 75687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Args.hasFlag(OPT_femulated_tls, OPT_fno_emulated_tls, false); 75787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 758de981f3ff163bc9ec69e4c5e7316e94276412993Hans Wennborg if (Arg *A = Args.getLastArg(OPT_ftlsmodel_EQ)) { 7591d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef Name = A->getValue(); 760de981f3ff163bc9ec69e4c5e7316e94276412993Hans Wennborg unsigned Model = llvm::StringSwitch<unsigned>(Name) 761de981f3ff163bc9ec69e4c5e7316e94276412993Hans Wennborg .Case("global-dynamic", CodeGenOptions::GeneralDynamicTLSModel) 762de981f3ff163bc9ec69e4c5e7316e94276412993Hans Wennborg .Case("local-dynamic", CodeGenOptions::LocalDynamicTLSModel) 763de981f3ff163bc9ec69e4c5e7316e94276412993Hans Wennborg .Case("initial-exec", CodeGenOptions::InitialExecTLSModel) 764de981f3ff163bc9ec69e4c5e7316e94276412993Hans Wennborg .Case("local-exec", CodeGenOptions::LocalExecTLSModel) 765de981f3ff163bc9ec69e4c5e7316e94276412993Hans Wennborg .Default(~0U); 766de981f3ff163bc9ec69e4c5e7316e94276412993Hans Wennborg if (Model == ~0U) { 767de981f3ff163bc9ec69e4c5e7316e94276412993Hans Wennborg Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name; 768de981f3ff163bc9ec69e4c5e7316e94276412993Hans Wennborg Success = false; 769de981f3ff163bc9ec69e4c5e7316e94276412993Hans Wennborg } else { 7704cdad3151bfb2075c6bdbfe89fbb08f31a90a45bDouglas Gregor Opts.setDefaultTLSModel(static_cast<CodeGenOptions::TLSModel>(Model)); 771de981f3ff163bc9ec69e4c5e7316e94276412993Hans Wennborg } 772de981f3ff163bc9ec69e4c5e7316e94276412993Hans Wennborg } 773de981f3ff163bc9ec69e4c5e7316e94276412993Hans Wennborg 774931c0833811c030884fa50b2ccbd3c34f0f4c4eeLang Hames if (Arg *A = Args.getLastArg(OPT_ffp_contract)) { 775931c0833811c030884fa50b2ccbd3c34f0f4c4eeLang Hames StringRef Val = A->getValue(); 776931c0833811c030884fa50b2ccbd3c34f0f4c4eeLang Hames if (Val == "fast") 777931c0833811c030884fa50b2ccbd3c34f0f4c4eeLang Hames Opts.setFPContractMode(CodeGenOptions::FPC_Fast); 778931c0833811c030884fa50b2ccbd3c34f0f4c4eeLang Hames else if (Val == "on") 779931c0833811c030884fa50b2ccbd3c34f0f4c4eeLang Hames Opts.setFPContractMode(CodeGenOptions::FPC_On); 780931c0833811c030884fa50b2ccbd3c34f0f4c4eeLang Hames else if (Val == "off") 781931c0833811c030884fa50b2ccbd3c34f0f4c4eeLang Hames Opts.setFPContractMode(CodeGenOptions::FPC_Off); 782931c0833811c030884fa50b2ccbd3c34f0f4c4eeLang Hames else 783931c0833811c030884fa50b2ccbd3c34f0f4c4eeLang Hames Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val; 784931c0833811c030884fa50b2ccbd3c34f0f4c4eeLang Hames } 785931c0833811c030884fa50b2ccbd3c34f0f4c4eeLang Hames 786b8b52972c72b2ba6fe171c522e5d3d7d69503021John McCall if (Arg *A = Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return)) { 787b8b52972c72b2ba6fe171c522e5d3d7d69503021John McCall if (A->getOption().matches(OPT_fpcc_struct_return)) { 788b8b52972c72b2ba6fe171c522e5d3d7d69503021John McCall Opts.setStructReturnConvention(CodeGenOptions::SRCK_OnStack); 789b8b52972c72b2ba6fe171c522e5d3d7d69503021John McCall } else { 790b8b52972c72b2ba6fe171c522e5d3d7d69503021John McCall assert(A->getOption().matches(OPT_freg_struct_return)); 791b8b52972c72b2ba6fe171c522e5d3d7d69503021John McCall Opts.setStructReturnConvention(CodeGenOptions::SRCK_InRegs); 792b8b52972c72b2ba6fe171c522e5d3d7d69503021John McCall } 793b8b52972c72b2ba6fe171c522e5d3d7d69503021John McCall } 794b8b52972c72b2ba6fe171c522e5d3d7d69503021John McCall 795b3574796d7cc0113e54b6516fc16e17ca09459fbHans Wennborg Opts.DependentLibraries = Args.getAllArgValues(OPT_dependent_lib); 7964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.LinkerOptions = Args.getAllArgValues(OPT_linker_option); 797c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines bool NeedLocTracking = false; 798b3574796d7cc0113e54b6516fc16e17ca09459fbHans Wennborg 7996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Arg *A = Args.getLastArg(OPT_Rpass_EQ)) { 800c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Opts.OptimizationRemarkPattern = 801c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines GenerateOptimizationRemarkRegex(Diags, Args, A); 802c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines NeedLocTracking = true; 803c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 804c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 805c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (Arg *A = Args.getLastArg(OPT_Rpass_missed_EQ)) { 806c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Opts.OptimizationRemarkMissedPattern = 807c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines GenerateOptimizationRemarkRegex(Diags, Args, A); 808c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines NeedLocTracking = true; 8096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 8106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 811c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (Arg *A = Args.getLastArg(OPT_Rpass_analysis_EQ)) { 812c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Opts.OptimizationRemarkAnalysisPattern = 813c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines GenerateOptimizationRemarkRegex(Diags, Args, A); 814c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines NeedLocTracking = true; 815c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 816c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 817176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // If the user requested to use a sample profile for PGO, then the 818176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // backend will need to track source location information so the profile 819176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // can be incorporated into the IR. 820176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!Opts.SampleProfileFile.empty()) 821176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines NeedLocTracking = true; 822176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 823176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // If the user requested a flag that requires source locations available in 824176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // the backend, make sure that the backend tracks source location information. 8254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (NeedLocTracking && Opts.getDebugInfo() == codegenoptions::NoDebugInfo) 8264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.setDebugInfo(codegenoptions::LocTrackingOnly); 827c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 8280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.RewriteMapFiles = Args.getAllArgValues(OPT_frewrite_map_file); 8290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 8300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Parse -fsanitize-recover= arguments. 8310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // FIXME: Report unrecoverable sanitizers incorrectly specified here. 8320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines parseSanitizerKinds("-fsanitize-recover=", 8330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Args.getAllArgValues(OPT_fsanitize_recover_EQ), Diags, 8340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.SanitizeRecover); 83587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar parseSanitizerKinds("-fsanitize-trap=", 83687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Args.getAllArgValues(OPT_fsanitize_trap_EQ), Diags, 83787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.SanitizeTrap); 8380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 839b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.CudaGpuBinaryFileNames = 840b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Args.getAllArgValues(OPT_fcuda_include_gpubinary); 841b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 8424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.Backchain = Args.hasArg(OPT_mbackchain); 8434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 8444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.EmitCheckPathComponentsToStrip = getLastArgIntValue( 8454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Args, OPT_fsanitize_undefined_strip_path_components_EQ, 0, Diags); 8464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 8478fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith return Success; 84856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar} 84956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 85056ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbarstatic void ParseDependencyOutputArgs(DependencyOutputOptions &Opts, 85156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar ArgList &Args) { 852bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy using namespace options; 85303e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Opts.OutputFile = Args.getLastArgValue(OPT_dependency_file); 85403e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Opts.Targets = Args.getAllArgValues(OPT_MT); 85556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.IncludeSystemHeaders = Args.hasArg(OPT_sys_header_deps); 856651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Opts.IncludeModuleFiles = Args.hasArg(OPT_module_file_deps); 85756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.UsePhonyTargets = Args.hasArg(OPT_MP); 858eef63e0997e0f6d6436736ea919b851cfe34955aDaniel Dunbar Opts.ShowHeaderIncludes = Args.hasArg(OPT_H); 859b34d69b9292534c1c574f168f0ac10aea652adcaDaniel Dunbar Opts.HeaderIncludeOutputFile = Args.getLastArgValue(OPT_header_include_file); 860bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne Opts.AddMissingHeaderDeps = Args.hasArg(OPT_MG); 861708002ede3938256a6223d153a0c040f7a40f5ccHans Wennborg Opts.PrintShowIncludes = Args.hasArg(OPT_show_includes); 862773303a505c23d73da624f1e6abcf41a393dad2bDouglas Gregor Opts.DOTOutputFile = Args.getLastArgValue(OPT_dependency_dot); 863c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Opts.ModuleDependencyOutputDir = 864c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Args.getLastArgValue(OPT_module_dependency_dir); 865b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (Args.hasArg(OPT_MV)) 866b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.OutputFormat = DependencyOutputFormat::NMake; 86787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Add sanitizer blacklists as extra dependencies. 86887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // They won't be discovered by the regular preprocessor, so 86987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // we let make / ninja to know about this implicit dependency. 87087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.ExtraDeps = Args.getAllArgValues(OPT_fdepfile_entry); 87187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto ModuleFiles = Args.getAllArgValues(OPT_fmodule_file); 87287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.ExtraDeps.insert(Opts.ExtraDeps.end(), ModuleFiles.begin(), 87387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ModuleFiles.end()); 87456ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar} 87556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 8764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic bool parseShowColorsArgs(const ArgList &Args, bool DefaultColor) { 8774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Color diagnostics default to auto ("on" if terminal supports) in the driver 8784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // but default to off in cc1, needing an explicit OPT_fdiagnostics_color. 8794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Support both clang's -f[no-]color-diagnostics and gcc's 8804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // -f[no-]diagnostics-colors[=never|always|auto]. 8814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar enum { 8824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Colors_On, 8834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Colors_Off, 8844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Colors_Auto 8854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } ShowColors = DefaultColor ? Colors_Auto : Colors_Off; 8864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (Arg *A : Args) { 8874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const Option &O = A->getOption(); 8884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!O.matches(options::OPT_fcolor_diagnostics) && 8894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar !O.matches(options::OPT_fdiagnostics_color) && 8904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar !O.matches(options::OPT_fno_color_diagnostics) && 8914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar !O.matches(options::OPT_fno_diagnostics_color) && 8924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar !O.matches(options::OPT_fdiagnostics_color_EQ)) 8934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar continue; 8944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 8954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (O.matches(options::OPT_fcolor_diagnostics) || 8964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar O.matches(options::OPT_fdiagnostics_color)) { 8974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ShowColors = Colors_On; 8984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else if (O.matches(options::OPT_fno_color_diagnostics) || 8994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar O.matches(options::OPT_fno_diagnostics_color)) { 9004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ShowColors = Colors_Off; 9014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else { 9024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(O.matches(options::OPT_fdiagnostics_color_EQ)); 9034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StringRef Value(A->getValue()); 9044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Value == "always") 9054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ShowColors = Colors_On; 9064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else if (Value == "never") 9074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ShowColors = Colors_Off; 9084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else if (Value == "auto") 9094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ShowColors = Colors_Auto; 9104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 9114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 9124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ShowColors == Colors_On || 9134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors())) 9144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return true; 9154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return false; 9164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 9174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 9182dec85b21822f950bf6035640c496ad835e11728Chad Rosierbool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args, 9194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DiagnosticsEngine *Diags, 9204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool DefaultDiagColor) { 921bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy using namespace options; 9228fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith bool Success = true; 9238fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith 92408c6695f6018fb6cb1a7c7d311a851aa5c233bc0Daniel Dunbar Opts.DiagnosticLogFile = Args.getLastArgValue(OPT_diagnostic_log_file); 925176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Arg *A = 926176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Args.getLastArg(OPT_diagnostic_serialized_file, OPT__serialize_diags)) 927176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Opts.DiagnosticSerializationFile = A->getValue(); 92856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.IgnoreWarnings = Args.hasArg(OPT_w); 92956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.NoRewriteMacros = Args.hasArg(OPT_Wno_rewrite_macros); 93056ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.Pedantic = Args.hasArg(OPT_pedantic); 93156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.PedanticErrors = Args.hasArg(OPT_pedantic_errors); 93256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ShowCarets = !Args.hasArg(OPT_fno_caret_diagnostics); 9334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.ShowColors = parseShowColorsArgs(Args, DefaultDiagColor); 934c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor Opts.ShowColumn = Args.hasFlag(OPT_fshow_column, 935c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor OPT_fno_show_column, 936c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor /*Default=*/true); 93756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ShowFixits = !Args.hasArg(OPT_fno_diagnostics_fixit_info); 93856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ShowLocation = !Args.hasArg(OPT_fno_show_source_location); 93956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ShowOptionNames = Args.hasArg(OPT_fdiagnostics_show_option); 9405edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin 9412956ef43da9c0e7bce8fae4a015255a2c19458bbNico Rieck llvm::sys::Process::UseANSIEscapeCodes(Args.hasArg(OPT_fansi_escape_codes)); 9422956ef43da9c0e7bce8fae4a015255a2c19458bbNico Rieck 94334b8e6889a12c90e8053fba8a1ea49b17c05ac51Chandler Carruth // Default behavior is to not to show note include stacks. 94434b8e6889a12c90e8053fba8a1ea49b17c05ac51Chandler Carruth Opts.ShowNoteIncludeStack = false; 945abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth if (Arg *A = Args.getLastArg(OPT_fdiagnostics_show_note_include_stack, 946abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth OPT_fno_diagnostics_show_note_include_stack)) 94734b8e6889a12c90e8053fba8a1ea49b17c05ac51Chandler Carruth if (A->getOption().matches(OPT_fdiagnostics_show_note_include_stack)) 94834b8e6889a12c90e8053fba8a1ea49b17c05ac51Chandler Carruth Opts.ShowNoteIncludeStack = true; 949abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth 9505f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef ShowOverloads = 9515edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin Args.getLastArgValue(OPT_fshow_overloads_EQ, "all"); 9525edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin if (ShowOverloads == "best") 953dc7b641574a733624489bd87fc7061771edf2113Douglas Gregor Opts.setShowOverloads(Ovl_Best); 9545edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin else if (ShowOverloads == "all") 955dc7b641574a733624489bd87fc7061771edf2113Douglas Gregor Opts.setShowOverloads(Ovl_All); 9568fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith else { 9572dec85b21822f950bf6035640c496ad835e11728Chad Rosier Success = false; 9582dec85b21822f950bf6035640c496ad835e11728Chad Rosier if (Diags) 9592dec85b21822f950bf6035640c496ad835e11728Chad Rosier Diags->Report(diag::err_drv_invalid_value) 9605edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin << Args.getLastArg(OPT_fshow_overloads_EQ)->getAsString(Args) 9615edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin << ShowOverloads; 9628fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith } 9635edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin 9645f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef ShowCategory = 96503e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Args.getLastArgValue(OPT_fdiagnostics_show_category, "none"); 9666fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner if (ShowCategory == "none") 9676fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner Opts.ShowCategories = 0; 9686fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner else if (ShowCategory == "id") 9696fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner Opts.ShowCategories = 1; 9706fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner else if (ShowCategory == "name") 9716fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner Opts.ShowCategories = 2; 9728fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith else { 9732dec85b21822f950bf6035640c496ad835e11728Chad Rosier Success = false; 9742dec85b21822f950bf6035640c496ad835e11728Chad Rosier if (Diags) 9752dec85b21822f950bf6035640c496ad835e11728Chad Rosier Diags->Report(diag::err_drv_invalid_value) 9766fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner << Args.getLastArg(OPT_fdiagnostics_show_category)->getAsString(Args) 9776fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner << ShowCategory; 9788fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith } 97920249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 9805f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Format = 981c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor Args.getLastArgValue(OPT_fdiagnostics_format, "clang"); 982c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor if (Format == "clang") 983dc7b641574a733624489bd87fc7061771edf2113Douglas Gregor Opts.setFormat(DiagnosticOptions::Clang); 9848fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith else if (Format == "msvc") 9850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.setFormat(DiagnosticOptions::MSVC); 98689e32745123c02159fa1d1f19f96bdd4173029f0Hans Wennborg else if (Format == "msvc-fallback") { 9870e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.setFormat(DiagnosticOptions::MSVC); 98889e32745123c02159fa1d1f19f96bdd4173029f0Hans Wennborg Opts.CLFallbackMode = true; 98989e32745123c02159fa1d1f19f96bdd4173029f0Hans Wennborg } else if (Format == "vi") 990dc7b641574a733624489bd87fc7061771edf2113Douglas Gregor Opts.setFormat(DiagnosticOptions::Vi); 9918fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith else { 9922dec85b21822f950bf6035640c496ad835e11728Chad Rosier Success = false; 9932dec85b21822f950bf6035640c496ad835e11728Chad Rosier if (Diags) 9942dec85b21822f950bf6035640c496ad835e11728Chad Rosier Diags->Report(diag::err_drv_invalid_value) 995c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor << Args.getLastArg(OPT_fdiagnostics_format)->getAsString(Args) 996c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor << Format; 9978fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith } 998b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 99956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ShowSourceRanges = Args.hasArg(OPT_fdiagnostics_print_source_range_info); 10004786c15f4977c7cee98fde3ebdee213dba23848bDouglas Gregor Opts.ShowParseableFixits = Args.hasArg(OPT_fdiagnostics_parseable_fixits); 100162221b17c90457df9ca0ff20bb54d634e8951defRichard Smith Opts.ShowPresumedLoc = !Args.hasArg(OPT_fno_diagnostics_use_presumed_location); 100256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.VerifyDiagnostics = Args.hasArg(OPT_verify); 1003b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DiagnosticLevelMask DiagMask = DiagnosticLevelMask::None; 1004b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Success &= parseDiagnosticLevelMask("-verify-ignore-unexpected=", 1005b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ), 1006b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Diags, DiagMask); 1007b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (Args.hasArg(OPT_verify_ignore_unexpected)) 1008b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DiagMask = DiagnosticLevelMask::All; 1009b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.setVerifyIgnoreUnexpected(DiagMask); 1010246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu Opts.ElideType = !Args.hasArg(OPT_fno_elide_type); 1011246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu Opts.ShowTemplateTree = Args.hasArg(OPT_fdiagnostics_show_template_tree); 1012b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner Opts.ErrorLimit = getLastArgIntValue(Args, OPT_ferror_limit, 0, Diags); 1013b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner Opts.MacroBacktraceLimit = 1014b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner getLastArgIntValue(Args, OPT_fmacro_backtrace_limit, 10156c1cb9916e9988dcdd65b9266dbe24afd173427aDouglas Gregor DiagnosticOptions::DefaultMacroBacktraceLimit, Diags); 1016b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner Opts.TemplateBacktraceLimit = getLastArgIntValue( 1017b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner Args, OPT_ftemplate_backtrace_limit, 1018b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner DiagnosticOptions::DefaultTemplateBacktraceLimit, Diags); 1019b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner Opts.ConstexprBacktraceLimit = getLastArgIntValue( 1020b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner Args, OPT_fconstexpr_backtrace_limit, 1021b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner DiagnosticOptions::DefaultConstexprBacktraceLimit, Diags); 10220e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.SpellCheckingLimit = getLastArgIntValue( 10230e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Args, OPT_fspell_checking_limit, 10240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DiagnosticOptions::DefaultSpellCheckingLimit, Diags); 1025b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner Opts.TabStop = getLastArgIntValue(Args, OPT_ftabstop, 102652388f9aefba585475a38081272ce582d033c883Chris Lattner DiagnosticOptions::DefaultTabStop, Diags); 102752388f9aefba585475a38081272ce582d033c883Chris Lattner if (Opts.TabStop == 0 || Opts.TabStop > DiagnosticOptions::MaxTabStop) { 102852388f9aefba585475a38081272ce582d033c883Chris Lattner Opts.TabStop = DiagnosticOptions::DefaultTabStop; 10292dec85b21822f950bf6035640c496ad835e11728Chad Rosier if (Diags) 10302dec85b21822f950bf6035640c496ad835e11728Chad Rosier Diags->Report(diag::warn_ignoring_ftabstop_value) 10312dec85b21822f950bf6035640c496ad835e11728Chad Rosier << Opts.TabStop << DiagnosticOptions::DefaultTabStop; 103252388f9aefba585475a38081272ce582d033c883Chris Lattner } 1033b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner Opts.MessageLength = getLastArgIntValue(Args, OPT_fmessage_length, 0, Diags); 1034176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines addDiagnosticArgs(Args, OPT_W_Group, OPT_W_value_Group, Opts.Warnings); 1035176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines addDiagnosticArgs(Args, OPT_R_Group, OPT_R_value_Group, Opts.Remarks); 10368fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith 10378fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith return Success; 103856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar} 103956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 1040389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidisstatic void ParseFileSystemArgs(FileSystemOptions &Opts, ArgList &Args) { 1041389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis Opts.WorkingDir = Args.getLastArgValue(OPT_working_directory); 1042389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis} 1043389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis 104487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// Parse the argument to the -ftest-module-file-extension 104587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// command-line argument. 104687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// 104787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \returns true on error, false on success. 104887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic bool parseTestModuleFileExtensionArg(StringRef Arg, 104987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::string &BlockName, 105087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned &MajorVersion, 105187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned &MinorVersion, 105287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool &Hashed, 105387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::string &UserInfo) { 105487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SmallVector<StringRef, 5> Args; 105587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Arg.split(Args, ':', 5); 105687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Args.size() < 5) 105787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return true; 105887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 105987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar BlockName = Args[0]; 106087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Args[1].getAsInteger(10, MajorVersion)) return true; 106187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Args[2].getAsInteger(10, MinorVersion)) return true; 106287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Args[3].getAsInteger(2, Hashed)) return true; 106387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Args.size() > 4) 106487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar UserInfo = Args[4]; 106587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return false; 106687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 106787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 1068c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbarstatic InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args, 1069d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine &Diags) { 1070bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy using namespace options; 107156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::ParseSyntaxOnly; 107256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar if (const Arg *A = Args.getLastArg(OPT_Action_Group)) { 107356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar switch (A->getOption().getID()) { 107456ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar default: 1075b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Invalid option in group!"); 1076171af64ef10ae816ed2a4f15f5d17aca1d71769fAlexander Kornienko case OPT_ast_list: 1077171af64ef10ae816ed2a4f15f5d17aca1d71769fAlexander Kornienko Opts.ProgramAction = frontend::ASTDeclList; break; 107856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar case OPT_ast_dump: 1079176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case OPT_ast_dump_lookups: 108056ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::ASTDump; break; 108156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar case OPT_ast_print: 108256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::ASTPrint; break; 108356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar case OPT_ast_view: 108456ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::ASTView; break; 108556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar case OPT_dump_raw_tokens: 108656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::DumpRawTokens; break; 108756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar case OPT_dump_tokens: 108856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::DumpTokens; break; 108956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar case OPT_S: 109056ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::EmitAssembly; break; 109156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar case OPT_emit_llvm_bc: 109256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::EmitBC; break; 109356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar case OPT_emit_html: 109456ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::EmitHTML; break; 109556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar case OPT_emit_llvm: 109656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::EmitLLVM; break; 109756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar case OPT_emit_llvm_only: 109856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::EmitLLVMOnly; break; 109932148cef25570a4fbe3ad0ec497ce3ae2cf1b774Daniel Dunbar case OPT_emit_codegen_only: 110032148cef25570a4fbe3ad0ec497ce3ae2cf1b774Daniel Dunbar Opts.ProgramAction = frontend::EmitCodeGenOnly; break; 1101da1573f95902a42aa4d11e8f45ab98ec7e27bc28Daniel Dunbar case OPT_emit_obj: 1102da1573f95902a42aa4d11e8f45ab98ec7e27bc28Daniel Dunbar Opts.ProgramAction = frontend::EmitObj; break; 1103ba5f6eced29937e4e4851a2c0980744768413d66Nick Lewycky case OPT_fixit_EQ: 11041d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith Opts.FixItSuffix = A->getValue(); 1105ba5f6eced29937e4e4851a2c0980744768413d66Nick Lewycky // fall-through! 110656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar case OPT_fixit: 110756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::FixIt; break; 1108467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor case OPT_emit_module: 1109467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor Opts.ProgramAction = frontend::GenerateModule; break; 111056ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar case OPT_emit_pch: 111156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::GeneratePCH; break; 111256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar case OPT_emit_pth: 111356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::GeneratePTH; break; 11142758595023c5c7c0495f19260089f975022c50dcDaniel Dunbar case OPT_init_only: 11152758595023c5c7c0495f19260089f975022c50dcDaniel Dunbar Opts.ProgramAction = frontend::InitOnly; break; 111656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar case OPT_fsyntax_only: 111756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::ParseSyntaxOnly; break; 1118c544ba09695e300f31355af342258bd57619e737Douglas Gregor case OPT_module_file_info: 1119c544ba09695e300f31355af342258bd57619e737Douglas Gregor Opts.ProgramAction = frontend::ModuleFileInfo; break; 1120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case OPT_verify_pch: 1121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Opts.ProgramAction = frontend::VerifyPCH; break; 112256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar case OPT_print_decl_contexts: 112356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::PrintDeclContext; break; 1124f033f1da4a34f8df6e95e9929dc04ff54bb8fb01Douglas Gregor case OPT_print_preamble: 1125f033f1da4a34f8df6e95e9929dc04ff54bb8fb01Douglas Gregor Opts.ProgramAction = frontend::PrintPreamble; break; 112656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar case OPT_E: 112756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::PrintPreprocessedInput; break; 112856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar case OPT_rewrite_macros: 112956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::RewriteMacros; break; 113056ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar case OPT_rewrite_objc: 113156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::RewriteObjC; break; 113256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar case OPT_rewrite_test: 113356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::RewriteTest; break; 113456ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar case OPT_analyze: 113556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::RunAnalysis; break; 113630660a898545416f0fea2d717f16f75640001e38Ted Kremenek case OPT_migrate: 113730660a898545416f0fea2d717f16f75640001e38Ted Kremenek Opts.ProgramAction = frontend::MigrateSource; break; 113856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar case OPT_Eonly: 113956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::RunPreprocessorOnly; break; 114056ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar } 114156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar } 11423177aae51a21f61ab483c52f97124bdb707da7f1Daniel Dunbar 11433177aae51a21f61ab483c52f97124bdb707da7f1Daniel Dunbar if (const Arg* A = Args.getLastArg(OPT_plugin)) { 1144b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.Plugins.emplace_back(A->getValue(0)); 114556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ProgramAction = frontend::PluginAction; 11461d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith Opts.ActionName = A->getValue(); 114756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar } 11485aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber Opts.AddPluginActions = Args.getAllArgValues(OPT_add_plugin); 11494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (const Arg *AA : Args.filtered(OPT_plugin_arg)) 11504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.PluginArgs[AA->getValue(0)].emplace_back(AA->getValue(1)); 11515aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber 115287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const std::string &Arg : 115387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Args.getAllArgValues(OPT_ftest_module_file_extension_EQ)) { 115487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::string BlockName; 115587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned MajorVersion; 115687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned MinorVersion; 115787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool Hashed; 115887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::string UserInfo; 115987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (parseTestModuleFileExtensionArg(Arg, BlockName, MajorVersion, 116087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar MinorVersion, Hashed, UserInfo)) { 116187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Diags.Report(diag::err_test_module_file_extension_format) << Arg; 116287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 116387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar continue; 116487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 116587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 116687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Add the testing module file extension. 116787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.ModuleFileExtensions.push_back( 116887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar new TestModuleFileExtension(BlockName, MajorVersion, MinorVersion, 116987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Hashed, UserInfo)); 117087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 117187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 117256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar if (const Arg *A = Args.getLastArg(OPT_code_completion_at)) { 117356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.CodeCompletionAt = 11741d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith ParsedSourceLocation::FromString(A->getValue()); 117556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar if (Opts.CodeCompletionAt.FileName.empty()) 117656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Diags.Report(diag::err_drv_invalid_value) 11771d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith << A->getAsString(Args) << A->getValue(); 117856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar } 117956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.DisableFree = Args.hasArg(OPT_disable_free); 118056ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 118103e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Opts.OutputFile = Args.getLastArgValue(OPT_o); 118203e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Opts.Plugins = Args.getAllArgValues(OPT_load); 118356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.RelocatablePCH = Args.hasArg(OPT_relocatable_pch); 11849b5e9ae08defd14441acca1d7d4502b933bf6c5aDaniel Dunbar Opts.ShowHelp = Args.hasArg(OPT_help); 118556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ShowStats = Args.hasArg(OPT_print_stats); 118656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ShowTimers = Args.hasArg(OPT_ftime_report); 11879b5e9ae08defd14441acca1d7d4502b933bf6c5aDaniel Dunbar Opts.ShowVersion = Args.hasArg(OPT_version); 118803e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Opts.ASTMergeFiles = Args.getAllArgValues(OPT_ast_merge); 118903e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Opts.LLVMArgs = Args.getAllArgValues(OPT_mllvm); 11901450f265fcc84a7ca64dd9f3b8d4492c5bd55e23Nick Lewycky Opts.FixWhatYouCan = Args.hasArg(OPT_fix_what_you_can); 119161d679ab2831b161c857cf3f974312fbd4ef1efdArgyrios Kyrtzidis Opts.FixOnlyWarnings = Args.hasArg(OPT_fix_only_warnings); 119261d679ab2831b161c857cf3f974312fbd4ef1efdArgyrios Kyrtzidis Opts.FixAndRecompile = Args.hasArg(OPT_fixit_recompile); 119361d679ab2831b161c857cf3f974312fbd4ef1efdArgyrios Kyrtzidis Opts.FixToTemporaries = Args.hasArg(OPT_fixit_to_temp); 1194176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Opts.ASTDumpDecls = Args.hasArg(OPT_ast_dump); 1195e34a052d642ba7830174b1a51787251d7f704f80Alexander Kornienko Opts.ASTDumpFilter = Args.getLastArgValue(OPT_ast_dump_filter); 1196ab297ccbcc51d5197d4ddb4e99b7bc8868d38314Richard Smith Opts.ASTDumpLookups = Args.hasArg(OPT_ast_dump_lookups); 119720c6f2eae500242d3aef5daaa55d440a0786a1fdDouglas Gregor Opts.UseGlobalModuleIndex = !Args.hasArg(OPT_fno_modules_global_index); 1198f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor Opts.GenerateGlobalModuleIndex = Opts.UseGlobalModuleIndex; 11990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.ModuleMapFiles = Args.getAllArgValues(OPT_fmodule_map_file); 1200176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Opts.ModuleFiles = Args.getAllArgValues(OPT_fmodule_file); 120187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.ModulesEmbedFiles = Args.getAllArgValues(OPT_fmodules_embed_file_EQ); 120287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.ModulesEmbedAllFiles = Args.hasArg(OPT_fmodules_embed_all_files); 12034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.IncludeTimestamps = !Args.hasArg(OPT_fno_pch_timestamp); 1204176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1205d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko Opts.CodeCompleteOpts.IncludeMacros 1206d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko = Args.hasArg(OPT_code_completion_macros); 1207d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko Opts.CodeCompleteOpts.IncludeCodePatterns 1208d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko = Args.hasArg(OPT_code_completion_patterns); 1209d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko Opts.CodeCompleteOpts.IncludeGlobals 1210d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko = !Args.hasArg(OPT_no_code_completion_globals); 1211d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko Opts.CodeCompleteOpts.IncludeBriefComments 1212d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko = Args.hasArg(OPT_code_completion_brief_comments); 1213d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko 1214453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor Opts.OverrideRecordLayoutsFile 1215453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor = Args.getLastArgValue(OPT_foverride_record_layout_EQ); 121687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.AuxTriple = 121787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::Triple::normalize(Args.getLastArgValue(OPT_aux_triple)); 12184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.FindPchSource = Args.getLastArgValue(OPT_find_pch_source_EQ); 121987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 12208f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall if (const Arg *A = Args.getLastArg(OPT_arcmt_check, 122169325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis OPT_arcmt_modify, 122269325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis OPT_arcmt_migrate)) { 12238f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall switch (A->getOption().getID()) { 12248f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall default: 12258f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall llvm_unreachable("missed a case"); 12268f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall case OPT_arcmt_check: 12278f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall Opts.ARCMTAction = FrontendOptions::ARCMT_Check; 12288f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall break; 12298f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall case OPT_arcmt_modify: 12308f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall Opts.ARCMTAction = FrontendOptions::ARCMT_Modify; 12318f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall break; 123269325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis case OPT_arcmt_migrate: 123369325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis Opts.ARCMTAction = FrontendOptions::ARCMT_Migrate; 123469325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis break; 12358f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall } 12368f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall } 123730660a898545416f0fea2d717f16f75640001e38Ted Kremenek Opts.MTMigrateDir = Args.getLastArgValue(OPT_mt_migrate_directory); 12387ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis Opts.ARCMTMigrateReportOut 12397ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis = Args.getLastArgValue(OPT_arcmt_migrate_report_output); 12407ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis Opts.ARCMTMigrateEmitARCErrors 12417ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis = Args.hasArg(OPT_arcmt_migrate_emit_arc_errors); 12428f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall 124330660a898545416f0fea2d717f16f75640001e38Ted Kremenek if (Args.hasArg(OPT_objcmt_migrate_literals)) 124430660a898545416f0fea2d717f16f75640001e38Ted Kremenek Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Literals; 124530660a898545416f0fea2d717f16f75640001e38Ted Kremenek if (Args.hasArg(OPT_objcmt_migrate_subscripting)) 124630660a898545416f0fea2d717f16f75640001e38Ted Kremenek Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Subscripting; 1247176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Args.hasArg(OPT_objcmt_migrate_property_dot_syntax)) 1248176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Opts.ObjCMTAction |= FrontendOptions::ObjCMT_PropertyDotSyntax; 1249d412999a3da6387dbfaf00f7647132082e94310eFariborz Jahanian if (Args.hasArg(OPT_objcmt_migrate_property)) 1250d412999a3da6387dbfaf00f7647132082e94310eFariborz Jahanian Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Property; 12515b98aba1d74184923da32016c3abbc20e9a7686dFariborz Jahanian if (Args.hasArg(OPT_objcmt_migrate_readonly_property)) 12525b98aba1d74184923da32016c3abbc20e9a7686dFariborz Jahanian Opts.ObjCMTAction |= FrontendOptions::ObjCMT_ReadonlyProperty; 1253081099d302b79d1746c7a39da14e3265971eb718Fariborz Jahanian if (Args.hasArg(OPT_objcmt_migrate_readwrite_property)) 1254081099d302b79d1746c7a39da14e3265971eb718Fariborz Jahanian Opts.ObjCMTAction |= FrontendOptions::ObjCMT_ReadwriteProperty; 1255a00f8737e671b587e83280a53e85562c00a7a78dFariborz Jahanian if (Args.hasArg(OPT_objcmt_migrate_annotation)) 1256a00f8737e671b587e83280a53e85562c00a7a78dFariborz Jahanian Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Annotation; 1257cd569f2788ece55b9f790b6900164e2b2d5d966cFariborz Jahanian if (Args.hasArg(OPT_objcmt_returns_innerpointer_property)) 1258cd569f2788ece55b9f790b6900164e2b2d5d966cFariborz Jahanian Opts.ObjCMTAction |= FrontendOptions::ObjCMT_ReturnsInnerPointerProperty; 1259a00f8737e671b587e83280a53e85562c00a7a78dFariborz Jahanian if (Args.hasArg(OPT_objcmt_migrate_instancetype)) 1260a00f8737e671b587e83280a53e85562c00a7a78dFariborz Jahanian Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Instancetype; 1261a00f8737e671b587e83280a53e85562c00a7a78dFariborz Jahanian if (Args.hasArg(OPT_objcmt_migrate_nsmacros)) 1262a00f8737e671b587e83280a53e85562c00a7a78dFariborz Jahanian Opts.ObjCMTAction |= FrontendOptions::ObjCMT_NsMacros; 1263a00f8737e671b587e83280a53e85562c00a7a78dFariborz Jahanian if (Args.hasArg(OPT_objcmt_migrate_protocol_conformance)) 1264a00f8737e671b587e83280a53e85562c00a7a78dFariborz Jahanian Opts.ObjCMTAction |= FrontendOptions::ObjCMT_ProtocolConformance; 126539ebb02cb0bd342ced56de6d19aa9992aa0371b8Fariborz Jahanian if (Args.hasArg(OPT_objcmt_atomic_property)) 126639ebb02cb0bd342ced56de6d19aa9992aa0371b8Fariborz Jahanian Opts.ObjCMTAction |= FrontendOptions::ObjCMT_AtomicProperty; 12675d2a20671954f55f765b96375e8bcd38367cb3baFariborz Jahanian if (Args.hasArg(OPT_objcmt_ns_nonatomic_iosonly)) 12685d2a20671954f55f765b96375e8bcd38367cb3baFariborz Jahanian Opts.ObjCMTAction |= FrontendOptions::ObjCMT_NsAtomicIOSOnlyProperty; 1269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Args.hasArg(OPT_objcmt_migrate_designated_init)) 1270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Opts.ObjCMTAction |= FrontendOptions::ObjCMT_DesignatedInitializer; 1271081099d302b79d1746c7a39da14e3265971eb718Fariborz Jahanian if (Args.hasArg(OPT_objcmt_migrate_all)) 1272081099d302b79d1746c7a39da14e3265971eb718Fariborz Jahanian Opts.ObjCMTAction |= FrontendOptions::ObjCMT_MigrateDecls; 127330660a898545416f0fea2d717f16f75640001e38Ted Kremenek 1274651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Opts.ObjCMTWhiteListPath = Args.getLastArgValue(OPT_objcmt_whitelist_dir_path); 12752c050f6a68c4f871d26be63f8d598f1b64a8e16fArgyrios Kyrtzidis 127630660a898545416f0fea2d717f16f75640001e38Ted Kremenek if (Opts.ARCMTAction != FrontendOptions::ARCMT_None && 127730660a898545416f0fea2d717f16f75640001e38Ted Kremenek Opts.ObjCMTAction != FrontendOptions::ObjCMT_None) { 127830660a898545416f0fea2d717f16f75640001e38Ted Kremenek Diags.Report(diag::err_drv_argument_not_allowed_with) 127930660a898545416f0fea2d717f16f75640001e38Ted Kremenek << "ARC migration" << "ObjC migration"; 128030660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 128130660a898545416f0fea2d717f16f75640001e38Ted Kremenek 1282c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar InputKind DashX = IK_None; 128356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar if (const Arg *A = Args.getLastArg(OPT_x)) { 12841d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith DashX = llvm::StringSwitch<InputKind>(A->getValue()) 1285c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar .Case("c", IK_C) 1286c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar .Case("cl", IK_OpenCL) 1287895fcca55a6d52a71639f2472a6623ab2dd9f628Peter Collingbourne .Case("cuda", IK_CUDA) 1288c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar .Case("c++", IK_CXX) 1289c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar .Case("objective-c", IK_ObjC) 1290c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar .Case("objective-c++", IK_ObjCXX) 1291c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar .Case("cpp-output", IK_PreprocessedC) 1292c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar .Case("assembler-with-cpp", IK_Asm) 1293c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar .Case("c++-cpp-output", IK_PreprocessedCXX) 12943ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar .Case("cuda-cpp-output", IK_PreprocessedCuda) 1295c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar .Case("objective-c-cpp-output", IK_PreprocessedObjC) 1296919f2ca3c21f6b590eea50645ff5bedb54d81673Chris Lattner .Case("objc-cpp-output", IK_PreprocessedObjC) 1297c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar .Case("objective-c++-cpp-output", IK_PreprocessedObjCXX) 12981f7957d63ccbb9c14f852eb127144d27c40f7e8fNico Weber .Case("objc++-cpp-output", IK_PreprocessedObjCXX) 1299c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar .Case("c-header", IK_C) 1300ae57eadbc1a923efb72924765445db915cc23a9bPeter Collingbourne .Case("cl-header", IK_OpenCL) 1301c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar .Case("objective-c-header", IK_ObjC) 1302c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar .Case("c++-header", IK_CXX) 1303c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar .Case("objective-c++-header", IK_ObjCXX) 1304c544ba09695e300f31355af342258bd57619e737Douglas Gregor .Cases("ast", "pcm", IK_AST) 1305faddc3e53a95c68f2c3a966e0f1e6eba110dafd6Daniel Dunbar .Case("ir", IK_LLVM_IR) 13064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("renderscript", IK_RenderScript) 1307c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar .Default(IK_None); 1308c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar if (DashX == IK_None) 130956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Diags.Report(diag::err_drv_invalid_value) 13101d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith << A->getAsString(Args) << A->getValue(); 131156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar } 131256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 131356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar // '-' is the default input if none is given. 131403e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT); 131556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.Inputs.clear(); 131656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar if (Inputs.empty()) 131756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Inputs.push_back("-"); 131856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar for (unsigned i = 0, e = Inputs.size(); i != e; ++i) { 1319c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar InputKind IK = DashX; 1320c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar if (IK == IK_None) { 132156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar IK = FrontendOptions::getInputKindForExtension( 13225f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef(Inputs[i]).rsplit('.').second); 132356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar // FIXME: Remove this hack. 132456ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar if (i == 0) 132556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar DashX = IK; 132656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar } 1327b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.Inputs.emplace_back(std::move(Inputs[i]), IK); 132856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar } 132956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 133056ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar return DashX; 133156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar} 133256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 13338b9adfea5e834eaee0f45d8cc7fb052d68df4a46Daniel Dunbarstd::string CompilerInvocation::GetResourcesPath(const char *Argv0, 13348b9adfea5e834eaee0f45d8cc7fb052d68df4a46Daniel Dunbar void *MainAddr) { 13350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines std::string ClangExecutable = 13360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines llvm::sys::fs::getMainExecutable(Argv0, MainAddr); 13370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines StringRef Dir = llvm::sys::path::parent_path(ClangExecutable); 13380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 13390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Compute the path to the resource directory. 13400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines StringRef ClangResourceDir(CLANG_RESOURCE_DIR); 13410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallString<128> P(Dir); 134287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (ClangResourceDir != "") 13430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines llvm::sys::path::append(P, ClangResourceDir); 134487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar else 134587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::sys::path::append(P, "..", Twine("lib") + CLANG_LIBDIR_SUFFIX, 134687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar "clang", CLANG_VERSION_STRING); 134756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 134856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar return P.str(); 134956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar} 135056ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 13511e69fe3a9f0a42b32a3000bda51677d51416564eDaniel Dunbarstatic void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) { 1352bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy using namespace options; 135303e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Opts.Sysroot = Args.getLastArgValue(OPT_isysroot, "/"); 135456ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.Verbose = Args.hasArg(OPT_v); 1355c91562ce427a88f4aa4d6c2b374f6f0937f5b6fcFrancois Pichet Opts.UseBuiltinIncludes = !Args.hasArg(OPT_nobuiltininc); 1356a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar Opts.UseStandardSystemIncludes = !Args.hasArg(OPT_nostdsysteminc); 13574c2bcad7b843c10fd4a2ffd43da40bfefb4dc8baDouglas Gregor Opts.UseStandardCXXIncludes = !Args.hasArg(OPT_nostdincxx); 135813c4f2144b35bda21746eb60ad90e52a9bd8dcdaBob Wilson if (const Arg *A = Args.getLastArg(OPT_stdlib_EQ)) 13591d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith Opts.UseLibcxx = (strcmp(A->getValue(), "libc++") == 0); 136003e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Opts.ResourceDir = Args.getLastArgValue(OPT_resource_dir); 1361953a61f26bf79932b9699b09add4c388764de170Douglas Gregor Opts.ModuleCachePath = Args.getLastArgValue(OPT_fmodules_cache_path); 1362651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Opts.ModuleUserBuildPath = Args.getLastArgValue(OPT_fmodules_user_build_path); 13636e975c4517958bcc11c834336d340797356058dbDouglas Gregor Opts.DisableModuleHash = Args.hasArg(OPT_fdisable_module_hash); 136487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.ImplicitModuleMaps = Args.hasArg(OPT_fimplicit_module_maps); 13650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.ModuleMapFileHomeIsCwd = Args.hasArg(OPT_fmodule_map_file_home_is_cwd); 1366b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner Opts.ModuleCachePruneInterval = 1367b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner getLastArgIntValue(Args, OPT_fmodules_prune_interval, 7 * 24 * 60 * 60); 1368b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner Opts.ModuleCachePruneAfter = 1369b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner getLastArgIntValue(Args, OPT_fmodules_prune_after, 31 * 24 * 60 * 60); 1370651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Opts.ModulesValidateOncePerBuildSession = 1371651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Args.hasArg(OPT_fmodules_validate_once_per_build_session); 1372651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Opts.BuildSessionTimestamp = 1373651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getLastArgUInt64Value(Args, OPT_fbuild_session_timestamp, 0); 1374651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Opts.ModulesValidateSystemHeaders = 1375651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Args.hasArg(OPT_fmodules_validate_system_headers); 137687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (const Arg *A = Args.getLastArg(OPT_fmodule_format_EQ)) 137787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.ModuleFormat = A->getValue(); 1378651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1379b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Arg *A : Args.filtered(OPT_fmodules_ignore_macro)) { 1380b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar StringRef MacroDef = A->getValue(); 1381005d51bc4f16a7b330e13082d186b72953bde581Douglas Gregor Opts.ModulesIgnoreMacros.insert(MacroDef.split('=').first); 13822a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor } 13832a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor 138465e02fa80e1c185f18e5f81cefc30d75383a7301Douglas Gregor // Add -I..., -F..., and -index-header-map options in order. 138565e02fa80e1c185f18e5f81cefc30d75383a7301Douglas Gregor bool IsIndexHeaderMap = false; 13864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool IsSysrootSpecified = 13874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Args.hasArg(OPT__sysroot_EQ) || Args.hasArg(OPT_isysroot); 1388b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Arg *A : Args.filtered(OPT_I, OPT_F, OPT_index_header_map)) { 1389b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (A->getOption().matches(OPT_index_header_map)) { 139065e02fa80e1c185f18e5f81cefc30d75383a7301Douglas Gregor // -index-header-map applies to the next -I or -F. 139165e02fa80e1c185f18e5f81cefc30d75383a7301Douglas Gregor IsIndexHeaderMap = true; 139265e02fa80e1c185f18e5f81cefc30d75383a7301Douglas Gregor continue; 139365e02fa80e1c185f18e5f81cefc30d75383a7301Douglas Gregor } 1394b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 1395b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar frontend::IncludeDirGroup Group = 1396b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar IsIndexHeaderMap ? frontend::IndexHeaderMap : frontend::Angled; 1397b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 13984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool IsFramework = A->getOption().matches(OPT_F); 13994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar std::string Path = A->getValue(); 14004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 14014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (IsSysrootSpecified && !IsFramework && A->getValue()[0] == '=') { 14024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SmallString<32> Buffer; 14034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::sys::path::append(Buffer, Opts.Sysroot, 14044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::StringRef(A->getValue()).substr(1)); 14054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Path = Buffer.str(); 14064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 14074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 14084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.AddPath(Path.c_str(), Group, IsFramework, 14094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /*IgnoreSysroot*/ true); 141065e02fa80e1c185f18e5f81cefc30d75383a7301Douglas Gregor IsIndexHeaderMap = false; 141165e02fa80e1c185f18e5f81cefc30d75383a7301Douglas Gregor } 141256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 1413f3fc21f7277921677244b2c4b14f3a67e0cde8d1Daniel Dunbar // Add -iprefix/-iwithprefix/-iwithprefixbefore options. 14145f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Prefix = ""; // FIXME: This isn't the correct default prefix. 1415b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Arg *A : 1416b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Args.filtered(OPT_iprefix, OPT_iwithprefix, OPT_iwithprefixbefore)) { 14177e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar if (A->getOption().matches(OPT_iprefix)) 14181d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith Prefix = A->getValue(); 14197e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar else if (A->getOption().matches(OPT_iwithprefix)) 1420b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.AddPath(Prefix.str() + A->getValue(), frontend::After, false, true); 142156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar else 1422b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.AddPath(Prefix.str() + A->getValue(), frontend::Angled, false, true); 1423b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 1424b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 1425b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Arg *A : Args.filtered(OPT_idirafter)) 1426b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.AddPath(A->getValue(), frontend::After, false, true); 1427b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Arg *A : Args.filtered(OPT_iquote)) 1428b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.AddPath(A->getValue(), frontend::Quoted, false, true); 1429b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Arg *A : Args.filtered(OPT_isystem, OPT_iwithsysroot)) 1430b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.AddPath(A->getValue(), frontend::System, false, 1431b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar !A->getOption().matches(OPT_iwithsysroot)); 1432b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Arg *A : Args.filtered(OPT_iframework)) 1433b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.AddPath(A->getValue(), frontend::System, true, true); 143447adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer 143547adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer // Add the paths for the various language specific isystem flags. 1436b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Arg *A : Args.filtered(OPT_c_isystem)) 1437b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.AddPath(A->getValue(), frontend::CSystem, false, true); 1438b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Arg *A : Args.filtered(OPT_cxx_isystem)) 1439b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.AddPath(A->getValue(), frontend::CXXSystem, false, true); 1440b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Arg *A : Args.filtered(OPT_objc_isystem)) 1441b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.AddPath(A->getValue(), frontend::ObjCSystem, false,true); 1442b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Arg *A : Args.filtered(OPT_objcxx_isystem)) 1443b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.AddPath(A->getValue(), frontend::ObjCXXSystem, false, true); 1444ac2bc4d220a6263be96b943e9162f4a11149e26dChandler Carruth 1445ac2bc4d220a6263be96b943e9162f4a11149e26dChandler Carruth // Add the internal paths from a driver that detects standard include paths. 1446b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Arg *A : 1447b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) { 1448ef84554239d77cc52a14b42f2bff8c2d02e7630eDaniel Dunbar frontend::IncludeDirGroup Group = frontend::System; 1449b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (A->getOption().matches(OPT_internal_externc_isystem)) 1450ef84554239d77cc52a14b42f2bff8c2d02e7630eDaniel Dunbar Group = frontend::ExternCSystem; 1451b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.AddPath(A->getValue(), Group, false, true); 1452ef84554239d77cc52a14b42f2bff8c2d02e7630eDaniel Dunbar } 1453f122a138e39dbb29162abfa9a3d44091d8efa7afRichard Smith 1454f122a138e39dbb29162abfa9a3d44091d8efa7afRichard Smith // Add the path prefixes which are implicitly treated as being system headers. 1455b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Arg *A : 1456b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Args.filtered(OPT_system_header_prefix, OPT_no_system_header_prefix)) 1457651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Opts.AddSystemHeaderPrefix( 1458b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar A->getValue(), A->getOption().matches(OPT_system_header_prefix)); 1459651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1460b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Arg *A : Args.filtered(OPT_ivfsoverlay)) 1461b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.AddVFSOverlayFile(A->getValue()); 146256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar} 146356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 14644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool isOpenCL(LangStandard::Kind LangStd) { 14654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return LangStd == LangStandard::lang_opencl || 14664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar LangStd == LangStandard::lang_opencl11 || 14674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar LangStd == LangStandard::lang_opencl12 || 14684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar LangStd == LangStandard::lang_opencl20; 14694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 14704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 147153c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbournevoid CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK, 14724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const llvm::Triple &T, 14734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar PreprocessorOptions &PPOpts, 147453c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne LangStandard::Kind LangStd) { 1475fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner // Set some properties which depend solely on the input kind; it would be nice 147656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar // to move these to the language standard, and have the driver resolve the 147756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar // input kind + language standard. 1478c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar if (IK == IK_Asm) { 147956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.AsmPreprocessor = 1; 1480c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar } else if (IK == IK_ObjC || 1481c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar IK == IK_ObjCXX || 1482c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar IK == IK_PreprocessedObjC || 1483c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar IK == IK_PreprocessedObjCXX) { 148456ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ObjC1 = Opts.ObjC2 = 1; 148556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar } 148656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 148756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar if (LangStd == LangStandard::lang_unspecified) { 148856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar // Based on the base language, pick one. 148956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar switch (IK) { 1490c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar case IK_None: 1491c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar case IK_AST: 1492faddc3e53a95c68f2c3a966e0f1e6eba110dafd6Daniel Dunbar case IK_LLVM_IR: 1493b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Invalid input kind!"); 1494c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar case IK_OpenCL: 149556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar LangStd = LangStandard::lang_opencl; 149656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar break; 1497895fcca55a6d52a71639f2472a6623ab2dd9f628Peter Collingbourne case IK_CUDA: 14983ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar case IK_PreprocessedCuda: 1499895fcca55a6d52a71639f2472a6623ab2dd9f628Peter Collingbourne LangStd = LangStandard::lang_cuda; 1500895fcca55a6d52a71639f2472a6623ab2dd9f628Peter Collingbourne break; 1501c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar case IK_Asm: 1502c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar case IK_C: 1503c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar case IK_PreprocessedC: 1504c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar case IK_ObjC: 1505c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar case IK_PreprocessedObjC: 15064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // The PS4 uses C99 as the default C standard. 15074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T.isPS4()) 15084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar LangStd = LangStandard::lang_gnu99; 15094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else 15104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar LangStd = LangStandard::lang_gnu11; 151156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar break; 1512c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar case IK_CXX: 1513c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar case IK_PreprocessedCXX: 1514c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar case IK_ObjCXX: 1515c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar case IK_PreprocessedObjCXX: 151656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar LangStd = LangStandard::lang_gnucxx98; 151756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar break; 15184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case IK_RenderScript: 15194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar LangStd = LangStandard::lang_c99; 15204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 152156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar } 152256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar } 152356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 152456ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd); 1525bb23628148f555a4cf71f98c27096a7a804c085cNico Weber Opts.LineComment = Std.hasLineComments(); 152656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.C99 = Std.isC99(); 1527ffbe9b9c64ab2e94b9d48ec56e511f75826fc80aBenjamin Kramer Opts.C11 = Std.isC11(); 152856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.CPlusPlus = Std.isCPlusPlus(); 152980ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith Opts.CPlusPlus11 = Std.isCPlusPlus11(); 1530176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Opts.CPlusPlus14 = Std.isCPlusPlus14(); 1531c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Opts.CPlusPlus1z = Std.isCPlusPlus1z(); 153256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.Digraphs = Std.hasDigraphs(); 153356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.GNUMode = Std.isGNUMode(); 1534b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.GNUInline = Std.isC89(); 153556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.HexFloats = Std.hasHexFloats(); 153656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ImplicitInt = Std.hasImplicitInt(); 153756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 1538f4205e12cede5db17f47b31471852bb4a1f27533Tanya Lattner // Set OpenCL Version. 15394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.OpenCL = isOpenCL(LangStd) || IK == IK_OpenCL; 1540c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (LangStd == LangStandard::lang_opencl) 1541f4205e12cede5db17f47b31471852bb4a1f27533Tanya Lattner Opts.OpenCLVersion = 100; 1542c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines else if (LangStd == LangStandard::lang_opencl11) 1543176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Opts.OpenCLVersion = 110; 1544c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines else if (LangStd == LangStandard::lang_opencl12) 1545f4205e12cede5db17f47b31471852bb4a1f27533Tanya Lattner Opts.OpenCLVersion = 120; 1546176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines else if (LangStd == LangStandard::lang_opencl20) 1547176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Opts.OpenCLVersion = 200; 1548176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1549f4205e12cede5db17f47b31471852bb4a1f27533Tanya Lattner // OpenCL has some additional defaults. 1550f4205e12cede5db17f47b31471852bb4a1f27533Tanya Lattner if (Opts.OpenCL) { 155137c31c2e050856f87efd652958352181e72e5deaTobias Grosser Opts.AltiVec = 0; 155287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.ZVector = 0; 155356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.CXXOperatorNames = 1; 155437c31c2e050856f87efd652958352181e72e5deaTobias Grosser Opts.LaxVectorConversions = 0; 1555f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne Opts.DefaultFPContract = 1; 155619dbb20ac4371fae3190379a7e7bd467af3c00aaJoey Gouly Opts.NativeHalfType = 1; 15571567b306a9c2a37c909046959f661092a3c04a76Pirama Arumuga Nainar Opts.NativeHalfArgsAndReturns = 1; 15584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Include default header file for OpenCL. 15594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Opts.IncludeDefaultHeader) { 15604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar PPOpts.Includes.push_back("opencl-c.h"); 15614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 156256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar } 156356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 15643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Opts.CUDA = IK == IK_CUDA || IK == IK_PreprocessedCuda || 15653ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar LangStd == LangStandard::lang_cuda; 1566895fcca55a6d52a71639f2472a6623ab2dd9f628Peter Collingbourne 15674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.RenderScript = IK == IK_RenderScript; 15684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Opts.RenderScript) { 15694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.NativeHalfType = 1; 15704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.NativeHalfArgsAndReturns = 1; 15714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 15724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 157356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar // OpenCL and C++ both have bool, true, false keywords. 157456ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.Bool = Opts.OpenCL || Opts.CPlusPlus; 157556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 1576651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // OpenCL has half keyword 1577651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Opts.Half = Opts.OpenCL; 1578651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 15795b86ffd219bdee7720217d5755b772726668b242Abramo Bagnara // C++ has wchar_t keyword. 15805b86ffd219bdee7720217d5755b772726668b242Abramo Bagnara Opts.WChar = Opts.CPlusPlus; 15815b86ffd219bdee7720217d5755b772726668b242Abramo Bagnara 158253c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne Opts.GNUKeywords = Opts.GNUMode; 158353c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne Opts.CXXOperatorNames = Opts.CPlusPlus; 158453c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne 158553c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne Opts.DollarIdents = !Opts.AsmPreprocessor; 158653c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne} 158753c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne 1588a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall/// Attempt to parse a visibility value out of the given argument. 1589a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCallstatic Visibility parseVisibility(Arg *arg, ArgList &args, 1590a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall DiagnosticsEngine &diags) { 1591a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall StringRef value = arg->getValue(); 1592a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall if (value == "default") { 1593a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall return DefaultVisibility; 159487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } else if (value == "hidden" || value == "internal") { 1595a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall return HiddenVisibility; 1596a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall } else if (value == "protected") { 1597a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall // FIXME: diagnose if target does not support protected visibility 1598a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall return ProtectedVisibility; 1599a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall } 1600a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall 1601a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall diags.Report(diag::err_drv_invalid_value) 1602a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall << arg->getAsString(args) << value; 1603a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall return DefaultVisibility; 1604a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall} 1605a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall 160653c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbournestatic void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, 16074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const TargetOptions &TargetOpts, 16084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar PreprocessorOptions &PPOpts, 1609d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine &Diags) { 161053c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne // FIXME: Cleanup per-file based stuff. 161153c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne LangStandard::Kind LangStd = LangStandard::lang_unspecified; 161253c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne if (const Arg *A = Args.getLastArg(OPT_std_EQ)) { 16131d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith LangStd = llvm::StringSwitch<LangStandard::Kind>(A->getValue()) 161453c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne#define LANGSTANDARD(id, name, desc, features) \ 161553c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne .Case(name, LangStandard::lang_##id) 16164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define LANGSTANDARD_ALIAS(id, alias) \ 16174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case(alias, LangStandard::lang_##id) 161853c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne#include "clang/Frontend/LangStandards.def" 161953c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne .Default(LangStandard::lang_unspecified); 162053c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne if (LangStd == LangStandard::lang_unspecified) 162153c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne Diags.Report(diag::err_drv_invalid_value) 16221d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith << A->getAsString(Args) << A->getValue(); 1623b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier else { 1624651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Valid standard, check to make sure language and standard are 1625651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // compatible. 1626b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd); 1627b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier switch (IK) { 1628b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier case IK_C: 1629b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier case IK_ObjC: 1630b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier case IK_PreprocessedC: 1631b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier case IK_PreprocessedObjC: 1632b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier if (!(Std.isC89() || Std.isC99())) 1633b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier Diags.Report(diag::err_drv_argument_not_allowed_with) 1634b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier << A->getAsString(Args) << "C/ObjC"; 1635b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier break; 1636b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier case IK_CXX: 1637b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier case IK_ObjCXX: 1638b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier case IK_PreprocessedCXX: 1639b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier case IK_PreprocessedObjCXX: 1640b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier if (!Std.isCPlusPlus()) 1641b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier Diags.Report(diag::err_drv_argument_not_allowed_with) 1642b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier << A->getAsString(Args) << "C++/ObjC++"; 1643b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier break; 1644b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier case IK_OpenCL: 16454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!isOpenCL(LangStd)) 1646b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier Diags.Report(diag::err_drv_argument_not_allowed_with) 1647b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier << A->getAsString(Args) << "OpenCL"; 1648b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier break; 1649b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier case IK_CUDA: 16503ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar case IK_PreprocessedCuda: 1651b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier if (!Std.isCPlusPlus()) 1652b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier Diags.Report(diag::err_drv_argument_not_allowed_with) 1653b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier << A->getAsString(Args) << "CUDA"; 1654b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier break; 1655b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier default: 1656b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier break; 1657b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier } 1658b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier } 165953c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne } 166053c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne 16615e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner // -cl-std only applies for OpenCL language standards. 16625e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner // Override the -std option in this case. 166391252d115bdb6f937192a8dbc86c5abe00101436Peter Collingbourne if (const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) { 16645e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner LangStandard::Kind OpenCLLangStd 16651d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith = llvm::StringSwitch<LangStandard::Kind>(A->getValue()) 16664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Cases("cl", "CL", LangStandard::lang_opencl) 16674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Cases("cl1.1", "CL1.1", LangStandard::lang_opencl11) 16684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Cases("cl1.2", "CL1.2", LangStandard::lang_opencl12) 16694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Cases("cl2.0", "CL2.0", LangStandard::lang_opencl20) 16705e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner .Default(LangStandard::lang_unspecified); 167187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 16725e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner if (OpenCLLangStd == LangStandard::lang_unspecified) { 167391252d115bdb6f937192a8dbc86c5abe00101436Peter Collingbourne Diags.Report(diag::err_drv_invalid_value) 16741d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith << A->getAsString(Args) << A->getValue(); 167591252d115bdb6f937192a8dbc86c5abe00101436Peter Collingbourne } 16765e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner else 16775e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner LangStd = OpenCLLangStd; 167891252d115bdb6f937192a8dbc86c5abe00101436Peter Collingbourne } 167987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 16804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header); 16814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 16824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::Triple T(TargetOpts.Triple); 16834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CompilerInvocation::setLangDefaults(Opts, IK, T, PPOpts, LangStd); 16844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 16854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // -cl-strict-aliasing needs to emit diagnostic in the case where CL > 1.0. 16864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // This option should be deprecated for CL > 1.0 because 16874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // this option was added for compatibility with OpenCL 1.0. 16884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Args.getLastArg(OPT_cl_strict_aliasing) 16894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar && Opts.OpenCLVersion > 100) { 16904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar std::string VerSpec = llvm::to_string(Opts.OpenCLVersion / 100) + 16914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar std::string(".") + 16924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::to_string((Opts.OpenCLVersion % 100) / 10); 16934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Diags.Report(diag::warn_option_invalid_ocl_version) 16944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar << VerSpec << Args.getLastArg(OPT_cl_strict_aliasing)->getAsString(Args); 16954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 169653c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne 1697eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth // We abuse '-f[no-]gnu-keywords' to force overriding all GNU-extension 1698eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth // keywords. This behavior is provided by GCC's poorly named '-fasm' flag, 1699eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth // while a subset (the non-C++ GNU keywords) is provided by GCC's 1700eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth // '-fgnu-keywords'. Clang conflates the two for simplicity under the single 1701eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth // name, as it doesn't seem a useful distinction. 1702eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth Opts.GNUKeywords = Args.hasFlag(OPT_fgnu_keywords, OPT_fno_gnu_keywords, 170353c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne Opts.GNUKeywords); 1704eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth 170553c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne if (Args.hasArg(OPT_fno_operator_names)) 170653c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne Opts.CXXOperatorNames = 0; 170756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 17080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Args.hasArg(OPT_fcuda_is_device)) 17090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.CUDAIsDevice = 1; 17100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 17114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Args.hasArg(OPT_fcuda_allow_variadic_functions)) 17124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.CUDAAllowVariadicFunctions = 1; 17130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 17144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Args.hasArg(OPT_fno_cuda_host_device_constexpr)) 17154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.CUDAHostDeviceConstexpr = 0; 171658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 17174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Opts.CUDAIsDevice && Args.hasArg(OPT_fcuda_flush_denormals_to_zero)) 17184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.CUDADeviceFlushDenormalsToZero = 1; 17194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 17204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Opts.CUDAIsDevice && Args.hasArg(OPT_fcuda_approx_transcendentals)) 17214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.CUDADeviceApproxTranscendentals = 1; 172287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 1723f85e193739c953358c865005855253af4f68a497John McCall if (Opts.ObjC1) { 1724260611a32535c851237926bfcf78869b13c07d5bJohn McCall if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) { 17251d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef value = arg->getValue(); 1726260611a32535c851237926bfcf78869b13c07d5bJohn McCall if (Opts.ObjCRuntime.tryParse(value)) 1727260611a32535c851237926bfcf78869b13c07d5bJohn McCall Diags.Report(diag::err_drv_unknown_objc_runtime) << value; 1728260611a32535c851237926bfcf78869b13c07d5bJohn McCall } 1729260611a32535c851237926bfcf78869b13c07d5bJohn McCall 1730f85e193739c953358c865005855253af4f68a497John McCall if (Args.hasArg(OPT_fobjc_gc_only)) 1731e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor Opts.setGC(LangOptions::GCOnly); 1732f85e193739c953358c865005855253af4f68a497John McCall else if (Args.hasArg(OPT_fobjc_gc)) 1733e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor Opts.setGC(LangOptions::HybridGC); 1734f85e193739c953358c865005855253af4f68a497John McCall else if (Args.hasArg(OPT_fobjc_arc)) { 1735f85e193739c953358c865005855253af4f68a497John McCall Opts.ObjCAutoRefCount = 1; 17360a7dd788dbef975f35f273c7ab913f480f7edd60John McCall if (!Opts.ObjCRuntime.allowsARC()) 17370a7dd788dbef975f35f273c7ab913f480f7edd60John McCall Diags.Report(diag::err_arc_unsupported_on_runtime); 173887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 17390a7dd788dbef975f35f273c7ab913f480f7edd60John McCall 174087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // ObjCWeakRuntime tracks whether the runtime supports __weak, not 174187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // whether the feature is actually enabled. This is predominantly 174287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // determined by -fobjc-runtime, but we allow it to be overridden 174387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // from the command line for testing purposes. 174487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Args.hasArg(OPT_fobjc_runtime_has_weak)) 174587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.ObjCWeakRuntime = 1; 174687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar else 174787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.ObjCWeakRuntime = Opts.ObjCRuntime.allowsWeak(); 174887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 174987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // ObjCWeak determines whether __weak is actually enabled. 175087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Note that we allow -fno-objc-weak to disable this even in ARC mode. 175187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) { 175287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!weakArg->getOption().matches(OPT_fobjc_weak)) { 175387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(!Opts.ObjCWeak); 175487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } else if (Opts.getGC() != LangOptions::NonGC) { 175587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Diags.Report(diag::err_objc_weak_with_gc); 175687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } else if (!Opts.ObjCWeakRuntime) { 175787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Diags.Report(diag::err_objc_weak_unsupported); 175887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } else { 175987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.ObjCWeak = 1; 176087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 176187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } else if (Opts.ObjCAutoRefCount) { 176287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.ObjCWeak = Opts.ObjCWeakRuntime; 1763f85e193739c953358c865005855253af4f68a497John McCall } 1764f85e193739c953358c865005855253af4f68a497John McCall 1765f85e193739c953358c865005855253af4f68a497John McCall if (Args.hasArg(OPT_fno_objc_infer_related_result_type)) 1766f85e193739c953358c865005855253af4f68a497John McCall Opts.ObjCInferRelatedResultType = 0; 176787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 1768d9553e35e1e3af6fc4ca817b169dc796a5b54bcdFariborz Jahanian if (Args.hasArg(OPT_fobjc_subscripting_legacy_runtime)) 1769d9553e35e1e3af6fc4ca817b169dc796a5b54bcdFariborz Jahanian Opts.ObjCSubscriptingLegacyRuntime = 1770d9553e35e1e3af6fc4ca817b169dc796a5b54bcdFariborz Jahanian (Opts.ObjCRuntime.getKind() == ObjCRuntime::FragileMacOSX); 1771f85e193739c953358c865005855253af4f68a497John McCall } 177287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 1773b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (Args.hasArg(OPT_fgnu89_inline)) { 1774b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (Opts.CPlusPlus) 1775b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Diags.Report(diag::err_drv_argument_not_allowed_with) << "-fgnu89-inline" 1776b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar << "C++/ObjC++"; 1777b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar else 1778b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.GNUInline = 1; 1779b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 1780fb3f4aad0436a9c40e9130598162150890c405b5Rafael Espindola 1781142f9e99018a85105cee570133c111a52f2053ecFariborz Jahanian if (Args.hasArg(OPT_fapple_kext)) { 1782142f9e99018a85105cee570133c111a52f2053ecFariborz Jahanian if (!Opts.CPlusPlus) 1783142f9e99018a85105cee570133c111a52f2053ecFariborz Jahanian Diags.Report(diag::warn_c_kext); 1784142f9e99018a85105cee570133c111a52f2053ecFariborz Jahanian else 1785142f9e99018a85105cee570133c111a52f2053ecFariborz Jahanian Opts.AppleKext = 1; 1786142f9e99018a85105cee570133c111a52f2053ecFariborz Jahanian } 1787142f9e99018a85105cee570133c111a52f2053ecFariborz Jahanian 178856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar if (Args.hasArg(OPT_print_ivar_layout)) 178956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ObjCGCBitmapPrint = 1; 179033e982bf782d851bfe5767acb1336fcf3419ac6bFariborz Jahanian if (Args.hasArg(OPT_fno_constant_cfstrings)) 179133e982bf782d851bfe5767acb1336fcf3419ac6bFariborz Jahanian Opts.NoConstantCFStrings = 1; 179256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 179356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar if (Args.hasArg(OPT_faltivec)) 179456ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.AltiVec = 1; 179556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 179687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Args.hasArg(OPT_fzvector)) 179787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.ZVector = 1; 179887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 179956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar if (Args.hasArg(OPT_pthread)) 180056ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.POSIXThreads = 1; 180156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 1802a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall // The value-visibility mode defaults to "default". 1803a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall if (Arg *visOpt = Args.getLastArg(OPT_fvisibility)) { 1804a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall Opts.setValueVisibilityMode(parseVisibility(visOpt, Args, Diags)); 1805a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall } else { 1806a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall Opts.setValueVisibilityMode(DefaultVisibility); 1807a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall } 1808a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall 1809a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall // The type-visibility mode defaults to the value-visibility mode. 1810a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall if (Arg *typeVisOpt = Args.getLastArg(OPT_ftype_visibility)) { 1811a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall Opts.setTypeVisibilityMode(parseVisibility(typeVisOpt, Args, Diags)); 1812a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall } else { 1813a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall Opts.setTypeVisibilityMode(Opts.getValueVisibilityMode()); 1814a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall } 181556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 18167cf84d66965a7706004d8590b5af5fe54b85f525Douglas Gregor if (Args.hasArg(OPT_fvisibility_inlines_hidden)) 18177cf84d66965a7706004d8590b5af5fe54b85f525Douglas Gregor Opts.InlineVisibilityHidden = 1; 181820249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 18197f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall if (Args.hasArg(OPT_ftrapv)) { 182020249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer Opts.setSignedOverflowBehavior(LangOptions::SOB_Trapping); 18217f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall // Set the handler, if one is specified. 18227f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall Opts.OverflowHandler = 18237f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall Args.getLastArgValue(OPT_ftrapv_handler); 18247f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall } 1825a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner else if (Args.hasArg(OPT_fwrapv)) 182620249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer Opts.setSignedOverflowBehavior(LangOptions::SOB_Defined); 182756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 18280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.MSVCCompat = Args.hasArg(OPT_fms_compatibility); 18290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.MicrosoftExt = Opts.MSVCCompat || Args.hasArg(OPT_fms_extensions); 18300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.AsmBlocks = Args.hasArg(OPT_fasm_blocks) || Opts.MicrosoftExt; 18313ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Opts.MSCompatibilityVersion = 0; 18323ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (const Arg *A = Args.getLastArg(OPT_fms_compatibility_version)) { 18333ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar VersionTuple VT; 18343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (VT.tryParse(A->getValue())) 18353ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) 18363ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar << A->getValue(); 18373ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Opts.MSCompatibilityVersion = VT.getMajor() * 10000000 + 18383ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar VT.getMinor().getValueOr(0) * 100000 + 18393ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar VT.getSubminor().getValueOr(0); 18403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 18410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 18420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs 18430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // is specified, or -std is set to a conforming mode. 18440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Trigraphs are disabled by default in c++1z onwards. 18450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.Trigraphs = !Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus1z; 18460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.Trigraphs = 18470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs); 184856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 18498663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers, 18508663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar OPT_fno_dollars_in_identifiers, 185153c92be3b233cede6114702a5f86f146f55d6c6ePeter Collingbourne Opts.DollarIdents); 185256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings); 1853651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Opts.VtorDispMode = getLastArgIntValue(Args, OPT_vtordisp_mode_EQ, 1, Diags); 1854400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik Opts.Borland = Args.hasArg(OPT_fborland_extensions); 185556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings); 185650465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth Opts.ConstStrings = Args.hasFlag(OPT_fconst_strings, OPT_fno_const_strings, 185750465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth Opts.ConstStrings); 185856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar if (Args.hasArg(OPT_fno_lax_vector_conversions)) 1859a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson Opts.LaxVectorConversions = 0; 1860a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson if (Args.hasArg(OPT_fno_threadsafe_statics)) 1861824d7ea07a4e9208925daa6ae9289fb2b39bce9fAnders Carlsson Opts.ThreadsafeStatics = 0; 186256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.Exceptions = Args.hasArg(OPT_fexceptions); 1863e9b801f7633b11b18d357a71442bd003435784e8Anders Carlsson Opts.ObjCExceptions = Args.hasArg(OPT_fobjc_exceptions); 18640761e44550f094633bbe7fd4ae1d79ec456fca69Anders Carlsson Opts.CXXExceptions = Args.hasArg(OPT_fcxx_exceptions); 18650761e44550f094633bbe7fd4ae1d79ec456fca69Anders Carlsson Opts.SjLjExceptions = Args.hasArg(OPT_fsjlj_exceptions); 18664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.ExternCNoUnwind = Args.hasArg(OPT_fexternc_nounwind); 18672ed42287b9b88a0bb08ab10e95e306da3f294ba9Daniel Dunbar Opts.TraditionalCPP = Args.hasArg(OPT_traditional_cpp); 18680761e44550f094633bbe7fd4ae1d79ec456fca69Anders Carlsson 18694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.RTTI = Opts.CPlusPlus && !Args.hasArg(OPT_fno_rtti); 1870c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Opts.RTTIData = Opts.RTTI && !Args.hasArg(OPT_fno_rtti_data); 18714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL 18724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar && Opts.OpenCLVersion >= 200); 187313db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall Opts.BlocksRuntimeOptional = Args.hasArg(OPT_fblocks_runtime_optional); 187487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.Coroutines = Args.hasArg(OPT_fcoroutines); 1875752c74d99b647710a495c2ff5f815c30a30c3264Douglas Gregor Opts.Modules = Args.hasArg(OPT_fmodules); 18766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Opts.ModulesStrictDeclUse = Args.hasArg(OPT_fmodules_strict_decluse); 18776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Opts.ModulesDeclUse = 18786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Args.hasArg(OPT_fmodules_decluse) || Opts.ModulesStrictDeclUse; 1879b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.ModulesLocalVisibility = 1880b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Args.hasArg(OPT_fmodules_local_submodule_visibility); 18816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Opts.ModulesSearchAll = Opts.Modules && 18826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines !Args.hasArg(OPT_fno_modules_search_all) && 18836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Args.hasArg(OPT_fmodules_search_all); 18846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Opts.ModulesErrorRecovery = !Args.hasArg(OPT_fno_modules_error_recovery); 18850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.ImplicitModules = !Args.hasArg(OPT_fno_implicit_modules); 18868bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed Opts.CharIsSigned = Opts.OpenCL || !Args.hasArg(OPT_fno_signed_char); 18875b86ffd219bdee7720217d5755b772726668b242Abramo Bagnara Opts.WChar = Opts.CPlusPlus && !Args.hasArg(OPT_fno_wchar); 1888651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Opts.ShortWChar = Args.hasFlag(OPT_fshort_wchar, OPT_fno_short_wchar, false); 18899a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis Opts.ShortEnums = Args.hasArg(OPT_fshort_enums); 189056ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.Freestanding = Args.hasArg(OPT_ffreestanding); 189156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding; 18924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!Opts.NoBuiltin) 18934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar getAllNoBuiltinFuncValues(Args, Opts.NoBuiltinFuncs); 1894264d206244bde858471e4b6211aeba28fd8ce7cbEli Bendersky Opts.NoMathBuiltin = Args.hasArg(OPT_fno_math_builtin); 18953ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Opts.SizedDeallocation = Args.hasArg(OPT_fsized_deallocation); 1896b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.ConceptsTS = Args.hasArg(OPT_fconcepts_ts); 189756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions); 18987002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall Opts.AccessControl = !Args.hasArg(OPT_fno_access_control); 189956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors); 19008bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed Opts.MathErrno = !Opts.OpenCL && Args.hasArg(OPT_fmath_errno); 1901b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner Opts.InstantiationDepth = 1902b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner getLastArgIntValue(Args, OPT_ftemplate_depth, 256, Diags); 1903195dd7c8448893e13a0cd8e776520f14cba65b08Richard Smith Opts.ArrowDepth = 1904195dd7c8448893e13a0cd8e776520f14cba65b08Richard Smith getLastArgIntValue(Args, OPT_foperator_arrow_depth, 256, Diags); 1905b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner Opts.ConstexprCallDepth = 1906b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner getLastArgIntValue(Args, OPT_fconstexpr_depth, 512, Diags); 1907b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner Opts.ConstexprStepLimit = 1908b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner getLastArgIntValue(Args, OPT_fconstexpr_steps, 1048576, Diags); 1909b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner Opts.BracketDepth = getLastArgIntValue(Args, OPT_fbracket_depth, 256, Diags); 19108387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet Opts.DelayedTemplateParsing = Args.hasArg(OPT_fdelayed_template_parsing); 1911b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner Opts.NumLargeByValueCopy = 1912b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner getLastArgIntValue(Args, OPT_Wlarge_by_value_copy_EQ, 0, Diags); 19136f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor Opts.MSBitfields = Args.hasArg(OPT_mms_bitfields); 191403e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Opts.ObjCConstantStringClass = 191503e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Args.getLastArgValue(OPT_fconstant_string_class); 1916c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek Opts.ObjCDefaultSynthProperties = 191714f9889b9b88f73a891688d7732bf01a127d9e7cRafael Espindola !Args.hasArg(OPT_disable_objc_default_synthesize_properties); 19183d145f660a23d5bdabdd1ead83c51f3df1489b09Fariborz Jahanian Opts.EncodeExtendedBlockSig = 19193d145f660a23d5bdabdd1ead83c51f3df1489b09Fariborz Jahanian Args.hasArg(OPT_fencode_extended_block_signature); 192056ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls); 1921b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner Opts.PackStruct = getLastArgIntValue(Args, OPT_fpack_struct_EQ, 0, Diags); 1922176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Opts.MaxTypeAlign = getLastArgIntValue(Args, OPT_fmax_type_align_EQ, 0, Diags); 19234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.AlignDouble = Args.hasArg(OPT_malign_double); 1924b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags); 19254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.PIE = Args.hasArg(OPT_pic_is_pie); 192656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.Static = Args.hasArg(OPT_static_define); 1927453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor Opts.DumpRecordLayoutsSimple = Args.hasArg(OPT_fdump_record_layouts_simple); 192887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.DumpRecordLayouts = Opts.DumpRecordLayoutsSimple 1929453dbcbe30093fbf947a0bec2fbd46e9694eafe9Douglas Gregor || Args.hasArg(OPT_fdump_record_layouts); 1930046c294a43024874ff35656c6e785b64e72f1f36Anders Carlsson Opts.DumpVTableLayouts = Args.hasArg(OPT_fdump_vtable_layouts); 1931a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor Opts.SpellChecking = !Args.hasArg(OPT_fno_spell_checking); 1932fb937b8c5f1c5dc9cfd4223b5cae230cc42b0287Daniel Dunbar Opts.NoBitFieldTypeAlign = Args.hasArg(OPT_fno_bitfield_type_align); 19330982136cb748f4a842141bf199d133126d6be882Peter Collingbourne Opts.SinglePrecisionConstants = Args.hasArg(OPT_cl_single_precision_constant); 1934f0840820b4e28fd0cc04d737382811d7372cb832Peter Collingbourne Opts.FastRelaxedMath = Args.hasArg(OPT_cl_fast_relaxed_math); 19359631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum Opts.HexagonQdsp6Compat = Args.hasArg(OPT_mqdsp6_compat); 1936207f4d8543529221932af82836016a2ef066c917Peter Collingbourne Opts.FakeAddressSpaceMap = Args.hasArg(OPT_ffake_address_space_map); 1937a5fc472b353b88be3b4981da946fb01f5a5cc0c6John McCall Opts.ParseUnknownAnytype = Args.hasArg(OPT_funknown_anytype); 193848218c60d6b53b7880917d1366ee716dec2145caJohn McCall Opts.DebuggerSupport = Args.hasArg(OPT_fdebugger_support); 193950a9a12d4f7387bcff3213d4b56e74bab9f4f5d2Sean Callanan Opts.DebuggerCastResultToId = Args.hasArg(OPT_fdebugger_cast_result_to_id); 194030660a898545416f0fea2d717f16f75640001e38Ted Kremenek Opts.DebuggerObjCLiteral = Args.hasArg(OPT_fdebugger_objc_literal); 194119bda3ad8b5d37e505214e82fab1d0a0bf00f0fdEli Friedman Opts.ApplePragmaPack = Args.hasArg(OPT_fapple_pragma_pack); 19424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.CurrentModule = Args.getLastArgValue(OPT_fmodule_name_EQ); 19433ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Opts.AppExt = Args.hasArg(OPT_fapplication_extension); 19440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.ModuleFeatures = Args.getAllArgValues(OPT_fmodule_feature); 194587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::sort(Opts.ModuleFeatures.begin(), Opts.ModuleFeatures.end()); 1946e9a54b6cc25f564aa5c99b62e888e484cede3959Pirama Arumuga Nainar Opts.NativeHalfType |= Args.hasArg(OPT_fnative_half_type); 19471567b306a9c2a37c909046959f661092a3c04a76Pirama Arumuga Nainar Opts.NativeHalfArgsAndReturns |= Args.hasArg(OPT_fnative_half_arguments_and_returns); 19481567b306a9c2a37c909046959f661092a3c04a76Pirama Arumuga Nainar // Enable HalfArgsAndReturns if present in Args or if NativeHalfArgsAndReturns 19491567b306a9c2a37c909046959f661092a3c04a76Pirama Arumuga Nainar // is enabled. 19501567b306a9c2a37c909046959f661092a3c04a76Pirama Arumuga Nainar Opts.HalfArgsAndReturns = Args.hasArg(OPT_fallow_half_arguments_and_returns) 19511567b306a9c2a37c909046959f661092a3c04a76Pirama Arumuga Nainar | Opts.NativeHalfArgsAndReturns; 19520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.GNUAsm = !Args.hasArg(OPT_fno_gnu_inline_asm); 1953176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 195487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // __declspec is enabled by default for the PS4 by the driver, and also 195587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // enabled for Microsoft Extensions or Borland Extensions, here. 195687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // 195787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // FIXME: __declspec is also currently enabled for CUDA, but isn't really a 195887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // CUDA extension, however it is required for supporting cuda_builtin_vars.h, 195987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // which uses __declspec(property). Once that has been rewritten in terms of 196087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // something more generic, remove the Opts.CUDA term here. 196187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.DeclSpecKeyword = 196287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Args.hasFlag(OPT_fdeclspec, OPT_fno_declspec, 196387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar (Opts.MicrosoftExt || Opts.Borland || Opts.CUDA)); 196487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 1965b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // For now, we only support local submodule visibility in C++ (because we 1966b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // heavily depend on the ODR for merging redefinitions). 1967b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (Opts.ModulesLocalVisibility && !Opts.CPlusPlus) 1968b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Diags.Report(diag::err_drv_argument_not_allowed_with) 1969b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar << "-fmodules-local-submodule-visibility" << "C"; 1970b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 19711eef85246b411b55c493098266746d0d83c241eaDavid Tweed if (Arg *A = Args.getLastArg(OPT_faddress_space_map_mangling_EQ)) { 19721eef85246b411b55c493098266746d0d83c241eaDavid Tweed switch (llvm::StringSwitch<unsigned>(A->getValue()) 19731eef85246b411b55c493098266746d0d83c241eaDavid Tweed .Case("target", LangOptions::ASMM_Target) 19741eef85246b411b55c493098266746d0d83c241eaDavid Tweed .Case("no", LangOptions::ASMM_Off) 19751eef85246b411b55c493098266746d0d83c241eaDavid Tweed .Case("yes", LangOptions::ASMM_On) 19761eef85246b411b55c493098266746d0d83c241eaDavid Tweed .Default(255)) { 19771eef85246b411b55c493098266746d0d83c241eaDavid Tweed default: 197887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Diags.Report(diag::err_drv_invalid_value) 19791eef85246b411b55c493098266746d0d83c241eaDavid Tweed << "-faddress-space-map-mangling=" << A->getValue(); 19801eef85246b411b55c493098266746d0d83c241eaDavid Tweed break; 19811eef85246b411b55c493098266746d0d83c241eaDavid Tweed case LangOptions::ASMM_Target: 19821eef85246b411b55c493098266746d0d83c241eaDavid Tweed Opts.setAddressSpaceMapMangling(LangOptions::ASMM_Target); 19831eef85246b411b55c493098266746d0d83c241eaDavid Tweed break; 19841eef85246b411b55c493098266746d0d83c241eaDavid Tweed case LangOptions::ASMM_On: 19851eef85246b411b55c493098266746d0d83c241eaDavid Tweed Opts.setAddressSpaceMapMangling(LangOptions::ASMM_On); 19861eef85246b411b55c493098266746d0d83c241eaDavid Tweed break; 19871eef85246b411b55c493098266746d0d83c241eaDavid Tweed case LangOptions::ASMM_Off: 19881eef85246b411b55c493098266746d0d83c241eaDavid Tweed Opts.setAddressSpaceMapMangling(LangOptions::ASMM_Off); 19891eef85246b411b55c493098266746d0d83c241eaDavid Tweed break; 19901eef85246b411b55c493098266746d0d83c241eaDavid Tweed } 19911eef85246b411b55c493098266746d0d83c241eaDavid Tweed } 19921eef85246b411b55c493098266746d0d83c241eaDavid Tweed 1993651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Arg *A = Args.getLastArg(OPT_fms_memptr_rep_EQ)) { 1994651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LangOptions::PragmaMSPointersToMembersKind InheritanceModel = 1995651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::StringSwitch<LangOptions::PragmaMSPointersToMembersKind>( 1996651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines A->getValue()) 1997651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .Case("single", 1998651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LangOptions::PPTMK_FullGeneralitySingleInheritance) 1999651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .Case("multiple", 2000651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LangOptions::PPTMK_FullGeneralityMultipleInheritance) 2001651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .Case("virtual", 2002651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LangOptions::PPTMK_FullGeneralityVirtualInheritance) 2003651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .Default(LangOptions::PPTMK_BestCase); 2004651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (InheritanceModel == LangOptions::PPTMK_BestCase) 2005651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Diags.Report(diag::err_drv_invalid_value) 2006651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines << "-fms-memptr-rep=" << A->getValue(); 2007651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2008651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Opts.setMSPointerToMemberRepresentationMethod(InheritanceModel); 2009651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 2010651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 20114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Check for MS default calling conventions being specified. 20124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Arg *A = Args.getLastArg(OPT_fdefault_calling_conv_EQ)) { 20134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar LangOptions::DefaultCallingConvention DefaultCC = 20144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::StringSwitch<LangOptions::DefaultCallingConvention>( 20154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar A->getValue()) 20164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("cdecl", LangOptions::DCC_CDecl) 20174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("fastcall", LangOptions::DCC_FastCall) 20184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("stdcall", LangOptions::DCC_StdCall) 20194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("vectorcall", LangOptions::DCC_VectorCall) 20204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Default(LangOptions::DCC_None); 20214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (DefaultCC == LangOptions::DCC_None) 20224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Diags.Report(diag::err_drv_invalid_value) 20234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar << "-fdefault-calling-conv=" << A->getValue(); 20244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 20254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::Triple T(TargetOpts.Triple); 20264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::Triple::ArchType Arch = T.getArch(); 20274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool emitError = (DefaultCC == LangOptions::DCC_FastCall || 20284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DefaultCC == LangOptions::DCC_StdCall) && 20294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Arch != llvm::Triple::x86; 20304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar emitError |= DefaultCC == LangOptions::DCC_VectorCall && 20314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar !(Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64); 20324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (emitError) 20334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Diags.Report(diag::err_drv_argument_not_allowed_with) 20344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar << A->getSpelling() << T.getTriple(); 20354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else 20364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.setDefaultCallingConv(DefaultCC); 20374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 20384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 20394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // -mrtd option 20404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Arg *A = Args.getLastArg(OPT_mrtd)) { 20414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Opts.getDefaultCallingConv() != LangOptions::DCC_None) 20424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Diags.Report(diag::err_drv_argument_not_allowed_with) 20434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar << A->getSpelling() << "-fdefault-calling-conv"; 20444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else { 20454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::Triple T(TargetOpts.Triple); 20464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T.getArch() != llvm::Triple::x86) 20474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Diags.Report(diag::err_drv_argument_not_allowed_with) 20484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar << A->getSpelling() << T.getTriple(); 20494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else 20504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.setDefaultCallingConv(LangOptions::DCC_StdCall); 20514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 20524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 20534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2054b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // Check if -fopenmp is specified. 20554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.OpenMP = Args.hasArg(options::OPT_fopenmp) ? 1 : 0; 205687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.OpenMPUseTLS = 205787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.OpenMP && !Args.hasArg(options::OPT_fnoopenmp_use_tls); 20584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.OpenMPIsDevice = 20594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_is_device); 20604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 20614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Opts.OpenMP) { 20624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar int Version = 20634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar getLastArgIntValue(Args, OPT_fopenmp_version_EQ, Opts.OpenMP, Diags); 20644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Version != 0) 20654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.OpenMP = Version; 20664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Provide diagnostic when a given target is not expected to be an OpenMP 20674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // device or host. 20684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!Opts.OpenMPIsDevice) { 20694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar switch (T.getArch()) { 20704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar default: 20714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 20724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Add unsupported host targets here: 20734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case llvm::Triple::nvptx: 20744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case llvm::Triple::nvptx64: 20754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Diags.Report(clang::diag::err_drv_omp_host_target_not_supported) 20764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar << TargetOpts.Triple; 20774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 20784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 20794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 20804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 20814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 20824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Get the OpenMP target triples if any. 20834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Arg *A = Args.getLastArg(options::OPT_fopenmp_targets_EQ)) { 20844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 20854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (unsigned i = 0; i < A->getNumValues(); ++i) { 20864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::Triple TT(A->getValue(i)); 20874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 20884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (TT.getArch() == llvm::Triple::UnknownArch) 20894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Diags.Report(clang::diag::err_drv_invalid_omp_target) << A->getValue(i); 20904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else 20914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.OMPTargetTriples.push_back(TT); 20924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 20934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 20944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 20954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Get OpenMP host file path if any and report if a non existent file is 20964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // found 20974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Arg *A = Args.getLastArg(options::OPT_fopenmp_host_ir_file_path)) { 20984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.OMPHostIRFile = A->getValue(); 20994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!llvm::sys::fs::exists(Opts.OMPHostIRFile)) 21004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Diags.Report(clang::diag::err_drv_omp_host_ir_file_not_found) 21014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar << Opts.OMPHostIRFile; 21024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 210350a70cd11801fd9a700d06e447095249c34c261fDouglas Gregor 21041cfe3c305c0d5393fd94167808b8f5d96cd65227Chandler Carruth // Record whether the __DEPRECATED define was requested. 21051cfe3c305c0d5393fd94167808b8f5d96cd65227Chandler Carruth Opts.Deprecated = Args.hasFlag(OPT_fdeprecated_macro, 21061cfe3c305c0d5393fd94167808b8f5d96cd65227Chandler Carruth OPT_fno_deprecated_macro, 21071cfe3c305c0d5393fd94167808b8f5d96cd65227Chandler Carruth Opts.Deprecated); 21081cfe3c305c0d5393fd94167808b8f5d96cd65227Chandler Carruth 210956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar // FIXME: Eliminate this dependency. 2110f23e8d2b928b0baa361dbf34df10862a5bcd01c4Dylan Noblesmith unsigned Opt = getOptimizationLevel(Args, IK, Diags), 211105422365baa8e603237f865e0de52f73f8b77235Chad Rosier OptSize = getOptimizationLevelSize(Args); 211256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.Optimize = Opt != 0; 2113f23e8d2b928b0baa361dbf34df10862a5bcd01c4Dylan Noblesmith Opts.OptimizeSize = OptSize != 0; 211456ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 211556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar // This is the __NO_INLINE__ define, which just depends on things like the 211656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar // optimization level and -fno-inline, not actually whether the backend has 211756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar // inlining enabled. 2118fc055f943d154c9b7463f43a3b59e093723362c9Chad Rosier Opts.NoInlineDefine = !Opt || Args.hasArg(OPT_fno_inline); 211956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 21200e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.FastMath = Args.hasArg(OPT_ffast_math) || 21210e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Args.hasArg(OPT_cl_fast_relaxed_math); 21220e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.FiniteMathOnly = Args.hasArg(OPT_ffinite_math_only) || 21230e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Args.hasArg(OPT_cl_finite_math_only) || 21240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Args.hasArg(OPT_cl_fast_relaxed_math); 212587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts.UnsafeFPMath = Args.hasArg(OPT_menable_unsafe_fp_math) || 212687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Args.hasArg(OPT_cl_unsafe_math_optimizations) || 212787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Args.hasArg(OPT_cl_fast_relaxed_math); 2128abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth 2129127ff2ea6440c3da4b47f9c8b3b190254a97e7b5Ted Kremenek Opts.RetainCommentsFromSystemHeaders = 2130127ff2ea6440c3da4b47f9c8b3b190254a97e7b5Ted Kremenek Args.hasArg(OPT_fretain_comments_from_system_headers); 2131127ff2ea6440c3da4b47f9c8b3b190254a97e7b5Ted Kremenek 2132b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags); 213356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar switch (SSP) { 213456ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar default: 213556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Diags.Report(diag::err_drv_invalid_value) 213656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP; 213756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar break; 2138e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor case 0: Opts.setStackProtector(LangOptions::SSPOff); break; 2139e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor case 1: Opts.setStackProtector(LangOptions::SSPOn); break; 2140651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case 2: Opts.setStackProtector(LangOptions::SSPStrong); break; 2141651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case 3: Opts.setStackProtector(LangOptions::SSPReq); break; 214256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar } 2143c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith 2144c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith // Parse -fsanitize= arguments. 21450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines parseSanitizerKinds("-fsanitize=", Args.getAllArgValues(OPT_fsanitize_EQ), 21460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Diags, Opts.Sanitize); 2147176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // -fsanitize-address-field-padding=N has to be a LangOpt, parse it here. 2148176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Opts.SanitizeAddressFieldPadding = 2149176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines getLastArgIntValue(Args, OPT_fsanitize_address_field_padding, 0, Diags); 21500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.SanitizerBlacklistFiles = Args.getAllArgValues(OPT_fsanitize_blacklist); 215156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar} 215256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 2153e14b5f5237d0740c2b21c50b2eb41a06e778d820Daniel Dunbarstatic void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args, 2154389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis FileManager &FileMgr, 2155d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine &Diags) { 2156bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy using namespace options; 215703e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Opts.ImplicitPCHInclude = Args.getLastArgValue(OPT_include_pch); 215803e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Opts.ImplicitPTHInclude = Args.getLastArgValue(OPT_include_pth); 215956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar if (const Arg *A = Args.getLastArg(OPT_token_cache)) 21601d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith Opts.TokenCache = A->getValue(); 216156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar else 216256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.TokenCache = Opts.ImplicitPTHInclude; 216356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.UsePredefines = !Args.hasArg(OPT_undef); 216494dc8f640ebea52241412512ed48601626edbc58Douglas Gregor Opts.DetailedRecord = Args.hasArg(OPT_detailed_preprocessing_record); 2165fae3b2f4743dad616623c4df2fdb0f5128bd36d9Douglas Gregor Opts.DisablePCHValidation = Args.hasArg(OPT_fno_validate_pch); 21663e78593b1ced32b7e0a97da044213014ee0f6f7cArgyrios Kyrtzidis 2167b972858068d2ea77f72a1e7b1812b196afd6be2eArgyrios Kyrtzidis Opts.DumpDeserializedPCHDecls = Args.hasArg(OPT_dump_deserialized_pch_decls); 2168b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Arg *A : Args.filtered(OPT_error_on_deserialized_pch_decl)) 21691d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith Opts.DeserializedPCHDeclsToErrorOn.insert(A->getValue()); 2170fae3b2f4743dad616623c4df2fdb0f5128bd36d9Douglas Gregor 2171f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor if (const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) { 21721d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef Value(A->getValue()); 2173f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor size_t Comma = Value.find(','); 2174f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor unsigned Bytes = 0; 2175f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor unsigned EndOfLine = 0; 217620249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 21775f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner if (Comma == StringRef::npos || 2178f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor Value.substr(0, Comma).getAsInteger(10, Bytes) || 2179f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor Value.substr(Comma + 1).getAsInteger(10, EndOfLine)) 2180f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor Diags.Report(diag::err_drv_preamble_format); 2181f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor else { 2182f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor Opts.PrecompiledPreambleBytes.first = Bytes; 2183f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor Opts.PrecompiledPreambleBytes.second = (EndOfLine != 0); 2184f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor } 2185f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor } 218620249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 218756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar // Add macros from the command line. 2188b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Arg *A : Args.filtered(OPT_D, OPT_U)) { 2189b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (A->getOption().matches(OPT_D)) 2190b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.addMacroDef(A->getValue()); 219156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar else 2192b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.addMacroUndef(A->getValue()); 219356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar } 219456ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 219503e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Opts.MacroIncludes = Args.getAllArgValues(OPT_imacros); 219656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 219756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar // Add the ordered list of -includes. 2198b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Arg *A : Args.filtered(OPT_include)) 2199b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.Includes.emplace_back(A->getValue()); 2200e14b5f5237d0740c2b21c50b2eb41a06e778d820Daniel Dunbar 2201b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Arg *A : Args.filtered(OPT_chain_include)) 2202b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.ChainedIncludes.emplace_back(A->getValue()); 2203b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis 2204b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Arg *A : Args.filtered(OPT_remap_file)) { 2205b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar std::pair<StringRef, StringRef> Split = StringRef(A->getValue()).split(';'); 2206e14b5f5237d0740c2b21c50b2eb41a06e778d820Daniel Dunbar 2207e14b5f5237d0740c2b21c50b2eb41a06e778d820Daniel Dunbar if (Split.second.empty()) { 22087e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar Diags.Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args); 2209e14b5f5237d0740c2b21c50b2eb41a06e778d820Daniel Dunbar continue; 2210e14b5f5237d0740c2b21c50b2eb41a06e778d820Daniel Dunbar } 2211e14b5f5237d0740c2b21c50b2eb41a06e778d820Daniel Dunbar 2212e14b5f5237d0740c2b21c50b2eb41a06e778d820Daniel Dunbar Opts.addRemappedFile(Split.first, Split.second); 2213e14b5f5237d0740c2b21c50b2eb41a06e778d820Daniel Dunbar } 2214b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 2215f85e193739c953358c865005855253af4f68a497John McCall if (Arg *A = Args.getLastArg(OPT_fobjc_arc_cxxlib_EQ)) { 22161d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef Name = A->getValue(); 2217f85e193739c953358c865005855253af4f68a497John McCall unsigned Library = llvm::StringSwitch<unsigned>(Name) 2218f85e193739c953358c865005855253af4f68a497John McCall .Case("libc++", ARCXX_libcxx) 2219f85e193739c953358c865005855253af4f68a497John McCall .Case("libstdc++", ARCXX_libstdcxx) 2220f85e193739c953358c865005855253af4f68a497John McCall .Case("none", ARCXX_nolib) 2221f85e193739c953358c865005855253af4f68a497John McCall .Default(~0U); 2222f85e193739c953358c865005855253af4f68a497John McCall if (Library == ~0U) 2223f85e193739c953358c865005855253af4f68a497John McCall Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name; 2224f85e193739c953358c865005855253af4f68a497John McCall else 2225f85e193739c953358c865005855253af4f68a497John McCall Opts.ObjCXXARCStandardLibrary = (ObjCXXARCStandardLibraryKind)Library; 2226f85e193739c953358c865005855253af4f68a497John McCall } 222756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar} 222856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 222956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbarstatic void ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts, 223074c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose ArgList &Args, 223174c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose frontend::ActionKind Action) { 2232bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy using namespace options; 223374c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose 223474c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose switch (Action) { 223574c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::ASTDeclList: 223674c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::ASTDump: 223774c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::ASTPrint: 223874c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::ASTView: 223974c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::EmitAssembly: 224074c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::EmitBC: 224174c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::EmitHTML: 224274c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::EmitLLVM: 224374c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::EmitLLVMOnly: 224474c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::EmitCodeGenOnly: 224574c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::EmitObj: 224674c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::FixIt: 224774c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::GenerateModule: 224874c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::GeneratePCH: 224974c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::GeneratePTH: 225074c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::ParseSyntaxOnly: 2251c544ba09695e300f31355af342258bd57619e737Douglas Gregor case frontend::ModuleFileInfo: 2252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case frontend::VerifyPCH: 225374c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::PluginAction: 225474c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::PrintDeclContext: 225574c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::RewriteObjC: 225674c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::RewriteTest: 225774c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::RunAnalysis: 225874c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::MigrateSource: 225974c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose Opts.ShowCPP = 0; 226074c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose break; 226174c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose 226274c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::DumpRawTokens: 226374c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::DumpTokens: 226474c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::InitOnly: 226574c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::PrintPreamble: 226674c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::PrintPreprocessedInput: 226774c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::RewriteMacros: 226874c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose case frontend::RunPreprocessorOnly: 226974c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose Opts.ShowCPP = !Args.hasArg(OPT_dM); 227074c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose break; 227174c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose } 227274c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose 227356ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ShowComments = Args.hasArg(OPT_C); 2274f7c16d903f11814e2d6780e2a2e189b7a7afc4edDaniel Dunbar Opts.ShowLineMarkers = !Args.hasArg(OPT_P); 227556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Opts.ShowMacroComments = Args.hasArg(OPT_CC); 2276f7c16d903f11814e2d6780e2a2e189b7a7afc4edDaniel Dunbar Opts.ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD); 2277f1492f970c7c6eb85dc18f13fb864b185bed1d23David Blaikie Opts.RewriteIncludes = Args.hasArg(OPT_frewrite_includes); 22780e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Opts.UseLineDirectives = Args.hasArg(OPT_fuse_line_directives); 227956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar} 228056ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 22814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic void ParseTargetArgs(TargetOptions &Opts, ArgList &Args, 22824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DiagnosticsEngine &Diags) { 2283bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy using namespace options; 228403e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Opts.ABI = Args.getLastArgValue(OPT_target_abi); 22854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Arg *A = Args.getLastArg(OPT_meabi)) { 22864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StringRef Value = A->getValue(); 22874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::EABI EABIVersion = llvm::StringSwitch<llvm::EABI>(Value) 22884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("default", llvm::EABI::Default) 22894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("4", llvm::EABI::EABI4) 22904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("5", llvm::EABI::EABI5) 22914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Case("gnu", llvm::EABI::GNU) 22924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .Default(llvm::EABI::Unknown); 22934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (EABIVersion == llvm::EABI::Unknown) 22944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) 22954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar << Value; 22964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else 22974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Opts.EABIVersion = Value; 22984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 229903e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar Opts.CPU = Args.getLastArgValue(OPT_target_cpu); 23005389b84a780ac17b63c10ad97cd5e3aaa41595b7Rafael Espindola Opts.FPMath = Args.getLastArgValue(OPT_mfpmath); 230157016dda61498294120b1a881d9e6606337b29d9Douglas Gregor Opts.FeaturesAsWritten = Args.getAllArgValues(OPT_target_feature); 230239065a5494613952b4810d1d6b28348cef155e12Daniel Dunbar Opts.LinkerVersion = Args.getLastArgValue(OPT_target_linker_version); 23032dc14532b641bae011a374e2c6c393d2196c1411Duncan Sands Opts.Triple = llvm::Triple::normalize(Args.getLastArgValue(OPT_triple)); 2304b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Opts.Reciprocals = Args.getAllArgValues(OPT_mrecip_EQ); 23055d8b9548420e67f1bf45b7bbc1cf9fb86e9e4505Sebastian Pop // Use the default target triple if unspecified. 230656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar if (Opts.Triple.empty()) 23075d8b9548420e67f1bf45b7bbc1cf9fb86e9e4505Sebastian Pop Opts.Triple = llvm::sys::getDefaultTargetTriple(); 230856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar} 230956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 23108fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmithbool CompilerInvocation::CreateFromArgs(CompilerInvocation &Res, 231139b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner const char *const *ArgBegin, 231239b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner const char *const *ArgEnd, 2313d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine &Diags) { 23148fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith bool Success = true; 23158fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith 231656ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar // Parse the arguments. 2317651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::unique_ptr<OptTable> Opts(createDriverOptTable()); 23184ed47ccf892de9b725f64d6cfc309f0461105ba5Hans Wennborg const unsigned IncludedFlagsBitmask = options::CC1Option; 231956ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar unsigned MissingArgIndex, MissingArgCount; 232087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar InputArgList Args = 232187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Opts->ParseArgs(llvm::makeArrayRef(ArgBegin, ArgEnd), MissingArgIndex, 232287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar MissingArgCount, IncludedFlagsBitmask); 23234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar LangOptions &LangOpts = *Res.getLangOpts(); 232456ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 232556ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar // Check for missing argument error. 23268fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith if (MissingArgCount) { 232756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar Diags.Report(diag::err_drv_missing_argument) 232887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar << Args.getArgString(MissingArgIndex) << MissingArgCount; 23298fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith Success = false; 23308fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith } 233156ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 233256ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar // Issue errors on unknown arguments. 233387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const Arg *A : Args.filtered(OPT_UNKNOWN)) { 233487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Diags.Report(diag::err_drv_unknown_argument) << A->getAsString(Args); 23358fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith Success = false; 23368fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith } 233756ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar 233887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Success &= ParseAnalyzerArgs(*Res.getAnalyzerOpts(), Args, Diags); 233987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Success &= ParseMigratorArgs(Res.getMigratorOpts(), Args); 234087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ParseDependencyOutputArgs(Res.getDependencyOutputOpts(), Args); 23414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Success &= ParseDiagnosticArgs(Res.getDiagnosticOpts(), Args, &Diags, 23424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar false /*DefaultDiagColor*/); 23434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ParseCommentArgs(LangOpts.CommentOpts, Args); 234487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ParseFileSystemArgs(Res.getFileSystemOpts(), Args); 23450a3c03cb1fbc1f84f851d6ad642d22b978b031fdPeter Collingbourne // FIXME: We shouldn't have to pass the DashX option around here 234687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar InputKind DashX = ParseFrontendArgs(Res.getFrontendOpts(), Args, Diags); 23474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ParseTargetArgs(Res.getTargetOpts(), Args, Diags); 234887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Success &= ParseCodeGenArgs(Res.getCodeGenOpts(), Args, DashX, Diags, 2349b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Res.getTargetOpts()); 235087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), Args); 235187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (DashX == IK_AST || DashX == IK_LLVM_IR) { 235287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // ObjCAAutoRefCount and Sanitize LangOpts are used to setup the 235387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // PassManager in BackendUtil.cpp. They need to be initializd no matter 235487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // what the input type is. 235587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Args.hasArg(OPT_fobjc_arc)) 23564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar LangOpts.ObjCAutoRefCount = 1; 23574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // PIClevel and PIELevel are needed during code generation and this should be 23584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // set regardless of the input type. 23594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar LangOpts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags); 23604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar LangOpts.PIE = Args.hasArg(OPT_pic_is_pie); 236187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar parseSanitizerKinds("-fsanitize=", Args.getAllArgValues(OPT_fsanitize_EQ), 23624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Diags, LangOpts.Sanitize); 236387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } else { 236487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Other LangOpts are only initialzed when the input is not AST or LLVM IR. 23654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ParseLangArgs(LangOpts, Args, DashX, Res.getTargetOpts(), 23664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Res.getPreprocessorOpts(), Diags); 2367e293d30e858e38f2bb028c37ecac2178f8d78aa9Fariborz Jahanian if (Res.getFrontendOpts().ProgramAction == frontend::RewriteObjC) 23684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar LangOpts.ObjCExceptions = 1; 2369e293d30e858e38f2bb028c37ecac2178f8d78aa9Fariborz Jahanian } 23704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 23714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (LangOpts.CUDA) { 23724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // During CUDA device-side compilation, the aux triple is the 23734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // triple used for host compilation. 23744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (LangOpts.CUDAIsDevice) 23754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Res.getTargetOpts().HostTriple = Res.getFrontendOpts().AuxTriple; 23764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 23774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Set default FP_CONTRACT to FAST. 23784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!Args.hasArg(OPT_ffp_contract)) 23794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Res.getCodeGenOpts().setFPContractMode(CodeGenOptions::FPC_Fast); 23804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 23814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 23824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // FIXME: Override value name discarding when asan or msan is used because the 23834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // backend passes depend on the name of the alloca in order to print out 23844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // names. 23854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Res.getCodeGenOpts().DiscardValueNames &= 23864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar !LangOpts.Sanitize.has(SanitizerKind::Address) && 23874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar !LangOpts.Sanitize.has(SanitizerKind::Memory); 23884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2389389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis // FIXME: ParsePreprocessorArgs uses the FileManager to read the contents of 2390389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis // PCH file and find the original header name. Remove the need to do that in 239187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // ParsePreprocessorArgs and remove the FileManager 2392389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis // parameters from the function and the "FileManager.h" #include. 23937ad97ffa631af6ad678c79b38341ac995f347ce9Chris Lattner FileManager FileMgr(Res.getFileSystemOpts()); 239487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ParsePreprocessorArgs(Res.getPreprocessorOpts(), Args, FileMgr, Diags); 239587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ParsePreprocessorOutputArgs(Res.getPreprocessorOutputOpts(), Args, 239674c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose Res.getFrontendOpts().ProgramAction); 23978fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith return Success; 239856ac85c4fd18ee4af27c81b0ce11b2191461a0a5Daniel Dunbar} 23996e975c4517958bcc11c834336d340797356058dbDouglas Gregor 24006e975c4517958bcc11c834336d340797356058dbDouglas Gregorstd::string CompilerInvocation::getModuleHash() const { 2401c544ba09695e300f31355af342258bd57619e737Douglas Gregor // Note: For QoI reasons, the things we use as a hash here should all be 2402c544ba09695e300f31355af342258bd57619e737Douglas Gregor // dumped via the -module-info flag. 2403984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor using llvm::hash_code; 2404984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor using llvm::hash_value; 2405984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor using llvm::hash_combine; 2406984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor 24076e975c4517958bcc11c834336d340797356058dbDouglas Gregor // Start the signature with the compiler version. 24083043175274899e086c8664fe64c8fb4b9eacb733Douglas Gregor // FIXME: We'd rather use something more cryptographically sound than 2409984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor // CityHash, but this will do for now. 2410984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor hash_code code = hash_value(getClangFullRepositoryVersion()); 2411984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor 24126e975c4517958bcc11c834336d340797356058dbDouglas Gregor // Extend the signature with the language options 24136e975c4517958bcc11c834336d340797356058dbDouglas Gregor#define LANGOPT(Name, Bits, Default, Description) \ 2414984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor code = hash_combine(code, LangOpts->Name); 24156e975c4517958bcc11c834336d340797356058dbDouglas Gregor#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 2416984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor code = hash_combine(code, static_cast<unsigned>(LangOpts->get##Name())); 24176e975c4517958bcc11c834336d340797356058dbDouglas Gregor#define BENIGN_LANGOPT(Name, Bits, Default, Description) 24186e975c4517958bcc11c834336d340797356058dbDouglas Gregor#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) 24196e975c4517958bcc11c834336d340797356058dbDouglas Gregor#include "clang/Basic/LangOptions.def" 242087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 242187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (StringRef Feature : LangOpts->ModuleFeatures) 242287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar code = hash_combine(code, Feature); 242387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 2424984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor // Extend the signature with the target options. 2425984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor code = hash_combine(code, TargetOpts->Triple, TargetOpts->CPU, 24266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TargetOpts->ABI); 2427984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor for (unsigned i = 0, n = TargetOpts->FeaturesAsWritten.size(); i != n; ++i) 2428984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor code = hash_combine(code, TargetOpts->FeaturesAsWritten[i]); 24296e975c4517958bcc11c834336d340797356058dbDouglas Gregor 2430815759cb08d5b91e2585b200bcf20822e0d422adDouglas Gregor // Extend the signature with preprocessor options. 2431984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor const PreprocessorOptions &ppOpts = getPreprocessorOpts(); 24322a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor const HeaderSearchOptions &hsOpts = getHeaderSearchOpts(); 2433984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor code = hash_combine(code, ppOpts.UsePredefines, ppOpts.DetailedRecord); 2434984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor 243587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (std::vector<std::pair<std::string, bool/*isUndef*/>>::const_iterator 243605edf668f0984bfa2994ddc8bb7b78d9fb24cf11Douglas Gregor I = getPreprocessorOpts().Macros.begin(), 243705edf668f0984bfa2994ddc8bb7b78d9fb24cf11Douglas Gregor IEnd = getPreprocessorOpts().Macros.end(); 243805edf668f0984bfa2994ddc8bb7b78d9fb24cf11Douglas Gregor I != IEnd; ++I) { 24392a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor // If we're supposed to ignore this macro for the purposes of modules, 24402a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor // don't put it into the hash. 24412a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor if (!hsOpts.ModulesIgnoreMacros.empty()) { 24422a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor // Check whether we're ignoring this macro. 2443005d51bc4f16a7b330e13082d186b72953bde581Douglas Gregor StringRef MacroDef = I->first; 2444005d51bc4f16a7b330e13082d186b72953bde581Douglas Gregor if (hsOpts.ModulesIgnoreMacros.count(MacroDef.split('=').first)) 24452a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor continue; 24462a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor } 24472a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor 2448984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor code = hash_combine(code, I->first, I->second); 244905edf668f0984bfa2994ddc8bb7b78d9fb24cf11Douglas Gregor } 2450984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor 24514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Extend the signature with the sysroot and other header search options. 24524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar code = hash_combine(code, hsOpts.Sysroot, 24534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar hsOpts.ModuleFormat, 24544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar hsOpts.UseDebugInfo, 24554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar hsOpts.UseBuiltinIncludes, 2456984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor hsOpts.UseStandardSystemIncludes, 2457984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor hsOpts.UseStandardCXXIncludes, 2458984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor hsOpts.UseLibcxx); 24596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines code = hash_combine(code, hsOpts.ResourceDir); 2460984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor 2461651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Extend the signature with the user build path. 2462651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines code = hash_combine(code, hsOpts.ModuleUserBuildPath); 2463651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 246487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Extend the signature with the module file extensions. 246587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const FrontendOptions &frontendOpts = getFrontendOpts(); 24664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (const auto &ext : frontendOpts.ModuleFileExtensions) { 246787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar code = ext->hashExtension(code); 246887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 246987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 2470d8f681e135ebd536e25a60cdb23f4d531f1f993eDouglas Gregor // Darwin-specific hack: if we have a sysroot, use the contents and 2471d8f681e135ebd536e25a60cdb23f4d531f1f993eDouglas Gregor // modification time of 247231230e6fb3331192b5559cab539344235c715836Douglas Gregor // $sysroot/System/Library/CoreServices/SystemVersion.plist 247331230e6fb3331192b5559cab539344235c715836Douglas Gregor // as part of the module hash. 247431230e6fb3331192b5559cab539344235c715836Douglas Gregor if (!hsOpts.Sysroot.empty()) { 247531230e6fb3331192b5559cab539344235c715836Douglas Gregor SmallString<128> systemVersionFile; 247631230e6fb3331192b5559cab539344235c715836Douglas Gregor systemVersionFile += hsOpts.Sysroot; 247731230e6fb3331192b5559cab539344235c715836Douglas Gregor llvm::sys::path::append(systemVersionFile, "System"); 247831230e6fb3331192b5559cab539344235c715836Douglas Gregor llvm::sys::path::append(systemVersionFile, "Library"); 247931230e6fb3331192b5559cab539344235c715836Douglas Gregor llvm::sys::path::append(systemVersionFile, "CoreServices"); 248031230e6fb3331192b5559cab539344235c715836Douglas Gregor llvm::sys::path::append(systemVersionFile, "SystemVersion.plist"); 2481c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 2482c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> buffer = 24833ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar llvm::MemoryBuffer::getFile(systemVersionFile); 2484c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (buffer) { 248531230e6fb3331192b5559cab539344235c715836Douglas Gregor code = hash_combine(code, buffer.get()->getBuffer()); 2486d8f681e135ebd536e25a60cdb23f4d531f1f993eDouglas Gregor 2487d8f681e135ebd536e25a60cdb23f4d531f1f993eDouglas Gregor struct stat statBuf; 2488d8f681e135ebd536e25a60cdb23f4d531f1f993eDouglas Gregor if (stat(systemVersionFile.c_str(), &statBuf) == 0) 2489d8f681e135ebd536e25a60cdb23f4d531f1f993eDouglas Gregor code = hash_combine(code, statBuf.st_mtime); 249031230e6fb3331192b5559cab539344235c715836Douglas Gregor } 249131230e6fb3331192b5559cab539344235c715836Douglas Gregor } 249231230e6fb3331192b5559cab539344235c715836Douglas Gregor 2493984e2eb52ce97eae001a28e54f36e624e98c12a7Douglas Gregor return llvm::APInt(64, code).toString(36, /*Signed=*/false); 24946e975c4517958bcc11c834336d340797356058dbDouglas Gregor} 2495b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner 2496b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknernamespace clang { 2497b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner 2498651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<typename IntTy> 2499651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic IntTy getLastArgIntValueImpl(const ArgList &Args, OptSpecifier Id, 2500651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IntTy Default, 2501651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DiagnosticsEngine *Diags) { 2502651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IntTy Res = Default; 2503b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner if (Arg *A = Args.getLastArg(Id)) { 2504b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner if (StringRef(A->getValue()).getAsInteger(10, Res)) { 2505b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner if (Diags) 2506b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner Diags->Report(diag::err_drv_invalid_int_value) << A->getAsString(Args) 2507b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner << A->getValue(); 2508b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner } 2509b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner } 2510b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner return Res; 2511b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner} 2512651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2513651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2514651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Declared in clang/Frontend/Utils.h. 2515651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint getLastArgIntValue(const ArgList &Args, OptSpecifier Id, int Default, 2516651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DiagnosticsEngine *Diags) { 2517651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return getLastArgIntValueImpl<int>(Args, Id, Default, Diags); 2518651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 2519651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2520651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesuint64_t getLastArgUInt64Value(const ArgList &Args, OptSpecifier Id, 2521651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines uint64_t Default, 2522651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DiagnosticsEngine *Diags) { 2523651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return getLastArgIntValueImpl<uint64_t>(Args, Id, Default, Diags); 2524651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 2525651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2526651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid BuryPointer(const void *Ptr) { 2527651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // This function may be called only a small fixed amount of times per each 2528651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // invocation, otherwise we do actually have a leak which we want to report. 2529651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If this function is called more than kGraveYardMaxSize times, the pointers 2530651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // will not be properly buried and a leak detector will report a leak, which 2531651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // is what we want in such case. 2532651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static const size_t kGraveYardMaxSize = 16; 2533651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LLVM_ATTRIBUTE_UNUSED static const void *GraveYard[kGraveYardMaxSize]; 2534651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static std::atomic<unsigned> GraveYardSize; 2535651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned Idx = GraveYardSize++; 2536651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Idx >= kGraveYardMaxSize) 2537651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return; 2538651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines GraveYard[Idx] = Ptr; 2539651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 25406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 25416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesIntrusiveRefCntPtr<vfs::FileSystem> 25426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinescreateVFSFromCompilerInvocation(const CompilerInvocation &CI, 25436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DiagnosticsEngine &Diags) { 25446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (CI.getHeaderSearchOpts().VFSOverlayFiles.empty()) 25456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return vfs::getRealFileSystem(); 25466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 25476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IntrusiveRefCntPtr<vfs::OverlayFileSystem> 25486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Overlay(new vfs::OverlayFileSystem(vfs::getRealFileSystem())); 25496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // earlier vfs files are on the bottom 25506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (const std::string &File : CI.getHeaderSearchOpts().VFSOverlayFiles) { 2551c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer = 2552c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines llvm::MemoryBuffer::getFile(File); 2553c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (!Buffer) { 25546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Diags.Report(diag::err_missing_vfs_overlay_file) << File; 25556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return IntrusiveRefCntPtr<vfs::FileSystem>(); 25566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 25576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 25584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar IntrusiveRefCntPtr<vfs::FileSystem> FS = vfs::getVFSFromYAML( 25594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar std::move(Buffer.get()), /*DiagHandler*/ nullptr, File); 2560c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (!FS.get()) { 25616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Diags.Report(diag::err_invalid_vfs_overlay) << File; 25626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return IntrusiveRefCntPtr<vfs::FileSystem>(); 25636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 25646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Overlay->pushOverlay(FS); 25656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 25666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Overlay; 2567b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner} 25686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} // end namespace clang 2569