NetBSD Problem Report #40468

From he@malus.urc.uninett.no  Sat Jan 24 22:39:58 2009
Return-Path: <he@malus.urc.uninett.no>
Received: from mail.netbsd.org (mail.netbsd.org [204.152.190.11])
	by narn.NetBSD.org (Postfix) with ESMTP id 1704863BAB8
	for <gnats-bugs@gnats.NetBSD.org>; Sat, 24 Jan 2009 22:39:58 +0000 (UTC)
Message-Id: <20090124223954.EBC37B0DFA@malus.urc.uninett.no>
Date: Sat, 24 Jan 2009 23:39:54 +0100 (CET)
From: he@NetBSD.org
Reply-To: he@NetBSD.org
To: gnats-bugs@gnats.NetBSD.org
Subject: Optimizer bug suspected -- porting devel/libffi to NetBSD/powerpc
X-Send-Pr-Version: 3.95

>Number:         40468
>Category:       toolchain
>Synopsis:       Optimizer bug suspected -- porting devel/libffi to NetBSD/powerpc
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    toolchain-manager
>State:          feedback
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sat Jan 24 22:40:00 +0000 2009
>Closed-Date:    
>Last-Modified:  Sat Dec 31 19:36:58 +0000 2011
>Originator:     Havard Eidnes
>Release:        NetBSD 4.0
>Organization:
	I Try, Inc.
>Environment:
System: NetBSD malus.urc.uninett.no 4.0 NetBSD 4.0 (GENERIC) #0: Sun Dec 16 00:27:58 PST 2007 builds@wb30:/home/builds/ab/netbsd-4-0-RELEASE/macppc/200712160005Z-obj/home/builds/ab/netbsd-4-0-RELEASE/src/sys/arch/macppc/compile/GENERIC macppc
Compiler: gcc version 4.1.2 20061021 prerelease (NetBSD nb3 20061125)
Architecture: powerpc
Machine: macppc
>Description:
	While trying to update and port devel/libffi to NetBSD/macppc 4.0,
	I found out that even after doing basic porting, some of the
	self-tests fail.

	Closer inspection reveals that there is one particular self-test
	which involves a function which takes two by-value arguments
	consisting of an (ideally) 6-byte struct, and which returns
	such a struct as a return value.

	When the self-test is compiled -O0 or -O1, the test prints
	the expected values.  When it's compiled either of

	-O2, -O3, -Os, or -O2 -fomit-frame-pointer

	the output does not match what is expected.

	This can be verified on NetBSD/macppc by first doing
	"make" in devel/libffi after applying the attached patch, decending
	into work/libffi-3.0.8/testsuite/libffi.call and doing e.g.

	cc -O1 -o /tmp/cls_6byte -I../.. -I../../include cls_6byte.c \
		../../.libs/libffi.a ../../.libs/libffi_convenience.a

	and executing the result.  With the above, it prints

127 120 1 128 12 128 9 127: 139 248 10 255
res: 139 248 10 255
127 120 1 128 12 128 9 127: 139 248 10 255
res: 139 248 10 255

	with the failing optimization flags, it prints

127 120 1 128 12 128 9 127: 139 248 10 255
res: 139 248 10 255
0 120 1 128 12 128 9 127: 12 248 10 255
res: 12 248 10 255

