Solaris & [PATCH libdrm 1/2] configure.ac: split -fvisibility and __attribute__((visibility)) checks
Alan Coopersmith
alan.coopersmith at oracle.com
Sun Mar 22 18:46:47 PDT 2015
On 03/ 9/15 05:37 AM, Emil Velikov wrote:
> The former does not imply the latter and vice-versa. One such example is
> the Sun compiler.
>
> Cc: Alan Coopersmith <alan.coopersmith at oracle.com>
> Cc: Thierry Reding <treding at nvidia.com>
> Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
> ---
>
> Hi Alan,
> Can you please take a look it this series covers the symbol visibility
> issues mentioned earlier ? In theory it should work like a charm but I
> cannot really test it :-\
Patch 1 of 2 breaks configure on Solaris - I get:
checking for VALGRIND... no
checking whether cc -xc99=%all supports __attribute__((visibility))... ./configure[13393]: set does not quote correctly, so add quotes: double-quote^J # substitution turns \\ into \, and sed turns \ into \.^J sed -n ^I"s//\\/g;^J^I s/^\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\)=\(.*\)/\1=2/p"^J ;; #(^J *)^J # : not found [No such file or directory]
./configure[13393]: {\1+set}: bad substitution
./configure[13992]: : cannot open
./configure[14000]: : cannot open
./configure[14032]: : cannot open
./configure[14051]: : cannot open
./configure[14128]: : cannot open
./configure[14139]: : cannot open
./configure[14150]: : cannot open
./configure[14435]: : cannot open
./configure[14563]: : cannot open
./configure[14603]: : cannot open
./configure[14610]: : cannot open
./configure[14639]: : cannot open
./configure[14671]: : cannot open
./configure[14740]: : cannot open
./configure[14744]: : cannot open
./configure[14778]: : cannot open
./configure[14928]: : cannot open
./configure[14948]: : cannot open
./configure[14962]: : cannot open
./configure[14966]: : cannot open
configure: error: write failure creating
It also generated new autoconf warnings generating the configure script:
configure.ac:422: warning: AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body
../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from...
../../lib/autoconf/general.m4:2661: _AC_LINK_IFELSE is expanded from...
../../lib/autoconf/general.m4:2678: AC_LINK_IFELSE is expanded from...
configure.ac:422: the top level
configure.ac:422: warning: AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body
../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from...
../../lib/autoconf/general.m4:2661: _AC_LINK_IFELSE is expanded from...
../../lib/autoconf/general.m4:2678: AC_LINK_IFELSE is expanded from...
configure.ac:422: the top level
autoreconf: running: /net/also.us.oracle.com/export/alanc/autotools/install/bin/autoconf --force
configure.ac:422: warning: AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body
../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from...
../../lib/autoconf/general.m4:2661: _AC_LINK_IFELSE is expanded from...
../../lib/autoconf/general.m4:2678: AC_LINK_IFELSE is expanded from...
configure.ac:422: the top level
autoreconf: running: /net/also.us.oracle.com/export/alanc/autotools/install/bin/autoheader --force
configure.ac:422: warning: AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body
../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from...
../../lib/autoconf/general.m4:2661: _AC_LINK_IFELSE is expanded from...
../../lib/autoconf/general.m4:2678: AC_LINK_IFELSE is expanded from...
configure.ac:422: the top level
autoreconf: running: automake --add-missing --copy --force-missing
configure.ac:422: warning: AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body
../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from...
../../lib/autoconf/general.m4:2661: _AC_LINK_IFELSE is expanded from...
../../lib/autoconf/general.m4:2678: AC_LINK_IFELSE is expanded from...
configure.ac:422: the top level
Both seem to have been caused by a misplaced close paren/brace pair and are
fixed by:
--- a/configure.ac
+++ b/configure.ac
@@ -422,7 +422,7 @@ AC_MSG_CHECKING([whether $CC supports __attribute__((visibility))])
AC_LINK_IFELSE([AC_LANG_PROGRAM([
int foo_default( void ) __attribute__((visibility("default")));
int foo_hidden( void ) __attribute__((visibility("hidden")));
-], HAVE_ATTRIBUTE_VISIBILITY="yes"; AC_MSG_RESULT([yes]), AC_MSG_RESULT([no])]);
+])], [HAVE_ATTRIBUTE_VISIBILITY="yes"; AC_MSG_RESULT([yes])], AC_MSG_RESULT([no]));
if test "x$HAVE_ATTRIBUTE_VISIBILITY" = xyes; then
AC_DEFINE(HAVE_VISIBILITY, 1, [Compiler supports __attribute__((visibility))])
(Gotta love autoconf and the mysteries of proper [] placements.)
After that I can build on Solaris with patch #1 applied, but patch #2 then breaks
due to Solaris Studio 12.4 compilers being more pedantic about prototypes in headers
having the external visibility declarations too - lots of errors of the form:
"intel_bufmgr.c", line 60: redeclaration must have the same or more restrictive linker scoping: drm_intel_bo_alloc_for_render
It looks like none of the headers have the drm_public attributes the compiler wants
to see there.
> Additionally can you guys build libdrm (barring the patch you sent the
> other day), or you need some parts of this ancient patch
> http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/x11-libs/libdrm/files/libdrm-2.4.58-solaris.patch?view=markup
That looks very much like an ancient patch we still have in our tree [1] since
I never found out if we could upstream it or replace it from our former DRM
team. Unfortunately, they're all gone now - I've cc'ed the people who picked
up that work - I'd already asked Randy to look at it as part of the work he's
doing to reconcile our DRM sources with upstream.
[1] https://hg.java.net/hg/solaris-x11~x-s12-clone/file/4e6b5865e3ec/open-src/lib/libdrm/solaris-drm-port.patch
I keep a subset in my local git repo to enable building from upstream since the
raw upstream builds don't work without at least some of it. (See attached
patches for that subset.)
--
-Alan Coopersmith- alan.coopersmith at oracle.com
Oracle Solaris Engineering - http://blogs.oracle.com/alanc
-------------- next part --------------
From 2186cc5946085c4f6cf5c1191abf7518cbf5b1bb Mon Sep 17 00:00:00 2001
From: Alan Coopersmith <alan.coopersmith at sun.com>
Date: Tue, 17 Jun 2008 15:47:23 -0700
Subject: [PATCH:libdrm 1/2] Make data passed to ioctl's on Solaris match the
Solaris kernel DRI implementation
---
include/drm/drm.h | 13 +++++++++++++
xf86drm.c | 7 +++++++
2 files changed, 20 insertions(+)
diff --git a/include/drm/drm.h b/include/drm/drm.h
index 229a29f..ec96620 100644
--- a/include/drm/drm.h
+++ b/include/drm/drm.h
@@ -210,12 +210,22 @@ struct drm_ctx_priv_map {
* \sa drmAddMap().
*/
struct drm_map {
+#ifdef __sun
+ unsigned long long offset;
+ /**< Requested physical address (0 for SAREA)*/
+ unsigned long long handle;
+ /**< User-space: "Handle" to pass to mmap() */
+ /**< Kernel-space: kernel-virtual address */
+#else
unsigned long offset; /**< Requested physical address (0 for SAREA)*/
+#endif
unsigned long size; /**< Requested physical size (bytes) */
enum drm_map_type type; /**< Type of memory to map */
enum drm_map_flags flags; /**< Flags */
+#ifndef __sun
void *handle; /**< User-space: "Handle" to pass to mmap() */
/**< Kernel-space: kernel-virtual address */
+#endif
int mtrr; /**< MTRR slot used */
/* Private data */
};
@@ -379,6 +389,9 @@ struct drm_buf_map {
void *virtual; /**< Mmap'd area in user-virtual */
#endif
struct drm_buf_pub *list; /**< Buffer information */
+#ifdef __sun
+ int fd;
+#endif
};
/**
diff --git a/xf86drm.c b/xf86drm.c
index e73cddd..fc2c956 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -1096,7 +1096,11 @@ int drmRmMap(int fd, drm_handle_t handle)
drm_map_t map;
memclear(map);
+#ifdef __sun
+ map.handle = handle;
+#else
map.handle = (void *)(uintptr_t)handle;
+#endif
if(drmIoctl(fd, DRM_IOCTL_RM_MAP, &map))
return -errno;
@@ -1330,6 +1334,9 @@ drmBufMapPtr drmMapBufs(int fd)
int i;
memclear(bufs);
+#ifdef __sun
+ bufs.fd = fd;
+#endif
if (drmIoctl(fd, DRM_IOCTL_MAP_BUFS, &bufs))
return NULL;
--
1.7.9.2
-------------- next part --------------
From 21f07103c94b6df7a64b6f1dfe981f8b69e4bb52 Mon Sep 17 00:00:00 2001
From: Alan Coopersmith <alan.coopersmith at sun.com>
Date: Wed, 16 Dec 2009 14:57:54 -0800
Subject: [PATCH:libdrm 2/2] Add _IOC definition for Solaris/OpenSolaris
Signed-off-by: Alan Coopersmith <alan.coopersmith at sun.com>
---
xf86drm.h | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/xf86drm.h b/xf86drm.h
index 40c55c9..781c323 100644
--- a/xf86drm.h
+++ b/xf86drm.h
@@ -56,9 +56,17 @@ extern "C" {
#define DRM_IOC_READWRITE _IOC_READ|_IOC_WRITE
#define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size)
-#else /* One of the *BSDs */
+#else /* One of the *BSDs or Solaris */
#include <sys/ioccom.h>
+
+#if defined(__sun) && !defined(_IOC)
+#define _IOC(dir, group, nr, size) \
+ ((dir) == DRM_IOC_READWRITE ? _IOWRN((group), (nr), (size)) : \
+ ((dir) == DRM_IOC_WRITE ? _IOWN((group), (nr), (size)) : \
+ /* (dir) == DRM_IOC_READ */ _IORN((group), (nr), (size)) ))
+#endif
+
#define DRM_IOCTL_NR(n) ((n) & 0xff)
#define DRM_IOC_VOID IOC_VOID
#define DRM_IOC_READ IOC_OUT
--
1.7.9.2
More information about the dri-devel
mailing list