[Mesa-dev] Mesa (master): glapi: Add API that can create a _glapi_table from a dlfcn handle
Brian Paul
brianp at vmware.com
Tue Jun 14 17:19:38 PDT 2011
Still no go. You need to move the snprintf() calls after the variable
declarations.
-Brian
On 06/14/2011 01:33 PM, Jeremy Huddleston wrote:
> Hi Brian,
>
> Please give this change a try. It should clear up the gcc -pedantic warnings and also replaces the NULL entries with noops since that seems to be done in other tables as well (eg: indirect_init.c).
>
> Thanks,
> Jeremy
>
> diff --git a/src/mapi/glapi/gen/gl_gentable.py b/src/mapi/glapi/gen/gl_gentable.py
> index 73986f2..4420e3a 100644
> --- a/src/mapi/glapi/gen/gl_gentable.py
> +++ b/src/mapi/glapi/gen/gl_gentable.py
> @@ -34,6 +34,10 @@ import gl_XML, glX_XML
> import sys, getopt
>
> header = """
> +#if defined(DEBUG)&& !defined(_WIN32_WCE)
> +#include<execinfo.h>
> +#endif
> +
> #include<dlfcn.h>
> #include<stdlib.h>
> #include<stdio.h>
> @@ -43,6 +47,40 @@ header = """
> #include "glapi.h"
> #include "glapitable.h"
>
> +static void
> +__glapi_gentable_NoOp(void) {
> +#if defined(DEBUG)&& !defined(_WIN32_WCE)
> + if (getenv("MESA_DEBUG") || getenv("LIBGL_DEBUG")) {
> + const char *fstr = "Unknown";
> + void *frames[2];
> +
> + if(backtrace(frames, 2) == 2) {
> + Dl_info info;
> + dladdr(frames[1],&info);
> + if(info.dli_sname)
> + fstr = info.dli_sname;
> + }
> +
> + fprintf(stderr, "Call to unimplemented API: %s\\n", fstr);
> + }
> +#endif
> +}
> +
> +static void
> +__glapi_gentable_set_remaining_noop(struct _glapi_table *disp) {
> + GLuint entries = _glapi_get_dispatch_table_size();
> + void **dispatch = (void **) disp;
> + int i;
> +
> + /* ISO C is annoying sometimes */
> + union {_glapi_proc p; void *v;} p;
> + p.p = __glapi_gentable_NoOp;
> +
> + for(i=0; i< entries; i++)
> + if(dispatch[i] == NULL)
> + dispatch[i] = p.v;
> +}
> +
> struct _glapi_table *
> _glapi_create_table_from_handle(void *handle, const char *symbol_prefix) {
> struct _glapi_table *disp = calloc(1, sizeof(struct _glapi_table));
> @@ -56,6 +94,8 @@ _glapi_create_table_from_handle(void *handle, const char *symbol_prefix) {
> """
>
> footer = """
> + __glapi_gentable_set_remaining_noop(disp);
> +
> return disp;
> }
> """
> @@ -63,8 +103,8 @@ footer = """
> body_template = """
> if(!disp->%(name)s) {
> snprintf(symboln, sizeof(symboln), "%%s%(entry_point)s", symbol_prefix);
> - _glapi_proc *procp = (_glapi_proc *)&disp->%(name)s;
> - *procp = (_glapi_proc) dlsym(handle, symboln);
> + void ** procp = (void **)&disp->%(name)s;
> + *procp = dlsym(handle, symboln);
> }
> """
>
>
> On Jun 13, 2011, at 3:13 PM, Brian Paul wrote:
>
>> On 06/13/2011 03:53 PM, Jeremy Huddleston wrote:
>>> b44d13e67bfe81b2d7af4aeda2c3caf7f252bd0f should work for you. Thanks for letting me know.
>>
>> Another warning:
>>
>>
>> glapi_gentable.c: In function ‘_glapi_create_table_from_handle’:
>> glapi_gentable.c:54:9: warning: ISO C90 forbids mixed declarations and code
>> glapi_gentable.c:55:18: warning: ISO C forbids conversion of object pointer to f
>> unction pointer type
>> glapi_gentable.c:61:9: warning: ISO C90 forbids mixed declarations and code
>> glapi_gentable.c:62:18: warning: ISO C forbids conversion of object pointer to f
>> unction pointer type
>> glapi_gentable.c:68:9: warning: ISO C90 forbids mixed declarations and code
>> glapi_gentable.c:69:18: warning: ISO C forbids conversion of object pointer to f
>> unction pointer type
>>
>>
>> Need to put the _glapi_proc declaration first.
>>
>> -Brian
>>
>
More information about the mesa-dev
mailing list