diff options
| author | Sergei Trofimovich <slyfox@gentoo.org> | 2013-01-24 01:36:21 +0300 |
|---|---|---|
| committer | Simon Marlow <marlowsd@gmail.com> | 2013-01-24 09:21:43 +0000 |
| commit | 52f554582339d14c28a3cc91385f9cb0343f6779 (patch) | |
| tree | bb681698fe18e8cb4d851a461f517a3c099d80c7 | |
| parent | d0a0ca7869627de50a08998e1336ab39168913ec (diff) | |
| download | haskell-52f554582339d14c28a3cc91385f9cb0343f6779.tar.gz | |
integer-gmp: improve cross-compiling support GmpDerivedConstants.h
Before the patch GmpDerivedConstants.h was generated
by running mkGmpDerivedConstants on target.
Now it's generated only with help of autoconf macros.
Tested on --target=ia64-unknown-linux-gnu.
Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
| -rw-r--r-- | libraries/integer-gmp/.gitignore | 1 | ||||
| -rw-r--r-- | libraries/integer-gmp/cbits/GmpDerivedConstants.h.in | 10 | ||||
| -rw-r--r-- | libraries/integer-gmp/cbits/mkGmpDerivedConstants.c | 74 | ||||
| -rw-r--r-- | libraries/integer-gmp/configure.ac | 28 | ||||
| -rw-r--r-- | libraries/integer-gmp/gmp/ghc.mk | 8 |
5 files changed, 34 insertions, 87 deletions
diff --git a/libraries/integer-gmp/.gitignore b/libraries/integer-gmp/.gitignore index 012224d539..56857e958e 100644 --- a/libraries/integer-gmp/.gitignore +++ b/libraries/integer-gmp/.gitignore @@ -8,4 +8,3 @@ ghc.mk gmp/config.mk integer-gmp.buildinfo cbits/GmpDerivedConstants.h -cbits/mkGmpDerivedConstants diff --git a/libraries/integer-gmp/cbits/GmpDerivedConstants.h.in b/libraries/integer-gmp/cbits/GmpDerivedConstants.h.in new file mode 100644 index 0000000000..241372f10d --- /dev/null +++ b/libraries/integer-gmp/cbits/GmpDerivedConstants.h.in @@ -0,0 +1,10 @@ +#define SIZEOF_MP_INT @SIZEOF_MP_INT@ +#define OFFSET_MP_INT__mp_alloc @OFFSET_MP_INT__mp_alloc@ +#define REP_MP_INT__mp_alloc b@REP_MP_INT__mp_alloc@ +#define MP_INT__mp_alloc(__ptr__) REP_MP_INT__mp_alloc[__ptr__+OFFSET_MP_INT__mp_alloc] +#define OFFSET_MP_INT__mp_size @OFFSET_MP_INT__mp_size@ +#define REP_MP_INT__mp_size b@REP_MP_INT__mp_size@ +#define MP_INT__mp_size(__ptr__) REP_MP_INT__mp_size[__ptr__+OFFSET_MP_INT__mp_size] +#define OFFSET_MP_INT__mp_d @OFFSET_MP_INT__mp_d@ +#define REP_MP_INT__mp_d b@REP_MP_INT__mp_d@ +#define MP_INT__mp_d(__ptr__) REP_MP_INT__mp_d[__ptr__+OFFSET_MP_INT__mp_d] diff --git a/libraries/integer-gmp/cbits/mkGmpDerivedConstants.c b/libraries/integer-gmp/cbits/mkGmpDerivedConstants.c deleted file mode 100644 index ed07111e06..0000000000 --- a/libraries/integer-gmp/cbits/mkGmpDerivedConstants.c +++ /dev/null @@ -1,74 +0,0 @@ -/* -------------------------------------------------------------------------- - * - * (c) The GHC Team, 1992-2004 - * - * mkDerivedConstants.c - * - * Basically this is a C program that extracts information from the C - * declarations in the header files (primarily struct field offsets) - * and generates a header file that can be #included into non-C source - * containing this information. - * - * ------------------------------------------------------------------------*/ - -#include <stdio.h> -#include "gmp.h" - - -#define str(a,b) #a "_" #b - -#define OFFSET(s_type, field) ((size_t)&(((s_type*)0)->field)) - -/* struct_size(TYPE) - * - */ -#define def_size(str, size) \ - printf("#define SIZEOF_" str " %lu\n", (unsigned long)size); - -#define struct_size(s_type) \ - def_size(#s_type, sizeof(s_type)); - - - -/* struct_field(TYPE, FIELD) - * - */ -#define def_offset(str, offset) \ - printf("#define OFFSET_" str " %d\n", (int)(offset)); - -#define field_offset_(str, s_type, field) \ - def_offset(str, OFFSET(s_type,field)); - -#define field_offset(s_type, field) \ - field_offset_(str(s_type,field),s_type,field); - -#define field_type_(str, s_type, field) \ - printf("#define REP_" str " b"); \ - printf("%lu\n", (unsigned long)sizeof (__typeof__(((((s_type*)0)->field)))) * 8); - -#define field_type(s_type, field) \ - field_type_(str(s_type,field),s_type,field); - -/* An access macro for use in C-- sources. */ -#define struct_field_macro(str) \ - printf("#define " str "(__ptr__) REP_" str "[__ptr__+OFFSET_" str "]\n"); - -/* Outputs the byte offset and MachRep for a field */ -#define struct_field(s_type, field) \ - field_offset(s_type, field); \ - field_type(s_type, field); \ - struct_field_macro(str(s_type,field)) - - -int -main(int argc, char *argv[]) -{ - printf("/* This file is created automatically. Do not edit by hand.*/\n\n"); - - struct_size(MP_INT); - struct_field(MP_INT,_mp_alloc); - struct_field(MP_INT,_mp_size); - struct_field(MP_INT,_mp_d); - - return 0; -} diff --git a/libraries/integer-gmp/configure.ac b/libraries/integer-gmp/configure.ac index d7c0b3e9ac..c99f9883e6 100644 --- a/libraries/integer-gmp/configure.ac +++ b/libraries/integer-gmp/configure.ac @@ -1,8 +1,5 @@ AC_INIT([Haskell integer (GMP)], [0.1], [libraries@haskell.org], [integer]) -# Safety check: Ensure that we are in the correct source directory. -AC_CONFIG_SRCDIR([cbits/mkGmpDerivedConstants.c]) - AC_CANONICAL_TARGET AC_ARG_WITH([cc], @@ -66,7 +63,30 @@ AC_SUBST(GMP_FRAMEWORK) AC_SUBST(HaveLibGmp) AC_SUBST(HaveFrameworkGMP) -AC_CONFIG_FILES([integer-gmp.buildinfo gmp/config.mk]) +dnl GMP_INT_TO_CONST(int_expr, var_name) +AC_DEFUN([GMP_INT_TO_VAR], +[ + AC_MSG_CHECKING([for $1 size]) + AC_COMPUTE_INT([$2], [$1],[[#include <stdio.h> +#include <stddef.h> +#include "gmp.h" + +#define FIELD_OFFSET(s_type, field) offsetof(s_type, field) +#define FIELD_SIZE_BITS(s_type, field) (unsigned long)sizeof (__typeof__(((((s_type*)0)->field)))) * 8 +]], AC_MSG_ERROR([Failed to compute size of $1])) + AC_MSG_RESULT($$2) + AC_SUBST($2) +]) + +GMP_INT_TO_VAR([[sizeof (MP_INT)]], [SIZEOF_MP_INT]) +GMP_INT_TO_VAR([[FIELD_OFFSET(MP_INT,_mp_alloc)]], [OFFSET_MP_INT__mp_alloc]) +GMP_INT_TO_VAR([[FIELD_SIZE_BITS(MP_INT,_mp_alloc)]], [REP_MP_INT__mp_alloc]) +GMP_INT_TO_VAR([[FIELD_OFFSET(MP_INT,_mp_size)]], [OFFSET_MP_INT__mp_size]) +GMP_INT_TO_VAR([[FIELD_SIZE_BITS(MP_INT,_mp_size)]], [REP_MP_INT__mp_size]) +GMP_INT_TO_VAR([[FIELD_OFFSET(MP_INT,_mp_d)]], [OFFSET_MP_INT__mp_d]) +GMP_INT_TO_VAR([[FIELD_SIZE_BITS(MP_INT,_mp_d)]], [REP_MP_INT__mp_d]) + +AC_CONFIG_FILES([integer-gmp.buildinfo gmp/config.mk cbits/GmpDerivedConstants.h]) dnl-------------------------------------------------------------------- dnl * Generate the header cbits/GmpDerivedConstants.h diff --git a/libraries/integer-gmp/gmp/ghc.mk b/libraries/integer-gmp/gmp/ghc.mk index b39f36afdf..78c6683936 100644 --- a/libraries/integer-gmp/gmp/ghc.mk +++ b/libraries/integer-gmp/gmp/ghc.mk @@ -46,12 +46,6 @@ endif libraries/integer-gmp_CC_OPTS += $(addprefix -I,$(GMP_INCLUDE_DIRS)) libraries/integer-gmp_CC_OPTS += $(addprefix -L,$(GMP_LIB_DIRS)) -libraries/integer-gmp/cbits/mkGmpDerivedConstants$(exeext): libraries/integer-gmp/cbits/mkGmpDerivedConstants.c - "$(CC_STAGE1)" $(SRC_CC_OPTS) $(CONF_CC_OPTS_STAGE1) $(libraries/integer-gmp_CC_OPTS) $< -o $@ - -libraries/integer-gmp/cbits/GmpDerivedConstants.h: libraries/integer-gmp/cbits/mkGmpDerivedConstants$(exeext) - $< > $@ - # Compile GMP only if we don't have it already # # We use GMP's own configuration stuff, because it's all rather hairy @@ -86,8 +80,6 @@ ifneq "$(HaveLibGmp)" "YES" ifneq "$(HaveFrameworkGMP)" "YES" $(libraries/integer-gmp_dist-install_depfile_c_asm): libraries/integer-gmp/gmp/gmp.h -libraries/integer-gmp/cbits/mkGmpDerivedConstants$(exeext): libraries/integer-gmp/gmp/gmp.h - libraries/integer-gmp_CC_OPTS += -I$(TOP)/libraries/integer-gmp/gmp libraries/integer-gmp_dist-install_EXTRA_OBJS += libraries/integer-gmp/gmp/objs/*.o |
