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