gen_matypes: fix cross-compiling with gcc
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>
This commit is contained in:
committed by
Matt Turner
parent
a48be954ce
commit
73c9b4b0e0
@@ -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],
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 )
|
||||
|
||||
Reference in New Issue
Block a user