>How-To-Repeat:
	Apply this patch to upgrade / adapt devel/libffi, and
	make sure to have dejagnu installed.  Watch
	"make test" print 4 unexpected failures.

	Inspection of work/libffi-3.0.8/testsuite/libffi.log
	will reveal the offending test and the expected and actual
	output from the test (and it's reproducability as above).

Index: Makefile
===================================================================
RCS file: /cvsroot/pkgsrc/devel/libffi/Makefile,v
retrieving revision 1.8
diff -u -p -r1.8 Makefile
--- Makefile	11 Oct 2008 22:33:56 -0000	1.8
+++ Makefile	24 Jan 2009 22:02:56 -0000
@@ -1,7 +1,7 @@
 # $NetBSD: Makefile,v 1.8 2008/10/11 22:33:56 dholland Exp $
 #

-DISTNAME=	libffi-3.0.6
+DISTNAME=	libffi-3.0.8
 CATEGORIES=	devel
 MASTER_SITES=	ftp://sourceware.org/pub/libffi/

@@ -18,6 +18,8 @@ USE_TOOLS+=	pkg-config
 USE_LANGUAGES=	c c++
 INFO_FILES=	# PLIST

+TEST_TARGET=	check
+
 PKGCONFIG_OVERRIDE+=	libffi.pc.in

 .include "../../mk/bsd.pkg.mk"
Index: distinfo
===================================================================
RCS file: /cvsroot/pkgsrc/devel/libffi/distinfo,v
retrieving revision 1.9
diff -u -p -r1.9 distinfo
--- distinfo	11 Oct 2008 22:33:56 -0000	1.9
+++ distinfo	24 Jan 2009 22:02:56 -0000
@@ -1,7 +1,10 @@
 $NetBSD: distinfo,v 1.9 2008/10/11 22:33:56 dholland Exp $

-SHA1 (libffi-3.0.6.tar.gz) = 04a5f38c76dfe3e078767645ca89f2ff71721104
-RMD160 (libffi-3.0.6.tar.gz) = da8f547209e6b13dc7be86ea29ad5fa5e85844e5
-Size (libffi-3.0.6.tar.gz) = 717171 bytes
+SHA1 (libffi-3.0.8.tar.gz) = ce44d10c39d9a37479c8777e206cac0f36c48712
+RMD160 (libffi-3.0.8.tar.gz) = 4144f64e79ebf95161a6afd58ceaeef8372b5e57
+Size (libffi-3.0.8.tar.gz) = 722834 bytes
 SHA1 (patch-ac) = 307c08e8e3df5f079c0b2f63da58bb59fc089d30
 SHA1 (patch-ad) = 8901a00abe25422e3e35f321a5fb89311185fc0b
+SHA1 (patch-ae) = bf16fd422f2d705324bd8a113f5681252f6c6bdc
+SHA1 (patch-af) = cb6cdffa127f34b1e6f299f76de08bff20ab83dd
+SHA1 (patch-ag) = 1d0f5dbfafeff21db44d305daa96573f827b222a
--- /dev/null	2009-01-24 04:35:54.000000000 +0100
+++ patches/patch-ae	2009-01-18 15:47:54.000000000 +0100
@@ -0,0 +1,13 @@
+$NetBSD$
+
+--- configure.ac.orig	2008-12-19 17:12:30.000000000 +0100
++++ configure.ac
+@@ -118,7 +118,7 @@ case "$host" in
+   powerpc-*-aix* | rs6000-*-aix*)
+ 	TARGET=POWERPC_AIX; TARGETDIR=powerpc
+ 	;;
+-  powerpc-*-freebsd*)
++  powerpc-*-freebsd* | powerpc-*-netbsd*)
+ 	TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc
+ 	;;
+   powerpc*-*-rtems*)
--- /dev/null	2009-01-24 04:35:54.000000000 +0100
+++ patches/patch-af	2009-01-18 15:48:54.000000000 +0100
@@ -0,0 +1,13 @@
+$NetBSD$
+
+--- configure.orig	2009-01-18 15:46:33.000000000 +0100
++++ configure
+@@ -21033,7 +21033,7 @@ case "$host" in
+   powerpc-*-aix* | rs6000-*-aix*)
+ 	TARGET=POWERPC_AIX; TARGETDIR=powerpc
+ 	;;
+-  powerpc-*-freebsd*)
++  powerpc-*-freebsd* | powerpc-*-netbsd*)
+ 	TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc
+ 	;;
+   powerpc*-*-rtems*)
--- /dev/null	2009-01-24 04:35:54.000000000 +0100
+++ patches/patch-ag	2009-01-23 18:05:01.000000000 +0100
@@ -0,0 +1,13 @@
+$NetBSD$
+
+--- testsuite/libffi.call/float2.c.orig	2008-01-29 16:15:20.000000000 +0100
++++ testsuite/libffi.call/float2.c
+@@ -44,7 +44,7 @@ int main (void)
+   /* This is ifdef'd out for now. long double support under SunOS/gcc
+      is pretty much non-existent.  You'll get the odd bus error in library
+      routines like printf().  */
+-  printf ("%Lf, %Lf, %Lf, %Lf\n", ld, ldblit(f), ld - ldblit(f), LDBL_EPSILON);
++  printf ("%Lf, %Lf, %Lf, %f\n", ld, ldblit(f), ld - ldblit(f), LDBL_EPSILON);
+ #endif
+ 
+   /* These are not always the same!! Check for a reasonable delta */
>Fix:
	Sorry, don't know, so none provided.

>Release-Note:

>Audit-Trail:

State-Changed-From-To: open->feedback
State-Changed-By: dholland@NetBSD.org
State-Changed-When: Sat, 31 Dec 2011 19:36:58 +0000
State-Changed-Why:
Do you know if this affects gcc 4.5 in current?


>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.39 2013/11/01 18:47:49 spz Exp $
$NetBSD: gnats_config.sh,v 1.8 2006/05/07 09:23:38 tsutsui Exp $
Copyright © 1994-2007 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.