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