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