From nobody@FreeBSD.org  Sat Jun  9 21:07:53 2012
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
	by hub.freebsd.org (Postfix) with ESMTP id 2C7801065740
	for <freebsd-gnats-submit@FreeBSD.org>; Sat,  9 Jun 2012 21:07:53 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from red.freebsd.org (red.freebsd.org [IPv6:2001:4f8:fff6::22])
	by mx1.freebsd.org (Postfix) with ESMTP id 173048FC14
	for <freebsd-gnats-submit@FreeBSD.org>; Sat,  9 Jun 2012 21:07:53 +0000 (UTC)
Received: from red.freebsd.org (localhost [127.0.0.1])
	by red.freebsd.org (8.14.4/8.14.4) with ESMTP id q59L7qp2012111
	for <freebsd-gnats-submit@FreeBSD.org>; Sat, 9 Jun 2012 21:07:52 GMT
	(envelope-from nobody@red.freebsd.org)
Received: (from nobody@localhost)
	by red.freebsd.org (8.14.4/8.14.4/Submit) id q59L7qPL012110;
	Sat, 9 Jun 2012 21:07:52 GMT
	(envelope-from nobody)
Message-Id: <201206092107.q59L7qPL012110@red.freebsd.org>
Date: Sat, 9 Jun 2012 21:07:52 GMT
From: Dimitry Andric <dim@FreeBSD.org>
To: freebsd-gnats-submit@FreeBSD.org
Subject: Make graphics/libGL compile with clang (using WITH_NEW_XORG)
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         168902
>Category:       ports
>Synopsis:       Make graphics/libGL compile with clang (using WITH_NEW_XORG)
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-x11
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat Jun 09 21:10:15 UTC 2012
>Closed-Date:    Sun Jun 10 05:48:01 UTC 2012
>Last-Modified:  Sun Jun 10 05:50:10 UTC 2012
>Originator:     Dimitry Andric
>Release:        10.0-CURRENT
>Organization:
The FreeBSD Project
>Environment:
FreeBSD vm-dvs-dimtest1.home.andric.com 10.0-CURRENT FreeBSD 10.0-CURRENT #0 r236300: Wed May 30 15:02:23 CEST 2012     dim@vm-dvs-dimtest1.home.andric.com:/usr/obj/usr/src/sys/GENERIC  i386
>Description:
As described in <http://docs.freebsd.org/cgi/mid.cgi?4F9BC101.8090305>,
recent versions of MesaLib can't be compiled with clang, due to its use
of nested functions.

This has already been fixed in Mesa upstream, specifically in
<http://cgit.freedesktop.org/mesa/mesa/commit/?id=4aa1ac5fe94b5696095229ee3568bf4fa7cfed95>,
but this has not yet been put into the 8.0.3 release.

>How-To-Repeat:
WITH_NEW_XORG=yo CC=clang CXX=clang++ make -C /usr/ports/graphics/dri
(or any other graphics/libGL dependent port)

>Fix:
See attached diff, which applies the upstream fix to our port.


Patch attached with submission follows:

Index: graphics/libGL/bsd.mesalib.mk
===================================================================
RCS file: /home/mirror/ncvs/ports/graphics/libGL/bsd.mesalib.mk,v
retrieving revision 1.19
diff -u -r1.19 bsd.mesalib.mk
--- graphics/libGL/bsd.mesalib.mk	21 Apr 2012 17:03:16 -0000	1.19
+++ graphics/libGL/bsd.mesalib.mk	28 Apr 2012 16:49:02 -0000
@@ -55,7 +55,9 @@
 .if defined(WITH_NEW_XORG)
 EXTRA_PATCHES+=	${PATCHDIR}/extra-mach64_context.h \
 		${PATCHDIR}/extra-sis_context.h \
