gen_matypes: fix cross-compiling with gcc
authorMike Frysinger <vapier@gentoo.org>
Tue, 5 Feb 2013 02:27:40 +0000 (21:27 -0500)
committerMatt Turner <mattst88@gmail.com>
Thu, 18 Jul 2013 20:55:48 +0000 (13:55 -0700)
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.

Reviewed-by: Matt Turner <mattst88@gmail.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
configure.ac
src/mesa/x86-64/Makefile.am
src/mesa/x86/Makefile.am
src/mesa/x86/gen_matypes.c

index 3de0066cd96092d3d3d61ea21e611e129b5f9461..35f6797eed64c1de1a9e5ce5a4feb079876f8402 100644 (file)
@@ -100,6 +100,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
@@ -117,7 +118,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
+AM_CONDITIONAL([GEN_ASM_OFFSETS], test "x$GEN_ASM_OFFSETS" = xyes)
 
 dnl Make sure the pkg-config macros are defined
 m4_ifndef([PKG_PROG_PKG_CONFIG],
index 80e791784ec52101b2b398d7c3f83fddddc244c0..b62387d66a0265c4589e622971c907c21ee98f58 100644 (file)
@@ -33,7 +33,17 @@ gen_matypes_SOURCES = ../x86/gen_matypes.c
 BUILT_SOURCES = matypes.h
 CLEANFILES = matypes.h
 
+if GEN_ASM_OFFSETS
+
+matypes.h: $(gen_matypes_SOURCES)
+       $(AM_V_GEN)$(COMPILE) $< -DASM_OFFSETS -S -o - | \
+               sed -n '/^->/{s:^->::;/[$$]/{s:^:#define :;s:[$$]::};p}' > $@
+
+else
+
 matypes.h: gen_matypes
        $(AM_V_GEN)./gen_matypes > $@
 
 endif
+
+endif
index 21ce3607ae5f7514b0a96787db35177011b957e0..167857684b126bbcb8af7cb3d8e5948f6a39b1dd 100644 (file)
@@ -33,7 +33,17 @@ gen_matypes_SOURCES = gen_matypes.c
 BUILT_SOURCES = matypes.h
 CLEANFILES = matypes.h
 
+if GEN_ASM_OFFSETS
+
+matypes.h: $(gen_matypes_SOURCES)
+       $(AM_V_GEN)$(COMPILE) $< -DASM_OFFSETS -S -o - | \
+               sed -n '/^->/{s:^->::;/[$$]/{s:^:#define :;s:[$$]::};p}' > $@
+
+else
+
 matypes.h: gen_matypes
        $(AM_V_GEN)./gen_matypes > $@
 
 endif
+
+endif
index 80ee61aa89134b2d958b377d03a4786ece833aac..1e904aa0b1370876b857bdf034254f1a293ca7c8 100644 (file)
@@ -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 )