[Mesa-dev] [PATCH] gen_matypes: fix cross-compiling with gcc

Jose Fonseca jfonseca at vmware.com
Wed Feb 1 02:32:27 PST 2012


I'm not familiar with with autotools to comment on those bits, but I think this is a pretty neat idea.

This could be also when when cross compiling for windows w/ mingw.

Jose

----- Original Message -----
> The current gen_matypes logic assumes that the host compiler will
> produce
> information that is useful for the target compiler.  Unfortunately,
> this
> is not the case whenever cross-compiling.
> 
> When we detect that we're cross-compiling and using GCC, use the
> target
> compiler to produce assembly from the gen_matypes.c source, then
> process
> it with a shell script to create a usable header.  This is similar to
> how
> the linux kernel creates its asm-offsets.c file.
> 
> Signed-off-by: Mike Frysinger <vapier at gentoo.org>
> ---
> Note: please keep me on cc as i'm not subscribed
> 
>  configs/autoconf.in        |    2 ++
>  configure.ac               |    6 ++++++
>  src/mesa/x86/Makefile      |   18 +++++++++++++++---
>  src/mesa/x86/gen_matypes.c |   35
>  +++++++++++++++++++++++++++++------
>  4 files changed, 52 insertions(+), 9 deletions(-)
> 
> diff --git a/configs/autoconf.in b/configs/autoconf.in
> index bb8f2c3..4ad49ea 100644
> --- a/configs/autoconf.in
> +++ b/configs/autoconf.in
> @@ -213,3 +213,5 @@ ifneq ($(LLVM_VERSION),)
>  endif
>  
>  HAVE_XF86VIDMODE = @HAVE_XF86VIDMODE@
> +
> +GEN_ASM_OFFSETS = @GEN_ASM_OFFSETS@
> diff --git a/configure.ac b/configure.ac
> index 0e03af7..25c30d9 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -106,6 +106,7 @@ AC_MSG_RESULT([$acv_mesa_CLANG])
>  
>  dnl If we're using GCC, make sure that it is at least version 3.3.0.
>   Older
>  dnl versions are explictly not supported.
> +GEN_ASM_OFFSETS=no
>  if test "x$GCC" = xyes -a "x$acv_mesa_CLANG" = xno; then
>      AC_MSG_CHECKING([whether gcc version is sufficient])
>      major=0
> @@ -123,7 +124,12 @@ if test "x$GCC" = xyes -a "x$acv_mesa_CLANG" =
> xno; then
>      else
>          AC_MSG_RESULT([yes])
>      fi
> +
> +    if test "x$cross_compiling" = xyes; then
> +        GEN_ASM_OFFSETS=yes
> +    fi
>  fi
> +AC_SUBST([GEN_ASM_OFFSETS])
>  
>  
>  MKDEP_OPTIONS=-fdepend
> diff --git a/src/mesa/x86/Makefile b/src/mesa/x86/Makefile
> index 9716dc2..0dba5a2 100644
> --- a/src/mesa/x86/Makefile
> +++ b/src/mesa/x86/Makefile
> @@ -13,8 +13,7 @@ INCLUDE_DIRS = \
>  	-I../math \
>  	-I../tnl
>  
> -
> -default: gen_matypes matypes.h
> +default: matypes.h
>  
>  clean:
>  	-rm -f matypes.h gen_matypes
> @@ -24,9 +23,22 @@ gen_matypes: gen_matypes.c
>  	$(HOST_CC) $(ARCH_FLAGS) $(INCLUDE_DIRS) $(HOST_CFLAGS)
>  	gen_matypes.c -o gen_matypes
>  
>  # need some special rules here, unfortunately
> -matypes.h: ../main/mtypes.h ../tnl/t_context.h gen_matypes
> +matypes.h: ../main/mtypes.h ../tnl/t_context.h
> +
> +ifeq ($(GEN_ASM_OFFSETS),yes)
> +
> +matypes.h: gen_matypes.c
> +	$(CC) $(ARCH_FLAGS) $(INCLUDE_DIRS) $(CFLAGS) gen_matypes.c
> -DASM_OFFSETS -S -o - | \
> +		sed -n '/^->/{s:^->::;/[$$]/{s:^:#define :;s:[$$]::};p}' > $@
> +
> +else
> +
> +default: gen_matypes
> +matypes.h: gen_matypes
>  	./gen_matypes > matypes.h
>  
> +endif
> +
>  common_x86_asm.o: matypes.h
>  3dnow_normal.o: matypes.h
>  3dnow_xform1.o: matypes.h
> diff --git a/src/mesa/x86/gen_matypes.c b/src/mesa/x86/gen_matypes.c
> index 97f71f9..b359bb8 100644
> --- a/src/mesa/x86/gen_matypes.c
> +++ b/src/mesa/x86/gen_matypes.c
> @@ -52,7 +52,7 @@ do {									\
>     printf( "\n" );							\
>     printf( "/*
>     ====================================================="	\
>  	   "========\n" );						\
> -   printf( " * Offsets for %s\n", x );					\
> +   printf( " * Offsets for " x "\n" );					\
>     printf( " */\n" );							\
>     printf( "\n" );							\
>  } while (0)
> @@ -61,20 +61,43 @@ do {									\
>  do {									\
>     printf( "\n" );							\
>     printf( "/*\n" );							\
> -   printf( " * Flags for %s\n", x );					\
> +   printf( " * Flags for " x "\n" );					\
>     printf( " */\n" );							\
>     printf( "\n" );							\
>  } while (0)
>  
> -#define OFFSET( s, t, m )						\
> -   printf( "#define %s\t%lu\n", s, (unsigned long) offsetof( t, m )
> );
> +#ifdef ASM_OFFSETS
>  
> -#define SIZEOF( s, t )							\
> -   printf( "#define %s\t%lu\n", s, (unsigned long) sizeof(t) );
> +/*
> + * Format the asm output in a special way that we can manipulate
> + * after the fact and turn into the final header for the target.
> + */
> +
> +#define DEFINE_UL( s, ul )						\
> +   __asm__ __volatile__ ( "\n->" s " %0 " : : "i" (ul) )
> +
> +#define DEFINE( s, d )							\
> +   DEFINE_UL( s, d )
> +
> +#define printf( x )							\
> +   __asm__ __volatile__ ( "\n->" x )
> +
> +#else
> +
> +#define DEFINE_UL( s, ul )						\
> +   printf( "#define %s\t%lu\n", s, (unsigned long) (ul) );
>  
>  #define DEFINE( s, d )							\
>     printf( "#define %s\t0x%" PRIx64 "\n", s, (uint64_t) d );
>  
> +#endif
> +
> +#define OFFSET( s, t, m )						\
> +   DEFINE_UL( s, offsetof( t, m ) )
> +
> +#define SIZEOF( s, t )							\
> +   DEFINE_UL( s, sizeof(t) )
> +
>  
>  
>  int main( int argc, char **argv )
> --
> 1.7.8.4
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 


More information about the mesa-dev mailing list