diff --git a/tcc.h b/tcc.h index 124d7e5..156bdd0 100644 --- a/tcc.h +++ b/tcc.h @@ -267,7 +267,8 @@ typedef struct AttributeDef { func_export : 1, func_import : 1, func_args : 5, - fill : 16; + mode : 4, + fill : 12; struct Section *section; } AttributeDef; @@ -278,6 +279,7 @@ typedef struct AttributeDef { #define FUNC_ARGS(r) (((AttributeDef*)&(r))->func_args) #define FUNC_ALIGN(r) (((AttributeDef*)&(r))->aligned) #define FUNC_PACKED(r) (((AttributeDef*)&(r))->packed) +#define ATTR_MODE(r) (((AttributeDef*)&(r))->mode) #define INT_ATTR(ad) (*(int*)(ad)) /* -------------------------------------------------- */ diff --git a/tccgen.c b/tccgen.c index be8d80f..e761f91 100644 --- a/tccgen.c +++ b/tccgen.c @@ -2501,6 +2501,25 @@ static void parse_attribute(AttributeDef *ad) ad->func_call = FUNC_FASTCALLW; break; #endif + case TOK_MODE: + skip('('); + switch(tok) { + case TOK_MODE_DI: + ad->mode = VT_LLONG + 1; + break; + case TOK_MODE_HI: + ad->mode = VT_SHORT + 1; + break; + case TOK_MODE_SI: + ad->mode = VT_INT + 1; + break; + default: + warning("__mode__(%s) not supported\n", get_tok_str(tok, NULL)); + break; + } + next(); + skip(')'); + break; case TOK_DLLEXPORT: ad->func_export = 1; break; @@ -2874,6 +2893,10 @@ static int parse_btype(CType *type, AttributeDef *ad) case TOK_ATTRIBUTE1: case TOK_ATTRIBUTE2: parse_attribute(ad); + if (ATTR_MODE(ad)) { + u = ATTR_MODE(ad) -1; + t = (t & ~VT_BTYPE) | u; + } break; /* GNUC typeof */ case TOK_TYPEOF1: diff --git a/tcctok.h b/tcctok.h index 889ba0b..9075865 100644 --- a/tcctok.h +++ b/tcctok.h @@ -104,6 +104,10 @@ DEF(TOK_FASTCALL1, "fastcall") DEF(TOK_FASTCALL2, "__fastcall") DEF(TOK_FASTCALL3, "__fastcall__") + DEF(TOK_MODE, "__mode__") + DEF(TOK_MODE_DI, "__DI__") + DEF(TOK_MODE_HI, "__HI__") + DEF(TOK_MODE_SI, "__SI__") DEF(TOK_DLLEXPORT, "dllexport") DEF(TOK_DLLIMPORT, "dllimport") DEF(TOK_NORETURN1, "noreturn")