Home | History | Annotate | Download | only in Frontend
      1 //===--- CompilerInvocation.cpp -------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "clang/Frontend/CompilerInvocation.h"
     11 #include "clang/Basic/Diagnostic.h"
     12 #include "clang/Basic/Version.h"
     13 #include "clang/Basic/FileManager.h"
     14 #include "clang/Driver/Arg.h"
     15 #include "clang/Driver/ArgList.h"
     16 #include "clang/Driver/CC1Options.h"
     17 #include "clang/Driver/DriverDiagnostic.h"
     18 #include "clang/Driver/OptTable.h"
     19 #include "clang/Driver/Option.h"
     20 #include "clang/Frontend/CompilerInvocation.h"
     21 #include "clang/Frontend/LangStandard.h"
     22 #include "clang/Serialization/ASTReader.h"
     23 #include "llvm/ADT/OwningPtr.h"
     24 #include "llvm/ADT/SmallVector.h"
     25 #include "llvm/ADT/StringExtras.h"
     26 #include "llvm/ADT/StringSwitch.h"
     27 #include "llvm/ADT/Triple.h"
     28 #include "llvm/Support/ErrorHandling.h"
     29 #include "llvm/Support/Host.h"
     30 #include "llvm/Support/Path.h"
     31 using namespace clang;
     32 
     33 //===----------------------------------------------------------------------===//
     34 // Initialization.
     35 //===----------------------------------------------------------------------===//
     36 
     37 CompilerInvocationBase::CompilerInvocationBase()
     38   : LangOpts(new LangOptions()) {}
     39 
     40 CompilerInvocationBase::CompilerInvocationBase(const CompilerInvocationBase &X)
     41   : RefCountedBase<CompilerInvocation>(),
     42     LangOpts(new LangOptions(*X.getLangOpts())) {}
     43 
     44 //===----------------------------------------------------------------------===//
     45 // Utility functions.
     46 //===----------------------------------------------------------------------===//
     47 
     48 static const char *getAnalysisStoreName(AnalysisStores Kind) {
     49   switch (Kind) {
     50   default:
     51     llvm_unreachable("Unknown analysis store!");
     52 #define ANALYSIS_STORE(NAME, CMDFLAG, DESC, CREATFN) \
     53   case NAME##Model: return CMDFLAG;
     54 #include "clang/Frontend/Analyses.def"
     55   }
     56 }
     57 
     58 static const char *getAnalysisConstraintName(AnalysisConstraints Kind) {
     59   switch (Kind) {
     60   default:
     61     llvm_unreachable("Unknown analysis constraints!");
     62 #define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
     63   case NAME##Model: return CMDFLAG;
     64 #include "clang/Frontend/Analyses.def"
     65   }
     66 }
     67 
     68 static const char *getAnalysisDiagClientName(AnalysisDiagClients Kind) {
     69   switch (Kind) {
     70   default:
     71     llvm_unreachable("Unknown analysis client!");
     72 #define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN, AUTOCREATE) \
     73   case PD_##NAME: return CMDFLAG;
     74 #include "clang/Frontend/Analyses.def"
     75   }
     76 }
     77 
     78 static const char *getAnalysisPurgeModeName(AnalysisPurgeMode Kind) {
     79   switch (Kind) {
     80   default:
     81     llvm_unreachable("Unknown analysis purge mode!");
     82 #define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \
     83   case NAME: return CMDFLAG;
     84 #include "clang/Frontend/Analyses.def"
     85   }
     86 }
     87 
     88 static const char *getAnalysisIPAModeName(AnalysisIPAMode Kind) {
     89   switch (Kind) {
     90   default:
     91     llvm_unreachable("Unknown analysis ipa mode!");
     92 #define ANALYSIS_IPA(NAME, CMDFLAG, DESC) \
     93   case NAME: return CMDFLAG;
     94 #include "clang/Frontend/Analyses.def"
     95   }
     96 }
     97 
     98 static const char *
     99   getAnalysisInliningModeName(AnalysisInliningMode Kind) {
    100   switch (Kind) {
    101   default:
    102     llvm_unreachable("Unknown analysis inlining mode!");
    103 #define ANALYSIS_INLINE_SELECTION(NAME, CMDFLAG, DESC) \
    104   case NAME: return CMDFLAG;
    105 #include "clang/Frontend/Analyses.def"
    106   }
    107 }
    108 
    109 //===----------------------------------------------------------------------===//
    110 // Serialization (to args)
    111 //===----------------------------------------------------------------------===//
    112 
    113 namespace {
    114   /// ToArgsList - Helper class to create a list of std::strings.
    115   class ToArgsList {
    116     std::vector<std::string> &Res;
    117   public:
    118     explicit ToArgsList(std::vector<std::string> &Res) : Res(Res) {}
    119 
    120     void push_back(StringRef Str) {
    121       // Avoid creating a temporary string.
    122       Res.push_back(std::string());
    123       Res.back().assign(Str.data(), Str.size());
    124     }
    125 
    126     void push_back(StringRef Str1, StringRef Str2) {
    127       push_back(Str1);
    128       push_back(Str2);
    129     }
    130   };
    131 }
    132 
    133 static void AnalyzerOptsToArgs(const AnalyzerOptions &Opts, ToArgsList &Res) {
    134   if (Opts.ShowCheckerHelp)
    135     Res.push_back("-analyzer-checker-help");
    136   if (Opts.AnalysisStoreOpt != RegionStoreModel)
    137     Res.push_back("-analyzer-store",
    138                   getAnalysisStoreName(Opts.AnalysisStoreOpt));
    139   if (Opts.AnalysisConstraintsOpt != RangeConstraintsModel)
    140     Res.push_back("-analyzer-constraints",
    141                   getAnalysisConstraintName(Opts.AnalysisConstraintsOpt));
    142   if (Opts.AnalysisDiagOpt != PD_HTML)
    143     Res.push_back("-analyzer-output",
    144                   getAnalysisDiagClientName(Opts.AnalysisDiagOpt));
    145   if (Opts.AnalysisPurgeOpt != PurgeStmt)
    146     Res.push_back("-analyzer-purge",
    147                   getAnalysisPurgeModeName(Opts.AnalysisPurgeOpt));
    148   if (!Opts.AnalyzeSpecificFunction.empty())
    149     Res.push_back("-analyze-function", Opts.AnalyzeSpecificFunction);
    150   if (Opts.IPAMode != Inlining)
    151     Res.push_back("-analyzer-ipa", getAnalysisIPAModeName(Opts.IPAMode));
    152   if (Opts.InliningMode != NoRedundancy)
    153     Res.push_back("-analyzer-inlining-mode",
    154                   getAnalysisInliningModeName(Opts.InliningMode));
    155 
    156   if (Opts.AnalyzeAll)
    157     Res.push_back("-analyzer-opt-analyze-headers");
    158   if (Opts.AnalyzerDisplayProgress)
    159     Res.push_back("-analyzer-display-progress");
    160   if (Opts.AnalyzeNestedBlocks)
    161     Res.push_back("-analyzer-opt-analyze-nested-blocks");
    162   if (Opts.EagerlyAssume)
    163     Res.push_back("-analyzer-eagerly-assume");
    164   if (Opts.TrimGraph)
    165     Res.push_back("-trim-egraph");
    166   if (Opts.VisualizeEGDot)
    167     Res.push_back("-analyzer-viz-egraph-graphviz");
    168   if (Opts.VisualizeEGUbi)
    169     Res.push_back("-analyzer-viz-egraph-ubigraph");
    170   if (Opts.NoRetryExhausted)
    171     Res.push_back("-analyzer-disable-retry-exhausted");
    172 
    173   for (unsigned i = 0, e = Opts.CheckersControlList.size(); i != e; ++i) {
    174     const std::pair<std::string, bool> &opt = Opts.CheckersControlList[i];
    175     if (opt.second)
    176       Res.push_back("-analyzer-disable-checker");
    177     else
    178       Res.push_back("-analyzer-checker");
    179     Res.push_back(opt.first);
    180   }
    181 }
    182 
    183 static void CodeGenOptsToArgs(const CodeGenOptions &Opts, ToArgsList &Res) {
    184   if (Opts.DebugInfo)
    185     Res.push_back("-g");
    186   if (Opts.DisableLLVMOpts)
    187     Res.push_back("-disable-llvm-optzns");
    188   if (Opts.DisableRedZone)
    189     Res.push_back("-disable-red-zone");
    190   if (Opts.DisableTailCalls)
    191     Res.push_back("-mdisable-tail-calls");
    192   if (!Opts.DebugCompilationDir.empty())
    193     Res.push_back("-fdebug-compilation-dir", Opts.DebugCompilationDir);
    194   if (!Opts.DwarfDebugFlags.empty())
    195     Res.push_back("-dwarf-debug-flags", Opts.DwarfDebugFlags);
    196   if (Opts.ObjCRuntimeHasARC)
    197     Res.push_back("-fobjc-runtime-has-arc");
    198   if (Opts.ObjCRuntimeHasTerminate)
    199     Res.push_back("-fobjc-runtime-has-terminate");
    200   if (Opts.EmitGcovArcs)
    201     Res.push_back("-femit-coverage-data");
    202   if (Opts.EmitGcovNotes)
    203     Res.push_back("-femit-coverage-notes");
    204   if (!Opts.MergeAllConstants)
    205     Res.push_back("-fno-merge-all-constants");
    206   if (Opts.NoCommon)
    207     Res.push_back("-fno-common");
    208   if (Opts.ForbidGuardVariables)
    209     Res.push_back("-fforbid-guard-variables");
    210   if (Opts.UseRegisterSizedBitfieldAccess)
    211     Res.push_back("-fuse-register-sized-bitfield-access");
    212   if (Opts.NoImplicitFloat)
    213     Res.push_back("-no-implicit-float");
    214   if (Opts.OmitLeafFramePointer)
    215     Res.push_back("-momit-leaf-frame-pointer");
    216   if (Opts.OptimizeSize) {
    217     assert(Opts.OptimizationLevel == 2 && "Invalid options!");
    218     Opts.OptimizeSize == 1 ? Res.push_back("-Os") : Res.push_back("-Oz");
    219   } else if (Opts.OptimizationLevel != 0)
    220     Res.push_back("-O" + llvm::utostr(Opts.OptimizationLevel));
    221   if (!Opts.MainFileName.empty())
    222     Res.push_back("-main-file-name", Opts.MainFileName);
    223   if (Opts.NoInfsFPMath)
    224     Res.push_back("-menable-no-infinities");
    225   if (Opts.NoNaNsFPMath)
    226     Res.push_back("-menable-no-nans");
    227   // SimplifyLibCalls is only derived.
    228   // TimePasses is only derived.
    229   // UnitAtATime is unused.
    230   // Inlining is only derived.
    231 
    232   // UnrollLoops is derived, but also accepts an option, no
    233   // harm in pushing it back here.
    234   if (Opts.UnrollLoops)
    235     Res.push_back("-funroll-loops");
    236   if (Opts.DataSections)
    237     Res.push_back("-fdata-sections");
    238   if (Opts.FunctionSections)
    239     Res.push_back("-ffunction-sections");
    240   if (Opts.AsmVerbose)
    241     Res.push_back("-masm-verbose");
    242   if (!Opts.CodeModel.empty())
    243     Res.push_back("-mcode-model", Opts.CodeModel);
    244   if (Opts.CUDAIsDevice)
    245     Res.push_back("-fcuda-is-device");
    246   if (!Opts.CXAAtExit)
    247     Res.push_back("-fno-use-cxa-atexit");
    248   if (Opts.CXXCtorDtorAliases)
    249     Res.push_back("-mconstructor-aliases");
    250   if (Opts.ObjCAutoRefCountExceptions)
    251     Res.push_back("-fobjc-arc-eh");
    252   if (!Opts.DebugPass.empty()) {
    253     Res.push_back("-mdebug-pass", Opts.DebugPass);
    254   }
    255   if (Opts.DisableFPElim)
    256     Res.push_back("-mdisable-fp-elim");
    257   if (!Opts.FloatABI.empty())
    258     Res.push_back("-mfloat-abi", Opts.FloatABI);
    259   if (!Opts.LimitFloatPrecision.empty())
    260     Res.push_back("-mlimit-float-precision", Opts.LimitFloatPrecision);
    261   if (Opts.NoZeroInitializedInBSS)
    262     Res.push_back("-mno-zero-initialized-bss");
    263   switch (Opts.getObjCDispatchMethod()) {
    264   case CodeGenOptions::Legacy:
    265     break;
    266   case CodeGenOptions::Mixed:
    267     Res.push_back("-fobjc-dispatch-method=mixed");
    268     break;
    269   case CodeGenOptions::NonLegacy:
    270     Res.push_back("-fobjc-dispatch-method=non-legacy");
    271     break;
    272   }
    273   if (Opts.NumRegisterParameters)
    274     Res.push_back("-mregparm", llvm::utostr(Opts.NumRegisterParameters));
    275   if (Opts.NoGlobalMerge)
    276     Res.push_back("-mno-global-merge");
    277   if (Opts.NoExecStack)
    278     Res.push_back("-mnoexecstack");
    279   if (Opts.RelaxAll)
    280     Res.push_back("-mrelax-all");
    281   if (Opts.SaveTempLabels)
    282     Res.push_back("-msave-temp-labels");
    283   if (Opts.NoDwarf2CFIAsm)
    284     Res.push_back("-fno-dwarf2-cfi-asm");
    285   if (Opts.NoDwarfDirectoryAsm)
    286     Res.push_back("-fno-dwarf-directory-asm");
    287   if (Opts.SoftFloat)
    288     Res.push_back("-msoft-float");
    289   if (Opts.StrictEnums)
    290     Res.push_back("-fstrict-enums");
    291   if (Opts.UnwindTables)
    292     Res.push_back("-munwind-tables");
    293   if (Opts.RelocationModel != "pic")
    294     Res.push_back("-mrelocation-model", Opts.RelocationModel);
    295   if (!Opts.VerifyModule)
    296     Res.push_back("-disable-llvm-verifier");
    297   for (unsigned i = 0, e = Opts.BackendOptions.size(); i != e; ++i)
    298     Res.push_back("-backend-option", Opts.BackendOptions[i]);
    299 }
    300 
    301 static void DependencyOutputOptsToArgs(const DependencyOutputOptions &Opts,
    302                                        ToArgsList &Res) {
    303   if (Opts.IncludeSystemHeaders)
    304     Res.push_back("-sys-header-deps");
    305   if (Opts.ShowHeaderIncludes)
    306     Res.push_back("-H");
    307   if (!Opts.HeaderIncludeOutputFile.empty())
    308     Res.push_back("-header-include-file", Opts.HeaderIncludeOutputFile);
    309   if (Opts.UsePhonyTargets)
    310     Res.push_back("-MP");
    311   if (!Opts.OutputFile.empty())
    312     Res.push_back("-dependency-file", Opts.OutputFile);
    313   for (unsigned i = 0, e = Opts.Targets.size(); i != e; ++i)
    314     Res.push_back("-MT", Opts.Targets[i]);
    315 }
    316 
    317 static void DiagnosticOptsToArgs(const DiagnosticOptions &Opts,
    318                                  ToArgsList &Res) {
    319   if (Opts.IgnoreWarnings)
    320     Res.push_back("-w");
    321   if (Opts.NoRewriteMacros)
    322     Res.push_back("-Wno-rewrite-macros");
    323   if (Opts.Pedantic)
    324     Res.push_back("-pedantic");
    325   if (Opts.PedanticErrors)
    326     Res.push_back("-pedantic-errors");
    327   if (!Opts.ShowColumn)
    328     Res.push_back("-fno-show-column");
    329   if (!Opts.ShowLocation)
    330     Res.push_back("-fno-show-source-location");
    331   if (!Opts.ShowCarets)
    332     Res.push_back("-fno-caret-diagnostics");
    333   if (!Opts.ShowFixits)
    334     Res.push_back("-fno-diagnostics-fixit-info");
    335   if (Opts.ShowSourceRanges)
    336     Res.push_back("-fdiagnostics-print-source-range-info");
    337   if (Opts.ShowParseableFixits)
    338     Res.push_back("-fdiagnostics-parseable-fixits");
    339   if (Opts.ShowColors)
    340     Res.push_back("-fcolor-diagnostics");
    341   if (Opts.VerifyDiagnostics)
    342     Res.push_back("-verify");
    343   if (Opts.ShowOptionNames)
    344     Res.push_back("-fdiagnostics-show-option");
    345   if (Opts.ShowCategories == 1)
    346     Res.push_back("-fdiagnostics-show-category=id");
    347   else if (Opts.ShowCategories == 2)
    348     Res.push_back("-fdiagnostics-show-category=name");
    349   switch (Opts.Format) {
    350   case DiagnosticOptions::Clang:
    351     Res.push_back("-fdiagnostics-format=clang"); break;
    352   case DiagnosticOptions::Msvc:
    353     Res.push_back("-fdiagnostics-format=msvc");  break;
    354   case DiagnosticOptions::Vi:
    355     Res.push_back("-fdiagnostics-format=vi");    break;
    356   }
    357   if (Opts.ErrorLimit)
    358     Res.push_back("-ferror-limit", llvm::utostr(Opts.ErrorLimit));
    359   if (!Opts.DiagnosticLogFile.empty())
    360     Res.push_back("-diagnostic-log-file", Opts.DiagnosticLogFile);
    361   if (Opts.MacroBacktraceLimit
    362                         != DiagnosticOptions::DefaultMacroBacktraceLimit)
    363     Res.push_back("-fmacro-backtrace-limit",
    364                   llvm::utostr(Opts.MacroBacktraceLimit));
    365   if (Opts.TemplateBacktraceLimit
    366                         != DiagnosticOptions::DefaultTemplateBacktraceLimit)
    367     Res.push_back("-ftemplate-backtrace-limit",
    368                   llvm::utostr(Opts.TemplateBacktraceLimit));
    369   if (Opts.ConstexprBacktraceLimit
    370                         != DiagnosticOptions::DefaultConstexprBacktraceLimit)
    371     Res.push_back("-fconstexpr-backtrace-limit",
    372                   llvm::utostr(Opts.ConstexprBacktraceLimit));
    373 
    374   if (Opts.TabStop != DiagnosticOptions::DefaultTabStop)
    375     Res.push_back("-ftabstop", llvm::utostr(Opts.TabStop));
    376   if (Opts.MessageLength)
    377     Res.push_back("-fmessage-length", llvm::utostr(Opts.MessageLength));
    378   if (!Opts.DumpBuildInformation.empty())
    379     Res.push_back("-dump-build-information", Opts.DumpBuildInformation);
    380   for (unsigned i = 0, e = Opts.Warnings.size(); i != e; ++i)
    381     Res.push_back("-W" + Opts.Warnings[i]);
    382 }
    383 
    384 static const char *getInputKindName(InputKind Kind) {
    385   switch (Kind) {
    386   case IK_None:              break;
    387   case IK_AST:               return "ast";
    388   case IK_Asm:               return "assembler-with-cpp";
    389   case IK_C:                 return "c";
    390   case IK_CXX:               return "c++";
    391   case IK_LLVM_IR:           return "ir";
    392   case IK_ObjC:              return "objective-c";
    393   case IK_ObjCXX:            return "objective-c++";
    394   case IK_OpenCL:            return "cl";
    395   case IK_CUDA:              return "cuda";
    396   case IK_PreprocessedC:     return "cpp-output";
    397   case IK_PreprocessedCXX:   return "c++-cpp-output";
    398   case IK_PreprocessedObjC:  return "objective-c-cpp-output";
    399   case IK_PreprocessedObjCXX:return "objective-c++-cpp-output";
    400   }
    401 
    402   llvm_unreachable("Unexpected language kind!");
    403 }
    404 
    405 static const char *getActionName(frontend::ActionKind Kind) {
    406   switch (Kind) {
    407   case frontend::PluginAction:
    408     llvm_unreachable("Invalid kind!");
    409 
    410   case frontend::ASTDump:                return "-ast-dump";
    411   case frontend::ASTDumpXML:             return "-ast-dump-xml";
    412   case frontend::ASTPrint:               return "-ast-print";
    413   case frontend::ASTView:                return "-ast-view";
    414   case frontend::DumpRawTokens:          return "-dump-raw-tokens";
    415   case frontend::DumpTokens:             return "-dump-tokens";
    416   case frontend::EmitAssembly:           return "-S";
    417   case frontend::EmitBC:                 return "-emit-llvm-bc";
    418   case frontend::EmitHTML:               return "-emit-html";
    419   case frontend::EmitLLVM:               return "-emit-llvm";
    420   case frontend::EmitLLVMOnly:           return "-emit-llvm-only";
    421   case frontend::EmitCodeGenOnly:        return "-emit-codegen-only";
    422   case frontend::EmitObj:                return "-emit-obj";
    423   case frontend::FixIt:                  return "-fixit";
    424   case frontend::GenerateModule:         return "-emit-module";
    425   case frontend::GeneratePCH:            return "-emit-pch";
    426   case frontend::GeneratePTH:            return "-emit-pth";
    427   case frontend::InitOnly:               return "-init-only";
    428   case frontend::ParseSyntaxOnly:        return "-fsyntax-only";
    429   case frontend::PrintDeclContext:       return "-print-decl-contexts";
    430   case frontend::PrintPreamble:          return "-print-preamble";
    431   case frontend::PrintPreprocessedInput: return "-E";
    432   case frontend::RewriteMacros:          return "-rewrite-macros";
    433   case frontend::RewriteObjC:            return "-rewrite-objc";
    434   case frontend::RewriteTest:            return "-rewrite-test";
    435   case frontend::RunAnalysis:            return "-analyze";
    436   case frontend::MigrateSource:          return "-migrate";
    437   case frontend::RunPreprocessorOnly:    return "-Eonly";
    438   }
    439 
    440   llvm_unreachable("Unexpected language kind!");
    441 }
    442 
    443 static void FileSystemOptsToArgs(const FileSystemOptions &Opts, ToArgsList &Res){
    444   if (!Opts.WorkingDir.empty())
    445     Res.push_back("-working-directory", Opts.WorkingDir);
    446 }
    447 
    448 static void FrontendOptsToArgs(const FrontendOptions &Opts, ToArgsList &Res) {
    449   if (Opts.DisableFree)
    450     Res.push_back("-disable-free");
    451   if (Opts.RelocatablePCH)
    452     Res.push_back("-relocatable-pch");
    453   if (Opts.ShowHelp)
    454     Res.push_back("-help");
    455   if (Opts.ShowMacrosInCodeCompletion)
    456     Res.push_back("-code-completion-macros");
    457   if (Opts.ShowCodePatternsInCodeCompletion)
    458     Res.push_back("-code-completion-patterns");
    459   if (!Opts.ShowGlobalSymbolsInCodeCompletion)
    460     Res.push_back("-no-code-completion-globals");
    461   if (Opts.ShowStats)
    462     Res.push_back("-print-stats");
    463   if (Opts.ShowTimers)
    464     Res.push_back("-ftime-report");
    465   if (Opts.ShowVersion)
    466     Res.push_back("-version");
    467   if (Opts.FixWhatYouCan)
    468     Res.push_back("-fix-what-you-can");
    469   if (Opts.FixOnlyWarnings)
    470     Res.push_back("-fix-only-warnings");
    471   if (Opts.FixAndRecompile)
    472     Res.push_back("-fixit-recompile");
    473   if (Opts.FixToTemporaries)
    474     Res.push_back("-fixit-to-temporary");
    475   switch (Opts.ARCMTAction) {
    476   case FrontendOptions::ARCMT_None:
    477     break;
    478   case FrontendOptions::ARCMT_Check:
    479     Res.push_back("-arcmt-check");
    480     break;
    481   case FrontendOptions::ARCMT_Modify:
    482     Res.push_back("-arcmt-modify");
    483     break;
    484   case FrontendOptions::ARCMT_Migrate:
    485     Res.push_back("-arcmt-migrate");
    486     break;
    487   }
    488   if (!Opts.MTMigrateDir.empty())
    489     Res.push_back("-mt-migrate-directory", Opts.MTMigrateDir);
    490   if (!Opts.ARCMTMigrateReportOut.empty())
    491     Res.push_back("-arcmt-migrate-report-output", Opts.ARCMTMigrateReportOut);
    492   if (Opts.ARCMTMigrateEmitARCErrors)
    493     Res.push_back("-arcmt-migrate-emit-errors");
    494 
    495   if (Opts.ObjCMTAction & ~FrontendOptions::ObjCMT_Literals)
    496     Res.push_back("-objcmt-migrate-literals");
    497   if (Opts.ObjCMTAction & ~FrontendOptions::ObjCMT_Subscripting)
    498     Res.push_back("-objcmt-migrate-subscripting");
    499 
    500   bool NeedLang = false;
    501   for (unsigned i = 0, e = Opts.Inputs.size(); i != e; ++i)
    502     if (FrontendOptions::getInputKindForExtension(Opts.Inputs[i].File) !=
    503         Opts.Inputs[i].Kind)
    504       NeedLang = true;
    505   if (NeedLang)
    506     Res.push_back("-x", getInputKindName(Opts.Inputs[0].Kind));
    507   for (unsigned i = 0, e = Opts.Inputs.size(); i != e; ++i) {
    508     assert((!NeedLang || Opts.Inputs[i].Kind == Opts.Inputs[0].Kind) &&
    509            "Unable to represent this input vector!");
    510     Res.push_back(Opts.Inputs[i].File);
    511   }
    512 
    513   if (!Opts.OutputFile.empty())
    514     Res.push_back("-o", Opts.OutputFile);
    515   if (!Opts.CodeCompletionAt.FileName.empty())
    516     Res.push_back("-code-completion-at",
    517                   Opts.CodeCompletionAt.FileName + ":" +
    518                   llvm::utostr(Opts.CodeCompletionAt.Line) + ":" +
    519                   llvm::utostr(Opts.CodeCompletionAt.Column));
    520   if (Opts.ProgramAction != frontend::PluginAction)
    521     Res.push_back(getActionName(Opts.ProgramAction));
    522   if (!Opts.ActionName.empty()) {
    523     Res.push_back("-plugin", Opts.ActionName);
    524     for(unsigned i = 0, e = Opts.PluginArgs.size(); i != e; ++i)
    525       Res.push_back("-plugin-arg-" + Opts.ActionName, Opts.PluginArgs[i]);
    526   }
    527   for (unsigned i = 0, e = Opts.Plugins.size(); i != e; ++i)
    528     Res.push_back("-load", Opts.Plugins[i]);
    529   for (unsigned i = 0, e = Opts.AddPluginActions.size(); i != e; ++i) {
    530     Res.push_back("-add-plugin", Opts.AddPluginActions[i]);
    531     for(unsigned ai = 0, ae = Opts.AddPluginArgs.size(); ai != ae; ++ai)
    532       Res.push_back("-plugin-arg-" + Opts.AddPluginActions[i],
    533                     Opts.AddPluginArgs[i][ai]);
    534   }
    535   for (unsigned i = 0, e = Opts.ASTMergeFiles.size(); i != e; ++i)
    536     Res.push_back("-ast-merge", Opts.ASTMergeFiles[i]);
    537   for (unsigned i = 0, e = Opts.LLVMArgs.size(); i != e; ++i)
    538     Res.push_back("-mllvm", Opts.LLVMArgs[i]);
    539   if (!Opts.OverrideRecordLayoutsFile.empty())
    540     Res.push_back("-foverride-record-layout=" + Opts.OverrideRecordLayoutsFile);
    541 }
    542 
    543 static void HeaderSearchOptsToArgs(const HeaderSearchOptions &Opts,
    544                                    ToArgsList &Res) {
    545   if (Opts.Sysroot != "/") {
    546     Res.push_back("-isysroot");
    547     Res.push_back(Opts.Sysroot);
    548   }
    549 
    550   /// User specified include entries.
    551   for (unsigned i = 0, e = Opts.UserEntries.size(); i != e; ++i) {
    552     const HeaderSearchOptions::Entry &E = Opts.UserEntries[i];
    553     if (E.IsFramework && (E.Group != frontend::Angled || !E.IsUserSupplied))
    554       llvm::report_fatal_error("Invalid option set!");
    555     if (E.IsUserSupplied) {
    556       switch (E.Group) {
    557       case frontend::After:
    558         Res.push_back("-idirafter");
    559         break;
    560 
    561       case frontend::Quoted:
    562         Res.push_back("-iquote");
    563         break;
    564 
    565       case frontend::System:
    566         Res.push_back("-isystem");
    567         break;
    568 
    569       case frontend::IndexHeaderMap:
    570         Res.push_back("-index-header-map");
    571         Res.push_back(E.IsFramework? "-F" : "-I");
    572         break;
    573 
    574       case frontend::CSystem:
    575         Res.push_back("-c-isystem");
    576         break;
    577 
    578       case frontend::CXXSystem:
    579         Res.push_back("-cxx-isystem");
    580         break;
    581 
    582       case frontend::ObjCSystem:
    583         Res.push_back("-objc-isystem");
    584         break;
    585 
    586       case frontend::ObjCXXSystem:
    587         Res.push_back("-objcxx-isystem");
    588         break;
    589 
    590       case frontend::Angled:
    591         Res.push_back(E.IsFramework ? "-F" : "-I");
    592         break;
    593       }
    594     } else {
    595       if (E.IsInternal) {
    596         assert(E.Group == frontend::System && "Unexpected header search group");
    597         if (E.ImplicitExternC)
    598           Res.push_back("-internal-externc-isystem");
    599         else
    600           Res.push_back("-internal-isystem");
    601       } else {
    602         if (E.Group != frontend::Angled && E.Group != frontend::System)
    603           llvm::report_fatal_error("Invalid option set!");
    604         Res.push_back(E.Group == frontend::Angled ? "-iwithprefixbefore" :
    605                       "-iwithprefix");
    606       }
    607     }
    608     Res.push_back(E.Path);
    609   }
    610 
    611   if (!Opts.ResourceDir.empty())
    612     Res.push_back("-resource-dir", Opts.ResourceDir);
    613   if (!Opts.ModuleCachePath.empty())
    614     Res.push_back("-fmodule-cache-path", Opts.ModuleCachePath);
    615   if (!Opts.UseStandardSystemIncludes)
    616     Res.push_back("-nostdsysteminc");
    617   if (!Opts.UseStandardCXXIncludes)
    618     Res.push_back("-nostdinc++");
    619   if (Opts.UseLibcxx)
    620     Res.push_back("-stdlib=libc++");
    621   if (Opts.Verbose)
    622     Res.push_back("-v");
    623 }
    624 
    625 static void LangOptsToArgs(const LangOptions &Opts, ToArgsList &Res) {
    626   LangOptions DefaultLangOpts;
    627 
    628   // FIXME: Need to set -std to get all the implicit options.
    629 
    630   // FIXME: We want to only pass options relative to the defaults, which
    631   // requires constructing a target. :(
    632   //
    633   // It would be better to push the all target specific choices into the driver,
    634   // so that everything below that was more uniform.
    635 
    636   if (Opts.Trigraphs)
    637     Res.push_back("-trigraphs");
    638   // Implicit based on the input kind:
    639   //   AsmPreprocessor, CPlusPlus, ObjC1, ObjC2, OpenCL
    640   // Implicit based on the input language standard:
    641   //   BCPLComment, C99, CPlusPlus0x, Digraphs, GNUInline, ImplicitInt, GNUMode
    642   if (Opts.DollarIdents)
    643     Res.push_back("-fdollars-in-identifiers");
    644   if (Opts.GNUMode && !Opts.GNUKeywords)
    645     Res.push_back("-fno-gnu-keywords");
    646   if (!Opts.GNUMode && Opts.GNUKeywords)
    647     Res.push_back("-fgnu-keywords");
    648   if (Opts.MicrosoftExt)
    649     Res.push_back("-fms-extensions");
    650   if (Opts.MicrosoftMode)
    651     Res.push_back("-fms-compatibility");
    652   if (Opts.MSCVersion != 0)
    653     Res.push_back("-fmsc-version=" + llvm::utostr(Opts.MSCVersion));
    654   if (Opts.Borland)
    655     Res.push_back("-fborland-extensions");
    656   if (!Opts.ObjCNonFragileABI)
    657     Res.push_back("-fobjc-fragile-abi");
    658   if (Opts.ObjCDefaultSynthProperties)
    659     Res.push_back("-fobjc-default-synthesize-properties");
    660   // NoInline is implicit.
    661   if (!Opts.CXXOperatorNames)
    662     Res.push_back("-fno-operator-names");
    663   if (Opts.PascalStrings)
    664     Res.push_back("-fpascal-strings");
    665   if (Opts.CatchUndefined)
    666     Res.push_back("-fcatch-undefined-behavior");
    667   if (Opts.AddressSanitizer)
    668     Res.push_back("-faddress-sanitizer");
    669   if (Opts.ThreadSanitizer)
    670     Res.push_back("-fthread-sanitizer");
    671   if (Opts.WritableStrings)
    672     Res.push_back("-fwritable-strings");
    673   if (Opts.ConstStrings)
    674     Res.push_back("-fconst-strings");
    675   if (!Opts.LaxVectorConversions)
    676     Res.push_back("-fno-lax-vector-conversions");
    677   if (Opts.AltiVec)
    678     Res.push_back("-faltivec");
    679   if (Opts.Exceptions)
    680     Res.push_back("-fexceptions");
    681   if (Opts.ObjCExceptions)
    682     Res.push_back("-fobjc-exceptions");
    683   if (Opts.CXXExceptions)
    684     Res.push_back("-fcxx-exceptions");
    685   if (Opts.SjLjExceptions)
    686     Res.push_back("-fsjlj-exceptions");
    687   if (Opts.TraditionalCPP)
    688     Res.push_back("-traditional-cpp");
    689   if (!Opts.RTTI)
    690     Res.push_back("-fno-rtti");
    691   if (Opts.MSBitfields)
    692     Res.push_back("-mms-bitfields");
    693   if (!Opts.NeXTRuntime)
    694     Res.push_back("-fgnu-runtime");
    695   if (Opts.Freestanding)
    696     Res.push_back("-ffreestanding");
    697   if (Opts.NoBuiltin)
    698     Res.push_back("-fno-builtin");
    699   if (!Opts.AssumeSaneOperatorNew)
    700     Res.push_back("-fno-assume-sane-operator-new");
    701   if (!Opts.ThreadsafeStatics)
    702     Res.push_back("-fno-threadsafe-statics");
    703   if (Opts.POSIXThreads)
    704     Res.push_back("-pthread");
    705   if (Opts.Blocks)
    706     Res.push_back("-fblocks");
    707   if (Opts.BlocksRuntimeOptional)
    708     Res.push_back("-fblocks-runtime-optional");
    709   if (Opts.Modules)
    710     Res.push_back("-fmodules");
    711   if (Opts.EmitAllDecls)
    712     Res.push_back("-femit-all-decls");
    713   if (Opts.MathErrno)
    714     Res.push_back("-fmath-errno");
    715   switch (Opts.getSignedOverflowBehavior()) {
    716   case LangOptions::SOB_Undefined: break;
    717   case LangOptions::SOB_Defined:   Res.push_back("-fwrapv"); break;
    718   case LangOptions::SOB_Trapping:
    719     Res.push_back("-ftrapv");
    720     if (!Opts.OverflowHandler.empty())
    721       Res.push_back("-ftrapv-handler", Opts.OverflowHandler);
    722     break;
    723   }
    724   if (Opts.HeinousExtensions)
    725     Res.push_back("-fheinous-gnu-extensions");
    726   // Optimize is implicit.
    727   // OptimizeSize is implicit.
    728   if (Opts.FastMath)
    729     Res.push_back("-ffast-math");
    730   if (Opts.Static)
    731     Res.push_back("-static-define");
    732   if (Opts.DumpRecordLayoutsSimple)
    733     Res.push_back("-fdump-record-layouts-simple");
    734   else if (Opts.DumpRecordLayouts)
    735     Res.push_back("-fdump-record-layouts");
    736   if (Opts.DumpVTableLayouts)
    737     Res.push_back("-fdump-vtable-layouts");
    738   if (Opts.NoBitFieldTypeAlign)
    739     Res.push_back("-fno-bitfield-type-alignment");
    740   if (Opts.PICLevel)
    741     Res.push_back("-pic-level", llvm::utostr(Opts.PICLevel));
    742   if (Opts.PIELevel)
    743     Res.push_back("-pie-level", llvm::utostr(Opts.PIELevel));
    744   if (Opts.ObjCGCBitmapPrint)
    745     Res.push_back("-print-ivar-layout");
    746   if (Opts.NoConstantCFStrings)
    747     Res.push_back("-fno-constant-cfstrings");
    748   if (!Opts.AccessControl)
    749     Res.push_back("-fno-access-control");
    750   if (!Opts.CharIsSigned)
    751     Res.push_back("-fno-signed-char");
    752   if (Opts.ShortWChar)
    753     Res.push_back("-fshort-wchar");
    754   if (!Opts.ElideConstructors)
    755     Res.push_back("-fno-elide-constructors");
    756   if (Opts.getGC() != LangOptions::NonGC) {
    757     if (Opts.getGC() == LangOptions::HybridGC) {
    758       Res.push_back("-fobjc-gc");
    759     } else {
    760       assert(Opts.getGC() == LangOptions::GCOnly && "Invalid GC mode!");
    761       Res.push_back("-fobjc-gc-only");
    762     }
    763   }
    764   if (Opts.ObjCAutoRefCount)
    765     Res.push_back("-fobjc-arc");
    766   if (Opts.ObjCRuntimeHasWeak)
    767     Res.push_back("-fobjc-runtime-has-weak");
    768   if (!Opts.ObjCInferRelatedResultType)
    769     Res.push_back("-fno-objc-infer-related-result-type");
    770 
    771   if (Opts.AppleKext)
    772     Res.push_back("-fapple-kext");
    773 
    774   if (Opts.getVisibilityMode() != DefaultVisibility) {
    775     Res.push_back("-fvisibility");
    776     if (Opts.getVisibilityMode() == HiddenVisibility) {
    777       Res.push_back("hidden");
    778     } else {
    779       assert(Opts.getVisibilityMode() == ProtectedVisibility &&
    780              "Invalid visibility!");
    781       Res.push_back("protected");
    782     }
    783   }
    784   if (Opts.InlineVisibilityHidden)
    785     Res.push_back("-fvisibility-inlines-hidden");
    786 
    787   if (Opts.getStackProtector() != 0)
    788     Res.push_back("-stack-protector", llvm::utostr(Opts.getStackProtector()));
    789   if (Opts.InstantiationDepth != DefaultLangOpts.InstantiationDepth)
    790     Res.push_back("-ftemplate-depth", llvm::utostr(Opts.InstantiationDepth));
    791   if (Opts.ConstexprCallDepth != DefaultLangOpts.ConstexprCallDepth)
    792     Res.push_back("-fconstexpr-depth", llvm::utostr(Opts.ConstexprCallDepth));
    793   if (!Opts.ObjCConstantStringClass.empty())
    794     Res.push_back("-fconstant-string-class", Opts.ObjCConstantStringClass);
    795   if (Opts.FakeAddressSpaceMap)
    796     Res.push_back("-ffake-address-space-map");
    797   if (Opts.ParseUnknownAnytype)
    798     Res.push_back("-funknown-anytype");
    799   if (Opts.DebuggerSupport)
    800     Res.push_back("-fdebugger-support");
    801   if (Opts.DebuggerCastResultToId)
    802     Res.push_back("-fdebugger-cast-result-to-id");
    803   if (Opts.DebuggerObjCLiteral)
    804     Res.push_back("-fdebugger-objc-literal");
    805   if (Opts.DelayedTemplateParsing)
    806     Res.push_back("-fdelayed-template-parsing");
    807   if (Opts.Deprecated)
    808     Res.push_back("-fdeprecated-macro");
    809   if (Opts.ApplePragmaPack)
    810     Res.push_back("-fapple-pragma-pack");
    811   if (!Opts.CurrentModule.empty())
    812     Res.push_back("-fmodule-name=" + Opts.CurrentModule);
    813 }
    814 
    815 static void PreprocessorOptsToArgs(const PreprocessorOptions &Opts,
    816                                    ToArgsList &Res) {
    817   for (unsigned i = 0, e = Opts.Macros.size(); i != e; ++i)
    818     Res.push_back(std::string(Opts.Macros[i].second ? "-U" : "-D") +
    819                   Opts.Macros[i].first);
    820   for (unsigned i = 0, e = Opts.Includes.size(); i != e; ++i) {
    821     // FIXME: We need to avoid reincluding the implicit PCH and PTH includes.
    822     Res.push_back("-include", Opts.Includes[i]);
    823   }
    824   for (unsigned i = 0, e = Opts.MacroIncludes.size(); i != e; ++i)
    825     Res.push_back("-imacros", Opts.MacroIncludes[i]);
    826   if (!Opts.UsePredefines)
    827     Res.push_back("-undef");
    828   if (Opts.DetailedRecord)
    829     Res.push_back("-detailed-preprocessing-record");
    830   if (!Opts.ImplicitPCHInclude.empty())
    831     Res.push_back("-include-pch", Opts.ImplicitPCHInclude);
    832   if (!Opts.ImplicitPTHInclude.empty())
    833     Res.push_back("-include-pth", Opts.ImplicitPTHInclude);
    834   if (!Opts.TokenCache.empty()) {
    835     if (Opts.ImplicitPTHInclude.empty())
    836       Res.push_back("-token-cache", Opts.TokenCache);
    837     else
    838       assert(Opts.ImplicitPTHInclude == Opts.TokenCache &&
    839              "Unsupported option combination!");
    840   }
    841   for (unsigned i = 0, e = Opts.ChainedIncludes.size(); i != e; ++i)
    842     Res.push_back("-chain-include", Opts.ChainedIncludes[i]);
    843   for (unsigned i = 0, e = Opts.RemappedFiles.size(); i != e; ++i) {
    844     Res.push_back("-remap-file", Opts.RemappedFiles[i].first + ";" +
    845                                  Opts.RemappedFiles[i].second);
    846   }
    847 }
    848 
    849 static void PreprocessorOutputOptsToArgs(const PreprocessorOutputOptions &Opts,
    850                                          ToArgsList &Res) {
    851   if (!Opts.ShowCPP && !Opts.ShowMacros)
    852     llvm::report_fatal_error("Invalid option combination!");
    853 
    854   if (Opts.ShowCPP && Opts.ShowMacros)
    855     Res.push_back("-dD");
    856   else if (!Opts.ShowCPP && Opts.ShowMacros)
    857     Res.push_back("-dM");
    858 
    859   if (!Opts.ShowLineMarkers)
    860     Res.push_back("-P");
    861   if (Opts.ShowComments)
    862     Res.push_back("-C");
    863   if (Opts.ShowMacroComments)
    864     Res.push_back("-CC");
    865 }
    866 
    867 static void TargetOptsToArgs(const TargetOptions &Opts,
    868                              ToArgsList &Res) {
    869   Res.push_back("-triple");
    870   Res.push_back(Opts.Triple);
    871   if (!Opts.CPU.empty())
    872     Res.push_back("-target-cpu", Opts.CPU);
    873   if (!Opts.ABI.empty())
    874     Res.push_back("-target-abi", Opts.ABI);
    875   if (!Opts.LinkerVersion.empty())
    876     Res.push_back("-target-linker-version", Opts.LinkerVersion);
    877   if (!Opts.CXXABI.empty())
    878     Res.push_back("-cxx-abi", Opts.CXXABI);
    879   for (unsigned i = 0, e = Opts.Features.size(); i != e; ++i)
    880     Res.push_back("-target-feature", Opts.Features[i]);
    881 }
    882 
    883 void CompilerInvocation::toArgs(std::vector<std::string> &Res) {
    884   ToArgsList List(Res);
    885   AnalyzerOptsToArgs(getAnalyzerOpts(), List);
    886   CodeGenOptsToArgs(getCodeGenOpts(), List);
    887   DependencyOutputOptsToArgs(getDependencyOutputOpts(), List);
    888   DiagnosticOptsToArgs(getDiagnosticOpts(), List);
    889   FileSystemOptsToArgs(getFileSystemOpts(), List);
    890   FrontendOptsToArgs(getFrontendOpts(), List);
    891   HeaderSearchOptsToArgs(getHeaderSearchOpts(), List);
    892   LangOptsToArgs(*getLangOpts(), List);
    893   PreprocessorOptsToArgs(getPreprocessorOpts(), List);
    894   PreprocessorOutputOptsToArgs(getPreprocessorOutputOpts(), List);
    895   TargetOptsToArgs(getTargetOpts(), List);
    896 }
    897 
    898 //===----------------------------------------------------------------------===//
    899 // Deserialization (to args)
    900 //===----------------------------------------------------------------------===//
    901 
    902 using namespace clang::driver;
    903 using namespace clang::driver::cc1options;
    904 
    905 //
    906 
    907 static unsigned getOptimizationLevel(ArgList &Args, InputKind IK,
    908                                      DiagnosticsEngine &Diags) {
    909   unsigned DefaultOpt = 0;
    910   if (IK == IK_OpenCL && !Args.hasArg(OPT_cl_opt_disable))
    911     DefaultOpt = 2;
    912   // -Os/-Oz implies -O2
    913   return (Args.hasArg(OPT_Os) || Args.hasArg (OPT_Oz)) ? 2 :
    914     Args.getLastArgIntValue(OPT_O, DefaultOpt, Diags);
    915 }
    916 
    917 static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,
    918                               DiagnosticsEngine &Diags) {
    919   using namespace cc1options;
    920   bool Success = true;
    921   if (Arg *A = Args.getLastArg(OPT_analyzer_store)) {
    922     StringRef Name = A->getValue(Args);
    923     AnalysisStores Value = llvm::StringSwitch<AnalysisStores>(Name)
    924 #define ANALYSIS_STORE(NAME, CMDFLAG, DESC, CREATFN) \
    925       .Case(CMDFLAG, NAME##Model)
    926 #include "clang/Frontend/Analyses.def"
    927       .Default(NumStores);
    928     if (Value == NumStores) {
    929       Diags.Report(diag::err_drv_invalid_value)
    930         << A->getAsString(Args) << Name;
    931       Success = false;
    932     } else {
    933       Opts.AnalysisStoreOpt = Value;
    934     }
    935   }
    936 
    937   if (Arg *A = Args.getLastArg(OPT_analyzer_constraints)) {
    938     StringRef Name = A->getValue(Args);
    939     AnalysisConstraints Value = llvm::StringSwitch<AnalysisConstraints>(Name)
    940 #define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
    941       .Case(CMDFLAG, NAME##Model)
    942 #include "clang/Frontend/Analyses.def"
    943       .Default(NumConstraints);
    944     if (Value == NumConstraints) {
    945       Diags.Report(diag::err_drv_invalid_value)
    946         << A->getAsString(Args) << Name;
    947       Success = false;
    948     } else {
    949       Opts.AnalysisConstraintsOpt = Value;
    950     }
    951   }
    952 
    953   if (Arg *A = Args.getLastArg(OPT_analyzer_output)) {
    954     StringRef Name = A->getValue(Args);
    955     AnalysisDiagClients Value = llvm::StringSwitch<AnalysisDiagClients>(Name)
    956 #define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN, AUTOCREAT) \
    957       .Case(CMDFLAG, PD_##NAME)
    958 #include "clang/Frontend/Analyses.def"
    959       .Default(NUM_ANALYSIS_DIAG_CLIENTS);
    960     if (Value == NUM_ANALYSIS_DIAG_CLIENTS) {
    961       Diags.Report(diag::err_drv_invalid_value)
    962         << A->getAsString(Args) << Name;
    963       Success = false;
    964     } else {
    965       Opts.AnalysisDiagOpt = Value;
    966     }
    967   }
    968 
    969   if (Arg *A = Args.getLastArg(OPT_analyzer_purge)) {
    970     StringRef Name = A->getValue(Args);
    971     AnalysisPurgeMode Value = llvm::StringSwitch<AnalysisPurgeMode>(Name)
    972 #define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \
    973       .Case(CMDFLAG, NAME)
    974 #include "clang/Frontend/Analyses.def"
    975       .Default(NumPurgeModes);
    976     if (Value == NumPurgeModes) {
    977       Diags.Report(diag::err_drv_invalid_value)
    978         << A->getAsString(Args) << Name;
    979       Success = false;
    980     } else {
    981       Opts.AnalysisPurgeOpt = Value;
    982     }
    983   }
    984 
    985   if (Arg *A = Args.getLastArg(OPT_analyzer_ipa)) {
    986     StringRef Name = A->getValue(Args);
    987     AnalysisIPAMode Value = llvm::StringSwitch<AnalysisIPAMode>(Name)
    988 #define ANALYSIS_IPA(NAME, CMDFLAG, DESC) \
    989       .Case(CMDFLAG, NAME)
    990 #include "clang/Frontend/Analyses.def"
    991       .Default(NumIPAModes);
    992     if (Value == NumIPAModes) {
    993       Diags.Report(diag::err_drv_invalid_value)
    994         << A->getAsString(Args) << Name;
    995       Success = false;
    996     } else {
    997       Opts.IPAMode = Value;
    998     }
    999   }
   1000 
   1001   if (Arg *A = Args.getLastArg(OPT_analyzer_inlining_mode)) {
   1002     StringRef Name = A->getValue(Args);
   1003     AnalysisInliningMode Value = llvm::StringSwitch<AnalysisInliningMode>(Name)
   1004 #define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \
   1005       .Case(CMDFLAG, NAME)
   1006 #include "clang/Frontend/Analyses.def"
   1007       .Default(NumInliningModes);
   1008     if (Value == NumInliningModes) {
   1009       Diags.Report(diag::err_drv_invalid_value)
   1010         << A->getAsString(Args) << Name;
   1011       Success = false;
   1012     } else {
   1013       Opts.InliningMode = Value;
   1014     }
   1015   }
   1016 
   1017   Opts.ShowCheckerHelp = Args.hasArg(OPT_analyzer_checker_help);
   1018   Opts.VisualizeEGDot = Args.hasArg(OPT_analyzer_viz_egraph_graphviz);
   1019   Opts.VisualizeEGUbi = Args.hasArg(OPT_analyzer_viz_egraph_ubigraph);
   1020   Opts.NoRetryExhausted = Args.hasArg(OPT_analyzer_disable_retry_exhausted);
   1021   Opts.AnalyzeAll = Args.hasArg(OPT_analyzer_opt_analyze_headers);
   1022   Opts.AnalyzerDisplayProgress = Args.hasArg(OPT_analyzer_display_progress);
   1023   Opts.AnalyzeNestedBlocks =
   1024     Args.hasArg(OPT_analyzer_opt_analyze_nested_blocks);
   1025   Opts.EagerlyAssume = Args.hasArg(OPT_analyzer_eagerly_assume);
   1026   Opts.AnalyzeSpecificFunction = Args.getLastArgValue(OPT_analyze_function);
   1027   Opts.UnoptimizedCFG = Args.hasArg(OPT_analysis_UnoptimizedCFG);
   1028   Opts.CFGAddImplicitDtors = Args.hasArg(OPT_analysis_CFGAddImplicitDtors);
   1029   Opts.CFGAddInitializers = Args.hasArg(OPT_analysis_CFGAddInitializers);
   1030   Opts.TrimGraph = Args.hasArg(OPT_trim_egraph);
   1031   Opts.MaxNodes = Args.getLastArgIntValue(OPT_analyzer_max_nodes, 150000,Diags);
   1032   Opts.MaxLoop = Args.getLastArgIntValue(OPT_analyzer_max_loop, 4, Diags);
   1033   Opts.EagerlyTrimEGraph = !Args.hasArg(OPT_analyzer_no_eagerly_trim_egraph);
   1034   Opts.PrintStats = Args.hasArg(OPT_analyzer_stats);
   1035   Opts.InlineMaxStackDepth =
   1036     Args.getLastArgIntValue(OPT_analyzer_inline_max_stack_depth,
   1037                             Opts.InlineMaxStackDepth, Diags);
   1038   Opts.InlineMaxFunctionSize =
   1039     Args.getLastArgIntValue(OPT_analyzer_inline_max_function_size,
   1040                             Opts.InlineMaxFunctionSize, Diags);
   1041 
   1042   Opts.CheckersControlList.clear();
   1043   for (arg_iterator it = Args.filtered_begin(OPT_analyzer_checker,
   1044                                              OPT_analyzer_disable_checker),
   1045          ie = Args.filtered_end(); it != ie; ++it) {
   1046     const Arg *A = *it;
   1047     A->claim();
   1048     bool enable = (A->getOption().getID() == OPT_analyzer_checker);
   1049     // We can have a list of comma separated checker names, e.g:
   1050     // '-analyzer-checker=cocoa,unix'
   1051     StringRef checkerList = A->getValue(Args);
   1052     SmallVector<StringRef, 4> checkers;
   1053     checkerList.split(checkers, ",");
   1054     for (unsigned i = 0, e = checkers.size(); i != e; ++i)
   1055       Opts.CheckersControlList.push_back(std::make_pair(checkers[i], enable));
   1056   }
   1057 
   1058   return Success;
   1059 }
   1060 
   1061 static bool ParseMigratorArgs(MigratorOptions &Opts, ArgList &Args) {
   1062   Opts.NoNSAllocReallocError = Args.hasArg(OPT_migrator_no_nsalloc_error);
   1063   Opts.NoFinalizeRemoval = Args.hasArg(OPT_migrator_no_finalize_removal);
   1064   return true;
   1065 }
   1066 
   1067 static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
   1068                              DiagnosticsEngine &Diags) {
   1069   using namespace cc1options;
   1070   bool Success = true;
   1071 
   1072   unsigned OptLevel = getOptimizationLevel(Args, IK, Diags);
   1073   if (OptLevel > 3) {
   1074     Diags.Report(diag::err_drv_invalid_value)
   1075       << Args.getLastArg(OPT_O)->getAsString(Args) << OptLevel;
   1076     OptLevel = 3;
   1077     Success = false;
   1078   }
   1079   Opts.OptimizationLevel = OptLevel;
   1080 
   1081   // We must always run at least the always inlining pass.
   1082   Opts.Inlining = (Opts.OptimizationLevel > 1) ? CodeGenOptions::NormalInlining
   1083     : CodeGenOptions::OnlyAlwaysInlining;
   1084   // -fno-inline-functions overrides OptimizationLevel > 1.
   1085   Opts.NoInline = Args.hasArg(OPT_fno_inline);
   1086   Opts.Inlining = Args.hasArg(OPT_fno_inline_functions) ?
   1087     CodeGenOptions::OnlyAlwaysInlining : Opts.Inlining;
   1088 
   1089   Opts.DebugInfo = Args.hasArg(OPT_g);
   1090   Opts.LimitDebugInfo = !Args.hasArg(OPT_fno_limit_debug_info)
   1091     || Args.hasArg(OPT_flimit_debug_info);
   1092   Opts.DisableLLVMOpts = Args.hasArg(OPT_disable_llvm_optzns);
   1093   Opts.DisableRedZone = Args.hasArg(OPT_disable_red_zone);
   1094   Opts.ForbidGuardVariables = Args.hasArg(OPT_fforbid_guard_variables);
   1095   Opts.UseRegisterSizedBitfieldAccess = Args.hasArg(
   1096     OPT_fuse_register_sized_bitfield_access);
   1097   Opts.RelaxedAliasing = Args.hasArg(OPT_relaxed_aliasing);
   1098   Opts.DwarfDebugFlags = Args.getLastArgValue(OPT_dwarf_debug_flags);
   1099   Opts.MergeAllConstants = !Args.hasArg(OPT_fno_merge_all_constants);
   1100   Opts.NoCommon = Args.hasArg(OPT_fno_common);
   1101   Opts.NoImplicitFloat = Args.hasArg(OPT_no_implicit_float);
   1102   Opts.OptimizeSize = Args.hasArg(OPT_Os);
   1103   Opts.OptimizeSize = Args.hasArg(OPT_Oz) ? 2 : Opts.OptimizeSize;
   1104   Opts.SimplifyLibCalls = !(Args.hasArg(OPT_fno_builtin) ||
   1105                             Args.hasArg(OPT_ffreestanding));
   1106   Opts.UnrollLoops = Args.hasArg(OPT_funroll_loops) ||
   1107                      (Opts.OptimizationLevel > 1 && !Opts.OptimizeSize);
   1108 
   1109   Opts.AsmVerbose = Args.hasArg(OPT_masm_verbose);
   1110   Opts.ObjCAutoRefCountExceptions = Args.hasArg(OPT_fobjc_arc_exceptions);
   1111   Opts.ObjCRuntimeHasARC = Args.hasArg(OPT_fobjc_runtime_has_arc);
   1112   Opts.ObjCRuntimeHasTerminate = Args.hasArg(OPT_fobjc_runtime_has_terminate);
   1113   Opts.CUDAIsDevice = Args.hasArg(OPT_fcuda_is_device);
   1114   Opts.CXAAtExit = !Args.hasArg(OPT_fno_use_cxa_atexit);
   1115   Opts.CXXCtorDtorAliases = Args.hasArg(OPT_mconstructor_aliases);
   1116   Opts.CodeModel = Args.getLastArgValue(OPT_mcode_model);
   1117   Opts.DebugPass = Args.getLastArgValue(OPT_mdebug_pass);
   1118   Opts.DisableFPElim = Args.hasArg(OPT_mdisable_fp_elim);
   1119   Opts.DisableTailCalls = Args.hasArg(OPT_mdisable_tail_calls);
   1120   Opts.FloatABI = Args.getLastArgValue(OPT_mfloat_abi);
   1121   Opts.HiddenWeakVTables = Args.hasArg(OPT_fhidden_weak_vtables);
   1122   Opts.LessPreciseFPMAD = Args.hasArg(OPT_cl_mad_enable);
   1123   Opts.LimitFloatPrecision = Args.getLastArgValue(OPT_mlimit_float_precision);
   1124   Opts.NoInfsFPMath = (Args.hasArg(OPT_menable_no_infinities) ||
   1125                        Args.hasArg(OPT_cl_finite_math_only)||
   1126                        Args.hasArg(OPT_cl_fast_relaxed_math));
   1127   Opts.NoNaNsFPMath = (Args.hasArg(OPT_menable_no_nans) ||
   1128                        Args.hasArg(OPT_cl_finite_math_only)||
   1129                        Args.hasArg(OPT_cl_fast_relaxed_math));
   1130   Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_mno_zero_initialized_in_bss);
   1131   Opts.BackendOptions = Args.getAllArgValues(OPT_backend_option);
   1132   Opts.NumRegisterParameters = Args.getLastArgIntValue(OPT_mregparm, 0, Diags);
   1133   Opts.NoGlobalMerge = Args.hasArg(OPT_mno_global_merge);
   1134   Opts.NoExecStack = Args.hasArg(OPT_mno_exec_stack);
   1135   Opts.RelaxAll = Args.hasArg(OPT_mrelax_all);
   1136   Opts.OmitLeafFramePointer = Args.hasArg(OPT_momit_leaf_frame_pointer);
   1137   Opts.SaveTempLabels = Args.hasArg(OPT_msave_temp_labels);
   1138   Opts.NoDwarf2CFIAsm = Args.hasArg(OPT_fno_dwarf2_cfi_asm);
   1139   Opts.NoDwarfDirectoryAsm = Args.hasArg(OPT_fno_dwarf_directory_asm);
   1140   Opts.SoftFloat = Args.hasArg(OPT_msoft_float);
   1141   Opts.StrictEnums = Args.hasArg(OPT_fstrict_enums);
   1142   Opts.UnsafeFPMath = Args.hasArg(OPT_menable_unsafe_fp_math) ||
   1143                       Args.hasArg(OPT_cl_unsafe_math_optimizations) ||
   1144                       Args.hasArg(OPT_cl_fast_relaxed_math);
   1145   Opts.UnwindTables = Args.hasArg(OPT_munwind_tables);
   1146   Opts.RelocationModel = Args.getLastArgValue(OPT_mrelocation_model, "pic");
   1147   Opts.TrapFuncName = Args.getLastArgValue(OPT_ftrap_function_EQ);
   1148 
   1149   Opts.FunctionSections = Args.hasArg(OPT_ffunction_sections);
   1150   Opts.DataSections = Args.hasArg(OPT_fdata_sections);
   1151 
   1152   Opts.MainFileName = Args.getLastArgValue(OPT_main_file_name);
   1153   Opts.VerifyModule = !Args.hasArg(OPT_disable_llvm_verifier);
   1154 
   1155   Opts.InstrumentFunctions = Args.hasArg(OPT_finstrument_functions);
   1156   Opts.InstrumentForProfiling = Args.hasArg(OPT_pg);
   1157   Opts.EmitGcovArcs = Args.hasArg(OPT_femit_coverage_data);
   1158   Opts.EmitGcovNotes = Args.hasArg(OPT_femit_coverage_notes);
   1159   Opts.CoverageFile = Args.getLastArgValue(OPT_coverage_file);
   1160   Opts.DebugCompilationDir = Args.getLastArgValue(OPT_fdebug_compilation_dir);
   1161   Opts.LinkBitcodeFile = Args.getLastArgValue(OPT_mlink_bitcode_file);
   1162   Opts.StackRealignment = Args.hasArg(OPT_mstackrealign);
   1163   if (Arg *A = Args.getLastArg(OPT_mstack_alignment)) {
   1164     StringRef Val = A->getValue(Args);
   1165     Val.getAsInteger(10, Opts.StackAlignment);
   1166   }
   1167 
   1168   if (Arg *A = Args.getLastArg(OPT_fobjc_dispatch_method_EQ)) {
   1169     StringRef Name = A->getValue(Args);
   1170     unsigned Method = llvm::StringSwitch<unsigned>(Name)
   1171       .Case("legacy", CodeGenOptions::Legacy)
   1172       .Case("non-legacy", CodeGenOptions::NonLegacy)
   1173       .Case("mixed", CodeGenOptions::Mixed)
   1174       .Default(~0U);
   1175     if (Method == ~0U) {
   1176       Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
   1177       Success = false;
   1178     } else {
   1179       Opts.ObjCDispatchMethod = Method;
   1180     }
   1181   }
   1182 
   1183   return Success;
   1184 }
   1185 
   1186 static void ParseDependencyOutputArgs(DependencyOutputOptions &Opts,
   1187                                       ArgList &Args) {
   1188   using namespace cc1options;
   1189   Opts.OutputFile = Args.getLastArgValue(OPT_dependency_file);
   1190   Opts.Targets = Args.getAllArgValues(OPT_MT);
   1191   Opts.IncludeSystemHeaders = Args.hasArg(OPT_sys_header_deps);
   1192   Opts.UsePhonyTargets = Args.hasArg(OPT_MP);
   1193   Opts.ShowHeaderIncludes = Args.hasArg(OPT_H);
   1194   Opts.HeaderIncludeOutputFile = Args.getLastArgValue(OPT_header_include_file);
   1195   Opts.AddMissingHeaderDeps = Args.hasArg(OPT_MG);
   1196   Opts.DOTOutputFile = Args.getLastArgValue(OPT_dependency_dot);
   1197 }
   1198 
   1199 bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,
   1200                                 DiagnosticsEngine *Diags) {
   1201   using namespace cc1options;
   1202   bool Success = true;
   1203 
   1204   Opts.DiagnosticLogFile = Args.getLastArgValue(OPT_diagnostic_log_file);
   1205   Opts.DiagnosticSerializationFile =
   1206     Args.getLastArgValue(OPT_diagnostic_serialized_file);
   1207   Opts.IgnoreWarnings = Args.hasArg(OPT_w);
   1208   Opts.NoRewriteMacros = Args.hasArg(OPT_Wno_rewrite_macros);
   1209   Opts.Pedantic = Args.hasArg(OPT_pedantic);
   1210   Opts.PedanticErrors = Args.hasArg(OPT_pedantic_errors);
   1211   Opts.ShowCarets = !Args.hasArg(OPT_fno_caret_diagnostics);
   1212   Opts.ShowColors = Args.hasArg(OPT_fcolor_diagnostics);
   1213   Opts.ShowColumn = Args.hasFlag(OPT_fshow_column,
   1214                                  OPT_fno_show_column,
   1215                                  /*Default=*/true);
   1216   Opts.ShowFixits = !Args.hasArg(OPT_fno_diagnostics_fixit_info);
   1217   Opts.ShowLocation = !Args.hasArg(OPT_fno_show_source_location);
   1218   Opts.ShowOptionNames = Args.hasArg(OPT_fdiagnostics_show_option);
   1219 
   1220   // Default behavior is to not to show note include stacks.
   1221   Opts.ShowNoteIncludeStack = false;
   1222   if (Arg *A = Args.getLastArg(OPT_fdiagnostics_show_note_include_stack,
   1223                                OPT_fno_diagnostics_show_note_include_stack))
   1224     if (A->getOption().matches(OPT_fdiagnostics_show_note_include_stack))
   1225       Opts.ShowNoteIncludeStack = true;
   1226 
   1227   StringRef ShowOverloads =
   1228     Args.getLastArgValue(OPT_fshow_overloads_EQ, "all");
   1229   if (ShowOverloads == "best")
   1230     Opts.ShowOverloads = DiagnosticsEngine::Ovl_Best;
   1231   else if (ShowOverloads == "all")
   1232     Opts.ShowOverloads = DiagnosticsEngine::Ovl_All;
   1233   else {
   1234     Success = false;
   1235     if (Diags)
   1236       Diags->Report(diag::err_drv_invalid_value)
   1237       << Args.getLastArg(OPT_fshow_overloads_EQ)->getAsString(Args)
   1238       << ShowOverloads;
   1239   }
   1240 
   1241   StringRef ShowCategory =
   1242     Args.getLastArgValue(OPT_fdiagnostics_show_category, "none");
   1243   if (ShowCategory == "none")
   1244     Opts.ShowCategories = 0;
   1245   else if (ShowCategory == "id")
   1246     Opts.ShowCategories = 1;
   1247   else if (ShowCategory == "name")
   1248     Opts.ShowCategories = 2;
   1249   else {
   1250     Success = false;
   1251     if (Diags)
   1252       Diags->Report(diag::err_drv_invalid_value)
   1253       << Args.getLastArg(OPT_fdiagnostics_show_category)->getAsString(Args)
   1254       << ShowCategory;
   1255   }
   1256 
   1257   StringRef Format =
   1258     Args.getLastArgValue(OPT_fdiagnostics_format, "clang");
   1259   if (Format == "clang")
   1260     Opts.Format = DiagnosticOptions::Clang;
   1261   else if (Format == "msvc")
   1262     Opts.Format = DiagnosticOptions::Msvc;
   1263   else if (Format == "vi")
   1264     Opts.Format = DiagnosticOptions::Vi;
   1265   else {
   1266     Success = false;
   1267     if (Diags)
   1268       Diags->Report(diag::err_drv_invalid_value)
   1269       << Args.getLastArg(OPT_fdiagnostics_format)->getAsString(Args)
   1270       << Format;
   1271   }
   1272 
   1273   Opts.ShowSourceRanges = Args.hasArg(OPT_fdiagnostics_print_source_range_info);
   1274   Opts.ShowParseableFixits = Args.hasArg(OPT_fdiagnostics_parseable_fixits);
   1275   Opts.VerifyDiagnostics = Args.hasArg(OPT_verify);
   1276   Opts.ErrorLimit = Args.getLastArgIntValue(OPT_ferror_limit, 0, Diags);
   1277   Opts.MacroBacktraceLimit
   1278     = Args.getLastArgIntValue(OPT_fmacro_backtrace_limit,
   1279                          DiagnosticOptions::DefaultMacroBacktraceLimit, Diags);
   1280   Opts.TemplateBacktraceLimit
   1281     = Args.getLastArgIntValue(OPT_ftemplate_backtrace_limit,
   1282                          DiagnosticOptions::DefaultTemplateBacktraceLimit,
   1283                          Diags);
   1284   Opts.ConstexprBacktraceLimit
   1285     = Args.getLastArgIntValue(OPT_fconstexpr_backtrace_limit,
   1286                          DiagnosticOptions::DefaultConstexprBacktraceLimit,
   1287                          Diags);
   1288   Opts.TabStop = Args.getLastArgIntValue(OPT_ftabstop,
   1289                                     DiagnosticOptions::DefaultTabStop, Diags);
   1290   if (Opts.TabStop == 0 || Opts.TabStop > DiagnosticOptions::MaxTabStop) {
   1291     Opts.TabStop = DiagnosticOptions::DefaultTabStop;
   1292     if (Diags)
   1293       Diags->Report(diag::warn_ignoring_ftabstop_value)
   1294       << Opts.TabStop << DiagnosticOptions::DefaultTabStop;
   1295   }
   1296   Opts.MessageLength = Args.getLastArgIntValue(OPT_fmessage_length, 0, Diags);
   1297   Opts.DumpBuildInformation = Args.getLastArgValue(OPT_dump_build_information);
   1298 
   1299   for (arg_iterator it = Args.filtered_begin(OPT_W),
   1300          ie = Args.filtered_end(); it != ie; ++it) {
   1301     StringRef V = (*it)->getValue(Args);
   1302     // "-Wl," and such are not warnings options.
   1303     if (V.startswith("l,") || V.startswith("a,") || V.startswith("p,"))
   1304       continue;
   1305 
   1306     Opts.Warnings.push_back(V);
   1307   }
   1308 
   1309   return Success;
   1310 }
   1311 
   1312 static void ParseFileSystemArgs(FileSystemOptions &Opts, ArgList &Args) {
   1313   Opts.WorkingDir = Args.getLastArgValue(OPT_working_directory);
   1314 }
   1315 
   1316 static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
   1317                                    DiagnosticsEngine &Diags) {
   1318   using namespace cc1options;
   1319   Opts.ProgramAction = frontend::ParseSyntaxOnly;
   1320   if (const Arg *A = Args.getLastArg(OPT_Action_Group)) {
   1321     switch (A->getOption().getID()) {
   1322     default:
   1323       llvm_unreachable("Invalid option in group!");
   1324     case OPT_ast_dump:
   1325       Opts.ProgramAction = frontend::ASTDump; break;
   1326     case OPT_ast_dump_xml:
   1327       Opts.ProgramAction = frontend::ASTDumpXML; break;
   1328     case OPT_ast_print:
   1329       Opts.ProgramAction = frontend::ASTPrint; break;
   1330     case OPT_ast_view:
   1331       Opts.ProgramAction = frontend::ASTView; break;
   1332     case OPT_dump_raw_tokens:
   1333       Opts.ProgramAction = frontend::DumpRawTokens; break;
   1334     case OPT_dump_tokens:
   1335       Opts.ProgramAction = frontend::DumpTokens; break;
   1336     case OPT_S:
   1337       Opts.ProgramAction = frontend::EmitAssembly; break;
   1338     case OPT_emit_llvm_bc:
   1339       Opts.ProgramAction = frontend::EmitBC; break;
   1340     case OPT_emit_html:
   1341       Opts.ProgramAction = frontend::EmitHTML; break;
   1342     case OPT_emit_llvm:
   1343       Opts.ProgramAction = frontend::EmitLLVM; break;
   1344     case OPT_emit_llvm_only:
   1345       Opts.ProgramAction = frontend::EmitLLVMOnly; break;
   1346     case OPT_emit_codegen_only:
   1347       Opts.ProgramAction = frontend::EmitCodeGenOnly; break;
   1348     case OPT_emit_obj:
   1349       Opts.ProgramAction = frontend::EmitObj; break;
   1350     case OPT_fixit_EQ:
   1351       Opts.FixItSuffix = A->getValue(Args);
   1352       // fall-through!
   1353     case OPT_fixit:
   1354       Opts.ProgramAction = frontend::FixIt; break;
   1355     case OPT_emit_module:
   1356       Opts.ProgramAction = frontend::GenerateModule; break;
   1357     case OPT_emit_pch:
   1358       Opts.ProgramAction = frontend::GeneratePCH; break;
   1359     case OPT_emit_pth:
   1360       Opts.ProgramAction = frontend::GeneratePTH; break;
   1361     case OPT_init_only:
   1362       Opts.ProgramAction = frontend::InitOnly; break;
   1363     case OPT_fsyntax_only:
   1364       Opts.ProgramAction = frontend::ParseSyntaxOnly; break;
   1365     case OPT_print_decl_contexts:
   1366       Opts.ProgramAction = frontend::PrintDeclContext; break;
   1367     case OPT_print_preamble:
   1368       Opts.ProgramAction = frontend::PrintPreamble; break;
   1369     case OPT_E:
   1370       Opts.ProgramAction = frontend::PrintPreprocessedInput; break;
   1371     case OPT_rewrite_macros:
   1372       Opts.ProgramAction = frontend::RewriteMacros; break;
   1373     case OPT_rewrite_objc:
   1374       Opts.ProgramAction = frontend::RewriteObjC; break;
   1375     case OPT_rewrite_test:
   1376       Opts.ProgramAction = frontend::RewriteTest; break;
   1377     case OPT_analyze:
   1378       Opts.ProgramAction = frontend::RunAnalysis; break;
   1379     case OPT_migrate:
   1380       Opts.ProgramAction = frontend::MigrateSource; break;
   1381     case OPT_Eonly:
   1382       Opts.ProgramAction = frontend::RunPreprocessorOnly; break;
   1383     }
   1384   }
   1385 
   1386   if (const Arg* A = Args.getLastArg(OPT_plugin)) {
   1387     Opts.Plugins.push_back(A->getValue(Args,0));
   1388     Opts.ProgramAction = frontend::PluginAction;
   1389     Opts.ActionName = A->getValue(Args);
   1390 
   1391     for (arg_iterator it = Args.filtered_begin(OPT_plugin_arg),
   1392            end = Args.filtered_end(); it != end; ++it) {
   1393       if ((*it)->getValue(Args, 0) == Opts.ActionName)
   1394         Opts.PluginArgs.push_back((*it)->getValue(Args, 1));
   1395     }
   1396   }
   1397 
   1398   Opts.AddPluginActions = Args.getAllArgValues(OPT_add_plugin);
   1399   Opts.AddPluginArgs.resize(Opts.AddPluginActions.size());
   1400   for (int i = 0, e = Opts.AddPluginActions.size(); i != e; ++i) {
   1401     for (arg_iterator it = Args.filtered_begin(OPT_plugin_arg),
   1402            end = Args.filtered_end(); it != end; ++it) {
   1403       if ((*it)->getValue(Args, 0) == Opts.AddPluginActions[i])
   1404         Opts.AddPluginArgs[i].push_back((*it)->getValue(Args, 1));
   1405     }
   1406   }
   1407 
   1408   if (const Arg *A = Args.getLastArg(OPT_code_completion_at)) {
   1409     Opts.CodeCompletionAt =
   1410       ParsedSourceLocation::FromString(A->getValue(Args));
   1411     if (Opts.CodeCompletionAt.FileName.empty())
   1412       Diags.Report(diag::err_drv_invalid_value)
   1413         << A->getAsString(Args) << A->getValue(Args);
   1414   }
   1415   Opts.DisableFree = Args.hasArg(OPT_disable_free);
   1416 
   1417   Opts.OutputFile = Args.getLastArgValue(OPT_o);
   1418   Opts.Plugins = Args.getAllArgValues(OPT_load);
   1419   Opts.RelocatablePCH = Args.hasArg(OPT_relocatable_pch);
   1420   Opts.ShowHelp = Args.hasArg(OPT_help);
   1421   Opts.ShowMacrosInCodeCompletion = Args.hasArg(OPT_code_completion_macros);
   1422   Opts.ShowCodePatternsInCodeCompletion
   1423     = Args.hasArg(OPT_code_completion_patterns);
   1424   Opts.ShowGlobalSymbolsInCodeCompletion
   1425     = !Args.hasArg(OPT_no_code_completion_globals);
   1426   Opts.ShowStats = Args.hasArg(OPT_print_stats);
   1427   Opts.ShowTimers = Args.hasArg(OPT_ftime_report);
   1428   Opts.ShowVersion = Args.hasArg(OPT_version);
   1429   Opts.ASTMergeFiles = Args.getAllArgValues(OPT_ast_merge);
   1430   Opts.LLVMArgs = Args.getAllArgValues(OPT_mllvm);
   1431   Opts.FixWhatYouCan = Args.hasArg(OPT_fix_what_you_can);
   1432   Opts.FixOnlyWarnings = Args.hasArg(OPT_fix_only_warnings);
   1433   Opts.FixAndRecompile = Args.hasArg(OPT_fixit_recompile);
   1434   Opts.FixToTemporaries = Args.hasArg(OPT_fixit_to_temp);
   1435   Opts.OverrideRecordLayoutsFile
   1436     = Args.getLastArgValue(OPT_foverride_record_layout_EQ);
   1437   if (const Arg *A = Args.getLastArg(OPT_arcmt_check,
   1438                                      OPT_arcmt_modify,
   1439                                      OPT_arcmt_migrate)) {
   1440     switch (A->getOption().getID()) {
   1441     default:
   1442       llvm_unreachable("missed a case");
   1443     case OPT_arcmt_check:
   1444       Opts.ARCMTAction = FrontendOptions::ARCMT_Check;
   1445       break;
   1446     case OPT_arcmt_modify:
   1447       Opts.ARCMTAction = FrontendOptions::ARCMT_Modify;
   1448       break;
   1449     case OPT_arcmt_migrate:
   1450       Opts.ARCMTAction = FrontendOptions::ARCMT_Migrate;
   1451       break;
   1452     }
   1453   }
   1454   Opts.MTMigrateDir = Args.getLastArgValue(OPT_mt_migrate_directory);
   1455   Opts.ARCMTMigrateReportOut
   1456     = Args.getLastArgValue(OPT_arcmt_migrate_report_output);
   1457   Opts.ARCMTMigrateEmitARCErrors
   1458     = Args.hasArg(OPT_arcmt_migrate_emit_arc_errors);
   1459 
   1460   if (Args.hasArg(OPT_objcmt_migrate_literals))
   1461     Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Literals;
   1462   if (Args.hasArg(OPT_objcmt_migrate_subscripting))
   1463     Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Subscripting;
   1464 
   1465   if (Opts.ARCMTAction != FrontendOptions::ARCMT_None &&
   1466       Opts.ObjCMTAction != FrontendOptions::ObjCMT_None) {
   1467     Diags.Report(diag::err_drv_argument_not_allowed_with)
   1468       << "ARC migration" << "ObjC migration";
   1469   }
   1470 
   1471   InputKind DashX = IK_None;
   1472   if (const Arg *A = Args.getLastArg(OPT_x)) {
   1473     DashX = llvm::StringSwitch<InputKind>(A->getValue(Args))
   1474       .Case("c", IK_C)
   1475       .Case("cl", IK_OpenCL)
   1476       .Case("cuda", IK_CUDA)
   1477       .Case("c++", IK_CXX)
   1478       .Case("objective-c", IK_ObjC)
   1479       .Case("objective-c++", IK_ObjCXX)
   1480       .Case("cpp-output", IK_PreprocessedC)
   1481       .Case("assembler-with-cpp", IK_Asm)
   1482       .Case("c++-cpp-output", IK_PreprocessedCXX)
   1483       .Case("objective-c-cpp-output", IK_PreprocessedObjC)
   1484       .Case("objc-cpp-output", IK_PreprocessedObjC)
   1485       .Case("objective-c++-cpp-output", IK_PreprocessedObjCXX)
   1486       .Case("objc++-cpp-output", IK_PreprocessedObjCXX)
   1487       .Case("c-header", IK_C)
   1488       .Case("cl-header", IK_OpenCL)
   1489       .Case("objective-c-header", IK_ObjC)
   1490       .Case("c++-header", IK_CXX)
   1491       .Case("objective-c++-header", IK_ObjCXX)
   1492       .Case("ast", IK_AST)
   1493       .Case("ir", IK_LLVM_IR)
   1494       .Default(IK_None);
   1495     if (DashX == IK_None)
   1496       Diags.Report(diag::err_drv_invalid_value)
   1497         << A->getAsString(Args) << A->getValue(Args);
   1498   }
   1499 
   1500   // '-' is the default input if none is given.
   1501   std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT);
   1502   Opts.Inputs.clear();
   1503   if (Inputs.empty())
   1504     Inputs.push_back("-");
   1505   for (unsigned i = 0, e = Inputs.size(); i != e; ++i) {
   1506     InputKind IK = DashX;
   1507     if (IK == IK_None) {
   1508       IK = FrontendOptions::getInputKindForExtension(
   1509         StringRef(Inputs[i]).rsplit('.').second);
   1510       // FIXME: Remove this hack.
   1511       if (i == 0)
   1512         DashX = IK;
   1513     }
   1514     Opts.Inputs.push_back(FrontendInputFile(Inputs[i], IK));
   1515   }
   1516 
   1517   return DashX;
   1518 }
   1519 
   1520 std::string CompilerInvocation::GetResourcesPath(const char *Argv0,
   1521                                                  void *MainAddr) {
   1522   llvm::sys::Path P = llvm::sys::Path::GetMainExecutable(Argv0, MainAddr);
   1523 
   1524   if (!P.isEmpty()) {
   1525     P.eraseComponent();  // Remove /clang from foo/bin/clang
   1526     P.eraseComponent();  // Remove /bin   from foo/bin
   1527 
   1528     // Get foo/lib/clang/<version>/include
   1529     P.appendComponent("lib");
   1530     P.appendComponent("clang");
   1531     P.appendComponent(CLANG_VERSION_STRING);
   1532   }
   1533 
   1534   return P.str();
   1535 }
   1536 
   1537 static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) {
   1538   using namespace cc1options;
   1539   Opts.Sysroot = Args.getLastArgValue(OPT_isysroot, "/");
   1540   Opts.Verbose = Args.hasArg(OPT_v);
   1541   Opts.UseBuiltinIncludes = !Args.hasArg(OPT_nobuiltininc);
   1542   Opts.UseStandardSystemIncludes = !Args.hasArg(OPT_nostdsysteminc);
   1543   Opts.UseStandardCXXIncludes = !Args.hasArg(OPT_nostdincxx);
   1544   if (const Arg *A = Args.getLastArg(OPT_stdlib_EQ))
   1545     Opts.UseLibcxx = (strcmp(A->getValue(Args), "libc++") == 0);
   1546   Opts.ResourceDir = Args.getLastArgValue(OPT_resource_dir);
   1547   Opts.ModuleCachePath = Args.getLastArgValue(OPT_fmodule_cache_path);
   1548   Opts.DisableModuleHash = Args.hasArg(OPT_fdisable_module_hash);
   1549 
   1550   // Add -I..., -F..., and -index-header-map options in order.
   1551   bool IsIndexHeaderMap = false;
   1552   for (arg_iterator it = Args.filtered_begin(OPT_I, OPT_F,
   1553                                              OPT_index_header_map),
   1554        ie = Args.filtered_end(); it != ie; ++it) {
   1555     if ((*it)->getOption().matches(OPT_index_header_map)) {
   1556       // -index-header-map applies to the next -I or -F.
   1557       IsIndexHeaderMap = true;
   1558       continue;
   1559     }
   1560 
   1561     frontend::IncludeDirGroup Group
   1562       = IsIndexHeaderMap? frontend::IndexHeaderMap : frontend::Angled;
   1563 
   1564     Opts.AddPath((*it)->getValue(Args), Group, true,
   1565                  /*IsFramework=*/ (*it)->getOption().matches(OPT_F), false);
   1566     IsIndexHeaderMap = false;
   1567   }
   1568 
   1569   // Add -iprefix/-iwith-prefix/-iwithprefixbefore options.
   1570   StringRef Prefix = ""; // FIXME: This isn't the correct default prefix.
   1571   for (arg_iterator it = Args.filtered_begin(OPT_iprefix, OPT_iwithprefix,
   1572                                              OPT_iwithprefixbefore),
   1573          ie = Args.filtered_end(); it != ie; ++it) {
   1574     const Arg *A = *it;
   1575     if (A->getOption().matches(OPT_iprefix))
   1576       Prefix = A->getValue(Args);
   1577     else if (A->getOption().matches(OPT_iwithprefix))
   1578       Opts.AddPath(Prefix.str() + A->getValue(Args),
   1579                    frontend::System, false, false, false);
   1580     else
   1581       Opts.AddPath(Prefix.str() + A->getValue(Args),
   1582                    frontend::Angled, false, false, false);
   1583   }
   1584 
   1585   for (arg_iterator it = Args.filtered_begin(OPT_idirafter),
   1586          ie = Args.filtered_end(); it != ie; ++it)
   1587     Opts.AddPath((*it)->getValue(Args), frontend::After, true, false, false);
   1588   for (arg_iterator it = Args.filtered_begin(OPT_iquote),
   1589          ie = Args.filtered_end(); it != ie; ++it)
   1590     Opts.AddPath((*it)->getValue(Args), frontend::Quoted, true, false, false);
   1591   for (arg_iterator it = Args.filtered_begin(OPT_isystem,
   1592          OPT_iwithsysroot), ie = Args.filtered_end(); it != ie; ++it)
   1593     Opts.AddPath((*it)->getValue(Args), frontend::System, true, false,
   1594                  !(*it)->getOption().matches(OPT_iwithsysroot));
   1595   for (arg_iterator it = Args.filtered_begin(OPT_iframework),
   1596          ie = Args.filtered_end(); it != ie; ++it)
   1597     Opts.AddPath((*it)->getValue(Args), frontend::System, true, true,
   1598                  true);
   1599 
   1600   // Add the paths for the various language specific isystem flags.
   1601   for (arg_iterator it = Args.filtered_begin(OPT_c_isystem),
   1602        ie = Args.filtered_end(); it != ie; ++it)
   1603     Opts.AddPath((*it)->getValue(Args), frontend::CSystem, true, false, true);
   1604   for (arg_iterator it = Args.filtered_begin(OPT_cxx_isystem),
   1605        ie = Args.filtered_end(); it != ie; ++it)
   1606     Opts.AddPath((*it)->getValue(Args), frontend::CXXSystem, true, false, true);
   1607   for (arg_iterator it = Args.filtered_begin(OPT_objc_isystem),
   1608        ie = Args.filtered_end(); it != ie; ++it)
   1609     Opts.AddPath((*it)->getValue(Args), frontend::ObjCSystem, true, false,true);
   1610   for (arg_iterator it = Args.filtered_begin(OPT_objcxx_isystem),
   1611        ie = Args.filtered_end(); it != ie; ++it)
   1612     Opts.AddPath((*it)->getValue(Args), frontend::ObjCXXSystem, true, false,
   1613                  true);
   1614 
   1615   // Add the internal paths from a driver that detects standard include paths.
   1616   for (arg_iterator I = Args.filtered_begin(OPT_internal_isystem,
   1617                                             OPT_internal_externc_isystem),
   1618                     E = Args.filtered_end();
   1619        I != E; ++I)
   1620     Opts.AddPath((*I)->getValue(Args), frontend::System,
   1621                  false, false, /*IgnoreSysRoot=*/true, /*IsInternal=*/true,
   1622                  (*I)->getOption().matches(OPT_internal_externc_isystem));
   1623 }
   1624 
   1625 void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
   1626                                          LangStandard::Kind LangStd) {
   1627   // Set some properties which depend solely on the input kind; it would be nice
   1628   // to move these to the language standard, and have the driver resolve the
   1629   // input kind + language standard.
   1630   if (IK == IK_Asm) {
   1631     Opts.AsmPreprocessor = 1;
   1632   } else if (IK == IK_ObjC ||
   1633              IK == IK_ObjCXX ||
   1634              IK == IK_PreprocessedObjC ||
   1635              IK == IK_PreprocessedObjCXX) {
   1636     Opts.ObjC1 = Opts.ObjC2 = 1;
   1637   }
   1638 
   1639   if (LangStd == LangStandard::lang_unspecified) {
   1640     // Based on the base language, pick one.
   1641     switch (IK) {
   1642     case IK_None:
   1643     case IK_AST:
   1644     case IK_LLVM_IR:
   1645       llvm_unreachable("Invalid input kind!");
   1646     case IK_OpenCL:
   1647       LangStd = LangStandard::lang_opencl;
   1648       break;
   1649     case IK_CUDA:
   1650       LangStd = LangStandard::lang_cuda;
   1651       break;
   1652     case IK_Asm:
   1653     case IK_C:
   1654     case IK_PreprocessedC:
   1655     case IK_ObjC:
   1656     case IK_PreprocessedObjC:
   1657       LangStd = LangStandard::lang_gnu99;
   1658       break;
   1659     case IK_CXX:
   1660     case IK_PreprocessedCXX:
   1661     case IK_ObjCXX:
   1662     case IK_PreprocessedObjCXX:
   1663       LangStd = LangStandard::lang_gnucxx98;
   1664       break;
   1665     }
   1666   }
   1667 
   1668   const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
   1669   Opts.BCPLComment = Std.hasBCPLComments();
   1670   Opts.C99 = Std.isC99();
   1671   Opts.C11 = Std.isC11();
   1672   Opts.CPlusPlus = Std.isCPlusPlus();
   1673   Opts.CPlusPlus0x = Std.isCPlusPlus0x();
   1674   Opts.Digraphs = Std.hasDigraphs();
   1675   Opts.GNUMode = Std.isGNUMode();
   1676   Opts.GNUInline = !Std.isC99();
   1677   Opts.HexFloats = Std.hasHexFloats();
   1678   Opts.ImplicitInt = Std.hasImplicitInt();
   1679 
   1680   // OpenCL has some additional defaults.
   1681   if (LangStd == LangStandard::lang_opencl) {
   1682     Opts.OpenCL = 1;
   1683     Opts.AltiVec = 0;
   1684     Opts.CXXOperatorNames = 1;
   1685     Opts.LaxVectorConversions = 0;
   1686     Opts.DefaultFPContract = 1;
   1687   }
   1688 
   1689   if (LangStd == LangStandard::lang_cuda)
   1690     Opts.CUDA = 1;
   1691 
   1692   // OpenCL and C++ both have bool, true, false keywords.
   1693   Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
   1694 
   1695   Opts.GNUKeywords = Opts.GNUMode;
   1696   Opts.CXXOperatorNames = Opts.CPlusPlus;
   1697 
   1698   // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
   1699   // is specified, or -std is set to a conforming mode.
   1700   Opts.Trigraphs = !Opts.GNUMode;
   1701 
   1702   Opts.DollarIdents = !Opts.AsmPreprocessor;
   1703 }
   1704 
   1705 static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
   1706                           DiagnosticsEngine &Diags) {
   1707   // FIXME: Cleanup per-file based stuff.
   1708   LangStandard::Kind LangStd = LangStandard::lang_unspecified;
   1709   if (const Arg *A = Args.getLastArg(OPT_std_EQ)) {
   1710     LangStd = llvm::StringSwitch<LangStandard::Kind>(A->getValue(Args))
   1711 #define LANGSTANDARD(id, name, desc, features) \
   1712       .Case(name, LangStandard::lang_##id)
   1713 #include "clang/Frontend/LangStandards.def"
   1714       .Default(LangStandard::lang_unspecified);
   1715     if (LangStd == LangStandard::lang_unspecified)
   1716       Diags.Report(diag::err_drv_invalid_value)
   1717         << A->getAsString(Args) << A->getValue(Args);
   1718     else {
   1719       // Valid standard, check to make sure language and standard are compatable.
   1720       const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
   1721       switch (IK) {
   1722       case IK_C:
   1723       case IK_ObjC:
   1724       case IK_PreprocessedC:
   1725       case IK_PreprocessedObjC:
   1726         if (!(Std.isC89() || Std.isC99()))
   1727           Diags.Report(diag::err_drv_argument_not_allowed_with)
   1728             << A->getAsString(Args) << "C/ObjC";
   1729         break;
   1730       case IK_CXX:
   1731       case IK_ObjCXX:
   1732       case IK_PreprocessedCXX:
   1733       case IK_PreprocessedObjCXX:
   1734         if (!Std.isCPlusPlus())
   1735           Diags.Report(diag::err_drv_argument_not_allowed_with)
   1736             << A->getAsString(Args) << "C++/ObjC++";
   1737         break;
   1738       case IK_OpenCL:
   1739         if (!Std.isC99())
   1740           Diags.Report(diag::err_drv_argument_not_allowed_with)
   1741             << A->getAsString(Args) << "OpenCL";
   1742         break;
   1743       case IK_CUDA:
   1744         if (!Std.isCPlusPlus())
   1745           Diags.Report(diag::err_drv_argument_not_allowed_with)
   1746             << A->getAsString(Args) << "CUDA";
   1747         break;
   1748       default:
   1749         break;
   1750       }
   1751     }
   1752   }
   1753 
   1754   if (const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) {
   1755     if (strcmp(A->getValue(Args), "CL1.1") != 0) {
   1756       Diags.Report(diag::err_drv_invalid_value)
   1757         << A->getAsString(Args) << A->getValue(Args);
   1758     }
   1759   }
   1760 
   1761   CompilerInvocation::setLangDefaults(Opts, IK, LangStd);
   1762 
   1763   // We abuse '-f[no-]gnu-keywords' to force overriding all GNU-extension
   1764   // keywords. This behavior is provided by GCC's poorly named '-fasm' flag,
   1765   // while a subset (the non-C++ GNU keywords) is provided by GCC's
   1766   // '-fgnu-keywords'. Clang conflates the two for simplicity under the single
   1767   // name, as it doesn't seem a useful distinction.
   1768   Opts.GNUKeywords = Args.hasFlag(OPT_fgnu_keywords, OPT_fno_gnu_keywords,
   1769                                   Opts.GNUKeywords);
   1770 
   1771   if (Args.hasArg(OPT_fno_operator_names))
   1772     Opts.CXXOperatorNames = 0;
   1773 
   1774   if (Opts.ObjC1) {
   1775     if (Args.hasArg(OPT_fobjc_gc_only))
   1776       Opts.setGC(LangOptions::GCOnly);
   1777     else if (Args.hasArg(OPT_fobjc_gc))
   1778       Opts.setGC(LangOptions::HybridGC);
   1779     else if (Args.hasArg(OPT_fobjc_arc)) {
   1780       Opts.ObjCAutoRefCount = 1;
   1781       if (Args.hasArg(OPT_fobjc_fragile_abi))
   1782         Diags.Report(diag::err_arc_nonfragile_abi);
   1783     }
   1784 
   1785     if (Args.hasArg(OPT_fobjc_runtime_has_weak))
   1786       Opts.ObjCRuntimeHasWeak = 1;
   1787 
   1788     if (Args.hasArg(OPT_fno_objc_infer_related_result_type))
   1789       Opts.ObjCInferRelatedResultType = 0;
   1790   }
   1791 
   1792   if (Args.hasArg(OPT_fgnu89_inline))
   1793     Opts.GNUInline = 1;
   1794 
   1795   if (Args.hasArg(OPT_fapple_kext)) {
   1796     if (!Opts.CPlusPlus)
   1797       Diags.Report(diag::warn_c_kext);
   1798     else
   1799       Opts.AppleKext = 1;
   1800   }
   1801 
   1802   if (Args.hasArg(OPT_print_ivar_layout))
   1803     Opts.ObjCGCBitmapPrint = 1;
   1804   if (Args.hasArg(OPT_fno_constant_cfstrings))
   1805     Opts.NoConstantCFStrings = 1;
   1806 
   1807   if (Args.hasArg(OPT_faltivec))
   1808     Opts.AltiVec = 1;
   1809 
   1810   if (Args.hasArg(OPT_pthread))
   1811     Opts.POSIXThreads = 1;
   1812 
   1813   if (Args.hasArg(OPT_fdelayed_template_parsing))
   1814     Opts.DelayedTemplateParsing = 1;
   1815 
   1816   StringRef Vis = Args.getLastArgValue(OPT_fvisibility, "default");
   1817   if (Vis == "default")
   1818     Opts.setVisibilityMode(DefaultVisibility);
   1819   else if (Vis == "hidden")
   1820     Opts.setVisibilityMode(HiddenVisibility);
   1821   else if (Vis == "protected")
   1822     // FIXME: diagnose if target does not support protected visibility
   1823     Opts.setVisibilityMode(ProtectedVisibility);
   1824   else
   1825     Diags.Report(diag::err_drv_invalid_value)
   1826       << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
   1827 
   1828   if (Args.hasArg(OPT_fvisibility_inlines_hidden))
   1829     Opts.InlineVisibilityHidden = 1;
   1830 
   1831   if (Args.hasArg(OPT_ftrapv)) {
   1832     Opts.setSignedOverflowBehavior(LangOptions::SOB_Trapping);
   1833     // Set the handler, if one is specified.
   1834     Opts.OverflowHandler =
   1835         Args.getLastArgValue(OPT_ftrapv_handler);
   1836   }
   1837   else if (Args.hasArg(OPT_fwrapv))
   1838     Opts.setSignedOverflowBehavior(LangOptions::SOB_Defined);
   1839 
   1840   if (Args.hasArg(OPT_trigraphs))
   1841     Opts.Trigraphs = 1;
   1842 
   1843   Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
   1844                                    OPT_fno_dollars_in_identifiers,
   1845                                    Opts.DollarIdents);
   1846   Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
   1847   Opts.MicrosoftExt
   1848     = Args.hasArg(OPT_fms_extensions) || Args.hasArg(OPT_fms_compatibility);
   1849   Opts.MicrosoftMode = Args.hasArg(OPT_fms_compatibility);
   1850   Opts.MSCVersion = Args.getLastArgIntValue(OPT_fmsc_version, 0, Diags);
   1851   Opts.Borland = Args.hasArg(OPT_fborland_extensions);
   1852   Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
   1853   Opts.ConstStrings = Args.hasFlag(OPT_fconst_strings, OPT_fno_const_strings,
   1854                                    Opts.ConstStrings);
   1855   if (Args.hasArg(OPT_fno_lax_vector_conversions))
   1856     Opts.LaxVectorConversions = 0;
   1857   if (Args.hasArg(OPT_fno_threadsafe_statics))
   1858     Opts.ThreadsafeStatics = 0;
   1859   Opts.Exceptions = Args.hasArg(OPT_fexceptions);
   1860   Opts.ObjCExceptions = Args.hasArg(OPT_fobjc_exceptions);
   1861   Opts.CXXExceptions = Args.hasArg(OPT_fcxx_exceptions);
   1862   Opts.SjLjExceptions = Args.hasArg(OPT_fsjlj_exceptions);
   1863   Opts.TraditionalCPP = Args.hasArg(OPT_traditional_cpp);
   1864 
   1865   Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
   1866   Opts.Blocks = Args.hasArg(OPT_fblocks);
   1867   Opts.BlocksRuntimeOptional = Args.hasArg(OPT_fblocks_runtime_optional);
   1868   Opts.Modules = Args.hasArg(OPT_fmodules);
   1869   Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char);
   1870   Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
   1871   Opts.ShortEnums = Args.hasArg(OPT_fshort_enums);
   1872   Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
   1873   Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
   1874   Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
   1875   Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
   1876   Opts.AccessControl = !Args.hasArg(OPT_fno_access_control);
   1877   Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
   1878   Opts.MathErrno = Args.hasArg(OPT_fmath_errno);
   1879   Opts.InstantiationDepth = Args.getLastArgIntValue(OPT_ftemplate_depth, 1024,
   1880                                                     Diags);
   1881   Opts.ConstexprCallDepth = Args.getLastArgIntValue(OPT_fconstexpr_depth, 512,
   1882                                                     Diags);
   1883   Opts.DelayedTemplateParsing = Args.hasArg(OPT_fdelayed_template_parsing);
   1884   Opts.NumLargeByValueCopy = Args.getLastArgIntValue(OPT_Wlarge_by_value_copy,
   1885                                                     0, Diags);
   1886   Opts.MSBitfields = Args.hasArg(OPT_mms_bitfields);
   1887   Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
   1888   Opts.ObjCConstantStringClass =
   1889     Args.getLastArgValue(OPT_fconstant_string_class);
   1890   Opts.ObjCNonFragileABI = !Args.hasArg(OPT_fobjc_fragile_abi);
   1891   if (Opts.ObjCNonFragileABI)
   1892     Opts.ObjCNonFragileABI2 = true;
   1893   Opts.ObjCDefaultSynthProperties =
   1894     Args.hasArg(OPT_fobjc_default_synthesize_properties);
   1895   Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
   1896   Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
   1897   Opts.PackStruct = Args.getLastArgIntValue(OPT_fpack_struct, 0, Diags);
   1898   Opts.PICLevel = Args.getLastArgIntValue(OPT_pic_level, 0, Diags);
   1899   Opts.PIELevel = Args.getLastArgIntValue(OPT_pie_level, 0, Diags);
   1900   Opts.Static = Args.hasArg(OPT_static_define);
   1901   Opts.DumpRecordLayoutsSimple = Args.hasArg(OPT_fdump_record_layouts_simple);
   1902   Opts.DumpRecordLayouts = Opts.DumpRecordLayoutsSimple
   1903                         || Args.hasArg(OPT_fdump_record_layouts);
   1904   Opts.DumpVTableLayouts = Args.hasArg(OPT_fdump_vtable_layouts);
   1905   Opts.SpellChecking = !Args.hasArg(OPT_fno_spell_checking);
   1906   Opts.NoBitFieldTypeAlign = Args.hasArg(OPT_fno_bitfield_type_align);
   1907   Opts.SinglePrecisionConstants = Args.hasArg(OPT_cl_single_precision_constant);
   1908   Opts.FastRelaxedMath = Args.hasArg(OPT_cl_fast_relaxed_math);
   1909   Opts.MRTD = Args.hasArg(OPT_mrtd);
   1910   Opts.HexagonQdsp6Compat = Args.hasArg(OPT_mqdsp6_compat);
   1911   Opts.FakeAddressSpaceMap = Args.hasArg(OPT_ffake_address_space_map);
   1912   Opts.ParseUnknownAnytype = Args.hasArg(OPT_funknown_anytype);
   1913   Opts.DebuggerSupport = Args.hasArg(OPT_fdebugger_support);
   1914   Opts.DebuggerCastResultToId = Args.hasArg(OPT_fdebugger_cast_result_to_id);
   1915   Opts.DebuggerObjCLiteral = Args.hasArg(OPT_fdebugger_objc_literal);
   1916   Opts.AddressSanitizer = Args.hasArg(OPT_faddress_sanitizer);
   1917   Opts.ThreadSanitizer = Args.hasArg(OPT_fthread_sanitizer);
   1918   Opts.ApplePragmaPack = Args.hasArg(OPT_fapple_pragma_pack);
   1919   Opts.CurrentModule = Args.getLastArgValue(OPT_fmodule_name);
   1920 
   1921   // Record whether the __DEPRECATED define was requested.
   1922   Opts.Deprecated = Args.hasFlag(OPT_fdeprecated_macro,
   1923                                  OPT_fno_deprecated_macro,
   1924                                  Opts.Deprecated);
   1925 
   1926   // FIXME: Eliminate this dependency.
   1927   unsigned Opt = getOptimizationLevel(Args, IK, Diags);
   1928   Opts.Optimize = Opt != 0;
   1929   Opts.OptimizeSize = Args.hasArg(OPT_Os) || Args.hasArg(OPT_Oz);
   1930 
   1931   // This is the __NO_INLINE__ define, which just depends on things like the
   1932   // optimization level and -fno-inline, not actually whether the backend has
   1933   // inlining enabled.
   1934   Opts.NoInlineDefine = !Opt || Args.hasArg(OPT_fno_inline);
   1935 
   1936   Opts.FastMath = Args.hasArg(OPT_ffast_math);
   1937 
   1938   unsigned SSP = Args.getLastArgIntValue(OPT_stack_protector, 0, Diags);
   1939   switch (SSP) {
   1940   default:
   1941     Diags.Report(diag::err_drv_invalid_value)
   1942       << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
   1943     break;
   1944   case 0: Opts.setStackProtector(LangOptions::SSPOff); break;
   1945   case 1: Opts.setStackProtector(LangOptions::SSPOn);  break;
   1946   case 2: Opts.setStackProtector(LangOptions::SSPReq); break;
   1947   }
   1948 }
   1949 
   1950 static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,
   1951                                   FileManager &FileMgr,
   1952                                   DiagnosticsEngine &Diags) {
   1953   using namespace cc1options;
   1954   Opts.ImplicitPCHInclude = Args.getLastArgValue(OPT_include_pch);
   1955   Opts.ImplicitPTHInclude = Args.getLastArgValue(OPT_include_pth);
   1956   if (const Arg *A = Args.getLastArg(OPT_token_cache))
   1957       Opts.TokenCache = A->getValue(Args);
   1958   else
   1959     Opts.TokenCache = Opts.ImplicitPTHInclude;
   1960   Opts.UsePredefines = !Args.hasArg(OPT_undef);
   1961   Opts.DetailedRecord = Args.hasArg(OPT_detailed_preprocessing_record);
   1962   Opts.DisablePCHValidation = Args.hasArg(OPT_fno_validate_pch);
   1963 
   1964   Opts.DumpDeserializedPCHDecls = Args.hasArg(OPT_dump_deserialized_pch_decls);
   1965   for (arg_iterator it = Args.filtered_begin(OPT_error_on_deserialized_pch_decl),
   1966          ie = Args.filtered_end(); it != ie; ++it) {
   1967     const Arg *A = *it;
   1968     Opts.DeserializedPCHDeclsToErrorOn.insert(A->getValue(Args));
   1969   }
   1970 
   1971   if (const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) {
   1972     StringRef Value(A->getValue(Args));
   1973     size_t Comma = Value.find(',');
   1974     unsigned Bytes = 0;
   1975     unsigned EndOfLine = 0;
   1976 
   1977     if (Comma == StringRef::npos ||
   1978         Value.substr(0, Comma).getAsInteger(10, Bytes) ||
   1979         Value.substr(Comma + 1).getAsInteger(10, EndOfLine))
   1980       Diags.Report(diag::err_drv_preamble_format);
   1981     else {
   1982       Opts.PrecompiledPreambleBytes.first = Bytes;
   1983       Opts.PrecompiledPreambleBytes.second = (EndOfLine != 0);
   1984     }
   1985   }
   1986 
   1987   // Add macros from the command line.
   1988   for (arg_iterator it = Args.filtered_begin(OPT_D, OPT_U),
   1989          ie = Args.filtered_end(); it != ie; ++it) {
   1990     if ((*it)->getOption().matches(OPT_D))
   1991       Opts.addMacroDef((*it)->getValue(Args));
   1992     else
   1993       Opts.addMacroUndef((*it)->getValue(Args));
   1994   }
   1995 
   1996   Opts.MacroIncludes = Args.getAllArgValues(OPT_imacros);
   1997 
   1998   // Add the ordered list of -includes.
   1999   for (arg_iterator it = Args.filtered_begin(OPT_include, OPT_include_pch,
   2000                                              OPT_include_pth),
   2001          ie = Args.filtered_end(); it != ie; ++it) {
   2002     const Arg *A = *it;
   2003     // PCH is handled specially, we need to extra the original include path.
   2004     if (A->getOption().matches(OPT_include_pch)) {
   2005       std::string OriginalFile =
   2006         ASTReader::getOriginalSourceFile(A->getValue(Args), FileMgr, Diags);
   2007       if (OriginalFile.empty())
   2008         continue;
   2009 
   2010       Opts.Includes.push_back(OriginalFile);
   2011     } else
   2012       Opts.Includes.push_back(A->getValue(Args));
   2013   }
   2014 
   2015   for (arg_iterator it = Args.filtered_begin(OPT_chain_include),
   2016          ie = Args.filtered_end(); it != ie; ++it) {
   2017     const Arg *A = *it;
   2018     Opts.ChainedIncludes.push_back(A->getValue(Args));
   2019   }
   2020 
   2021   // Include 'altivec.h' if -faltivec option present
   2022   if (Args.hasArg(OPT_faltivec))
   2023     Opts.Includes.push_back("altivec.h");
   2024 
   2025   for (arg_iterator it = Args.filtered_begin(OPT_remap_file),
   2026          ie = Args.filtered_end(); it != ie; ++it) {
   2027     const Arg *A = *it;
   2028     std::pair<StringRef,StringRef> Split =
   2029       StringRef(A->getValue(Args)).split(';');
   2030 
   2031     if (Split.second.empty()) {
   2032       Diags.Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args);
   2033       continue;
   2034     }
   2035 
   2036     Opts.addRemappedFile(Split.first, Split.second);
   2037   }
   2038 
   2039   if (Arg *A = Args.getLastArg(OPT_fobjc_arc_cxxlib_EQ)) {
   2040     StringRef Name = A->getValue(Args);
   2041     unsigned Library = llvm::StringSwitch<unsigned>(Name)
   2042       .Case("libc++", ARCXX_libcxx)
   2043       .Case("libstdc++", ARCXX_libstdcxx)
   2044       .Case("none", ARCXX_nolib)
   2045       .Default(~0U);
   2046     if (Library == ~0U)
   2047       Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
   2048     else
   2049       Opts.ObjCXXARCStandardLibrary = (ObjCXXARCStandardLibraryKind)Library;
   2050   }
   2051 }
   2052 
   2053 static void ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts,
   2054                                         ArgList &Args) {
   2055   using namespace cc1options;
   2056   Opts.ShowCPP = !Args.hasArg(OPT_dM);
   2057   Opts.ShowComments = Args.hasArg(OPT_C);
   2058   Opts.ShowLineMarkers = !Args.hasArg(OPT_P);
   2059   Opts.ShowMacroComments = Args.hasArg(OPT_CC);
   2060   Opts.ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);
   2061 }
   2062 
   2063 static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args) {
   2064   using namespace cc1options;
   2065   Opts.ABI = Args.getLastArgValue(OPT_target_abi);
   2066   Opts.CXXABI = Args.getLastArgValue(OPT_cxx_abi);
   2067   Opts.CPU = Args.getLastArgValue(OPT_target_cpu);
   2068   Opts.Features = Args.getAllArgValues(OPT_target_feature);
   2069   Opts.LinkerVersion = Args.getLastArgValue(OPT_target_linker_version);
   2070   Opts.Triple = llvm::Triple::normalize(Args.getLastArgValue(OPT_triple));
   2071 
   2072   // Use the default target triple if unspecified.
   2073   if (Opts.Triple.empty())
   2074     Opts.Triple = llvm::sys::getDefaultTargetTriple();
   2075 }
   2076 
   2077 //
   2078 
   2079 bool CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,
   2080                                         const char *const *ArgBegin,
   2081                                         const char *const *ArgEnd,
   2082                                         DiagnosticsEngine &Diags) {
   2083   bool Success = true;
   2084 
   2085   // Parse the arguments.
   2086   OwningPtr<OptTable> Opts(createCC1OptTable());
   2087   unsigned MissingArgIndex, MissingArgCount;
   2088   OwningPtr<InputArgList> Args(
   2089     Opts->ParseArgs(ArgBegin, ArgEnd,MissingArgIndex, MissingArgCount));
   2090 
   2091   // Check for missing argument error.
   2092   if (MissingArgCount) {
   2093     Diags.Report(diag::err_drv_missing_argument)
   2094       << Args->getArgString(MissingArgIndex) << MissingArgCount;
   2095     Success = false;
   2096   }
   2097 
   2098   // Issue errors on unknown arguments.
   2099   for (arg_iterator it = Args->filtered_begin(OPT_UNKNOWN),
   2100          ie = Args->filtered_end(); it != ie; ++it) {
   2101     Diags.Report(diag::err_drv_unknown_argument) << (*it)->getAsString(*Args);
   2102     Success = false;
   2103   }
   2104 
   2105   Success = ParseAnalyzerArgs(Res.getAnalyzerOpts(), *Args, Diags) && Success;
   2106   Success = ParseMigratorArgs(Res.getMigratorOpts(), *Args) && Success;
   2107   ParseDependencyOutputArgs(Res.getDependencyOutputOpts(), *Args);
   2108   Success = ParseDiagnosticArgs(Res.getDiagnosticOpts(), *Args, &Diags)
   2109             && Success;
   2110   ParseFileSystemArgs(Res.getFileSystemOpts(), *Args);
   2111   // FIXME: We shouldn't have to pass the DashX option around here
   2112   InputKind DashX = ParseFrontendArgs(Res.getFrontendOpts(), *Args, Diags);
   2113   Success = ParseCodeGenArgs(Res.getCodeGenOpts(), *Args, DashX, Diags)
   2114             && Success;
   2115   ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), *Args);
   2116   if (DashX != IK_AST && DashX != IK_LLVM_IR) {
   2117     ParseLangArgs(*Res.getLangOpts(), *Args, DashX, Diags);
   2118     if (Res.getFrontendOpts().ProgramAction == frontend::RewriteObjC)
   2119       Res.getLangOpts()->ObjCExceptions = 1;
   2120   }
   2121   // FIXME: ParsePreprocessorArgs uses the FileManager to read the contents of
   2122   // PCH file and find the original header name. Remove the need to do that in
   2123   // ParsePreprocessorArgs and remove the FileManager
   2124   // parameters from the function and the "FileManager.h" #include.
   2125   FileManager FileMgr(Res.getFileSystemOpts());
   2126   ParsePreprocessorArgs(Res.getPreprocessorOpts(), *Args, FileMgr, Diags);
   2127   ParsePreprocessorOutputArgs(Res.getPreprocessorOutputOpts(), *Args);
   2128   ParseTargetArgs(Res.getTargetOpts(), *Args);
   2129 
   2130   return Success;
   2131 }
   2132 
   2133 namespace {
   2134 
   2135   class ModuleSignature {
   2136     llvm::SmallVector<uint64_t, 16> Data;
   2137     unsigned CurBit;
   2138     uint64_t CurValue;
   2139 
   2140   public:
   2141     ModuleSignature() : CurBit(0), CurValue(0) { }
   2142 
   2143     void add(uint64_t Value, unsigned Bits);
   2144     void add(StringRef Value);
   2145     void flush();
   2146 
   2147     llvm::APInt getAsInteger() const;
   2148   };
   2149 }
   2150 
   2151 void ModuleSignature::add(uint64_t Value, unsigned int NumBits) {
   2152   CurValue |= Value << CurBit;
   2153   if (CurBit + NumBits < 64) {
   2154     CurBit += NumBits;
   2155     return;
   2156   }
   2157 
   2158   // Add the current word.
   2159   Data.push_back(CurValue);
   2160 
   2161   if (CurBit)
   2162     CurValue = Value >> (64-CurBit);
   2163   else
   2164     CurValue = 0;
   2165   CurBit = (CurBit+NumBits) & 63;
   2166 }
   2167 
   2168 void ModuleSignature::flush() {
   2169   if (CurBit == 0)
   2170     return;
   2171 
   2172   Data.push_back(CurValue);
   2173   CurBit = 0;
   2174   CurValue = 0;
   2175 }
   2176 
   2177 void ModuleSignature::add(StringRef Value) {
   2178   for (StringRef::iterator I = Value.begin(), IEnd = Value.end(); I != IEnd;++I)
   2179     add(*I, 8);
   2180 }
   2181 
   2182 llvm::APInt ModuleSignature::getAsInteger() const {
   2183   return llvm::APInt(Data.size() * 64, Data);
   2184 }
   2185 
   2186 std::string CompilerInvocation::getModuleHash() const {
   2187   ModuleSignature Signature;
   2188 
   2189   // Start the signature with the compiler version.
   2190   // FIXME: The full version string can be quite long.  Omit it from the
   2191   // module hash for now to avoid failures where the path name becomes too
   2192   // long.  An MD5 or similar checksum would work well here.
   2193   // Signature.add(getClangFullRepositoryVersion());
   2194 
   2195   // Extend the signature with the language options
   2196 #define LANGOPT(Name, Bits, Default, Description) \
   2197   Signature.add(LangOpts->Name, Bits);
   2198 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
   2199   Signature.add(static_cast<unsigned>(LangOpts->get##Name()), Bits);
   2200 #define BENIGN_LANGOPT(Name, Bits, Default, Description)
   2201 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
   2202 #include "clang/Basic/LangOptions.def"
   2203 
   2204   // Extend the signature with the target triple
   2205   llvm::Triple T(TargetOpts.Triple);
   2206   Signature.add((unsigned)T.getArch(), 5);
   2207   Signature.add((unsigned)T.getVendor(), 4);
   2208   Signature.add((unsigned)T.getOS(), 5);
   2209   Signature.add((unsigned)T.getEnvironment(), 4);
   2210 
   2211   // Extend the signature with preprocessor options.
   2212   Signature.add(getPreprocessorOpts().UsePredefines, 1);
   2213   Signature.add(getPreprocessorOpts().DetailedRecord, 1);
   2214 
   2215   // Hash the preprocessor defines.
   2216   // FIXME: This is terrible. Use an MD5 sum of the preprocessor defines.
   2217   std::vector<StringRef> MacroDefs;
   2218   for (std::vector<std::pair<std::string, bool/*isUndef*/> >::const_iterator
   2219             I = getPreprocessorOpts().Macros.begin(),
   2220          IEnd = getPreprocessorOpts().Macros.end();
   2221        I != IEnd; ++I) {
   2222     if (!I->second)
   2223       MacroDefs.push_back(I->first);
   2224   }
   2225   llvm::array_pod_sort(MacroDefs.begin(), MacroDefs.end());
   2226 
   2227   unsigned PPHashResult = 0;
   2228   for (unsigned I = 0, N = MacroDefs.size(); I != N; ++I)
   2229     PPHashResult = llvm::HashString(MacroDefs[I], PPHashResult);
   2230   Signature.add(PPHashResult, 32);
   2231 
   2232   // We've generated the signature. Treat it as one large APInt that we'll
   2233   // encode in base-36 and return.
   2234   Signature.flush();
   2235   return Signature.getAsInteger().toString(36, /*Signed=*/false);
   2236 }
   2237