patches/glibc/2.9/210-2.9-strlen-hack.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jan 17 23:06:02 2010 +0100 (2010-01-17)
changeset 1740 c57458bb354d
parent 1201 c9967a6e3b25
permissions -rw-r--r--
configure: do not require hg when configuring in an hg clone

When configuring in an hg clone, we need hg to compute the version string.
It can happen that users do not have Mercurial (eg. if they got a snapshot
rather that they did a full clone). In this case, we can still run, of
course, so simply fill the version string with a sufficiently explicit
value, that does not require hg. The date is a good candidate.
yann@1201
     1
Original patch from: gentoo/src/patchsets/glibc/2.9/1020_all_glibc-2.9-strlen-hack.patch
yann@1201
     2
yann@1201
     3
-= BEGIN original header =-
yann@1201
     4
http://sourceware.org/bugzilla/show_bug.cgi?id=5807
yann@1201
     5
http://www.cl.cam.ac.uk/~am21/progtricks.html
yann@1201
     6
yann@1201
     7
-= END original header =-
yann@1201
     8
yann@1201
     9
diff -durN glibc-2_9.orig/string/strlen.c glibc-2_9/string/strlen.c
yann@1201
    10
--- glibc-2_9.orig/string/strlen.c	2005-12-14 12:09:07.000000000 +0100
yann@1201
    11
+++ glibc-2_9/string/strlen.c	2009-02-02 22:00:51.000000000 +0100
yann@1201
    12
@@ -32,7 +32,7 @@
yann@1201
    13
 {
yann@1201
    14
   const char *char_ptr;
yann@1201
    15
   const unsigned long int *longword_ptr;
yann@1201
    16
-  unsigned long int longword, magic_bits, himagic, lomagic;
yann@1201
    17
+  unsigned long int longword, himagic, lomagic;
yann@1201
    18
 
yann@1201
    19
   /* Handle the first few characters by reading one character at a time.
yann@1201
    20
      Do this until CHAR_PTR is aligned on a longword boundary.  */
yann@1201
    21
@@ -42,28 +42,14 @@
yann@1201
    22
     if (*char_ptr == '\0')
yann@1201
    23
       return char_ptr - str;
yann@1201
    24
 
yann@1201
    25
-  /* All these elucidatory comments refer to 4-byte longwords,
yann@1201
    26
-     but the theory applies equally well to 8-byte longwords.  */
yann@1201
    27
-
yann@1201
    28
   longword_ptr = (unsigned long int *) char_ptr;
yann@1201
    29
 
yann@1201
    30
-  /* Bits 31, 24, 16, and 8 of this number are zero.  Call these bits
yann@1201
    31
-     the "holes."  Note that there is a hole just to the left of
yann@1201
    32
-     each byte, with an extra at the end:
yann@1201
    33
-
yann@1201
    34
-     bits:  01111110 11111110 11111110 11111111
yann@1201
    35
-     bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD
yann@1201
    36
-
yann@1201
    37
-     The 1-bits make sure that carries propagate to the next 0-bit.
yann@1201
    38
-     The 0-bits provide holes for carries to fall into.  */
yann@1201
    39
-  magic_bits = 0x7efefeffL;
yann@1201
    40
   himagic = 0x80808080L;
yann@1201
    41
   lomagic = 0x01010101L;
yann@1201
    42
   if (sizeof (longword) > 4)
yann@1201
    43
     {
yann@1201
    44
       /* 64-bit version of the magic.  */
yann@1201
    45
       /* Do the shift in two steps to avoid a warning if long has 32 bits.  */
yann@1201
    46
-      magic_bits = ((0x7efefefeL << 16) << 16) | 0xfefefeffL;
yann@1201
    47
       himagic = ((himagic << 16) << 16) | himagic;
yann@1201
    48
       lomagic = ((lomagic << 16) << 16) | lomagic;
yann@1201
    49
     }
yann@1201
    50
@@ -75,56 +61,12 @@
yann@1201
    51
      if *any of the four* bytes in the longword in question are zero.  */
yann@1201
    52
   for (;;)
yann@1201
    53
     {
yann@1201
    54
-      /* We tentatively exit the loop if adding MAGIC_BITS to
yann@1201
    55
-	 LONGWORD fails to change any of the hole bits of LONGWORD.
yann@1201
    56
-
yann@1201
    57
-	 1) Is this safe?  Will it catch all the zero bytes?
yann@1201
    58
-	 Suppose there is a byte with all zeros.  Any carry bits
yann@1201
    59
-	 propagating from its left will fall into the hole at its
yann@1201
    60
-	 least significant bit and stop.  Since there will be no
yann@1201
    61
-	 carry from its most significant bit, the LSB of the
yann@1201
    62
-	 byte to the left will be unchanged, and the zero will be
yann@1201
    63
-	 detected.
yann@1201
    64
-
yann@1201
    65
-	 2) Is this worthwhile?  Will it ignore everything except
yann@1201
    66
-	 zero bytes?  Suppose every byte of LONGWORD has a bit set
yann@1201
    67
-	 somewhere.  There will be a carry into bit 8.  If bit 8
yann@1201
    68
-	 is set, this will carry into bit 16.  If bit 8 is clear,
yann@1201
    69
-	 one of bits 9-15 must be set, so there will be a carry
yann@1201
    70
-	 into bit 16.  Similarly, there will be a carry into bit
yann@1201
    71
-	 24.  If one of bits 24-30 is set, there will be a carry
yann@1201
    72
-	 into bit 31, so all of the hole bits will be changed.
yann@1201
    73
-
yann@1201
    74
-	 The one misfire occurs when bits 24-30 are clear and bit
yann@1201
    75
-	 31 is set; in this case, the hole at bit 31 is not
yann@1201
    76
-	 changed.  If we had access to the processor carry flag,
yann@1201
    77
-	 we could close this loophole by putting the fourth hole
yann@1201
    78
-	 at bit 32!
yann@1201
    79
-
yann@1201
    80
-	 So it ignores everything except 128's, when they're aligned
yann@1201
    81
-	 properly.  */
yann@1201
    82
-
yann@1201
    83
       longword = *longword_ptr++;
yann@1201
    84
 
yann@1201
    85
-      if (
yann@1201
    86
-#if 0
yann@1201
    87
-	  /* Add MAGIC_BITS to LONGWORD.  */
yann@1201
    88
-	  (((longword + magic_bits)
yann@1201
    89
-
yann@1201
    90
-	    /* Set those bits that were unchanged by the addition.  */
yann@1201
    91
-	    ^ ~longword)
yann@1201
    92
-
yann@1201
    93
-	   /* Look at only the hole bits.  If any of the hole bits
yann@1201
    94
-	      are unchanged, most likely one of the bytes was a
yann@1201
    95
-	      zero.  */
yann@1201
    96
-	   & ~magic_bits)
yann@1201
    97
-#else
yann@1201
    98
-	  ((longword - lomagic) & himagic)
yann@1201
    99
-#endif
yann@1201
   100
-	  != 0)
yann@1201
   101
+      /* This hack taken from Alan Mycroft's HAKMEMC postings.
yann@1201
   102
+         See: http://www.cl.cam.ac.uk/~am21/progtricks.html */
yann@1201
   103
+      if (((longword - lomagic) & ~longword & himagic) != 0)
yann@1201
   104
 	{
yann@1201
   105
-	  /* Which of the bytes was the zero?  If none of them were, it was
yann@1201
   106
-	     a misfire; continue the search.  */
yann@1201
   107
 
yann@1201
   108
 	  const char *cp = (const char *) (longword_ptr - 1);
yann@1201
   109