CompilerInvocation.cpp revision a3f4eeff4aec1306447707c73f70a5657357422c
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 "llvm/ADT/StringExtras.h"
12#include "llvm/Support/ErrorHandling.h"
13using namespace clang;
14
15static const char *getAnalysisName(Analyses Kind) {
16  switch (Kind) {
17  default:
18    llvm::llvm_unreachable("Unknown analysis store!");
19#define ANALYSIS(NAME, CMDFLAG, DESC, SCOPE)\
20  case NAME: return "-" CMDFLAG;
21#include "clang/Frontend/Analyses.def"
22  }
23}
24
25static const char *getAnalysisStoreName(AnalysisStores Kind) {
26  switch (Kind) {
27  default:
28    llvm::llvm_unreachable("Unknown analysis store!");
29#define ANALYSIS_STORE(NAME, CMDFLAG, DESC, CREATFN) \
30  case NAME##Model: return CMDFLAG;
31#include "clang/Frontend/Analyses.def"
32  }
33}
34
35static const char *getAnalysisConstraintName(AnalysisConstraints Kind) {
36  switch (Kind) {
37  default:
38    llvm::llvm_unreachable("Unknown analysis constraints!");
39#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
40  case NAME##Model: return CMDFLAG;
41#include "clang/Frontend/Analyses.def"
42  }
43}
44
45static const char *getAnalysisDiagClientName(AnalysisDiagClients Kind) {
46  switch (Kind) {
47  default:
48    llvm::llvm_unreachable("Unknown analysis client!");
49#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN, AUTOCREATE) \
50  case PD_##NAME: return CMDFLAG;
51#include "clang/Frontend/Analyses.def"
52  }
53}
54
55static void AnalyzerOptsToArgs(const AnalyzerOptions &Opts,
56                               std::vector<std::string> &Res) {
57  for (unsigned i = 0, e = Opts.AnalysisList.size(); i != e; ++i)
58    Res.push_back(getAnalysisName(Opts.AnalysisList[i]));
59  if (Opts.AnalysisStoreOpt != BasicStoreModel) {
60    Res.push_back("-analyzer-store");
61    Res.push_back(getAnalysisStoreName(Opts.AnalysisStoreOpt));
62  }
63  if (Opts.AnalysisConstraintsOpt != RangeConstraintsModel) {
64    Res.push_back("-analyzer-constraints");
65    Res.push_back(getAnalysisConstraintName(Opts.AnalysisConstraintsOpt));
66  }
67  if (Opts.AnalysisDiagOpt != PD_HTML) {
68    Res.push_back("-analyzer-output");
69    Res.push_back(getAnalysisDiagClientName(Opts.AnalysisDiagOpt));
70  }
71  if (!Opts.AnalyzeSpecificFunction.empty()) {
72    Res.push_back("-analyze-function");
73    Res.push_back(Opts.AnalyzeSpecificFunction);
74  }
75  if (Opts.AnalyzeAll)
76    Res.push_back("-analyzer-opt-analyze-headers");
77  if (Opts.AnalyzerDisplayProgress)
78    Res.push_back("-analyzer-display-progress");
79  if (Opts.EagerlyAssume)
80    Res.push_back("-analyzer-eagerly-assume");
81  if (!Opts.PurgeDead)
82    Res.push_back("-analyzer-no-purge-dead");
83  if (Opts.TrimGraph)
84    Res.push_back("-trim-egraph");
85  if (Opts.VisualizeEGDot)
86    Res.push_back("-analyzer-viz-egraph-graphviz");
87  if (Opts.VisualizeEGDot)
88    Res.push_back("-analyzer-viz-egraph-ubigraph");
89  if (Opts.EnableExperimentalChecks)
90    Res.push_back("-analyzer-experimental-checks");
91  if (Opts.EnableExperimentalInternalChecks)
92    Res.push_back("-analyzer-experimental-internal-checks");
93}
94
95static void CodeGenOptsToArgs(const CodeGenOptions &Opts,
96                              std::vector<std::string> &Res) {
97  if (Opts.DebugInfo)
98    Res.push_back("-g");
99  if (Opts.DisableLLVMOpts)
100    Res.push_back("-disable-llvm-optzns");
101  if (Opts.DisableRedZone)
102    Res.push_back("-disable-red-zone");
103  if (!Opts.MergeAllConstants)
104    Res.push_back("-fno-merge-all-constants");
105  if (Opts.NoCommon)
106    Res.push_back("-fno-common");
107  if (Opts.NoImplicitFloat)
108    Res.push_back("-no-implicit-float");
109  if (Opts.OptimizeSize) {
110    assert(Opts.OptimizationLevel == 2 && "Invalid options!");
111    Res.push_back("-Os");
112  } else if (Opts.OptimizationLevel != 0)
113    Res.push_back("-O" + llvm::utostr(Opts.OptimizationLevel));
114  if (!Opts.MainFileName.empty()) {
115    Res.push_back("-main-file-name");
116    Res.push_back(Opts.MainFileName);
117  }
118  // SimplifyLibCalls is only derived.
119  // TimePasses is only derived.
120  // UnitAtATime is unused.
121  // UnrollLoops is only derived.
122  // VerifyModule is only derived.
123  // Inlining is only derived.
124
125  if (Opts.AsmVerbose)
126    Res.push_back("-masm-verbose");
127  if (!Opts.CodeModel.empty()) {
128    Res.push_back("-mcode-model");
129    Res.push_back(Opts.CodeModel);
130  }
131  if (!Opts.DebugPass.empty()) {
132    Res.push_back("-mdebug-pass");
133    Res.push_back(Opts.DebugPass);
134  }
135  if (Opts.DisableFPElim)
136    Res.push_back("-mdisable-fp-elim");
137  if (!Opts.FloatABI.empty()) {
138    Res.push_back("-mfloat-abi");
139    Res.push_back(Opts.FloatABI);
140  }
141  if (!Opts.LimitFloatPrecision.empty()) {
142    Res.push_back("-mlimit-float-precision");
143    Res.push_back(Opts.LimitFloatPrecision);
144  }
145  if (Opts.NoZeroInitializedInBSS)
146    Res.push_back("-mno-zero-initialized-bss");
147  if (Opts.SoftFloat)
148    Res.push_back("-msoft-float");
149  if (Opts.UnwindTables)
150    Res.push_back("-munwind-tables");
151  if (Opts.RelocationModel != "pic") {
152    Res.push_back("-mrelocation-model");
153    Res.push_back(Opts.RelocationModel);
154  }
155}
156
157static void DependencyOutputOptsToArgs(const DependencyOutputOptions &Opts,
158                                       std::vector<std::string> &Res) {
159  if (Opts.IncludeSystemHeaders)
160    Res.push_back("-sys-header-deps");
161  if (Opts.UsePhonyTargets)
162    Res.push_back("-MP");
163  if (!Opts.OutputFile.empty()) {
164    Res.push_back("-dependency-file");
165    Res.push_back(Opts.OutputFile);
166  }
167  for (unsigned i = 0, e = Opts.Targets.size(); i != e; ++i) {
168    Res.push_back("-MT");
169    Res.push_back(Opts.Targets[i]);
170  }
171}
172
173static void DiagnosticOptsToArgs(const DiagnosticOptions &Opts,
174                                 std::vector<std::string> &Res) {
175  if (Opts.IgnoreWarnings)
176    Res.push_back("-w");
177  if (Opts.NoRewriteMacros)
178    Res.push_back("-Wno-rewrite-macros");
179  if (Opts.Pedantic)
180    Res.push_back("-pedantic");
181  if (Opts.PedanticErrors)
182    Res.push_back("-pedantic-errors");
183  if (!Opts.ShowColumn)
184    Res.push_back("-fno-show-column");
185  if (!Opts.ShowLocation)
186    Res.push_back("-fno-show-source-location");
187  if (!Opts.ShowCarets)
188    Res.push_back("-fno-caret-diagnostics");
189  if (!Opts.ShowFixits)
190    Res.push_back("-fno-diagnostics-fixit-info");
191  if (Opts.ShowSourceRanges)
192    Res.push_back("-fdiagnostics-print-source-range-info");
193  if (Opts.ShowColors)
194    Res.push_back("-fcolor-diagnostics");
195  if (Opts.VerifyDiagnostics)
196    Res.push_back("-verify");
197  if (Opts.ShowOptionNames)
198    Res.push_back("-fdiagnostics-show-option");
199  if (Opts.MessageLength) {
200    Res.push_back("-fmessage-length");
201    Res.push_back(llvm::utostr(Opts.MessageLength));
202  }
203  if (!Opts.DumpBuildInformation.empty()) {
204    Res.push_back("-dump-build-information");
205    Res.push_back(Opts.DumpBuildInformation);
206  }
207  for (unsigned i = 0, e = Opts.Warnings.size(); i != e; ++i)
208    Res.push_back("-W" + Opts.Warnings[i]);
209}
210
211static const char *getInputKindName(FrontendOptions::InputKind Kind) {
212  switch (Kind) {
213  case FrontendOptions::IK_None:              break;
214  case FrontendOptions::IK_AST:               return "ast";
215  case FrontendOptions::IK_Asm:               return "assembler-with-cpp";
216  case FrontendOptions::IK_C:                 return "c";
217  case FrontendOptions::IK_CXX:               return "c++";
218  case FrontendOptions::IK_ObjC:              return "objective-c";
219  case FrontendOptions::IK_ObjCXX:            return "objective-c++";
220  case FrontendOptions::IK_OpenCL:            return "cl";
221  case FrontendOptions::IK_PreprocessedC:     return "cpp-output";
222  case FrontendOptions::IK_PreprocessedCXX:   return "c++-cpp-output";
223  case FrontendOptions::IK_PreprocessedObjC:  return "objective-c-cpp-output";
224  case FrontendOptions::IK_PreprocessedObjCXX:return "objective-c++-cpp-output";
225  }
226
227  llvm::llvm_unreachable("Unexpected language kind!");
228  return 0;
229}
230
231static const char *getActionName(frontend::ActionKind Kind) {
232  switch (Kind) {
233  case frontend::PluginAction:
234  case frontend::InheritanceView:
235    llvm::llvm_unreachable("Invalid kind!");
236
237  case frontend::ASTDump:                return "-ast-dump";
238  case frontend::ASTPrint:               return "-ast-print";
239  case frontend::ASTPrintXML:            return "-ast-print-xml";
240  case frontend::ASTView:                return "-ast-view";
241  case frontend::DumpRawTokens:          return "-dump-raw-tokens";
242  case frontend::DumpRecordLayouts:      return "-dump-record-layouts";
243  case frontend::DumpTokens:             return "-dump-tokens";
244  case frontend::EmitAssembly:           return "-S";
245  case frontend::EmitBC:                 return "-emit-llvm-bc";
246  case frontend::EmitHTML:               return "-emit-html";
247  case frontend::EmitLLVM:               return "-emit-llvm";
248  case frontend::EmitLLVMOnly:           return "-emit-llvm-only";
249  case frontend::FixIt:                  return "-fixit";
250  case frontend::GeneratePCH:            return "-emit-pch";
251  case frontend::GeneratePTH:            return "-emit-pth";
252  case frontend::ParseNoop:              return "-parse-noop";
253  case frontend::ParsePrintCallbacks:    return "-parse-print-callbacks";
254  case frontend::ParseSyntaxOnly:        return "-fsyntax-only";
255  case frontend::PrintDeclContext:       return "-print-decl-contexts";
256  case frontend::PrintPreprocessedInput: return "-E";
257  case frontend::RewriteBlocks:          return "-rewrite-blocks";
258  case frontend::RewriteMacros:          return "-rewrite-macros";
259  case frontend::RewriteObjC:            return "-rewrite-objc";
260  case frontend::RewriteTest:            return "-rewrite-test";
261  case frontend::RunAnalysis:            return "-analyze";
262  case frontend::RunPreprocessorOnly:    return "-Eonly";
263  }
264
265  llvm::llvm_unreachable("Unexpected language kind!");
266  return 0;
267}
268
269static void FrontendOptsToArgs(const FrontendOptions &Opts,
270                               std::vector<std::string> &Res) {
271  if (!Opts.DebugCodeCompletionPrinter)
272    Res.push_back("-no-code-completion-debug-printer");
273  if (Opts.DisableFree)
274    Res.push_back("-disable-free");
275  if (Opts.EmptyInputOnly)
276    Res.push_back("-empty-input-only");
277  if (Opts.RelocatablePCH)
278    Res.push_back("-relocatable-pch");
279  if (Opts.ShowMacrosInCodeCompletion)
280    Res.push_back("-code-completion-macros");
281  if (Opts.ShowStats)
282    Res.push_back("-print-stats");
283  if (Opts.ShowTimers)
284    Res.push_back("-ftime-report");
285
286  bool NeedLang = false;
287  for (unsigned i = 0, e = Opts.Inputs.size(); i != e; ++i)
288    if (FrontendOptions::getInputKindForExtension(Opts.Inputs[i].second) !=
289        Opts.Inputs[i].first)
290      NeedLang = true;
291  if (NeedLang) {
292    Res.push_back("-x");
293    Res.push_back(getInputKindName(Opts.Inputs[0].first));
294  }
295  for (unsigned i = 0, e = Opts.Inputs.size(); i != e; ++i) {
296    assert((!NeedLang || Opts.Inputs[i].first == Opts.Inputs[0].first) &&
297           "Unable to represent this input vector!");
298    Res.push_back(Opts.Inputs[i].second);
299  }
300
301  if (!Opts.OutputFile.empty()) {
302    Res.push_back("-o");
303    Res.push_back(Opts.OutputFile);
304  }
305  if (!Opts.ViewClassInheritance.empty()) {
306    Res.push_back("-cxx-inheritance-view");
307    Res.push_back(Opts.ViewClassInheritance);
308  }
309  for (unsigned i = 0, e = Opts.FixItLocations.size(); i != e; ++i) {
310    Res.push_back("-fixit-at");
311    Res.push_back(Opts.FixItLocations[i].FileName + ":" +
312                  llvm::utostr(Opts.FixItLocations[i].Line) + ":" +
313                  llvm::utostr(Opts.FixItLocations[i].Column));
314  }
315  if (!Opts.CodeCompletionAt.FileName.empty()) {
316    Res.push_back("-code-completion-at");
317    Res.push_back(Opts.CodeCompletionAt.FileName + ":" +
318                  llvm::utostr(Opts.CodeCompletionAt.Line) + ":" +
319                  llvm::utostr(Opts.CodeCompletionAt.Column));
320  }
321  if (Opts.ProgramAction != frontend::InheritanceView &&
322      Opts.ProgramAction != frontend::PluginAction)
323    Res.push_back(getActionName(Opts.ProgramAction));
324  if (!Opts.ActionName.empty()) {
325    Res.push_back("-plugin");
326    Res.push_back(Opts.ActionName);
327  }
328}
329
330static void HeaderSearchOptsToArgs(const HeaderSearchOptions &Opts,
331                                   std::vector<std::string> &Res) {
332  if (Opts.Sysroot != "/") {
333    Res.push_back("-isysroot");
334    Res.push_back(Opts.Sysroot);
335  }
336
337  /// User specified include entries.
338  for (unsigned i = 0, e = Opts.UserEntries.size(); i != e; ++i) {
339    const HeaderSearchOptions::Entry &E = Opts.UserEntries[i];
340    if (E.IsFramework && (E.Group != frontend::Angled || !E.IsUserSupplied))
341      llvm::llvm_report_error("Invalid option set!");
342    if (E.IsUserSupplied) {
343      if (E.Group == frontend::After) {
344        Res.push_back("-idirafter");
345      } else if (E.Group == frontend::Quoted) {
346        Res.push_back("-iquote");
347      } else if (E.Group == frontend::System) {
348        Res.push_back("-isystem");
349      } else {
350        assert(E.Group == frontend::Angled && "Invalid group!");
351        Res.push_back(E.IsFramework ? "-F" : "-I");
352      }
353    } else {
354      if (E.Group != frontend::Angled && E.Group != frontend::System)
355        llvm::llvm_report_error("Invalid option set!");
356      Res.push_back(E.Group == frontend::Angled ? "-iwithprefixbefore" :
357                    "-iwithprefix");
358    }
359    Res.push_back(E.Path);
360  }
361
362  if (!Opts.EnvIncPath.empty()) {
363    // FIXME: Provide an option for this, and move env detection to driver.
364    llvm::llvm_report_error("Not yet implemented!");
365  }
366  if (!Opts.CEnvIncPath.empty()) {
367    // FIXME: Provide an option for this, and move env detection to driver.
368    llvm::llvm_report_error("Not yet implemented!");
369  }
370  if (!Opts.ObjCEnvIncPath.empty()) {
371    // FIXME: Provide an option for this, and move env detection to driver.
372    llvm::llvm_report_error("Not yet implemented!");
373  }
374  if (!Opts.CXXEnvIncPath.empty()) {
375    // FIXME: Provide an option for this, and move env detection to driver.
376    llvm::llvm_report_error("Not yet implemented!");
377  }
378  if (!Opts.ObjCXXEnvIncPath.empty()) {
379    // FIXME: Provide an option for this, and move env detection to driver.
380    llvm::llvm_report_error("Not yet implemented!");
381  }
382  if (!Opts.BuiltinIncludePath.empty()) {
383    // FIXME: Provide an option for this, and move to driver.
384  }
385  if (!Opts.UseStandardIncludes)
386    Res.push_back("-nostdinc");
387  if (Opts.Verbose)
388    Res.push_back("-v");
389}
390
391static void LangOptsToArgs(const LangOptions &Opts,
392                           std::vector<std::string> &Res) {
393  LangOptions DefaultLangOpts;
394
395  // FIXME: Need to set -std to get all the implicit options.
396
397  // FIXME: We want to only pass options relative to the defaults, which
398  // requires constructing a target. :(
399  //
400  // It would be better to push the all target specific choices into the driver,
401  // so that everything below that was more uniform.
402
403  if (Opts.Trigraphs)
404    Res.push_back("-trigraphs");
405  // Implicit based on the input kind:
406  //   AsmPreprocessor, CPlusPlus, ObjC1, ObjC2, OpenCL
407  // Implicit based on the input language standard:
408  //   BCPLComment, C99, CPlusPlus0x, Digraphs, GNUInline, ImplicitInt, GNUMode
409  if (Opts.DollarIdents)
410    Res.push_back("-fdollars-in-identifiers");
411  if (Opts.Microsoft)
412    Res.push_back("-fms-extensions=1");
413  if (Opts.ObjCNonFragileABI)
414    Res.push_back("-fobjc-nonfragile-abi");
415  // NoInline is implicit.
416  if (!Opts.CXXOperatorNames)
417    Res.push_back("-fno-operator-names");
418  if (Opts.PascalStrings)
419    Res.push_back("-fpascal-strings");
420  if (Opts.WritableStrings)
421    Res.push_back("-fwritable-strings");
422  if (!Opts.LaxVectorConversions)
423    Res.push_back("-fno-lax-vector-conversions");
424  if (Opts.AltiVec)
425    Res.push_back("-faltivec");
426  if (Opts.Exceptions)
427    Res.push_back("-fexceptions");
428  if (!Opts.Rtti)
429    Res.push_back("-fno-rtti");
430  if (!Opts.NeXTRuntime)
431    Res.push_back("-fgnu-runtime");
432  if (Opts.Freestanding)
433    Res.push_back("-ffreestanding");
434  if (Opts.NoBuiltin)
435    Res.push_back("-fno-builtin");
436  if (Opts.ThreadsafeStatics)
437    llvm::llvm_report_error("FIXME: Not yet implemented!");
438  if (Opts.POSIXThreads)
439    Res.push_back("-pthread");
440  if (Opts.Blocks)
441    Res.push_back("-fblocks");
442  if (Opts.EmitAllDecls)
443    Res.push_back("-femit-all-decls");
444  if (!Opts.MathErrno)
445    Res.push_back("-fno-math-errno");
446  if (Opts.OverflowChecking)
447    Res.push_back("-ftrapv");
448  if (Opts.HeinousExtensions)
449    Res.push_back("-fheinous-gnu-extensions");
450  // Optimize is implicit.
451  // OptimizeSize is implicit.
452  if (Opts.Static)
453    Res.push_back("-static-define");
454  if (Opts.PICLevel) {
455    Res.push_back("-pic-level");
456    Res.push_back(llvm::utostr(Opts.PICLevel));
457  }
458  if (Opts.ObjCGCBitmapPrint)
459    Res.push_back("-print-ivar-layout");
460  // FIXME: Don't forget to update when the default changes!
461  if (Opts.AccessControl)
462    Res.push_back("-faccess-control");
463  if (!Opts.CharIsSigned)
464    Res.push_back("-fno-signed-char");
465  if (Opts.ShortWChar)
466    Res.push_back("-fshort-wchar");
467  if (!Opts.ElideConstructors)
468    Res.push_back("-fno-elide-constructors");
469  if (Opts.getGCMode() != LangOptions::NonGC) {
470    if (Opts.getGCMode() == LangOptions::HybridGC) {
471      Res.push_back("-fobjc-gc");
472    } else {
473      assert(Opts.getGCMode() == LangOptions::GCOnly && "Invalid GC mode!");
474      Res.push_back("-fobjc-gc-only");
475    }
476  }
477  if (Opts.getVisibilityMode() != LangOptions::Default) {
478    Res.push_back("-fvisibility");
479    if (Opts.getVisibilityMode() == LangOptions::Hidden) {
480      Res.push_back("hidden");
481    } else {
482      assert(Opts.getVisibilityMode() == LangOptions::Protected &&
483             "Invalid visibility!");
484      Res.push_back("protected");
485    }
486  }
487  if (Opts.getStackProtectorMode() != 0) {
488    Res.push_back("-stack-protector");
489    Res.push_back(llvm::utostr(Opts.getStackProtectorMode()));
490  }
491  if (Opts.InstantiationDepth != DefaultLangOpts.InstantiationDepth) {
492    Res.push_back("-ftemplate-depth");
493    Res.push_back(llvm::utostr(Opts.InstantiationDepth));
494  }
495  if (!Opts.ObjCConstantStringClass.empty()) {
496    Res.push_back("-fconstant-string-class");
497    Res.push_back(Opts.ObjCConstantStringClass);
498  }
499}
500
501static void PreprocessorOptsToArgs(const PreprocessorOptions &Opts,
502                                   std::vector<std::string> &Res) {
503  for (unsigned i = 0, e = Opts.Macros.size(); i != e; ++i)
504    Res.push_back(std::string(Opts.Macros[i].second ? "-U" : "-D") +
505                  Opts.Macros[i].first);
506  for (unsigned i = 0, e = Opts.Includes.size(); i != e; ++i) {
507    // FIXME: We need to avoid reincluding the implicit PCH and PTH includes.
508    Res.push_back("-include");
509    Res.push_back(Opts.Includes[i]);
510  }
511  for (unsigned i = 0, e = Opts.MacroIncludes.size(); i != e; ++i) {
512    Res.push_back("-imacros");
513    Res.push_back(Opts.MacroIncludes[i]);
514  }
515  if (!Opts.UsePredefines)
516    Res.push_back("-undef");
517  if (!Opts.ImplicitPCHInclude.empty()) {
518    Res.push_back("-include-pch");
519    Res.push_back(Opts.ImplicitPCHInclude);
520  }
521  if (!Opts.ImplicitPTHInclude.empty()) {
522    Res.push_back("-include-pth");
523    Res.push_back(Opts.ImplicitPTHInclude);
524  }
525  if (!Opts.TokenCache.empty()) {
526    if (Opts.ImplicitPTHInclude.empty()) {
527      Res.push_back("-token-cache");
528      Res.push_back(Opts.TokenCache);
529    } else
530      assert(Opts.ImplicitPTHInclude == Opts.TokenCache &&
531             "Unsupported option combination!");
532  }
533}
534
535static void PreprocessorOutputOptsToArgs(const PreprocessorOutputOptions &Opts,
536                                         std::vector<std::string> &Res) {
537  if (!Opts.ShowCPP && !Opts.ShowMacros)
538    llvm::llvm_report_error("Invalid option combination!");
539
540  if (Opts.ShowCPP && Opts.ShowMacros)
541    Res.push_back("-dD");
542  else if (!Opts.ShowCPP && Opts.ShowMacros)
543    Res.push_back("-dM");
544
545  if (!Opts.ShowLineMarkers)
546    Res.push_back("-P");
547  if (Opts.ShowComments)
548    Res.push_back("-C");
549  if (Opts.ShowMacroComments)
550    Res.push_back("-CC");
551}
552
553static void TargetOptsToArgs(const TargetOptions &Opts,
554                             std::vector<std::string> &Res) {
555  Res.push_back("-triple");
556  Res.push_back(Opts.Triple);
557  if (!Opts.CPU.empty()) {
558    Res.push_back("-mcpu");
559    Res.push_back(Opts.CPU);
560  }
561  if (!Opts.ABI.empty()) {
562    Res.push_back("-target-abi");
563    Res.push_back(Opts.ABI);
564  }
565  for (unsigned i = 0, e = Opts.Features.size(); i != e; ++i) {
566    Res.push_back("-target-feature");
567    Res.push_back(Opts.Features[i]);
568  }
569}
570
571void CompilerInvocation::toArgs(std::vector<std::string> &Res) {
572  AnalyzerOptsToArgs(getAnalyzerOpts(), Res);
573  CodeGenOptsToArgs(getCodeGenOpts(), Res);
574  DependencyOutputOptsToArgs(getDependencyOutputOpts(), Res);
575  DiagnosticOptsToArgs(getDiagnosticOpts(), Res);
576  FrontendOptsToArgs(getFrontendOpts(), Res);
577  HeaderSearchOptsToArgs(getHeaderSearchOpts(), Res);
578  LangOptsToArgs(getLangOpts(), Res);
579  PreprocessorOptsToArgs(getPreprocessorOpts(), Res);
580  PreprocessorOutputOptsToArgs(getPreprocessorOutputOpts(), Res);
581  TargetOptsToArgs(getTargetOpts(), Res);
582}
583