diff options
Diffstat (limited to 'clang/lib/Driver/MSVCToolChain.cpp')
| -rw-r--r-- | clang/lib/Driver/MSVCToolChain.cpp | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/clang/lib/Driver/MSVCToolChain.cpp b/clang/lib/Driver/MSVCToolChain.cpp index b890375742e..6e9bcb76e1d 100644 --- a/clang/lib/Driver/MSVCToolChain.cpp +++ b/clang/lib/Driver/MSVCToolChain.cpp @@ -535,6 +535,9 @@ MSVCToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args, DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs()); const OptTable &Opts = getDriver().getOpts(); + // /Oy and /Oy- only has an effect under X86-32. + bool SupportsForcingFramePointer = getArch() == llvm::Triple::x86; + // The -O[12xd] flag actually expands to several flags. We must desugar the // flags so that options embedded can be negated. For example, the '-O2' flag // enables '-Oy'. Expanding '-O2' into its constituent flags allows us to @@ -584,8 +587,9 @@ MSVCToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args, DAL->AddFlagArg(A, Opts.getOption(options::OPT_fbuiltin)); DAL->AddJoinedArg(A, Opts.getOption(options::OPT_O), "2"); } - DAL->AddFlagArg(A, - Opts.getOption(options::OPT_fomit_frame_pointer)); + if (SupportsForcingFramePointer) + DAL->AddFlagArg(A, + Opts.getOption(options::OPT_fomit_frame_pointer)); if (OptChar == '1' || OptChar == '2') DAL->AddFlagArg(A, Opts.getOption(options::OPT_ffunction_sections)); @@ -593,13 +597,13 @@ MSVCToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args, } break; case 'b': - if (isdigit(OptStr[I + 1])) + if (I + 1 != E && isdigit(OptStr[I + 1])) ++I; break; case 'g': break; case 'i': - if (OptStr[I + 1] == '-') { + if (I + 1 != E && OptStr[I + 1] == '-') { ++I; DAL->AddFlagArg(A, Opts.getOption(options::OPT_fno_builtin)); } else { @@ -612,16 +616,23 @@ MSVCToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args, case 't': DAL->AddJoinedArg(A, Opts.getOption(options::OPT_O), "2"); break; - case 'y': - if (OptStr[I + 1] == '-') { + case 'y': { + bool OmitFramePointer = true; + if (I + 1 != E && OptStr[I + 1] == '-') { + OmitFramePointer = false; ++I; - DAL->AddFlagArg(A, - Opts.getOption(options::OPT_fno_omit_frame_pointer)); - } else { - DAL->AddFlagArg(A, Opts.getOption(options::OPT_fomit_frame_pointer)); + } + if (SupportsForcingFramePointer) { + if (OmitFramePointer) + DAL->AddFlagArg(A, + Opts.getOption(options::OPT_fomit_frame_pointer)); + else + DAL->AddFlagArg( + A, Opts.getOption(options::OPT_fno_omit_frame_pointer)); } break; } + } } } return DAL; |

