Date: Tue, 16 Dec 2014 08:29:19 +0000 From: bugzilla-noreply@freebsd.org To: freebsd-ports-bugs@FreeBSD.org Subject: [Bug 196014] New: [patch] unbreak graphics/OpenEXR build when CPUTYPE is set when building with gcc on i386 Message-ID: <bug-196014-13@https.bugs.freebsd.org/bugzilla/>
next in thread | raw e-mail | index | archive | help
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=196014 Bug ID: 196014 Summary: [patch] unbreak graphics/OpenEXR build when CPUTYPE is set when building with gcc on i386 Product: Ports Tree Version: Latest Hardware: Any OS: Any Status: New Severity: Affects Only Me Priority: --- Component: Individual Port(s) Assignee: mandree@FreeBSD.org Reporter: truckman@FreeBSD.org Assignee: mandree@FreeBSD.org Flags: maintainer-feedback?(mandree@FreeBSD.org) Created attachment 150626 --> https://bugs.freebsd.org/bugzilla/attachment.cgi?id=150626&action=edit patch to unbreak graphics/OpenEXR build when CPUTYPE is set If CPUTYPE is set in make.conf to a value that enables SSE2 when building graphics/OpenEXR with gcc on i386, the build fails with this error: gcc48 -MT ImfSystemSpecific.lo -MD -MP -MF .deps/ImfSystemSpecific.Tpo -c ImfSystemSpecific.cpp -fPIC -DPIC -o .libs/ImfSystemSpecific.o libtool: compile: g++48 -DHAVE_CONFIG_H -I. -I../config -I.. -I../config -pthread -I/usr/local/include/OpenEXR -I. -I../IlmImf -pipe -O2 -pipe -march=pentium-m -Wl,-rpath=/usr/local/lib/gcc48 -fno-strict-aliasing -Wl,-rpath=/usr/local/lib/gcc48 -MT ImfCompositeDeepScanLine.lo -MD -MP -MF .deps/ImfCompositeDeepScanLine.Tpo -c ImfCompositeDeepScanLine.cpp -o ImfCompositeDeepScanLine.o >/dev/null 2>&1 ImfSystemSpecific.cpp: In constructor 'Imf_2_2::CpuId::CpuId()': ImfSystemSpecific.cpp:51:29: error: inconsistent operand constraints in an 'asm' : /* Clobber */); ^ ImfSystemSpecific.cpp:51:29: error: inconsistent operand constraints in an 'asm' : /* Clobber */); ^ Makefile:669: recipe for target 'ImfSystemSpecific.lo' failed gmake[2]: *** [ImfSystemSpecific.lo] Error 1 The problem is in this block of code: #if defined(IMF_HAVE_SSE2) && defined(__GNUC__) // Helper functions for gcc + SSE enabled void cpuid(int n, int &eax, int &ebx, int &ecx, int &edx) { __asm__ __volatile__ ( "cpuid" : /* Output */ "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx) : /* Input */ "a"(n) : /* Clobber */); } #else // IMF_HAVE_SSE2 && __GNUC__ The problem is that this code is clobbering the ebx register which is reserved for the global offset table when compiling -fPIC on i386. The attached patch reimplments the cpuid() function using __cpuid() from the gcc include file <cpuid.h> in place of the inline asm. See also: <https://github.com/openexr/openexr/issues/128> --- Comment #1 from Bugzilla Automation <bugzilla@FreeBSD.org> --- Auto-assigned to maintainer mandree@FreeBSD.org -- You are receiving this mail because: You are the assignee for the bug.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?bug-196014-13>