From c2202e82a4da7ec25c1d5866f617b644bdcbb73e Mon Sep 17 00:00:00 2001 From: Michael Buesch Date: Mon, 9 Jun 2008 18:16:39 +0200 Subject: [PATCH] Allow inline %assert inside of complex immediates. Signed-off-by: Michael Buesch --- assembler/parser.y | 11 ++++++++++- assembler/scanner.l | 2 +- assembler/test.asm | 4 ++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/assembler/parser.y b/assembler/parser.y index e75d9f4..50065ba 100644 --- a/assembler/parser.y +++ b/assembler/parser.y @@ -516,7 +516,12 @@ asmdir : ASM_ARCH hexnum_decnum { ad->u.start = label; $$ = ad; } - | ASM_ASSERT assertion { + | asm_assert { + $$ = NULL; + } + ; + +asm_assert : ASM_ASSERT assertion { unsigned int ok = (unsigned int)(unsigned long)$2; if (!ok) assembler_assertion_failed(); @@ -1201,6 +1206,10 @@ complex_imm : PAREN_OPEN complex_imm_arg complex_imm_oper complex_imm_arg PAREN_ | PAREN_OPEN complex_imm PAREN_CLOSE { $$ = $2; } + | PAREN_OPEN asm_assert PAREN_CLOSE { + /* Inline assertion. Always return zero */ + $$ = (void *)(unsigned long)(unsigned int)0; + } | PAREN_OPEN BITW_NOT complex_imm PAREN_CLOSE { unsigned long n = (unsigned long)$3; n = ~n; diff --git a/assembler/scanner.l b/assembler/scanner.l index 6fb3599..5013d0e 100644 --- a/assembler/scanner.l +++ b/assembler/scanner.l @@ -51,7 +51,7 @@ NEWLINE ((\r)|(\n)|(\r\n)) ^{WS}*"%"{WS}*arch { update_lineinfo(); return ASM_ARCH; } ^{WS}*"%"{WS}*start { update_lineinfo(); return ASM_START; } -^{WS}*"%"{WS}*assert { update_lineinfo(); return ASM_ASSERT; } +"%"{WS}*assert { update_lineinfo(); return ASM_ASSERT; } ^{WS}*\.text{WS}*$ { update_lineinfo(); return SECTION_TEXT; } ^{WS}*\.initvals/\({IDENTIFIER}\) { update_lineinfo(); return SECTION_IVALS; } diff --git a/assembler/test.asm b/assembler/test.asm index ecbc273..cb0d3bd 100644 --- a/assembler/test.asm +++ b/assembler/test.asm @@ -35,6 +35,10 @@ .text + /* Inline assertion inside of a complex immediate. + * The %assert() expression will always return zero. */ + mov (1 + (%assert(1 == ((1 + 2) - 2)))), r0 + label: /* ADD instructions */ add r0,r1,r2 /* add */ -- 2.31.1