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 <vap...@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@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to