[commit: integer-gmp] master: integer-gmp: improve cross-compiling support GmpDerivedConstants.h (860f2fa)
Simon Marlow
marlowsd at gmail.com
Fri Jan 25 09:56:54 CET 2013
Repository : ssh://darcs.haskell.org//srv/darcs/packages/integer-gmp
On branch : master
http://hackage.haskell.org/trac/ghc/changeset/860f2fa9a1f1ca4f8d94388723687f90d122ae81
>---------------------------------------------------------------
commit 860f2fa9a1f1ca4f8d94388723687f90d122ae81
Author: Sergei Trofimovich <slyfox at gentoo.org>
Date: Thu Jan 24 01:36:21 2013 +0300
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 at gentoo.org>
>---------------------------------------------------------------
.gitignore | 1 -
cbits/GmpDerivedConstants.h.in | 10 +++++
cbits/mkGmpDerivedConstants.c | 74 ----------------------------------------
configure.ac | 28 +++++++++++++--
gmp/ghc.mk | 8 ----
5 files changed, 34 insertions(+), 87 deletions(-)
diff --git a/.gitignore b/.gitignore
index 012224d..56857e9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,4 +8,3 @@ ghc.mk
gmp/config.mk
integer-gmp.buildinfo
cbits/GmpDerivedConstants.h
-cbits/mkGmpDerivedConstants
diff --git a/cbits/GmpDerivedConstants.h.in b/cbits/GmpDerivedConstants.h.in
new file mode 100644
index 0000000..241372f
--- /dev/null
+++ b/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 at 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 at 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 at 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/cbits/mkGmpDerivedConstants.c b/cbits/mkGmpDerivedConstants.c
deleted file mode 100644
index ed07111..0000000
--- a/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/configure.ac b/configure.ac
index d7c0b3e..c99f988 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,8 +1,5 @@
AC_INIT([Haskell integer (GMP)], [0.1], [libraries at 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/gmp/ghc.mk b/gmp/ghc.mk
index b39f36a..78c6683 100644
--- a/gmp/ghc.mk
+++ b/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
More information about the ghc-commits
mailing list