Issue 135239
Summary [llvm-cov] Add new 'llvm-cov' argument '--binaries <binary1> <binary2> ...' to simplify passing in the list of binaries
Labels
Assignees
Reporter bartlettroscoe
    ## Description

The current `llvm-cov` tool takes in this of binaries in a very non-conventional and inconvenient way that make it difficult use with simple scripts.  As shown in:

https://github.com/llvm/llvm-project/blob/65b85bf8bcb6c88f249de99c6b568f13b9794c1c/llvm/utils/prepare-code-coverage-artifact.py#L53-L58

you have to pass the first binary as an unadorned positional argument and next set of binaries prefixed with `-object` as:

```
<binary1> -object <binary2> -object <binary3> ...
```

That is very non-intuitive and inconvenient and makes it very hard to write simple shell scripts to pass a list of binaries to the `llvm-cov` command. 

For example, I have a simple shell script `find-all-llvm-execs.sh`:

```
#!/bin/bash
#
# Find all of the executables built with llvm coverage
#
#   find-all-llvm-execs.sh <base-dir>
#
baseDir=$1
for exe in $(find ${baseDir} -type f -executable); do
  if llvm-readelf --sections "$exe" 2>/dev/null | grep -q '__llvm_covmap'; then
    echo "$exe"
  fi
done
```

that gathers up a list of binaries that have LLVM coverage support for any arbitrary directory.  (It is fast and seems to be pretty robust.)

But I can't just use this to call an `llvm-cov` command as:

```
$ llvm-cov show $(./find-all-llvm-execs.sh <some-subdir>) [other args]
```

because it only uses the first binary and ignores the rest of them.  (It took me a while to figure that out.)

But, ironically, the tool `prepare-code-coverage-artifact.py` takes in a flat list of binaries as shown at:

https://github.com/llvm/llvm-project/blob/65b85bf8bcb6c88f249de99c6b568f13b9794c1c/llvm/utils/prepare-code-coverage-artifact.py#L133-L139

so you can just call:

```
$ time ./prepare-code-coverage-artifact.py --use-existing-profdata coverage.profdata \
  --unified-report -C ${PWD} $(which llvm-profdata) $(which llvm-cov) ${PWD} \
   cov_report \
 $(./find-all-llvm-execs.sh .)
```

Whoever wrote `prepare-code-coverage-artifact.py` knows it is much easier to pass in a flat list of binaries.  (They could have duplicated the approach used by `llvm-cov`, but they did not.)

## Suggested solution

A simple fix for this is to add a new `llvm-cov` argument:

```
--binaries <binary1> <binary2> <binary3> ...
```

that operates like the existing `--sources <src1> <src2> ...` argument.  And you could also support the short option name `-b` (which is not being used yet by `llvm-cov` as of LLVM 20.1) as:

```
-b <binary1> <binary2> <binary3> ...
```

So you could just call:

```
$ llvm-cov show -b $(./find-all-llvm-execs.sh <subdir>) [other args]
```

Then I would not even use `prepare-code-coverage-artifact.py` because it would be so easy to call the individual `llvm-cov` commands. (Like taking candy from a baby.)

Now, you could keep supporting the existing inconvenient and non-intuitive `<binary1> -object <binary2> -object <binary3> ...` arguments.  The new `--binaries <binary1> <binary2> <binary3> ...` argument keeps backward compatibility (for people that like that way of passing in binaries), so they can co-exist.  (However, the `llvm-cov` command should likely error out if both modes were used to pass in the list of binaries.)

_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to