public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* strxxx and gcc-3.4
@ 2004-02-13 23:40 J.A. Magallon
  2004-02-14  0:27 ` Valdis.Kletnieks
  2004-02-17 15:25 ` Maciej W. Rozycki
  0 siblings, 2 replies; 3+ messages in thread
From: J.A. Magallon @ 2004-02-13 23:40 UTC (permalink / raw)
  To: Lista Linux-Kernel

Hi all...

Finally I got the problem with emu10k1. It was a sprintf->strcpy that
the compiler could not inline. And out-of-line strcpy was not exported.
Exporting it solved the problem (in -mm tree, that has the out-of-line
versions).

Current situation: even -mm, that includes many fixes for gcc-3.4, can
fail to build. Currently in 2.6.3-rc2-mm1 there are:

werewolf:/usr/src/linux-2.6.3-rc2-mm1# grep -r sprintf * | grep \"%s\" | wc -l
63

instances of that stupid sprintf(s,"%s", .... ) thing.

Options:
- Fix all of them. I don't like it, the kernel should not depend on what
  gcc does internally
- Use -fno-builtin-sprintf. I think gcc swaps sprintf to strcpy because
  it sees it as a builtin, but as finds a declaration for an external
  strcpy does not use the builtin for strcpy.
- Kill off all str/mem functions and just let gcc insert builtins.

  info for gcc-3.3 says:

   The ISO C90 functions `abs', `cos', `exp', `fabs', `fprintf',
`fputs', `labs', `log', `memcmp', `memcpy', `memset', `printf',
`putchar', `puts', `scanf', `sin', `snprintf', `sprintf', `sqrt',
`sscanf', `strcat', `strchr', `strcmp', `strcpy', `strcspn', `strlen',
`strncat', `strncmp', `strncpy', `strpbrk', `strrchr', `strspn',
`strstr', `vprintf' and `vsprintf' are all recognized as built-in
functions unless `-fno-builtin' is specified (or
`-fno-builtin-FUNCTION' is specified for an individual function).  All
of these functions have corresponding versions prefixed with
`__builtin_'.

  info for gcc-3.4

   The ISO C90 functions `abort', `abs', `acos', `asin', `atan2',
