From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20503 invoked by alias); 2 Dec 2004 17:53:05 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 20335 invoked from network); 2 Dec 2004 17:52:53 -0000 Received: from unknown (HELO krynn.se.axis.com) (212.209.10.221) by sourceware.org with SMTP; 2 Dec 2004 17:52:53 -0000 Received: from ignucius.se.axis.com (ignucius.se.axis.com [10.83.5.18]) by krynn.se.axis.com (8.12.9/8.12.9/Debian-5local0.1) with ESMTP id iB2HqqAD020095; Thu, 2 Dec 2004 18:52:52 +0100 Received: from ignucius.se.axis.com (localhost [127.0.0.1]) by ignucius.se.axis.com (8.12.8p1/8.12.8/Debian-2woody1) with ESMTP id iB2HqpdD004664; Thu, 2 Dec 2004 18:52:52 +0100 Received: (from hp@localhost) by ignucius.se.axis.com (8.12.8p1/8.12.8/Debian-2woody1) id iB2Hqppc004660; Thu, 2 Dec 2004 18:52:51 +0100 Date: Thu, 02 Dec 2004 17:53:00 -0000 Message-Id: <200412021752.iB2Hqppc004660@ignucius.se.axis.com> From: Hans-Peter Nilsson To: gdb-patches@sources.redhat.com Subject: sim/common/callback.c: autoconf tests for struct stat members, more added. X-SW-Source: 2004-12/txt/msg00046.txt.bz2 I have a need for more of the GNU/Linux struct stat members. At the same time, it looked like adding them would plausibly break some non-GNU/Linux hosts, which I guess is the reason there were only two st_ino and st_dev present in cb_host_to_target_stat. All would have been *much* simpler if sim/common used a modern autoconf (with AC_CHECK_MEMBERS), because then I wouldn't have to translate that macro into something that works with autoconf-2.13. Pain. :-( Arguably some st_* members possibly don't translate very well to a simulated environment, but that's up to the user of the simulator to decide. Regrettably, I did not find a way to make the cb_host_to_target_stat more agreeable to the eye. Tested by observing that a few more of my C-based simulator tests (developed without the st_* #ifdefs) now pass, and testing that configuring a non-present struct stat member works. Ok to commit? sim/common: * configure.in (SIM_CHECK_MEMBERS): Call for struct stat members st_dev, st_ino, st_mode, st_nlink, st_uid, st_gid, st_rdev, st_size, st_blksize, st_blocks, st_atime, st_mtime and st_ctime. * aclocal.m4 (SIM_CHECK_MEMBER, SIM_CHECK_MEMBERS_1) (SIM_CHECK_MEMBERS): New macros. * callback.c (cb_host_to_target_stat): Use temporary macro ST_x for struct stat member test and write. Add ST_x calls for each struct stat member tested in configure.in. Wrap each ST_x call in #ifdef of configure macro for that member. * configure, config.in: Regenerate. Index: configure.in =================================================================== RCS file: /cvs/src/src/sim/common/configure.in,v retrieving revision 1.2 diff -c -p -r1.2 configure.in *** configure.in 20 Mar 2001 17:13:39 -0000 1.2 --- configure.in 2 Dec 2004 17:21:08 -0000 *************** AC_SUBST(TARGET_SUBDIR) *** 36,41 **** # These aren't all needed yet, but will be eventually. AC_CHECK_HEADERS(stdlib.h string.h strings.h time.h sys/times.h sys/stat.h sys/mman.h) AC_CHECK_FUNCS(mmap munmap) ! AC_OUTPUT(Makefile, [case x$CONFIG_HEADERS in xcconfig.h:config.in) echo > stamp-h ;; esac]) --- 36,45 ---- # These aren't all needed yet, but will be eventually. AC_CHECK_HEADERS(stdlib.h string.h strings.h time.h sys/times.h sys/stat.h sys/mman.h) AC_CHECK_FUNCS(mmap munmap) ! SIM_CHECK_MEMBERS([[struct stat.st_dev], [struct stat.st_ino], ! [struct stat.st_mode], [struct stat.st_nlink], [struct stat.st_uid], ! [struct stat.st_gid], [struct stat.st_rdev], [struct stat.st_size], ! [struct stat.st_blksize], [struct stat.st_blocks], [struct stat.st_atime], ! [struct stat.st_mtime], [struct stat.st_ctime]]) AC_OUTPUT(Makefile, [case x$CONFIG_HEADERS in xcconfig.h:config.in) echo > stamp-h ;; esac]) Index: callback.c =================================================================== RCS file: /cvs/src/src/sim/common/callback.c,v retrieving revision 1.10 diff -c -p -r1.10 callback.c *** callback.c 27 Jun 2004 03:14:51 -0000 1.10 --- callback.c 2 Dec 2004 17:49:41 -0000 *************** cb_host_to_target_stat (cb, hs, ts) *** 816,825 **** if (hs != NULL) { ! if (strncmp (m, "st_dev", q - m) == 0) ! store (p, size, hs->st_dev, big_p); ! else if (strncmp (m, "st_ino", q - m) == 0) ! store (p, size, hs->st_ino, big_p); /* FIXME:wip */ else store (p, size, 0, big_p); /* unsupported field, store 0 */ --- 816,869 ---- if (hs != NULL) { ! if (1) ! ; ! /* Defined here to avoid emacs indigestion on a lone "else". */ ! #undef ST_x ! #define ST_x(FLD) \ ! else if (strncmp (m, #FLD, q - m) == 0) \ ! store (p, size, hs->FLD, big_p) ! ! #ifdef HAVE_STRUCT_STAT_ST_DEV ! ST_x (st_dev); ! #endif ! #ifdef HAVE_STRUCT_STAT_ST_INO ! ST_x (st_ino); ! #endif ! #ifdef HAVE_STRUCT_STAT_ST_MODE ! ST_x (st_mode); ! #endif ! #ifdef HAVE_STRUCT_STAT_ST_NLINK ! ST_x (st_nlink); ! #endif ! #ifdef HAVE_STRUCT_STAT_ST_UID ! ST_x (st_uid); ! #endif ! #ifdef HAVE_STRUCT_STAT_ST_GID ! ST_x (st_gid); ! #endif ! #ifdef HAVE_STRUCT_STAT_ST_RDEV ! ST_x (st_rdev); ! #endif ! #ifdef HAVE_STRUCT_STAT_ST_SIZE ! ST_x (st_size); ! #endif ! #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE ! ST_x (st_blksize); ! #endif ! #ifdef HAVE_STRUCT_STAT_ST_BLOCKS ! ST_x (st_blocks); ! #endif ! #ifdef HAVE_STRUCT_STAT_ST_ATIME ! ST_x (st_atime); ! #endif ! #ifdef HAVE_STRUCT_STAT_ST_MTIME ! ST_x (st_mtime); ! #endif ! #ifdef HAVE_STRUCT_STAT_ST_CTIME ! ST_x (st_ctime); ! #endif ! #undef ST_x /* FIXME:wip */ else store (p, size, 0, big_p); /* unsupported field, store 0 */ Index: aclocal.m4 =================================================================== RCS file: /cvs/src/src/sim/common/aclocal.m4,v retrieving revision 1.5 diff -c -p -r1.5 aclocal.m4 *** aclocal.m4 16 Jun 2002 16:33:12 -0000 1.5 --- aclocal.m4 2 Dec 2004 17:21:07 -0000 *************** AC_SUBST(CGEN_MAINT) *** 1257,1259 **** --- 1257,1327 ---- AC_SUBST(cgendir) AC_SUBST(cgen) ]) + dnl FIXME: When upgrading to modern autoconf, remove + dnl SIM_CHECK_MEMBER and SIM_CHECK_MEMBERS et al and use + dnl AC_CHECK_MEMBERS from autoconf. + dnl + dnl Translated from a FC2 autoconf-2.59-3 installation. + dnl AC_CHECK_MEMBER(AGGREGATE.MEMBER, + dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], + dnl [INCLUDES]) + dnl + dnl --------------------------------------------------------- + dnl AGGREGATE.MEMBER is for instance `struct passwd.pw_gecos', shell + dnl variables are not a valid argument. + AC_DEFUN([SIM_CHECK_MEMBER], + dnl Extract the aggregate name, and the member name + [AC_CACHE_CHECK([for $1], [ac_]patsubst([$1], [[\. ]], [_]), + [ac_]patsubst([$1], [[\. ]], [_])[=no;] + AC_TRY_COMPILE([$4],[ + dnl AGGREGATE ac_aggr; + static ]patsubst([$1], [\..*])[ ac_aggr; + dnl ac_aggr.MEMBER; + if (ac_aggr.]patsubst([$1], [^[^.]*\.])[) + return 0;],[ac_]patsubst([$1], [[\. ]], [_])[=yes;], + AC_TRY_COMPILE([$4],[ + dnl AGGREGATE ac_aggr; + static ]patsubst([$1], [\..*])[ ac_aggr; + dnl ac_aggr.MEMBER; + if (sizeof ac_aggr.]patsubst([$1], [^[^.]*\.])[) + return 0;], + [ac_]patsubst([$1], [[\. ]], [_])[=yes;], + [ac_]patsubst([$1], [[\. ]], [_])[=no;])) + [if test [$]ac_]patsubst([$1], [[\. ]], [_])[ = yes; then :; [$2] + else :; [$3] + fi]) + ])dnl SIM_CHECK_MEMBER + dnl + dnl Translated from a FC2 autoconf-2.59-3 installation. + dnl SIM_CHECK_MEMBERS([AGGREGATE.MEMBER, ...]) + dnl except we just work with a limited set of fixed includes. + dnl + AC_DEFUN([SIM_CHECK_MEMBERS_1], + [ifelse($#, 1, + [SIM_CHECK_MEMBER([$1], + AC_DEFINE_UNQUOTED([HAVE_]translit([$1], [a-z .], [A-Z__]), 1, + [Define to 1 if ]patsubst([$1], + [^[^.]*\.])[ is a member of ]patsubst([$1], [\..*])[. ]),, + [#ifdef HAVE_SYS_TYPES_H + #include + #endif + #ifdef HAVE_SYS_STAT_H + #include + #endif])], + [SIM_CHECK_MEMBER([$1], + AC_DEFINE_UNQUOTED([HAVE_]translit([$1], [a-z .], [A-Z__]), 1, + [Define to 1 if ]patsubst([$1], + [^[^.]*\.])[ is a member of ]patsubst([$1], [\..*])[. ]),, + [#ifdef HAVE_SYS_TYPES_H + #include + #endif + #ifdef HAVE_SYS_STAT_H + #include + #endif]) + SIM_CHECK_MEMBERS_1(builtin(shift,$@))])])dnl SIM_CHECK_MEMBERS + dnl + AC_DEFUN([SIM_CHECK_MEMBERS], + [ifelse($#, 1, [SIM_CHECK_MEMBERS_1($1)], + [errprint(__file__:__line__: + [This SIM_CHECK_MEMBERS only supports one argument,] + [the list of struct tests])])])dnl SIM_CHECK_MEMBERS brgds, H-P