Hello, I'm attempting to get this WG14 proposal <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2901.htm#wording-6.2.1p1> (N2901) working in TinyCC, based off of this diff from JeanHeyd Meneide <https://github.com/llvm/llvm-project/compare/main...ThePhD:dang-features/transparent-aliases>. To summarize, "typedef, but for functions".
Assuming the following definition: int __callme(int x) { return x; } I would like this: _Alias callme = __callme; to be equivalent to the following declaration: extern int callme(int x) __asm__("__callme"); // or __attribute__((alias("__callme"))); In this patch, I can access the alias target and the alias identifier, I think I just need to push the symbol with the alias identifier, with the alias_target property set to the alias target's token. Suggestions, advice, or "here be dragons" are all appreciated. Cheers, Asher Mancinelli --- tccgen.c | 41 ++++++++++++++++++++++++++++++++++++++++- tcctok.h | 1 + 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/tccgen.c b/tccgen.c index 67e205b..f391a4e 100644 --- a/tccgen.c +++ b/tccgen.c @@ -5028,6 +5028,38 @@ static void sym_to_attr(AttributeDef *ad, Sym *s) merge_funcattr(&ad->f, &s->f); } +/* Create a symbol with the name of the alias source, set asm label to the + * alias target. Return the alias's symbol. */ +static Sym* parse_transparent_alias_decl(AttributeDef *ad, CType *t) +{ + int target; + int alias = tok; + Sym *target_sym; + + if (alias < TOK_UIDENT) + expect("identifier"); + + printf("Got alias '%s'", get_tok_str(alias, NULL)); + + next(); + skip('='); + + target = tok; + + printf("Got alias target '%s'", get_tok_str(target, NULL)); + + target_sym = sym_find(target); + *t = target_sym->type; + const char* target_str = get_tok_str(target, NULL); + + if (!target_sym) { + tcc_error("alias target '%s' is undefined", target_str); + } + + ad->alias_target = target; + return sym_find(alias); +} + /* Add type qualifiers to a type. If the type is an array then the qualifiers are added to the element type, copied because it could be a typedef. */ static void parse_btype_qualify(CType *type, int qualifiers) @@ -5172,6 +5204,14 @@ static int parse_btype(CType *type, AttributeDef *ad) goto basic_type2; } break; + + case TOK__Alias: + next(); + tcc_warning("_Alias is a non-standard extension"); + s = parse_transparent_alias_decl(ad, type); + // sym_to_attr(ad, s); + return 1; + case TOK_CONST1: case TOK_CONST2: case TOK_CONST3: @@ -6261,7 +6301,6 @@ ST_FUNC void unary(void) vpushsym(&s->type, s); next(); break; - case TOK_GENERIC: { CType controlling_type; diff --git a/tcctok.h b/tcctok.h index d4c1ef5..615b277 100644 --- a/tcctok.h +++ b/tcctok.h @@ -19,6 +19,7 @@ DEF(TOK_CASE, "case") DEF(TOK__Atomic, "_Atomic") + DEF(TOK__Alias, "_Alias") /* Strong transparent symbol alias */ DEF(TOK_CONST1, "const") DEF(TOK_CONST2, "__const") /* gcc keyword */ DEF(TOK_CONST3, "__const__") /* gcc keyword */ -- 2.28.0
_______________________________________________ Tinycc-devel mailing list Tinycc-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/tinycc-devel