`atan', `calloc', `ceil', `cosh', `cos', `exit', `exp', `fabs',
`floor', `fmod', `fprintf', `fputs', `frexp', `fscanf', `labs',
`ldexp', `log10', `log', `malloc', `memcmp', `memcpy', `memset',
`modf', `pow', `printf', `putchar', `puts', `scanf', `sinh', `sin',
`snprintf', `sprintf', `sqrt', `sscanf', `strcat', `strchr', `strcmp',
`strcpy', `strcspn', `strlen', `strncat', `strncmp', `strncpy',
`strpbrk', `strrchr', `strspn', `strstr', `tanh', `tan', `vfprintf',
`vprintf' and `vsprintf' are all recognized as built-in functions unless
`-fno-builtin' is specified (or `-fno-builtin-FUNCTION' is specified
for an individual function).  All of these functions have corresponding
versions prefixed with `__builtin_'.

So at least the common interesting things are
 `memcmp', `memcpy', `memset'
 `strcat', `strchr', `strcmp', `strcpy', `strcspn', `strlen',
 `strncat', `strncmp', `strncpy', `strpbrk', `strrchr', `strspn', `strstr', 
 `sprintf', `snprintf', `sscanf', `vsprintf'

Preferences ?

-- 
J.A. Magallon <jamagallon()able!es>     \                 Software is like sex:
werewolf!able!es                         \           It's better when it's free
Mandrake Linux release 10.0 (RC1) for i586
Linux 2.6.3-rc2-jam1 (gcc 3.4.0 (Mandrake Linux 10.0 3.4.0-0.1mdk))

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: strxxx and gcc-3.4
  2004-02-13 23:40 strxxx and gcc-3.4 J.A. Magallon
@ 2004-02-14  0:27 ` Valdis.Kletnieks
  2004-02-17 15:25 ` Maciej W. Rozycki
  1 sibling, 0 replies; 3+ messages in thread
From: Valdis.Kletnieks @ 2004-02-14  0:27 UTC (permalink / raw)
  To: J.A. Magallon; +Cc: Lista Linux-Kernel

On Sat, 14 Feb 2004 00:40:28 +0100, "J.A. Magallon" <jamagallon@able.es>  said:

> So at least the common interesting things are
>  `memcmp', `memcpy', `memset'
>  `strcat', `strchr', `strcmp', `strcpy', `strcspn', `strlen',
>  `strncat', `strncmp', `strncpy', `strpbrk', `strrchr', `strspn', `strstr', 
>  `sprintf', `snprintf', `sscanf', `vsprintf'
> 
> Preferences ?

How you feel about this?  EXPORT_SYMBOL() added.  Also, the whole
thing with #ifdef/#undef/#endif is needed, otherwise you end up doing
the EXPORT_SYMBOL on __builtin_foo instead of foo.

lib/vsprintf.c could probably use the same treatment....

--- linux-2.6.3-rc2-mm1/lib/string.c.orig	2004-02-12 14:18:28.000000000 -0500
+++ linux-2.6.3-rc2-mm1/lib/string.c	2004-02-13 19:22:18.093457913 -0500
@@ -27,6 +27,9 @@
 #include <linux/module.h>
 
 #ifndef __HAVE_ARCH_STRNICMP
+#ifdef strnicmp
+#undef strnicmp
+#endif
 /**
  * strnicmp - Case insensitive, length-limited string comparison
  * @s1: One string
@@ -62,6 +65,9 @@
 #endif
 
 #ifndef __HAVE_ARCH_STRCPY
+#ifdef strcpy
+#undef strcpy
+#endif
 /**
  * strcpy - Copy a %NUL terminated string
  * @dest: Where to copy the string to
@@ -75,9 +81,13 @@
 		/* nothing */;
 	return tmp;
 }
+EXPORT_SYMBOL(strcpy);
 #endif
 
 #ifndef __HAVE_ARCH_STRNCPY
+#ifdef strncpy
+#undef strncpy
+#endif
 /**
  * strncpy - Copy a length-limited, %NUL-terminated string
  * @dest: Where to copy the string to
@@ -98,9 +108,13 @@
 	}
 	return dest;
 }
+EXPORT_SYMBOL(strncpy);
 #endif
 
 #ifndef __HAVE_ARCH_STRLCPY
+#ifdef strlcpy
+#undef strlcpy
+#endif
 /**
  * strlcpy - Copy a %NUL terminated string into a sized buffer
  * @dest: Where to copy the string to
@@ -127,6 +141,9 @@
 #endif
 
 #ifndef __HAVE_ARCH_STRCAT
+#ifdef strcat
+#undef strcat
+#endif
 /**
  * strcat - Append one %NUL-terminated string to another
  * @dest: The string to be appended to
@@ -143,9 +160,13 @@
 
 	return tmp;
 }
+EXPORT_SYMBOL(strcat);
 #endif
 
 #ifndef __HAVE_ARCH_STRNCAT
+#ifdef strncat
+#undef strncat
+#endif
 /**
  * strncat - Append a length-limited, %NUL-terminated string to another
  * @dest: The string to be appended to
@@ -172,9 +193,13 @@
 
 	return tmp;
 }
+EXPORT_SYMBOL(strncat);
 #endif
 
 #ifndef __HAVE_ARCH_STRLCAT
+#ifdef strlcat
+#undef strlcat
+#endif
 /**
  * strlcat - Append a length-limited, %NUL-terminated string to another
  * @dest: The string to be appended to
@@ -202,6 +227,9 @@
 #endif
 
 #ifndef __HAVE_ARCH_STRCMP
+#ifdef strcmp
+#undef strcmp
+#endif
 /**
  * strcmp - Compare two strings
  * @cs: One string
@@ -218,9 +246,13 @@
 
 	return __res;
 }
+EXPORT_SYMBOL(strcmp);
 #endif
 
 #ifndef __HAVE_ARCH_STRNCMP
+#ifdef strncmp
+#undef strncmp
+#endif
 /**
  * strncmp - Compare two length-limited strings
  * @cs: One string
@@ -239,9 +271,13 @@
 
 	return __res;
 }
+EXPORT_SYMBOL(strncmp);
 #endif
 
 #ifndef __HAVE_ARCH_STRCHR
+#ifdef strchr
+#undef strchr
+#endif
 /**
  * strchr - Find the first occurrence of a character in a string
  * @s: The string to be searched
@@ -254,9 +290,13 @@
 			return NULL;
 	return (char *) s;
 }
+EXPORT_SYMBOL(strchr);
 #endif
 
 #ifndef __HAVE_ARCH_STRRCHR
+#ifdef strrchr
+#undef strrchr
+#endif
 /**
  * strrchr - Find the last occurrence of a character in a string
  * @s: The string to be searched
@@ -271,9 +311,13 @@
        } while (--p >= s);
        return NULL;
 }
+EXPORT_SYMBOL(strrchr);
 #endif
 
 #ifndef __HAVE_ARCH_STRNCHR
+#ifdef strnchr
+#undef strnchr
+#endif
 /**
  * strnchr - Find a character in a length limited string
  * @s: The string to be searched
@@ -287,9 +331,13 @@
 			return (char *) s;
 	return NULL;
 }
+EXPORT_SYMBOL(strnchr);
 #endif
 
 #ifndef __HAVE_ARCH_STRLEN
+#ifdef strlen
+#undef strlen
+#endif
 /**
  * strlen - Find the length of a string
  * @s: The string to be sized
@@ -302,9 +350,13 @@
 		/* nothing */;
 	return sc - s;
 }
+EXPORT_SYMBOL(strlen);
 #endif
 
 #ifndef __HAVE_ARCH_STRNLEN
+#ifdef strnlen
+#undef strnlen
+#endif
 /**
  * strnlen - Find the length of a length-limited string
  * @s: The string to be sized
@@ -318,9 +370,13 @@
 		/* nothing */;
 	return sc - s;
 }
+EXPORT_SYMBOL(strnlen);
 #endif
 
 #ifndef __HAVE_ARCH_STRSPN
+#ifdef strspn
+#undef strspn
+#endif
 /**
  * strspn - Calculate the length of the initial substring of @s which only
  * 	contain letters in @accept
@@ -349,6 +405,9 @@
 EXPORT_SYMBOL(strspn);
 #endif
 
+#ifdef strcspn
+#undef strcspn
+#endif
 /**
  * strcspn - Calculate the length of the initial substring of @s which does
  * 	not contain letters in @reject
@@ -371,8 +430,12 @@
 
 	return count;
 }	
+EXPORT_SYMBOL(strcspn);
 
 #ifndef __HAVE_ARCH_STRPBRK
+#ifdef strpbrk
+#undef strpbrk
+#endif
 /**
  * strpbrk - Find the first occurrence of a set of characters
  * @cs: The string to be searched
@@ -390,9 +453,13 @@
 	}
 	return NULL;
 }
+EXPORT_SYMBOL(strpbrk);
 #endif
 
 #ifndef __HAVE_ARCH_STRSEP
+#ifdef strsep
+#undef strsep
+#endif
 /**
  * strsep - Split a string into tokens
  * @s: The string to be searched
@@ -423,6 +490,9 @@
 #endif
 
 #ifndef __HAVE_ARCH_MEMSET
+#ifdef memset
+#undef memset
+#endif
 /**
  * memset - Fill a region of memory with the given value
  * @s: Pointer to the start of the area.
@@ -440,9 +510,13 @@
 
 	return s;
 }
+EXPORT_SYMBOL(memset);
 #endif
 
 #ifndef __HAVE_ARCH_BCOPY
+#ifdef bcopy
+#undef bcopy
+#endif
 /**
  * bcopy - Copy one area of memory to another
  * @src: Where to copy from
@@ -463,9 +537,13 @@
 	while (count--)
 		*dest++ = *src++;
 }
+EXPORT_SYMBOL(bcopy);
 #endif
 
 #ifndef __HAVE_ARCH_MEMCPY
+#ifdef memcpy
+#undef memcpy
+#endif
 /**
  * memcpy - Copy one area of memory to another
  * @dest: Where to copy to
@@ -484,9 +562,13 @@
 
 	return dest;
 }
+EXPORT_SYMBOL(memcpy);
 #endif
 
 #ifndef __HAVE_ARCH_MEMMOVE
+#ifdef memmove
+#undef memmove
+#endif
 /**
  * memmove - Copy one area of memory to another
  * @dest: Where to copy to
@@ -514,9 +596,13 @@
 
 	return dest;
 }
+EXPORT_SYMBOL(memmove);
 #endif
 
 #ifndef __HAVE_ARCH_MEMCMP
+#ifdef memcmp
+#undef memcmp
+#endif
 /**
  * memcmp - Compare two areas of memory
  * @cs: One area of memory
@@ -533,9 +619,13 @@
 			break;
 	return res;
 }
+EXPORT_SYMBOL(memcmp);
 #endif
 
 #ifndef __HAVE_ARCH_MEMSCAN
+#ifdef memscan
+#undef memscan
+#endif
 /**
  * memscan - Find a character in an area of memory.
  * @addr: The memory area
@@ -557,9 +647,13 @@
 	}
   	return (void *) p;
 }
+EXPORT_SYMBOL(memscan);
 #endif
 
 #ifndef __HAVE_ARCH_STRSTR
+#ifdef strstr
+#undef strstr
+#endif
 /**
  * strstr - Find the first substring in a %NUL terminated string
  * @s1: The string to be searched
@@ -581,9 +675,13 @@
 	}
 	return NULL;
 }
+EXPORT_SYMBOL(strstr);
 #endif
 
 #ifndef __HAVE_ARCH_MEMCHR
+#ifdef memchr
+#undef memchr
+#endif
 /**
  * memchr - Find a character in an area of memory.
  * @s: The memory area
@@ -603,5 +701,6 @@
 	}
 	return NULL;
 }
+EXPORT_SYMBOL(memchr);
 
 #endif


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: strxxx and gcc-3.4
  2004-02-13 23:40 strxxx and gcc-3.4 J.A. Magallon
  2004-02-14  0:27 ` Valdis.Kletnieks
