PR c/81882 - attribute ifunc documentation uses invalid code
authorMartin Sebor <msebor@redhat.com>
Thu, 21 Sep 2017 17:19:16 +0000 (17:19 +0000)
committerMartin Sebor <msebor@gcc.gnu.org>
Thu, 21 Sep 2017 17:19:16 +0000 (11:19 -0600)
gcc/ChangeLog:

PR c/81882
* doc/extend.texi (attribute ifunc): Avoid relying on ill-formed
code (in C++) or code that triggers warnings.

From-SVN: r253076

gcc/ChangeLog
gcc/doc/extend.texi

index 3071a86c7174464a9ad3968f4239413b780ef9e8..baaafa7327a25b195ac91f0424f27b79dd1e7195 100644 (file)
@@ -1,3 +1,9 @@
+2017-09-21  Martin Sebor  <msebor@redhat.com>
+
+       * PR c/81882
+       * doc/extend.texi (attribute ifunc): Avoid relying on ill-formed
+       code (in C++) or code that triggers warnings.
+
 2017-09-21  Eric Botcazou  <ebotcazou@adacore.com>
 
        * stor-layout.c (bit_from_pos): Do not distribute the conversion.
index a66a7952033fe97a22ccb3345de41ac6e1c9c4a8..3acba6001f7b6b0ba37e48aff73badb2e907b378 100644 (file)
@@ -2783,21 +2783,23 @@ The @code{ifunc} attribute is used to mark a function as an indirect
 function using the STT_GNU_IFUNC symbol type extension to the ELF
 standard.  This allows the resolution of the symbol value to be
 determined dynamically at load time, and an optimized version of the
-routine can be selected for the particular processor or other system
+routine to be selected for the particular processor or other system
 characteristics determined then.  To use this attribute, first define
 the implementation functions available, and a resolver function that
 returns a pointer to the selected implementation function.  The
 implementation functions' declarations must match the API of the
-function being implemented, the resolver's declaration is be a
-function returning pointer to void function returning void:
+function being implemented.  The resolver should be declared to
+be a function taking no arguments and returning a pointer to
+a function of the same type as the implementation.  For example:
 
 @smallexample
 void *my_memcpy (void *dst, const void *src, size_t len)
 @{
   @dots{}
+  return dst;
 @}
 
-static void (*resolve_memcpy (void)) (void)
+static void * (*resolve_memcpy (void))(void *, const void *, size_t)
 @{
   return my_memcpy; // we'll just always select this routine
 @}