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