i386: disable sse in rtld-divdi3.os

Message ID CAMe9rOrsLrmDp5RF7My29CuGp6kOOwS+X0b3RWqyCMiFaYYBdw@mail.gmail.com
State New, archived
Headers

Commit Message

H.J. Lu July 14, 2016, 3 p.m. UTC
  On Thu, Jul 14, 2016 at 3:45 AM, Aurelien Jarno <aurelien@aurel32.net> wrote:
> When compiling the GNU libc on i386 using GCC 6 and for a CPU with SSE
> support (e.g. -march=pentium4, -march=core2, -march=haswell, ...) the
> rtld-divdi3.os file ends up with SSE instructions using the XMM
> registers. This makes the elf/tst-ld-sse-use test to fail:
>
>   function __udivdi3 in rtld-divdi3.os modifies xmm/ymm/zmm
>
> Modify sysdeps/i386/Makefile to compile this file with -mno-sse -mno-mmx
> -mfpmath=387 like it is already done for other files used by ld.so.
>
> Changelog:
>         * sysdeps/i386/Makefile [$(subdir) == csu] (CFLAGS-rtld-divdi3.os):
>         New. Set to -mno-sse -mno-mmx -mfpmath=387.

Don't all rtld-*.os have the same issue?  Please try this one.
  

Comments

Aurelien Jarno July 14, 2016, 6:46 p.m. UTC | #1
On 2016-07-14 08:00, H.J. Lu wrote:
> On Thu, Jul 14, 2016 at 3:45 AM, Aurelien Jarno <aurelien@aurel32.net> wrote:
> > When compiling the GNU libc on i386 using GCC 6 and for a CPU with SSE
> > support (e.g. -march=pentium4, -march=core2, -march=haswell, ...) the
> > rtld-divdi3.os file ends up with SSE instructions using the XMM
> > registers. This makes the elf/tst-ld-sse-use test to fail:
> >
> >   function __udivdi3 in rtld-divdi3.os modifies xmm/ymm/zmm
> >
> > Modify sysdeps/i386/Makefile to compile this file with -mno-sse -mno-mmx
> > -mfpmath=387 like it is already done for other files used by ld.so.
> >
> > Changelog:
> >         * sysdeps/i386/Makefile [$(subdir) == csu] (CFLAGS-rtld-divdi3.os):
> >         New. Set to -mno-sse -mno-mmx -mfpmath=387.
> 
> Don't all rtld-*.os have the same issue?  Please try this one.

I confirm this one fix the issue, thanks.

Aurelien
  

Patch

From 4c130663163ab22f1ec76739633a5cbe0550a118 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Thu, 14 Jul 2016 07:54:18 -0700
Subject: [PATCH] i386: Compile rtld-*.os with -mno-sse -mno-mmx -mfpmath=387

Compile i386 rtld-*.os with -mno-sse -mno-mmx -mfpmath=387 so that no
code in ld.so uses mm/xmm/ymm/zmm registers on i386 since the first 3
mm/xmm/ymm/zmm registers are used to pass vector parameters which must
be preserved.

	* sysdeps/i386/Makefile (rtld-CFLAGS): New.
	[subdir == elf] (CFLAGS-.os): Replace -mno-sse -mno-mmx
	-mfpmath=387 with $(rtld-CFLAGS).
	[subdir != elf] (CFLAGS-.os): Compile rtld-*.os with
	$(rtld-CFLAGS).
---
 sysdeps/i386/Makefile | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/sysdeps/i386/Makefile b/sysdeps/i386/Makefile
index 6c91842..e94f2cb 100644
--- a/sysdeps/i386/Makefile
+++ b/sysdeps/i386/Makefile
@@ -84,17 +84,20 @@  ifeq ($(subdir),csu)
 gen-as-const-headers += tlsdesc.sym
 endif
 
-ifeq ($(subdir),elf)
 # Make sure no code in ld.so uses mm/xmm/ymm/zmm registers on i386 since
 # the first 3 mm/xmm/ymm/zmm registers are used to pass vector parameters
 # which must be preserved.
 # With SSE disabled, ensure -fpmath is not set to use sse either.
+rtld-CFLAGS = -mno-sse -mno-mmx -mfpmath=387
+ifeq ($(subdir),elf)
 CFLAGS-.os += $(if $(filter $(@F),$(patsubst %,%.os,$(all-rtld-routines))),\
-		   -mno-sse -mno-mmx -mfpmath=387)
+		   $(rtld-CFLAGS))
 
 tests-special += $(objpfx)tst-ld-sse-use.out
 $(objpfx)tst-ld-sse-use.out: ../sysdeps/i386/tst-ld-sse-use.sh $(objpfx)ld.so
 	@echo "Checking ld.so for SSE register use.  This will take a few seconds..."
 	$(BASH) $< $(objpfx) '$(NM)' '$(OBJDUMP)' '$(READELF)' > $@; \
 	$(evaluate-test)
+else
+CFLAGS-.os += $(if $(filter rtld-%.os,$(@F)), $(rtld-CFLAGS))
 endif
-- 
2.7.4