r228236 - Driver: Stop forcing frame pointer usage on Windows
Timur Iskhodzhanov
timurrrr at google.com
Thu Feb 5 05:53:30 PST 2015
Interesting: this has broken down the dll_noreturn ASan tests (run as part
of check-asan and check-asan-dynamic), which uses -O0 (yes, o-zero).
Can you please make sure this doesn't affect -O0?
On Thu Feb 05 2015 at 2:52:57 AM Reid Kleckner <reid at kleckner.net> wrote:
> Author: rnk
> Date: Wed Feb 4 17:45:07 2015
> New Revision: 228236
>
> URL: http://llvm.org/viewvc/llvm-project?rev=228236&view=rev
> Log:
> Driver: Stop forcing frame pointer usage on Windows
>
> Previously, we would use a frame pointer by default on non-Linux OSs. On
> Linux, any optimization flags imply -fomit-frame-pointer. XCore always
> defaulted to -fomit-frame-pointer.
>
> Now x86 Windows matches our behavior on Linux. All other ISAs supported
> by Windows (ARM, x64) use xdata information, and frame pointers aren't
> useful. Frame pointers are now off by default for such targets, but can
> be forced via -fno-omit-frame-pointer and code using alloca().
>
> In fact, on Win64 our frame-pointer prologue is not describable with
> UNWIND_INFO. This change is a workaround to avoid using the broken FP
> using prologue for most functions. This is PR22467.
>
> Modified:
> cfe/trunk/lib/Driver/Tools.cpp
>
> Modified: cfe/trunk/lib/Driver/Tools.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/
> Tools.cpp?rev=228236&r1=228235&r2=228236&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Driver/Tools.cpp (original)
> +++ cfe/trunk/lib/Driver/Tools.cpp Wed Feb 4 17:45:07 2015
> @@ -2288,27 +2288,49 @@ static bool addSanitizerRuntimes(const T
> return !StaticRuntimes.empty();
> }
>
> +static bool areOptimizationsEnabled(const ArgList &Args) {
> + // Find the last -O arg and see if it is non-zero.
> + if (Arg *A = Args.getLastArg(options::OPT_O_Group))
> + return !A->getOption().matches(options::OPT_O0);
> + // Defaults to -O0.
> + return false;
> +}
> +
> static bool shouldUseFramePointerForTarget(const ArgList &Args,
> const llvm::Triple &Triple) {
> - switch (Triple.getArch()) {
> - // Don't use a frame pointer on linux if optimizing for certain targets.
> - case llvm::Triple::mips64:
> - case llvm::Triple::mips64el:
> - case llvm::Triple::mips:
> - case llvm::Triple::mipsel:
> - case llvm::Triple::systemz:
> - case llvm::Triple::x86:
> - case llvm::Triple::x86_64:
> - if (Triple.isOSLinux())
> - if (Arg *A = Args.getLastArg(options::OPT_O_Group))
> - if (!A->getOption().matches(options::OPT_O0))
> - return false;
> - return true;
> - case llvm::Triple::xcore:
> + // XCore never wants frame pointers, regardless of OS.
> + if (Triple.getArch() == llvm::Triple::xcore) {
> return false;
> - default:
> - return true;
> }
> +
> + if (Triple.isOSLinux()) {
> + switch (Triple.getArch()) {
> + // Don't use a frame pointer on linux if optimizing for certain
> targets.
> + case llvm::Triple::mips64:
> + case llvm::Triple::mips64el:
> + case llvm::Triple::mips:
> + case llvm::Triple::mipsel:
> + case llvm::Triple::systemz:
> + case llvm::Triple::x86:
> + case llvm::Triple::x86_64:
> + return !areOptimizationsEnabled(Args);
> + default:
> + return true;
> + }
> + }
> +
> + if (Triple.isOSWindows()) {
> + switch (Triple.getArch()) {
> + case llvm::Triple::x86:
> + return !areOptimizationsEnabled(Args);
> + default:
> + // All other supported Windows ISAs use xdata unwind information,
> so frame
> + // pointers are not generally useful.
> + return false;
> + }
> + }
> +
> + return true;
> }
>
> static bool shouldUseFramePointer(const ArgList &Args,
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150205/0cd919c7/attachment.html>
More information about the cfe-commits
mailing list