version 1.72, 2016/12/29 19:40:35 |
version 1.73, 2016/12/29 23:54:29 |
Line 203 static struct kwtab { |
|
Line 203 static struct kwtab { |
|
u_int kw_c99 : 1; /* c99 keyword */ |
u_int kw_c99 : 1; /* c99 keyword */ |
u_int kw_gcc : 1; /* GCC keyword */ |
u_int kw_gcc : 1; /* GCC keyword */ |
u_int kw_attr : 1; /* GCC attribute, keyword */ |
u_int kw_attr : 1; /* GCC attribute, keyword */ |
|
u_int kw_deco : 3; /* name[1] __name[2] __name__[4] */ |
} kwtab[] = { |
} kwtab[] = { |
{ "__alignof__", T_ALIGNOF, 0, 0, 0, 0, 0, 0, 0 }, |
{ "_Bool", T_TYPE, 0, BOOL, 0, 0,1,0,0,1 }, |
{ "__attribute__",T_ATTRIBUTE, 0, 0, 0, 0, 0, 1, 0 }, |
{ "_Complex", T_TYPE, 0, COMPLEX,0, 0,1,0,0,1 }, |
{ "__attribute",T_ATTRIBUTE, 0, 0, 0, 0, 0, 1, 0 }, |
{ "_Generic", T_GENERIC, 0, 0, 0, 0,1,0,0,1 }, |
{ "__packed__", T_AT_PACKED, 0, 0, 0, 0, 0, 1, 1 }, |
{ "alias", T_AT_ALIAS, 0, 0, 0, 0,0,1,1,5 }, |
{ "packed", T_AT_PACKED, 0, 0, 0, 0, 0, 1, 1 }, |
{ "aligned", T_AT_ALIGNED, 0, 0, 0, 0,0,1,1,5 }, |
{ "__alias__", T_AT_ALIAS, 0, 0, 0, 0, 0, 1, 1 }, |
{ "alignof", T_ALIGNOF, 0, 0, 0, 0,0,0,0,4 }, |
{ "alias", T_AT_ALIAS, 0, 0, 0, 0, 0, 1, 1 }, |
{ "always_inline", T_AT_ALWAYS_INLINE, 0,0, 0, 0,0,1,1,5 }, |
{ "__aligned__",T_AT_ALIGNED, 0, 0, 0, 0, 0, 1, 1 }, |
{ "asm", T_ASM, 0, 0, 0, 0,0,1,0,7 }, |
{ "aligned", T_AT_ALIGNED, 0, 0, 0, 0, 0, 1, 1 }, |
{ "attribute", T_ATTRIBUTE, 0, 0, 0, 0,0,1,0,6 }, |
{ "__transparent_union__",T_AT_TUNION,0,0, 0, 0, 0, 1, 1 }, |
{ "auto", T_SCLASS, AUTO, 0, 0, 0,0,0,0,1 }, |
{ "transparent_union",T_AT_TUNION,0, 0, 0, 0, 0, 1, 1 }, |
{ "break", T_BREAK, 0, 0, 0, 0,0,0,0,1 }, |
{ "__unused__", T_AT_UNUSED, 0, 0, 0, 0, 0, 1, 1 }, |
{ "case", T_CASE, 0, 0, 0, 0,0,0,0,1 }, |
{ "unused", T_AT_UNUSED, 0, 0, 0, 0, 0, 1, 1 }, |
{ "char", T_TYPE, 0, CHAR, 0, 0,0,0,0,1 }, |
{ "__used__", T_AT_USED, 0, 0, 0, 0, 0, 1, 1 }, |
{ "cold", T_AT_COLD, 0, 0, 0, 0,0,1,1,5 }, |
{ "used", T_AT_USED, 0, 0, 0, 0, 0, 1, 1 }, |
{ "const", T_QUAL, 0, 0, CONST, 1,0,0,0,7 }, |
{ "__always_inline__", T_AT_ALWAYS_INLINE, |
{ "constructor",T_AT_CONSTRUCTOR,0, 0, 0, 0,0,1,1,5 }, |
0, 0, 0, 0, 0, 1, 1 }, |
{ "continue", T_CONTINUE, 0, 0, 0, 0,0,0,0,1 }, |
{ "always_inline", T_AT_ALWAYS_INLINE, |
{ "default", T_DEFAULT, 0, 0, 0, 0,0,0,0,1 }, |
0, 0, 0, 0, 0, 1, 1 }, |
{ "deprecated", T_AT_DEPRECATED,0, 0, 0, 0,0,1,1,5 }, |
{ "__gnu_inline__",T_AT_GNU_INLINE,0, 0, 0, 0, 0, 1, 1 }, |
{ "do", T_DO, 0, 0, 0, 0,0,0,0,1 }, |
{ "gnu_inline", T_AT_GNU_INLINE,0, 0, 0, 0, 0, 1, 1 }, |
{ "double", T_TYPE, 0, DOUBLE, 0, 0,0,0,0,1 }, |
{ "__constructor__",T_AT_CONSTRUCTOR,0, 0, 0, 0, 0, 1, 1 }, |
{ "else", T_ELSE, 0, 0, 0, 0,0,0,0,1 }, |
{ "constructor",T_AT_CONSTRUCTOR,0, 0, 0, 0, 0, 1, 1 }, |
{ "enum", T_ENUM, 0, 0, 0, 0,0,0,0,1 }, |
{ "__deprecated__",T_AT_DEPRECATED,0, 0, 0, 0, 0, 1, 1 }, |
{ "extension", T_EXTENSION, 0, 0, 0, 0,0,1,0,4 }, |
{ "deprecated", T_AT_DEPRECATED,0, 0, 0, 0, 0, 1, 1 }, |
{ "extern", T_SCLASS, EXTERN, 0, 0, 0,0,0,0,1 }, |
{ "__may_alias__",T_AT_MAY_ALIAS,0, 0, 0, 0, 0, 1, 1 }, |
{ "float", T_TYPE, 0, FLOAT, 0, 0,0,0,0,1 }, |
{ "may_alias", T_AT_MAY_ALIAS, 0, 0, 0, 0, 0, 1, 1 }, |
{ "for", T_FOR, 0, 0, 0, 0,0,0,0,1 }, |
{ "format", T_AT_FORMAT, 0, 0, 0, 0, 0, 1, 1 }, |
{ "format", T_AT_FORMAT, 0, 0, 0, 0,0,1,1,5 }, |
{ "__format__", T_AT_FORMAT, 0, 0, 0, 0, 0, 1, 1 }, |
{ "format_arg", T_AT_FORMAT_ARG,0, 0, 0, 0,0,1,1,5 }, |
{ "printf", T_AT_FORMAT_PRINTF,0, 0, 0, 0, 0, 1, 1 }, |
{ "gnu_inline", T_AT_GNU_INLINE,0, 0, 0, 0,0,1,1,5 }, |
{ "__printf__", T_AT_FORMAT_PRINTF,0, 0, 0, 0, 0, 1, 1 }, |
{ "goto", T_GOTO, 0, 0, 0, 0,0,0,0,1 }, |
{ "scanf", T_AT_FORMAT_SCANF,0, 0, 0, 0, 0, 1, 1 }, |
{ "if", T_IF, 0, 0, 0, 0,0,0,0,1 }, |
{ "__scanf__", T_AT_FORMAT_SCANF,0, 0, 0, 0, 0, 1, 1 }, |
{ "imag", T_IMAG, 0, 0, 0, 0,1,0,0,4 }, |
{ "strfmon", T_AT_FORMAT_STRFMON,0, 0, 0, 0, 0, 1, 1 }, |
{ "inline", T_SCLASS, INLINE, 0, 0, 0,1,0,0,7 }, |
{ "__strfmon__",T_AT_FORMAT_STRFMON,0, 0, 0, 0, 0, 1, 1 }, |
{ "int", T_TYPE, 0, INT, 0, 0,0,0,0,1 }, |
{ "strftime", T_AT_FORMAT_STRFTIME,0, 0, 0, 0, 0, 1, 1 }, |
{ "long", T_TYPE, 0, LONG, 0, 0,0,0,0,1 }, |
{ "__strftime__",T_AT_FORMAT_STRFTIME,0,0, 0, 0, 0, 1, 1 }, |
{ "may_alias", T_AT_MAY_ALIAS, 0, 0, 0, 0,0,1,1,5 }, |
{ "pure", T_AT_PURE, 0, 0, 0, 0, 0, 1, 1 }, |
{ "mode", T_AT_MODE, 0, 0, 0, 0,0,1,1,5 }, |
{ "__pure__", T_AT_PURE, 0, 0, 0, 0, 0, 1, 1 }, |
|
{ "noreturn", T_AT_NORETURN, 0, 0, 0, 0, 0, 1, 1 }, |
|
{ "__noreturn__",T_AT_NORETURN, 0, 0, 0, 0, 0, 1, 1 }, |
|
{ "no_instrument_function", T_AT_NO_INSTRUMENT_FUNCTION, |
{ "no_instrument_function", T_AT_NO_INSTRUMENT_FUNCTION, |
0, 0, 0, 0, 0, 1, 1 }, |
0, 0, 0, 0,0,1,1,5 }, |
{ "__no_instrument_function", T_AT_NO_INSTRUMENT_FUNCTION, |
{ "non_null", T_AT_NON_NULL, 0, 0, 0, 0,0,1,1,5 }, |
0, 0, 0, 0, 0, 1, 1 }, |
{ "noreturn", T_AT_NORETURN, 0, 0, 0, 0,0,1,1,5 }, |
{ "__no_instrument_function__", T_AT_NO_INSTRUMENT_FUNCTION, |
{ "packed", T_AT_PACKED, 0, 0, 0, 0,0,1,1,5 }, |
0, 0, 0, 0, 0, 1, 1 }, |
{ "packed", T_PACKED, 0, 0, 0, 0,0,0,0,2 }, |
{ "sentinel", T_AT_SENTINEL, 0, 0, 0, 0, 0, 1, 1 }, |
{ "printf", T_AT_FORMAT_PRINTF,0, 0, 0, 0,0,1,1,5 }, |
{ "__sentinel__",T_AT_SENTINEL, 0, 0, 0, 0, 0, 1, 1 }, |
{ "pure", T_AT_PURE, 0, 0, 0, 0,0,1,1,5 }, |
{ "format_arg", T_AT_FORMAT_ARG,0, 0, 0, 0, 0, 1, 1 }, |
{ "real", T_REAL, 0, 0, 0, 0,1,0,0,4 }, |
{ "__format_arg__", T_AT_FORMAT_ARG,0, 0, 0, 0, 0, 1, 1 }, |
{ "register", T_SCLASS, REG, 0, 0, 0,0,0,0,1 }, |
{ "returns_twice", T_AT_RETURNS_TWICE,0,0, 0, 0, 0, 1, 1 }, |
{ "restrict", T_QUAL, 0, 0, RESTRICT, 0,1,0,0,5 }, |
{ "__returns_twice__", T_AT_RETURNS_TWICE,0,0, 0, 0, 0, 1, 1 }, |
{ "return", T_RETURN, 0, 0, 0, 0,0,0,0,1 }, |
{ "cold", T_AT_COLD, 0, 0, 0, 0, 0, 1, 1 }, |
{ "returns_twice", T_AT_RETURNS_TWICE,0,0, 0, 0,0,1,1,5 }, |
{ "__cold__", T_AT_COLD, 0, 0, 0, 0, 0, 1, 1 }, |
{ "scanf", T_AT_FORMAT_SCANF,0, 0, 0, 0,0,1,1,5 }, |
{ "asm", T_ASM, 0, 0, 0, 0, 0, 1, 0 }, |
{ "section", T_AT_SECTION, 0, 0, 0, 0,0,1,1,7 }, |
{ "__asm", T_ASM, 0, 0, 0, 0, 0, 0, 0 }, |
{ "sentinel", T_AT_SENTINEL, 0, 0, 0, 0,0,1,1,5 }, |
{ "__asm__", T_ASM, 0, 0, 0, 0, 0, 0, 0 }, |
{ "short", T_TYPE, 0, SHORT, 0, 0,0,0,0,1 }, |
{ "auto", T_SCLASS, AUTO, 0, 0, 0, 0, 0, 0 }, |
{ "signed", T_TYPE, 0, SIGNED, 0, 1,0,0,0,3 }, |
{ "break", T_BREAK, 0, 0, 0, 0, 0, 0, 0 }, |
{ "sizeof", T_SIZEOF, 0, 0, 0, 0,0,0,0,1 }, |
{ "_Bool", T_TYPE, 0, BOOL, 0, 0, 1, 0, 0 }, |
{ "static", T_SCLASS, STATIC, 0, 0, 0,0,0,0,1 }, |
{ "case", T_CASE, 0, 0, 0, 0, 0, 0, 0 }, |
{ "strfmon", T_AT_FORMAT_STRFMON,0, 0, 0, 0,0,1,1,5 }, |
{ "char", T_TYPE, 0, CHAR, 0, 0, 0, 0, 0 }, |
{ "strftime", T_AT_FORMAT_STRFTIME,0, 0, 0, 0,0,1,1,5 }, |
{ "const", T_QUAL, 0, 0, CONST, 1, 0, 0, 0 }, |
{ "struct", T_SOU, 0, STRUCT, 0, 0,0,0,0,1 }, |
{ "_Complex", T_TYPE, 0, COMPLEX,0, 0, 1, 0, 0 }, |
{ "switch", T_SWITCH, 0, 0, 0, 0,0,0,0,1 }, |
{ "__const__", T_QUAL, 0, 0, CONST, 0, 0, 0, 0 }, |
{ "symbolrename", T_SYMBOLRENAME, 0, 0, 0, 0,0,0,0,2 }, |
{ "__const", T_QUAL, 0, 0, CONST, 0, 0, 0, 0 }, |
{ "transparent_union",T_AT_TUNION,0, 0, 0, 0,0,1,1,5 }, |
{ "continue", T_CONTINUE, 0, 0, 0, 0, 0, 0, 0 }, |
{ "typedef", T_SCLASS, TYPEDEF, 0, 0, 0,0,0,0,1 }, |
{ "default", T_DEFAULT, 0, 0, 0, 0, 0, 0, 0 }, |
{ "typeof", T_TYPEOF, 0, 0, 0, 0,0,1,0,5 }, |
{ "do", T_DO, 0, 0, 0, 0, 0, 0, 0 }, |
{ "union", T_SOU, 0, UNION, 0, 0,0,0,0,1 }, |
{ "double", T_TYPE, 0, DOUBLE, 0, 0, 0, 0, 0 }, |
{ "unsigned", T_TYPE, 0, UNSIGN, 0, 0,0,0,0,1 }, |
{ "else", T_ELSE, 0, 0, 0, 0, 0, 0, 0 }, |
{ "unused", T_AT_UNUSED, 0, 0, 0, 0,0,1,1,5 }, |
{ "enum", T_ENUM, 0, 0, 0, 0, 0, 0, 0 }, |
{ "used", T_AT_USED, 0, 0, 0, 0,0,1,1,5 }, |
{ "__extension__", T_EXTENSION, 0, 0, 0, 0, 0, 1, 0 }, |
{ "visibility", T_AT_VISIBILITY,0, 0, 0, 0,0,1,1,5 }, |
{ "extern", T_SCLASS, EXTERN, 0, 0, 0, 0, 0, 0 }, |
{ "void", T_TYPE, 0, VOID, 0, 0,0,0,0,1 }, |
{ "float", T_TYPE, 0, FLOAT, 0, 0, 0, 0, 0 }, |
{ "volatile", T_QUAL, 0, 0, VOLATILE, 1,0,0,0,7 }, |
{ "for", T_FOR, 0, 0, 0, 0, 0, 0, 0 }, |
{ "weak", T_AT_WEAK, 0, 0, 0, 0,0,1,1,5 }, |
{ "_Generic", T_GENERIC, 0, 0, 0, 0, 1, 0, 0 }, |
{ "while", T_WHILE, 0, 0, 0, 0,0,0,0,1 }, |
{ "goto", T_GOTO, 0, 0, 0, 0, 0, 0, 0 }, |
{ NULL, 0, 0, 0, 0, 0,0,0,0,0 } |
{ "if", T_IF, 0, 0, 0, 0, 0, 0, 0 }, |
|
{ "__imag__", T_IMAG, 0, 0, 0, 0, 1, 0, 0 }, |
|
{ "inline", T_SCLASS, INLINE, 0, 0, 0, 1, 0, 0 }, |
|
{ "__inline__", T_SCLASS, INLINE, 0, 0, 0, 0, 0, 0 }, |
|
{ "__inline", T_SCLASS, INLINE, 0, 0, 0, 0, 0, 0 }, |
|
{ "int", T_TYPE, 0, INT, 0, 0, 0, 0, 0 }, |
|
{ "__symbolrename", T_SYMBOLRENAME, 0, 0, 0, 0, 0, 0, 0 }, |
|
{ "long", T_TYPE, 0, LONG, 0, 0, 0, 0, 0 }, |
|
{ "mode", T_AT_MODE, 0, 0, 0, 0, 0, 1, 1 }, |
|
{ "__mode", T_AT_MODE, 0, 0, 0, 0, 0, 1, 1 }, |
|
{ "__mode__", T_AT_MODE, 0, 0, 0, 0, 0, 1, 1 }, |
|
{ "__real__", T_REAL, 0, 0, 0, 0, 1, 0, 0 }, |
|
{ "register", T_SCLASS, REG, 0, 0, 0, 0, 0, 0 }, |
|
{ "__restrict__",T_QUAL, 0, 0, RESTRICT, 0, 1, 0, 0 }, |
|
{ "restrict", T_QUAL, 0, 0, RESTRICT, 0, 1, 0, 0 }, |
|
{ "return", T_RETURN, 0, 0, 0, 0, 0, 0, 0 }, |
|
{ "__packed", T_PACKED, 0, 0, 0, 0, 0, 0, 0 }, |
|
{ "section", T_AT_SECTION, 0, 0, 0, 0, 0, 1, 1 }, |
|
{ "__section", T_AT_SECTION, 0, 0, 0, 0, 0, 1, 1 }, |
|
{ "__section__",T_AT_SECTION, 0, 0, 0, 0, 0, 1, 1 }, |
|
{ "short", T_TYPE, 0, SHORT, 0, 0, 0, 0, 0 }, |
|
{ "signed", T_TYPE, 0, SIGNED, 0, 1, 0, 0, 0 }, |
|
{ "__signed__", T_TYPE, 0, SIGNED, 0, 0, 0, 0, 0 }, |
|
{ "__signed", T_TYPE, 0, SIGNED, 0, 0, 0, 0, 0 }, |
|
{ "sizeof", T_SIZEOF, 0, 0, 0, 0, 0, 0, 0 }, |
|
{ "static", T_SCLASS, STATIC, 0, 0, 0, 0, 0, 0 }, |
|
{ "struct", T_SOU, 0, STRUCT, 0, 0, 0, 0, 0 }, |
|
{ "switch", T_SWITCH, 0, 0, 0, 0, 0, 0, 0 }, |
|
{ "typedef", T_SCLASS, TYPEDEF, 0, 0, 0, 0, 0, 0 }, |
|
{ "typeof", T_TYPEOF, 0, 0, 0, 0, 0, 1, 0 }, |
|
{ "__typeof", T_TYPEOF, 0, 0, 0, 0, 0, 1, 0 }, |
|
{ "__typeof__", T_TYPEOF, 0, 0, 0, 0, 0, 1, 0 }, |
|
{ "union", T_SOU, 0, UNION, 0, 0, 0, 0, 0 }, |
|
{ "unsigned", T_TYPE, 0, UNSIGN, 0, 0, 0, 0, 0 }, |
|
{ "void", T_TYPE, 0, VOID, 0, 0, 0, 0, 0 }, |
|
{ "volatile", T_QUAL, 0, 0, VOLATILE, 1, 0, 0, 0 }, |
|
{ "__volatile__", T_QUAL, 0, 0, VOLATILE, 0, 0, 0, 0 }, |
|
{ "__volatile", T_QUAL, 0, 0, VOLATILE, 0, 0, 0, 0 }, |
|
{ "visibility", T_AT_VISIBILITY,0, 0, 0, 0, 0, 1, 1 }, |
|
{ "__visibility",T_AT_VISIBILITY,0, 0, 0, 0, 0, 1, 1 }, |
|
{ "__visibility__",T_AT_VISIBILITY,0, 0, 0, 0, 0, 1, 1 }, |
|
{ "weak", T_AT_WEAK, 0, 0, 0, 0, 0, 1, 1 }, |
|
{ "__weak", T_AT_WEAK, 0, 0, 0, 0, 0, 1, 1 }, |
|
{ "__weak__", T_AT_WEAK, 0, 0, 0, 0, 0, 1, 1 }, |
|
{ "while", T_WHILE, 0, 0, 0, 0, 0, 0, 0 }, |
|
{ NULL, 0, 0, 0, 0, 0, 0, 0, 0 } |
|
}; |
}; |
|
|
/* Symbol table */ |
/* Symbol table */ |
Line 350 static sbuf_t *sbfrlst; |
|
Line 302 static sbuf_t *sbfrlst; |
|
symt_t symtyp; |
symt_t symtyp; |
|
|
|
|
|
static void |
|
addkw(struct kwtab *kw, int deco) |
|
{ |
|
sym_t *sym; |
|
size_t h; |
|
char buf[256]; |
|
const char *name; |
|
|
|
if (!(kw->kw_deco & deco)) |
|
return; |
|
|
|
switch (deco) { |
|
case 1: |
|
name = kw->kw_name; |
|
break; |
|
case 2: |
|
snprintf(buf, sizeof(buf), "__%s", kw->kw_name); |
|
name = strdup(buf); |
|
break; |
|
case 4: |
|
snprintf(buf, sizeof(buf), "__%s__", kw->kw_name); |
|
name = strdup(buf); |
|
break; |
|
default: |
|
abort(); |
|
} |
|
|
|
if (name == NULL) |
|
err(1, "Can't init symbol table"); |
|
|
|
sym = getblk(sizeof (sym_t)); |
|
sym->s_name = name; |
|
sym->s_keyw = kw; |
|
sym->s_value.v_quad = kw->kw_token; |
|
if (kw->kw_token == T_TYPE || kw->kw_token == T_SOU) { |
|
sym->s_tspec = kw->kw_tspec; |
|
} else if (kw->kw_token == T_SCLASS) { |
|
sym->s_scl = kw->kw_scl; |
|
} else if (kw->kw_token == T_QUAL) { |
|
sym->s_tqual = kw->kw_tqual; |
|
} |
|
h = hash(sym->s_name); |
|
if ((sym->s_link = symtab[h]) != NULL) |
|
symtab[h]->s_rlink = &sym->s_link; |
|
sym->s_rlink = &symtab[h]; |
|
symtab[h] = sym; |
|
} |
|
|
/* |
/* |
* All keywords are written to the symbol table. This saves us looking |
* All keywords are written to the symbol table. This saves us looking |
* in a extra table for each name we found. |
* in a extra table for each name we found. |
|
|
initscan(void) |
initscan(void) |
{ |
{ |
struct kwtab *kw; |
struct kwtab *kw; |
sym_t *sym; |
size_t i; |
size_t h, i; |
|
uint64_t uq; |
uint64_t uq; |
|
|
for (kw = kwtab; kw->kw_name != NULL; kw++) { |
for (kw = kwtab; kw->kw_name != NULL; kw++) { |
|
|
continue; |
continue; |
if (kw->kw_gcc && !gflag) |
if (kw->kw_gcc && !gflag) |
continue; |
continue; |
sym = getblk(sizeof (sym_t)); |
addkw(kw, 1); |
sym->s_name = kw->kw_name; |
addkw(kw, 2); |
sym->s_keyw = kw; |
addkw(kw, 4); |
sym->s_value.v_quad = kw->kw_token; |
|
if (kw->kw_token == T_TYPE || kw->kw_token == T_SOU) { |
|
sym->s_tspec = kw->kw_tspec; |
|
} else if (kw->kw_token == T_SCLASS) { |
|
sym->s_scl = kw->kw_scl; |
|
} else if (kw->kw_token == T_QUAL) { |
|
sym->s_tqual = kw->kw_tqual; |
|
} |
|
h = hash(sym->s_name); |
|
if ((sym->s_link = symtab[h]) != NULL) |
|
symtab[h]->s_rlink = &sym->s_link; |
|
sym->s_rlink = &symtab[h]; |
|
symtab[h] = sym; |
|
} |
} |
|
|
/* initialize bit-masks for quads */ |
/* initialize bit-masks for quads */ |