From a5db8e9c1f99cff697fcc75bd385bf7cbfd0d623 Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Fri, 2 Feb 2024 12:00:09 -0500 Subject: [PATCH] freedreno/afuc: Add more general T_IDENTIFIER in lexer This frees us from having to strip the trailing colon, and makes it easier to add other identifiers like for section names. The downside is that now we can't name a label with a reserved word like "mov" but that doesn't seem too bad. Part-of: --- src/freedreno/afuc/asm.h | 9 --------- src/freedreno/afuc/lexer.l | 6 ++++-- src/freedreno/afuc/parser.y | 4 ++-- 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/freedreno/afuc/asm.h b/src/freedreno/afuc/asm.h index 0b5b8a01735..d7d1d9a3b30 100644 --- a/src/freedreno/afuc/asm.h +++ b/src/freedreno/afuc/asm.h @@ -94,15 +94,6 @@ parse_bit(const char *str) unsigned parse_control_reg(const char *name); unsigned parse_sqe_reg(const char *name); -/* string trailing ':' off label: */ -static inline const char * -parse_label_decl(const char *str) -{ - char *s = strdup(str); - s[strlen(s) - 1] = '\0'; - return s; -} - void yyset_in(FILE *_in_str); #endif /* _ASM_H_ */ diff --git a/src/freedreno/afuc/lexer.l b/src/freedreno/afuc/lexer.l index 9adf8741f5f..6856443aa0e 100644 --- a/src/freedreno/afuc/lexer.l +++ b/src/freedreno/afuc/lexer.l @@ -48,8 +48,7 @@ extern YYSTYPE yylval; "b"[0-9][0-9]* yylval.num = parse_bit(yytext); return T_BIT; "@"[a-zA-Z_][a-zA-Z0-9_]* yylval.num = parse_control_reg(yytext); return T_CONTROL_REG; "%"[a-zA-Z_][a-zA-Z0-9_]* yylval.num = parse_sqe_reg(yytext); return T_SQE_REG; -"#"[a-zA-Z_][a-zA-Z0-9_]* yylval.str = strdup(yytext+1); return T_LABEL_REF; /* label reference */ -[a-zA-Z_][a-zA-Z0-9_]*":" yylval.str = parse_label_decl(yytext); return T_LABEL_DECL; /* label declaration */ +"#"[a-zA-Z_][a-zA-Z0-9_]* yylval.str = strdup(yytext+1); return T_LABEL_REF; "["[0-9a-fA-F][0-9a-fA-F]*"]" yylval.num = parse_literal(yytext); return T_LITERAL; /* instructions: */ @@ -106,6 +105,9 @@ extern YYSTYPE yylval; "]" return ']'; "+" return '+'; "!" return '!'; +":" return ':'; + +[a-zA-Z_][a-zA-Z0-9_]* yylval.str = strdup(yytext); return T_IDENTIFIER; . fprintf(stderr, "error at line %d: Unknown token: %s\n", yyget_lineno(), yytext); yyterminate(); diff --git a/src/freedreno/afuc/parser.y b/src/freedreno/afuc/parser.y index fbba055319a..18c7b3a3e16 100644 --- a/src/freedreno/afuc/parser.y +++ b/src/freedreno/afuc/parser.y @@ -122,11 +122,11 @@ label(const char *str) %token T_HEX %token T_CONTROL_REG %token T_SQE_REG -%token T_LABEL_DECL %token T_LABEL_REF %token T_LITERAL %token T_BIT %token T_REGISTER +%token T_IDENTIFIER %token T_OP_NOP %token T_OP_ADD @@ -194,7 +194,7 @@ instr_or_label: instr_r | T_REP instr_r { instr->rep = true; } | branch_instr | other_instr -| T_LABEL_DECL { decl_label($1); } +| T_IDENTIFIER ':' { decl_label($1); } | T_ALIGN immediate { align_instr($2); } | T_JUMPTBL { decl_jumptbl(); }