CompilerInvocation.cpp revision 280031
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/FileManager.h"
12#include "clang/Basic/Version.h"
13#include "clang/Config/config.h"
14#include "clang/Driver/DriverDiagnostic.h"
15#include "clang/Driver/Options.h"
16#include "clang/Driver/Util.h"
17#include "clang/Frontend/FrontendDiagnostic.h"
18#include "clang/Frontend/LangStandard.h"
19#include "clang/Frontend/Utils.h"
20#include "clang/Lex/HeaderSearchOptions.h"
21#include "clang/Serialization/ASTReader.h"
22#include "llvm/ADT/Hashing.h"
23#include "llvm/ADT/STLExtras.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/Option/Arg.h"
29#include "llvm/Option/ArgList.h"
30#include "llvm/Option/OptTable.h"
31#include "llvm/Option/Option.h"
32#include "llvm/Support/CodeGen.h"
33#include "llvm/Support/ErrorHandling.h"
34#include "llvm/Support/FileSystem.h"
35#include "llvm/Support/Host.h"
36#include "llvm/Support/Path.h"
37#include "llvm/Support/Process.h"
38#include <atomic>
39#include <memory>
40#include <sys/stat.h>
41#include <system_error>
42using namespace clang;
43
44//===----------------------------------------------------------------------===//
45// Initialization.
46//===----------------------------------------------------------------------===//
47
48CompilerInvocationBase::CompilerInvocationBase()
49  : LangOpts(new LangOptions()), TargetOpts(new TargetOptions()),
50    DiagnosticOpts(new DiagnosticOptions()),
51    HeaderSearchOpts(new HeaderSearchOptions()),
52    PreprocessorOpts(new PreprocessorOptions()) {}
53
54CompilerInvocationBase::CompilerInvocationBase(const CompilerInvocationBase &X)
55  : RefCountedBase<CompilerInvocation>(),
56    LangOpts(new LangOptions(*X.getLangOpts())),
57    TargetOpts(new TargetOptions(X.getTargetOpts())),
58    DiagnosticOpts(new DiagnosticOptions(X.getDiagnosticOpts())),
59    HeaderSearchOpts(new HeaderSearchOptions(X.getHeaderSearchOpts())),
60    PreprocessorOpts(new PreprocessorOptions(X.getPreprocessorOpts())) {}
61
62CompilerInvocationBase::~CompilerInvocationBase() {}
63
64//===----------------------------------------------------------------------===//
65// Deserialization (from args)
66//===----------------------------------------------------------------------===//
67
68using namespace clang::driver;
69using namespace clang::driver::options;
70using namespace llvm::opt;
71
72//
73
74static unsigned getOptimizationLevel(ArgList &Args, InputKind IK,
75                                     DiagnosticsEngine &Diags) {
76  unsigned DefaultOpt = 0;
77  if (IK == IK_OpenCL && !Args.hasArg(OPT_cl_opt_disable))
78    DefaultOpt = 2;
79
80  if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
81    if (A->getOption().matches(options::OPT_O0))
82      return 0;
83
84    if (A->getOption().matches(options::OPT_Ofast))
85      return 3;
86
87    assert (A->getOption().matches(options::OPT_O));
88
89    StringRef S(A->getValue());
90    if (S == "s" || S == "z" || S.empty())
91      return 2;
92
93    return getLastArgIntValue(Args, OPT_O, DefaultOpt, Diags);
94  }
95
96  return DefaultOpt;
97}
98
99static unsigned getOptimizationLevelSize(ArgList &Args) {
100  if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
101    if (A->getOption().matches(options::OPT_O)) {
102      switch (A->getValue()[0]) {
103      default:
104        return 0;
105      case 's':
106        return 1;
107      case 'z':
108        return 2;
109      }
110    }
111  }
112  return 0;
113}
114
115static void addDiagnosticArgs(ArgList &Args, OptSpecifier Group,
116                              OptSpecifier GroupWithValue,
117                              std::vector<std::string> &Diagnostics) {
118  for (Arg *A : Args.filtered(Group)) {
119    if (A->getOption().getKind() == Option::FlagClass) {
120      // The argument is a pure flag (such as OPT_Wall or OPT_Wdeprecated). Add
121      // its name (minus the "W" or "R" at the beginning) to the warning list.
122      Diagnostics.push_back(A->getOption().getName().drop_front(1));
123    } else if (A->getOption().matches(GroupWithValue)) {
124      // This is -Wfoo= or -Rfoo=, where foo is the name of the diagnostic group.
125      Diagnostics.push_back(A->getOption().getName().drop_front(1).rtrim("=-"));
126    } else {
127      // Otherwise, add its value (for OPT_W_Joined and similar).
128      for (const char *Arg : A->getValues())
129        Diagnostics.push_back(Arg);
130    }
131  }
132}
133
134static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,
135                              DiagnosticsEngine &Diags) {
136  using namespace options;
137  bool Success = true;
138  if (Arg *A = Args.getLastArg(OPT_analyzer_store)) {
139    StringRef Name = A->getValue();
140    AnalysisStores Value = llvm::StringSwitch<AnalysisStores>(Name)
141#define ANALYSIS_STORE(NAME, CMDFLAG, DESC, CREATFN) \
142      .Case(CMDFLAG, NAME##Model)
143#include "clang/StaticAnalyzer/Core/Analyses.def"
144      .Default(NumStores);
145    if (Value == NumStores) {
146      Diags.Report(diag::err_drv_invalid_value)
147        << A->getAsString(Args) << Name;
148      Success = false;
149    } else {
150      Opts.AnalysisStoreOpt = Value;
151    }
152  }
153
154  if (Arg *A = Args.getLastArg(OPT_analyzer_constraints)) {
155    StringRef Name = A->getValue();
156    AnalysisConstraints Value = llvm::StringSwitch<AnalysisConstraints>(Name)
157#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
158      .Case(CMDFLAG, NAME##Model)
159#include "clang/StaticAnalyzer/Core/Analyses.def"
160      .Default(NumConstraints);
161    if (Value == NumConstraints) {
162      Diags.Report(diag::err_drv_invalid_value)
163        << A->getAsString(Args) << Name;
164      Success = false;
165    } else {
166      Opts.AnalysisConstraintsOpt = Value;
167    }
168  }
169
170  if (Arg *A = Args.getLastArg(OPT_analyzer_output)) {
171    StringRef Name = A->getValue();
172    AnalysisDiagClients Value = llvm::StringSwitch<AnalysisDiagClients>(Name)
173#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \
174      .Case(CMDFLAG, PD_##NAME)
175#include "clang/StaticAnalyzer/Core/Analyses.def"
176      .Default(NUM_ANALYSIS_DIAG_CLIENTS);
177    if (Value == NUM_ANALYSIS_DIAG_CLIENTS) {
178      Diags.Report(diag::err_drv_invalid_value)
179        << A->getAsString(Args) << Name;
180      Success = false;
181    } else {
182      Opts.AnalysisDiagOpt = Value;
183    }
184  }
185
186  if (Arg *A = Args.getLastArg(OPT_analyzer_purge)) {
187    StringRef Name = A->getValue();
188    AnalysisPurgeMode Value = llvm::StringSwitch<AnalysisPurgeMode>(Name)
189#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \
190      .Case(CMDFLAG, NAME)
191#include "clang/StaticAnalyzer/Core/Analyses.def"
192      .Default(NumPurgeModes);
193    if (Value == NumPurgeModes) {
194      Diags.Report(diag::err_drv_invalid_value)
195        << A->getAsString(Args) << Name;
196      Success = false;
197    } else {
198      Opts.AnalysisPurgeOpt = Value;
199    }
200  }
201
202  if (Arg *A = Args.getLastArg(OPT_analyzer_inlining_mode)) {
203    StringRef Name = A->getValue();
204    AnalysisInliningMode Value = llvm::StringSwitch<AnalysisInliningMode>(Name)
205#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \
206      .Case(CMDFLAG, NAME)
207#include "clang/StaticAnalyzer/Core/Analyses.def"
208      .Default(NumInliningModes);
209    if (Value == NumInliningModes) {
210      Diags.Report(diag::err_drv_invalid_value)
211        << A->getAsString(Args) << Name;
212      Success = false;
213    } else {
214      Opts.InliningMode = Value;
215    }
216  }
217
218  Opts.ShowCheckerHelp = Args.hasArg(OPT_analyzer_checker_help);
219  Opts.DisableAllChecks = Args.hasArg(OPT_analyzer_disable_all_checks);
220
221  Opts.visualizeExplodedGraphWithGraphViz =
222    Args.hasArg(OPT_analyzer_viz_egraph_graphviz);
223  Opts.visualizeExplodedGraphWithUbiGraph =
224    Args.hasArg(OPT_analyzer_viz_egraph_ubigraph);
225  Opts.NoRetryExhausted = Args.hasArg(OPT_analyzer_disable_retry_exhausted);
226  Opts.AnalyzeAll = Args.hasArg(OPT_analyzer_opt_analyze_headers);
227  Opts.AnalyzerDisplayProgress = Args.hasArg(OPT_analyzer_display_progress);
228  Opts.AnalyzeNestedBlocks =
229    Args.hasArg(OPT_analyzer_opt_analyze_nested_blocks);
230  Opts.eagerlyAssumeBinOpBifurcation = Args.hasArg(OPT_analyzer_eagerly_assume);
231  Opts.AnalyzeSpecificFunction = Args.getLastArgValue(OPT_analyze_function);
232  Opts.UnoptimizedCFG = Args.hasArg(OPT_analysis_UnoptimizedCFG);
233  Opts.TrimGraph = Args.hasArg(OPT_trim_egraph);
234  Opts.maxBlockVisitOnPath =
235      getLastArgIntValue(Args, OPT_analyzer_max_loop, 4, Diags);
236  Opts.PrintStats = Args.hasArg(OPT_analyzer_stats);
237  Opts.InlineMaxStackDepth =
238      getLastArgIntValue(Args, OPT_analyzer_inline_max_stack_depth,
239                         Opts.InlineMaxStackDepth, Diags);
240
241  Opts.CheckersControlList.clear();
242  for (arg_iterator it = Args.filtered_begin(OPT_analyzer_checker,
243                                             OPT_analyzer_disable_checker),
244         ie = Args.filtered_end(); it != ie; ++it) {
245    const Arg *A = *it;
246    A->claim();
247    bool enable = (A->getOption().getID() == OPT_analyzer_checker);
248    // We can have a list of comma separated checker names, e.g:
249    // '-analyzer-checker=cocoa,unix'
250    StringRef checkerList = A->getValue();
251    SmallVector<StringRef, 4> checkers;
252    checkerList.split(checkers, ",");
253    for (unsigned i = 0, e = checkers.size(); i != e; ++i)
254      Opts.CheckersControlList.push_back(std::make_pair(checkers[i], enable));
255  }
256
257  // Go through the analyzer configuration options.
258  for (arg_iterator it = Args.filtered_begin(OPT_analyzer_config),
259       ie = Args.filtered_end(); it != ie; ++it) {
260    const Arg *A = *it;
261    A->claim();
262    // We can have a list of comma separated config names, e.g:
263    // '-analyzer-config key1=val1,key2=val2'
264    StringRef configList = A->getValue();
265    SmallVector<StringRef, 4> configVals;
266    configList.split(configVals, ",");
267    for (unsigned i = 0, e = configVals.size(); i != e; ++i) {
268      StringRef key, val;
269      std::tie(key, val) = configVals[i].split("=");
270      if (val.empty()) {
271        Diags.Report(SourceLocation(),
272                     diag::err_analyzer_config_no_value) << configVals[i];
273        Success = false;
274        break;
275      }
276      if (val.find('=') != StringRef::npos) {
277        Diags.Report(SourceLocation(),
278                     diag::err_analyzer_config_multiple_values)
279          << configVals[i];
280        Success = false;
281        break;
282      }
283      Opts.Config[key] = val;
284    }
285  }
286
287  return Success;
288}
289
290static bool ParseMigratorArgs(MigratorOptions &Opts, ArgList &Args) {
291  Opts.NoNSAllocReallocError = Args.hasArg(OPT_migrator_no_nsalloc_error);
292  Opts.NoFinalizeRemoval = Args.hasArg(OPT_migrator_no_finalize_removal);
293  return true;
294}
295
296static void ParseCommentArgs(CommentOptions &Opts, ArgList &Args) {
297  Opts.BlockCommandNames = Args.getAllArgValues(OPT_fcomment_block_commands);
298  Opts.ParseAllComments = Args.hasArg(OPT_fparse_all_comments);
299}
300
301static StringRef getCodeModel(ArgList &Args, DiagnosticsEngine &Diags) {
302  if (Arg *A = Args.getLastArg(OPT_mcode_model)) {
303    StringRef Value = A->getValue();
304    if (Value == "small" || Value == "kernel" || Value == "medium" ||
305        Value == "large")
306      return Value;
307    Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Value;
308  }
309  return "default";
310}
311
312/// \brief Create a new Regex instance out of the string value in \p RpassArg.
313/// It returns a pointer to the newly generated Regex instance.
314static std::shared_ptr<llvm::Regex>
315GenerateOptimizationRemarkRegex(DiagnosticsEngine &Diags, ArgList &Args,
316                                Arg *RpassArg) {
317  StringRef Val = RpassArg->getValue();
318  std::string RegexError;
319  std::shared_ptr<llvm::Regex> Pattern = std::make_shared<llvm::Regex>(Val);
320  if (!Pattern->isValid(RegexError)) {
321    Diags.Report(diag::err_drv_optimization_remark_pattern)
322        << RegexError << RpassArg->getAsString(Args);
323    Pattern.reset();
324  }
325  return Pattern;
326}
327
328static void parseSanitizerKinds(StringRef FlagName,
329                                const std::vector<std::string> &Sanitizers,
330                                DiagnosticsEngine &Diags, SanitizerSet &S) {
331  for (const auto &Sanitizer : Sanitizers) {
332    SanitizerKind K = llvm::StringSwitch<SanitizerKind>(Sanitizer)
333#define SANITIZER(NAME, ID) .Case(NAME, SanitizerKind::ID)
334#include "clang/Basic/Sanitizers.def"
335                          .Default(SanitizerKind::Unknown);
336    if (K == SanitizerKind::Unknown)
337      Diags.Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
338    else
339      S.set(K, true);
340  }
341}
342
343static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
344                             DiagnosticsEngine &Diags,
345                             const TargetOptions &TargetOpts) {
346  using namespace options;
347  bool Success = true;
348
349  unsigned OptimizationLevel = getOptimizationLevel(Args, IK, Diags);
350  // TODO: This could be done in Driver
351  unsigned MaxOptLevel = 3;
352  if (OptimizationLevel > MaxOptLevel) {
353    // If the optimization level is not supported, fall back on the default
354    // optimization
355    Diags.Report(diag::warn_drv_optimization_value)
356        << Args.getLastArg(OPT_O)->getAsString(Args) << "-O" << MaxOptLevel;
357    OptimizationLevel = MaxOptLevel;
358  }
359  Opts.OptimizationLevel = OptimizationLevel;
360
361  // We must always run at least the always inlining pass.
362  Opts.setInlining(
363    (Opts.OptimizationLevel > 1) ? CodeGenOptions::NormalInlining
364                                 : CodeGenOptions::OnlyAlwaysInlining);
365  // -fno-inline-functions overrides OptimizationLevel > 1.
366  Opts.NoInline = Args.hasArg(OPT_fno_inline);
367  Opts.setInlining(Args.hasArg(OPT_fno_inline_functions) ?
368                     CodeGenOptions::OnlyAlwaysInlining : Opts.getInlining());
369
370  if (Args.hasArg(OPT_gline_tables_only)) {
371    Opts.setDebugInfo(CodeGenOptions::DebugLineTablesOnly);
372  } else if (Args.hasArg(OPT_g_Flag) || Args.hasArg(OPT_gdwarf_2) ||
373             Args.hasArg(OPT_gdwarf_3) || Args.hasArg(OPT_gdwarf_4)) {
374    bool Default = false;
375    // Until dtrace (via CTF) and LLDB can deal with distributed debug info,
376    // Darwin and FreeBSD default to standalone/full debug info.
377    if (llvm::Triple(TargetOpts.Triple).isOSDarwin() ||
378        llvm::Triple(TargetOpts.Triple).isOSFreeBSD())
379      Default = true;
380
381    if (Args.hasFlag(OPT_fstandalone_debug, OPT_fno_standalone_debug, Default))
382      Opts.setDebugInfo(CodeGenOptions::FullDebugInfo);
383    else
384      Opts.setDebugInfo(CodeGenOptions::LimitedDebugInfo);
385  }
386  Opts.DebugColumnInfo = Args.hasArg(OPT_dwarf_column_info);
387  Opts.SplitDwarfFile = Args.getLastArgValue(OPT_split_dwarf_file);
388  if (Args.hasArg(OPT_gdwarf_2))
389    Opts.DwarfVersion = 2;
390  else if (Args.hasArg(OPT_gdwarf_3))
391    Opts.DwarfVersion = 3;
392  else if (Args.hasArg(OPT_gdwarf_4))
393    Opts.DwarfVersion = 4;
394  else if (Opts.getDebugInfo() != CodeGenOptions::NoDebugInfo)
395    // Default Dwarf version is 4 if we are generating debug information.
396    Opts.DwarfVersion = 4;
397
398  Opts.DisableLLVMOpts = Args.hasArg(OPT_disable_llvm_optzns);
399  Opts.DisableRedZone = Args.hasArg(OPT_disable_red_zone);
400  Opts.ForbidGuardVariables = Args.hasArg(OPT_fforbid_guard_variables);
401  Opts.UseRegisterSizedBitfieldAccess = Args.hasArg(
402    OPT_fuse_register_sized_bitfield_access);
403  Opts.RelaxedAliasing = Args.hasArg(OPT_relaxed_aliasing);
404  Opts.StructPathTBAA = !Args.hasArg(OPT_no_struct_path_tbaa);
405  Opts.DwarfDebugFlags = Args.getLastArgValue(OPT_dwarf_debug_flags);
406  Opts.MergeAllConstants = !Args.hasArg(OPT_fno_merge_all_constants);
407  Opts.NoCommon = Args.hasArg(OPT_fno_common);
408  Opts.NoImplicitFloat = Args.hasArg(OPT_no_implicit_float);
409  Opts.OptimizeSize = getOptimizationLevelSize(Args);
410  Opts.SimplifyLibCalls = !(Args.hasArg(OPT_fno_builtin) ||
411                            Args.hasArg(OPT_ffreestanding));
412  Opts.UnrollLoops =
413      Args.hasFlag(OPT_funroll_loops, OPT_fno_unroll_loops,
414                   (Opts.OptimizationLevel > 1 && !Opts.OptimizeSize));
415  Opts.RerollLoops = Args.hasArg(OPT_freroll_loops);
416
417  Opts.DisableIntegratedAS = Args.hasArg(OPT_fno_integrated_as);
418  Opts.Autolink = !Args.hasArg(OPT_fno_autolink);
419  Opts.SampleProfileFile = Args.getLastArgValue(OPT_fprofile_sample_use_EQ);
420  Opts.ProfileInstrGenerate = Args.hasArg(OPT_fprofile_instr_generate);
421  Opts.InstrProfileInput = Args.getLastArgValue(OPT_fprofile_instr_use_EQ);
422  Opts.CoverageMapping = Args.hasArg(OPT_fcoverage_mapping);
423  Opts.DumpCoverageMapping = Args.hasArg(OPT_dump_coverage_mapping);
424  Opts.AsmVerbose = Args.hasArg(OPT_masm_verbose);
425  Opts.ObjCAutoRefCountExceptions = Args.hasArg(OPT_fobjc_arc_exceptions);
426  Opts.CUDAIsDevice = Args.hasArg(OPT_fcuda_is_device);
427  Opts.CXAAtExit = !Args.hasArg(OPT_fno_use_cxa_atexit);
428  Opts.CXXCtorDtorAliases = Args.hasArg(OPT_mconstructor_aliases);
429  Opts.CodeModel = getCodeModel(Args, Diags);
430  Opts.DebugPass = Args.getLastArgValue(OPT_mdebug_pass);
431  Opts.DisableFPElim = Args.hasArg(OPT_mdisable_fp_elim);
432  Opts.DisableFree = Args.hasArg(OPT_disable_free);
433  Opts.DisableTailCalls = Args.hasArg(OPT_mdisable_tail_calls);
434  Opts.FloatABI = Args.getLastArgValue(OPT_mfloat_abi);
435  Opts.LessPreciseFPMAD = Args.hasArg(OPT_cl_mad_enable);
436  Opts.LimitFloatPrecision = Args.getLastArgValue(OPT_mlimit_float_precision);
437  Opts.NoInfsFPMath = (Args.hasArg(OPT_menable_no_infinities) ||
438                       Args.hasArg(OPT_cl_finite_math_only) ||
439                       Args.hasArg(OPT_cl_fast_relaxed_math));
440  Opts.NoNaNsFPMath = (Args.hasArg(OPT_menable_no_nans) ||
441                       Args.hasArg(OPT_cl_unsafe_math_optimizations) ||
442                       Args.hasArg(OPT_cl_finite_math_only) ||
443                       Args.hasArg(OPT_cl_fast_relaxed_math));
444  Opts.NoSignedZeros = Args.hasArg(OPT_cl_no_signed_zeros);
445  Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_mno_zero_initialized_in_bss);
446  Opts.BackendOptions = Args.getAllArgValues(OPT_backend_option);
447  Opts.NumRegisterParameters = getLastArgIntValue(Args, OPT_mregparm, 0, Diags);
448  Opts.NoGlobalMerge = Args.hasArg(OPT_mno_global_merge);
449  Opts.NoExecStack = Args.hasArg(OPT_mno_exec_stack);
450  Opts.FatalWarnings = Args.hasArg(OPT_massembler_fatal_warnings);
451  Opts.EnableSegmentedStacks = Args.hasArg(OPT_split_stacks);
452  Opts.RelaxAll = Args.hasArg(OPT_mrelax_all);
453  Opts.OmitLeafFramePointer = Args.hasArg(OPT_momit_leaf_frame_pointer);
454  Opts.SaveTempLabels = Args.hasArg(OPT_msave_temp_labels);
455  Opts.NoDwarfDirectoryAsm = Args.hasArg(OPT_fno_dwarf_directory_asm);
456  Opts.SoftFloat = Args.hasArg(OPT_msoft_float);
457  Opts.StrictEnums = Args.hasArg(OPT_fstrict_enums);
458  Opts.UnsafeFPMath = Args.hasArg(OPT_menable_unsafe_fp_math) ||
459                      Args.hasArg(OPT_cl_unsafe_math_optimizations) ||
460                      Args.hasArg(OPT_cl_fast_relaxed_math);
461  Opts.UnwindTables = Args.hasArg(OPT_munwind_tables);
462  Opts.RelocationModel = Args.getLastArgValue(OPT_mrelocation_model, "pic");
463  Opts.ThreadModel = Args.getLastArgValue(OPT_mthread_model, "posix");
464  if (Opts.ThreadModel != "posix" && Opts.ThreadModel != "single")
465    Diags.Report(diag::err_drv_invalid_value)
466        << Args.getLastArg(OPT_mthread_model)->getAsString(Args)
467        << Opts.ThreadModel;
468  Opts.TrapFuncName = Args.getLastArgValue(OPT_ftrap_function_EQ);
469  Opts.UseInitArray = Args.hasArg(OPT_fuse_init_array);
470
471  Opts.FunctionSections = Args.hasFlag(OPT_ffunction_sections,
472                                       OPT_fno_function_sections, false);
473  Opts.DataSections = Args.hasFlag(OPT_fdata_sections,
474                                   OPT_fno_data_sections, false);
475  Opts.MergeFunctions = Args.hasArg(OPT_fmerge_functions);
476
477  Opts.VectorizeBB = Args.hasArg(OPT_vectorize_slp_aggressive);
478  Opts.VectorizeLoop = Args.hasArg(OPT_vectorize_loops);
479  Opts.VectorizeSLP = Args.hasArg(OPT_vectorize_slp);
480
481  Opts.MainFileName = Args.getLastArgValue(OPT_main_file_name);
482  Opts.VerifyModule = !Args.hasArg(OPT_disable_llvm_verifier);
483
484  Opts.DisableGCov = Args.hasArg(OPT_test_coverage);
485  Opts.EmitGcovArcs = Args.hasArg(OPT_femit_coverage_data);
486  Opts.EmitGcovNotes = Args.hasArg(OPT_femit_coverage_notes);
487  if (Opts.EmitGcovArcs || Opts.EmitGcovNotes) {
488    Opts.CoverageFile = Args.getLastArgValue(OPT_coverage_file);
489    Opts.CoverageExtraChecksum = Args.hasArg(OPT_coverage_cfg_checksum);
490    Opts.CoverageNoFunctionNamesInData =
491        Args.hasArg(OPT_coverage_no_function_names_in_data);
492    if (Args.hasArg(OPT_coverage_version_EQ)) {
493      StringRef CoverageVersion = Args.getLastArgValue(OPT_coverage_version_EQ);
494      if (CoverageVersion.size() != 4) {
495        Diags.Report(diag::err_drv_invalid_value)
496            << Args.getLastArg(OPT_coverage_version_EQ)->getAsString(Args)
497            << CoverageVersion;
498      } else {
499        memcpy(Opts.CoverageVersion, CoverageVersion.data(), 4);
500      }
501    }
502  }
503
504  Opts.InstrumentFunctions = Args.hasArg(OPT_finstrument_functions);
505  Opts.InstrumentForProfiling = Args.hasArg(OPT_pg);
506  Opts.EmitOpenCLArgMetadata = Args.hasArg(OPT_cl_kernel_arg_info);
507  Opts.CompressDebugSections = Args.hasArg(OPT_compress_debug_sections);
508  Opts.DebugCompilationDir = Args.getLastArgValue(OPT_fdebug_compilation_dir);
509  Opts.LinkBitcodeFile = Args.getLastArgValue(OPT_mlink_bitcode_file);
510  Opts.SanitizeCoverage =
511      getLastArgIntValue(Args, OPT_fsanitize_coverage, 0, Diags);
512  Opts.SanitizeMemoryTrackOrigins =
513      getLastArgIntValue(Args, OPT_fsanitize_memory_track_origins_EQ, 0, Diags);
514  Opts.SanitizeUndefinedTrapOnError =
515      Args.hasArg(OPT_fsanitize_undefined_trap_on_error);
516  Opts.SSPBufferSize =
517      getLastArgIntValue(Args, OPT_stack_protector_buffer_size, 8, Diags);
518  Opts.StackRealignment = Args.hasArg(OPT_mstackrealign);
519  if (Arg *A = Args.getLastArg(OPT_mstack_alignment)) {
520    StringRef Val = A->getValue();
521    unsigned StackAlignment = Opts.StackAlignment;
522    Val.getAsInteger(10, StackAlignment);
523    Opts.StackAlignment = StackAlignment;
524  }
525
526  if (Arg *A = Args.getLastArg(OPT_fobjc_dispatch_method_EQ)) {
527    StringRef Name = A->getValue();
528    unsigned Method = llvm::StringSwitch<unsigned>(Name)
529      .Case("legacy", CodeGenOptions::Legacy)
530      .Case("non-legacy", CodeGenOptions::NonLegacy)
531      .Case("mixed", CodeGenOptions::Mixed)
532      .Default(~0U);
533    if (Method == ~0U) {
534      Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
535      Success = false;
536    } else {
537      Opts.setObjCDispatchMethod(
538        static_cast<CodeGenOptions::ObjCDispatchMethodKind>(Method));
539    }
540  }
541
542  if (Arg *A = Args.getLastArg(OPT_ftlsmodel_EQ)) {
543    StringRef Name = A->getValue();
544    unsigned Model = llvm::StringSwitch<unsigned>(Name)
545        .Case("global-dynamic", CodeGenOptions::GeneralDynamicTLSModel)
546        .Case("local-dynamic", CodeGenOptions::LocalDynamicTLSModel)
547        .Case("initial-exec", CodeGenOptions::InitialExecTLSModel)
548        .Case("local-exec", CodeGenOptions::LocalExecTLSModel)
549        .Default(~0U);
550    if (Model == ~0U) {
551      Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
552      Success = false;
553    } else {
554      Opts.setDefaultTLSModel(static_cast<CodeGenOptions::TLSModel>(Model));
555    }
556  }
557
558  if (Arg *A = Args.getLastArg(OPT_ffp_contract)) {
559    StringRef Val = A->getValue();
560    if (Val == "fast")
561      Opts.setFPContractMode(CodeGenOptions::FPC_Fast);
562    else if (Val == "on")
563      Opts.setFPContractMode(CodeGenOptions::FPC_On);
564    else if (Val == "off")
565      Opts.setFPContractMode(CodeGenOptions::FPC_Off);
566    else
567      Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
568  }
569
570  if (Arg *A = Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return)) {
571    if (A->getOption().matches(OPT_fpcc_struct_return)) {
572      Opts.setStructReturnConvention(CodeGenOptions::SRCK_OnStack);
573    } else {
574      assert(A->getOption().matches(OPT_freg_struct_return));
575      Opts.setStructReturnConvention(CodeGenOptions::SRCK_InRegs);
576    }
577  }
578
579  Opts.DependentLibraries = Args.getAllArgValues(OPT_dependent_lib);
580  bool NeedLocTracking = false;
581
582  if (Arg *A = Args.getLastArg(OPT_Rpass_EQ)) {
583    Opts.OptimizationRemarkPattern =
584        GenerateOptimizationRemarkRegex(Diags, Args, A);
585    NeedLocTracking = true;
586  }
587
588  if (Arg *A = Args.getLastArg(OPT_Rpass_missed_EQ)) {
589    Opts.OptimizationRemarkMissedPattern =
590        GenerateOptimizationRemarkRegex(Diags, Args, A);
591    NeedLocTracking = true;
592  }
593
594  if (Arg *A = Args.getLastArg(OPT_Rpass_analysis_EQ)) {
595    Opts.OptimizationRemarkAnalysisPattern =
596        GenerateOptimizationRemarkRegex(Diags, Args, A);
597    NeedLocTracking = true;
598  }
599
600  // If the user requested to use a sample profile for PGO, then the
601  // backend will need to track source location information so the profile
602  // can be incorporated into the IR.
603  if (!Opts.SampleProfileFile.empty())
604    NeedLocTracking = true;
605
606  // If the user requested a flag that requires source locations available in
607  // the backend, make sure that the backend tracks source location information.
608  if (NeedLocTracking && Opts.getDebugInfo() == CodeGenOptions::NoDebugInfo)
609    Opts.setDebugInfo(CodeGenOptions::LocTrackingOnly);
610
611  Opts.RewriteMapFiles = Args.getAllArgValues(OPT_frewrite_map_file);
612
613  // Parse -fsanitize-recover= arguments.
614  // FIXME: Report unrecoverable sanitizers incorrectly specified here.
615  parseSanitizerKinds("-fsanitize-recover=",
616                      Args.getAllArgValues(OPT_fsanitize_recover_EQ), Diags,
617                      Opts.SanitizeRecover);
618
619  return Success;
620}
621
622static void ParseDependencyOutputArgs(DependencyOutputOptions &Opts,
623                                      ArgList &Args) {
624  using namespace options;
625  Opts.OutputFile = Args.getLastArgValue(OPT_dependency_file);
626  Opts.Targets = Args.getAllArgValues(OPT_MT);
627  Opts.IncludeSystemHeaders = Args.hasArg(OPT_sys_header_deps);
628  Opts.IncludeModuleFiles = Args.hasArg(OPT_module_file_deps);
629  Opts.UsePhonyTargets = Args.hasArg(OPT_MP);
630  Opts.ShowHeaderIncludes = Args.hasArg(OPT_H);
631  Opts.HeaderIncludeOutputFile = Args.getLastArgValue(OPT_header_include_file);
632  Opts.AddMissingHeaderDeps = Args.hasArg(OPT_MG);
633  Opts.PrintShowIncludes = Args.hasArg(OPT_show_includes);
634  Opts.DOTOutputFile = Args.getLastArgValue(OPT_dependency_dot);
635  Opts.ModuleDependencyOutputDir =
636      Args.getLastArgValue(OPT_module_dependency_dir);
637}
638
639bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,
640                                DiagnosticsEngine *Diags) {
641  using namespace options;
642  bool Success = true;
643
644  Opts.DiagnosticLogFile = Args.getLastArgValue(OPT_diagnostic_log_file);
645  if (Arg *A =
646          Args.getLastArg(OPT_diagnostic_serialized_file, OPT__serialize_diags))
647    Opts.DiagnosticSerializationFile = A->getValue();
648  Opts.IgnoreWarnings = Args.hasArg(OPT_w);
649  Opts.NoRewriteMacros = Args.hasArg(OPT_Wno_rewrite_macros);
650  Opts.Pedantic = Args.hasArg(OPT_pedantic);
651  Opts.PedanticErrors = Args.hasArg(OPT_pedantic_errors);
652  Opts.ShowCarets = !Args.hasArg(OPT_fno_caret_diagnostics);
653  Opts.ShowColors = Args.hasArg(OPT_fcolor_diagnostics);
654  Opts.ShowColumn = Args.hasFlag(OPT_fshow_column,
655                                 OPT_fno_show_column,
656                                 /*Default=*/true);
657  Opts.ShowFixits = !Args.hasArg(OPT_fno_diagnostics_fixit_info);
658  Opts.ShowLocation = !Args.hasArg(OPT_fno_show_source_location);
659  Opts.ShowOptionNames = Args.hasArg(OPT_fdiagnostics_show_option);
660
661  llvm::sys::Process::UseANSIEscapeCodes(Args.hasArg(OPT_fansi_escape_codes));
662
663  // Default behavior is to not to show note include stacks.
664  Opts.ShowNoteIncludeStack = false;
665  if (Arg *A = Args.getLastArg(OPT_fdiagnostics_show_note_include_stack,
666                               OPT_fno_diagnostics_show_note_include_stack))
667    if (A->getOption().matches(OPT_fdiagnostics_show_note_include_stack))
668      Opts.ShowNoteIncludeStack = true;
669
670  StringRef ShowOverloads =
671    Args.getLastArgValue(OPT_fshow_overloads_EQ, "all");
672  if (ShowOverloads == "best")
673    Opts.setShowOverloads(Ovl_Best);
674  else if (ShowOverloads == "all")
675    Opts.setShowOverloads(Ovl_All);
676  else {
677    Success = false;
678    if (Diags)
679      Diags->Report(diag::err_drv_invalid_value)
680      << Args.getLastArg(OPT_fshow_overloads_EQ)->getAsString(Args)
681      << ShowOverloads;
682  }
683
684  StringRef ShowCategory =
685    Args.getLastArgValue(OPT_fdiagnostics_show_category, "none");
686  if (ShowCategory == "none")
687    Opts.ShowCategories = 0;
688  else if (ShowCategory == "id")
689    Opts.ShowCategories = 1;
690  else if (ShowCategory == "name")
691    Opts.ShowCategories = 2;
692  else {
693    Success = false;
694    if (Diags)
695      Diags->Report(diag::err_drv_invalid_value)
696      << Args.getLastArg(OPT_fdiagnostics_show_category)->getAsString(Args)
697      << ShowCategory;
698  }
699
700  StringRef Format =
701    Args.getLastArgValue(OPT_fdiagnostics_format, "clang");
702  if (Format == "clang")
703    Opts.setFormat(DiagnosticOptions::Clang);
704  else if (Format == "msvc")
705    Opts.setFormat(DiagnosticOptions::Msvc);
706  else if (Format == "msvc-fallback") {
707    Opts.setFormat(DiagnosticOptions::Msvc);
708    Opts.CLFallbackMode = true;
709  } else if (Format == "vi")
710    Opts.setFormat(DiagnosticOptions::Vi);
711  else {
712    Success = false;
713    if (Diags)
714      Diags->Report(diag::err_drv_invalid_value)
715      << Args.getLastArg(OPT_fdiagnostics_format)->getAsString(Args)
716      << Format;
717  }
718
719  Opts.ShowSourceRanges = Args.hasArg(OPT_fdiagnostics_print_source_range_info);
720  Opts.ShowParseableFixits = Args.hasArg(OPT_fdiagnostics_parseable_fixits);
721  Opts.ShowPresumedLoc = !Args.hasArg(OPT_fno_diagnostics_use_presumed_location);
722  Opts.VerifyDiagnostics = Args.hasArg(OPT_verify);
723  Opts.ElideType = !Args.hasArg(OPT_fno_elide_type);
724  Opts.ShowTemplateTree = Args.hasArg(OPT_fdiagnostics_show_template_tree);
725  Opts.ErrorLimit = getLastArgIntValue(Args, OPT_ferror_limit, 0, Diags);
726  Opts.MacroBacktraceLimit =
727      getLastArgIntValue(Args, OPT_fmacro_backtrace_limit,
728                         DiagnosticOptions::DefaultMacroBacktraceLimit, Diags);
729  Opts.TemplateBacktraceLimit = getLastArgIntValue(
730      Args, OPT_ftemplate_backtrace_limit,
731      DiagnosticOptions::DefaultTemplateBacktraceLimit, Diags);
732  Opts.ConstexprBacktraceLimit = getLastArgIntValue(
733      Args, OPT_fconstexpr_backtrace_limit,
734      DiagnosticOptions::DefaultConstexprBacktraceLimit, Diags);
735  Opts.SpellCheckingLimit = getLastArgIntValue(
736      Args, OPT_fspell_checking_limit,
737      DiagnosticOptions::DefaultSpellCheckingLimit, Diags);
738  Opts.TabStop = getLastArgIntValue(Args, OPT_ftabstop,
739                                    DiagnosticOptions::DefaultTabStop, Diags);
740  if (Opts.TabStop == 0 || Opts.TabStop > DiagnosticOptions::MaxTabStop) {
741    Opts.TabStop = DiagnosticOptions::DefaultTabStop;
742    if (Diags)
743      Diags->Report(diag::warn_ignoring_ftabstop_value)
744      << Opts.TabStop << DiagnosticOptions::DefaultTabStop;
745  }
746  Opts.MessageLength = getLastArgIntValue(Args, OPT_fmessage_length, 0, Diags);
747  addDiagnosticArgs(Args, OPT_W_Group, OPT_W_value_Group, Opts.Warnings);
748  addDiagnosticArgs(Args, OPT_R_Group, OPT_R_value_Group, Opts.Remarks);
749
750  return Success;
751}
752
753static void ParseFileSystemArgs(FileSystemOptions &Opts, ArgList &Args) {
754  Opts.WorkingDir = Args.getLastArgValue(OPT_working_directory);
755}
756
757static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
758                                   DiagnosticsEngine &Diags) {
759  using namespace options;
760  Opts.ProgramAction = frontend::ParseSyntaxOnly;
761  if (const Arg *A = Args.getLastArg(OPT_Action_Group)) {
762    switch (A->getOption().getID()) {
763    default:
764      llvm_unreachable("Invalid option in group!");
765    case OPT_ast_list:
766      Opts.ProgramAction = frontend::ASTDeclList; break;
767    case OPT_ast_dump:
768    case OPT_ast_dump_lookups:
769      Opts.ProgramAction = frontend::ASTDump; break;
770    case OPT_ast_print:
771      Opts.ProgramAction = frontend::ASTPrint; break;
772    case OPT_ast_view:
773      Opts.ProgramAction = frontend::ASTView; break;
774    case OPT_dump_raw_tokens:
775      Opts.ProgramAction = frontend::DumpRawTokens; break;
776    case OPT_dump_tokens:
777      Opts.ProgramAction = frontend::DumpTokens; break;
778    case OPT_S:
779      Opts.ProgramAction = frontend::EmitAssembly; break;
780    case OPT_emit_llvm_bc:
781      Opts.ProgramAction = frontend::EmitBC; break;
782    case OPT_emit_html:
783      Opts.ProgramAction = frontend::EmitHTML; break;
784    case OPT_emit_llvm:
785      Opts.ProgramAction = frontend::EmitLLVM; break;
786    case OPT_emit_llvm_only:
787      Opts.ProgramAction = frontend::EmitLLVMOnly; break;
788    case OPT_emit_codegen_only:
789      Opts.ProgramAction = frontend::EmitCodeGenOnly; break;
790    case OPT_emit_obj:
791      Opts.ProgramAction = frontend::EmitObj; break;
792    case OPT_fixit_EQ:
793      Opts.FixItSuffix = A->getValue();
794      // fall-through!
795    case OPT_fixit:
796      Opts.ProgramAction = frontend::FixIt; break;
797    case OPT_emit_module:
798      Opts.ProgramAction = frontend::GenerateModule; break;
799    case OPT_emit_pch:
800      Opts.ProgramAction = frontend::GeneratePCH; break;
801    case OPT_emit_pth:
802      Opts.ProgramAction = frontend::GeneratePTH; break;
803    case OPT_init_only:
804      Opts.ProgramAction = frontend::InitOnly; break;
805    case OPT_fsyntax_only:
806      Opts.ProgramAction = frontend::ParseSyntaxOnly; break;
807    case OPT_module_file_info:
808      Opts.ProgramAction = frontend::ModuleFileInfo; break;
809    case OPT_verify_pch:
810      Opts.ProgramAction = frontend::VerifyPCH; break;
811    case OPT_print_decl_contexts:
812      Opts.ProgramAction = frontend::PrintDeclContext; break;
813    case OPT_print_preamble:
814      Opts.ProgramAction = frontend::PrintPreamble; break;
815    case OPT_E:
816      Opts.ProgramAction = frontend::PrintPreprocessedInput; break;
817    case OPT_rewrite_macros:
818      Opts.ProgramAction = frontend::RewriteMacros; break;
819    case OPT_rewrite_objc:
820      Opts.ProgramAction = frontend::RewriteObjC; break;
821    case OPT_rewrite_test:
822      Opts.ProgramAction = frontend::RewriteTest; break;
823    case OPT_analyze:
824      Opts.ProgramAction = frontend::RunAnalysis; break;
825    case OPT_migrate:
826      Opts.ProgramAction = frontend::MigrateSource; break;
827    case OPT_Eonly:
828      Opts.ProgramAction = frontend::RunPreprocessorOnly; break;
829    }
830  }
831
832  if (const Arg* A = Args.getLastArg(OPT_plugin)) {
833    Opts.Plugins.push_back(A->getValue(0));
834    Opts.ProgramAction = frontend::PluginAction;
835    Opts.ActionName = A->getValue();
836
837    for (arg_iterator it = Args.filtered_begin(OPT_plugin_arg),
838           end = Args.filtered_end(); it != end; ++it) {
839      if ((*it)->getValue(0) == Opts.ActionName)
840        Opts.PluginArgs.push_back((*it)->getValue(1));
841    }
842  }
843
844  Opts.AddPluginActions = Args.getAllArgValues(OPT_add_plugin);
845  Opts.AddPluginArgs.resize(Opts.AddPluginActions.size());
846  for (int i = 0, e = Opts.AddPluginActions.size(); i != e; ++i) {
847    for (arg_iterator it = Args.filtered_begin(OPT_plugin_arg),
848           end = Args.filtered_end(); it != end; ++it) {
849      if ((*it)->getValue(0) == Opts.AddPluginActions[i])
850        Opts.AddPluginArgs[i].push_back((*it)->getValue(1));
851    }
852  }
853
854  if (const Arg *A = Args.getLastArg(OPT_code_completion_at)) {
855    Opts.CodeCompletionAt =
856      ParsedSourceLocation::FromString(A->getValue());
857    if (Opts.CodeCompletionAt.FileName.empty())
858      Diags.Report(diag::err_drv_invalid_value)
859        << A->getAsString(Args) << A->getValue();
860  }
861  Opts.DisableFree = Args.hasArg(OPT_disable_free);
862
863  Opts.OutputFile = Args.getLastArgValue(OPT_o);
864  Opts.Plugins = Args.getAllArgValues(OPT_load);
865  Opts.RelocatablePCH = Args.hasArg(OPT_relocatable_pch);
866  Opts.ShowHelp = Args.hasArg(OPT_help);
867  Opts.ShowStats = Args.hasArg(OPT_print_stats);
868  Opts.ShowTimers = Args.hasArg(OPT_ftime_report);
869  Opts.ShowVersion = Args.hasArg(OPT_version);
870  Opts.ASTMergeFiles = Args.getAllArgValues(OPT_ast_merge);
871  Opts.LLVMArgs = Args.getAllArgValues(OPT_mllvm);
872  Opts.FixWhatYouCan = Args.hasArg(OPT_fix_what_you_can);
873  Opts.FixOnlyWarnings = Args.hasArg(OPT_fix_only_warnings);
874  Opts.FixAndRecompile = Args.hasArg(OPT_fixit_recompile);
875  Opts.FixToTemporaries = Args.hasArg(OPT_fixit_to_temp);
876  Opts.ASTDumpDecls = Args.hasArg(OPT_ast_dump);
877  Opts.ASTDumpFilter = Args.getLastArgValue(OPT_ast_dump_filter);
878  Opts.ASTDumpLookups = Args.hasArg(OPT_ast_dump_lookups);
879  Opts.UseGlobalModuleIndex = !Args.hasArg(OPT_fno_modules_global_index);
880  Opts.GenerateGlobalModuleIndex = Opts.UseGlobalModuleIndex;
881  Opts.ModuleMapFiles = Args.getAllArgValues(OPT_fmodule_map_file);
882  Opts.ModuleFiles = Args.getAllArgValues(OPT_fmodule_file);
883
884  Opts.CodeCompleteOpts.IncludeMacros
885    = Args.hasArg(OPT_code_completion_macros);
886  Opts.CodeCompleteOpts.IncludeCodePatterns
887    = Args.hasArg(OPT_code_completion_patterns);
888  Opts.CodeCompleteOpts.IncludeGlobals
889    = !Args.hasArg(OPT_no_code_completion_globals);
890  Opts.CodeCompleteOpts.IncludeBriefComments
891    = Args.hasArg(OPT_code_completion_brief_comments);
892
893  Opts.OverrideRecordLayoutsFile
894    = Args.getLastArgValue(OPT_foverride_record_layout_EQ);
895  if (const Arg *A = Args.getLastArg(OPT_arcmt_check,
896                                     OPT_arcmt_modify,
897                                     OPT_arcmt_migrate)) {
898    switch (A->getOption().getID()) {
899    default:
900      llvm_unreachable("missed a case");
901    case OPT_arcmt_check:
902      Opts.ARCMTAction = FrontendOptions::ARCMT_Check;
903      break;
904    case OPT_arcmt_modify:
905      Opts.ARCMTAction = FrontendOptions::ARCMT_Modify;
906      break;
907    case OPT_arcmt_migrate:
908      Opts.ARCMTAction = FrontendOptions::ARCMT_Migrate;
909      break;
910    }
911  }
912  Opts.MTMigrateDir = Args.getLastArgValue(OPT_mt_migrate_directory);
913  Opts.ARCMTMigrateReportOut
914    = Args.getLastArgValue(OPT_arcmt_migrate_report_output);
915  Opts.ARCMTMigrateEmitARCErrors
916    = Args.hasArg(OPT_arcmt_migrate_emit_arc_errors);
917
918  if (Args.hasArg(OPT_objcmt_migrate_literals))
919    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Literals;
920  if (Args.hasArg(OPT_objcmt_migrate_subscripting))
921    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Subscripting;
922  if (Args.hasArg(OPT_objcmt_migrate_property_dot_syntax))
923    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_PropertyDotSyntax;
924  if (Args.hasArg(OPT_objcmt_migrate_property))
925    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Property;
926  if (Args.hasArg(OPT_objcmt_migrate_readonly_property))
927    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_ReadonlyProperty;
928  if (Args.hasArg(OPT_objcmt_migrate_readwrite_property))
929    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_ReadwriteProperty;
930  if (Args.hasArg(OPT_objcmt_migrate_annotation))
931    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Annotation;
932  if (Args.hasArg(OPT_objcmt_returns_innerpointer_property))
933    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_ReturnsInnerPointerProperty;
934  if (Args.hasArg(OPT_objcmt_migrate_instancetype))
935    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Instancetype;
936  if (Args.hasArg(OPT_objcmt_migrate_nsmacros))
937    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_NsMacros;
938  if (Args.hasArg(OPT_objcmt_migrate_protocol_conformance))
939    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_ProtocolConformance;
940  if (Args.hasArg(OPT_objcmt_atomic_property))
941    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_AtomicProperty;
942  if (Args.hasArg(OPT_objcmt_ns_nonatomic_iosonly))
943    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_NsAtomicIOSOnlyProperty;
944  if (Args.hasArg(OPT_objcmt_migrate_designated_init))
945    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_DesignatedInitializer;
946  if (Args.hasArg(OPT_objcmt_migrate_all))
947    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_MigrateDecls;
948
949  Opts.ObjCMTWhiteListPath = Args.getLastArgValue(OPT_objcmt_whitelist_dir_path);
950
951  if (Opts.ARCMTAction != FrontendOptions::ARCMT_None &&
952      Opts.ObjCMTAction != FrontendOptions::ObjCMT_None) {
953    Diags.Report(diag::err_drv_argument_not_allowed_with)
954      << "ARC migration" << "ObjC migration";
955  }
956
957  InputKind DashX = IK_None;
958  if (const Arg *A = Args.getLastArg(OPT_x)) {
959    DashX = llvm::StringSwitch<InputKind>(A->getValue())
960      .Case("c", IK_C)
961      .Case("cl", IK_OpenCL)
962      .Case("cuda", IK_CUDA)
963      .Case("c++", IK_CXX)
964      .Case("objective-c", IK_ObjC)
965      .Case("objective-c++", IK_ObjCXX)
966      .Case("cpp-output", IK_PreprocessedC)
967      .Case("assembler-with-cpp", IK_Asm)
968      .Case("c++-cpp-output", IK_PreprocessedCXX)
969      .Case("objective-c-cpp-output", IK_PreprocessedObjC)
970      .Case("objc-cpp-output", IK_PreprocessedObjC)
971      .Case("objective-c++-cpp-output", IK_PreprocessedObjCXX)
972      .Case("objc++-cpp-output", IK_PreprocessedObjCXX)
973      .Case("c-header", IK_C)
974      .Case("cl-header", IK_OpenCL)
975      .Case("objective-c-header", IK_ObjC)
976      .Case("c++-header", IK_CXX)
977      .Case("objective-c++-header", IK_ObjCXX)
978      .Cases("ast", "pcm", IK_AST)
979      .Case("ir", IK_LLVM_IR)
980      .Default(IK_None);
981    if (DashX == IK_None)
982      Diags.Report(diag::err_drv_invalid_value)
983        << A->getAsString(Args) << A->getValue();
984  }
985
986  // '-' is the default input if none is given.
987  std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT);
988  Opts.Inputs.clear();
989  if (Inputs.empty())
990    Inputs.push_back("-");
991  for (unsigned i = 0, e = Inputs.size(); i != e; ++i) {
992    InputKind IK = DashX;
993    if (IK == IK_None) {
994      IK = FrontendOptions::getInputKindForExtension(
995        StringRef(Inputs[i]).rsplit('.').second);
996      // FIXME: Remove this hack.
997      if (i == 0)
998        DashX = IK;
999    }
1000    Opts.Inputs.push_back(FrontendInputFile(Inputs[i], IK));
1001  }
1002
1003  return DashX;
1004}
1005
1006std::string CompilerInvocation::GetResourcesPath(const char *Argv0,
1007                                                 void *MainAddr) {
1008  std::string ClangExecutable =
1009      llvm::sys::fs::getMainExecutable(Argv0, MainAddr);
1010  StringRef Dir = llvm::sys::path::parent_path(ClangExecutable);
1011
1012  // Compute the path to the resource directory.
1013  StringRef ClangResourceDir(CLANG_RESOURCE_DIR);
1014  SmallString<128> P(Dir);
1015  if (ClangResourceDir != "") {
1016    llvm::sys::path::append(P, ClangResourceDir);
1017  } else {
1018    StringRef ClangLibdirSuffix(CLANG_LIBDIR_SUFFIX);
1019    llvm::sys::path::append(P, "..", Twine("lib") + ClangLibdirSuffix, "clang",
1020                            CLANG_VERSION_STRING);
1021  }
1022
1023  return P.str();
1024}
1025
1026static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) {
1027  using namespace options;
1028  Opts.Sysroot = Args.getLastArgValue(OPT_isysroot, "/");
1029  Opts.Verbose = Args.hasArg(OPT_v);
1030  Opts.UseBuiltinIncludes = !Args.hasArg(OPT_nobuiltininc);
1031  Opts.UseStandardSystemIncludes = !Args.hasArg(OPT_nostdsysteminc);
1032  Opts.UseStandardCXXIncludes = !Args.hasArg(OPT_nostdincxx);
1033  if (const Arg *A = Args.getLastArg(OPT_stdlib_EQ))
1034    Opts.UseLibcxx = (strcmp(A->getValue(), "libc++") == 0);
1035  Opts.ResourceDir = Args.getLastArgValue(OPT_resource_dir);
1036  Opts.ModuleCachePath = Args.getLastArgValue(OPT_fmodules_cache_path);
1037  Opts.ModuleUserBuildPath = Args.getLastArgValue(OPT_fmodules_user_build_path);
1038  Opts.DisableModuleHash = Args.hasArg(OPT_fdisable_module_hash);
1039  // -fmodules implies -fmodule-maps
1040  Opts.ModuleMaps = Args.hasArg(OPT_fmodule_maps) || Args.hasArg(OPT_fmodules);
1041  Opts.ModuleMapFileHomeIsCwd = Args.hasArg(OPT_fmodule_map_file_home_is_cwd);
1042  Opts.ModuleCachePruneInterval =
1043      getLastArgIntValue(Args, OPT_fmodules_prune_interval, 7 * 24 * 60 * 60);
1044  Opts.ModuleCachePruneAfter =
1045      getLastArgIntValue(Args, OPT_fmodules_prune_after, 31 * 24 * 60 * 60);
1046  Opts.ModulesValidateOncePerBuildSession =
1047      Args.hasArg(OPT_fmodules_validate_once_per_build_session);
1048  Opts.BuildSessionTimestamp =
1049      getLastArgUInt64Value(Args, OPT_fbuild_session_timestamp, 0);
1050  Opts.ModulesValidateSystemHeaders =
1051      Args.hasArg(OPT_fmodules_validate_system_headers);
1052
1053  for (arg_iterator it = Args.filtered_begin(OPT_fmodules_ignore_macro),
1054                    ie = Args.filtered_end();
1055       it != ie; ++it) {
1056    StringRef MacroDef = (*it)->getValue();
1057    Opts.ModulesIgnoreMacros.insert(MacroDef.split('=').first);
1058  }
1059
1060  // Add -I..., -F..., and -index-header-map options in order.
1061  bool IsIndexHeaderMap = false;
1062  for (arg_iterator it = Args.filtered_begin(OPT_I, OPT_F,
1063                                             OPT_index_header_map),
1064       ie = Args.filtered_end(); it != ie; ++it) {
1065    if ((*it)->getOption().matches(OPT_index_header_map)) {
1066      // -index-header-map applies to the next -I or -F.
1067      IsIndexHeaderMap = true;
1068      continue;
1069    }
1070
1071    frontend::IncludeDirGroup Group
1072      = IsIndexHeaderMap? frontend::IndexHeaderMap : frontend::Angled;
1073
1074    Opts.AddPath((*it)->getValue(), Group,
1075                 /*IsFramework=*/ (*it)->getOption().matches(OPT_F), true);
1076    IsIndexHeaderMap = false;
1077  }
1078
1079  // Add -iprefix/-iwithprefix/-iwithprefixbefore options.
1080  StringRef Prefix = ""; // FIXME: This isn't the correct default prefix.
1081  for (arg_iterator it = Args.filtered_begin(OPT_iprefix, OPT_iwithprefix,
1082                                             OPT_iwithprefixbefore),
1083         ie = Args.filtered_end(); it != ie; ++it) {
1084    const Arg *A = *it;
1085    if (A->getOption().matches(OPT_iprefix))
1086      Prefix = A->getValue();
1087    else if (A->getOption().matches(OPT_iwithprefix))
1088      Opts.AddPath(Prefix.str() + A->getValue(),
1089                   frontend::After, false, true);
1090    else
1091      Opts.AddPath(Prefix.str() + A->getValue(),
1092                   frontend::Angled, false, true);
1093  }
1094
1095  for (arg_iterator it = Args.filtered_begin(OPT_idirafter),
1096         ie = Args.filtered_end(); it != ie; ++it)
1097    Opts.AddPath((*it)->getValue(), frontend::After, false, true);
1098  for (arg_iterator it = Args.filtered_begin(OPT_iquote),
1099         ie = Args.filtered_end(); it != ie; ++it)
1100    Opts.AddPath((*it)->getValue(), frontend::Quoted, false, true);
1101  for (arg_iterator it = Args.filtered_begin(OPT_isystem,
1102         OPT_iwithsysroot), ie = Args.filtered_end(); it != ie; ++it)
1103    Opts.AddPath((*it)->getValue(), frontend::System, false,
1104                 !(*it)->getOption().matches(OPT_iwithsysroot));
1105  for (arg_iterator it = Args.filtered_begin(OPT_iframework),
1106         ie = Args.filtered_end(); it != ie; ++it)
1107    Opts.AddPath((*it)->getValue(), frontend::System, true, true);
1108
1109  // Add the paths for the various language specific isystem flags.
1110  for (arg_iterator it = Args.filtered_begin(OPT_c_isystem),
1111       ie = Args.filtered_end(); it != ie; ++it)
1112    Opts.AddPath((*it)->getValue(), frontend::CSystem, false, true);
1113  for (arg_iterator it = Args.filtered_begin(OPT_cxx_isystem),
1114       ie = Args.filtered_end(); it != ie; ++it)
1115    Opts.AddPath((*it)->getValue(), frontend::CXXSystem, false, true);
1116  for (arg_iterator it = Args.filtered_begin(OPT_objc_isystem),
1117       ie = Args.filtered_end(); it != ie; ++it)
1118    Opts.AddPath((*it)->getValue(), frontend::ObjCSystem, false,true);
1119  for (arg_iterator it = Args.filtered_begin(OPT_objcxx_isystem),
1120       ie = Args.filtered_end(); it != ie; ++it)
1121    Opts.AddPath((*it)->getValue(), frontend::ObjCXXSystem, false, true);
1122
1123  // Add the internal paths from a driver that detects standard include paths.
1124  for (arg_iterator I = Args.filtered_begin(OPT_internal_isystem,
1125                                            OPT_internal_externc_isystem),
1126                    E = Args.filtered_end();
1127       I != E; ++I) {
1128    frontend::IncludeDirGroup Group = frontend::System;
1129    if ((*I)->getOption().matches(OPT_internal_externc_isystem))
1130      Group = frontend::ExternCSystem;
1131    Opts.AddPath((*I)->getValue(), Group, false, true);
1132  }
1133
1134  // Add the path prefixes which are implicitly treated as being system headers.
1135  for (arg_iterator I = Args.filtered_begin(OPT_system_header_prefix,
1136                                            OPT_no_system_header_prefix),
1137                    E = Args.filtered_end();
1138       I != E; ++I)
1139    Opts.AddSystemHeaderPrefix(
1140        (*I)->getValue(), (*I)->getOption().matches(OPT_system_header_prefix));
1141
1142  for (arg_iterator I = Args.filtered_begin(OPT_ivfsoverlay),
1143       E = Args.filtered_end(); I != E; ++I)
1144    Opts.AddVFSOverlayFile((*I)->getValue());
1145}
1146
1147void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
1148                                         LangStandard::Kind LangStd) {
1149  // Set some properties which depend solely on the input kind; it would be nice
1150  // to move these to the language standard, and have the driver resolve the
1151  // input kind + language standard.
1152  if (IK == IK_Asm) {
1153    Opts.AsmPreprocessor = 1;
1154  } else if (IK == IK_ObjC ||
1155             IK == IK_ObjCXX ||
1156             IK == IK_PreprocessedObjC ||
1157             IK == IK_PreprocessedObjCXX) {
1158    Opts.ObjC1 = Opts.ObjC2 = 1;
1159  }
1160
1161  if (LangStd == LangStandard::lang_unspecified) {
1162    // Based on the base language, pick one.
1163    switch (IK) {
1164    case IK_None:
1165    case IK_AST:
1166    case IK_LLVM_IR:
1167      llvm_unreachable("Invalid input kind!");
1168    case IK_OpenCL:
1169      LangStd = LangStandard::lang_opencl;
1170      break;
1171    case IK_CUDA:
1172      LangStd = LangStandard::lang_cuda;
1173      break;
1174    case IK_Asm:
1175    case IK_C:
1176    case IK_PreprocessedC:
1177    case IK_ObjC:
1178    case IK_PreprocessedObjC:
1179      LangStd = LangStandard::lang_gnu11;
1180      break;
1181    case IK_CXX:
1182    case IK_PreprocessedCXX:
1183    case IK_ObjCXX:
1184    case IK_PreprocessedObjCXX:
1185      LangStd = LangStandard::lang_gnucxx98;
1186      break;
1187    }
1188  }
1189
1190  const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
1191  Opts.LineComment = Std.hasLineComments();
1192  Opts.C99 = Std.isC99();
1193  Opts.C11 = Std.isC11();
1194  Opts.CPlusPlus = Std.isCPlusPlus();
1195  Opts.CPlusPlus11 = Std.isCPlusPlus11();
1196  Opts.CPlusPlus14 = Std.isCPlusPlus14();
1197  Opts.CPlusPlus1z = Std.isCPlusPlus1z();
1198  Opts.Digraphs = Std.hasDigraphs();
1199  Opts.GNUMode = Std.isGNUMode();
1200  Opts.GNUInline = !Std.isC99();
1201  Opts.HexFloats = Std.hasHexFloats();
1202  Opts.ImplicitInt = Std.hasImplicitInt();
1203
1204  // Set OpenCL Version.
1205  Opts.OpenCL = LangStd == LangStandard::lang_opencl || IK == IK_OpenCL;
1206  if (LangStd == LangStandard::lang_opencl)
1207    Opts.OpenCLVersion = 100;
1208  else if (LangStd == LangStandard::lang_opencl11)
1209    Opts.OpenCLVersion = 110;
1210  else if (LangStd == LangStandard::lang_opencl12)
1211    Opts.OpenCLVersion = 120;
1212  else if (LangStd == LangStandard::lang_opencl20)
1213    Opts.OpenCLVersion = 200;
1214
1215  // OpenCL has some additional defaults.
1216  if (Opts.OpenCL) {
1217    Opts.AltiVec = 0;
1218    Opts.CXXOperatorNames = 1;
1219    Opts.LaxVectorConversions = 0;
1220    Opts.DefaultFPContract = 1;
1221    Opts.NativeHalfType = 1;
1222  }
1223
1224  Opts.CUDA = LangStd == LangStandard::lang_cuda || IK == IK_CUDA;
1225
1226  // OpenCL and C++ both have bool, true, false keywords.
1227  Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
1228
1229  // OpenCL has half keyword
1230  Opts.Half = Opts.OpenCL;
1231
1232  // C++ has wchar_t keyword.
1233  Opts.WChar = Opts.CPlusPlus;
1234
1235  Opts.GNUKeywords = Opts.GNUMode;
1236  Opts.CXXOperatorNames = Opts.CPlusPlus;
1237
1238  Opts.DollarIdents = !Opts.AsmPreprocessor;
1239
1240  // C++14 onwards has sized global deallocation functions.
1241  Opts.SizedDeallocation = Opts.CPlusPlus14;
1242}
1243
1244/// Attempt to parse a visibility value out of the given argument.
1245static Visibility parseVisibility(Arg *arg, ArgList &args,
1246                                  DiagnosticsEngine &diags) {
1247  StringRef value = arg->getValue();
1248  if (value == "default") {
1249    return DefaultVisibility;
1250  } else if (value == "hidden") {
1251    return HiddenVisibility;
1252  } else if (value == "protected") {
1253    // FIXME: diagnose if target does not support protected visibility
1254    return ProtectedVisibility;
1255  }
1256
1257  diags.Report(diag::err_drv_invalid_value)
1258    << arg->getAsString(args) << value;
1259  return DefaultVisibility;
1260}
1261
1262static unsigned parseMSCVersion(ArgList &Args, DiagnosticsEngine &Diags) {
1263  auto Arg = Args.getLastArg(OPT_fms_compatibility_version);
1264  if (!Arg)
1265    return 0;
1266
1267  // The MSC versioning scheme involves four versioning components:
1268  //  - Major
1269  //  - Minor
1270  //  - Build
1271  //  - Patch
1272  //
1273  // We accept either the old style (_MSC_VER) value, or a _MSC_FULL_VER value.
1274  // Additionally, the value may be provided in the form of a more readable
1275  // MM.mm.bbbbb.pp version.
1276  //
1277  // Unfortunately, due to the bit-width limitations, we cannot currently encode
1278  // the value for the patch level.
1279
1280  unsigned VC[4] = {0};
1281  StringRef Value = Arg->getValue();
1282  SmallVector<StringRef, 4> Components;
1283
1284  Value.split(Components, ".", llvm::array_lengthof(VC));
1285  for (unsigned CI = 0,
1286                CE = std::min(Components.size(), llvm::array_lengthof(VC));
1287       CI < CE; ++CI) {
1288    if (Components[CI].getAsInteger(10, VC[CI])) {
1289      Diags.Report(diag::err_drv_invalid_value)
1290        << Arg->getAsString(Args) << Value;
1291      return 0;
1292    }
1293  }
1294
1295  // FIXME we cannot encode the patch level
1296  return VC[0] * 10000000 + VC[1] * 100000 + VC[2];
1297}
1298
1299static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
1300                          DiagnosticsEngine &Diags) {
1301  // FIXME: Cleanup per-file based stuff.
1302  LangStandard::Kind LangStd = LangStandard::lang_unspecified;
1303  if (const Arg *A = Args.getLastArg(OPT_std_EQ)) {
1304    LangStd = llvm::StringSwitch<LangStandard::Kind>(A->getValue())
1305#define LANGSTANDARD(id, name, desc, features) \
1306      .Case(name, LangStandard::lang_##id)
1307#include "clang/Frontend/LangStandards.def"
1308      .Default(LangStandard::lang_unspecified);
1309    if (LangStd == LangStandard::lang_unspecified)
1310      Diags.Report(diag::err_drv_invalid_value)
1311        << A->getAsString(Args) << A->getValue();
1312    else {
1313      // Valid standard, check to make sure language and standard are
1314      // compatible.
1315      const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
1316      switch (IK) {
1317      case IK_C:
1318      case IK_ObjC:
1319      case IK_PreprocessedC:
1320      case IK_PreprocessedObjC:
1321        if (!(Std.isC89() || Std.isC99()))
1322          Diags.Report(diag::err_drv_argument_not_allowed_with)
1323            << A->getAsString(Args) << "C/ObjC";
1324        break;
1325      case IK_CXX:
1326      case IK_ObjCXX:
1327      case IK_PreprocessedCXX:
1328      case IK_PreprocessedObjCXX:
1329        if (!Std.isCPlusPlus())
1330          Diags.Report(diag::err_drv_argument_not_allowed_with)
1331            << A->getAsString(Args) << "C++/ObjC++";
1332        break;
1333      case IK_OpenCL:
1334        if (!Std.isC99())
1335          Diags.Report(diag::err_drv_argument_not_allowed_with)
1336            << A->getAsString(Args) << "OpenCL";
1337        break;
1338      case IK_CUDA:
1339        if (!Std.isCPlusPlus())
1340          Diags.Report(diag::err_drv_argument_not_allowed_with)
1341            << A->getAsString(Args) << "CUDA";
1342        break;
1343      default:
1344        break;
1345      }
1346    }
1347  }
1348
1349  // -cl-std only applies for OpenCL language standards.
1350  // Override the -std option in this case.
1351  if (const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) {
1352    LangStandard::Kind OpenCLLangStd
1353    = llvm::StringSwitch<LangStandard::Kind>(A->getValue())
1354    .Case("CL", LangStandard::lang_opencl)
1355    .Case("CL1.1", LangStandard::lang_opencl11)
1356    .Case("CL1.2", LangStandard::lang_opencl12)
1357    .Case("CL2.0", LangStandard::lang_opencl20)
1358    .Default(LangStandard::lang_unspecified);
1359
1360    if (OpenCLLangStd == LangStandard::lang_unspecified) {
1361      Diags.Report(diag::err_drv_invalid_value)
1362      << A->getAsString(Args) << A->getValue();
1363    }
1364    else
1365      LangStd = OpenCLLangStd;
1366  }
1367
1368  CompilerInvocation::setLangDefaults(Opts, IK, LangStd);
1369
1370  // We abuse '-f[no-]gnu-keywords' to force overriding all GNU-extension
1371  // keywords. This behavior is provided by GCC's poorly named '-fasm' flag,
1372  // while a subset (the non-C++ GNU keywords) is provided by GCC's
1373  // '-fgnu-keywords'. Clang conflates the two for simplicity under the single
1374  // name, as it doesn't seem a useful distinction.
1375  Opts.GNUKeywords = Args.hasFlag(OPT_fgnu_keywords, OPT_fno_gnu_keywords,
1376                                  Opts.GNUKeywords);
1377
1378  if (Args.hasArg(OPT_fno_operator_names))
1379    Opts.CXXOperatorNames = 0;
1380
1381  if (Args.hasArg(OPT_fcuda_is_device))
1382    Opts.CUDAIsDevice = 1;
1383
1384  if (Opts.ObjC1) {
1385    if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
1386      StringRef value = arg->getValue();
1387      if (Opts.ObjCRuntime.tryParse(value))
1388        Diags.Report(diag::err_drv_unknown_objc_runtime) << value;
1389    }
1390
1391    if (Args.hasArg(OPT_fobjc_gc_only))
1392      Opts.setGC(LangOptions::GCOnly);
1393    else if (Args.hasArg(OPT_fobjc_gc))
1394      Opts.setGC(LangOptions::HybridGC);
1395    else if (Args.hasArg(OPT_fobjc_arc)) {
1396      Opts.ObjCAutoRefCount = 1;
1397      if (!Opts.ObjCRuntime.allowsARC())
1398        Diags.Report(diag::err_arc_unsupported_on_runtime);
1399
1400      // Only set ObjCARCWeak if ARC is enabled.
1401      if (Args.hasArg(OPT_fobjc_runtime_has_weak))
1402        Opts.ObjCARCWeak = 1;
1403      else
1404        Opts.ObjCARCWeak = Opts.ObjCRuntime.allowsWeak();
1405    }
1406
1407    if (Args.hasArg(OPT_fno_objc_infer_related_result_type))
1408      Opts.ObjCInferRelatedResultType = 0;
1409
1410    if (Args.hasArg(OPT_fobjc_subscripting_legacy_runtime))
1411      Opts.ObjCSubscriptingLegacyRuntime =
1412        (Opts.ObjCRuntime.getKind() == ObjCRuntime::FragileMacOSX);
1413  }
1414
1415  if (Args.hasArg(OPT_fgnu89_inline))
1416    Opts.GNUInline = 1;
1417
1418  if (Args.hasArg(OPT_fapple_kext)) {
1419    if (!Opts.CPlusPlus)
1420      Diags.Report(diag::warn_c_kext);
1421    else
1422      Opts.AppleKext = 1;
1423  }
1424
1425  if (Args.hasArg(OPT_print_ivar_layout))
1426    Opts.ObjCGCBitmapPrint = 1;
1427  if (Args.hasArg(OPT_fno_constant_cfstrings))
1428    Opts.NoConstantCFStrings = 1;
1429
1430  if (Args.hasArg(OPT_faltivec))
1431    Opts.AltiVec = 1;
1432
1433  if (Args.hasArg(OPT_pthread))
1434    Opts.POSIXThreads = 1;
1435
1436  // The value-visibility mode defaults to "default".
1437  if (Arg *visOpt = Args.getLastArg(OPT_fvisibility)) {
1438    Opts.setValueVisibilityMode(parseVisibility(visOpt, Args, Diags));
1439  } else {
1440    Opts.setValueVisibilityMode(DefaultVisibility);
1441  }
1442
1443  // The type-visibility mode defaults to the value-visibility mode.
1444  if (Arg *typeVisOpt = Args.getLastArg(OPT_ftype_visibility)) {
1445    Opts.setTypeVisibilityMode(parseVisibility(typeVisOpt, Args, Diags));
1446  } else {
1447    Opts.setTypeVisibilityMode(Opts.getValueVisibilityMode());
1448  }
1449
1450  if (Args.hasArg(OPT_fvisibility_inlines_hidden))
1451    Opts.InlineVisibilityHidden = 1;
1452
1453  if (Args.hasArg(OPT_ftrapv)) {
1454    Opts.setSignedOverflowBehavior(LangOptions::SOB_Trapping);
1455    // Set the handler, if one is specified.
1456    Opts.OverflowHandler =
1457        Args.getLastArgValue(OPT_ftrapv_handler);
1458  }
1459  else if (Args.hasArg(OPT_fwrapv))
1460    Opts.setSignedOverflowBehavior(LangOptions::SOB_Defined);
1461
1462  Opts.MSVCCompat = Args.hasArg(OPT_fms_compatibility);
1463  Opts.MicrosoftExt = Opts.MSVCCompat || Args.hasArg(OPT_fms_extensions);
1464  Opts.AsmBlocks = Args.hasArg(OPT_fasm_blocks) || Opts.MicrosoftExt;
1465  Opts.MSCompatibilityVersion = parseMSCVersion(Args, Diags);
1466
1467  // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
1468  // is specified, or -std is set to a conforming mode.
1469  // Trigraphs are disabled by default in c++1z onwards.
1470  Opts.Trigraphs = !Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus1z;
1471  Opts.Trigraphs =
1472      Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs);
1473
1474  Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
1475                                   OPT_fno_dollars_in_identifiers,
1476                                   Opts.DollarIdents);
1477  Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
1478  Opts.VtorDispMode = getLastArgIntValue(Args, OPT_vtordisp_mode_EQ, 1, Diags);
1479  Opts.Borland = Args.hasArg(OPT_fborland_extensions);
1480  Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
1481  Opts.ConstStrings = Args.hasFlag(OPT_fconst_strings, OPT_fno_const_strings,
1482                                   Opts.ConstStrings);
1483  if (Args.hasArg(OPT_fno_lax_vector_conversions))
1484    Opts.LaxVectorConversions = 0;
1485  if (Args.hasArg(OPT_fno_threadsafe_statics))
1486    Opts.ThreadsafeStatics = 0;
1487  Opts.Exceptions = Args.hasArg(OPT_fexceptions);
1488  Opts.ObjCExceptions = Args.hasArg(OPT_fobjc_exceptions);
1489  Opts.CXXExceptions = Args.hasArg(OPT_fcxx_exceptions);
1490  Opts.SjLjExceptions = Args.hasArg(OPT_fsjlj_exceptions);
1491  Opts.TraditionalCPP = Args.hasArg(OPT_traditional_cpp);
1492
1493  Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
1494  Opts.RTTIData = Opts.RTTI && !Args.hasArg(OPT_fno_rtti_data);
1495  Opts.Blocks = Args.hasArg(OPT_fblocks);
1496  Opts.BlocksRuntimeOptional = Args.hasArg(OPT_fblocks_runtime_optional);
1497  Opts.Modules = Args.hasArg(OPT_fmodules);
1498  Opts.ModulesStrictDeclUse = Args.hasArg(OPT_fmodules_strict_decluse);
1499  Opts.ModulesDeclUse =
1500      Args.hasArg(OPT_fmodules_decluse) || Opts.ModulesStrictDeclUse;
1501  Opts.ModulesSearchAll = Opts.Modules &&
1502    !Args.hasArg(OPT_fno_modules_search_all) &&
1503    Args.hasArg(OPT_fmodules_search_all);
1504  Opts.ModulesErrorRecovery = !Args.hasArg(OPT_fno_modules_error_recovery);
1505  Opts.ModulesImplicitMaps = Args.hasFlag(OPT_fmodules_implicit_maps,
1506                                          OPT_fno_modules_implicit_maps, true);
1507  Opts.CharIsSigned = Opts.OpenCL || !Args.hasArg(OPT_fno_signed_char);
1508  Opts.WChar = Opts.CPlusPlus && !Args.hasArg(OPT_fno_wchar);
1509  Opts.ShortWChar = Args.hasFlag(OPT_fshort_wchar, OPT_fno_short_wchar, false);
1510  Opts.ShortEnums = Args.hasArg(OPT_fshort_enums);
1511  Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
1512  Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
1513  Opts.NoMathBuiltin = Args.hasArg(OPT_fno_math_builtin);
1514  Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
1515  Opts.SizedDeallocation |= Args.hasArg(OPT_fsized_deallocation);
1516  Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
1517  Opts.AccessControl = !Args.hasArg(OPT_fno_access_control);
1518  Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
1519  Opts.MathErrno = !Opts.OpenCL && Args.hasArg(OPT_fmath_errno);
1520  Opts.InstantiationDepth =
1521      getLastArgIntValue(Args, OPT_ftemplate_depth, 256, Diags);
1522  Opts.ArrowDepth =
1523      getLastArgIntValue(Args, OPT_foperator_arrow_depth, 256, Diags);
1524  Opts.ConstexprCallDepth =
1525      getLastArgIntValue(Args, OPT_fconstexpr_depth, 512, Diags);
1526  Opts.ConstexprStepLimit =
1527      getLastArgIntValue(Args, OPT_fconstexpr_steps, 1048576, Diags);
1528  Opts.BracketDepth = getLastArgIntValue(Args, OPT_fbracket_depth, 256, Diags);
1529  Opts.DelayedTemplateParsing = Args.hasArg(OPT_fdelayed_template_parsing);
1530  Opts.NumLargeByValueCopy =
1531      getLastArgIntValue(Args, OPT_Wlarge_by_value_copy_EQ, 0, Diags);
1532  Opts.MSBitfields = Args.hasArg(OPT_mms_bitfields);
1533  Opts.ObjCConstantStringClass =
1534    Args.getLastArgValue(OPT_fconstant_string_class);
1535  Opts.ObjCDefaultSynthProperties =
1536    !Args.hasArg(OPT_disable_objc_default_synthesize_properties);
1537  Opts.EncodeExtendedBlockSig =
1538    Args.hasArg(OPT_fencode_extended_block_signature);
1539  Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
1540  Opts.PackStruct = getLastArgIntValue(Args, OPT_fpack_struct_EQ, 0, Diags);
1541  Opts.MaxTypeAlign = getLastArgIntValue(Args, OPT_fmax_type_align_EQ, 0, Diags);
1542  Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
1543  Opts.PIELevel = getLastArgIntValue(Args, OPT_pie_level, 0, Diags);
1544  Opts.Static = Args.hasArg(OPT_static_define);
1545  Opts.DumpRecordLayoutsSimple = Args.hasArg(OPT_fdump_record_layouts_simple);
1546  Opts.DumpRecordLayouts = Opts.DumpRecordLayoutsSimple
1547                        || Args.hasArg(OPT_fdump_record_layouts);
1548  Opts.DumpVTableLayouts = Args.hasArg(OPT_fdump_vtable_layouts);
1549  Opts.SpellChecking = !Args.hasArg(OPT_fno_spell_checking);
1550  Opts.NoBitFieldTypeAlign = Args.hasArg(OPT_fno_bitfield_type_align);
1551  Opts.SinglePrecisionConstants = Args.hasArg(OPT_cl_single_precision_constant);
1552  Opts.FastRelaxedMath = Args.hasArg(OPT_cl_fast_relaxed_math);
1553  Opts.MRTD = Args.hasArg(OPT_mrtd);
1554  Opts.HexagonQdsp6Compat = Args.hasArg(OPT_mqdsp6_compat);
1555  Opts.FakeAddressSpaceMap = Args.hasArg(OPT_ffake_address_space_map);
1556  Opts.ParseUnknownAnytype = Args.hasArg(OPT_funknown_anytype);
1557  Opts.DebuggerSupport = Args.hasArg(OPT_fdebugger_support);
1558  Opts.DebuggerCastResultToId = Args.hasArg(OPT_fdebugger_cast_result_to_id);
1559  Opts.DebuggerObjCLiteral = Args.hasArg(OPT_fdebugger_objc_literal);
1560  Opts.ApplePragmaPack = Args.hasArg(OPT_fapple_pragma_pack);
1561  Opts.CurrentModule = Args.getLastArgValue(OPT_fmodule_name);
1562  Opts.ImplementationOfModule =
1563      Args.getLastArgValue(OPT_fmodule_implementation_of);
1564  Opts.NativeHalfType = Opts.NativeHalfType;
1565  Opts.HalfArgsAndReturns = Args.hasArg(OPT_fallow_half_arguments_and_returns);
1566
1567  if (!Opts.CurrentModule.empty() && !Opts.ImplementationOfModule.empty() &&
1568      Opts.CurrentModule != Opts.ImplementationOfModule) {
1569    Diags.Report(diag::err_conflicting_module_names)
1570        << Opts.CurrentModule << Opts.ImplementationOfModule;
1571  }
1572
1573  if (Arg *A = Args.getLastArg(OPT_faddress_space_map_mangling_EQ)) {
1574    switch (llvm::StringSwitch<unsigned>(A->getValue())
1575      .Case("target", LangOptions::ASMM_Target)
1576      .Case("no", LangOptions::ASMM_Off)
1577      .Case("yes", LangOptions::ASMM_On)
1578      .Default(255)) {
1579    default:
1580      Diags.Report(diag::err_drv_invalid_value)
1581        << "-faddress-space-map-mangling=" << A->getValue();
1582      break;
1583    case LangOptions::ASMM_Target:
1584      Opts.setAddressSpaceMapMangling(LangOptions::ASMM_Target);
1585      break;
1586    case LangOptions::ASMM_On:
1587      Opts.setAddressSpaceMapMangling(LangOptions::ASMM_On);
1588      break;
1589    case LangOptions::ASMM_Off:
1590      Opts.setAddressSpaceMapMangling(LangOptions::ASMM_Off);
1591      break;
1592    }
1593  }
1594
1595  if (Arg *A = Args.getLastArg(OPT_fms_memptr_rep_EQ)) {
1596    LangOptions::PragmaMSPointersToMembersKind InheritanceModel =
1597        llvm::StringSwitch<LangOptions::PragmaMSPointersToMembersKind>(
1598            A->getValue())
1599            .Case("single",
1600                  LangOptions::PPTMK_FullGeneralitySingleInheritance)
1601            .Case("multiple",
1602                  LangOptions::PPTMK_FullGeneralityMultipleInheritance)
1603            .Case("virtual",
1604                  LangOptions::PPTMK_FullGeneralityVirtualInheritance)
1605            .Default(LangOptions::PPTMK_BestCase);
1606    if (InheritanceModel == LangOptions::PPTMK_BestCase)
1607      Diags.Report(diag::err_drv_invalid_value)
1608          << "-fms-memptr-rep=" << A->getValue();
1609
1610    Opts.setMSPointerToMemberRepresentationMethod(InheritanceModel);
1611  }
1612
1613  // Check if -fopenmp= is specified.
1614  if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
1615    Opts.OpenMP = llvm::StringSwitch<bool>(A->getValue())
1616        .Case("libiomp5", true)
1617        .Default(false);
1618  }
1619
1620  // Record whether the __DEPRECATED define was requested.
1621  Opts.Deprecated = Args.hasFlag(OPT_fdeprecated_macro,
1622                                 OPT_fno_deprecated_macro,
1623                                 Opts.Deprecated);
1624
1625  // FIXME: Eliminate this dependency.
1626  unsigned Opt = getOptimizationLevel(Args, IK, Diags),
1627       OptSize = getOptimizationLevelSize(Args);
1628  Opts.Optimize = Opt != 0;
1629  Opts.OptimizeSize = OptSize != 0;
1630
1631  // This is the __NO_INLINE__ define, which just depends on things like the
1632  // optimization level and -fno-inline, not actually whether the backend has
1633  // inlining enabled.
1634  Opts.NoInlineDefine = !Opt || Args.hasArg(OPT_fno_inline);
1635
1636  Opts.FastMath = Args.hasArg(OPT_ffast_math) ||
1637      Args.hasArg(OPT_cl_fast_relaxed_math);
1638  Opts.FiniteMathOnly = Args.hasArg(OPT_ffinite_math_only) ||
1639      Args.hasArg(OPT_cl_finite_math_only) ||
1640      Args.hasArg(OPT_cl_fast_relaxed_math);
1641
1642  Opts.RetainCommentsFromSystemHeaders =
1643      Args.hasArg(OPT_fretain_comments_from_system_headers);
1644
1645  unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
1646  switch (SSP) {
1647  default:
1648    Diags.Report(diag::err_drv_invalid_value)
1649      << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
1650    break;
1651  case 0: Opts.setStackProtector(LangOptions::SSPOff); break;
1652  case 1: Opts.setStackProtector(LangOptions::SSPOn);  break;
1653  case 2: Opts.setStackProtector(LangOptions::SSPStrong); break;
1654  case 3: Opts.setStackProtector(LangOptions::SSPReq); break;
1655  }
1656
1657  // Parse -fsanitize= arguments.
1658  parseSanitizerKinds("-fsanitize=", Args.getAllArgValues(OPT_fsanitize_EQ),
1659                      Diags, Opts.Sanitize);
1660  // -fsanitize-address-field-padding=N has to be a LangOpt, parse it here.
1661  Opts.SanitizeAddressFieldPadding =
1662      getLastArgIntValue(Args, OPT_fsanitize_address_field_padding, 0, Diags);
1663  Opts.SanitizerBlacklistFile = Args.getLastArgValue(OPT_fsanitize_blacklist);
1664}
1665
1666static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,
1667                                  FileManager &FileMgr,
1668                                  DiagnosticsEngine &Diags) {
1669  using namespace options;
1670  Opts.ImplicitPCHInclude = Args.getLastArgValue(OPT_include_pch);
1671  Opts.ImplicitPTHInclude = Args.getLastArgValue(OPT_include_pth);
1672  if (const Arg *A = Args.getLastArg(OPT_token_cache))
1673      Opts.TokenCache = A->getValue();
1674  else
1675    Opts.TokenCache = Opts.ImplicitPTHInclude;
1676  Opts.UsePredefines = !Args.hasArg(OPT_undef);
1677  Opts.DetailedRecord = Args.hasArg(OPT_detailed_preprocessing_record);
1678  Opts.DisablePCHValidation = Args.hasArg(OPT_fno_validate_pch);
1679
1680  Opts.DumpDeserializedPCHDecls = Args.hasArg(OPT_dump_deserialized_pch_decls);
1681  for (arg_iterator it = Args.filtered_begin(OPT_error_on_deserialized_pch_decl),
1682         ie = Args.filtered_end(); it != ie; ++it) {
1683    const Arg *A = *it;
1684    Opts.DeserializedPCHDeclsToErrorOn.insert(A->getValue());
1685  }
1686
1687  if (const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) {
1688    StringRef Value(A->getValue());
1689    size_t Comma = Value.find(',');
1690    unsigned Bytes = 0;
1691    unsigned EndOfLine = 0;
1692
1693    if (Comma == StringRef::npos ||
1694        Value.substr(0, Comma).getAsInteger(10, Bytes) ||
1695        Value.substr(Comma + 1).getAsInteger(10, EndOfLine))
1696      Diags.Report(diag::err_drv_preamble_format);
1697    else {
1698      Opts.PrecompiledPreambleBytes.first = Bytes;
1699      Opts.PrecompiledPreambleBytes.second = (EndOfLine != 0);
1700    }
1701  }
1702
1703  // Add macros from the command line.
1704  for (arg_iterator it = Args.filtered_begin(OPT_D, OPT_U),
1705         ie = Args.filtered_end(); it != ie; ++it) {
1706    if ((*it)->getOption().matches(OPT_D))
1707      Opts.addMacroDef((*it)->getValue());
1708    else
1709      Opts.addMacroUndef((*it)->getValue());
1710  }
1711
1712  Opts.MacroIncludes = Args.getAllArgValues(OPT_imacros);
1713
1714  // Add the ordered list of -includes.
1715  for (arg_iterator it = Args.filtered_begin(OPT_include),
1716         ie = Args.filtered_end(); it != ie; ++it) {
1717    const Arg *A = *it;
1718    Opts.Includes.push_back(A->getValue());
1719  }
1720
1721  for (arg_iterator it = Args.filtered_begin(OPT_chain_include),
1722         ie = Args.filtered_end(); it != ie; ++it) {
1723    const Arg *A = *it;
1724    Opts.ChainedIncludes.push_back(A->getValue());
1725  }
1726
1727  // Include 'altivec.h' if -faltivec option present
1728  if (Args.hasArg(OPT_faltivec))
1729    Opts.Includes.push_back("altivec.h");
1730
1731  for (arg_iterator it = Args.filtered_begin(OPT_remap_file),
1732         ie = Args.filtered_end(); it != ie; ++it) {
1733    const Arg *A = *it;
1734    std::pair<StringRef,StringRef> Split =
1735      StringRef(A->getValue()).split(';');
1736
1737    if (Split.second.empty()) {
1738      Diags.Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args);
1739      continue;
1740    }
1741
1742    Opts.addRemappedFile(Split.first, Split.second);
1743  }
1744
1745  if (Arg *A = Args.getLastArg(OPT_fobjc_arc_cxxlib_EQ)) {
1746    StringRef Name = A->getValue();
1747    unsigned Library = llvm::StringSwitch<unsigned>(Name)
1748      .Case("libc++", ARCXX_libcxx)
1749      .Case("libstdc++", ARCXX_libstdcxx)
1750      .Case("none", ARCXX_nolib)
1751      .Default(~0U);
1752    if (Library == ~0U)
1753      Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
1754    else
1755      Opts.ObjCXXARCStandardLibrary = (ObjCXXARCStandardLibraryKind)Library;
1756  }
1757}
1758
1759static void ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts,
1760                                        ArgList &Args,
1761                                        frontend::ActionKind Action) {
1762  using namespace options;
1763
1764  switch (Action) {
1765  case frontend::ASTDeclList:
1766  case frontend::ASTDump:
1767  case frontend::ASTPrint:
1768  case frontend::ASTView:
1769  case frontend::EmitAssembly:
1770  case frontend::EmitBC:
1771  case frontend::EmitHTML:
1772  case frontend::EmitLLVM:
1773  case frontend::EmitLLVMOnly:
1774  case frontend::EmitCodeGenOnly:
1775  case frontend::EmitObj:
1776  case frontend::FixIt:
1777  case frontend::GenerateModule:
1778  case frontend::GeneratePCH:
1779  case frontend::GeneratePTH:
1780  case frontend::ParseSyntaxOnly:
1781  case frontend::ModuleFileInfo:
1782  case frontend::VerifyPCH:
1783  case frontend::PluginAction:
1784  case frontend::PrintDeclContext:
1785  case frontend::RewriteObjC:
1786  case frontend::RewriteTest:
1787  case frontend::RunAnalysis:
1788  case frontend::MigrateSource:
1789    Opts.ShowCPP = 0;
1790    break;
1791
1792  case frontend::DumpRawTokens:
1793  case frontend::DumpTokens:
1794  case frontend::InitOnly:
1795  case frontend::PrintPreamble:
1796  case frontend::PrintPreprocessedInput:
1797  case frontend::RewriteMacros:
1798  case frontend::RunPreprocessorOnly:
1799    Opts.ShowCPP = !Args.hasArg(OPT_dM);
1800    break;
1801  }
1802
1803  Opts.ShowComments = Args.hasArg(OPT_C);
1804  Opts.ShowLineMarkers = !Args.hasArg(OPT_P);
1805  Opts.ShowMacroComments = Args.hasArg(OPT_CC);
1806  Opts.ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);
1807  Opts.RewriteIncludes = Args.hasArg(OPT_frewrite_includes);
1808}
1809
1810static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args) {
1811  using namespace options;
1812  Opts.ABI = Args.getLastArgValue(OPT_target_abi);
1813  Opts.CPU = Args.getLastArgValue(OPT_target_cpu);
1814  Opts.FPMath = Args.getLastArgValue(OPT_mfpmath);
1815  Opts.FeaturesAsWritten = Args.getAllArgValues(OPT_target_feature);
1816  Opts.LinkerVersion = Args.getLastArgValue(OPT_target_linker_version);
1817  Opts.Triple = llvm::Triple::normalize(Args.getLastArgValue(OPT_triple));
1818
1819  // Use the default target triple if unspecified.
1820  if (Opts.Triple.empty())
1821    Opts.Triple = llvm::sys::getDefaultTargetTriple();
1822}
1823
1824bool CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,
1825                                        const char *const *ArgBegin,
1826                                        const char *const *ArgEnd,
1827                                        DiagnosticsEngine &Diags) {
1828  bool Success = true;
1829
1830  // Parse the arguments.
1831  std::unique_ptr<OptTable> Opts(createDriverOptTable());
1832  const unsigned IncludedFlagsBitmask = options::CC1Option;
1833  unsigned MissingArgIndex, MissingArgCount;
1834  std::unique_ptr<InputArgList> Args(
1835      Opts->ParseArgs(ArgBegin, ArgEnd, MissingArgIndex, MissingArgCount,
1836                      IncludedFlagsBitmask));
1837
1838  // Check for missing argument error.
1839  if (MissingArgCount) {
1840    Diags.Report(diag::err_drv_missing_argument)
1841      << Args->getArgString(MissingArgIndex) << MissingArgCount;
1842    Success = false;
1843  }
1844
1845  // Issue errors on unknown arguments.
1846  for (arg_iterator it = Args->filtered_begin(OPT_UNKNOWN),
1847         ie = Args->filtered_end(); it != ie; ++it) {
1848    Diags.Report(diag::err_drv_unknown_argument) << (*it)->getAsString(*Args);
1849    Success = false;
1850  }
1851
1852  Success = ParseAnalyzerArgs(*Res.getAnalyzerOpts(), *Args, Diags) && Success;
1853  Success = ParseMigratorArgs(Res.getMigratorOpts(), *Args) && Success;
1854  ParseDependencyOutputArgs(Res.getDependencyOutputOpts(), *Args);
1855  Success = ParseDiagnosticArgs(Res.getDiagnosticOpts(), *Args, &Diags)
1856            && Success;
1857  ParseCommentArgs(Res.getLangOpts()->CommentOpts, *Args);
1858  ParseFileSystemArgs(Res.getFileSystemOpts(), *Args);
1859  // FIXME: We shouldn't have to pass the DashX option around here
1860  InputKind DashX = ParseFrontendArgs(Res.getFrontendOpts(), *Args, Diags);
1861  ParseTargetArgs(Res.getTargetOpts(), *Args);
1862  Success = ParseCodeGenArgs(Res.getCodeGenOpts(), *Args, DashX, Diags,
1863                             Res.getTargetOpts()) && Success;
1864  ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), *Args);
1865  if (DashX != IK_AST && DashX != IK_LLVM_IR) {
1866    ParseLangArgs(*Res.getLangOpts(), *Args, DashX, Diags);
1867    if (Res.getFrontendOpts().ProgramAction == frontend::RewriteObjC)
1868      Res.getLangOpts()->ObjCExceptions = 1;
1869  }
1870  // FIXME: ParsePreprocessorArgs uses the FileManager to read the contents of
1871  // PCH file and find the original header name. Remove the need to do that in
1872  // ParsePreprocessorArgs and remove the FileManager
1873  // parameters from the function and the "FileManager.h" #include.
1874  FileManager FileMgr(Res.getFileSystemOpts());
1875  ParsePreprocessorArgs(Res.getPreprocessorOpts(), *Args, FileMgr, Diags);
1876  ParsePreprocessorOutputArgs(Res.getPreprocessorOutputOpts(), *Args,
1877                              Res.getFrontendOpts().ProgramAction);
1878  return Success;
1879}
1880
1881namespace {
1882
1883  class ModuleSignature {
1884    SmallVector<uint64_t, 16> Data;
1885    unsigned CurBit;
1886    uint64_t CurValue;
1887
1888  public:
1889    ModuleSignature() : CurBit(0), CurValue(0) { }
1890
1891    void add(uint64_t Value, unsigned Bits);
1892    void add(StringRef Value);
1893    void flush();
1894
1895    llvm::APInt getAsInteger() const;
1896  };
1897}
1898
1899void ModuleSignature::add(uint64_t Value, unsigned int NumBits) {
1900  CurValue |= Value << CurBit;
1901  if (CurBit + NumBits < 64) {
1902    CurBit += NumBits;
1903    return;
1904  }
1905
1906  // Add the current word.
1907  Data.push_back(CurValue);
1908
1909  if (CurBit)
1910    CurValue = Value >> (64-CurBit);
1911  else
1912    CurValue = 0;
1913  CurBit = (CurBit+NumBits) & 63;
1914}
1915
1916void ModuleSignature::flush() {
1917  if (CurBit == 0)
1918    return;
1919
1920  Data.push_back(CurValue);
1921  CurBit = 0;
1922  CurValue = 0;
1923}
1924
1925void ModuleSignature::add(StringRef Value) {
1926  for (StringRef::iterator I = Value.begin(), IEnd = Value.end(); I != IEnd;++I)
1927    add(*I, 8);
1928}
1929
1930llvm::APInt ModuleSignature::getAsInteger() const {
1931  return llvm::APInt(Data.size() * 64, Data);
1932}
1933
1934std::string CompilerInvocation::getModuleHash() const {
1935  // Note: For QoI reasons, the things we use as a hash here should all be
1936  // dumped via the -module-info flag.
1937  using llvm::hash_code;
1938  using llvm::hash_value;
1939  using llvm::hash_combine;
1940
1941  // Start the signature with the compiler version.
1942  // FIXME: We'd rather use something more cryptographically sound than
1943  // CityHash, but this will do for now.
1944  hash_code code = hash_value(getClangFullRepositoryVersion());
1945
1946  // Extend the signature with the language options
1947#define LANGOPT(Name, Bits, Default, Description) \
1948   code = hash_combine(code, LangOpts->Name);
1949#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
1950  code = hash_combine(code, static_cast<unsigned>(LangOpts->get##Name()));
1951#define BENIGN_LANGOPT(Name, Bits, Default, Description)
1952#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
1953#include "clang/Basic/LangOptions.def"
1954
1955  // Extend the signature with the target options.
1956  code = hash_combine(code, TargetOpts->Triple, TargetOpts->CPU,
1957                      TargetOpts->ABI);
1958  for (unsigned i = 0, n = TargetOpts->FeaturesAsWritten.size(); i != n; ++i)
1959    code = hash_combine(code, TargetOpts->FeaturesAsWritten[i]);
1960
1961  // Extend the signature with preprocessor options.
1962  const PreprocessorOptions &ppOpts = getPreprocessorOpts();
1963  const HeaderSearchOptions &hsOpts = getHeaderSearchOpts();
1964  code = hash_combine(code, ppOpts.UsePredefines, ppOpts.DetailedRecord);
1965
1966  for (std::vector<std::pair<std::string, bool/*isUndef*/> >::const_iterator
1967            I = getPreprocessorOpts().Macros.begin(),
1968         IEnd = getPreprocessorOpts().Macros.end();
1969       I != IEnd; ++I) {
1970    // If we're supposed to ignore this macro for the purposes of modules,
1971    // don't put it into the hash.
1972    if (!hsOpts.ModulesIgnoreMacros.empty()) {
1973      // Check whether we're ignoring this macro.
1974      StringRef MacroDef = I->first;
1975      if (hsOpts.ModulesIgnoreMacros.count(MacroDef.split('=').first))
1976        continue;
1977    }
1978
1979    code = hash_combine(code, I->first, I->second);
1980  }
1981
1982  // Extend the signature with the sysroot.
1983  code = hash_combine(code, hsOpts.Sysroot, hsOpts.UseBuiltinIncludes,
1984                      hsOpts.UseStandardSystemIncludes,
1985                      hsOpts.UseStandardCXXIncludes,
1986                      hsOpts.UseLibcxx);
1987  code = hash_combine(code, hsOpts.ResourceDir);
1988
1989  // Extend the signature with the user build path.
1990  code = hash_combine(code, hsOpts.ModuleUserBuildPath);
1991
1992  // Darwin-specific hack: if we have a sysroot, use the contents and
1993  // modification time of
1994  //   $sysroot/System/Library/CoreServices/SystemVersion.plist
1995  // as part of the module hash.
1996  if (!hsOpts.Sysroot.empty()) {
1997    SmallString<128> systemVersionFile;
1998    systemVersionFile += hsOpts.Sysroot;
1999    llvm::sys::path::append(systemVersionFile, "System");
2000    llvm::sys::path::append(systemVersionFile, "Library");
2001    llvm::sys::path::append(systemVersionFile, "CoreServices");
2002    llvm::sys::path::append(systemVersionFile, "SystemVersion.plist");
2003
2004    llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> buffer =
2005        llvm::MemoryBuffer::getFile(systemVersionFile.str());
2006    if (buffer) {
2007      code = hash_combine(code, buffer.get()->getBuffer());
2008
2009      struct stat statBuf;
2010      if (stat(systemVersionFile.c_str(), &statBuf) == 0)
2011        code = hash_combine(code, statBuf.st_mtime);
2012    }
2013  }
2014
2015  return llvm::APInt(64, code).toString(36, /*Signed=*/false);
2016}
2017
2018namespace clang {
2019
2020template<typename IntTy>
2021static IntTy getLastArgIntValueImpl(const ArgList &Args, OptSpecifier Id,
2022                                    IntTy Default,
2023                                    DiagnosticsEngine *Diags) {
2024  IntTy Res = Default;
2025  if (Arg *A = Args.getLastArg(Id)) {
2026    if (StringRef(A->getValue()).getAsInteger(10, Res)) {
2027      if (Diags)
2028        Diags->Report(diag::err_drv_invalid_int_value) << A->getAsString(Args)
2029                                                       << A->getValue();
2030    }
2031  }
2032  return Res;
2033}
2034
2035
2036// Declared in clang/Frontend/Utils.h.
2037int getLastArgIntValue(const ArgList &Args, OptSpecifier Id, int Default,
2038                       DiagnosticsEngine *Diags) {
2039  return getLastArgIntValueImpl<int>(Args, Id, Default, Diags);
2040}
2041
2042uint64_t getLastArgUInt64Value(const ArgList &Args, OptSpecifier Id,
2043                               uint64_t Default,
2044                               DiagnosticsEngine *Diags) {
2045  return getLastArgIntValueImpl<uint64_t>(Args, Id, Default, Diags);
2046}
2047
2048void BuryPointer(const void *Ptr) {
2049  // This function may be called only a small fixed amount of times per each
2050  // invocation, otherwise we do actually have a leak which we want to report.
2051  // If this function is called more than kGraveYardMaxSize times, the pointers
2052  // will not be properly buried and a leak detector will report a leak, which
2053  // is what we want in such case.
2054  static const size_t kGraveYardMaxSize = 16;
2055  LLVM_ATTRIBUTE_UNUSED static const void *GraveYard[kGraveYardMaxSize];
2056  static std::atomic<unsigned> GraveYardSize;
2057  unsigned Idx = GraveYardSize++;
2058  if (Idx >= kGraveYardMaxSize)
2059    return;
2060  GraveYard[Idx] = Ptr;
2061}
2062
2063IntrusiveRefCntPtr<vfs::FileSystem>
2064createVFSFromCompilerInvocation(const CompilerInvocation &CI,
2065                                DiagnosticsEngine &Diags) {
2066  if (CI.getHeaderSearchOpts().VFSOverlayFiles.empty())
2067    return vfs::getRealFileSystem();
2068
2069  IntrusiveRefCntPtr<vfs::OverlayFileSystem>
2070    Overlay(new vfs::OverlayFileSystem(vfs::getRealFileSystem()));
2071  // earlier vfs files are on the bottom
2072  for (const std::string &File : CI.getHeaderSearchOpts().VFSOverlayFiles) {
2073    llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer =
2074        llvm::MemoryBuffer::getFile(File);
2075    if (!Buffer) {
2076      Diags.Report(diag::err_missing_vfs_overlay_file) << File;
2077      return IntrusiveRefCntPtr<vfs::FileSystem>();
2078    }
2079
2080    IntrusiveRefCntPtr<vfs::FileSystem> FS =
2081        vfs::getVFSFromYAML(std::move(Buffer.get()), /*DiagHandler*/ nullptr);
2082    if (!FS.get()) {
2083      Diags.Report(diag::err_invalid_vfs_overlay) << File;
2084      return IntrusiveRefCntPtr<vfs::FileSystem>();
2085    }
2086    Overlay->pushOverlay(FS);
2087  }
2088  return Overlay;
2089}
2090} // end namespace clang
2091