From: Robert Pengelly Date: Sun, 23 Aug 2026 00:01:38 +0000 (+0100) Subject: Added __assume support for MSVC compatibility X-Git-Url: https://git.candlhat.org/?a=commitdiff_plain;h=a8fe70726fa951cecc9e2da9010b7e0e09928595;p=scc.git Added __assume support for MSVC compatibility --- diff --git a/amd64.c b/amd64.c index d2f8245..f10a3b7 100644 --- a/amd64.c +++ b/amd64.c @@ -37084,6 +37084,63 @@ static void parse_statement (void) { statement_ends_control_flow = 0; flush_pending_statement_labels (); + if (tok.kind == TOK_ASSUME) { + + const char *assume_start = tok.start; + const char *assume_caret = tok.caret; + + unsigned long assume_line = get_line_number (); + FILE *saved_ofp; + + int assumption_known; + int assumption_value; + + get_token (); + + if (tok.kind != TOK_LPAREN) { + + report_line_at (get_filename (), assume_line, REPORT_ERROR, assume_start, assume_caret, "expected ( after __assume"); + return; + + } + + get_token (); + + if (tok.kind == TOK_RPAREN) { + + report_line_at (get_filename (), assume_line, REPORT_ERROR, assume_start, assume_caret, "__assume requires an expression"); + + get_token (); + expect_semi_or_recover (); + + return; + + } + + saved_ofp = state->ofp; + state->ofp = 0; + + emit_statement_jump_if_false (0); + state->ofp = saved_ofp; + + assumption_known = statement_condition_constant_known; + assumption_value = statement_condition_constant_value; + + if (tok.kind != TOK_RPAREN) { + skip_balanced_until (TOK_RPAREN, TOK_SEMI, TOK_EOF); + } + + expect (TOK_RPAREN, ")"); + expect_semi_or_recover (); + + if (assumption_known && !assumption_value) { + statement_ends_control_flow = 1; + } + + return; + + } + if (parse_inline_asm_statement ()) { return; } diff --git a/i386.c b/i386.c index 9b3212a..08b88a5 100644 --- a/i386.c +++ b/i386.c @@ -34555,6 +34555,63 @@ static void parse_statement (void) { statement_ends_control_flow = 0; flush_pending_statement_labels (); + if (tok.kind == TOK_ASSUME) { + + const char *assume_start = tok.start; + const char *assume_caret = tok.caret; + + unsigned long assume_line = get_line_number (); + FILE *saved_ofp; + + int assumption_known; + int assumption_value; + + get_token (); + + if (tok.kind != TOK_LPAREN) { + + report_line_at (get_filename (), assume_line, REPORT_ERROR, assume_start, assume_caret, "expected ( after __assume"); + return; + + } + + get_token (); + + if (tok.kind == TOK_RPAREN) { + + report_line_at (get_filename (), assume_line, REPORT_ERROR, assume_start, assume_caret, "__assume requires an expression"); + + get_token (); + expect_semi_or_recover (); + + return; + + } + + saved_ofp = state->ofp; + state->ofp = 0; + + emit_statement_jump_if_false (0); + state->ofp = saved_ofp; + + assumption_known = statement_condition_constant_known; + assumption_value = statement_condition_constant_value; + + if (tok.kind != TOK_RPAREN) { + skip_balanced_until (TOK_RPAREN, TOK_SEMI, TOK_EOF); + } + + expect (TOK_RPAREN, ")"); + expect_semi_or_recover (); + + if (assumption_known && !assumption_value) { + statement_ends_control_flow = 1; + } + + return; + + } + if (parse_inline_asm_statement ()) { return; } diff --git a/token.c b/token.c index 4632141..e5f01a1 100755 --- a/token.c +++ b/token.c @@ -1065,6 +1065,7 @@ static int find_kind (const char *start, const char *caret, const char *p) { static struct keyword kws[] = { /* Compiler Specific keywords */ + { "__assume", -1, VERSION, TOK_ASSUME }, { "__builtin_unreachable", -1, VERSION, TOK_BUILTIN_UNREACHABLE }, { "__scc_builtin_va_arg", -1, VERSION, TOK_SCC_BUILTIN_VA_ARG }, diff --git a/token.h b/token.h index 5a0432e..18db011 100755 --- a/token.h +++ b/token.h @@ -67,6 +67,7 @@ enum token_kind { /* Start of keywords. */ TOK_ASM = 256, + TOK_ASSUME, TOK_ATTRIBUTE, TOK_AUTO, TOK_BREAK,