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:
16
ChangeLog
16
ChangeLog
@@ -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>.
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user