recent breakage on mips: hash.c?
cgd@broadcom.com
cgd@broadcom.com
Tue Jun 25 12:51:00 GMT 2002
At Fri, 21 Jun 2002 15:49:10 -0400, J. Johnston wrote:
> > > Looks like this would normally be defined by
> > > libc/include/sys/param.h because of __IEEE_{BIG,LITTLE}_ENDIAN.
> > >
> > > In turn, those are defined in one of:
> > >
> > > ./libc/include/machine/ieeefp.h
> > > ./libc/include/sys/config.h
> > >
> > > it looks like MIPS currently only has the macros defined in the
> > > former. The latter has the comment:
> [ ... ]
> > I have a patch which I am testing as we speak. I have placed a default setting in
> > sys/param.h based on whether sys/config.h sets BYTE_ORDER or not. The same default
> > setting goes in hash.h in libc/search. Both are protected. This seems to remove the
> > problem and avoid conflict with Cygwin that defines BYTE_ORDER or the other systems that
> > provide sys/param.h.
> >
> > I will repost when my testing is completed and the patch is applied.
> >
>
> Patches applied.
So, I just got a chance to look at this patch, and looked at the
related code some more.
yes, the generic param.h now defines BYTE_ORDER depending on whether
__IEEE_LITTLE_ENDIAN is defined, but, to my mind, there are some
issues:
(1) I'd still like to understand the need for duplication between
ieeefp.h and config.h to begin with... 8-)
(2) mips, in particular, seems to still need changes to sys/param.h to
have the right thing happen. (i.e., you fixed a problem, but it
wasn't the one I reported, and didn't give me a clue whether my
proposed solution to the original problem was correct.
(3) the change you made even further muddies the water when config.h
erroneously fails to set either of __IEEE_{BIG,LITTLE}_ENDIAN:
now, you get a setting which causes the code to compile (probably)
but may not be correct.
(4) I notice that the libc/search code checks for the define
_IEEE_LITTLE_ENDIAN (not one leaing underscore rather than 2!),
which doens't seem correct, esp. in light of the fact that
BYTE_ORDER is the "right thing" to use, right?
(5) the DB code (at least, if it's the same DB code I'm used to 8-)
uses values for BIG_ENDIAN and LITTLE_ENDIAN _in its on-disk data
structures_, and it's not good to have those differ from system to
system. It's not immediately clear to me whether any of the
libc/search bits will end up anyplace but in memory.
Based on those, I'd propose the following patch. I've not yet tested
it (in progress for mips-elf and a few others), but i'd like some
feedback on it anyway.
Specifically it does the following:
* addresses (2), (4).
* errors out instead of silently doing the possibly-wrong thing for
(3). Note that this will almost certainly break for sysvi386, but i
believe it was not previously correct: its param.h doesn't define
BYTE_ORDER, but the default for the hash code was big-endian... So,
now it'll actually error out rather than compiling w/ an
... unexpected setting.
* addresses (5) by renaming the byte-order-related constants that DB
uses, in order to preserve their intended uses.
cgd
==============================================================================
2002-06-25 Chris Demetriou <cgd@broadcom.com>
* libc/include/sys/config.h (__IEEE_LITTLE_ENDIAN)
(__IEEE_BIG_ENDIAN): Define appropriately for MIPS.
* libc/include/sys/param.h (BYTE_ORDER): If BYTE_ORDER is
not defined, verify that one of __IEEE_LITTLE_ENDIAN and
__IEEE_BIG_ENDIAN are set.
* libc/search/hash.h (DB_BYTE_ORDER, DB_BIG_ENDIAN)
(DB_LITTLE_ENDIAN): New defines.
* libc/search/hash.c: Replace all incorrect checks for
_IEEE_LITTLE_ENDIAN with tests of BYTE_ORDER, and all uses of
BYTE_ORDER, LITTLE_ENDIAN, and BIG_ENDIAN with DB_* versions.
* libc/search/hash_page.c: Likewise.
Index: libc/include/sys/config.h
===================================================================
RCS file: /cvs/src/src/newlib/libc/include/sys/config.h,v
retrieving revision 1.20
diff -u -p -r1.20 config.h
--- libc/include/sys/config.h 21 Jun 2002 18:40:48 -0000 1.20
+++ libc/include/sys/config.h 25 Jun 2002 19:41:02 -0000
@@ -82,6 +82,13 @@
#define __IEEE_LITTLE_ENDIAN
#endif
+#ifdef __MIPSEL__
+#define __IEEE_LITTLE_ENDIAN
+#endif
+#ifdef __MIPSEB__
+#define __IEEE_BIG_ENDIAN
+#endif
+
#ifdef __MMIX__
#define __IEEE_BIG_ENDIAN
#endif
Index: libc/include/sys/param.h
===================================================================
RCS file: /cvs/src/src/newlib/libc/include/sys/param.h,v
retrieving revision 1.3
diff -u -p -r1.3 param.h
--- libc/include/sys/param.h 21 Jun 2002 18:15:53 -0000 1.3
+++ libc/include/sys/param.h 25 Jun 2002 19:41:02 -0000
@@ -19,11 +19,18 @@
# define PATHSIZE (1024)
#ifndef BYTE_ORDER
+
+/* Check that sys/config.h defined the endianness for us. */
+#if !defined(__IEEE_BIG_ENDIAN) && !defined(__IEEE_LITTLE_ENDIAN)
+#error sys/config.h must define one of __IEEE_BIG_ENDIAN and __IEEE_LITTLE_ENDIAN
+#endif
+
#ifdef __IEEE_LITTLE_ENDIAN
#define BYTE_ORDER LITTLE_ENDIAN
#else
#define BYTE_ORDER BIG_ENDIAN
#endif
-#endif
+
+#endif /* BYTE_ORDER */
#endif
Index: libc/search/hash.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/search/hash.c,v
retrieving revision 1.2
diff -u -p -r1.2 hash.c
--- libc/search/hash.c 24 Jun 2002 23:05:08 -0000 1.2
+++ libc/search/hash.c 25 Jun 2002 19:41:03 -0000
@@ -72,7 +72,7 @@ static int hash_sync(const DB *, __uin
static int hdestroy(HTAB *);
static HTAB *init_hash(HTAB *, const char *, HASHINFO *);
static int init_htab(HTAB *, int);
-#ifdef _IEEE_LITTLE_ENDIAN
+#if (BYTE_ORDER == LITTLE_ENDIAN)
static void swap_header(HTAB *);
static void swap_header_copy(HASHHDR *, HASHHDR *);
#endif
@@ -156,7 +156,7 @@ __hash_open(file, flags, mode, info, dfl
hashp->hash = __default_hash;
hdrsize = read(hashp->fp, &hashp->hdr, sizeof(HASHHDR));
-#ifdef _IEEE_LITTLE_ENDIAN
+#if (BYTE_ORDER == LITTLE_ENDIAN)
swap_header(hashp);
#endif
if (hdrsize == -1)
@@ -299,7 +299,7 @@ init_hash(hashp, file, info)
nelem = 1;
hashp->NKEYS = 0;
- hashp->LORDER = BYTE_ORDER;
+ hashp->LORDER = DB_BYTE_ORDER;
hashp->BSIZE = DEF_BUCKET_SIZE;
hashp->BSHIFT = DEF_BUCKET_SHIFT;
hashp->SGSIZE = DEF_SEGSIZE;
@@ -335,8 +335,8 @@ init_hash(hashp, file, info)
if (info->nelem)
nelem = info->nelem;
if (info->lorder) {
- if (info->lorder != BIG_ENDIAN &&
- info->lorder != LITTLE_ENDIAN) {
+ if (info->lorder != DB_BIG_ENDIAN &&
+ info->lorder != DB_LITTLE_ENDIAN) {
errno = EINVAL;
return (NULL);
}
@@ -495,7 +495,7 @@ flush_meta(hashp)
HTAB *hashp;
{
HASHHDR *whdrp;
-#ifdef _IEEE_LITTLE_ENDIAN
+#if (BYTE_ORDER == LITTLE_ENDIAN)
HASHHDR whdr;
#endif
int fp, i, wsize;
@@ -508,7 +508,7 @@ flush_meta(hashp)
fp = hashp->fp;
whdrp = &hashp->hdr;
-#ifdef _IEEE_LITTLE_ENDIAN
+#if (BYTE_ORDER == LITTLE_ENDIAN)
whdrp = &whdr;
swap_header_copy(&hashp->hdr, whdrp);
#endif
@@ -941,7 +941,7 @@ alloc_segs(hashp, nsegs)
return (0);
}
-#ifdef _IEEE_LITTLE_ENDIAN
+#if (BYTE_ORDER == LITTLE_ENDIAN)
/*
* Hashp->hdr needs to be byteswapped.
*/
Index: libc/search/hash.h
===================================================================
RCS file: /cvs/src/src/newlib/libc/search/hash.h,v
retrieving revision 1.3
diff -u -p -r1.3 hash.h
--- libc/search/hash.h 21 Jun 2002 19:09:50 -0000 1.3
+++ libc/search/hash.h 25 Jun 2002 19:41:03 -0000
@@ -39,18 +39,18 @@
#include <sys/param.h>
+/* Check that newlib understands the byte order of its target system. */
#ifndef BYTE_ORDER
-#ifndef LITTLE_ENDIAN
-#define LITTLE_ENDIAN 1234
+#error BYTE_ORDER not defined by sys/param.h
#endif
-#ifndef BIG_ENDIAN
-#define BIG_ENDIAN 4321
-#endif
-#ifdef __IEEE_LITTLE_ENDIAN
-#define BYTE_ORDER LITTLE_ENDIAN
+
+/* Define DB endianness constants based on target endianness. */
+#define DB_LITTLE_ENDIAN 1234
+#define DB_BIG_ENDIAN 4321
+#if (BYTE_ORDER == LITTLE_ENDIAN)
+#define DB_BYTE_ORDER DB_LITTLE_ENDIAN
#else
-#define BYTE_ORDER BIG_ENDIAN
-#endif
+#define DB_BYTE_ORDER DB_BIG_ENDIAN
#endif
/* Operations */
Index: libc/search/hash_page.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/search/hash_page.c,v
retrieving revision 1.2
diff -u -p -r1.2 hash_page.c
--- libc/search/hash_page.c 24 Jun 2002 23:05:08 -0000 1.2
+++ libc/search/hash_page.c 25 Jun 2002 19:41:03 -0000
@@ -552,7 +552,7 @@ __get_page(hashp, p, bucket, is_bucket,
if (!is_bitmap && !bp[0]) {
PAGE_INIT(p);
} else
- if (hashp->LORDER != BYTE_ORDER) {
+ if (hashp->LORDER != DB_BYTE_ORDER) {
int i, max;
if (is_bitmap) {
@@ -591,7 +591,7 @@ __put_page(hashp, p, bucket, is_bucket,
return (-1);
fd = hashp->fp;
- if (hashp->LORDER != BYTE_ORDER) {
+ if (hashp->LORDER != DB_BYTE_ORDER) {
int i;
int max;
More information about the Newlib
mailing list