]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
bpftool: Support "opcodes", "linum", "visual" simultaneously
authorQuentin Monnet <quentin@isovalent.com>
Wed, 5 Apr 2023 13:21:18 +0000 (14:21 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Thu, 6 Apr 2023 04:27:27 +0000 (21:27 -0700)
When dumping a program, the keywords "opcodes" (for printing the raw
opcodes), "linum" (for displaying the filename, line number, column
number along with the source code), and "visual" (for generating the
control flow graph for translated programs) are mutually exclusive. But
there's no reason why they should be. Let's make it possible to pass
several of them at once. The "file FILE" option, which makes bpftool
output a binary image to a file, remains incompatible with the others.

Signed-off-by: Quentin Monnet <quentin@isovalent.com>
Link: https://lore.kernel.org/r/20230405132120.59886-6-quentin@isovalent.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/bpf/bpftool/Documentation/bpftool-prog.rst
tools/bpf/bpftool/bash-completion/bpftool
tools/bpf/bpftool/prog.c

index 06d1e4314406a18d84b3eabccaee6d866a470ea7..9443c524bb7633e27973a91a259642932a138b81 100644 (file)
@@ -28,8 +28,8 @@ PROG COMMANDS
 =============
 
 |      **bpftool** **prog** { **show** | **list** } [*PROG*]
-|      **bpftool** **prog dump xlated** *PROG* [{**file** *FILE* | **opcodes** | **visual** | **linum**}]
-|      **bpftool** **prog dump jited**  *PROG* [{**file** *FILE* | **opcodes** | **linum**}]
+|      **bpftool** **prog dump xlated** *PROG* [{ **file** *FILE* | [**opcodes**] [**linum**] [**visual**] }]
+|      **bpftool** **prog dump jited**  *PROG* [{ **file** *FILE* | [**opcodes**] [**linum**] }]
 |      **bpftool** **prog pin** *PROG* *FILE*
 |      **bpftool** **prog** { **load** | **loadall** } *OBJ* *PATH* [**type** *TYPE*] [**map** {**idx** *IDX* | **name** *NAME*} *MAP*] [**dev** *NAME*] [**pinmaps** *MAP_DIR*] [**autoattach**]
 |      **bpftool** **prog attach** *PROG* *ATTACH_TYPE* [*MAP*]
@@ -88,7 +88,7 @@ DESCRIPTION
                  programs. On such kernels bpftool will automatically emit this
                  information as well.
 
-       **bpftool prog dump xlated** *PROG* [{ **file** *FILE* | **opcodes** | **visual** | **linum** }]
+       **bpftool prog dump xlated** *PROG* [{ **file** *FILE* | [**opcodes**] [**linum**] [**visual**] }]
                  Dump eBPF instructions of the programs from the kernel. By
                  default, eBPF will be disassembled and printed to standard
                  output in human-readable format. In this case, **opcodes**
@@ -109,7 +109,7 @@ DESCRIPTION
                  be displayed.  If **linum** is specified, the filename, line
                  number and line column will also be displayed.
 
-       **bpftool prog dump jited**  *PROG* [{ **file** *FILE* | **opcodes** | **linum** }]
+       **bpftool prog dump jited**  *PROG* [{ **file** *FILE* | [**opcodes**] [**linum**] }]
                  Dump jited image (host machine code) of the program.
 
                  If *FILE* is specified image will be written to a file,
index a3cb07172789f4f5d06476c4a60ce43ce27f2097..69c64dc18b1db917509462177dd0880c67d3dc6c 100644 (file)
@@ -271,7 +271,7 @@ _bpftool()
 
     # Deal with simplest keywords
     case $prev in
-        help|hex|opcodes|visual|linum)
+        help|hex)
             return 0
             ;;
         tag)
@@ -369,13 +369,16 @@ _bpftool()
                             return 0
                             ;;
                         *)
-                            _bpftool_once_attr 'file'
+                            # "file" is not compatible with other keywords here
+                            if _bpftool_search_list 'file'; then
+                                return 0
+                            fi
+                            if ! _bpftool_search_list 'linum opcodes visual'; then
+                                _bpftool_once_attr 'file'
+                            fi
+                            _bpftool_once_attr 'linum opcodes'
                             if _bpftool_search_list 'xlated' && [[ "$json" == 0 ]]; then
-                                COMPREPLY+=( $( compgen -W 'opcodes visual linum' -- \
-                                    "$cur" ) )
-                            else
-                                COMPREPLY+=( $( compgen -W 'opcodes linum' -- \
-                                    "$cur" ) )
+                                _bpftool_once_attr 'visual'
                             fi
                             return 0
                             ;;
index 736defc6e5d0567ac02ae7572d8df823d9a7035b..092525a6933a31705fc133680fdd75df869e15a0 100644 (file)
@@ -905,37 +905,42 @@ static int do_dump(int argc, char **argv)
        if (nb_fds < 1)
                goto exit_free;
 
-       if (is_prefix(*argv, "file")) {
-               NEXT_ARG();
-               if (!argc) {
-                       p_err("expected file path");
-                       goto exit_close;
-               }
-               if (nb_fds > 1) {
-                       p_err("several programs matched");
-                       goto exit_close;
-               }
+       while (argc) {
+               if (is_prefix(*argv, "file")) {
+                       NEXT_ARG();
+                       if (!argc) {
+                               p_err("expected file path");
+                               goto exit_close;
+                       }
+                       if (nb_fds > 1) {
+                               p_err("several programs matched");
+                               goto exit_close;
+                       }
 
-               filepath = *argv;
-               NEXT_ARG();
-       } else if (is_prefix(*argv, "opcodes")) {
-               opcodes = true;
-               NEXT_ARG();
-       } else if (is_prefix(*argv, "visual")) {
-               if (nb_fds > 1) {
-                       p_err("several programs matched");
+                       filepath = *argv;
+                       NEXT_ARG();
+               } else if (is_prefix(*argv, "opcodes")) {
+                       opcodes = true;
+                       NEXT_ARG();
+               } else if (is_prefix(*argv, "visual")) {
+                       if (nb_fds > 1) {
+                               p_err("several programs matched");
+                               goto exit_close;
+                       }
+
+                       visual = true;
+                       NEXT_ARG();
+               } else if (is_prefix(*argv, "linum")) {
+                       linum = true;
+                       NEXT_ARG();
+               } else {
+                       usage();
                        goto exit_close;
                }
-
-               visual = true;
-               NEXT_ARG();
-       } else if (is_prefix(*argv, "linum")) {
-               linum = true;
-               NEXT_ARG();
        }
 
-       if (argc) {
-               usage();
+       if (filepath && (opcodes || visual || linum)) {
+               p_err("'file' is not compatible with 'opcodes', 'visual', or 'linum'");
                goto exit_close;
        }
        if (json_output && visual) {
@@ -2419,8 +2424,8 @@ static int do_help(int argc, char **argv)
 
        fprintf(stderr,
                "Usage: %1$s %2$s { show | list } [PROG]\n"
-               "       %1$s %2$s dump xlated PROG [{ file FILE | opcodes | visual | linum }]\n"
-               "       %1$s %2$s dump jited  PROG [{ file FILE | opcodes | linum }]\n"
+               "       %1$s %2$s dump xlated PROG [{ file FILE | [opcodes] [linum] [visual] }]\n"
+               "       %1$s %2$s dump jited  PROG [{ file FILE | [opcodes] [linum] }]\n"
                "       %1$s %2$s pin   PROG FILE\n"
                "       %1$s %2$s { load | loadall } OBJ  PATH \\\n"
                "                         [type TYPE] [dev NAME] \\\n"