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>
Change mailing list address to <bug-gperf@gnu.org>.

View File

@@ -1974,22 +1974,11 @@ void
Output::output_lookup_function () const
{
/* Output the function's head. */
if (option[KRC] | option[C] | option[ANSIC])
/* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
inline semantics, unless -fgnu89-inline is used. It defines a macro
__GNUC_STDC_INLINE__ to indicate this situation or a macro
__GNUC_GNU_INLINE__ to indicate the opposite situation.
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");
/* We don't declare the lookup function 'static' because we cannot make
assumptions about the compilation units of the user.
Since we don't make it 'static', it makes no sense to declare it 'inline',
because non-static inline functions must not reference static functions or
variables, see ISO C 99 section 6.7.4.(3). */
printf ("%s%s\n",
const_for_struct, _return_type);

View File

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

View File

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

View File

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

View File

@@ -101,12 +101,6 @@ hash (str, len)
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 *
is_reserved_word (str, len)
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]];
}
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
struct resword *
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]];
}
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
struct month *
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]];
}
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
struct java_keyword *
java_keyword (str, len)
register const char *str;

View File

@@ -1458,12 +1458,6 @@ static const struct language wordlist[] =
{"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 *
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;
}
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
const char *
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]];
}
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
struct resword *
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]];
}
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
const char *
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]];
}
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
const char *
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]];
}
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
const char *
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]];
}
#ifdef __GNUC__
__inline
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
struct resword *
in_word_set (register const char *str, register size_t len)
{