diff options
author | Bob Wilson <bob.wilson@apple.com> | 2013-02-10 16:01:41 +0000 |
---|---|---|
committer | Bob Wilson <bob.wilson@apple.com> | 2013-02-10 16:01:41 +0000 |
commit | 2616e2ec85934f2a45add8fd0df30defe3b3a7ad (patch) | |
tree | c746da5b989b52a1775cab6d7f157f7f8b83fdca /clang/lib/Driver/Tools.cpp | |
parent | dc9e6085c4780399a4ee8269cac407d7708aea9c (diff) | |
download | bcm5719-llvm-2616e2ec85934f2a45add8fd0df30defe3b3a7ad.tar.gz bcm5719-llvm-2616e2ec85934f2a45add8fd0df30defe3b3a7ad.zip |
Use -mno-implicit-float by default for kernel/kext code. <rdar://13177960>
Apple's kernel engineers have been expecting this behavior even though
we've never implemented it before, as far as I can tell. In recent months,
clang has gotten better at using vector instructions to optimize memcpy-like
operations, and that has exposed problems when vector/floating-point
instructions are used in kexts that don't support that. This behavior also
matches what Apple's GCC did for PowerPC targets.
llvm-svn: 174838
Diffstat (limited to 'clang/lib/Driver/Tools.cpp')
-rw-r--r-- | clang/lib/Driver/Tools.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index c5499dea769..0ed010e4ea3 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -1200,10 +1200,18 @@ void Clang::AddX86TargetArgs(const ArgList &Args, Args.hasArg(options::OPT_fapple_kext)) CmdArgs.push_back("-disable-red-zone"); - if (Args.hasFlag(options::OPT_msoft_float, - options::OPT_mno_soft_float, - false) || - Args.hasArg(options::OPT_mno_implicit_float)) + // Default to avoid implicit floating-point for kernel/kext code, but allow + // that to be overridden with -mno-soft-float. + bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) || + Args.hasArg(options::OPT_fapple_kext)); + if (Arg *A = Args.getLastArg(options::OPT_msoft_float, + options::OPT_mno_soft_float, + options::OPT_mno_implicit_float)) { + const Option &O = A->getOption(); + NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) || + O.matches(options::OPT_msoft_float)); + } + if (NoImplicitFloat) CmdArgs.push_back("-no-implicit-float"); if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) { |