[cfe-commits] r153441 - /cfe/trunk/lib/Frontend/CompilerInvocation.cpp
Benjamin Kramer
benny.kra at googlemail.com
Mon Mar 26 09:03:44 PDT 2012
On 26.03.2012, at 17:47, David Blaikie wrote:
> On Mon, Mar 26, 2012 at 8:39 AM, Benjamin Kramer
> <benny.kra at googlemail.com> wrote:
>> Author: d0k
>> Date: Mon Mar 26 10:39:31 2012
>> New Revision: 153441
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=153441&view=rev
>> Log:
>> Driver: Factor string vector push_back into a helper class and optimize it.
>>
>> Due to lack of move semantics we would create a temporary std::string from the
>> string literal, copy it into the vector and discard the temporary. This leads
>> to massive code bloat, optimizing it saves 50k on i386-linux-Release+Asserts.
>>
>> While there add a two-element overload for push_back, simplifying code a bit.
>>
>> Modified:
>> cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>>
>> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=153441&r1=153440&r2=153441&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
>> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Mon Mar 26 10:39:31 2012
>> @@ -110,38 +110,48 @@
>> // Serialization (to args)
>> //===----------------------------------------------------------------------===//
>>
>> -static void AnalyzerOptsToArgs(const AnalyzerOptions &Opts,
>> - std::vector<std::string> &Res) {
>> +namespace {
>> + /// ToArgsList - Helper class to create a list of std::strings.
>> + class ToArgsList {
>> + std::vector<std::string> &Res;
>> + public:
>> + explicit ToArgsList(std::vector<std::string> &Res) : Res(Res) {}
>> +
>> + void push_back(StringRef Str) {
>> + // Avoid creating a temporary string.
>> + Res.push_back(std::string());
>
> Did you consider whether this is better than Res.resize(Res.size() +
> 1); ? (perhaps it is, since std::string's default ctor & empty copy
> should be really cheap, but just a thought)
I tried, and it resulted in significantly bigger code (clang++ & libc++) due to Res.size() being inlined.
libc++'s default std::string constructor is inlined and just zeroes out a few words, so it's very cheap.
I didn't try libstdc++ but afaik the empty string is a global singleton there, so it should be cheap too.
- Ben
>
>> + Res.back().assign(Str.data(), Str.size());
>> + }
>> +
>> + void push_back(StringRef Str1, StringRef Str2) {
>> + push_back(Str1);
>> + push_back(Str2);
>> + }
>> + };
>> +}
>> +
>> +static void AnalyzerOptsToArgs(const AnalyzerOptions &Opts, ToArgsList &Res) {
>> if (Opts.ShowCheckerHelp)
>> Res.push_back("-analyzer-checker-help");
>> - if (Opts.AnalysisStoreOpt != RegionStoreModel) {
>> - Res.push_back("-analyzer-store");
>> - Res.push_back(getAnalysisStoreName(Opts.AnalysisStoreOpt));
>> - }
>> - if (Opts.AnalysisConstraintsOpt != RangeConstraintsModel) {
>> - Res.push_back("-analyzer-constraints");
>> - Res.push_back(getAnalysisConstraintName(Opts.AnalysisConstraintsOpt));
>> - }
>> - if (Opts.AnalysisDiagOpt != PD_HTML) {
>> - Res.push_back("-analyzer-output");
>> - Res.push_back(getAnalysisDiagClientName(Opts.AnalysisDiagOpt));
>> - }
>> - if (Opts.AnalysisPurgeOpt != PurgeStmt) {
>> - Res.push_back("-analyzer-purge");
>> - Res.push_back(getAnalysisPurgeModeName(Opts.AnalysisPurgeOpt));
>> - }
>> - if (!Opts.AnalyzeSpecificFunction.empty()) {
>> - Res.push_back("-analyze-function");
>> - Res.push_back(Opts.AnalyzeSpecificFunction);
>> - }
>> - if (Opts.IPAMode != Inlining) {
>> - Res.push_back("-analyzer-ipa");
>> - Res.push_back(getAnalysisIPAModeName(Opts.IPAMode));
>> - }
>> - if (Opts.InliningMode != NoRedundancy) {
>> - Res.push_back("-analyzer-inlining-mode");
>> - Res.push_back(getAnalysisInliningModeName(Opts.InliningMode));
>> - }
>> + if (Opts.AnalysisStoreOpt != RegionStoreModel)
>> + Res.push_back("-analyzer-store",
>> + getAnalysisStoreName(Opts.AnalysisStoreOpt));
>> + if (Opts.AnalysisConstraintsOpt != RangeConstraintsModel)
>> + Res.push_back("-analyzer-constraints",
>> + getAnalysisConstraintName(Opts.AnalysisConstraintsOpt));
>> + if (Opts.AnalysisDiagOpt != PD_HTML)
>> + Res.push_back("-analyzer-output",
>> + getAnalysisDiagClientName(Opts.AnalysisDiagOpt));
>> + if (Opts.AnalysisPurgeOpt != PurgeStmt)
>> + Res.push_back("-analyzer-purge",
>> + getAnalysisPurgeModeName(Opts.AnalysisPurgeOpt));
>> + if (!Opts.AnalyzeSpecificFunction.empty())
>> + Res.push_back("-analyze-function", Opts.AnalyzeSpecificFunction);
>> + if (Opts.IPAMode != Inlining)
>> + Res.push_back("-analyzer-ipa", getAnalysisIPAModeName(Opts.IPAMode));
>> + if (Opts.InliningMode != NoRedundancy)
>> + Res.push_back("-analyzer-inlining-mode",
>> + getAnalysisInliningModeName(Opts.InliningMode));
>>
>> if (Opts.AnalyzeAll)
>> Res.push_back("-analyzer-opt-analyze-headers");
>> @@ -168,8 +178,7 @@
>> }
>> }
>>
>> -static void CodeGenOptsToArgs(const CodeGenOptions &Opts,
>> - std::vector<std::string> &Res) {
>> +static void CodeGenOptsToArgs(const CodeGenOptions &Opts, ToArgsList &Res) {
>> if (Opts.DebugInfo)
>> Res.push_back("-g");
>> if (Opts.DisableLLVMOpts)
>> @@ -178,14 +187,10 @@
>> Res.push_back("-disable-red-zone");
>> if (Opts.DisableTailCalls)
>> Res.push_back("-mdisable-tail-calls");
>> - if (!Opts.DebugCompilationDir.empty()) {
>> - Res.push_back("-fdebug-compilation-dir");
>> - Res.push_back(Opts.DebugCompilationDir);
>> - }
>> - if (!Opts.DwarfDebugFlags.empty()) {
>> - Res.push_back("-dwarf-debug-flags");
>> - Res.push_back(Opts.DwarfDebugFlags);
>> - }
>> + if (!Opts.DebugCompilationDir.empty())
>> + Res.push_back("-fdebug-compilation-dir", Opts.DebugCompilationDir);
>> + if (!Opts.DwarfDebugFlags.empty())
>> + Res.push_back("-dwarf-debug-flags", Opts.DwarfDebugFlags);
>> if (Opts.ObjCRuntimeHasARC)
>> Res.push_back("-fobjc-runtime-has-arc");
>> if (Opts.ObjCRuntimeHasTerminate)
>> @@ -211,10 +216,8 @@
>> Opts.OptimizeSize == 1 ? Res.push_back("-Os") : Res.push_back("-Oz");
>> } else if (Opts.OptimizationLevel != 0)
>> Res.push_back("-O" + llvm::utostr(Opts.OptimizationLevel));
>> - if (!Opts.MainFileName.empty()) {
>> - Res.push_back("-main-file-name");
>> - Res.push_back(Opts.MainFileName);
>> - }
>> + if (!Opts.MainFileName.empty())
>> + Res.push_back("-main-file-name", Opts.MainFileName);
>> if (Opts.NoInfsFPMath)
>> Res.push_back("-menable-no-infinities");
>> if (Opts.NoNaNsFPMath)
>> @@ -234,10 +237,8 @@
>> Res.push_back("-ffunction-sections");
>> if (Opts.AsmVerbose)
>> Res.push_back("-masm-verbose");
>> - if (!Opts.CodeModel.empty()) {
>> - Res.push_back("-mcode-model");
>> - Res.push_back(Opts.CodeModel);
>> - }
>> + if (!Opts.CodeModel.empty())
>> + Res.push_back("-mcode-model", Opts.CodeModel);
>> if (Opts.CUDAIsDevice)
>> Res.push_back("-fcuda-is-device");
>> if (!Opts.CXAAtExit)
>> @@ -247,19 +248,14 @@
>> if (Opts.ObjCAutoRefCountExceptions)
>> Res.push_back("-fobjc-arc-eh");
>> if (!Opts.DebugPass.empty()) {
>> - Res.push_back("-mdebug-pass");
>> - Res.push_back(Opts.DebugPass);
>> + Res.push_back("-mdebug-pass", Opts.DebugPass);
>> }
>> if (Opts.DisableFPElim)
>> Res.push_back("-mdisable-fp-elim");
>> - if (!Opts.FloatABI.empty()) {
>> - Res.push_back("-mfloat-abi");
>> - Res.push_back(Opts.FloatABI);
>> - }
>> - if (!Opts.LimitFloatPrecision.empty()) {
>> - Res.push_back("-mlimit-float-precision");
>> - Res.push_back(Opts.LimitFloatPrecision);
>> - }
>> + if (!Opts.FloatABI.empty())
>> + Res.push_back("-mfloat-abi", Opts.FloatABI);
>> + if (!Opts.LimitFloatPrecision.empty())
>> + Res.push_back("-mlimit-float-precision", Opts.LimitFloatPrecision);
>> if (Opts.NoZeroInitializedInBSS)
>> Res.push_back("-mno-zero-initialized-bss");
>> switch (Opts.getObjCDispatchMethod()) {
>> @@ -272,10 +268,8 @@
>> Res.push_back("-fobjc-dispatch-method=non-legacy");
>> break;
>> }
>> - if (Opts.NumRegisterParameters) {
>> - Res.push_back("-mregparm");
>> - Res.push_back(llvm::utostr(Opts.NumRegisterParameters));
>> - }
>> + if (Opts.NumRegisterParameters)
>> + Res.push_back("-mregparm", llvm::utostr(Opts.NumRegisterParameters));
>> if (Opts.NoGlobalMerge)
>> Res.push_back("-mno-global-merge");
>> if (Opts.NoExecStack)
>> @@ -292,42 +286,32 @@
>> Res.push_back("-msoft-float");
>> if (Opts.UnwindTables)
>> Res.push_back("-munwind-tables");
>> - if (Opts.RelocationModel != "pic") {
>> - Res.push_back("-mrelocation-model");
>> - Res.push_back(Opts.RelocationModel);
>> - }
>> + if (Opts.RelocationModel != "pic")
>> + Res.push_back("-mrelocation-model", Opts.RelocationModel);
>> if (!Opts.VerifyModule)
>> Res.push_back("-disable-llvm-verifier");
>> - for (unsigned i = 0, e = Opts.BackendOptions.size(); i != e; ++i) {
>> - Res.push_back("-backend-option");
>> - Res.push_back(Opts.BackendOptions[i]);
>> - }
>> + for (unsigned i = 0, e = Opts.BackendOptions.size(); i != e; ++i)
>> + Res.push_back("-backend-option", Opts.BackendOptions[i]);
>> }
>>
>> static void DependencyOutputOptsToArgs(const DependencyOutputOptions &Opts,
>> - std::vector<std::string> &Res) {
>> + ToArgsList &Res) {
>> if (Opts.IncludeSystemHeaders)
>> Res.push_back("-sys-header-deps");
>> if (Opts.ShowHeaderIncludes)
>> Res.push_back("-H");
>> - if (!Opts.HeaderIncludeOutputFile.empty()) {
>> - Res.push_back("-header-include-file");
>> - Res.push_back(Opts.HeaderIncludeOutputFile);
>> - }
>> + if (!Opts.HeaderIncludeOutputFile.empty())
>> + Res.push_back("-header-include-file", Opts.HeaderIncludeOutputFile);
>> if (Opts.UsePhonyTargets)
>> Res.push_back("-MP");
>> - if (!Opts.OutputFile.empty()) {
>> - Res.push_back("-dependency-file");
>> - Res.push_back(Opts.OutputFile);
>> - }
>> - for (unsigned i = 0, e = Opts.Targets.size(); i != e; ++i) {
>> - Res.push_back("-MT");
>> - Res.push_back(Opts.Targets[i]);
>> - }
>> + if (!Opts.OutputFile.empty())
>> + Res.push_back("-dependency-file", Opts.OutputFile);
>> + for (unsigned i = 0, e = Opts.Targets.size(); i != e; ++i)
>> + Res.push_back("-MT", Opts.Targets[i]);
>> }
>>
>> static void DiagnosticOptsToArgs(const DiagnosticOptions &Opts,
>> - std::vector<std::string> &Res) {
>> + ToArgsList &Res) {
>> if (Opts.IgnoreWarnings)
>> Res.push_back("-w");
>> if (Opts.NoRewriteMacros)
>> @@ -366,42 +350,29 @@
>> case DiagnosticOptions::Vi:
>> Res.push_back("-fdiagnostics-format=vi"); break;
>> }
>> - if (Opts.ErrorLimit) {
>> - Res.push_back("-ferror-limit");
>> - Res.push_back(llvm::utostr(Opts.ErrorLimit));
>> - }
>> - if (!Opts.DiagnosticLogFile.empty()) {
>> - Res.push_back("-diagnostic-log-file");
>> - Res.push_back(Opts.DiagnosticLogFile);
>> - }
>> + if (Opts.ErrorLimit)
>> + Res.push_back("-ferror-limit", llvm::utostr(Opts.ErrorLimit));
>> + if (!Opts.DiagnosticLogFile.empty())
>> + Res.push_back("-diagnostic-log-file", Opts.DiagnosticLogFile);
>> if (Opts.MacroBacktraceLimit
>> - != DiagnosticOptions::DefaultMacroBacktraceLimit) {
>> - Res.push_back("-fmacro-backtrace-limit");
>> - Res.push_back(llvm::utostr(Opts.MacroBacktraceLimit));
>> - }
>> + != DiagnosticOptions::DefaultMacroBacktraceLimit)
>> + Res.push_back("-fmacro-backtrace-limit",
>> + llvm::utostr(Opts.MacroBacktraceLimit));
>> if (Opts.TemplateBacktraceLimit
>> - != DiagnosticOptions::DefaultTemplateBacktraceLimit) {
>> - Res.push_back("-ftemplate-backtrace-limit");
>> - Res.push_back(llvm::utostr(Opts.TemplateBacktraceLimit));
>> - }
>> + != DiagnosticOptions::DefaultTemplateBacktraceLimit)
>> + Res.push_back("-ftemplate-backtrace-limit",
>> + llvm::utostr(Opts.TemplateBacktraceLimit));
>> if (Opts.ConstexprBacktraceLimit
>> - != DiagnosticOptions::DefaultConstexprBacktraceLimit) {
>> - Res.push_back("-fconstexpr-backtrace-limit");
>> - Res.push_back(llvm::utostr(Opts.ConstexprBacktraceLimit));
>> - }
>> -
>> - if (Opts.TabStop != DiagnosticOptions::DefaultTabStop) {
>> - Res.push_back("-ftabstop");
>> - Res.push_back(llvm::utostr(Opts.TabStop));
>> - }
>> - if (Opts.MessageLength) {
>> - Res.push_back("-fmessage-length");
>> - Res.push_back(llvm::utostr(Opts.MessageLength));
>> - }
>> - if (!Opts.DumpBuildInformation.empty()) {
>> - Res.push_back("-dump-build-information");
>> - Res.push_back(Opts.DumpBuildInformation);
>> - }
>> + != DiagnosticOptions::DefaultConstexprBacktraceLimit)
>> + Res.push_back("-fconstexpr-backtrace-limit",
>> + llvm::utostr(Opts.ConstexprBacktraceLimit));
>> +
>> + if (Opts.TabStop != DiagnosticOptions::DefaultTabStop)
>> + Res.push_back("-ftabstop", llvm::utostr(Opts.TabStop));
>> + if (Opts.MessageLength)
>> + Res.push_back("-fmessage-length", llvm::utostr(Opts.MessageLength));
>> + if (!Opts.DumpBuildInformation.empty())
>> + Res.push_back("-dump-build-information", Opts.DumpBuildInformation);
>> for (unsigned i = 0, e = Opts.Warnings.size(); i != e; ++i)
>> Res.push_back("-W" + Opts.Warnings[i]);
>> }
>> @@ -465,16 +436,12 @@
>> llvm_unreachable("Unexpected language kind!");
>> }
>>
>> -static void FileSystemOptsToArgs(const FileSystemOptions &Opts,
>> - std::vector<std::string> &Res) {
>> - if (!Opts.WorkingDir.empty()) {
>> - Res.push_back("-working-directory");
>> - Res.push_back(Opts.WorkingDir);
>> - }
>> +static void FileSystemOptsToArgs(const FileSystemOptions &Opts, ToArgsList &Res){
>> + if (!Opts.WorkingDir.empty())
>> + Res.push_back("-working-directory", Opts.WorkingDir);
>> }
>>
>> -static void FrontendOptsToArgs(const FrontendOptions &Opts,
>> - std::vector<std::string> &Res) {
>> +static void FrontendOptsToArgs(const FrontendOptions &Opts, ToArgsList &Res) {
>> if (Opts.DisableFree)
>> Res.push_back("-disable-free");
>> if (Opts.RelocatablePCH)
>> @@ -514,14 +481,10 @@
>> Res.push_back("-arcmt-migrate");
>> break;
>> }
>> - if (!Opts.MTMigrateDir.empty()) {
>> - Res.push_back("-mt-migrate-directory");
>> - Res.push_back(Opts.MTMigrateDir);
>> - }
>> - if (!Opts.ARCMTMigrateReportOut.empty()) {
>> - Res.push_back("-arcmt-migrate-report-output");
>> - Res.push_back(Opts.ARCMTMigrateReportOut);
>> - }
>> + if (!Opts.MTMigrateDir.empty())
>> + Res.push_back("-mt-migrate-directory", Opts.MTMigrateDir);
>> + if (!Opts.ARCMTMigrateReportOut.empty())
>> + Res.push_back("-arcmt-migrate-report-output", Opts.ARCMTMigrateReportOut);
>> if (Opts.ARCMTMigrateEmitARCErrors)
>> Res.push_back("-arcmt-migrate-emit-errors");
>>
>> @@ -535,62 +498,46 @@
>> if (FrontendOptions::getInputKindForExtension(Opts.Inputs[i].File) !=
>> Opts.Inputs[i].Kind)
>> NeedLang = true;
>> - if (NeedLang) {
>> - Res.push_back("-x");
>> - Res.push_back(getInputKindName(Opts.Inputs[0].Kind));
>> - }
>> + if (NeedLang)
>> + Res.push_back("-x", getInputKindName(Opts.Inputs[0].Kind));
>> for (unsigned i = 0, e = Opts.Inputs.size(); i != e; ++i) {
>> assert((!NeedLang || Opts.Inputs[i].Kind == Opts.Inputs[0].Kind) &&
>> "Unable to represent this input vector!");
>> Res.push_back(Opts.Inputs[i].File);
>> }
>>
>> - if (!Opts.OutputFile.empty()) {
>> - Res.push_back("-o");
>> - Res.push_back(Opts.OutputFile);
>> - }
>> - if (!Opts.CodeCompletionAt.FileName.empty()) {
>> - Res.push_back("-code-completion-at");
>> - Res.push_back(Opts.CodeCompletionAt.FileName + ":" +
>> + if (!Opts.OutputFile.empty())
>> + Res.push_back("-o", Opts.OutputFile);
>> + if (!Opts.CodeCompletionAt.FileName.empty())
>> + Res.push_back("-code-completion-at",
>> + Opts.CodeCompletionAt.FileName + ":" +
>> llvm::utostr(Opts.CodeCompletionAt.Line) + ":" +
>> llvm::utostr(Opts.CodeCompletionAt.Column));
>> - }
>> if (Opts.ProgramAction != frontend::PluginAction)
>> Res.push_back(getActionName(Opts.ProgramAction));
>> if (!Opts.ActionName.empty()) {
>> - Res.push_back("-plugin");
>> - Res.push_back(Opts.ActionName);
>> - for(unsigned i = 0, e = Opts.PluginArgs.size(); i != e; ++i) {
>> - Res.push_back("-plugin-arg-" + Opts.ActionName);
>> - Res.push_back(Opts.PluginArgs[i]);
>> - }
>> - }
>> - for (unsigned i = 0, e = Opts.Plugins.size(); i != e; ++i) {
>> - Res.push_back("-load");
>> - Res.push_back(Opts.Plugins[i]);
>> + Res.push_back("-plugin", Opts.ActionName);
>> + for(unsigned i = 0, e = Opts.PluginArgs.size(); i != e; ++i)
>> + Res.push_back("-plugin-arg-" + Opts.ActionName, Opts.PluginArgs[i]);
>> }
>> + for (unsigned i = 0, e = Opts.Plugins.size(); i != e; ++i)
>> + Res.push_back("-load", Opts.Plugins[i]);
>> for (unsigned i = 0, e = Opts.AddPluginActions.size(); i != e; ++i) {
>> - Res.push_back("-add-plugin");
>> - Res.push_back(Opts.AddPluginActions[i]);
>> - for(unsigned ai = 0, ae = Opts.AddPluginArgs.size(); ai != ae; ++ai) {
>> - Res.push_back("-plugin-arg-" + Opts.AddPluginActions[i]);
>> - Res.push_back(Opts.AddPluginArgs[i][ai]);
>> - }
>> - }
>> - for (unsigned i = 0, e = Opts.ASTMergeFiles.size(); i != e; ++i) {
>> - Res.push_back("-ast-merge");
>> - Res.push_back(Opts.ASTMergeFiles[i]);
>> - }
>> - for (unsigned i = 0, e = Opts.LLVMArgs.size(); i != e; ++i) {
>> - Res.push_back("-mllvm");
>> - Res.push_back(Opts.LLVMArgs[i]);
>> - }
>> + Res.push_back("-add-plugin", Opts.AddPluginActions[i]);
>> + for(unsigned ai = 0, ae = Opts.AddPluginArgs.size(); ai != ae; ++ai)
>> + Res.push_back("-plugin-arg-" + Opts.AddPluginActions[i],
>> + Opts.AddPluginArgs[i][ai]);
>> + }
>> + for (unsigned i = 0, e = Opts.ASTMergeFiles.size(); i != e; ++i)
>> + Res.push_back("-ast-merge", Opts.ASTMergeFiles[i]);
>> + for (unsigned i = 0, e = Opts.LLVMArgs.size(); i != e; ++i)
>> + Res.push_back("-mllvm", Opts.LLVMArgs[i]);
>> if (!Opts.OverrideRecordLayoutsFile.empty())
>> Res.push_back("-foverride-record-layout=" + Opts.OverrideRecordLayoutsFile);
>> }
>>
>> static void HeaderSearchOptsToArgs(const HeaderSearchOptions &Opts,
>> - std::vector<std::string> &Res) {
>> + ToArgsList &Res) {
>> if (Opts.Sysroot != "/") {
>> Res.push_back("-isysroot");
>> Res.push_back(Opts.Sysroot);
>> @@ -657,14 +604,10 @@
>> Res.push_back(E.Path);
>> }
>>
>> - if (!Opts.ResourceDir.empty()) {
>> - Res.push_back("-resource-dir");
>> - Res.push_back(Opts.ResourceDir);
>> - }
>> - if (!Opts.ModuleCachePath.empty()) {
>> - Res.push_back("-fmodule-cache-path");
>> - Res.push_back(Opts.ModuleCachePath);
>> - }
>> + if (!Opts.ResourceDir.empty())
>> + Res.push_back("-resource-dir", Opts.ResourceDir);
>> + if (!Opts.ModuleCachePath.empty())
>> + Res.push_back("-fmodule-cache-path", Opts.ModuleCachePath);
>> if (!Opts.UseStandardSystemIncludes)
>> Res.push_back("-nostdsysteminc");
>> if (!Opts.UseStandardCXXIncludes)
>> @@ -675,8 +618,7 @@
>> Res.push_back("-v");
>> }
>>
>> -static void LangOptsToArgs(const LangOptions &Opts,
>> - std::vector<std::string> &Res) {
>> +static void LangOptsToArgs(const LangOptions &Opts, ToArgsList &Res) {
>> LangOptions DefaultLangOpts;
>>
>> // FIXME: Need to set -std to get all the implicit options.
>> @@ -771,10 +713,8 @@
>> case LangOptions::SOB_Defined: Res.push_back("-fwrapv"); break;
>> case LangOptions::SOB_Trapping:
>> Res.push_back("-ftrapv");
>> - if (!Opts.OverflowHandler.empty()) {
>> - Res.push_back("-ftrapv-handler");
>> - Res.push_back(Opts.OverflowHandler);
>> - }
>> + if (!Opts.OverflowHandler.empty())
>> + Res.push_back("-ftrapv-handler", Opts.OverflowHandler);
>> break;
>> }
>> if (Opts.HeinousExtensions)
>> @@ -793,10 +733,8 @@
>> Res.push_back("-fdump-vtable-layouts");
>> if (Opts.NoBitFieldTypeAlign)
>> Res.push_back("-fno-bitfield-type-alignment");
>> - if (Opts.PICLevel) {
>> - Res.push_back("-pic-level");
>> - Res.push_back(llvm::utostr(Opts.PICLevel));
>> - }
>> + if (Opts.PICLevel)
>> + Res.push_back("-pic-level", llvm::utostr(Opts.PICLevel));
>> if (Opts.ObjCGCBitmapPrint)
>> Res.push_back("-print-ivar-layout");
>> if (Opts.NoConstantCFStrings)
>> @@ -840,22 +778,14 @@
>> if (Opts.InlineVisibilityHidden)
>> Res.push_back("-fvisibility-inlines-hidden");
>>
>> - if (Opts.getStackProtector() != 0) {
>> - Res.push_back("-stack-protector");
>> - Res.push_back(llvm::utostr(Opts.getStackProtector()));
>> - }
>> - if (Opts.InstantiationDepth != DefaultLangOpts.InstantiationDepth) {
>> - Res.push_back("-ftemplate-depth");
>> - Res.push_back(llvm::utostr(Opts.InstantiationDepth));
>> - }
>> - if (Opts.ConstexprCallDepth != DefaultLangOpts.ConstexprCallDepth) {
>> - Res.push_back("-fconstexpr-depth");
>> - Res.push_back(llvm::utostr(Opts.ConstexprCallDepth));
>> - }
>> - if (!Opts.ObjCConstantStringClass.empty()) {
>> - Res.push_back("-fconstant-string-class");
>> - Res.push_back(Opts.ObjCConstantStringClass);
>> - }
>> + if (Opts.getStackProtector() != 0)
>> + Res.push_back("-stack-protector", llvm::utostr(Opts.getStackProtector()));
>> + if (Opts.InstantiationDepth != DefaultLangOpts.InstantiationDepth)
>> + Res.push_back("-ftemplate-depth", llvm::utostr(Opts.InstantiationDepth));
>> + if (Opts.ConstexprCallDepth != DefaultLangOpts.ConstexprCallDepth)
>> + Res.push_back("-fconstexpr-depth", llvm::utostr(Opts.ConstexprCallDepth));
>> + if (!Opts.ObjCConstantStringClass.empty())
>> + Res.push_back("-fconstant-string-class", Opts.ObjCConstantStringClass);
>> if (Opts.FakeAddressSpaceMap)
>> Res.push_back("-ffake-address-space-map");
>> if (Opts.ParseUnknownAnytype)
>> @@ -877,52 +807,41 @@
>> }
>>
>> static void PreprocessorOptsToArgs(const PreprocessorOptions &Opts,
>> - std::vector<std::string> &Res) {
>> + ToArgsList &Res) {
>> for (unsigned i = 0, e = Opts.Macros.size(); i != e; ++i)
>> Res.push_back(std::string(Opts.Macros[i].second ? "-U" : "-D") +
>> Opts.Macros[i].first);
>> for (unsigned i = 0, e = Opts.Includes.size(); i != e; ++i) {
>> // FIXME: We need to avoid reincluding the implicit PCH and PTH includes.
>> - Res.push_back("-include");
>> - Res.push_back(Opts.Includes[i]);
>> - }
>> - for (unsigned i = 0, e = Opts.MacroIncludes.size(); i != e; ++i) {
>> - Res.push_back("-imacros");
>> - Res.push_back(Opts.MacroIncludes[i]);
>> + Res.push_back("-include", Opts.Includes[i]);
>> }
>> + for (unsigned i = 0, e = Opts.MacroIncludes.size(); i != e; ++i)
>> + Res.push_back("-imacros", Opts.MacroIncludes[i]);
>> if (!Opts.UsePredefines)
>> Res.push_back("-undef");
>> if (Opts.DetailedRecord)
>> Res.push_back("-detailed-preprocessing-record");
>> - if (!Opts.ImplicitPCHInclude.empty()) {
>> - Res.push_back("-include-pch");
>> - Res.push_back(Opts.ImplicitPCHInclude);
>> - }
>> - if (!Opts.ImplicitPTHInclude.empty()) {
>> - Res.push_back("-include-pth");
>> - Res.push_back(Opts.ImplicitPTHInclude);
>> - }
>> + if (!Opts.ImplicitPCHInclude.empty())
>> + Res.push_back("-include-pch", Opts.ImplicitPCHInclude);
>> + if (!Opts.ImplicitPTHInclude.empty())
>> + Res.push_back("-include-pth", Opts.ImplicitPTHInclude);
>> if (!Opts.TokenCache.empty()) {
>> - if (Opts.ImplicitPTHInclude.empty()) {
>> - Res.push_back("-token-cache");
>> - Res.push_back(Opts.TokenCache);
>> - } else
>> + if (Opts.ImplicitPTHInclude.empty())
>> + Res.push_back("-token-cache", Opts.TokenCache);
>> + else
>> assert(Opts.ImplicitPTHInclude == Opts.TokenCache &&
>> "Unsupported option combination!");
>> }
>> - for (unsigned i = 0, e = Opts.ChainedIncludes.size(); i != e; ++i) {
>> - Res.push_back("-chain-include");
>> - Res.push_back(Opts.ChainedIncludes[i]);
>> - }
>> + for (unsigned i = 0, e = Opts.ChainedIncludes.size(); i != e; ++i)
>> + Res.push_back("-chain-include", Opts.ChainedIncludes[i]);
>> for (unsigned i = 0, e = Opts.RemappedFiles.size(); i != e; ++i) {
>> - Res.push_back("-remap-file");
>> - Res.push_back(Opts.RemappedFiles[i].first + ";" +
>> - Opts.RemappedFiles[i].second);
>> + Res.push_back("-remap-file", Opts.RemappedFiles[i].first + ";" +
>> + Opts.RemappedFiles[i].second);
>> }
>> }
>>
>> static void PreprocessorOutputOptsToArgs(const PreprocessorOutputOptions &Opts,
>> - std::vector<std::string> &Res) {
>> + ToArgsList &Res) {
>> if (!Opts.ShowCPP && !Opts.ShowMacros)
>> llvm::report_fatal_error("Invalid option combination!");
>>
>> @@ -940,43 +859,34 @@
>> }
>>
>> static void TargetOptsToArgs(const TargetOptions &Opts,
>> - std::vector<std::string> &Res) {
>> + ToArgsList &Res) {
>> Res.push_back("-triple");
>> Res.push_back(Opts.Triple);
>> - if (!Opts.CPU.empty()) {
>> - Res.push_back("-target-cpu");
>> - Res.push_back(Opts.CPU);
>> - }
>> - if (!Opts.ABI.empty()) {
>> - Res.push_back("-target-abi");
>> - Res.push_back(Opts.ABI);
>> - }
>> - if (!Opts.LinkerVersion.empty()) {
>> - Res.push_back("-target-linker-version");
>> - Res.push_back(Opts.LinkerVersion);
>> - }
>> - if (!Opts.CXXABI.empty()) {
>> - Res.push_back("-cxx-abi");
>> - Res.push_back(Opts.CXXABI);
>> - }
>> - for (unsigned i = 0, e = Opts.Features.size(); i != e; ++i) {
>> - Res.push_back("-target-feature");
>> - Res.push_back(Opts.Features[i]);
>> - }
>> + if (!Opts.CPU.empty())
>> + Res.push_back("-target-cpu", Opts.CPU);
>> + if (!Opts.ABI.empty())
>> + Res.push_back("-target-abi", Opts.ABI);
>> + if (!Opts.LinkerVersion.empty())
>> + Res.push_back("-target-linker-version", Opts.LinkerVersion);
>> + if (!Opts.CXXABI.empty())
>> + Res.push_back("-cxx-abi", Opts.CXXABI);
>> + for (unsigned i = 0, e = Opts.Features.size(); i != e; ++i)
>> + Res.push_back("-target-feature", Opts.Features[i]);
>> }
>>
>> void CompilerInvocation::toArgs(std::vector<std::string> &Res) {
>> - AnalyzerOptsToArgs(getAnalyzerOpts(), Res);
>> - CodeGenOptsToArgs(getCodeGenOpts(), Res);
>> - DependencyOutputOptsToArgs(getDependencyOutputOpts(), Res);
>> - DiagnosticOptsToArgs(getDiagnosticOpts(), Res);
>> - FileSystemOptsToArgs(getFileSystemOpts(), Res);
>> - FrontendOptsToArgs(getFrontendOpts(), Res);
>> - HeaderSearchOptsToArgs(getHeaderSearchOpts(), Res);
>> - LangOptsToArgs(*getLangOpts(), Res);
>> - PreprocessorOptsToArgs(getPreprocessorOpts(), Res);
>> - PreprocessorOutputOptsToArgs(getPreprocessorOutputOpts(), Res);
>> - TargetOptsToArgs(getTargetOpts(), Res);
>> + ToArgsList List(Res);
>> + AnalyzerOptsToArgs(getAnalyzerOpts(), List);
>> + CodeGenOptsToArgs(getCodeGenOpts(), List);
>> + DependencyOutputOptsToArgs(getDependencyOutputOpts(), List);
>> + DiagnosticOptsToArgs(getDiagnosticOpts(), List);
>> + FileSystemOptsToArgs(getFileSystemOpts(), List);
>> + FrontendOptsToArgs(getFrontendOpts(), List);
>> + HeaderSearchOptsToArgs(getHeaderSearchOpts(), List);
>> + LangOptsToArgs(*getLangOpts(), List);
>> + PreprocessorOptsToArgs(getPreprocessorOpts(), List);
>> + PreprocessorOutputOptsToArgs(getPreprocessorOutputOpts(), List);
>> + TargetOptsToArgs(getTargetOpts(), List);
>> }
>>
>> //===----------------------------------------------------------------------===//
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list