From: David Majnemer Date: Thu, 21 Jan 2016 23:01:11 +0000 (+0000) Subject: [MSVC Compat] Don't omit frame pointers if /Oy- is specified before /O2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=398f134ed1a8d69cff4f0b2d06f6d6bc18dda570;p=clang [MSVC Compat] Don't omit frame pointers if /Oy- is specified before /O2 Microsoft's documentation states that specifying /Oy- after the /O[12x] options disables frame-pointer omission. What it does *not* state is that it also disables frame-pointer omission if /Oy- is specified before /O[12x]. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@258447 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Driver/MSVCToolChain.cpp b/lib/Driver/MSVCToolChain.cpp index 68747155b8..1d2d20b407 100644 --- a/lib/Driver/MSVCToolChain.cpp +++ b/lib/Driver/MSVCToolChain.cpp @@ -659,7 +659,8 @@ static void TranslateOptArg(Arg *A, llvm::opt::DerivedArgList &DAL, DAL.AddFlagArg(A, Opts.getOption(options::OPT_fbuiltin)); DAL.AddJoinedArg(A, Opts.getOption(options::OPT_O), "2"); } - if (SupportsForcingFramePointer) + if (SupportsForcingFramePointer && + !DAL.hasArgNoClaim(options::OPT_fno_omit_frame_pointer)) DAL.AddFlagArg(A, Opts.getOption(options::OPT_fomit_frame_pointer)); if (OptChar == '1' || OptChar == '2') diff --git a/test/Driver/cl-options.c b/test/Driver/cl-options.c index c5985a9c2b..6054faaf15 100644 --- a/test/Driver/cl-options.c +++ b/test/Driver/cl-options.c @@ -123,6 +123,10 @@ // PR24003: -momit-leaf-frame-pointer // PR24003: -Os +// RUN: %clang_cl --target=i686-pc-win32 /Oy- /O2 -### -- %s 2>&1 | FileCheck -check-prefix=Oy_2 %s +// Oy_2: -momit-leaf-frame-pointer +// Oy_2: -O2 + // RUN: %clang_cl /Zs /Oy -- %s 2>&1 // RUN: %clang_cl --target=i686-pc-win32 /Oy- -### -- %s 2>&1 | FileCheck -check-prefix=Oy_ %s