CompilerInvocation.cpp revision 199512
116057Sdsamersoff//===--- CompilerInvocation.cpp -------------------------------------------===//
216970Srriggs//
316057Sdsamersoff//                     The LLVM Compiler Infrastructure
416057Sdsamersoff//
516057Sdsamersoff// This file is distributed under the University of Illinois Open Source
616057Sdsamersoff// License. See LICENSE.TXT for details.
716057Sdsamersoff//
816057Sdsamersoff//===----------------------------------------------------------------------===//
916057Sdsamersoff
1016057Sdsamersoff#include "clang/Frontend/CompilerInvocation.h"
1116057Sdsamersoff#include "llvm/ADT/StringExtras.h"
1216057Sdsamersoff#include "llvm/Support/ErrorHandling.h"
1316057Sdsamersoffusing namespace clang;
1416057Sdsamersoff
1516057Sdsamersoffvoid CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,
1616057Sdsamersoff                           const llvm::SmallVectorImpl<llvm::StringRef> &Args) {
1716057Sdsamersoff}
1816057Sdsamersoff
1916057Sdsamersoffstatic const char *getAnalysisName(Analyses Kind) {
2016057Sdsamersoff  switch (Kind) {
2116057Sdsamersoff  default:
2216057Sdsamersoff    llvm::llvm_unreachable("Unknown analysis store!");
2316057Sdsamersoff#define ANALYSIS(NAME, CMDFLAG, DESC, SCOPE)\
2416057Sdsamersoff  case NAME: return CMDFLAG;
2516057Sdsamersoff#include "clang/Frontend/Analyses.def"
2616057Sdsamersoff  }
2716057Sdsamersoff}
2816057Sdsamersoff
2916057Sdsamersoffstatic const char *getAnalysisStoreName(AnalysisStores Kind) {
3016057Sdsamersoff  switch (Kind) {
3116057Sdsamersoff  default:
3216057Sdsamersoff    llvm::llvm_unreachable("Unknown analysis store!");
3316057Sdsamersoff#define ANALYSIS_STORE(NAME, CMDFLAG, DESC, CREATFN) \
3416057Sdsamersoff  case NAME##Model: return CMDFLAG;
3516057Sdsamersoff#include "clang/Frontend/Analyses.def"
3616057Sdsamersoff  }
3716057Sdsamersoff}
3816057Sdsamersoff
3916057Sdsamersoffstatic const char *getAnalysisConstraintName(AnalysisConstraints Kind) {
4016057Sdsamersoff  switch (Kind) {
4116057Sdsamersoff  default:
4216057Sdsamersoff    llvm::llvm_unreachable("Unknown analysis constraints!");
4316057Sdsamersoff#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
4416057Sdsamersoff  case NAME##Model: return CMDFLAG;
4516057Sdsamersoff#include "clang/Frontend/Analyses.def"
4616057Sdsamersoff  }
4716057Sdsamersoff}
4816057Sdsamersoff
4916057Sdsamersoffstatic const char *getAnalysisDiagClientName(AnalysisDiagClients Kind) {
5016057Sdsamersoff  switch (Kind) {
5116057Sdsamersoff  default:
5216057Sdsamersoff    llvm::llvm_unreachable("Unknown analysis client!");
5316057Sdsamersoff#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN, AUTOCREATE) \
5416057Sdsamersoff  case PD_##NAME: return CMDFLAG;
5516057Sdsamersoff#include "clang/Frontend/Analyses.def"
5616057Sdsamersoff  }
5716057Sdsamersoff}
5816057Sdsamersoff
5916057Sdsamersoffstatic void AnalyzerOptsToArgs(const AnalyzerOptions &Opts,
6016057Sdsamersoff                               std::vector<std::string> &Res) {
6116057Sdsamersoff  for (unsigned i = 0, e = Opts.AnalysisList.size(); i != e; ++i)
6216057Sdsamersoff    Res.push_back(getAnalysisName(Opts.AnalysisList[i]));
6316057Sdsamersoff  if (Opts.AnalysisStoreOpt != BasicStoreModel) {
6416057Sdsamersoff    Res.push_back("-analyzer-store");
6516057Sdsamersoff    Res.push_back(getAnalysisStoreName(Opts.AnalysisStoreOpt));
6616057Sdsamersoff  }
6716057Sdsamersoff  if (Opts.AnalysisConstraintsOpt != RangeConstraintsModel) {
6816057Sdsamersoff    Res.push_back("-analyzer-constraints");
6916057Sdsamersoff    Res.push_back(getAnalysisConstraintName(Opts.AnalysisConstraintsOpt));
7016057Sdsamersoff  }
7116057Sdsamersoff  if (Opts.AnalysisDiagOpt != PD_HTML) {
7216057Sdsamersoff    Res.push_back("-analyzer-output");
7316057Sdsamersoff    Res.push_back(getAnalysisDiagClientName(Opts.AnalysisDiagOpt));
7416057Sdsamersoff  }
7516057Sdsamersoff  if (!Opts.AnalyzeSpecificFunction.empty()) {
7616057Sdsamersoff    Res.push_back("-analyze-function");
7716057Sdsamersoff    Res.push_back(Opts.AnalyzeSpecificFunction);
7816057Sdsamersoff  }
7916057Sdsamersoff  if (Opts.AnalyzeAll)
8016057Sdsamersoff    Res.push_back("-analyzer-opt-analyze-headers");
8116057Sdsamersoff  if (Opts.AnalyzerDisplayProgress)
8216057Sdsamersoff    Res.push_back("-analyzer-display-progress");
8316057Sdsamersoff  if (Opts.EagerlyAssume)
8416057Sdsamersoff    Res.push_back("-analyzer-eagerly-assume");
8516057Sdsamersoff  if (!Opts.PurgeDead)
8616057Sdsamersoff    Res.push_back("-analyzer-no-purge-dead");
8716057Sdsamersoff  if (Opts.TrimGraph)
8816057Sdsamersoff    Res.push_back("-trim-egraph");
8916057Sdsamersoff  if (Opts.VisualizeEGDot)
9016057Sdsamersoff    Res.push_back("-analyzer-viz-egraph-graphviz");
9116057Sdsamersoff  if (Opts.VisualizeEGDot)
9216057Sdsamersoff    Res.push_back("-analyzer-viz-egraph-ubigraph");
9316057Sdsamersoff  if (Opts.EnableExperimentalChecks)
9416057Sdsamersoff    Res.push_back("-analyzer-experimental-checks");
9516057Sdsamersoff  if (Opts.EnableExperimentalInternalChecks)
9616057Sdsamersoff    Res.push_back("-analyzer-experimental-internal-checls");
9716057Sdsamersoff}
9816057Sdsamersoff
9916057Sdsamersoffstatic void CodeGenOptsToArgs(const CodeGenOptions &Opts,
10016057Sdsamersoff                              std::vector<std::string> &Res) {
10116057Sdsamersoff  if (Opts.DebugInfo)
10216057Sdsamersoff    Res.push_back("-g");
10316057Sdsamersoff  if (Opts.DisableLLVMOpts)
10416057Sdsamersoff    Res.push_back("-disable-llvm-optzns");
10516057Sdsamersoff  if (Opts.DisableRedZone)
10616057Sdsamersoff    Res.push_back("-disable-red-zone");
10716057Sdsamersoff  if (!Opts.MergeAllConstants)
10816057Sdsamersoff    Res.push_back("-fno-merge-all-constants");
10916057Sdsamersoff  // NoCommon is only derived.
11016057Sdsamersoff  if (Opts.NoImplicitFloat)
11116057Sdsamersoff    Res.push_back("-no-implicit-float");
11216057Sdsamersoff  if (Opts.OptimizeSize) {
11316057Sdsamersoff    assert(Opts.OptimizationLevel == 2 && "Invalid options!");
11416057Sdsamersoff    Res.push_back("-Os");
11516057Sdsamersoff  } else if (Opts.OptimizationLevel == 0)
11616057Sdsamersoff    Res.push_back("-O" + Opts.OptimizationLevel);
11716057Sdsamersoff  // SimplifyLibCalls is only derived.
11816057Sdsamersoff  // TimePasses is only derived.
11916057Sdsamersoff  // UnitAtATime is unused.
12016057Sdsamersoff  // UnrollLoops is only derived.
12116057Sdsamersoff  // VerifyModule is only derived.
12216057Sdsamersoff  // Inlining is only derived.
12316057Sdsamersoff}
12416057Sdsamersoff
12516057Sdsamersoffstatic void DependencyOutputOptsToArgs(const DependencyOutputOptions &Opts,
12616057Sdsamersoff                                       std::vector<std::string> &Res) {
12716057Sdsamersoff  if (Opts.IncludeSystemHeaders)
12816057Sdsamersoff    Res.push_back("-sys-header-deps");
12916057Sdsamersoff  if (Opts.UsePhonyTargets)
13016057Sdsamersoff    Res.push_back("-MP");
13116057Sdsamersoff  if (!Opts.OutputFile.empty()) {
13216057Sdsamersoff    Res.push_back("-dependency-file");
13316057Sdsamersoff    Res.push_back(Opts.OutputFile);
13416057Sdsamersoff  }
13516057Sdsamersoff  for (unsigned i = 0, e = Opts.Targets.size(); i != e; ++i) {
13616057Sdsamersoff    Res.push_back("-MT");
13716057Sdsamersoff    Res.push_back(Opts.Targets[i]);
13816057Sdsamersoff  }
13916057Sdsamersoff}
14016057Sdsamersoff
14116057Sdsamersoffstatic void DiagnosticOptsToArgs(const DiagnosticOptions &Opts,
14216057Sdsamersoff                                 std::vector<std::string> &Res) {
14316057Sdsamersoff  if (Opts.IgnoreWarnings)
14416970Srriggs    Res.push_back("-w");
14516057Sdsamersoff  if (Opts.NoRewriteMacros)
14616057Sdsamersoff    Res.push_back("-Wno-rewrite-macros");
14716057Sdsamersoff  if (Opts.Pedantic)
14816057Sdsamersoff    Res.push_back("-pedantic");
14916057Sdsamersoff  if (Opts.PedanticErrors)
15016057Sdsamersoff    Res.push_back("-pedantic-errors");
15116057Sdsamersoff  if (!Opts.ShowColumn)
15216057Sdsamersoff    Res.push_back("-fno-show-column");
15316057Sdsamersoff  if (!Opts.ShowLocation)
15416057Sdsamersoff    Res.push_back("-fno-show-source-location");
15516057Sdsamersoff  if (!Opts.ShowCarets)
15616057Sdsamersoff    Res.push_back("-fno-caret-diagnostics");
15716057Sdsamersoff  if (!Opts.ShowFixits)
15816057Sdsamersoff    Res.push_back("-fno-diagnostics-fixit-info");
15916057Sdsamersoff  if (Opts.ShowSourceRanges)
16016057Sdsamersoff    Res.push_back("-fdiagnostics-print-source-range-info");
16116057Sdsamersoff  if (Opts.ShowColors)
16216057Sdsamersoff    Res.push_back("-fcolor-diagnostics");
16316057Sdsamersoff  if (Opts.VerifyDiagnostics)
16416057Sdsamersoff    Res.push_back("-verify");
16516057Sdsamersoff  if (Opts.ShowOptionNames)
16616057Sdsamersoff    Res.push_back("-fdiagnostics-show-option");
16716057Sdsamersoff  if (Opts.MessageLength) {
16816057Sdsamersoff    Res.push_back("-fmessage-length");
16916057Sdsamersoff    Res.push_back(llvm::utostr(Opts.MessageLength));
17016057Sdsamersoff  }
17116057Sdsamersoff  if (!Opts.DumpBuildInformation.empty()) {
17216057Sdsamersoff    Res.push_back("-dump-build-information");
17316057Sdsamersoff    Res.push_back(Opts.DumpBuildInformation);
17416057Sdsamersoff  }
17516057Sdsamersoff  for (unsigned i = 0, e = Opts.Warnings.size(); i != e; ++i)
17616057Sdsamersoff    Res.push_back("-W" + Opts.Warnings[i]);
17716057Sdsamersoff}
17816057Sdsamersoff
17916057Sdsamersoffstatic const char *getInputKindName(FrontendOptions::InputKind Kind) {
18016057Sdsamersoff  switch (Kind) {
18116057Sdsamersoff  case FrontendOptions::IK_None: break;
18216057Sdsamersoff  case FrontendOptions::IK_AST: return "ast";
18316057Sdsamersoff  case FrontendOptions::IK_Asm: return "assembler-with-cpp";
18416057Sdsamersoff  case FrontendOptions::IK_C: return "c";
18516057Sdsamersoff  case FrontendOptions::IK_CXX: return "c++";
18616057Sdsamersoff  case FrontendOptions::IK_ObjC: return "objective-c";
18716057Sdsamersoff  case FrontendOptions::IK_ObjCXX: return "objective-c++";
18816057Sdsamersoff  case FrontendOptions::IK_OpenCL: return "cl";
18916057Sdsamersoff  case FrontendOptions::IK_PreprocessedC: return "cpp-output";
19016057Sdsamersoff  case FrontendOptions::IK_PreprocessedCXX: return "c++-cpp-output";
19116057Sdsamersoff  case FrontendOptions::IK_PreprocessedObjC: return "objective-c-cpp-output";
19216057Sdsamersoff  case FrontendOptions::IK_PreprocessedObjCXX: return "objective-c++-cpp-output";
19316057Sdsamersoff  }
19416057Sdsamersoff
19516057Sdsamersoff  llvm::llvm_unreachable("Unexpected language kind!");
19616057Sdsamersoff  return 0;
19716057Sdsamersoff}
19816057Sdsamersoff
19916057Sdsamersoffstatic const char *getActionName(frontend::ActionKind Kind) {
20016057Sdsamersoff  switch (Kind) {
20116057Sdsamersoff  case frontend::PluginAction:
20216057Sdsamersoff  case frontend::InheritanceView:
20316057Sdsamersoff    llvm::llvm_unreachable("Invalid kind!");
20416057Sdsamersoff
20516057Sdsamersoff  case frontend::ASTDump:                return "-ast-dump";
20616057Sdsamersoff  case frontend::ASTPrint:               return "-ast-print";
20716057Sdsamersoff  case frontend::ASTPrintXML:            return "-ast-print-xml";
20816057Sdsamersoff  case frontend::ASTView:                return "-ast-view";
20916057Sdsamersoff  case frontend::DumpRawTokens:          return "-dump-raw-tokens";
21016057Sdsamersoff  case frontend::DumpRecordLayouts:      return "-dump-record-layouts";
21116057Sdsamersoff  case frontend::DumpTokens:             return "-dump-tokens";
21216057Sdsamersoff  case frontend::EmitAssembly:           return "-S";
21316057Sdsamersoff  case frontend::EmitBC:                 return "-emit-llvm-bc";
21416057Sdsamersoff  case frontend::EmitHTML:               return "-emit-html";
21516057Sdsamersoff  case frontend::EmitLLVM:               return "-emit-llvm";
21616057Sdsamersoff  case frontend::EmitLLVMOnly:           return "-emit-llvm-only";
21716057Sdsamersoff  case frontend::FixIt:                  return "-fixit";
21816057Sdsamersoff  case frontend::GeneratePCH:            return "-emit-pch";
21916057Sdsamersoff  case frontend::GeneratePTH:            return "-emit-pth";
22016057Sdsamersoff  case frontend::ParseNoop:              return "-parse-noop";
22116057Sdsamersoff  case frontend::ParsePrintCallbacks:    return "-parse-print-callbacks";
22216057Sdsamersoff  case frontend::ParseSyntaxOnly:        return "-fsyntax-only";
22316057Sdsamersoff  case frontend::PrintDeclContext:       return "-print-decl-contexts";
22416057Sdsamersoff  case frontend::PrintPreprocessedInput: return "-E";
22516057Sdsamersoff  case frontend::RewriteBlocks:          return "-rewrite-blocks";
22616057Sdsamersoff  case frontend::RewriteMacros:          return "-rewrite-macros";
22716057Sdsamersoff  case frontend::RewriteObjC:            return "-rewrite-objc";
22816057Sdsamersoff  case frontend::RewriteTest:            return "-rewrite-test";
22916057Sdsamersoff  case frontend::RunAnalysis:            return "-analyze";
23016057Sdsamersoff  case frontend::RunPreprocessorOnly:    return "-Eonly";
23116057Sdsamersoff  }
23216057Sdsamersoff
23316057Sdsamersoff  llvm::llvm_unreachable("Unexpected language kind!");
23416057Sdsamersoff  return 0;
23516057Sdsamersoff}
23616057Sdsamersoff
23716057Sdsamersoffstatic void FrontendOptsToArgs(const FrontendOptions &Opts,
23816057Sdsamersoff                               std::vector<std::string> &Res) {
23916057Sdsamersoff  if (!Opts.DebugCodeCompletionPrinter)
24016057Sdsamersoff    Res.push_back("-no-code-completion-debug-printer");
24116057Sdsamersoff  if (Opts.DisableFree)
24216057Sdsamersoff    Res.push_back("-disable-free");
24316057Sdsamersoff  if (Opts.EmptyInputOnly)
24416057Sdsamersoff    Res.push_back("-empty-input-only");
24516057Sdsamersoff  if (Opts.RelocatablePCH)
24616057Sdsamersoff    Res.push_back("-relocatable-pch");
24716057Sdsamersoff  if (Opts.ShowMacrosInCodeCompletion)
24816057Sdsamersoff    Res.push_back("-code-completion-macros");
24916057Sdsamersoff  if (Opts.ShowStats)
25016057Sdsamersoff    Res.push_back("-stats");
25116057Sdsamersoff  if (Opts.ShowTimers)
25216057Sdsamersoff    Res.push_back("-ftime-report");
25316057Sdsamersoff
25416057Sdsamersoff  bool NeedLang = false;
25516057Sdsamersoff  for (unsigned i = 0, e = Opts.Inputs.size(); i != e; ++i)
25616057Sdsamersoff    if (FrontendOptions::getInputKindForExtension(Opts.Inputs[i].second) !=
25716057Sdsamersoff        Opts.Inputs[i].first)
25816057Sdsamersoff      NeedLang = true;
25916057Sdsamersoff  if (NeedLang) {
26016057Sdsamersoff    Res.push_back("-x");
26116057Sdsamersoff    Res.push_back(getInputKindName(Opts.Inputs[0].first));
26216057Sdsamersoff  }
26316057Sdsamersoff  for (unsigned i = 0, e = Opts.Inputs.size(); i != e; ++i) {
26416057Sdsamersoff    assert((!NeedLang || Opts.Inputs[i].first == Opts.Inputs[0].first) &&
26516057Sdsamersoff           "Unable to represent this input vector!");
26616057Sdsamersoff    Res.push_back(Opts.Inputs[i].second);
26716057Sdsamersoff  }
26816057Sdsamersoff
26916057Sdsamersoff  if (!Opts.OutputFile.empty()) {
27016057Sdsamersoff    Res.push_back("-o");
27116057Sdsamersoff    Res.push_back(Opts.OutputFile);
27216057Sdsamersoff  }
27316057Sdsamersoff  if (!Opts.ViewClassInheritance.empty()) {
27416057Sdsamersoff    Res.push_back("-cxx-inheritance-view");
27516057Sdsamersoff    Res.push_back(Opts.ViewClassInheritance);
27616057Sdsamersoff  }
27716057Sdsamersoff  for (unsigned i = 0, e = Opts.FixItLocations.size(); i != e; ++i) {
27816057Sdsamersoff    Res.push_back("-fixit-at");
27916057Sdsamersoff    Res.push_back(Opts.FixItLocations[i].FileName + ":" +
28016057Sdsamersoff                  llvm::utostr(Opts.FixItLocations[i].Line) + ":" +
28116057Sdsamersoff                  llvm::utostr(Opts.FixItLocations[i].Column));
28216057Sdsamersoff  }
28316057Sdsamersoff  if (!Opts.CodeCompletionAt.FileName.empty()) {
28416057Sdsamersoff    Res.push_back("-code-completion-at");
28516057Sdsamersoff    Res.push_back(Opts.CodeCompletionAt.FileName + ":" +
28616057Sdsamersoff                  llvm::utostr(Opts.CodeCompletionAt.Line) + ":" +
28716057Sdsamersoff                  llvm::utostr(Opts.CodeCompletionAt.Column));
28816057Sdsamersoff  }
28916057Sdsamersoff  if (Opts.ProgramAction != frontend::InheritanceView &&
29016057Sdsamersoff      Opts.ProgramAction != frontend::PluginAction)
29116057Sdsamersoff    Res.push_back(getActionName(Opts.ProgramAction));
29216057Sdsamersoff  if (!Opts.ActionName.empty()) {
29316057Sdsamersoff    Res.push_back("-plugin");
29416057Sdsamersoff    Res.push_back(Opts.ActionName);
29516057Sdsamersoff  }
29616057Sdsamersoff}
29716057Sdsamersoff
29816057Sdsamersoffstatic void HeaderSearchOptsToArgs(const HeaderSearchOptions &Opts,
29916057Sdsamersoff                                   std::vector<std::string> &Res) {
30016057Sdsamersoff  if (Opts.Sysroot != "/") {
30116057Sdsamersoff    Res.push_back("-isysroot");
30216057Sdsamersoff    Res.push_back(Opts.Sysroot);
30316057Sdsamersoff  }
30416057Sdsamersoff
30516057Sdsamersoff  /// User specified include entries.
30616057Sdsamersoff  for (unsigned i = 0, e = Opts.UserEntries.size(); i != e; ++i) {
30716057Sdsamersoff    const HeaderSearchOptions::Entry &E = Opts.UserEntries[i];
30816057Sdsamersoff    if (E.IsFramework && (E.Group != frontend::Angled || E.IsUserSupplied))
30916057Sdsamersoff      llvm::llvm_report_error("Invalid option set!");
31016057Sdsamersoff    if (E.IsUserSupplied) {
31116057Sdsamersoff      if (E.Group == frontend::After) {
31216057Sdsamersoff        Res.push_back("-idirafter");
31316057Sdsamersoff      } else if (E.Group == frontend::Quoted) {
31416057Sdsamersoff        Res.push_back("-iquoted");
31516057Sdsamersoff      } else if (E.Group == frontend::System) {
31616057Sdsamersoff        Res.push_back("-isystem");
31716057Sdsamersoff      } else {
31816057Sdsamersoff        assert(E.Group == frontend::Angled && "Invalid group!");
31916057Sdsamersoff        Res.push_back(E.IsFramework ? "-F" : "-I");
32016057Sdsamersoff      }
32116057Sdsamersoff    } else {
32216057Sdsamersoff      if (E.Group != frontend::Angled && E.Group != frontend::System)
32316057Sdsamersoff        llvm::llvm_report_error("Invalid option set!");
32416057Sdsamersoff      Res.push_back(E.Group == frontend::Angled ? "-iwithprefixbefore" :
32516057Sdsamersoff                    "-iwithprefix");
32616057Sdsamersoff    }
32716057Sdsamersoff    Res.push_back(E.Path);
32816057Sdsamersoff  }
32916057Sdsamersoff
33016057Sdsamersoff  if (!Opts.EnvIncPath.empty()) {
33116057Sdsamersoff    // FIXME: Provide an option for this, and move env detection to driver.
33216057Sdsamersoff    llvm::llvm_report_error("Not yet implemented!");
33316057Sdsamersoff  }
33416057Sdsamersoff  if (!Opts.CEnvIncPath.empty()) {
33516057Sdsamersoff    // FIXME: Provide an option for this, and move env detection to driver.
33616057Sdsamersoff    llvm::llvm_report_error("Not yet implemented!");
33716057Sdsamersoff  }
33816057Sdsamersoff  if (!Opts.ObjCEnvIncPath.empty()) {
33916057Sdsamersoff    // FIXME: Provide an option for this, and move env detection to driver.
34016057Sdsamersoff    llvm::llvm_report_error("Not yet implemented!");
34116057Sdsamersoff  }
34216057Sdsamersoff  if (!Opts.CXXEnvIncPath.empty()) {
34316057Sdsamersoff    // FIXME: Provide an option for this, and move env detection to driver.
34416057Sdsamersoff    llvm::llvm_report_error("Not yet implemented!");
34516057Sdsamersoff  }
34616057Sdsamersoff  if (!Opts.ObjCXXEnvIncPath.empty()) {
34716057Sdsamersoff    // FIXME: Provide an option for this, and move env detection to driver.
34816057Sdsamersoff    llvm::llvm_report_error("Not yet implemented!");
34916057Sdsamersoff  }
35016057Sdsamersoff  if (!Opts.BuiltinIncludePath.empty()) {
35116057Sdsamersoff    // FIXME: Provide an option for this, and move to driver.
35216057Sdsamersoff  }
35316057Sdsamersoff  if (!Opts.UseStandardIncludes)
35416057Sdsamersoff    Res.push_back("-nostdinc");
35516057Sdsamersoff  if (Opts.Verbose)
35616057Sdsamersoff    Res.push_back("-v");
35716057Sdsamersoff}
35816057Sdsamersoff
35916057Sdsamersoffstatic void LangOptsToArgs(const LangOptions &Opts,
36016057Sdsamersoff                           std::vector<std::string> &Res) {
36116057Sdsamersoff  LangOptions DefaultLangOpts;
36216057Sdsamersoff
36316057Sdsamersoff  // FIXME: Need to set -std to get all the implicit options.
36416057Sdsamersoff
36516057Sdsamersoff  // FIXME: We want to only pass options relative to the defaults, which
36616057Sdsamersoff  // requires constructing a target. :(
36716057Sdsamersoff  //
36816057Sdsamersoff  // It would be better to push the all target specific choices into the driver,
36916057Sdsamersoff  // so that everything below that was more uniform.
37016057Sdsamersoff
37116057Sdsamersoff  if (Opts.Trigraphs)
37216057Sdsamersoff    Res.push_back("-trigraphs");
37316057Sdsamersoff  // Implicit based on the input kind:
37416057Sdsamersoff  //   AsmPreprocessor, CPlusPlus, ObjC1, ObjC2, OpenCL
37516057Sdsamersoff  // Implicit based on the input language standard:
37616057Sdsamersoff  //   BCPLComment, C99, CPlusPlus0x, Digraphs, GNUInline, ImplicitInt, GNUMode
37716057Sdsamersoff  if (Opts.DollarIdents)
37816057Sdsamersoff    Res.push_back("-fdollars-in-identifiers");
37916057Sdsamersoff  if (Opts.Microsoft)
38016057Sdsamersoff    Res.push_back("-fms-extensions=1");
38116057Sdsamersoff  if (Opts.ObjCNonFragileABI)
38216057Sdsamersoff    Res.push_back("-fobjc-nonfragile-abi");
38316057Sdsamersoff  // NoInline is implicit.
38416057Sdsamersoff  if (!Opts.CXXOperatorNames)
38516057Sdsamersoff    Res.push_back("-fno-operator-names");
38616057Sdsamersoff  if (Opts.PascalStrings)
38716057Sdsamersoff    Res.push_back("-fpascal-strings");
38816057Sdsamersoff  if (Opts.WritableStrings)
38916057Sdsamersoff    Res.push_back("-fwritable-strings");
39016057Sdsamersoff  if (!Opts.LaxVectorConversions)
39116057Sdsamersoff    Res.push_back("-fno-lax-vector-conversions");
39216057Sdsamersoff  if (Opts.AltiVec)
39316057Sdsamersoff    Res.push_back("-faltivec");
39416057Sdsamersoff  Res.push_back("-fexceptions");
39516057Sdsamersoff  Res.push_back(Opts.Exceptions ? "1" : "0");
39616057Sdsamersoff  if (!Opts.Rtti)
39716057Sdsamersoff    Res.push_back("-fno-rtti");
39816057Sdsamersoff  if (!Opts.NeXTRuntime)
39916057Sdsamersoff    Res.push_back("-fgnu-runtime");
40016057Sdsamersoff  if (Opts.Freestanding)
40116057Sdsamersoff    Res.push_back("-ffreestanding");
40216057Sdsamersoff  if (Opts.NoBuiltin)
40316057Sdsamersoff    Res.push_back("-fno-builtin");
40416057Sdsamersoff  if (Opts.ThreadsafeStatics)
40516057Sdsamersoff    llvm::llvm_report_error("FIXME: Not yet implemented!");
40616057Sdsamersoff  if (Opts.POSIXThreads)
40716057Sdsamersoff    Res.push_back("-pthread");
40816057Sdsamersoff  if (Opts.Blocks)
40916057Sdsamersoff    Res.push_back("-fblocks=1");
41016057Sdsamersoff  if (Opts.EmitAllDecls)
41116057Sdsamersoff    Res.push_back("-femit-all-decls");
41216057Sdsamersoff  if (!Opts.MathErrno)
41316057Sdsamersoff    Res.push_back("-fno-math-errno");
41416057Sdsamersoff  if (Opts.OverflowChecking)
41516057Sdsamersoff    Res.push_back("-ftrapv");
41616057Sdsamersoff  if (Opts.HeinousExtensions)
41716057Sdsamersoff    Res.push_back("-fheinous-gnu-extensions");
41816057Sdsamersoff  // Optimize is implicit.
41916057Sdsamersoff  // OptimizeSize is implicit.
42016057Sdsamersoff  if (Opts.Static)
42116057Sdsamersoff    Res.push_back("-static-define");
42216057Sdsamersoff  if (Opts.PICLevel) {
42316057Sdsamersoff    Res.push_back("-pic-level");
42416057Sdsamersoff    Res.push_back(llvm::utostr(Opts.PICLevel));
42516057Sdsamersoff  }
42616057Sdsamersoff  if (Opts.ObjCGCBitmapPrint)
42716057Sdsamersoff    Res.push_back("-print-ivar-layout");
42816057Sdsamersoff  Res.push_back("-faccess-control");
42916057Sdsamersoff  Res.push_back(Opts.AccessControl ? "1" : "0");
43016057Sdsamersoff  Res.push_back("-fsigned-char");
43116057Sdsamersoff  Res.push_back(Opts.CharIsSigned ? "1" : "0");
43216057Sdsamersoff  Res.push_back("-fshort-wchar");
43316057Sdsamersoff  Res.push_back(Opts.ShortWChar ? "1" : "0");
43416057Sdsamersoff  if (!Opts.ElideConstructors)
43516057Sdsamersoff    Res.push_back("-fno-elide-constructors");
43616057Sdsamersoff  if (Opts.getGCMode() != LangOptions::NonGC) {
43716057Sdsamersoff    if (Opts.getGCMode() == LangOptions::HybridGC) {
43816057Sdsamersoff      Res.push_back("-fobjc-gc");
43916057Sdsamersoff    } else {
44016057Sdsamersoff      assert(Opts.getGCMode() == LangOptions::GCOnly && "Invalid GC mode!");
44116057Sdsamersoff      Res.push_back("-fobjc-gc-only");
44216057Sdsamersoff    }
44316057Sdsamersoff  }
44416057Sdsamersoff  if (Opts.getVisibilityMode() != LangOptions::Default) {
44516057Sdsamersoff    Res.push_back("-fvisibility");
44616057Sdsamersoff    if (Opts.getVisibilityMode() == LangOptions::Hidden) {
44716057Sdsamersoff      Res.push_back("default");
44816057Sdsamersoff    } else {
44916057Sdsamersoff      assert(Opts.getVisibilityMode() == LangOptions::Protected &&
45016057Sdsamersoff             "Invalid visibility!");
45116057Sdsamersoff      Res.push_back("protected");
45216057Sdsamersoff    }
45316057Sdsamersoff  }
45416057Sdsamersoff  if (Opts.getStackProtectorMode() != 0) {
45516057Sdsamersoff    Res.push_back("-stack-protector");
45616057Sdsamersoff    Res.push_back(llvm::utostr(Opts.getStackProtectorMode()));
45716057Sdsamersoff  }
45816057Sdsamersoff  if (Opts.getMainFileName()) {
45916057Sdsamersoff    Res.push_back("-main-file-name");
46016057Sdsamersoff    Res.push_back(Opts.getMainFileName());
46116057Sdsamersoff  }
46216057Sdsamersoff  if (Opts.InstantiationDepth != DefaultLangOpts.InstantiationDepth) {
46316057Sdsamersoff    Res.push_back("-ftemplate-depth");
46416057Sdsamersoff    Res.push_back(llvm::utostr(Opts.InstantiationDepth));
46516057Sdsamersoff  }
46616057Sdsamersoff  if (Opts.ObjCConstantStringClass) {
46716057Sdsamersoff    Res.push_back("-fconstant-string-class");
46816057Sdsamersoff    Res.push_back(Opts.ObjCConstantStringClass);
46916057Sdsamersoff  }
47016057Sdsamersoff}
47116057Sdsamersoff
47216057Sdsamersoffstatic void PreprocessorOptsToArgs(const PreprocessorOptions &Opts,
47316057Sdsamersoff                                   std::vector<std::string> &Res) {
47416057Sdsamersoff  for (unsigned i = 0, e = Opts.Macros.size(); i != e; ++i)
47516057Sdsamersoff    Res.push_back((Opts.Macros[i].second ? "-U" : "-D") + Opts.Macros[i].first);
47616057Sdsamersoff  for (unsigned i = 0, e = Opts.Includes.size(); i != e; ++i) {
47716057Sdsamersoff    Res.push_back("-include");
47816057Sdsamersoff    Res.push_back(Opts.Includes[i]);
47916057Sdsamersoff  }
48016057Sdsamersoff  for (unsigned i = 0, e = Opts.MacroIncludes.size(); i != e; ++i) {
48116057Sdsamersoff    Res.push_back("-imacros");
48216057Sdsamersoff    Res.push_back(Opts.Includes[i]);
48316057Sdsamersoff  }
48416057Sdsamersoff  if (!Opts.UsePredefines)
48516057Sdsamersoff    Res.push_back("-undef");
48616057Sdsamersoff  if (!Opts.ImplicitPCHInclude.empty()) {
48716057Sdsamersoff    Res.push_back("-implicit-pch-include");
48816057Sdsamersoff    Res.push_back(Opts.ImplicitPCHInclude);
48916057Sdsamersoff  }
490  if (!Opts.ImplicitPTHInclude.empty()) {
491    Res.push_back("-implicit-pth-include");
492    Res.push_back(Opts.ImplicitPTHInclude);
493  }
494  if (!Opts.TokenCache.empty()) {
495    Res.push_back("-token-cache");
496    Res.push_back(Opts.TokenCache);
497  }
498}
499
500static void PreprocessorOutputOptsToArgs(const PreprocessorOutputOptions &Opts,
501                                         std::vector<std::string> &Res) {
502  if (!Opts.ShowCPP && !Opts.ShowMacros)
503    llvm::llvm_report_error("Invalid option combination!");
504
505  if (Opts.ShowCPP && Opts.ShowMacros)
506    Res.push_back("-dD");
507  else if (!Opts.ShowCPP && Opts.ShowMacros)
508    Res.push_back("-dM");
509
510  if (!Opts.ShowLineMarkers)
511    Res.push_back("-P");
512  if (Opts.ShowComments)
513    Res.push_back("-C");
514  if (Opts.ShowMacroComments)
515    Res.push_back("-CC");
516}
517
518static void TargetOptsToArgs(const TargetOptions &Opts,
519                             std::vector<std::string> &Res) {
520  Res.push_back("-triple");
521  Res.push_back(Opts.Triple);
522  if (!Opts.CPU.empty()) {
523    Res.push_back("-target-cpu");
524    Res.push_back(Opts.CPU);
525  }
526  if (!Opts.ABI.empty()) {
527    Res.push_back("-target-abi");
528    Res.push_back(Opts.ABI);
529  }
530  for (unsigned i = 0, e = Opts.Features.size(); i != e; ++i) {
531    Res.push_back("-target-feature");
532    Res.push_back(Opts.Features[i]);
533  }
534}
535
536void CompilerInvocation::toArgs(std::vector<std::string> &Res) {
537  AnalyzerOptsToArgs(getAnalyzerOpts(), Res);
538  CodeGenOptsToArgs(getCodeGenOpts(), Res);
539  DependencyOutputOptsToArgs(getDependencyOutputOpts(), Res);
540  DiagnosticOptsToArgs(getDiagnosticOpts(), Res);
541  FrontendOptsToArgs(getFrontendOpts(), Res);
542  HeaderSearchOptsToArgs(getHeaderSearchOpts(), Res);
543  LangOptsToArgs(getLangOpts(), Res);
544  PreprocessorOptsToArgs(getPreprocessorOpts(), Res);
545  PreprocessorOutputOptsToArgs(getPreprocessorOutputOpts(), Res);
546  TargetOptsToArgs(getTargetOpts(), Res);
547}
548