From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1861) id 318563858D20; Sat, 18 Nov 2023 17:20:55 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 318563858D20 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Jose E. Marchesi To: bfd-cvs@sourceware.org Subject: [binutils-gdb] gas: bpf: do not allow referring to register names as symbols in operands X-Act-Checkin: binutils-gdb X-Git-Author: Jose E. Marchesi X-Git-Refname: refs/heads/master X-Git-Oldrev: 26c7a0ea380bedb86ff3b5a9ed252d8d2557a0c5 X-Git-Newrev: 8fbb497b7202f404d8914252d44d2ee190a0e172 Message-Id: <20231118172055.318563858D20@sourceware.org> Date: Sat, 18 Nov 2023 17:20:55 +0000 (GMT) X-BeenThere: binutils-cvs@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Binutils-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 18 Nov 2023 17:20:55 -0000 https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3D8fbb497b7202= f404d8914252d44d2ee190a0e172 commit 8fbb497b7202f404d8914252d44d2ee190a0e172 Author: Jose E. Marchesi Date: Sat Nov 18 18:12:44 2023 +0100 gas: bpf: do not allow referring to register names as symbols in operan= ds =20 2023-11-18 Jose E. Marchesi =20 * config/tc-bpf.c (parse_bpf_register): Move before bpf_parse_name. (bpf_parse_name): Do not allow using symbols that are also register names as operands in pseudo-c syntax. * testsuite/gas/bpf/regs-for-symbols-pseudoc.d: New file. * testsuite/gas/bpf/regs-for-symbols-pseudoc.s: Likewise. * testsuite/gas/bpf/regs-for-symbols-pseudoc.l: Likewise. * doc/c-bpf.texi (BPF Registers): Document that it is not possi= ble to refer to register names as symbols in instruction operands. Diff: --- gas/ChangeLog | 12 +++ gas/config/tc-bpf.c | 113 +++++++++++++------= ---- gas/doc/c-bpf.texi | 7 +- gas/testsuite/gas/bpf/bpf.exp | 4 + gas/testsuite/gas/bpf/regs-for-symbols-pseudoc.d | 3 + gas/testsuite/gas/bpf/regs-for-symbols-pseudoc.l | 8 ++ gas/testsuite/gas/bpf/regs-for-symbols-pseudoc.s | 4 + 7 files changed, 102 insertions(+), 49 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index cbe2a57dfee..9f966be40b5 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,15 @@ +2023-11-18 Jose E. Marchesi + + * config/tc-bpf.c (parse_bpf_register): Move before + bpf_parse_name. + (bpf_parse_name): Do not allow using symbols that are also + register names as operands in pseudo-c syntax. + * testsuite/gas/bpf/regs-for-symbols-pseudoc.d: New file. + * testsuite/gas/bpf/regs-for-symbols-pseudoc.s: Likewise. + * testsuite/gas/bpf/regs-for-symbols-pseudoc.l: Likewise. + * doc/c-bpf.texi (BPF Registers): Document that it is not possible + to refer to register names as symbols in instruction operands. + 2023-11-15 YunQiang Su =20 * testsuite/gas/mips/mips.exp (mips_arch_create): Add "--defsym diff --git a/gas/config/tc-bpf.c b/gas/config/tc-bpf.c index 3122f80804a..45abc3c9578 100644 --- a/gas/config/tc-bpf.c +++ b/gas/config/tc-bpf.c @@ -1255,6 +1255,54 @@ parse_expression (char *s, expressionS *exp) return s; } =20 +/* Parse a BPF register name and return the corresponding register + number. Return NULL in case of parse error, or a pointer to the + first character in S that is not part of the register name. */ + +static char * +parse_bpf_register (char *s, char rw, uint8_t *regno) +{ + if (asm_dialect =3D=3D DIALECT_NORMAL) + { + rw =3D 'r'; + if (*s !=3D '%') + return NULL; + s +=3D 1; + + if (*s =3D=3D 'f' && *(s + 1) =3D=3D 'p') + { + *regno =3D 10; + s +=3D 2; + return s; + } + } + + if (*s !=3D rw) + return NULL; + s +=3D 1; + + if (*s =3D=3D '1') + { + if (*(s + 1) =3D=3D '0') + { + *regno =3D 10; + s +=3D 2; + } + else + { + *regno =3D 1; + s +=3D 1; + } + } + else if (*s >=3D '0' && *s <=3D '9') + { + *regno =3D *s - '0'; + s +=3D 1; + } + + return s; +} + /* Symbols created by this parse, but not yet committed to the real symbol table. */ static symbolS *deferred_sym_rootP; @@ -1283,6 +1331,23 @@ bpf_parse_name (const char *name, expressionS *exp, = enum expr_mode mode) =20 gas_assert (mode =3D=3D expr_normal); =20 + /* Pseudo-C syntax uses unprefixed register names like r2 or w3. + Since many instructions take either a register or an + immediate/expression, we should not allow references to symbols + with these names in operands. */ + if (asm_dialect =3D=3D DIALECT_PSEUDOC) + { + uint8_t regno; + + if (parse_bpf_register ((char *) name, 'r', ®no) + || parse_bpf_register ((char *) name, 'w', ®no)) + { + as_bad (_("unexpected register name `%s' in expression"), + name); + return false; + } + } + if (symbol_find (name) !=3D NULL) return false; =20 @@ -1320,54 +1385,6 @@ bpf_parse_name (const char *name, expressionS *exp, = enum expr_mode mode) return true; } =20 -/* Parse a BPF register name and return the corresponding register - number. Return NULL in case of parse error, or a pointer to the - first character in S that is not part of the register name. */ - -static char * -parse_bpf_register (char *s, char rw, uint8_t *regno) -{ - if (asm_dialect =3D=3D DIALECT_NORMAL) - { - rw =3D 'r'; - if (*s !=3D '%') - return NULL; - s +=3D 1; - - if (*s =3D=3D 'f' && *(s + 1) =3D=3D 'p') - { - *regno =3D 10; - s +=3D 2; - return s; - } - } - - if (*s !=3D rw) - return NULL; - s +=3D 1; - - if (*s =3D=3D '1') - { - if (*(s + 1) =3D=3D '0') - { - *regno =3D 10; - s +=3D 2; - } - else - { - *regno =3D 1; - s +=3D 1; - } - } - else if (*s >=3D '0' && *s <=3D '9') - { - *regno =3D *s - '0'; - s +=3D 1; - } - - return s; -} - /* Collect a parse error message. */ =20 static int partial_match_length =3D 0; diff --git a/gas/doc/c-bpf.texi b/gas/doc/c-bpf.texi index bdd9fde0f5a..25ae231d19c 100644 --- a/gas/doc/c-bpf.texi +++ b/gas/doc/c-bpf.texi @@ -113,7 +113,12 @@ Read-only frame pointer register. =20 @noindent Note that in the Pseudo-C syntax register names are not preceded by -@code{%} characters. +@code{%} characters. A consequence of that is that in contexts like +instruction operands, where both register names and expressions +involving symbols are expected, there is no way to disambiguate +between them. In order to keep things simple, this assembler does not +allow to refer to symbols whose names collide with register names in +instruction operands. =20 @node BPF Directives @section BPF Directives diff --git a/gas/testsuite/gas/bpf/bpf.exp b/gas/testsuite/gas/bpf/bpf.exp index fcbeccd8ecd..5bcd8c483a0 100644 --- a/gas/testsuite/gas/bpf/bpf.exp +++ b/gas/testsuite/gas/bpf/bpf.exp @@ -73,6 +73,10 @@ if {[istarget bpf*-*-*]} { run_dump_test disp32-overflow run_dump_test imm32-overflow =20 + # In Pseudo-C it is not possible to refer to symbols + # as operands that have the same name than registers. + run_dump_test regs-for-symbols-pseudoc + # Test that parser does not create undefined symbols run_dump_test asm-extra-sym-1 } diff --git a/gas/testsuite/gas/bpf/regs-for-symbols-pseudoc.d b/gas/testsui= te/gas/bpf/regs-for-symbols-pseudoc.d new file mode 100644 index 00000000000..d99ec8f94c2 --- /dev/null +++ b/gas/testsuite/gas/bpf/regs-for-symbols-pseudoc.d @@ -0,0 +1,3 @@ +#as: -EL -mdialect=3Dpseudoc +#source: regs-for-symbols-pseudoc.s +#error_output: regs-for-symbols-pseudoc.l diff --git a/gas/testsuite/gas/bpf/regs-for-symbols-pseudoc.l b/gas/testsui= te/gas/bpf/regs-for-symbols-pseudoc.l new file mode 100644 index 00000000000..eeda735fb99 --- /dev/null +++ b/gas/testsuite/gas/bpf/regs-for-symbols-pseudoc.l @@ -0,0 +1,8 @@ +.*: Assembler messages: +.*:1: Error: unexpected register name `w3' in expression +.*:2: Error: unexpected register name `r3' in expression +.*:2: Error: unexpected register name `r3' in expression +.*:3: Error: unexpected register name `r3' in expression +.*:3: Error: unexpected register name `r3' in expression +.*:4: Error: unexpected register name `r3' in expression +.*:4: Error: unexpected register name `r3' in expression diff --git a/gas/testsuite/gas/bpf/regs-for-symbols-pseudoc.s b/gas/testsui= te/gas/bpf/regs-for-symbols-pseudoc.s new file mode 100644 index 00000000000..693787d5479 --- /dev/null +++ b/gas/testsuite/gas/bpf/regs-for-symbols-pseudoc.s @@ -0,0 +1,4 @@ + goto w3 + r2 =3D r3 ll + r2 =3D r3+1 ll + r2 =3D 1+r3 ll