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 <[email protected]> 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 > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
