1
0
mirror of https://git.savannah.gnu.org/git/gperf.git synced 2025-12-02 13:09:22 +00:00

Drop the inline specifiers from the generated lookup function.

This commit is contained in:
Bruno Haible
2016-11-26 18:42:05 +01:00
parent 0414be8fff
commit a705809f3d
16 changed files with 21 additions and 100 deletions

View File

@@ -1,3 +1,19 @@
2016-11-26 Bruno Haible <bruno@clisp.org>
Drop the inline specifiers from the generated lookup function.
It's not adequate because
- this lookup function is quite large in fact, not worth inlining,
- with gcc -O0, it leads to link errors, see
<https://gcc.gnu.org/bugzilla/show_bug.cgi?id=41194#c2>
- the hash function is 'static', the lookup function is non-static,
but references from non-static inline functions to static functions
and variables are forbidden, see ISO C 99 section 6.7.4.(3).
* src/output.cc (Output::output_lookup_function): Don't emit an inline
specifier.
* tests/*.exp: Update.
Reported by Sebastian Freundt and Sergii Strelkovskyi
at <https://savannah.gnu.org/bugs/?37071>.
2016-11-26 Bruno Haible <bruno@clisp.org> 2016-11-26 Bruno Haible <bruno@clisp.org>
Change mailing list address to <bug-gperf@gnu.org>. Change mailing list address to <bug-gperf@gnu.org>.

View File

@@ -1974,22 +1974,11 @@ void
Output::output_lookup_function () const Output::output_lookup_function () const
{ {
/* Output the function's head. */ /* Output the function's head. */
if (option[KRC] | option[C] | option[ANSIC]) /* We don't declare the lookup function 'static' because we cannot make
/* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99 assumptions about the compilation units of the user.
inline semantics, unless -fgnu89-inline is used. It defines a macro Since we don't make it 'static', it makes no sense to declare it 'inline',
__GNUC_STDC_INLINE__ to indicate this situation or a macro because non-static inline functions must not reference static functions or
__GNUC_GNU_INLINE__ to indicate the opposite situation. variables, see ISO C 99 section 6.7.4.(3). */
GCC 4.2 with -std=c99 or -std=gnu99 implements the GNU C inline
semantics but warns, unless -fgnu89-inline is used:
warning: C99 inline functions are not supported; using GNU89
warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute
It defines a macro __GNUC_GNU_INLINE__ to indicate this situation. */
printf ("#ifdef __GNUC__\n"
"__inline\n"
"#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__\n"
"__attribute__ ((__gnu_inline__))\n"
"#endif\n"
"#endif\n");
printf ("%s%s\n", printf ("%s%s\n",
const_for_struct, _return_type); const_for_struct, _return_type);

View File

@@ -197,12 +197,6 @@ static struct resword wordlist[] =
{"volatile", TYPE_QUAL, RID_VOLATILE} {"volatile", TYPE_QUAL, RID_VOLATILE}
}; };
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
struct resword * struct resword *
is_reserved_word (str, len) is_reserved_word (str, len)
register const char *str; register const char *str;

View File

@@ -1801,12 +1801,6 @@ static const struct charset wordlist[] =
{"hp-desktop", 2021} {"hp-desktop", 2021}
}; };
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
const struct charset * const struct charset *
in_word_set (register const char *str, register size_t len) in_word_set (register const char *str, register size_t len)
{ {

View File

@@ -176,12 +176,6 @@ hash (str, len)
return hval; return hval;
} }
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
struct resword * struct resword *
in_word_set (str, len) in_word_set (str, len)
register const char *str; register const char *str;

View File

@@ -101,12 +101,6 @@ hash (str, len)
return hval + asso_values[(unsigned char)str[len - 1]]; return hval + asso_values[(unsigned char)str[len - 1]];
} }
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
struct resword * struct resword *
is_reserved_word (str, len) is_reserved_word (str, len)
register const char *str; register const char *str;

View File

@@ -90,12 +90,6 @@ hash (register const char *str, register size_t len)
return len + asso_values[(unsigned char)str[len - 1]] + asso_values[(unsigned char)str[0]]; return len + asso_values[(unsigned char)str[len - 1]] + asso_values[(unsigned char)str[0]];
} }
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
struct resword * struct resword *
is_reserved_word (register const char *str, register size_t len) is_reserved_word (register const char *str, register size_t len)
{ {

View File

@@ -80,12 +80,6 @@ hash (register const char *str, register size_t len)
return len + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[0]]; return len + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[0]];
} }
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
struct month * struct month *
in_word_set (register const char *str, register size_t len) in_word_set (register const char *str, register size_t len)
{ {

View File

@@ -119,12 +119,6 @@ hash (str, len)
return hval + asso_values[(unsigned char)str[len - 1]]; return hval + asso_values[(unsigned char)str[len - 1]];
} }
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
struct java_keyword * struct java_keyword *
java_keyword (str, len) java_keyword (str, len)
register const char *str; register const char *str;

View File

@@ -1458,12 +1458,6 @@ static const struct language wordlist[] =
{"ile", "Interlingue", 181, "interlingue", 181} {"ile", "Interlingue", 181, "interlingue", 181}
}; };
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
const struct language * const struct language *
in_word_set (register const char *str, register size_t len) in_word_set (register const char *str, register size_t len)
{ {

View File

@@ -107,12 +107,6 @@ hash (register const char *str, register size_t len)
return hval; return hval;
} }
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
const char * const char *
in_word_set (register const char *str, register size_t len) in_word_set (register const char *str, register size_t len)
{ {

View File

@@ -93,12 +93,6 @@ hash (register const char *str, register size_t len)
return hval + asso_values[(unsigned char)str[len - 1]]; return hval + asso_values[(unsigned char)str[len - 1]];
} }
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
struct resword * struct resword *
is_reserved_word (register const char *str, register size_t len) is_reserved_word (register const char *str, register size_t len)
{ {

View File

@@ -80,12 +80,6 @@ hash (register const char *str, register size_t len)
return asso_values[(unsigned char)str[1]+1] + asso_values[(unsigned char)str[0]]; return asso_values[(unsigned char)str[1]+1] + asso_values[(unsigned char)str[0]];
} }
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
const char * const char *
in_word_set (register const char *str, register size_t len) in_word_set (register const char *str, register size_t len)
{ {

View File

@@ -80,12 +80,6 @@ hash (register const char *str, register size_t len)
return asso_values[(unsigned char)str[1]+1] + asso_values[(unsigned char)str[0]]; return asso_values[(unsigned char)str[1]+1] + asso_values[(unsigned char)str[0]];
} }
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
const char * const char *
in_word_set (register const char *str, register size_t len) in_word_set (register const char *str, register size_t len)
{ {

View File

@@ -125,12 +125,6 @@ hash (register const char *str, register size_t len)
return asso_values[(unsigned char)str[1]+3] + asso_values[(unsigned char)str[0]]; return asso_values[(unsigned char)str[1]+3] + asso_values[(unsigned char)str[0]];
} }
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
const char * const char *
in_word_set (register const char *str, register size_t len) in_word_set (register const char *str, register size_t len)
{ {

View File

@@ -81,12 +81,6 @@ hash (register const char *str, register size_t len)
return len + asso_values[(unsigned char)str[len - 1]] + asso_values[(unsigned char)str[0]]; return len + asso_values[(unsigned char)str[len - 1]] + asso_values[(unsigned char)str[0]];
} }
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
struct resword * struct resword *
in_word_set (register const char *str, register size_t len) in_word_set (register const char *str, register size_t len)
{ {