@ 2004-02-17 15:25 ` Maciej W. Rozycki
  1 sibling, 0 replies; 3+ messages in thread
From: Maciej W. Rozycki @ 2004-02-17 15:25 UTC (permalink / raw)
  To: J.A. Magallon; +Cc: Lista Linux-Kernel

On Sat, 14 Feb 2004, J.A. Magallon wrote:

> Finally I got the problem with emu10k1. It was a sprintf->strcpy that
> the compiler could not inline. And out-of-line strcpy was not exported.
> Exporting it solved the problem (in -mm tree, that has the out-of-line
> versions).
> 
> Current situation: even -mm, that includes many fixes for gcc-3.4, can
> fail to build. Currently in 2.6.3-rc2-mm1 there are:
> 
> werewolf:/usr/src/linux-2.6.3-rc2-mm1# grep -r sprintf * | grep \"%s\" | wc -l
> 63
> 
> instances of that stupid sprintf(s,"%s", .... ) thing.
> 
> Options:
> - Fix all of them. I don't like it, the kernel should not depend on what
>   gcc does internally
> - Use -fno-builtin-sprintf. I think gcc swaps sprintf to strcpy because
>   it sees it as a builtin, but as finds a declaration for an external
>   strcpy does not use the builtin for strcpy.
> - Kill off all str/mem functions and just let gcc insert builtins.
[...]
> Preferences ?

 Fix gcc before it's released.  Has the problem been reported?  I've
hesitated to do that as I use an outdated gcc 3.4 snapshot (from the
pre-branch times) and I've assumed it may have been fixed since.

-- 
+  Maciej W. Rozycki, Technical University of Gdansk, Poland   +
+--------------------------------------------------------------+
+        e-mail: macro@ds2.pg.gda.pl, PGP key available        +

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2004-02-17 15:25 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-02-13 23:40 strxxx and gcc-3.4 J.A. Magallon
2004-02-14  0:27 ` Valdis.Kletnieks
2004-02-17 15:25 ` Maciej W. Rozycki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox