mirror of
https://github.com/mirror/tinycc.git
synced 2025-01-29 06:10:09 +08:00
Tidy arg parsing for builtins
Saves some lines of code.
This commit is contained in:
parent
10551d6961
commit
51314932e3
124
tccgen.c
124
tccgen.c
@ -4290,6 +4290,27 @@ static void vpush_tokc(int t)
|
|||||||
vsetc(&type, VT_CONST, &tokc);
|
vsetc(&type, VT_CONST, &tokc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void parse_builtin_params(int nc, const char *args)
|
||||||
|
{
|
||||||
|
char c, sep = '(';
|
||||||
|
CType t;
|
||||||
|
if (nc)
|
||||||
|
nocode_wanted++;
|
||||||
|
next();
|
||||||
|
while ((c = *args++)) {
|
||||||
|
skip(sep);
|
||||||
|
sep = ',';
|
||||||
|
switch (c) {
|
||||||
|
case 'e': expr_eq(); continue;
|
||||||
|
case 't': parse_type(&t); vpush(&t); continue;
|
||||||
|
default: tcc_error("internal error"); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
skip(')');
|
||||||
|
if (nc)
|
||||||
|
nocode_wanted--;
|
||||||
|
}
|
||||||
|
|
||||||
ST_FUNC void unary(void)
|
ST_FUNC void unary(void)
|
||||||
{
|
{
|
||||||
int n, t, align, size, r, sizeof_caller;
|
int n, t, align, size, r, sizeof_caller;
|
||||||
@ -4497,30 +4518,17 @@ ST_FUNC void unary(void)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case TOK_builtin_expect:
|
case TOK_builtin_expect:
|
||||||
{
|
/* __builtin_expect is a no-op for now */
|
||||||
/* __builtin_expect is a no-op for now */
|
parse_builtin_params(0, "ee");
|
||||||
next();
|
vpop();
|
||||||
skip('(');
|
|
||||||
expr_eq();
|
|
||||||
skip(',');
|
|
||||||
expr_eq();
|
|
||||||
vpop();
|
|
||||||
skip(')');
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case TOK_builtin_types_compatible_p:
|
case TOK_builtin_types_compatible_p:
|
||||||
{
|
parse_builtin_params(0, "tt");
|
||||||
CType type1, type2;
|
vtop[-1].type.t &= ~(VT_CONSTANT | VT_VOLATILE);
|
||||||
next();
|
vtop[0].type.t &= ~(VT_CONSTANT | VT_VOLATILE);
|
||||||
skip('(');
|
n = is_compatible_types(&vtop[-1].type, &vtop[0].type);
|
||||||
parse_type(&type1);
|
vtop -= 2;
|
||||||
skip(',');
|
vpushi(n);
|
||||||
parse_type(&type2);
|
|
||||||
skip(')');
|
|
||||||
type1.t &= ~(VT_CONSTANT | VT_VOLATILE);
|
|
||||||
type2.t &= ~(VT_CONSTANT | VT_VOLATILE);
|
|
||||||
vpushi(is_compatible_types(&type1, &type2));
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case TOK_builtin_choose_expr:
|
case TOK_builtin_choose_expr:
|
||||||
{
|
{
|
||||||
@ -4550,18 +4558,10 @@ ST_FUNC void unary(void)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TOK_builtin_constant_p:
|
case TOK_builtin_constant_p:
|
||||||
{
|
parse_builtin_params(1, "e");
|
||||||
int res;
|
n = (vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST;
|
||||||
next();
|
vtop--;
|
||||||
skip('(');
|
vpushi(n);
|
||||||
nocode_wanted++;
|
|
||||||
expr_eq();
|
|
||||||
res = (vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST;
|
|
||||||
vpop();
|
|
||||||
nocode_wanted--;
|
|
||||||
skip(')');
|
|
||||||
vpushi(res);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case TOK_builtin_frame_address:
|
case TOK_builtin_frame_address:
|
||||||
case TOK_builtin_return_address:
|
case TOK_builtin_return_address:
|
||||||
@ -4599,43 +4599,27 @@ ST_FUNC void unary(void)
|
|||||||
#ifdef TCC_TARGET_X86_64
|
#ifdef TCC_TARGET_X86_64
|
||||||
#ifdef TCC_TARGET_PE
|
#ifdef TCC_TARGET_PE
|
||||||
case TOK_builtin_va_start:
|
case TOK_builtin_va_start:
|
||||||
{
|
parse_builtin_params(0, "ee");
|
||||||
next();
|
if ((vtop->r & VT_VALMASK) != VT_LOCAL)
|
||||||
skip('(');
|
tcc_error("__builtin_va_start expects a local variable");
|
||||||
expr_eq();
|
vtop->r &= ~VT_LVAL;
|
||||||
skip(',');
|
vtop->type = char_pointer_type;
|
||||||
expr_eq();
|
vtop->c.i += 8;
|
||||||
skip(')');
|
vstore();
|
||||||
if ((vtop->r & VT_VALMASK) != VT_LOCAL)
|
|
||||||
tcc_error("__builtin_va_start expects a local variable");
|
|
||||||
vtop->r &= ~VT_LVAL;
|
|
||||||
vtop->type = char_pointer_type;
|
|
||||||
vtop->c.i += 8;
|
|
||||||
vstore();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
#else
|
#else
|
||||||
case TOK_builtin_va_arg_types:
|
case TOK_builtin_va_arg_types:
|
||||||
{
|
parse_builtin_params(0, "t");
|
||||||
CType type;
|
vpushi(classify_x86_64_va_arg(&vtop->type));
|
||||||
next();
|
vswap();
|
||||||
skip('(');
|
vpop();
|
||||||
parse_type(&type);
|
|
||||||
skip(')');
|
|
||||||
vpushi(classify_x86_64_va_arg(&type));
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef TCC_TARGET_ARM64
|
#ifdef TCC_TARGET_ARM64
|
||||||
case TOK___va_start: {
|
case TOK___va_start: {
|
||||||
next();
|
parse_builtin_params(0, "ee");
|
||||||
skip('(');
|
|
||||||
expr_eq();
|
|
||||||
skip(',');
|
|
||||||
expr_eq();
|
|
||||||
skip(')');
|
|
||||||
//xx check types
|
//xx check types
|
||||||
gen_va_start();
|
gen_va_start();
|
||||||
vpushi(0);
|
vpushi(0);
|
||||||
@ -4644,24 +4628,16 @@ ST_FUNC void unary(void)
|
|||||||
}
|
}
|
||||||
case TOK___va_arg: {
|
case TOK___va_arg: {
|
||||||
CType type;
|
CType type;
|
||||||
next();
|
parse_builtin_params(0, "et");
|
||||||
skip('(');
|
type = vtop->type;
|
||||||
expr_eq();
|
vpop();
|
||||||
skip(',');
|
|
||||||
parse_type(&type);
|
|
||||||
skip(')');
|
|
||||||
//xx check types
|
//xx check types
|
||||||
gen_va_arg(&type);
|
gen_va_arg(&type);
|
||||||
vtop->type = type;
|
vtop->type = type;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TOK___arm64_clear_cache: {
|
case TOK___arm64_clear_cache: {
|
||||||
next();
|
parse_builtin_params(0, "ee");
|
||||||
skip('(');
|
|
||||||
expr_eq();
|
|
||||||
skip(',');
|
|
||||||
expr_eq();
|
|
||||||
skip(')');
|
|
||||||
gen_clear_cache();
|
gen_clear_cache();
|
||||||
vpushi(0);
|
vpushi(0);
|
||||||
vtop->type.t = VT_VOID;
|
vtop->type.t = VT_VOID;
|
||||||
|
Loading…
Reference in New Issue
Block a user