diff options
author | Jasper Lievisse Adriaanse <jasper@cvs.openbsd.org> | 2020-09-14 18:45:20 +0000 |
---|---|---|
committer | Jasper Lievisse Adriaanse <jasper@cvs.openbsd.org> | 2020-09-14 18:45:20 +0000 |
commit | 71943a3335634db6ca980f9e0d0303452653999d (patch) | |
tree | 24255ea9e8b466aa8e90b2b6e63977cf99905b37 /usr.sbin/btrace | |
parent | 615c44e01091463bc4820459a47c2bf9a1d4f1ce (diff) |
add support for '&' and '|' operators in btrace scripts
feedback from otto@
ok mpi@ kn@ semarie@
Diffstat (limited to 'usr.sbin/btrace')
-rw-r--r-- | usr.sbin/btrace/bt_parse.y | 12 | ||||
-rw-r--r-- | usr.sbin/btrace/bt_parser.h | 4 | ||||
-rw-r--r-- | usr.sbin/btrace/btrace.c | 16 |
3 files changed, 25 insertions, 7 deletions
diff --git a/usr.sbin/btrace/bt_parse.y b/usr.sbin/btrace/bt_parse.y index 52962cd1ff0..6c73db4730d 100644 --- a/usr.sbin/btrace/bt_parse.y +++ b/usr.sbin/btrace/bt_parse.y @@ -1,4 +1,4 @@ -/* $OpenBSD: bt_parse.y,v 1.16 2020/07/11 14:52:14 mpi Exp $ */ +/* $OpenBSD: bt_parse.y,v 1.17 2020/09/14 18:45:19 jasper Exp $ */ /* * Copyright (c) 2019 - 2020 Martin Pieuchot <mpi@openbsd.org> @@ -117,6 +117,8 @@ static int yylex(void); %type <v.arg> expr vargs map mexpr term %type <v.rtype> beginend +%left '|' +%left '&' %left '+' '-' %left '/' '*' %% @@ -172,6 +174,8 @@ term : '(' term ')' { $$ = $2; } | term '-' term { $$ = ba_op('-', $1, $3); } | term '/' term { $$ = ba_op('/', $1, $3); } | term '*' term { $$ = ba_op('*', $1, $3); } + | term '&' term { $$ = ba_op('&', $1, $3); } + | term '|' term { $$ = ba_op('|', $1, $3); } | NUMBER { $$ = ba_new($1, B_AT_LONG); } | builtin { $$ = ba_new(NULL, $1); } | gvar { $$ = bv_get($1); } @@ -332,6 +336,12 @@ ba_op(const char op, struct bt_arg *da0, struct bt_arg *da1) case '/': type = B_AT_OP_DIVIDE; break; + case '&': + type = B_AT_OP_AND; + break; + case '|': + type = B_AT_OP_OR; + break; default: assert(0); } diff --git a/usr.sbin/btrace/bt_parser.h b/usr.sbin/btrace/bt_parser.h index f1c710a5071..cdde6eb6e4f 100644 --- a/usr.sbin/btrace/bt_parser.h +++ b/usr.sbin/btrace/bt_parser.h @@ -1,4 +1,4 @@ -/* $OpenBSD: bt_parser.h,v 1.9 2020/08/13 11:29:39 mpi Exp $ */ +/* $OpenBSD: bt_parser.h,v 1.10 2020/09/14 18:45:19 jasper Exp $ */ /* * Copyright (c) 2019-2020 Martin Pieuchot <mpi@openbsd.org> @@ -143,6 +143,8 @@ struct bt_arg { B_AT_OP_MINUS, B_AT_OP_MULT, B_AT_OP_DIVIDE, + B_AT_OP_AND, + B_AT_OP_OR, } ba_type; }; diff --git a/usr.sbin/btrace/btrace.c b/usr.sbin/btrace/btrace.c index 3c7e44230cf..7b77ceb1366 100644 --- a/usr.sbin/btrace/btrace.c +++ b/usr.sbin/btrace/btrace.c @@ -1,4 +1,4 @@ -/* $OpenBSD: btrace.c,v 1.24 2020/09/11 08:16:15 mpi Exp $ */ +/* $OpenBSD: btrace.c,v 1.25 2020/09/14 18:45:19 jasper Exp $ */ /* * Copyright (c) 2019 - 2020 Martin Pieuchot <mpi@openbsd.org> @@ -812,7 +812,7 @@ stmt_store(struct bt_stmt *bs, struct dt_evt *dtev) case B_AT_BI_NSECS: bv->bv_value = ba_new(builtin_nsecs(dtev), B_AT_LONG); break; - case B_AT_OP_ADD ... B_AT_OP_DIVIDE: + case B_AT_OP_ADD ... B_AT_OP_OR: bv->bv_value = ba_new(ba2long(ba, dtev), B_AT_LONG); break; default: @@ -992,6 +992,12 @@ baexpr2long(struct bt_arg *ba, struct dt_evt *dtev) case B_AT_OP_DIVIDE: result = first / second; break; + case B_AT_OP_AND: + result = first & second; + break; + case B_AT_OP_OR: + result = first | second; + break; default: xabort("unsuported operation %d", ba->ba_type); } @@ -1025,7 +1031,7 @@ ba2long(struct bt_arg *ba, struct dt_evt *dtev) case B_AT_BI_RETVAL: val = dtev->dtev_sysretval[0]; break; - case B_AT_OP_ADD ... B_AT_OP_DIVIDE: + case B_AT_OP_ADD ... B_AT_OP_OR: val = baexpr2long(ba, dtev); break; default: @@ -1093,7 +1099,7 @@ ba2str(struct bt_arg *ba, struct dt_evt *dtev) case B_AT_VAR: str = ba2str(ba_read(ba), dtev); break; - case B_AT_OP_ADD ... B_AT_OP_DIVIDE: + case B_AT_OP_ADD ... B_AT_OP_OR: snprintf(buf, sizeof(buf) - 1, "%ld", ba2long(ba, dtev)); str = buf; break; @@ -1152,7 +1158,7 @@ ba2dtflags(struct bt_arg *ba) case B_AT_MF_MAX: case B_AT_MF_MIN: case B_AT_MF_SUM: - case B_AT_OP_ADD ... B_AT_OP_DIVIDE: + case B_AT_OP_ADD ... B_AT_OP_OR: break; default: xabort("invalid argument type %d", ba->ba_type); |