mirror of
https://github.com/pezkuwichain/revive.git
synced 2026-10-20 18:56:17 +00:00
Code coverage (#529)
Adds `make coverage` (cargo-llvm-cov over the full workspace including revive-llvm-builder), a new "Code coverage" book chapter that briefly explains how to run it, and a PR workflow that runs coverage and comments on the PR (it updates the same comment if it already exists) when the `measure code coverage` label is applied (see e.g. [this comment](https://github.com/paritytech/revive/pull/529#issuecomment-4966136441)). Building instrumented LLVM and generating an LLVM C++ coverage report is also possible, see accompanying [PR description #575](https://github.com/paritytech/revive/pull/575) for more details. --------- Signed-off-by: Cyrill Leutwiler <bigcyrill@hotmail.com> Signed-off-by: xermicus <bigcyrill@hotmail.com> Co-authored-by: Cyrill Leutwiler <bigcyrill@hotmail.com> Co-authored-by: xermicus <cyrill@parity.io> Co-authored-by: elle-j <linnea@parity.io> Co-authored-by: LJ <81748770+elle-j@users.noreply.github.com>
This commit is contained in:
40 files changed
+882
-123
No files matched your search
@@ -0,0 +1,165 @@
|
|||||||
|
# Label-gated coverage workflow (`measure code coverage`).
|
||||||
|
#
|
||||||
|
# The only trigger type is `labeled`: applying the label approves
|
||||||
|
# exactly the head commit present at that moment. Later pushes do NOT
|
||||||
|
# re-fire the workflow. The label is removed automatically at the end
|
||||||
|
# of every run, so re-applying it retriggers the workflow.
|
||||||
|
|
||||||
|
name: Code coverage
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches: [main]
|
||||||
|
types: [labeled]
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
env:
|
||||||
|
CARGO_TERM_COLOR: always
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
coverage:
|
||||||
|
name: Measure coverage
|
||||||
|
if: ${{ github.event.label.name == 'measure code coverage' }}
|
||||||
|
runs-on: parity-large
|
||||||
|
timeout-minutes: 30
|
||||||
|
outputs:
|
||||||
|
artifact-url: ${{ steps.upload.outputs.artifact-url }}
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
steps:
|
||||||
|
- name: Checkout PR head
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
|
persist-credentials: false
|
||||||
|
|
||||||
|
- name: Set up Rust toolchain
|
||||||
|
uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||||
|
with:
|
||||||
|
rustflags: ""
|
||||||
|
components: llvm-tools-preview
|
||||||
|
|
||||||
|
- name: Install solc
|
||||||
|
uses: ./.github/actions/get-solc
|
||||||
|
|
||||||
|
- name: Install Geth
|
||||||
|
run: |
|
||||||
|
sudo add-apt-repository -y ppa:ethereum/ethereum
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y ethereum
|
||||||
|
|
||||||
|
- name: Download LLVM
|
||||||
|
uses: ./.github/actions/get-llvm
|
||||||
|
with:
|
||||||
|
target: x86_64-unknown-linux-gnu
|
||||||
|
|
||||||
|
- name: Set LLVM environment variables
|
||||||
|
run: |
|
||||||
|
echo "LLVM_SYS_221_PREFIX=$(pwd)/llvm-x86_64-unknown-linux-gnu" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Run coverage and generate revive HTML report
|
||||||
|
id: coverage
|
||||||
|
run: |
|
||||||
|
make coverage
|
||||||
|
echo "report_dir=coverage-reports/$(cat target/llvm-cov-target/coverage-stamp)/revive" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
- name: Upload coverage report
|
||||||
|
id: upload
|
||||||
|
uses: actions/upload-artifact@v6
|
||||||
|
with:
|
||||||
|
name: coverage-report-pr-${{ github.event.pull_request.number }}
|
||||||
|
path: ${{ steps.coverage.outputs.report_dir }}
|
||||||
|
retention-days: 30
|
||||||
|
|
||||||
|
comment:
|
||||||
|
name: Comment coverage on PR
|
||||||
|
needs: coverage
|
||||||
|
# Use `always()` so the trigger label is consumed even when measurement
|
||||||
|
# fails or is cancelled. Skipped for fork PRs since their token is
|
||||||
|
# read-only, so commenting and label removal would fail.
|
||||||
|
if: >-
|
||||||
|
always() && github.event.label.name == 'measure code coverage'
|
||||||
|
&& github.event.pull_request.head.repo.full_name == github.repository
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
permissions:
|
||||||
|
pull-requests: write
|
||||||
|
steps:
|
||||||
|
- name: Download coverage artifact
|
||||||
|
if: ${{ !cancelled() && needs.coverage.result == 'success' }}
|
||||||
|
uses: actions/download-artifact@v7
|
||||||
|
with:
|
||||||
|
name: coverage-report-pr-${{ github.event.pull_request.number }}
|
||||||
|
path: coverage
|
||||||
|
|
||||||
|
- name: Comment coverage report on PR
|
||||||
|
if: ${{ !cancelled() && needs.coverage.result == 'success' }}
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
env:
|
||||||
|
ARTIFACT_URL: ${{ needs.coverage.outputs.artifact-url }}
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const fs = require('fs');
|
||||||
|
const summary = fs.readFileSync('coverage/summary.txt', 'utf8').trim();
|
||||||
|
const owner = context.repo.owner;
|
||||||
|
const repo = context.repo.repo;
|
||||||
|
const prNumber = context.issue.number;
|
||||||
|
const sha = context.payload.pull_request.head.sha.substring(0, 8);
|
||||||
|
const runUrl = `${context.serverUrl}/${owner}/${repo}/actions/runs/${context.runId}`;
|
||||||
|
const artifactUrl = process.env.ARTIFACT_URL || runUrl;
|
||||||
|
const marker = '<!-- code-coverage-bot -->';
|
||||||
|
const body = [
|
||||||
|
marker,
|
||||||
|
`### Code coverage`,
|
||||||
|
``,
|
||||||
|
`Report for commit \`${sha}\`: [click here to download the report](${artifactUrl}) and open \`html/index.html\` in a browser.`,
|
||||||
|
``,
|
||||||
|
`<details open><summary>Summary</summary>`,
|
||||||
|
``,
|
||||||
|
summary,
|
||||||
|
``,
|
||||||
|
`</details>`,
|
||||||
|
``,
|
||||||
|
`_Workflow run: [#${context.runId}](${runUrl})_`,
|
||||||
|
].join('\n');
|
||||||
|
|
||||||
|
// Update the prior bot comment in place rather than spamming.
|
||||||
|
// Paginate so the marker is found on PRs with >100 comments.
|
||||||
|
const comments = await github.paginate(
|
||||||
|
github.rest.issues.listComments,
|
||||||
|
{ owner, repo, issue_number: prNumber, per_page: 100 },
|
||||||
|
);
|
||||||
|
const existing = comments.find(c => c.body && c.body.includes(marker));
|
||||||
|
if (existing) {
|
||||||
|
await github.rest.issues.updateComment({
|
||||||
|
owner, repo, comment_id: existing.id, body,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
await github.rest.issues.createComment({
|
||||||
|
owner, repo, issue_number: prNumber, body,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Remove trigger label
|
||||||
|
if: always()
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
try {
|
||||||
|
await github.rest.issues.removeLabel({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
name: 'measure code coverage',
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
// 404: label already removed (e.g. by a human mid-run).
|
||||||
|
if (error.status !== 404) {
|
||||||
|
core.setFailed(`Failed to remove label: ${error.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -33,7 +33,7 @@ jobs:
|
|||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
if: matrix.runner == 'parity-large'
|
if: matrix.runner == 'parity-large'
|
||||||
run: |
|
run: |
|
||||||
sudo apt update && sudo apt-get install -y cmake ninja-build curl git libssl-dev pkg-config clang lld musl xz-utils build-essential
|
sudo apt update && sudo apt-get install -y cmake ninja-build curl git libssl-dev pkg-config clang lld musl xz-utils build-essential zlib1g-dev
|
||||||
|
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
if: matrix.runner == 'macos-15'
|
if: matrix.runner == 'macos-15'
|
||||||
|
|||||||
@@ -23,4 +23,5 @@ playwright-report
|
|||||||
.cache
|
.cache
|
||||||
emsdk
|
emsdk
|
||||||
docs-tmp
|
docs-tmp
|
||||||
|
coverage-reports
|
||||||
workdir
|
workdir
|
||||||
@@ -5,6 +5,8 @@
|
|||||||
install-wasm \
|
install-wasm \
|
||||||
install-llvm-builder \
|
install-llvm-builder \
|
||||||
install-llvm \
|
install-llvm \
|
||||||
|
install-llvm-coverage \
|
||||||
|
install-cargo-llvm-cov \
|
||||||
install-revive-runner \
|
install-revive-runner \
|
||||||
format \
|
format \
|
||||||
clippy \
|
clippy \
|
||||||
@@ -19,6 +21,9 @@
|
|||||||
test-wasm \
|
test-wasm \
|
||||||
test-llvm-builder \
|
test-llvm-builder \
|
||||||
test-book \
|
test-book \
|
||||||
|
coverage \
|
||||||
|
coverage-llvm-report \
|
||||||
|
coverage-browse \
|
||||||
bench \
|
bench \
|
||||||
bench-pvm \
|
bench-pvm \
|
||||||
bench-evm \
|
bench-evm \
|
||||||
@@ -45,6 +50,17 @@ install-llvm: install-llvm-builder
|
|||||||
git submodule update --init --recursive --depth 1
|
git submodule update --init --recursive --depth 1
|
||||||
revive-llvm build --llvm-projects lld --llvm-projects clang
|
revive-llvm build --llvm-projects lld --llvm-projects clang
|
||||||
|
|
||||||
|
# Build an instrumented LLVM, enabling LLVM C++ coverage.
|
||||||
|
# Shares the `target-llvm/<env>/` tree with `install-llvm`.
|
||||||
|
# Run `revive-llvm clean` between variants. `JOBS=N` caps build parallelism.
|
||||||
|
install-llvm-coverage: install-llvm-builder
|
||||||
|
git submodule update --init --recursive --depth 1
|
||||||
|
CMAKE_BUILD_PARALLEL_LEVEL=$(JOBS) revive-llvm build --llvm-projects lld --llvm-projects clang --enable-coverage
|
||||||
|
|
||||||
|
install-cargo-llvm-cov:
|
||||||
|
@command -v cargo-llvm-cov >/dev/null 2>&1 || cargo install cargo-llvm-cov --locked
|
||||||
|
@rustup component add llvm-tools-preview >/dev/null 2>&1 || true
|
||||||
|
|
||||||
install-revive-runner:
|
install-revive-runner:
|
||||||
cargo install --locked --force --path crates/runner --no-default-features
|
cargo install --locked --force --path crates/runner --no-default-features
|
||||||
|
|
||||||
@@ -91,6 +107,127 @@ test-book:
|
|||||||
cargo install mdbook --version 0.5.1 --locked
|
cargo install mdbook --version 0.5.1 --locked
|
||||||
mdbook test book
|
mdbook test book
|
||||||
|
|
||||||
|
# The active run's report directory. Resolved at recipe time
|
||||||
|
# from the stamp that `coverage` records next to the profiles.
|
||||||
|
# Reports accumulate under coverage-reports/<stamp>/.
|
||||||
|
COVERAGE_REPORTS_DIR = coverage-reports/$$(cat target/llvm-cov-target/coverage-stamp)
|
||||||
|
|
||||||
|
LLVM_IS_INSTRUMENTED = "$(LLVM_SYS_221_PREFIX)/bin/llvm-objdump" -h \
|
||||||
|
"$(LLVM_SYS_221_PREFIX)/lib/libLLVMCore.a" 2>/dev/null \
|
||||||
|
| grep -q __llvm_covmap
|
||||||
|
|
||||||
|
# Build instrumented resolc against the existing LLVM build and run coverage.
|
||||||
|
# Envs are used for reducing disk and memory usage, and preventing errors
|
||||||
|
# arising because of it. See ./book/src/developer_guide/coverage.md on
|
||||||
|
# more details and troubleshooting techniques.
|
||||||
|
coverage: export CARGO_PROFILE_DEV_DEBUG = 0
|
||||||
|
coverage: export LLVM_PROFILE_FILE_NAME = revive-%4m.profraw
|
||||||
|
coverage: install-cargo-llvm-cov
|
||||||
|
@if $(LLVM_IS_INSTRUMENTED); then \
|
||||||
|
echo "note: instrumented LLVM in use. This run also collects LLVM C++ coverage and takes several hours."; \
|
||||||
|
fi
|
||||||
|
cargo llvm-cov clean --workspace
|
||||||
|
mkdir -p target/llvm-cov-target
|
||||||
|
date '+%Y-%m-%d_%H-%M' > target/llvm-cov-target/coverage-stamp
|
||||||
|
# Explicitly build the resolc binary that the test suites spawn so
|
||||||
|
# that cargo uplifts it into the debug/ path used further below.
|
||||||
|
cargo llvm-cov run --no-report --bin resolc --locked -- --version
|
||||||
|
@test -x target/llvm-cov-target/debug/resolc || { \
|
||||||
|
echo "error: no runnable resolc in target/llvm-cov-target/debug/."; \
|
||||||
|
exit 1; \
|
||||||
|
}
|
||||||
|
# Use `--no-report` in order to merge the two Rust reports at the later step.
|
||||||
|
# Benches are excluded (i.e. `--all-targets` is not used) since they run duplicate
|
||||||
|
# coverage the tests already provide, while their binaries noticeably inflate each
|
||||||
|
# report pass with instrumented LLVM.
|
||||||
|
PATH="$(CURDIR)/target/llvm-cov-target/debug:$$PATH" \
|
||||||
|
cargo llvm-cov --no-report --workspace \
|
||||||
|
--exclude revive-llvm-builder \
|
||||||
|
--lib --bins --tests \
|
||||||
|
--locked \
|
||||||
|
--ignore-run-fail
|
||||||
|
PATH="$(CURDIR)/target/llvm-cov-target/debug:$$PATH" \
|
||||||
|
cargo llvm-cov --no-report --package revive-integration \
|
||||||
|
--features newyork \
|
||||||
|
--locked \
|
||||||
|
--ignore-run-fail
|
||||||
|
# Exclude the llvm/ and target-llvm/ trees from this workspace-only report (see
|
||||||
|
# `coverage-llvm-report` target), and the benchmarks which are excluded from the run.
|
||||||
|
cargo llvm-cov report --html --output-dir $(COVERAGE_REPORTS_DIR)/revive \
|
||||||
|
--ignore-filename-regex '^$(CURDIR)/(llvm|target-llvm|crates/benchmarks)/'
|
||||||
|
# Slice the HTML report's header and totals rows into a Markdown-table summary,
|
||||||
|
# rather than invoking `report` again which would cost another full covmap decode.
|
||||||
|
awk '{ gsub(/<tr/, "\n<tr"); gsub(/<\/table/, "\n"); print }' \
|
||||||
|
$(COVERAGE_REPORTS_DIR)/revive/html/index.html \
|
||||||
|
| grep -e ">Filename<" -e ">Totals<" \
|
||||||
|
| sed 's/<\/td>/|/g; s/<[^>]*>//g; s/ */ /g; s/ *| */ | /g; s/^/| /; s/ $$//' \
|
||||||
|
| awk 'NR == 1 { print; sep = $$0; gsub(/[^|]/, "-", sep); print sep; next } { print }' \
|
||||||
|
| tee $(COVERAGE_REPORTS_DIR)/revive/summary.txt
|
||||||
|
@[ "$$(wc -l < $(COVERAGE_REPORTS_DIR)/revive/summary.txt)" -eq 3 ] || { \
|
||||||
|
echo "error: unexpected llvm-cov HTML structure. Fix the summary extraction."; \
|
||||||
|
exit 1; \
|
||||||
|
}
|
||||||
|
@echo "revive coverage report: file://$(CURDIR)/$(COVERAGE_REPORTS_DIR)/revive/html/index.html"
|
||||||
|
@if $(LLVM_IS_INSTRUMENTED); then \
|
||||||
|
echo "note: instrumented LLVM detected. Run 'make coverage-llvm-report'" \
|
||||||
|
"to generate the LLVM C++ coverage report from this run."; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Render the LLVM C++ coverage report that a `make coverage` run against an
|
||||||
|
# instrumented LLVM enabled. This is kept separate from the Rust report to
|
||||||
|
# prevent blending LLVM percentages into resolc's own coverage numbers.
|
||||||
|
coverage-llvm-report:
|
||||||
|
@$(LLVM_IS_INSTRUMENTED) || { \
|
||||||
|
echo "error: no instrumented LLVM at LLVM_SYS_221_PREFIX='$(LLVM_SYS_221_PREFIX)'" \
|
||||||
|
"('make install-llvm-coverage' enables it)."; \
|
||||||
|
exit 1; \
|
||||||
|
}
|
||||||
|
@"$(LLVM_SYS_221_PREFIX)/bin/llvm-config" --system-libs | grep -q -- -lz || { \
|
||||||
|
echo "error: the instrumented LLVM at LLVM_SYS_221_PREFIX lacks zlib." \
|
||||||
|
"Install it and rebuild LLVM with 'make install-llvm-coverage'."; \
|
||||||
|
exit 1; \
|
||||||
|
}
|
||||||
|
@find target/llvm-cov-target -name '*.profraw' 2>/dev/null | grep -q . || { \
|
||||||
|
echo "error: no coverage profiles found. Run 'make coverage' first."; \
|
||||||
|
exit 1; \
|
||||||
|
}
|
||||||
|
@test -f target/llvm-cov-target/coverage-stamp || { \
|
||||||
|
echo "error: no recorded coverage run stamp. Run 'make coverage' first."; \
|
||||||
|
exit 1; \
|
||||||
|
}
|
||||||
|
mkdir -p target/coverage-llvm
|
||||||
|
# Raw llvm-profdata/llvm-cov is used (rather than `cargo llvm-cov`) since
|
||||||
|
# that allows include-only filtering (e.g. "only llvm/").
|
||||||
|
"$(LLVM_SYS_221_PREFIX)/bin/llvm-profdata" merge -sparse \
|
||||||
|
--failure-mode=all \
|
||||||
|
$$(find target/llvm-cov-target -name '*.profraw') \
|
||||||
|
-o target/coverage-llvm/llvm.profdata
|
||||||
|
"$(LLVM_SYS_221_PREFIX)/bin/llvm-cov" show -format=html \
|
||||||
|
-output-dir $(COVERAGE_REPORTS_DIR)/llvm/html \
|
||||||
|
-instr-profile target/coverage-llvm/llvm.profdata \
|
||||||
|
target/llvm-cov-target/debug/resolc \
|
||||||
|
llvm/
|
||||||
|
@echo "LLVM C++ coverage report: file://$(CURDIR)/$(COVERAGE_REPORTS_DIR)/llvm/html/index.html"
|
||||||
|
|
||||||
|
# Local coverage browsing.
|
||||||
|
# Prints clickable links to the HTML reports of every recorded coverage run.
|
||||||
|
coverage-browse:
|
||||||
|
@runs="$$(ls -1r coverage-reports 2>/dev/null)"; \
|
||||||
|
if [ -z "$$runs" ]; then \
|
||||||
|
echo "note: no coverage reports found. Run 'make coverage' first."; \
|
||||||
|
else \
|
||||||
|
for run in $$runs; do \
|
||||||
|
echo "$$run:"; \
|
||||||
|
test -f "coverage-reports/$$run/revive/html/index.html" && \
|
||||||
|
echo " revive: file://$(CURDIR)/coverage-reports/$$run/revive/html/index.html" && \
|
||||||
|
echo; \
|
||||||
|
test -f "coverage-reports/$$run/llvm/html/index.html" && \
|
||||||
|
echo " LLVM C++: file://$(CURDIR)/coverage-reports/$$run/llvm/html/index.html" && \
|
||||||
|
echo; \
|
||||||
|
true; \
|
||||||
|
done; \
|
||||||
|
fi
|
||||||
|
|
||||||
bench: install-bin
|
bench: install-bin
|
||||||
cargo criterion --all --all-features --message-format=json \
|
cargo criterion --all --all-features --message-format=json \
|
||||||
| criterion-table > crates/benchmarks/BENCHMARKS.md
|
| criterion-table > crates/benchmarks/BENCHMARKS.md
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
- [IR reference](./developer_guide/newyork_ir.md)
|
- [IR reference](./developer_guide/newyork_ir.md)
|
||||||
- [PVM and the pallet-revive runtime target](./developer_guide/target.md)
|
- [PVM and the pallet-revive runtime target](./developer_guide/target.md)
|
||||||
- [Testing strategy](./developer_guide/testing.md)
|
- [Testing strategy](./developer_guide/testing.md)
|
||||||
|
- [Code coverage](./developer_guide/coverage.md)
|
||||||
- [Cross compilation](./developer_guide/cross_compilation.md)
|
- [Cross compilation](./developer_guide/cross_compilation.md)
|
||||||
- [FAQ](./faq.md)
|
- [FAQ](./faq.md)
|
||||||
- [Roadmap and Vision](./roadmap.md)
|
- [Roadmap and Vision](./roadmap.md)
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
# Code coverage
|
||||||
|
|
||||||
|
Revive measures Rust and LLVM C++ line and region coverage with [`cargo-llvm-cov`](https://github.com/taiki-e/cargo-llvm-cov) over the same tests as `make test-workspace`.
|
||||||
|
|
||||||
|
Two ways to obtain a report:
|
||||||
|
|
||||||
|
1. **Locally:** `make coverage` and `make coverage-llvm-report` (described below).
|
||||||
|
2. **Per PR:** apply the `measure code coverage` label and read the bot-generated PR comment once the triggered workflow completes.
|
||||||
|
|
||||||
|
## Running locally
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install LLVM.
|
||||||
|
make install-llvm
|
||||||
|
|
||||||
|
# Or install instrumented LLVM.
|
||||||
|
make install-llvm-coverage
|
||||||
|
|
||||||
|
# ..set LLVM_SYS_221_PREFIX to a compatible LLVM build..
|
||||||
|
|
||||||
|
# Run coverage and generate revive Rust report.
|
||||||
|
make coverage
|
||||||
|
|
||||||
|
# Generate a separate LLVM C++ report if needed, if
|
||||||
|
# instrumented LLVM was used for `make coverage`.
|
||||||
|
make coverage-llvm-report
|
||||||
|
|
||||||
|
# Print clickable links to all accumulated HTML reports detected
|
||||||
|
# (they're grouped by timestamps) to easily view them in the browser.
|
||||||
|
make coverage-browse
|
||||||
|
```
|
||||||
|
|
||||||
|
The target:
|
||||||
|
|
||||||
|
1. Builds and tests the workspace under cargo-llvm-cov with `--ignore-run-fail` so partial coverage lands even when test binaries exit non-zero.
|
||||||
|
2. Writes a browsable HTML report into a timestamped run directory (`coverage-reports/<stamp>/revive/` or `coverage-reports/<stamp>/llvm/`).
|
||||||
|
|
||||||
|
## Resource requirements and troubleshooting
|
||||||
|
|
||||||
|
`make coverage` bakes in two defaults that keep instrumented runs tractable:
|
||||||
|
* It drops DWARF with `CARGO_PROFILE_DEV_DEBUG=0` since coverage line data lives in the binaries' `__llvm_covmap` sections.
|
||||||
|
* It bounds profile output with `LLVM_PROFILE_FILE_NAME=revive-%4m.profraw`. The default pattern contains `%p`, writing one raw profile per process. With an instrumented LLVM this could exceed tens of gigabytes of raw profiles in a full run. The `%4m` merge pool makes processes merge their counters into a handful of files instead.
|
||||||
|
|
||||||
|
Even with those defaults, plan for:
|
||||||
|
|
||||||
|
* Disk space:
|
||||||
|
* Building instrumented LLVM and running an instrumented `make coverage` still needs tens of gigabytes of disk space.
|
||||||
|
* LLVM link memory (`make install-llvm-coverage`):
|
||||||
|
* If a link step gets OOM-killed, rerun with capped parallelism (e.g. `JOBS=1`) to serialize the links. The rerun resumes incrementally.
|
||||||
|
* Test-binary link memory (`make coverage`):
|
||||||
|
* If a link gets OOM-killed, rerun with `RUSTFLAGS="-C link-arg=-fuse-ld=lld"` (or _additionally_ with capped parallelism, e.g. `CARGO_BUILD_JOBS=1`). GNU ld holds every input object and the coverage mapping of the entire dependency closure in memory at once. lld links with a smaller peak.
|
||||||
|
* Test-run memory (`make coverage`):
|
||||||
|
* Each concurrently running test spawns an instrumented resolc. On memory-constrained machines cap it with `RUST_TEST_THREADS=4`. This throttles test execution only, not compilation.
|
||||||
@@ -120,6 +120,7 @@ fn build_crt(
|
|||||||
"-DCMAKE_C_COMPILER='clang'",
|
"-DCMAKE_C_COMPILER='clang'",
|
||||||
"-DCMAKE_CXX_COMPILER='clang++'",
|
"-DCMAKE_CXX_COMPILER='clang++'",
|
||||||
"-DLLVM_ENABLE_PROJECTS='compiler-rt'",
|
"-DLLVM_ENABLE_PROJECTS='compiler-rt'",
|
||||||
|
"-DLLVM_ENABLE_ZLIB='Off'",
|
||||||
format!("-DLLVM_TARGETS_TO_BUILD='{}'", Platform::AArch64).as_str(),
|
format!("-DLLVM_TARGETS_TO_BUILD='{}'", Platform::AArch64).as_str(),
|
||||||
"-DLLVM_DEFAULT_TARGET_TRIPLE='aarch64-unknown-linux-musl'",
|
"-DLLVM_DEFAULT_TARGET_TRIPLE='aarch64-unknown-linux-musl'",
|
||||||
"-DLLVM_BUILD_TESTS='Off'",
|
"-DLLVM_BUILD_TESTS='Off'",
|
||||||
@@ -200,6 +201,7 @@ fn build_host(
|
|||||||
"-DLLVM_INCLUDE_UTILS='Off'",
|
"-DLLVM_INCLUDE_UTILS='Off'",
|
||||||
"-DLLVM_ENABLE_PROJECTS='clang;lld'",
|
"-DLLVM_ENABLE_PROJECTS='clang;lld'",
|
||||||
"-DLLVM_ENABLE_RUNTIMES='compiler-rt;libcxx;libcxxabi;libunwind'",
|
"-DLLVM_ENABLE_RUNTIMES='compiler-rt;libcxx;libcxxabi;libunwind'",
|
||||||
|
"-DLLVM_ENABLE_ZLIB='Off'",
|
||||||
"-DLIBCXX_CXX_ABI='libcxxabi'",
|
"-DLIBCXX_CXX_ABI='libcxxabi'",
|
||||||
"-DLIBCXX_HAS_MUSL_LIBC='On'",
|
"-DLIBCXX_HAS_MUSL_LIBC='On'",
|
||||||
"-DLIBCXX_ENABLE_SHARED='Off'",
|
"-DLIBCXX_ENABLE_SHARED='Off'",
|
||||||
|
|||||||
@@ -8,7 +8,8 @@ use std::path::Path;
|
|||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
|
|
||||||
/// The build options shared by all platforms.
|
/// The build options shared by all platforms.
|
||||||
pub const SHARED_BUILD_OPTS: [&str; 21] = [
|
/// `LLVM_ENABLE_ZLIB` is emitted by [`shared_build_opts_coverage`].
|
||||||
|
pub const SHARED_BUILD_OPTS: [&str; 20] = [
|
||||||
"-DPACKAGE_VENDOR='Parity Technologies'",
|
"-DPACKAGE_VENDOR='Parity Technologies'",
|
||||||
"-DCMAKE_BUILD_WITH_INSTALL_RPATH=1",
|
"-DCMAKE_BUILD_WITH_INSTALL_RPATH=1",
|
||||||
"-DLLVM_BUILD_DOCS='Off'",
|
"-DLLVM_BUILD_DOCS='Off'",
|
||||||
@@ -18,7 +19,6 @@ pub const SHARED_BUILD_OPTS: [&str; 21] = [
|
|||||||
"-DLLVM_ENABLE_DOXYGEN='Off'",
|
"-DLLVM_ENABLE_DOXYGEN='Off'",
|
||||||
"-DLLVM_ENABLE_SPHINX='Off'",
|
"-DLLVM_ENABLE_SPHINX='Off'",
|
||||||
"-DLLVM_ENABLE_OCAMLDOC='Off'",
|
"-DLLVM_ENABLE_OCAMLDOC='Off'",
|
||||||
"-DLLVM_ENABLE_ZLIB='Off'",
|
|
||||||
"-DLLVM_ENABLE_ZSTD='Off'",
|
"-DLLVM_ENABLE_ZSTD='Off'",
|
||||||
"-DLLVM_ENABLE_LIBXML2='Off'",
|
"-DLLVM_ENABLE_LIBXML2='Off'",
|
||||||
"-DLLVM_ENABLE_BINDINGS='Off'",
|
"-DLLVM_ENABLE_BINDINGS='Off'",
|
||||||
@@ -188,10 +188,18 @@ pub fn shared_build_opts_tests(enabled: bool) -> Vec<String> {
|
|||||||
|
|
||||||
/// The code coverage build options shared by all platforms.
|
/// The code coverage build options shared by all platforms.
|
||||||
pub fn shared_build_opts_coverage(enabled: bool) -> Vec<String> {
|
pub fn shared_build_opts_coverage(enabled: bool) -> Vec<String> {
|
||||||
vec![format!(
|
vec![
|
||||||
"-DLLVM_BUILD_INSTRUMENTED_COVERAGE='{}'",
|
format!(
|
||||||
if enabled { "On" } else { "Off" },
|
"-DLLVM_BUILD_INSTRUMENTED_COVERAGE='{}'",
|
||||||
)]
|
if enabled { "On" } else { "Off" },
|
||||||
|
),
|
||||||
|
// zlib is required to be able to read the compressed profiles that
|
||||||
|
// instrumented resolc binaries emit.
|
||||||
|
format!(
|
||||||
|
"-DLLVM_ENABLE_ZLIB='{}'",
|
||||||
|
if enabled { "FORCE_ON" } else { "Off" },
|
||||||
|
),
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Use of compiler cache (ccache) to speed up the build process.
|
/// Use of compiler cache (ccache) to speed up the build process.
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ fn build_host(
|
|||||||
crate::Platform::PolkaVM
|
crate::Platform::PolkaVM
|
||||||
),
|
),
|
||||||
"-DLLVM_ENABLE_PROJECTS='clang;lld'",
|
"-DLLVM_ENABLE_PROJECTS='clang;lld'",
|
||||||
|
"-DLLVM_ENABLE_ZLIB='Off'",
|
||||||
])
|
])
|
||||||
.args(crate::platforms::shared::SHARED_BUILD_OPTS)
|
.args(crate::platforms::shared::SHARED_BUILD_OPTS)
|
||||||
.args(crate::platforms::shared::SHARED_BUILD_OPTS_NOT_MUSL)
|
.args(crate::platforms::shared::SHARED_BUILD_OPTS_NOT_MUSL)
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ pub fn build(
|
|||||||
musl_target.as_path(),
|
musl_target.as_path(),
|
||||||
llvm_target_crt.as_path(),
|
llvm_target_crt.as_path(),
|
||||||
ccache_variant,
|
ccache_variant,
|
||||||
|
enable_coverage,
|
||||||
)?;
|
)?;
|
||||||
build_target(
|
build_target(
|
||||||
build_type,
|
build_type,
|
||||||
@@ -121,6 +122,7 @@ fn build_crt(
|
|||||||
"-DCMAKE_C_COMPILER='clang'",
|
"-DCMAKE_C_COMPILER='clang'",
|
||||||
"-DCMAKE_CXX_COMPILER='clang++'",
|
"-DCMAKE_CXX_COMPILER='clang++'",
|
||||||
"-DLLVM_ENABLE_PROJECTS='compiler-rt'",
|
"-DLLVM_ENABLE_PROJECTS='compiler-rt'",
|
||||||
|
"-DLLVM_ENABLE_ZLIB='Off'",
|
||||||
format!("-DLLVM_TARGETS_TO_BUILD='{}'", Platform::X86).as_str(),
|
format!("-DLLVM_TARGETS_TO_BUILD='{}'", Platform::X86).as_str(),
|
||||||
"-DLLVM_DEFAULT_TARGET_TRIPLE='x86_64-pc-linux-musl'",
|
"-DLLVM_DEFAULT_TARGET_TRIPLE='x86_64-pc-linux-musl'",
|
||||||
"-DLLVM_BUILD_TESTS='Off'",
|
"-DLLVM_BUILD_TESTS='Off'",
|
||||||
@@ -166,69 +168,78 @@ fn build_host(
|
|||||||
musl_target_directory: &Path,
|
musl_target_directory: &Path,
|
||||||
crt_target_directory: &Path,
|
crt_target_directory: &Path,
|
||||||
ccache_variant: Option<CcacheVariant>,
|
ccache_variant: Option<CcacheVariant>,
|
||||||
|
enable_coverage: bool,
|
||||||
) -> anyhow::Result<()> {
|
) -> anyhow::Result<()> {
|
||||||
crate::utils::command(
|
let mut cmake_command = Command::new("cmake");
|
||||||
Command::new("cmake")
|
cmake_command
|
||||||
.args([
|
.args([
|
||||||
"-S",
|
"-S",
|
||||||
source_directory.to_string_lossy().as_ref(),
|
source_directory.to_string_lossy().as_ref(),
|
||||||
"-B",
|
"-B",
|
||||||
build_directory.to_string_lossy().as_ref(),
|
build_directory.to_string_lossy().as_ref(),
|
||||||
"-G",
|
"-G",
|
||||||
"Ninja",
|
"Ninja",
|
||||||
format!(
|
format!(
|
||||||
"-DDEFAULT_SYSROOT='{}'",
|
"-DDEFAULT_SYSROOT='{}'",
|
||||||
musl_target_directory.to_string_lossy()
|
musl_target_directory.to_string_lossy()
|
||||||
)
|
)
|
||||||
.as_str(),
|
.as_str(),
|
||||||
"-DLINKER_SUPPORTS_COLOR_DIAGNOSTICS=0",
|
"-DLINKER_SUPPORTS_COLOR_DIAGNOSTICS=0",
|
||||||
format!(
|
format!(
|
||||||
"-DCMAKE_INSTALL_PREFIX='{}'",
|
"-DCMAKE_INSTALL_PREFIX='{}'",
|
||||||
target_directory.to_string_lossy()
|
target_directory.to_string_lossy()
|
||||||
)
|
)
|
||||||
.as_str(),
|
.as_str(),
|
||||||
"-DCMAKE_BUILD_TYPE='Release'",
|
"-DCMAKE_BUILD_TYPE='Release'",
|
||||||
"-DCMAKE_C_COMPILER='clang'",
|
"-DCMAKE_C_COMPILER='clang'",
|
||||||
"-DCMAKE_CXX_COMPILER='clang++'",
|
"-DCMAKE_CXX_COMPILER='clang++'",
|
||||||
"-DCLANG_DEFAULT_CXX_STDLIB='libc++'",
|
"-DCLANG_DEFAULT_CXX_STDLIB='libc++'",
|
||||||
"-DCLANG_DEFAULT_RTLIB='compiler-rt'",
|
"-DCLANG_DEFAULT_RTLIB='compiler-rt'",
|
||||||
"-DLLVM_DEFAULT_TARGET_TRIPLE='x86_64-pc-linux-musl'",
|
"-DLLVM_DEFAULT_TARGET_TRIPLE='x86_64-pc-linux-musl'",
|
||||||
"-DLLVM_TARGETS_TO_BUILD='X86'",
|
"-DLLVM_TARGETS_TO_BUILD='X86'",
|
||||||
"-DLLVM_BUILD_TESTS='Off'",
|
"-DLLVM_BUILD_TESTS='Off'",
|
||||||
"-DLLVM_BUILD_UTILS='Off'",
|
"-DLLVM_BUILD_UTILS='Off'",
|
||||||
"-DLLVM_INCLUDE_TESTS='Off'",
|
"-DLLVM_INCLUDE_TESTS='Off'",
|
||||||
"-DLLVM_INCLUDE_UTILS='Off'",
|
"-DLLVM_INCLUDE_UTILS='Off'",
|
||||||
"-DLLVM_ENABLE_PROJECTS='clang;lld'",
|
"-DLLVM_ENABLE_PROJECTS='clang;lld'",
|
||||||
"-DLLVM_ENABLE_RUNTIMES='compiler-rt;libcxx;libcxxabi;libunwind'",
|
"-DLLVM_ENABLE_RUNTIMES='compiler-rt;libcxx;libcxxabi;libunwind'",
|
||||||
"-DLIBCXX_CXX_ABI='libcxxabi'",
|
"-DLLVM_ENABLE_ZLIB='Off'",
|
||||||
"-DLIBCXX_HAS_MUSL_LIBC='On'",
|
"-DLIBCXX_CXX_ABI='libcxxabi'",
|
||||||
"-DLIBCXX_ENABLE_SHARED='Off'",
|
"-DLIBCXX_HAS_MUSL_LIBC='On'",
|
||||||
"-DLIBCXX_ENABLE_STATIC='On'",
|
"-DLIBCXX_ENABLE_SHARED='Off'",
|
||||||
"-DLIBCXX_ENABLE_STATIC_ABI_LIBRARY='On'",
|
"-DLIBCXX_ENABLE_STATIC='On'",
|
||||||
"-DLIBCXXABI_ENABLE_SHARED='Off'",
|
"-DLIBCXX_ENABLE_STATIC_ABI_LIBRARY='On'",
|
||||||
"-DLIBCXXABI_ENABLE_STATIC='On'",
|
"-DLIBCXXABI_ENABLE_SHARED='Off'",
|
||||||
"-DLIBCXXABI_ENABLE_STATIC_UNWINDER='On'",
|
"-DLIBCXXABI_ENABLE_STATIC='On'",
|
||||||
"-DLIBCXXABI_USE_LLVM_UNWINDER='On'",
|
"-DLIBCXXABI_ENABLE_STATIC_UNWINDER='On'",
|
||||||
"-DLIBCXXABI_USE_COMPILER_RT='On'",
|
"-DLIBCXXABI_USE_LLVM_UNWINDER='On'",
|
||||||
"-DLIBUNWIND_ENABLE_STATIC='On'",
|
"-DLIBCXXABI_USE_COMPILER_RT='On'",
|
||||||
"-DLIBUNWIND_ENABLE_SHARED='Off'",
|
"-DLIBUNWIND_ENABLE_STATIC='On'",
|
||||||
"-DCOMPILER_RT_BUILD_CRT='On'",
|
"-DLIBUNWIND_ENABLE_SHARED='Off'",
|
||||||
"-DCOMPILER_RT_BUILD_SANITIZERS='Off'",
|
"-DCOMPILER_RT_BUILD_CRT='On'",
|
||||||
"-DCOMPILER_RT_BUILD_XRAY='Off'",
|
"-DCOMPILER_RT_BUILD_SANITIZERS='Off'",
|
||||||
"-DCOMPILER_RT_BUILD_LIBFUZZER='Off'",
|
"-DCOMPILER_RT_BUILD_XRAY='Off'",
|
||||||
"-DCOMPILER_RT_BUILD_PROFILE='On'",
|
"-DCOMPILER_RT_BUILD_LIBFUZZER='Off'",
|
||||||
"-DCOMPILER_RT_BUILD_MEMPROF='Off'",
|
"-DCOMPILER_RT_BUILD_PROFILE='On'",
|
||||||
"-DCOMPILER_RT_BUILD_ORC='Off'",
|
"-DCOMPILER_RT_BUILD_MEMPROF='Off'",
|
||||||
"-DCOMPILER_RT_DEFAULT_TARGET_ARCH='x86_64'",
|
"-DCOMPILER_RT_BUILD_ORC='Off'",
|
||||||
"-DLIBCLANG_BUILD_STATIC='On'",
|
"-DCOMPILER_RT_DEFAULT_TARGET_ARCH='x86_64'",
|
||||||
"-DBUILD_SHARED_LIBS='Off'",
|
"-DLIBCLANG_BUILD_STATIC='On'",
|
||||||
])
|
"-DBUILD_SHARED_LIBS='Off'",
|
||||||
.args(crate::platforms::shared::SHARED_BUILD_OPTS)
|
])
|
||||||
.args(crate::platforms::shared::shared_build_opts_ccache(
|
.args(crate::platforms::shared::SHARED_BUILD_OPTS)
|
||||||
ccache_variant,
|
.args(crate::platforms::shared::shared_build_opts_ccache(
|
||||||
)),
|
ccache_variant,
|
||||||
"LLVM host building cmake",
|
));
|
||||||
)?;
|
if enable_coverage {
|
||||||
|
cmake_command.args([
|
||||||
|
"-DCOMPILER_RT_BUILD_CTX_PROFILE='Off'",
|
||||||
|
// Skip the link-based target probe; libc++ isn't built yet so
|
||||||
|
// the probe fails and silently disables `libclang_rt.profile.a`.
|
||||||
|
"-DCOMPILER_RT_DEFAULT_TARGET_ONLY='On'",
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
crate::utils::command(&mut cmake_command, "LLVM host building cmake")?;
|
||||||
|
|
||||||
let mut crt_lib_directory = crt_target_directory.to_path_buf();
|
let mut crt_lib_directory = crt_target_directory.to_path_buf();
|
||||||
crt_lib_directory.push("lib/");
|
crt_lib_directory.push("lib/");
|
||||||
|
|||||||
@@ -104,6 +104,13 @@ pub fn ninja(build_dir: &Path) -> anyhow::Result<()> {
|
|||||||
if std::env::var("DRY_RUN").is_ok() {
|
if std::env::var("DRY_RUN").is_ok() {
|
||||||
ninja.arg("-n");
|
ninja.arg("-n");
|
||||||
}
|
}
|
||||||
|
// Mirror cmake's native CMAKE_BUILD_PARALLEL_LEVEL so one env var
|
||||||
|
// throttles both this ninja call and the compiler-rt `cmake --build`.
|
||||||
|
if let Ok(jobs) = std::env::var("CMAKE_BUILD_PARALLEL_LEVEL") {
|
||||||
|
if !jobs.is_empty() {
|
||||||
|
ninja.args(["-j", &jobs]);
|
||||||
|
}
|
||||||
|
}
|
||||||
command(ninja.arg("install"), "Running ninja install")?;
|
command(ninja.arg("install"), "Running ninja install")?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -36,10 +36,10 @@
|
|||||||
const path_to_root = "";
|
const path_to_root = "";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "searchindex-339ac392.js";
|
window.path_to_searchindex_js = "searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="toc-1290cc30.js"></script>
|
<script src="toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
|
|||||||
@@ -35,10 +35,10 @@
|
|||||||
const path_to_root = "";
|
const path_to_root = "";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "searchindex-339ac392.js";
|
window.path_to_searchindex_js = "searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="toc-1290cc30.js"></script>
|
<script src="toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
|
|||||||
@@ -35,10 +35,10 @@
|
|||||||
const path_to_root = "../";
|
const path_to_root = "../";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "../searchindex-339ac392.js";
|
window.path_to_searchindex_js = "../searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="../toc-1290cc30.js"></script>
|
<script src="../toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
|
|||||||
@@ -35,10 +35,10 @@
|
|||||||
const path_to_root = "../";
|
const path_to_root = "../";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "../searchindex-339ac392.js";
|
window.path_to_searchindex_js = "../searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="../toc-1290cc30.js"></script>
|
<script src="../toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
|
|||||||
@@ -0,0 +1,311 @@
|
|||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html lang="en" class="light sidebar-visible" dir="ltr">
|
||||||
|
<head>
|
||||||
|
<!-- Book generated using mdBook -->
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Code coverage - revive compiler book</title>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Custom HTML head -->
|
||||||
|
|
||||||
|
<meta name="description" content="">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<meta name="theme-color" content="#ffffff">
|
||||||
|
|
||||||
|
<link rel="icon" href="../favicon-de23e50b.svg">
|
||||||
|
<link rel="shortcut icon" href="../favicon-8114d1fc.png">
|
||||||
|
<link rel="stylesheet" href="../css/variables-8adf115d.css">
|
||||||
|
<link rel="stylesheet" href="../css/general-2459343d.css">
|
||||||
|
<link rel="stylesheet" href="../css/chrome-ae938929.css">
|
||||||
|
<link rel="stylesheet" href="../css/print-9e4910d8.css" media="print">
|
||||||
|
|
||||||
|
<!-- Fonts -->
|
||||||
|
<link rel="stylesheet" href="../fonts/fonts-9644e21d.css">
|
||||||
|
|
||||||
|
<!-- Highlight.js Stylesheets -->
|
||||||
|
<link rel="stylesheet" id="mdbook-highlight-css" href="../highlight-493f70e1.css">
|
||||||
|
<link rel="stylesheet" id="mdbook-tomorrow-night-css" href="../tomorrow-night-4c0ae647.css">
|
||||||
|
<link rel="stylesheet" id="mdbook-ayu-highlight-css" href="../ayu-highlight-3fdfc3ac.css">
|
||||||
|
|
||||||
|
<!-- Custom theme stylesheets -->
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Provide site root and default themes to javascript -->
|
||||||
|
<script>
|
||||||
|
const path_to_root = "../";
|
||||||
|
const default_light_theme = "light";
|
||||||
|
const default_dark_theme = "navy";
|
||||||
|
window.path_to_searchindex_js = "../searchindex-57ec751f.js";
|
||||||
|
</script>
|
||||||
|
<!-- Start loading toc.js asap -->
|
||||||
|
<script src="../toc-f74aae8e.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="mdbook-help-container">
|
||||||
|
<div id="mdbook-help-popup">
|
||||||
|
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||||
|
<div>
|
||||||
|
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||||
|
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||||
|
<p>Press <kbd>?</kbd> to show this help</p>
|
||||||
|
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="mdbook-body-container">
|
||||||
|
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||||
|
<script>
|
||||||
|
try {
|
||||||
|
let theme = localStorage.getItem('mdbook-theme');
|
||||||
|
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||||
|
|
||||||
|
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||||
|
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||||
|
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||||
|
}
|
||||||
|
} catch (e) { }
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||||
|
<script>
|
||||||
|
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||||
|
let theme;
|
||||||
|
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||||
|
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||||
|
const html = document.documentElement;
|
||||||
|
html.classList.remove('light')
|
||||||
|
html.classList.add(theme);
|
||||||
|
html.classList.add("js");
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
|
||||||
|
|
||||||
|
<!-- Hide / unhide sidebar before it is displayed -->
|
||||||
|
<script>
|
||||||
|
let sidebar = null;
|
||||||
|
const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
|
||||||
|
if (document.body.clientWidth >= 1080) {
|
||||||
|
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||||
|
sidebar = sidebar || 'visible';
|
||||||
|
} else {
|
||||||
|
sidebar = 'hidden';
|
||||||
|
sidebar_toggle.checked = false;
|
||||||
|
}
|
||||||
|
if (sidebar === 'visible') {
|
||||||
|
sidebar_toggle.checked = true;
|
||||||
|
} else {
|
||||||
|
html.classList.remove('sidebar-visible');
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
|
||||||
|
<!-- populated by js -->
|
||||||
|
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||||
|
<noscript>
|
||||||
|
<iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
|
||||||
|
</noscript>
|
||||||
|
<div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
|
||||||
|
<div class="sidebar-resize-indicator"></div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<div id="mdbook-page-wrapper" class="page-wrapper">
|
||||||
|
|
||||||
|
<div class="page">
|
||||||
|
<div id="mdbook-menu-bar-hover-placeholder"></div>
|
||||||
|
<div id="mdbook-menu-bar" class="menu-bar sticky">
|
||||||
|
<div class="left-buttons">
|
||||||
|
<label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
|
||||||
|
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
|
||||||
|
</label>
|
||||||
|
<button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
|
||||||
|
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
|
||||||
|
</button>
|
||||||
|
<ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||||
|
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
|
||||||
|
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
|
||||||
|
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
|
||||||
|
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
|
||||||
|
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
|
||||||
|
<li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
|
||||||
|
</ul>
|
||||||
|
<button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
|
||||||
|
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h1 class="menu-title">revive compiler book</h1>
|
||||||
|
|
||||||
|
<div class="right-buttons">
|
||||||
|
<a href="../print.html" title="Print this book" aria-label="Print this book">
|
||||||
|
<span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="mdbook-search-wrapper" class="hidden">
|
||||||
|
<form id="mdbook-searchbar-outer" class="searchbar-outer">
|
||||||
|
<div class="search-wrapper">
|
||||||
|
<input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
|
||||||
|
<div class="spinner-wrapper">
|
||||||
|
<span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
|
||||||
|
<div id="mdbook-searchresults-header" class="searchresults-header"></div>
|
||||||
|
<ul id="mdbook-searchresults">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||||
|
<script>
|
||||||
|
document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||||
|
document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||||
|
Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
|
||||||
|
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div id="mdbook-content" class="content">
|
||||||
|
<main>
|
||||||
|
<h1 id="code-coverage"><a class="header" href="#code-coverage">Code coverage</a></h1>
|
||||||
|
<p>Revive measures Rust and LLVM C++ line and region coverage with <a href="https://github.com/taiki-e/cargo-llvm-cov"><code>cargo-llvm-cov</code></a> over the same tests as <code>make test-workspace</code>.</p>
|
||||||
|
<p>Two ways to obtain a report:</p>
|
||||||
|
<ol>
|
||||||
|
<li><strong>Locally:</strong> <code>make coverage</code> and <code>make coverage-llvm-report</code> (described below).</li>
|
||||||
|
<li><strong>Per PR:</strong> apply the <code>measure code coverage</code> label and read the bot-generated PR comment once the triggered workflow completes.</li>
|
||||||
|
</ol>
|
||||||
|
<h2 id="running-locally"><a class="header" href="#running-locally">Running locally</a></h2>
|
||||||
|
<pre><code class="language-bash"># Install LLVM.
|
||||||
|
make install-llvm
|
||||||
|
|
||||||
|
# Or install instrumented LLVM.
|
||||||
|
make install-llvm-coverage
|
||||||
|
|
||||||
|
# ..set LLVM_SYS_221_PREFIX to a compatible LLVM build..
|
||||||
|
|
||||||
|
# Run coverage and generate revive Rust report.
|
||||||
|
make coverage
|
||||||
|
|
||||||
|
# Generate a separate LLVM C++ report if needed, if
|
||||||
|
# instrumented LLVM was used for `make coverage`.
|
||||||
|
make coverage-llvm-report
|
||||||
|
|
||||||
|
# Print clickable links to all accumulated HTML reports detected
|
||||||
|
# (they're grouped by timestamps) to easily view them in the browser.
|
||||||
|
make coverage-browse
|
||||||
|
</code></pre>
|
||||||
|
<p>The target:</p>
|
||||||
|
<ol>
|
||||||
|
<li>Builds and tests the workspace under cargo-llvm-cov with <code>--ignore-run-fail</code> so partial coverage lands even when test binaries exit non-zero.</li>
|
||||||
|
<li>Writes a browsable HTML report into a timestamped run directory (<code>coverage-reports/<stamp>/revive/</code> or <code>coverage-reports/<stamp>/llvm/</code>).</li>
|
||||||
|
</ol>
|
||||||
|
<h2 id="resource-requirements-and-troubleshooting"><a class="header" href="#resource-requirements-and-troubleshooting">Resource requirements and troubleshooting</a></h2>
|
||||||
|
<p><code>make coverage</code> bakes in two defaults that keep instrumented runs tractable:</p>
|
||||||
|
<ul>
|
||||||
|
<li>It drops DWARF with <code>CARGO_PROFILE_DEV_DEBUG=0</code> since coverage line data lives in the binaries’ <code>__llvm_covmap</code> sections.</li>
|
||||||
|
<li>It bounds profile output with <code>LLVM_PROFILE_FILE_NAME=revive-%4m.profraw</code>. The default pattern contains <code>%p</code>, writing one raw profile per process. With an instrumented LLVM this could exceed tens of gigabytes of raw profiles in a full run. The <code>%4m</code> merge pool makes processes merge their counters into a handful of files instead.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Even with those defaults, plan for:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Disk space:
|
||||||
|
<ul>
|
||||||
|
<li>Building instrumented LLVM and running an instrumented <code>make coverage</code> still needs tens of gigabytes of disk space.</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>LLVM link memory (<code>make install-llvm-coverage</code>):
|
||||||
|
<ul>
|
||||||
|
<li>If a link step gets OOM-killed, rerun with capped parallelism (e.g. <code>JOBS=1</code>) to serialize the links. The rerun resumes incrementally.</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>Test-binary link memory (<code>make coverage</code>):
|
||||||
|
<ul>
|
||||||
|
<li>If a link gets OOM-killed, rerun with <code>RUSTFLAGS="-C link-arg=-fuse-ld=lld"</code> (or <em>additionally</em> with capped parallelism, e.g. <code>CARGO_BUILD_JOBS=1</code>). GNU ld holds every input object and the coverage mapping of the entire dependency closure in memory at once. lld links with a smaller peak.</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>Test-run memory (<code>make coverage</code>):
|
||||||
|
<ul>
|
||||||
|
<li>Each concurrently running test spawns an instrumented resolc. On memory-constrained machines cap it with <code>RUST_TEST_THREADS=4</code>. This throttles test execution only, not compilation.</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||||
|
<!-- Mobile navigation buttons -->
|
||||||
|
<a rel="prev" href="../developer_guide/testing.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||||
|
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a rel="next prefetch" href="../developer_guide/cross_compilation.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||||
|
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div style="clear: both"></div>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||||
|
<a rel="prev" href="../developer_guide/testing.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||||
|
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a rel="next prefetch" href="../developer_guide/cross_compilation.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||||
|
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
||||||
|
</a>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
|
||||||
|
<template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
|
||||||
|
<template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
|
||||||
|
<template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
|
||||||
|
<template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
|
||||||
|
|
||||||
|
<!-- Livereload script (if served using the cli tool) -->
|
||||||
|
<script>
|
||||||
|
const wsProtocol = location.protocol === 'https:' ? 'wss:' : 'ws:';
|
||||||
|
const wsAddress = wsProtocol + "//" + location.host + "/" + "__livereload";
|
||||||
|
const socket = new WebSocket(wsAddress);
|
||||||
|
socket.onmessage = function (event) {
|
||||||
|
if (event.data === "reload") {
|
||||||
|
socket.close();
|
||||||
|
location.reload();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.onbeforeunload = function() {
|
||||||
|
socket.close();
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<script>
|
||||||
|
window.playground_copyable = true;
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<script src="../elasticlunr-ef4e11c1.min.js"></script>
|
||||||
|
<script src="../mark-09e88c2c.min.js"></script>
|
||||||
|
<script src="../searcher-c2a407aa.js"></script>
|
||||||
|
|
||||||
|
<script src="../clipboard-1626706a.min.js"></script>
|
||||||
|
<script src="../highlight-abc7f01d.js"></script>
|
||||||
|
<script src="../book-a0b12cfe.js"></script>
|
||||||
|
|
||||||
|
<!-- Custom JS scripts -->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -35,10 +35,10 @@
|
|||||||
const path_to_root = "../";
|
const path_to_root = "../";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "../searchindex-339ac392.js";
|
window.path_to_searchindex_js = "../searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="../toc-1290cc30.js"></script>
|
<script src="../toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
@@ -200,7 +200,7 @@ make test-wasm
|
|||||||
|
|
||||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||||
<!-- Mobile navigation buttons -->
|
<!-- Mobile navigation buttons -->
|
||||||
<a rel="prev" href="../developer_guide/testing.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
<a rel="prev" href="../developer_guide/coverage.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
@@ -214,7 +214,7 @@ make test-wasm
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||||
<a rel="prev" href="../developer_guide/testing.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
<a rel="prev" href="../developer_guide/coverage.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|||||||
@@ -35,10 +35,10 @@
|
|||||||
const path_to_root = "../";
|
const path_to_root = "../";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "../searchindex-339ac392.js";
|
window.path_to_searchindex_js = "../searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="../toc-1290cc30.js"></script>
|
<script src="../toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
|
|||||||
@@ -35,10 +35,10 @@
|
|||||||
const path_to_root = "../";
|
const path_to_root = "../";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "../searchindex-339ac392.js";
|
window.path_to_searchindex_js = "../searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="../toc-1290cc30.js"></script>
|
<script src="../toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
|
|||||||
@@ -35,10 +35,10 @@
|
|||||||
const path_to_root = "../";
|
const path_to_root = "../";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "../searchindex-339ac392.js";
|
window.path_to_searchindex_js = "../searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="../toc-1290cc30.js"></script>
|
<script src="../toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
|
|||||||
@@ -35,10 +35,10 @@
|
|||||||
const path_to_root = "../";
|
const path_to_root = "../";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "../searchindex-339ac392.js";
|
window.path_to_searchindex_js = "../searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="../toc-1290cc30.js"></script>
|
<script src="../toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
@@ -234,7 +234,7 @@ export PATH=/path/to/go-ethereum/build/bin/:$PATH
|
|||||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a rel="next prefetch" href="../developer_guide/cross_compilation.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
<a rel="next prefetch" href="../developer_guide/coverage.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
@@ -248,7 +248,7 @@ export PATH=/path/to/go-ethereum/build/bin/:$PATH
|
|||||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a rel="next prefetch" href="../developer_guide/cross_compilation.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
<a rel="next prefetch" href="../developer_guide/coverage.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||||
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
<span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
|
||||||
</a>
|
</a>
|
||||||
</nav>
|
</nav>
|
||||||
|
|||||||
+2
-2
@@ -35,10 +35,10 @@
|
|||||||
const path_to_root = "";
|
const path_to_root = "";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "searchindex-339ac392.js";
|
window.path_to_searchindex_js = "searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="toc-1290cc30.js"></script>
|
<script src="toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
|
|||||||
+2
-2
@@ -35,10 +35,10 @@
|
|||||||
const path_to_root = "";
|
const path_to_root = "";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "searchindex-339ac392.js";
|
window.path_to_searchindex_js = "searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="toc-1290cc30.js"></script>
|
<script src="toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
|
|||||||
+64
-2
@@ -36,10 +36,10 @@
|
|||||||
const path_to_root = "";
|
const path_to_root = "";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "searchindex-339ac392.js";
|
window.path_to_searchindex_js = "searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="toc-1290cc30.js"></script>
|
<script src="toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
@@ -4819,6 +4819,68 @@ export PATH=/path/to/go-ethereum/build/bin/:$PATH
|
|||||||
<p>A lot of nuanced bugs caused by tiny implementation details inside the <code>revive</code> compiler <em>and</em> the <code>pallet-revive</code> runtime could be identified and eliminated early on thanks to the differential testing strategy. Thus, we decided to take this approach further and created a comprehensive test runner and a large suite of more complex test cases.</p>
|
<p>A lot of nuanced bugs caused by tiny implementation details inside the <code>revive</code> compiler <em>and</em> the <code>pallet-revive</code> runtime could be identified and eliminated early on thanks to the differential testing strategy. Thus, we decided to take this approach further and created a comprehensive test runner and a large suite of more complex test cases.</p>
|
||||||
<p>The <a href="https://github.com/paritytech/revive-differential-tests/">Revive Differential Tests</a> follow the exact same strategy but implement a much more powerful test spec format, spec runner and reports. This allows differentially testing much more complex test cases (for example testing Uniswap pair creations and swaps), executed via transactions sent to actual blockchain nodes.</p>
|
<p>The <a href="https://github.com/paritytech/revive-differential-tests/">Revive Differential Tests</a> follow the exact same strategy but implement a much more powerful test spec format, spec runner and reports. This allows differentially testing much more complex test cases (for example testing Uniswap pair creations and swaps), executed via transactions sent to actual blockchain nodes.</p>
|
||||||
<div style="break-before: page; page-break-before: always;"></div>
|
<div style="break-before: page; page-break-before: always;"></div>
|
||||||
|
<h1 id="code-coverage"><a class="header" href="#code-coverage">Code coverage</a></h1>
|
||||||
|
<p>Revive measures Rust and LLVM C++ line and region coverage with <a href="https://github.com/taiki-e/cargo-llvm-cov"><code>cargo-llvm-cov</code></a> over the same tests as <code>make test-workspace</code>.</p>
|
||||||
|
<p>Two ways to obtain a report:</p>
|
||||||
|
<ol>
|
||||||
|
<li><strong>Locally:</strong> <code>make coverage</code> and <code>make coverage-llvm-report</code> (described below).</li>
|
||||||
|
<li><strong>Per PR:</strong> apply the <code>measure code coverage</code> label and read the bot-generated PR comment once the triggered workflow completes.</li>
|
||||||
|
</ol>
|
||||||
|
<h2 id="running-locally"><a class="header" href="#running-locally">Running locally</a></h2>
|
||||||
|
<pre><code class="language-bash"># Install LLVM.
|
||||||
|
make install-llvm
|
||||||
|
|
||||||
|
# Or install instrumented LLVM.
|
||||||
|
make install-llvm-coverage
|
||||||
|
|
||||||
|
# ..set LLVM_SYS_221_PREFIX to a compatible LLVM build..
|
||||||
|
|
||||||
|
# Run coverage and generate revive Rust report.
|
||||||
|
make coverage
|
||||||
|
|
||||||
|
# Generate a separate LLVM C++ report if needed, if
|
||||||
|
# instrumented LLVM was used for `make coverage`.
|
||||||
|
make coverage-llvm-report
|
||||||
|
|
||||||
|
# Print clickable links to all accumulated HTML reports detected
|
||||||
|
# (they're grouped by timestamps) to easily view them in the browser.
|
||||||
|
make coverage-browse
|
||||||
|
</code></pre>
|
||||||
|
<p>The target:</p>
|
||||||
|
<ol>
|
||||||
|
<li>Builds and tests the workspace under cargo-llvm-cov with <code>--ignore-run-fail</code> so partial coverage lands even when test binaries exit non-zero.</li>
|
||||||
|
<li>Writes a browsable HTML report into a timestamped run directory (<code>coverage-reports/<stamp>/revive/</code> or <code>coverage-reports/<stamp>/llvm/</code>).</li>
|
||||||
|
</ol>
|
||||||
|
<h2 id="resource-requirements-and-troubleshooting"><a class="header" href="#resource-requirements-and-troubleshooting">Resource requirements and troubleshooting</a></h2>
|
||||||
|
<p><code>make coverage</code> bakes in two defaults that keep instrumented runs tractable:</p>
|
||||||
|
<ul>
|
||||||
|
<li>It drops DWARF with <code>CARGO_PROFILE_DEV_DEBUG=0</code> since coverage line data lives in the binaries’ <code>__llvm_covmap</code> sections.</li>
|
||||||
|
<li>It bounds profile output with <code>LLVM_PROFILE_FILE_NAME=revive-%4m.profraw</code>. The default pattern contains <code>%p</code>, writing one raw profile per process. With an instrumented LLVM this could exceed tens of gigabytes of raw profiles in a full run. The <code>%4m</code> merge pool makes processes merge their counters into a handful of files instead.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Even with those defaults, plan for:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Disk space:
|
||||||
|
<ul>
|
||||||
|
<li>Building instrumented LLVM and running an instrumented <code>make coverage</code> still needs tens of gigabytes of disk space.</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>LLVM link memory (<code>make install-llvm-coverage</code>):
|
||||||
|
<ul>
|
||||||
|
<li>If a link step gets OOM-killed, rerun with capped parallelism (e.g. <code>JOBS=1</code>) to serialize the links. The rerun resumes incrementally.</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>Test-binary link memory (<code>make coverage</code>):
|
||||||
|
<ul>
|
||||||
|
<li>If a link gets OOM-killed, rerun with <code>RUSTFLAGS="-C link-arg=-fuse-ld=lld"</code> (or <em>additionally</em> with capped parallelism, e.g. <code>CARGO_BUILD_JOBS=1</code>). GNU ld holds every input object and the coverage mapping of the entire dependency closure in memory at once. lld links with a smaller peak.</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>Test-run memory (<code>make coverage</code>):
|
||||||
|
<ul>
|
||||||
|
<li>Each concurrently running test spawns an instrumented resolc. On memory-constrained machines cap it with <code>RUST_TEST_THREADS=4</code>. This throttles test execution only, not compilation.</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div style="break-before: page; page-break-before: always;"></div>
|
||||||
<h1 id="cross-compilation"><a class="header" href="#cross-compilation">Cross compilation</a></h1>
|
<h1 id="cross-compilation"><a class="header" href="#cross-compilation">Cross compilation</a></h1>
|
||||||
<p>We cross-compile the <code>resolc.js</code> frontend executable to Wasm for running it in a Node.js or browser environment.</p>
|
<p>We cross-compile the <code>resolc.js</code> frontend executable to Wasm for running it in a Node.js or browser environment.</p>
|
||||||
<p>The <a href="https://www.musl-libc.org/">musl</a> target is used to obtain statically linked ELF binaries for Linux.</p>
|
<p>The <a href="https://www.musl-libc.org/">musl</a> target is used to obtain statically linked ELF binaries for Linux.</p>
|
||||||
|
|||||||
@@ -35,10 +35,10 @@
|
|||||||
const path_to_root = "";
|
const path_to_root = "";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "searchindex-339ac392.js";
|
window.path_to_searchindex_js = "searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="toc-1290cc30.js"></script>
|
<script src="toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
|
|||||||
+2
-2
@@ -35,10 +35,10 @@
|
|||||||
const path_to_root = "";
|
const path_to_root = "";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "searchindex-339ac392.js";
|
window.path_to_searchindex_js = "searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="toc-1290cc30.js"></script>
|
<script src="toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
|
|||||||
@@ -437,7 +437,7 @@ window.search = window.search || {};
|
|||||||
if (yes) {
|
if (yes) {
|
||||||
loadSearchScript(
|
loadSearchScript(
|
||||||
window.path_to_searchindex_js ||
|
window.path_to_searchindex_js ||
|
||||||
path_to_root + 'searchindex-339ac392.js',
|
path_to_root + 'searchindex-57ec751f.js',
|
||||||
'mdbook-search-index');
|
'mdbook-search-index');
|
||||||
search_wrap.classList.remove('hidden');
|
search_wrap.classList.remove('hidden');
|
||||||
searchicon.setAttribute('aria-expanded', 'true');
|
searchicon.setAttribute('aria-expanded', 'true');
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
window.search = Object.assign(window.search, JSON.parse('{"doc_urls":["welcome.html#welcome","welcome.html#target-audience","welcome.html#other-polkadot-contracts-resources","welcome.html#about","user_guide.html#resolc-user-guide","user_guide.html#revive-vs-resolc-nomenclature","user_guide/installation.html#installation","user_guide/installation.html#resolc-binary-releases","user_guide/installation.html#installing-the-solc-dependency","user_guide/installation.html#revive-npm-package","user_guide/installation.html#buidling-resolc-from-source","user_guide/cli.html#cli-usage","user_guide/cli.html#llvm-optimization-levels","user_guide/cli.html#newyork-ir-pipeline","user_guide/cli.html#stack-size","user_guide/cli.html#heap-size","user_guide/cli.html#solc","user_guide/cli.html#debug-artifacts","user_guide/cli.html#debug-info","user_guide/cli.html#deploy-time-linking","user_guide/js.html#js-npm-package","user_guide/tooling.html#tooling-integration","user_guide/tooling.html#solidity-toolkits","user_guide/tooling.html#compiler-explorer","user_guide/tooling.html#remix-ide","user_guide/std_json.html#standard-json-interface","user_guide/std_json.html#the-settingspolkavm-object","user_guide/std_json.html#settingspolkavmdebuginformation","user_guide/std_json.html#settingspolkavmnewyork","user_guide/std_json.html#the-settingspolkavmmemoryconfig-object","user_guide/std_json.html#the-settingsoptimizer-object","user_guide/std_json.html#settingsoptimizermode","user_guide/std_json.html#settingsllvmarguments","user_guide/std_json.html#the-settingsoutputselection-object","user_guide/std_json.html#the-all--wildcard","user_guide/std_json.html#the-contract-level-evm-output-selection","user_guide/differences.html#differences-to-evm","user_guide/differences.html#deploy-code-vs-runtime-code","user_guide/differences.html#solidity","user_guide/differences.html#the-6364-gas-rule","user_guide/differences.html#addresscreationcode","user_guide/differences.html#yul-functions","user_guide/differences.html#mload-mstore-msize-mcopy-memory-related-functions","user_guide/differences.html#calldataload-calldatacopy","user_guide/differences.html#codecopy","user_guide/differences.html#create-create2","user_guide/differences.html#dataoffset","user_guide/differences.html#datasize","user_guide/differences.html#revert-return","user_guide/differences.html#prevrandao-difficulty","user_guide/differences.html#pc-extcodecopy","user_guide/differences.html#blobhash-blobbasefee","user_guide/differences.html#difference-regarding-the-solc-via-ir-mode","user_guide/differences.html#example-state-variable-initialization-order-in-inheritance","user_guide/rust_libraries.html#rust-contract-libraries","revive_runner.html#revive-runner-sandbox","revive_runner.html#installation-and-usage","revive_runner.html#trace-logs","revive_runner.html#automatic-contract-instantiation","revive_runner.html#example","developer_guide.html#developer-guide","developer_guide/contributing.html#contributor-guide","developer_guide/contributing.html#getting-started","developer_guide/contributing.html#using-the-makefile","developer_guide/contributing.html#codebase-organization","developer_guide/contributing.html#contribution-rules","developer_guide/contributing.html#style-guide","developer_guide/contributing.html#ai-policy","developer_guide/architecture.html#compiler-architecture-and-internals","developer_guide/architecture.html#resolc","developer_guide/architecture.html#reproducible-contract-builds","developer_guide/architecture.html#the-revive-compiler-libraries","developer_guide/architecture.html#evm-heap-memory","developer_guide/architecture.html#the-llvm-dependency","developer_guide/architecture.html#custom-optimizations","developer_guide/newyork_optimizer.html#the-newyork-optimizer","developer_guide/newyork_optimizer.html#motivation","developer_guide/newyork_optimizer.html#pipeline-overview","developer_guide/newyork_optimizer.html#ir-design","developer_guide/newyork_optimizer.html#key-optimizations-explained","developer_guide/newyork_optimizer.html#type-narrowing","developer_guide/newyork_optimizer.html#guard-narrowing","developer_guide/newyork_optimizer.html#heap-optimization","developer_guide/newyork_optimizer.html#free-memory-pointer-range-proof","developer_guide/newyork_optimizer.html#soundness-traps-for-fmp-optimizations","developer_guide/newyork_optimizer.html#keccak256-fusion-and-folding","developer_guide/newyork_optimizer.html#compound-outlining-mapping-access","developer_guide/newyork_optimizer.html#fuzzy-function-deduplication","developer_guide/newyork_optimizer.html#revert-pattern-outlining","developer_guide/newyork_optimizer.html#outlined-helper-functions","developer_guide/newyork_optimizer.html#codesize-results","developer_guide/newyork_optimizer.html#integration-test-contracts","developer_guide/newyork_optimizer.html#openzeppelin-contracts","developer_guide/newyork_optimizer.html#development-history-and-challenges","developer_guide/newyork_optimizer.html#approaches-that-did-nLine truncated
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
window.search = Object.assign(window.search, JSON.parse('{"doc_urls":["welcome.html#welcome","welcome.html#target-audience","welcome.html#other-polkadot-contracts-resources","welcome.html#about","user_guide.html#resolc-user-guide","user_guide.html#revive-vs-resolc-nomenclature","user_guide/installation.html#installation","user_guide/installation.html#resolc-binary-releases","user_guide/installation.html#installing-the-solc-dependency","user_guide/installation.html#revive-npm-package","user_guide/installation.html#buidling-resolc-from-source","user_guide/cli.html#cli-usage","user_guide/cli.html#llvm-optimization-levels","user_guide/cli.html#newyork-ir-pipeline","user_guide/cli.html#stack-size","user_guide/cli.html#heap-size","user_guide/cli.html#solc","user_guide/cli.html#debug-artifacts","user_guide/cli.html#debug-info","user_guide/cli.html#deploy-time-linking","user_guide/js.html#js-npm-package","user_guide/tooling.html#tooling-integration","user_guide/tooling.html#solidity-toolkits","user_guide/tooling.html#compiler-explorer","user_guide/tooling.html#remix-ide","user_guide/std_json.html#standard-json-interface","user_guide/std_json.html#the-settingspolkavm-object","user_guide/std_json.html#settingspolkavmdebuginformation","user_guide/std_json.html#settingspolkavmnewyork","user_guide/std_json.html#the-settingspolkavmmemoryconfig-object","user_guide/std_json.html#the-settingsoptimizer-object","user_guide/std_json.html#settingsoptimizermode","user_guide/std_json.html#settingsllvmarguments","user_guide/std_json.html#the-settingsoutputselection-object","user_guide/std_json.html#the-all--wildcard","user_guide/std_json.html#the-contract-level-evm-output-selection","user_guide/differences.html#differences-to-evm","user_guide/differences.html#deploy-code-vs-runtime-code","user_guide/differences.html#solidity","user_guide/differences.html#the-6364-gas-rule","user_guide/differences.html#addresscreationcode","user_guide/differences.html#yul-functions","user_guide/differences.html#mload-mstore-msize-mcopy-memory-related-functions","user_guide/differences.html#calldataload-calldatacopy","user_guide/differences.html#codecopy","user_guide/differences.html#create-create2","user_guide/differences.html#dataoffset","user_guide/differences.html#datasize","user_guide/differences.html#revert-return","user_guide/differences.html#prevrandao-difficulty","user_guide/differences.html#pc-extcodecopy","user_guide/differences.html#blobhash-blobbasefee","user_guide/differences.html#difference-regarding-the-solc-via-ir-mode","user_guide/differences.html#example-state-variable-initialization-order-in-inheritance","user_guide/rust_libraries.html#rust-contract-libraries","revive_runner.html#revive-runner-sandbox","revive_runner.html#installation-and-usage","revive_runner.html#trace-logs","revive_runner.html#automatic-contract-instantiation","revive_runner.html#example","developer_guide.html#developer-guide","developer_guide/contributing.html#contributor-guide","developer_guide/contributing.html#getting-started","developer_guide/contributing.html#using-the-makefile","developer_guide/contributing.html#codebase-organization","developer_guide/contributing.html#contribution-rules","developer_guide/contributing.html#style-guide","developer_guide/contributing.html#ai-policy","developer_guide/architecture.html#compiler-architecture-and-internals","developer_guide/architecture.html#resolc","developer_guide/architecture.html#reproducible-contract-builds","developer_guide/architecture.html#the-revive-compiler-libraries","developer_guide/architecture.html#evm-heap-memory","developer_guide/architecture.html#the-llvm-dependency","developer_guide/architecture.html#custom-optimizations","developer_guide/newyork_optimizer.html#the-newyork-optimizer","developer_guide/newyork_optimizer.html#motivation","developer_guide/newyork_optimizer.html#pipeline-overview","developer_guide/newyork_optimizer.html#ir-design","developer_guide/newyork_optimizer.html#key-optimizations-explained","developer_guide/newyork_optimizer.html#type-narrowing","developer_guide/newyork_optimizer.html#guard-narrowing","developer_guide/newyork_optimizer.html#heap-optimization","developer_guide/newyork_optimizer.html#free-memory-pointer-range-proof","developer_guide/newyork_optimizer.html#soundness-traps-for-fmp-optimizations","developer_guide/newyork_optimizer.html#keccak256-fusion-and-folding","developer_guide/newyork_optimizer.html#compound-outlining-mapping-access","developer_guide/newyork_optimizer.html#fuzzy-function-deduplication","developer_guide/newyork_optimizer.html#revert-pattern-outlining","developer_guide/newyork_optimizer.html#outlined-helper-functions","developer_guide/newyork_optimizer.html#codesize-results","developer_guide/newyork_optimizer.html#integration-test-contracts","developer_guide/newyork_optimizer.html#openzeppelin-contracts","developer_guide/newyork_optimizer.html#development-history-and-challenges","developer_guide/newyork_optimizer.html#approaches-that-did-nLine truncated
|
||||||
@@ -8,7 +8,7 @@ class MDBookSidebarScrollbox extends HTMLElement {
|
|||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
connectedCallback() {
|
connectedCallback() {
|
||||||
this.innerHTML = '<ol class="chapter"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="welcome.html"><strong aria-hidden="true">1.</strong> Welcome</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide.html"><strong aria-hidden="true">2.</strong> resolc user guide</a></span><ol class="section"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/installation.html"><strong aria-hidden="true">2.1.</strong> Installation</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/cli.html"><strong aria-hidden="true">2.2.</strong> Command Line Interface</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/js.html"><strong aria-hidden="true">2.3.</strong> JS NPM package</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/tooling.html"><strong aria-hidden="true">2.4.</strong> Tooling integration</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/std_json.html"><strong aria-hidden="true">2.5.</strong> Standard JSON interface</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/differences.html"><strong aria-hidden="true">2.6.</strong> Differences to EVM</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/rust_libraries.html"><strong aria-hidden="true">2.7.</strong> Rust contract libraries</a></span></li></ol><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="revive_runner.html"><strong aria-hidden="true">3.</strong> revive-runner sandbox</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide.html"><strong aria-hidden="true">4.</strong> Developer Guide</a></span><ol class="section"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/contributing.html"><strong aria-hidden="true">4.1.</strong> Contributor guide</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/architecture.html"><strong aria-hidden="true">4.2.</strong> Compiler architecture</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/newyork_optimizer.html"><strong aria-hidden="true">4.3.</strong> The newyork optimizer</a></span><ol class="section"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/newyork_ir.html"><strong aria-hidden="true">4.3.1.</strong> IR reference</a></span></li></ol><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/target.html"><strong aria-hidden="true">4.4.</strong> PVM and the pallet-revive runtime target</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/testing.html"><strong aria-hidden="true">4.5.</strong> Testing strategy</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/cross_compilation.html"><strong aria-hidden="true">4.6.</strong> Cross compilation</a></span></li></ol><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="faq.html"><strong aria-hidden="true">5.</strong> FAQ</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="roadmap.html"><strong aria-hidden="true">6.</strong> Roadmap and Vision</a></span></li></ol>';
|
this.innerHTML = '<ol class="chapter"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="welcome.html"><strong aria-hidden="true">1.</strong> Welcome</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide.html"><strong aria-hidden="true">2.</strong> resolc user guide</a></span><ol class="section"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/installation.html"><strong aria-hidden="true">2.1.</strong> Installation</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/cli.html"><strong aria-hidden="true">2.2.</strong> Command Line Interface</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/js.html"><strong aria-hidden="true">2.3.</strong> JS NPM package</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/tooling.html"><strong aria-hidden="true">2.4.</strong> Tooling integration</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/std_json.html"><strong aria-hidden="true">2.5.</strong> Standard JSON interface</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/differences.html"><strong aria-hidden="true">2.6.</strong> Differences to EVM</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/rust_libraries.html"><strong aria-hidden="true">2.7.</strong> Rust contract libraries</a></span></li></ol><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="revive_runner.html"><strong aria-hidden="true">3.</strong> revive-runner sandbox</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide.html"><strong aria-hidden="true">4.</strong> Developer Guide</a></span><ol class="section"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/contributing.html"><strong aria-hidden="true">4.1.</strong> Contributor guide</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/architecture.html"><strong aria-hidden="true">4.2.</strong> Compiler architecture</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/newyork_optimizer.html"><strong aria-hidden="true">4.3.</strong> The newyork optimizer</a></span><ol class="section"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/newyork_ir.html"><strong aria-hidden="true">4.3.1.</strong> IR reference</a></span></li></ol><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/target.html"><strong aria-hidden="true">4.4.</strong> PVM and the pallet-revive runtime target</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/testing.html"><strong aria-hidden="true">4.5.</strong> Testing strategy</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/coverage.html"><strong aria-hidden="true">4.6.</strong> Code coverage</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/cross_compilation.html"><strong aria-hidden="true">4.7.</strong> Cross compilation</a></span></li></ol><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="faq.html"><strong aria-hidden="true">5.</strong> FAQ</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="roadmap.html"><strong aria-hidden="true">6.</strong> Roadmap and Vision</a></span></li></ol>';
|
||||||
// Set the current, active page, and reveal it if it's hidden
|
// Set the current, active page, and reveal it if it's hidden
|
||||||
let current_page = document.location.href.toString().split('#')[0].split('?')[0];
|
let current_page = document.location.href.toString().split('#')[0].split('?')[0];
|
||||||
if (current_page.endsWith('/')) {
|
if (current_page.endsWith('/')) {
|
||||||
+1
-1
@@ -26,6 +26,6 @@
|
|||||||
<!-- Custom theme stylesheets -->
|
<!-- Custom theme stylesheets -->
|
||||||
</head>
|
</head>
|
||||||
<body class="sidebar-iframe-inner">
|
<body class="sidebar-iframe-inner">
|
||||||
<ol class="chapter"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="welcome.html" target="_parent"><strong aria-hidden="true">1.</strong> Welcome</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide.html" target="_parent"><strong aria-hidden="true">2.</strong> resolc user guide</a></span><ol class="section"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/installation.html" target="_parent"><strong aria-hidden="true">2.1.</strong> Installation</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/cli.html" target="_parent"><strong aria-hidden="true">2.2.</strong> Command Line Interface</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/js.html" target="_parent"><strong aria-hidden="true">2.3.</strong> JS NPM package</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/tooling.html" target="_parent"><strong aria-hidden="true">2.4.</strong> Tooling integration</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/std_json.html" target="_parent"><strong aria-hidden="true">2.5.</strong> Standard JSON interface</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/differences.html" target="_parent"><strong aria-hidden="true">2.6.</strong> Differences to EVM</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/rust_libraries.html" target="_parent"><strong aria-hidden="true">2.7.</strong> Rust contract libraries</a></span></li></ol><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="revive_runner.html" target="_parent"><strong aria-hidden="true">3.</strong> revive-runner sandbox</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide.html" target="_parent"><strong aria-hidden="true">4.</strong> Developer Guide</a></span><ol class="section"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/contributing.html" target="_parent"><strong aria-hidden="true">4.1.</strong> Contributor guide</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/architecture.html" target="_parent"><strong aria-hidden="true">4.2.</strong> Compiler architecture</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/newyork_optimizer.html" target="_parent"><strong aria-hidden="true">4.3.</strong> The newyork optimizer</a></span><ol class="section"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/newyork_ir.html" target="_parent"><strong aria-hidden="true">4.3.1.</strong> IR reference</a></span></li></ol><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/target.html" target="_parent"><strong aria-hidden="true">4.4.</strong> PVM and the pallet-revive runtime target</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/testing.html" target="_parent"><strong aria-hidden="true">4.5.</strong> Testing strategy</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/cross_compilation.html" target="_parent"><strong aria-hidden="true">4.6.</strong> Cross compilation</a></span></li></ol><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="faq.html" target="_parent"><strong aria-hidden="true">5.</strong> FAQ</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="roadmap.html" target="_parent"><strong aria-hidden="true">6.</strong> Roadmap and Vision</a></span></li></ol>
|
<ol class="chapter"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="welcome.html" target="_parent"><strong aria-hidden="true">1.</strong> Welcome</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide.html" target="_parent"><strong aria-hidden="true">2.</strong> resolc user guide</a></span><ol class="section"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/installation.html" target="_parent"><strong aria-hidden="true">2.1.</strong> Installation</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/cli.html" target="_parent"><strong aria-hidden="true">2.2.</strong> Command Line Interface</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/js.html" target="_parent"><strong aria-hidden="true">2.3.</strong> JS NPM package</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/tooling.html" target="_parent"><strong aria-hidden="true">2.4.</strong> Tooling integration</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/std_json.html" target="_parent"><strong aria-hidden="true">2.5.</strong> Standard JSON interface</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/differences.html" target="_parent"><strong aria-hidden="true">2.6.</strong> Differences to EVM</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="user_guide/rust_libraries.html" target="_parent"><strong aria-hidden="true">2.7.</strong> Rust contract libraries</a></span></li></ol><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="revive_runner.html" target="_parent"><strong aria-hidden="true">3.</strong> revive-runner sandbox</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide.html" target="_parent"><strong aria-hidden="true">4.</strong> Developer Guide</a></span><ol class="section"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/contributing.html" target="_parent"><strong aria-hidden="true">4.1.</strong> Contributor guide</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/architecture.html" target="_parent"><strong aria-hidden="true">4.2.</strong> Compiler architecture</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/newyork_optimizer.html" target="_parent"><strong aria-hidden="true">4.3.</strong> The newyork optimizer</a></span><ol class="section"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/newyork_ir.html" target="_parent"><strong aria-hidden="true">4.3.1.</strong> IR reference</a></span></li></ol><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/target.html" target="_parent"><strong aria-hidden="true">4.4.</strong> PVM and the pallet-revive runtime target</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/testing.html" target="_parent"><strong aria-hidden="true">4.5.</strong> Testing strategy</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/coverage.html" target="_parent"><strong aria-hidden="true">4.6.</strong> Code coverage</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="developer_guide/cross_compilation.html" target="_parent"><strong aria-hidden="true">4.7.</strong> Cross compilation</a></span></li></ol><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="faq.html" target="_parent"><strong aria-hidden="true">5.</strong> FAQ</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="roadmap.html" target="_parent"><strong aria-hidden="true">6.</strong> Roadmap and Vision</a></span></li></ol>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -35,10 +35,10 @@
|
|||||||
const path_to_root = "";
|
const path_to_root = "";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "searchindex-339ac392.js";
|
window.path_to_searchindex_js = "searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="toc-1290cc30.js"></script>
|
<script src="toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
|
|||||||
@@ -35,10 +35,10 @@
|
|||||||
const path_to_root = "../";
|
const path_to_root = "../";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "../searchindex-339ac392.js";
|
window.path_to_searchindex_js = "../searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="../toc-1290cc30.js"></script>
|
<script src="../toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
|
|||||||
@@ -35,10 +35,10 @@
|
|||||||
const path_to_root = "../";
|
const path_to_root = "../";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "../searchindex-339ac392.js";
|
window.path_to_searchindex_js = "../searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="../toc-1290cc30.js"></script>
|
<script src="../toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
|
|||||||
@@ -35,10 +35,10 @@
|
|||||||
const path_to_root = "../";
|
const path_to_root = "../";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "../searchindex-339ac392.js";
|
window.path_to_searchindex_js = "../searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="../toc-1290cc30.js"></script>
|
<script src="../toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
|
|||||||
@@ -35,10 +35,10 @@
|
|||||||
const path_to_root = "../";
|
const path_to_root = "../";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "../searchindex-339ac392.js";
|
window.path_to_searchindex_js = "../searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="../toc-1290cc30.js"></script>
|
<script src="../toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
|
|||||||
@@ -35,10 +35,10 @@
|
|||||||
const path_to_root = "../";
|
const path_to_root = "../";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "../searchindex-339ac392.js";
|
window.path_to_searchindex_js = "../searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="../toc-1290cc30.js"></script>
|
<script src="../toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
|
|||||||
@@ -35,10 +35,10 @@
|
|||||||
const path_to_root = "../";
|
const path_to_root = "../";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "../searchindex-339ac392.js";
|
window.path_to_searchindex_js = "../searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="../toc-1290cc30.js"></script>
|
<script src="../toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
|
|||||||
@@ -35,10 +35,10 @@
|
|||||||
const path_to_root = "../";
|
const path_to_root = "../";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "../searchindex-339ac392.js";
|
window.path_to_searchindex_js = "../searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="../toc-1290cc30.js"></script>
|
<script src="../toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
|
|||||||
+2
-2
@@ -35,10 +35,10 @@
|
|||||||
const path_to_root = "";
|
const path_to_root = "";
|
||||||
const default_light_theme = "light";
|
const default_light_theme = "light";
|
||||||
const default_dark_theme = "navy";
|
const default_dark_theme = "navy";
|
||||||
window.path_to_searchindex_js = "searchindex-339ac392.js";
|
window.path_to_searchindex_js = "searchindex-57ec751f.js";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
<script src="toc-1290cc30.js"></script>
|
<script src="toc-f74aae8e.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="mdbook-help-container">
|
<div id="mdbook-help-container">
|
||||||
|
|||||||
Reference in new issue
Block a user