Thomas Gleixner | 457c899 | 2019-05-19 13:08:55 +0100 | [diff] [blame] | 1 | // SPDX-License-Identifier: GPL-2.0-only |
Linus Torvalds | bb3290d | 2017-08-19 10:17:02 -0700 | [diff] [blame] | 2 | static struct resword { |
| 3 | const char *name; |
| 4 | int token; |
| 5 | } keywords[] = { |
| 6 | { "EXPORT_SYMBOL", EXPORT_SYMBOL_KEYW }, |
| 7 | { "EXPORT_SYMBOL_GPL", EXPORT_SYMBOL_KEYW }, |
| 8 | { "EXPORT_SYMBOL_GPL_FUTURE", EXPORT_SYMBOL_KEYW }, |
| 9 | { "EXPORT_UNUSED_SYMBOL", EXPORT_SYMBOL_KEYW }, |
| 10 | { "EXPORT_UNUSED_SYMBOL_GPL", EXPORT_SYMBOL_KEYW }, |
| 11 | { "__asm", ASM_KEYW }, |
| 12 | { "__asm__", ASM_KEYW }, |
| 13 | { "__attribute", ATTRIBUTE_KEYW }, |
| 14 | { "__attribute__", ATTRIBUTE_KEYW }, |
| 15 | { "__const", CONST_KEYW }, |
| 16 | { "__const__", CONST_KEYW }, |
| 17 | { "__extension__", EXTENSION_KEYW }, |
| 18 | { "__inline", INLINE_KEYW }, |
| 19 | { "__inline__", INLINE_KEYW }, |
| 20 | { "__signed", SIGNED_KEYW }, |
| 21 | { "__signed__", SIGNED_KEYW }, |
| 22 | { "__typeof", TYPEOF_KEYW }, |
| 23 | { "__typeof__", TYPEOF_KEYW }, |
| 24 | { "__volatile", VOLATILE_KEYW }, |
| 25 | { "__volatile__", VOLATILE_KEYW }, |
| 26 | { "__builtin_va_list", VA_LIST_KEYW }, |
| 27 | |
Will Deacon | a222061 | 2019-06-18 14:10:48 +0100 | [diff] [blame] | 28 | { "__int128", BUILTIN_INT_KEYW }, |
| 29 | { "__int128_t", BUILTIN_INT_KEYW }, |
| 30 | { "__uint128_t", BUILTIN_INT_KEYW }, |
| 31 | |
Linus Torvalds | bb3290d | 2017-08-19 10:17:02 -0700 | [diff] [blame] | 32 | // According to rth, c99 defines "_Bool", __restrict", __restrict__", "restrict". KAO |
| 33 | { "_Bool", BOOL_KEYW }, |
| 34 | { "_restrict", RESTRICT_KEYW }, |
| 35 | { "__restrict__", RESTRICT_KEYW }, |
| 36 | { "restrict", RESTRICT_KEYW }, |
| 37 | { "asm", ASM_KEYW }, |
| 38 | |
| 39 | // attribute commented out in modutils 2.4.2. People are using 'attribute' as a |
| 40 | // field name which breaks the genksyms parser. It is not a gcc keyword anyway. |
| 41 | // KAO. }, |
| 42 | // { "attribute", ATTRIBUTE_KEYW }, |
| 43 | |
| 44 | { "auto", AUTO_KEYW }, |
| 45 | { "char", CHAR_KEYW }, |
| 46 | { "const", CONST_KEYW }, |
| 47 | { "double", DOUBLE_KEYW }, |
| 48 | { "enum", ENUM_KEYW }, |
| 49 | { "extern", EXTERN_KEYW }, |
| 50 | { "float", FLOAT_KEYW }, |
| 51 | { "inline", INLINE_KEYW }, |
| 52 | { "int", INT_KEYW }, |
| 53 | { "long", LONG_KEYW }, |
| 54 | { "register", REGISTER_KEYW }, |
| 55 | { "short", SHORT_KEYW }, |
| 56 | { "signed", SIGNED_KEYW }, |
| 57 | { "static", STATIC_KEYW }, |
| 58 | { "struct", STRUCT_KEYW }, |
| 59 | { "typedef", TYPEDEF_KEYW }, |
| 60 | { "typeof", TYPEOF_KEYW }, |
| 61 | { "union", UNION_KEYW }, |
| 62 | { "unsigned", UNSIGNED_KEYW }, |
| 63 | { "void", VOID_KEYW }, |
| 64 | { "volatile", VOLATILE_KEYW }, |
| 65 | }; |
| 66 | |
| 67 | #define NR_KEYWORDS (sizeof(keywords)/sizeof(struct resword)) |
| 68 | |
| 69 | static int is_reserved_word(register const char *str, register unsigned int len) |
| 70 | { |
| 71 | int i; |
| 72 | for (i = 0; i < NR_KEYWORDS; i++) { |
| 73 | struct resword *r = keywords + i; |
| 74 | int l = strlen(r->name); |
| 75 | if (len == l && !memcmp(str, r->name, len)) |
| 76 | return r->token; |
| 77 | } |
| 78 | return -1; |
| 79 | } |