-		${PATCHDIR}/extra-src-glsl_ir_constant_expression.cpp
+		${PATCHDIR}/extra-src-glsl_ir_constant_expression.cpp \
+		${PATCHDIR}/extra-src__mesa__drivers__dri__nouveau__nouveau_array.c \
+		${PATCHDIR}/extra-src__mesa__drivers__dri__nouveau__nouveau_render_t.c
 .else
 EXTRA_PATCHES+=	${PATCHDIR}/extra-src__mesa__x86-64__glapi_x86-64.S \
 		${PATCHDIR}/extra-src__mesa__x86-64__xform4.S \
Index: graphics/libGL/files/extra-src__mesa__drivers__dri__nouveau__nouveau_array.c
===================================================================
RCS file: graphics/libGL/files/extra-src__mesa__drivers__dri__nouveau__nouveau_array.c
diff -N graphics/libGL/files/extra-src__mesa__drivers__dri__nouveau__nouveau_array.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ graphics/libGL/files/extra-src__mesa__drivers__dri__nouveau__nouveau_array.c	28 Apr 2012 16:49:02 -0000
@@ -0,0 +1,99 @@
+--- src/mesa/drivers/dri/nouveau/nouveau_array.c.orig	2011-01-06 01:19:15.000000000 +0100
++++ src/mesa/drivers/dri/nouveau/nouveau_array.c	2012-04-28 18:27:06.000000000 +0200
+@@ -29,54 +29,71 @@
+ #include "nouveau_array.h"
+ #include "nouveau_bufferobj.h"
+ 
++#define EXTRACT(in_t, out_t) extract_func_##in_t##_to_##out_t
++
++#define EXTRACT_FUNC(in_t, out_t, k)			\
++static out_t EXTRACT(in_t, out_t)			\
++(struct nouveau_array *a, int i, int j) {		\
++	in_t x = ((in_t *)(a->buf + i * a->stride))[j];	\
++							\
++	return (out_t)x / (k);				\
++}
++
++EXTRACT_FUNC(GLchar, unsigned, 1);
++EXTRACT_FUNC(GLchar, float, SCHAR_MAX);
++EXTRACT_FUNC(GLubyte, unsigned, 1);
++EXTRACT_FUNC(GLubyte, float, UCHAR_MAX);
++EXTRACT_FUNC(GLshort, unsigned, 1);
++EXTRACT_FUNC(GLshort, float, SHRT_MAX);
++EXTRACT_FUNC(GLushort, unsigned, 1);
++EXTRACT_FUNC(GLushort, float, USHRT_MAX);
++EXTRACT_FUNC(GLint, unsigned, 1);
++EXTRACT_FUNC(GLint, float, INT_MAX);
++EXTRACT_FUNC(GLuint, unsigned, 1);
++EXTRACT_FUNC(GLuint, float, UINT_MAX);
++EXTRACT_FUNC(GLfloat, unsigned, 1.0 / UINT_MAX);
++EXTRACT_FUNC(GLfloat, float, 1);
++
++#undef EXTRACT_FUNC
++
+ static void
+ get_array_extract(struct nouveau_array *a, extract_u_t *extract_u,
+ 		  extract_f_t *extract_f)
+ {
+-#define EXTRACT(in_t, out_t, k)						\
+-	({								\
+-		auto out_t f(struct nouveau_array *, int, int);		\
+-		out_t f(struct nouveau_array *a, int i, int j) {	\
+-			in_t x = ((in_t *)(a->buf + i * a->stride))[j];	\
+-									\
+-			return (out_t)x / (k);				\
+-		};							\
+-		f;							\
+-	});
+-
+ 	switch (a->type) {
+ 	case GL_BYTE:
+-		*extract_u = EXTRACT(char, unsigned, 1);
+-		*extract_f = EXTRACT(char, float, SCHAR_MAX);
++		*extract_u = EXTRACT(GLchar, unsigned);
++		*extract_f = EXTRACT(GLchar, float);
+ 		break;
+ 	case GL_UNSIGNED_BYTE:
+-		*extract_u = EXTRACT(unsigned char, unsigned, 1);
+-		*extract_f = EXTRACT(unsigned char, float, UCHAR_MAX);
++		*extract_u = EXTRACT(GLubyte, unsigned);
++		*extract_f = EXTRACT(GLubyte, float);
+ 		break;
+ 	case GL_SHORT:
+-		*extract_u = EXTRACT(short, unsigned, 1);
+-		*extract_f = EXTRACT(short, float, SHRT_MAX);
++		*extract_u = EXTRACT(GLshort, unsigned);
++		*extract_f = EXTRACT(GLshort, float);
+ 		break;
+ 	case GL_UNSIGNED_SHORT:
+-		*extract_u = EXTRACT(unsigned short, unsigned, 1);
+-		*extract_f = EXTRACT(unsigned short, float, USHRT_MAX);
++		*extract_u = EXTRACT(GLushort, unsigned);
++		*extract_f = EXTRACT(GLushort, float);
+ 		break;
+ 	case GL_INT:
+-		*extract_u = EXTRACT(int, unsigned, 1);
+-		*extract_f = EXTRACT(int, float, INT_MAX);
++		*extract_u = EXTRACT(GLint, unsigned);
++		*extract_f = EXTRACT(GLint, float);
+ 		break;
+ 	case GL_UNSIGNED_INT:
+-		*extract_u = EXTRACT(unsigned int, unsigned, 1);
+-		*extract_f = EXTRACT(unsigned int, float, UINT_MAX);
++		*extract_u = EXTRACT(GLuint, unsigned);
++		*extract_f = EXTRACT(GLuint, float);
+ 		break;
+ 	case GL_FLOAT:
+-		*extract_u = EXTRACT(float, unsigned, 1.0 / UINT_MAX);
+-		*extract_f = EXTRACT(float, float, 1);
++		*extract_u = EXTRACT(GLfloat, unsigned);
++		*extract_f = EXTRACT(GLfloat, float);
+ 		break;
+ 	default:
+ 		assert(0);
+ 	}
+ }
++#undef EXTRACT
+ 
+ void
+ nouveau_init_array(struct nouveau_array *a, int attr, int stride,
Index: graphics/libGL/files/extra-src__mesa__drivers__dri__nouveau__nouveau_render_t.c
===================================================================
RCS file: graphics/libGL/files/extra-src__mesa__drivers__dri__nouveau__nouveau_render_t.c
diff -N graphics/libGL/files/extra-src__mesa__drivers__dri__nouveau__nouveau_render_t.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ graphics/libGL/files/extra-src__mesa__drivers__dri__nouveau__nouveau_render_t.c	28 Apr 2012 16:49:02 -0000
@@ -0,0 +1,91 @@
+--- src/mesa/drivers/dri/nouveau/nouveau_render_t.c.orig	2011-01-06 01:19:34.000000000 +0100
++++ src/mesa/drivers/dri/nouveau/nouveau_render_t.c	2012-04-28 18:27:06.000000000 +0200
+@@ -97,52 +97,49 @@
+ 		}							\
+ 	} while (0)
+ 
+-/*
+- * Select an appropriate dispatch function for the given index buffer.
+- */
+-static dispatch_t
+-get_array_dispatch(struct nouveau_array *a)
++static void
++dispatch_l(struct gl_context *ctx, unsigned int start, int delta,
++	   unsigned int n)
+ {
+-	if (!a->fields) {
+-		auto void f(struct gl_context *, unsigned int, int, unsigned int);
+-
+-		void f(struct gl_context *ctx, unsigned int start, int delta,
+-		       unsigned int n) {
+-			struct nouveau_channel *chan = context_chan(ctx);
+-			RENDER_LOCALS(ctx);
++	struct nouveau_channel *chan = context_chan(ctx);
++	RENDER_LOCALS(ctx);
+ 
+-			EMIT_VBO(L, ctx, start, delta, n);
+-		};
+-
+-		return f;
+-
+-	} else if (a->type == GL_UNSIGNED_INT) {
+-		auto void f(struct gl_context *, unsigned int, int, unsigned int);
+-
+-		void f(struct gl_context *ctx, unsigned int start, int delta,
+-		       unsigned int n) {
+-			struct nouveau_channel *chan = context_chan(ctx);
+-			RENDER_LOCALS(ctx);
++	EMIT_VBO(L, ctx, start, delta, n);
++}
+ 
+-			EMIT_VBO(I32, ctx, start, delta, n);
+-		};
++static void
++dispatch_i32(struct gl_context *ctx, unsigned int start, int delta,
++	     unsigned int n)
++{
++	struct nouveau_channel *chan = context_chan(ctx);
++	RENDER_LOCALS(ctx);
+ 
+-		return f;
++	EMIT_VBO(I32, ctx, start, delta, n);
++}
+ 
+-	} else {
+-		auto void f(struct gl_context *, unsigned int, int, unsigned int);
++static void
++dispatch_i16(struct gl_context *ctx, unsigned int start, int delta,
++	     unsigned int n)
++{
++	struct nouveau_channel *chan = context_chan(ctx);
++	RENDER_LOCALS(ctx);
+ 
+-		void f(struct gl_context *ctx, unsigned int start, int delta,
+-		       unsigned int n) {
+-			struct nouveau_channel *chan = context_chan(ctx);
+-			RENDER_LOCALS(ctx);
+-
+-			EMIT_VBO(I32, ctx, start, delta, n & 1);
+-			EMIT_VBO(I16, ctx, start, delta, n & ~1);
+-		};
++	EMIT_VBO(I32, ctx, start, delta, n & 1);
++	EMIT_VBO(I16, ctx, start, delta, n & ~1);
++}
+ 
+-		return f;
+-	}
++/*
++ * Select an appropriate dispatch function for the given index buffer.
++ */
++static dispatch_t
++get_array_dispatch(struct nouveau_array *a)
++{
++	if (!a->fields)
++		return dispatch_l;
++	else if (a->type == GL_UNSIGNED_INT)
++		return dispatch_i32;
++	else
++		return dispatch_i16;
+ }
+ 
+ /*


>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-ports-bugs->freebsd-x11 
Responsible-Changed-By: edwin 
Responsible-Changed-When: Sat Jun 9 23:41:59 UTC 2012 
Responsible-Changed-Why:  
Over to maintainer (via the GNATS Auto Assign Tool) 

http://www.freebsd.org/cgi/query-pr.cgi?pr=168902 
State-Changed-From-To: open->closed 
State-Changed-By: miwi 
State-Changed-When: Sun Jun 10 05:48:00 UTC 2012 
State-Changed-Why:  
thanks committed. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=168902 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: ports/168902: commit references a PR
Date: Sun, 10 Jun 2012 05:47:57 +0000 (UTC)

 miwi        2012-06-10 05:47:43 UTC
 
   FreeBSD ports repository
 
   Modified files:
     graphics/libGL       bsd.mesalib.mk 
   Added files:
     graphics/libGL/files 
                          extra-src__mesa__drivers__dri__nouveau__nouveau_array.c 
                          extra-src__mesa__drivers__dri__nouveau__nouveau_render_t.c 
   Log:
   - Unbreak build with clang
   
   PR:             168902
   Submitted by:   dim@
   Tested by:      O. Hartmann" <ohartman@zedat.fu-berlin.de>
   
   Revision  Changes    Path
   1.20      +4 -2      ports/graphics/libGL/bsd.mesalib.mk
   1.1       +99 -0     ports/graphics/libGL/files/extra-src__mesa__drivers__dri__nouveau__nouveau_array.c (new)
   1.1       +91 -0     ports/graphics/libGL/files/extra-src__mesa__drivers__dri__nouveau__nouveau_render_t.c (new)
 _______________________________________________
 cvs-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/cvs-all
 To unsubscribe, send any mail to "cvs-all-unsubscribe@freebsd.org"
 
>Unformatted:
