(code_coverage)=

# Code Coverage

Code coverage is a software testing metric that measures the proportion of
source code executed while running an automated test suite. It provides insight
into test thoroughness by identifying untested functions, dead code paths, and
unexercised conditional branches across library entrypoints and internal
utilities.

LLVM-libc supports Modified Condition / Decision Coverage (MC/DC). MC/DC
evaluates compound boolean decisions composed of multiple sub-conditions (such
as `if (A && (B || C))`). Under MC/DC criteria, each individual boolean
condition must:
* Evaluate to both true and false across the test suite.
* Demonstrate that it can independently affect the outcome of the overall
  decision while other conditions remain fixed.

This provides rigorous structural verification for safety-critical algorithms
without requiring exhaustive testing of all 2<sup>n</sup> condition
permutations.

## Continuous Profiling Architecture

LLVM-libc uses Clang's [continuous profiling mode][clang-continuous]
(`-fprofile-continuous`) to record execution metrics directly into
memory-mapped profile files during test execution.

[clang-continuous]:
  https://clang.llvm.org/docs/UsersManual.html#cmdoption-fprofile-continuous

### Compiler Counter Relocation
When compiled with `-fprofile-continuous`, Clang configures the LLVM code
generator (`-mllvm -runtime-counter-relocation=true`) so that execution counter
increments reference a dynamic base pointer (`*(bias + &counter) += 1`). Each
branch and basic block counter dynamically resolves to an address within a
dedicated profile buffer mapped at program startup.

### Runtime Memory Mapping
During binary initialization, the profiling runtime (`libclang_rt.profile`)
resolves the target `.profraw` file and maps the execution counter section into
process memory using `mmap` with `MAP_SHARED`. The runtime sets the global bias
pointer to this mapped region, routing live counter increments directly into the
file-backed buffer.

### Kernel Page-Cache Synchronization
Execution counts are written directly to shared memory-mapped pages and
synchronized by the operating system kernel's page cache. Subprocesses created
via `fork()` share the same underlying memory mapping, committing statements
executed across parent and child processes directly to the profile file.

### Build System Integration
Setting `-DLIBC_ENABLE_COVERAGE=ON` in the CMake configuration passes
`-fprofile-instr-generate=libc_cov_%p.profraw`, `-fcoverage-mapping`, and
`-fprofile-continuous` across all LLVM-libc compilation units and test link
steps. When `-fprofile-continuous` is enabled, Clang automatically prepends
`%c` to the profile file template, avoiding duplicate specifier warnings at
runtime. Setting `-DLIBC_ENABLE_COVERAGE_MCDC=ON` additionally enables
`-fcoverage-mcdc`.

## Running Code Coverage Locally

### Prerequisites & Toolchain Setup

Generating coverage reports requires Clang 24, LLVM profile tools, CMake, and
Ninja:

* **Compiler:** Clang 24 (or Clang built from HEAD). Full-build hermetic tests
  link `libclang_rt.profile.a`, which must match the compiler version and cannot
  rely on distro-built libraries with glibc source fortification.
* **LLVM Utilities:** Matching Clang 24 versions of `llvm-profdata` and
  `llvm-cov`.
* **Linker:** `lld` is recommended when configuring full-build mode.
* **Build System:** CMake 3.28+ and Ninja.

#### Toolchain Discovery

If your Linux distribution packages version-suffixed binaries (e.g. `clang-24`,
`llvm-profdata-24`), discover and export them:

```bash
CLANG_MAJOR=$(clang --version | sed -n 's/.*version \([0-9]*\).*/\1/p')
export LLVM_PROFDATA=$(which llvm-profdata-$CLANG_MAJOR 2>/dev/null \
  || which llvm-profdata)
export LLVM_COV=$(which llvm-cov-$CLANG_MAJOR 2>/dev/null \
  || which llvm-cov)
```

If version-agnostic tools are directly available in your `PATH`, export:

```bash
export LLVM_PROFDATA=llvm-profdata
export LLVM_COV=llvm-cov
```

Subsequent merge and report commands reference `$LLVM_PROFDATA` and `$LLVM_COV`.

#### Building Clang 24 with Profiling Support

Full-build hermetic tests link `libclang_rt.profile.a`. Distro-built compiler-rt
packages on distributions like Debian or Ubuntu are built with glibc source
fortification enabled, which LLVM-libc does not support because it introduces
unresolved symbols such as `__vfprintf_chk`. Furthermore, compiler-rt must
match the exact version of the compiler used to build. The recommended approach
is building Clang 24, lld, and compiler-rt from HEAD:

```bash
cmake -G Ninja -S llvm -B build-clang \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_INSTALL_PREFIX="$HOME/clang" \
  -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld" \
  -DLLVM_ENABLE_RUNTIMES="compiler-rt" \
  -DLLVM_USE_LINKER=lld
ninja -C build-clang install
```

---

## Cleaning Profile Counters

Removes previously generated raw profile counter files (`.profraw`) and merged
profile databases (`.profdata`) so that new coverage runs record clean,
non-aggregated execution data:

```bash
find . -name "libc_cov_*.profraw" -delete 2>/dev/null || true
rm -f libc_full.profdata libc_mcdc.profdata libc_single.profdata \
  profraw_list.txt
```

---

## Standard Statement & Branch Coverage

Standard coverage measures physical line execution and conditional branch
outcomes across all LLVM-libc entrypoints and internal support utilities.

### 1. Clean Prior Profile Artifacts

Removes previously generated raw profile counters and profile data to maintain
a clean baseline:

```bash
rm -f build-cov/libc_cov_*.profraw libc_cov_*.profraw profraw_list.txt libc_full.profdata
```

### 2. Configure Full-Build Coverage with Clang 24

Configures CMake to build LLVM-libc with code coverage enabled using Clang 24
and LLD:

```bash
cmake -G Ninja -S runtimes -B build-cov \
  -DCMAKE_C_COMPILER="$PWD/build-clang/bin/clang" \
  -DCMAKE_CXX_COMPILER="$PWD/build-clang/bin/clang++" \
  -DLLVM_USE_LINKER=lld \
  -DCMAKE_BUILD_TYPE=Debug \
  -DLLVM_ENABLE_RUNTIMES="libc" \
  -DLLVM_LIBC_FULL_BUILD=ON \
  -DLIBC_ENABLE_COVERAGE=ON
```

### 3. Export Environment Variables

Exports the profile output pattern and Clang 24 tool paths:

```bash
export LLVM_PROFILE_FILE="libc_cov_%p.profraw"
export LLVM_PROFDATA="$PWD/build-clang/bin/llvm-profdata"
export LLVM_COV="$PWD/build-clang/bin/llvm-cov"
```

### 4. Build and Execute Tests

Compiles and executes the test suite:

```bash
ninja -k 0 -C build-cov libc-tests
```

:::{note}
The `-k 0` flag ensures Ninja continues executing all remaining test targets
even if an individual edge-case test encounters an error. To only compile test
binaries without executing them, use
`ninja -C build-cov libc-tests-build`.
:::

### 5. Merge Profile Counters

Scans the build tree for all generated `.profraw` files and indexes them into a
unified, sparse `.profdata` archive using `$LLVM_PROFDATA`:

```bash
find build-cov -name "libc_cov_*.profraw" > profraw_list.txt
"$LLVM_PROFDATA" merge -sparse -f profraw_list.txt -o libc_full.profdata
```

### 6. Generate Coverage Reports

Collects all compiled test binary paths and invokes `$LLVM_COV` to correlate
recorded profile counters against the libc source tree:

```bash
TEST_BINS=($(find build-cov -type f -executable -name "*__build__"))
OBJECT_FLAGS=()
for bin in "${TEST_BINS[@]:1}"; do
  OBJECT_FLAGS+=("-object=$bin")
done
```

Reports can be generated in different formats:

#### Option 1: Terminal Summary Report

Prints an aggregated terminal summary showing line, region, and branch coverage
percentages for each file:

```bash
"$LLVM_COV" report \
  -instr-profile=libc_full.profdata \
  "${TEST_BINS[0]}" "${OBJECT_FLAGS[@]}" \
  --show-branch-summary \
  -ignore-filename-regex=".*(test|utils).*"
```

To restrict the terminal report to a specific source file:

```bash
"$LLVM_COV" report \
  -instr-profile=libc_full.profdata \
  "${TEST_BINS[0]}" "${OBJECT_FLAGS[@]}" \
  libc/src/string/strlen.cpp
```

#### Option 2: Interactive HTML Dashboard

Generates an interactive HTML dashboard containing sortable directory metrics
and syntax-highlighted source views:

```bash
"$LLVM_COV" show \
  -format=html \
  -output-dir=coverage_html \
  -instr-profile=libc_full.profdata \
  "${TEST_BINS[0]}" "${OBJECT_FLAGS[@]}" \
  --show-directory-coverage \
  --show-branches=count \
  -ignore-filename-regex=".*(test|utils).*"

# Open dashboard in browser
xdg-open coverage_html/index.html
```

---

## Modified Condition / Decision Coverage (MC/DC)

MC/DC evaluates boolean sub-conditions within compound logical expressions (such
as `if (A && B)`). It verifies that each individual sub-condition evaluates to
both true and false and independently affects the outcome of the enclosing
decision.

### 1. Clean Prior Profile Artifacts

Removes previous MC/DC profile counters and profile data:

```bash
rm -f build-cov-mcdc/libc_cov_*.profraw libc_cov_*.profraw profraw_list.txt libc_mcdc.profdata
```

### 2. Configure Full-Build Coverage with MC/DC using Clang 24

Configures CMake with `-DLIBC_ENABLE_COVERAGE_MCDC=ON` alongside profiling
flags using Clang 24 and LLD:

```bash
cmake -G Ninja -S runtimes -B build-cov-mcdc \
  -DCMAKE_C_COMPILER="$PWD/build-clang/bin/clang" \
  -DCMAKE_CXX_COMPILER="$PWD/build-clang/bin/clang++" \
  -DLLVM_USE_LINKER=lld \
  -DCMAKE_BUILD_TYPE=Debug \
  -DLLVM_ENABLE_RUNTIMES="libc" \
  -DLLVM_LIBC_FULL_BUILD=ON \
  -DLIBC_ENABLE_COVERAGE=ON \
  -DLIBC_ENABLE_COVERAGE_MCDC=ON
```

### 3. Export Environment Variables

Exports the profile output pattern and Clang 24 tool paths:

```bash
export LLVM_PROFILE_FILE="libc_cov_%p.profraw"
export LLVM_PROFDATA="$PWD/build-clang/bin/llvm-profdata"
export LLVM_COV="$PWD/build-clang/bin/llvm-cov"
```

### 4. Build and Execute Tests

Compiles and executes test executables in parallel with MC/DC instrumentation
enabled:

```bash
ninja -k 0 -C build-cov-mcdc libc-tests
```

### 5. Merge Profile Counters

Indexes and merges all MC/DC `.profraw` files into a unified
`libc_mcdc.profdata` archive for report generation:

```bash
find build-cov-mcdc -name "libc_cov_*.profraw" > profraw_list.txt
"$LLVM_PROFDATA" merge -sparse -f profraw_list.txt -o libc_mcdc.profdata
```

### 6. Generate MC/DC Coverage Reports

Maps MC/DC bitmap records to source AST decisions and evaluates condition
independence pairs:

```bash
TEST_BINS=($(find build-cov-mcdc -type f -executable -name "*__build__"))
OBJECT_FLAGS=()
for bin in "${TEST_BINS[@]:1}"; do
  OBJECT_FLAGS+=("-object=$bin")
done
```

Reports can be generated in two formats depending on your needs:

#### Option 1: Terminal Summary Report

Displays the terminal coverage summary including MC/DC Condition and Missed
Condition percentages:

```bash
"$LLVM_COV" report \
  -instr-profile=libc_mcdc.profdata \
  "${TEST_BINS[0]}" "${OBJECT_FLAGS[@]}" \
  --show-branch-summary \
  --show-mcdc-summary \
  -ignore-filename-regex=".*(test|utils).*"
```

#### Option 2: Interactive HTML Dashboard

Produces an HTML report with expandable MC/DC decision truth tables and test
vector coverage breakdowns:

```bash
"$LLVM_COV" show \
  -format=html \
  -output-dir=coverage_mcdc_html \
  -instr-profile=libc_mcdc.profdata \
  "${TEST_BINS[0]}" "${OBJECT_FLAGS[@]}" \
  --show-directory-coverage \
  --show-branches=count \
  --show-mcdc \
  --show-mcdc-summary \
  -ignore-filename-regex=".*(test|utils).*"

# Open dashboard in browser
xdg-open coverage_mcdc_html/index.html
```

---

## Running Coverage for a Single Test

When developing or modifying a specific function, coverage can be collected for
a single hermetic test without building and executing the entire test suite.

The commands below use `libc.test.src.ctype.isalpha_test` (which tests
`libc/src/ctype/isalpha.cpp`) as an example. You can test any other entrypoint
by substituting the target name and source file path:
* **Target pattern:** `libc.test.<path_to_test>.<test_name>`
  (e.g. `libc.test.src.string.strlen_test`)
* **Source path pattern:** `libc/<path_to_source>/<source_file>.cpp`
  (e.g. `libc/src/string/strlen.cpp`)

### 1. Clean Prior Profile Artifacts

Removes previously generated raw profile counters:

```bash
rm -f libc_cov_*.profraw profraw_list.txt libc_single.profdata
```

### 2. Build and Execute the Targeted Test

Compiles and runs only the specified test binary, immediately writing execution
profile counters to disk upon completion:

```bash
export LLVM_PROFILE_FILE="libc_cov_%p.profraw"

# Standard coverage build
ninja -C build-cov libc.test.src.ctype.isalpha_test

# MC/DC coverage build
ninja -C build-cov-mcdc libc.test.src.ctype.isalpha_test
```

### 3. Merge the Profile

Merges the single test's raw profile into an indexed database:

```bash
find build-cov/ build-cov-mcdc/ \
  -name "libc_cov_*.profraw" 2>/dev/null > profraw_list.txt
"$LLVM_PROFDATA" merge -sparse -f profraw_list.txt -o libc_single.profdata
```

### 4. View Coverage Reports

#### Option 1: Summary Table Report

```bash
BIN_DIR="build-cov/libc/test/src/ctype"
"$LLVM_COV" report \
  -instr-profile=libc_single.profdata \
  "$BIN_DIR/libc.test.src.ctype.isalpha_test.__build__" \
  libc/src/ctype/isalpha.cpp
```

#### Option 2: Line-by-Line & Truth Table View

```bash
BIN_DIR="build-cov-mcdc/libc/test/src/ctype"
"$LLVM_COV" show \
  -instr-profile=libc_single.profdata \
  "$BIN_DIR/libc.test.src.ctype.isalpha_test.__build__" \
  --show-branches=count \
  --show-mcdc \
  libc/src/ctype/isalpha.cpp
```

---

## Interpreting Results

For detailed documentation on the LLVM coverage reporting format, refer to the
[official Clang Source-Based Code Coverage documentation][clang-coverage].

[clang-coverage]:
  https://clang.llvm.org/docs/SourceBasedCodeCoverage.html#interpreting-reports

### Coverage Metrics Overview

* **Line Coverage:** Measures whether each physical line of executable source
  code was reached at least once during testing.
* **Branch Coverage:** Measures whether each conditional branch evaluated to
  both its `True` and `False` paths. For example, if an `if (x > 0)` branch is
  taken 10 times but never skipped, branch coverage is 50% because the `False`
  path was never exercised.
* **MC/DC Coverage:** Evaluates compound boolean expressions (such as
  `if (A && B)` or `if (A || B)`). It verifies that each individual condition
  was tested as both True and False, and demonstrated that it could
  independently change the overall outcome of the decision.

### Interpreting Reports

The summary table produced by `llvm-cov report` displays metrics across
individual source files and overall totals:

* **Regions / Missed Regions:** A region is a continuous segment of code (such
  as a function body or basic block). Missed regions indicate code blocks that
  were never executed.
* **Functions / Missed Functions:** The total number of entrypoints or
  subroutines executed vs unexecuted.
* **Lines / Missed Lines:** Physical source lines executed vs unexecuted.
* **Branches / Missed Branches:** The total count of decision directions (both
  True and False) evaluated.
* **MC/DC Conditions / Missed Conditions:** The count of individual boolean
  sub-conditions that demonstrated independent decision control.

### Interpreting MC/DC Truth Tables

When inspecting with `--show-mcdc`, `llvm-cov` displays an MC/DC analysis table
beneath each compound decision. For instance, consider the following decision:

```text
   19|  if (c < 0 || c > cpp::numeric_limits<unsigned char>::max())
  ------------------------------------------------------------------
  | Conditions: C1 = (c < 0)
  |             C2 = (c > cpp::numeric_limits<unsigned char>::max())
  |
  | Executed Test Vectors:
  |    C1, C2    Result
  | 1 { F,  F  = F      }  (tested with c = 'a')
  | 2 { T,  -  = T      }  (tested with c = -1)
  |
  | C1-Pair: covered (1, 2)
  | C2-Pair: not covered
  | MC/DC Coverage: 50.00%
  ------------------------------------------------------------------
```

* **Conditions:** **C1** represents `c < 0` and **C2** represents
  `c > cpp::numeric_limits<unsigned char>::max()`.
* **Executed Vectors:**
  * **Vector 1 (`F, F = F`):** Tested with a valid character (`c = 'a'`). Both
    C1 and C2 evaluated False, producing an overall False result.
  * **Vector 2 (`T, - = T`):** Tested with a negative value (`c = -1`). C1
    evaluated True, producing an overall True result. The hyphen (`-`)
    indicates C2 was short-circuited and not evaluated.
* **Condition Pairs:**
  * **`C1-Pair: covered (1, 2)`:** Comparing Vector 1 and Vector 2 proves that
    changing C1 from False to True directly flipped the result from False to
    True. C1 is fully covered.
  * **`C2-Pair: not covered`:** C2 was never tested in a state where it
    independently turned the result True while C1 was False.
* **Reaching 100% Coverage:** Add a test with a value above 255 (`c = 256`).
  This executes Vector 3 (`F, T = T`), forming the independence pair `(1, 3)`
  for C2 and reaching 100% MC/DC coverage.
