pprof
Author: Ludovic HENRY ludovic.henry@qti.qualcomm.com
Date: 2026-08-14
Scope: RISC-V (riscv64/linux) support status for pprof
Audience: Technical leadership, resource allocation strategy
Verification policy: Every claim is cross-referenced to a primary upstream source. Items that could not be verified against a second source are marked [NEEDS VERIFICATION].
1. Project Overview
pprof is a visualization and analysis tool for profiling data in the pprof format, which is generated by Go runtime profiling, Linux perf, and other profilers. It reads profile data, invokes external symbolization tools (addr2line, nm, objdump, llvm-symbolizer), and renders call graphs, flamegraphs, and annotated source/disassembly via a web UI or CLI.
The tool is written entirely in Go with no architecture-specific native code. It has no JIT compiler, no SIMD paths, and no hand-written assembly. Architecture-specific concerns (ELF parsing, disassembly) are delegated to external subprocess tools from GNU binutils or LLVM.
Governance: Informal Google-led governance. Hosted under the google GitHub organization but explicitly disclaimed as “not an official Google product.” There is no MAINTAINERS, OWNERS, or CODEOWNERS file. Contributions require a Google CLA. All changes go through GitHub PRs with review by a project member.
Corporate sponsors: Google dominates authorship. The AUTHORS file lists only “Google Inc.” as the copyright holder. Top active contributors: Raul Silvera (Google, 159 commits), Alexey Alexandrov (Google, 151 commits, remains active with 6 of the last 30 commits). Ivan Babrou (Cloudflare) and cuishuang (community) are occasional contributors. 17 of the last 30 commits are dependabot dependency bumps.
Community stance on new ports: CONTRIBUTING.md explicitly states: “We will also likely refuse to accept changes that have fairly limited audience but will require us to commit to maintain them for foreseeable future. This includes support for specific platforms.” This is a meaningful stated barrier to riscv64-specific patches requiring ongoing maintenance.
RISE involvement: pprof is not listed as a RISE member or RISE-affiliated project. No pprof-specific RISE blog posts exist. The RISE wheel builder does not list pprof (the tool has no wheels – it is a Go binary).
2. Port History and Upstreaming Timeline
| Date | Event | Source |
|---|---|---|
| Nov 2021 | Go runtime/pprof tests crash on linux/riscv64 (SIGPROF + doSigPreempt stack corruption on Sipeed Nezha / Allwinner D1, Linux 5.4). Three crash types: unexpected signal in doSigPreempt, unknown caller PC in gentraceback, split stack overflow. Root cause: signal preemption interacting incorrectly with goroutine stacks on riscv64 morestack assembly. | golang/go #49709 |
| Go 1.18 (Feb 2022) | Issue #49709 closed – runtime/pprof crashes on linux/riscv64 fixed in the Go runtime. | golang/go #49709 |
| (no date) | No further riscv64-specific activity in google/pprof. Zero riscv64 issues, PRs, or commits exist in the repository. | GitHub searches: 0 results across all vectors |
Key finding: The riscv64 fix was in the Go runtime (golang/go), not in google/pprof itself. The pprof tool has never required any riscv64-specific work because it contains no architecture-specific code. It is fully upstream by default – there is no port to upstream.
Key contributors to riscv64 Go runtime profiling: Data not available: individual attribution for the Go 1.18 fix is not in the research findings.
3. Upstream Support Tier
Google/pprof has no formal tier policy. The project does not publish official binaries, does not define architecture support tiers, and does not maintain a support matrix. The CI configuration is the only signal.
CI evidence:
| Platform | Runners | Architecture |
|---|---|---|
| Linux | ubuntu-22.04, ubuntu-24.04 | x86-64 |
| macOS | macos-14, macos-15 | arm64 (macos-14), x86-64 (macos-15) |
| Windows | windows-2022 | x86-64 |
| riscv64 | none | not tested |
The CI YAML (.github/workflows/ci.yaml) was read directly. The string “riscv” does not appear anywhere in the file (grep exited with status 1). There is no GOARCH matrix, no QEMU emulation step, and no cross-compilation for riscv64.
Comparison table:
| Criterion | amd64 | arm64 | riscv64 |
|---|---|---|---|
| CI coverage | Yes (ubuntu runners) | Partial (macos-14 only) | No |
| Release-blocking | Yes | Partial | No |
| Official binaries | None (source-only) | None | None |
go install works |
Yes | Yes | Yes (Go >= 1.14) |
| ELF profiling | Yes | Yes | Yes |
No architecture is formally release-blocking because the project does not publish binaries. riscv64 is de facto equivalent to any other non-CI’d architecture: it compiles and runs via the Go toolchain without project-specific action.
4. Technical Architecture and RISC-V-Specific Subsystems
pprof is a pure Go profiling data parser and UI tool. It has no hand-tuned assembly, no SIMD code, no JIT compiler, no crypto implementation, and no GC barrier code. Architecture-specific concerns are entirely absent from the Go module.
Component inventory:
| Component | amd64 | arm64 | riscv64 |
|---|---|---|---|
| Architecture-specific source files | 0 | 0 | 0 |
| Assembly files (.S) | 0 | 0 | 0 |
| JIT / SIMD dispatch | None | None | None |
| ELF binary parsing (openELF) | Arch-agnostic | Arch-agnostic | Arch-agnostic |
| Mach-O fat binary (openFatMachO) | Handled (macho.CpuAmd64) | Handled (macho.CpuArm) | Not in switch – runtime error |
| Disassembly (disasm.go) | Via external objdump/llvm-objdump | Via external objdump/llvm-objdump | Via external objdump/llvm-objdump |
| Symbolization | Via addr2line / llvm-symbolizer | Via addr2line / llvm-symbolizer | Via addr2line / llvm-symbolizer |
| Graph rendering | Via graphviz dot subprocess | Via graphviz dot subprocess | Via graphviz dot subprocess |
The one architecture-specific code block: In internal/binutils/binutils.go, the openFatMachO function contains a switch runtime.GOARCH block mapping Go architecture names to macho.Cpu constants. It handles 386, amd64/amd64p32, arm/armbe/arm64/arm64be, ppc, ppc64/ppc64le. The default branch returns an error: “unsupported host architecture for %s: %s”. riscv64 is absent. This function handles Apple Mach-O fat binaries (universal binaries) and is only reachable on macOS. No riscv64 macOS platform exists, making this gap practically irrelevant.
ELF path (Linux/riscv64): openELF has no architecture switch. It uses elfexec.GetBase and elfexec.FindTextProgHeader, which operate on ELF headers uniformly. riscv64 ELF profiling works identically to amd64 or arm64.
RVV false positive: A GitHub code search for “rvv” in the repo matched the string "bBdDrRvVW" in addr2liner_nm.go – a list of nm symbol type characters. This is unrelated to RISC-V Vector.
5. Build System, Cross-Compilation, and Toolchain
pprof uses no CMake, autoconf, or C build system. It is a standard Go module.
Cross-compilation for riscv64:
GOOS=linux GOARCH=riscv64 go build github.com/google/pprof
Install from source on a riscv64 host:
go install github.com/google/pprof@latest
Go version requirement: The go.mod file declares go 1.25.0 as the minimum. The CI tests against Go 1.25 and 1.26. Go has supported GOARCH=riscv64 (Linux) since Go 1.14, so any Go >= 1.25 satisfies both the module requirement and riscv64 support.
Runtime dependencies (not build-time): pprof invokes external tools as subprocesses for symbolization of profiled binaries. For profiling riscv64 binaries, the following tools must be present:
| Tool | Package | Notes |
|---|---|---|
| addr2line | riscv64-linux-gnu-binutils or llvm | Required for symbolization |
| nm | riscv64-linux-gnu-binutils or llvm-nm | Required for symbolization |
| objdump | riscv64-linux-gnu-binutils or llvm-objdump | Required for disassembly |
| llvm-symbolizer | llvm package | Preferred alternative to addr2line; CI installs on Ubuntu, no stated minimum version in code; CI comment references “llvm-symbolizer 14.0.0+” for Ubuntu 20.04 [NEEDS VERIFICATION for minimum version] |
| graphviz (dot) | graphviz | Optional; graph output disabled if absent |
QEMU: pprof does not reference QEMU. Cross-compilation produces a static-linkable binary; running it on a riscv64 host requires no emulation.
No Dockerfiles exist in the repository. No cross-compilation toolchain configuration files exist.
Known build failures on riscv64: None found in research. Zero riscv64 build issues in the tracker.
6. Feature Coverage and Gap Analysis vs arm64 and amd64
Feature matrix:
| Feature | amd64 | arm64 | riscv64 | Gap type |
|---|---|---|---|---|
| ELF profiling (Linux) | Full | Full | Full | None |
| CPU profile collection | Full | Full | Full (Go runtime handles this) | None |
| Heap / goroutine / mutex profiling | Full | Full | Full | None |
| Symbolization (addr2line / llvm-symbolizer) | Full | Full | Full (requires riscv64 toolchain installed) | None |
Disassembly (pprof -disasm) |
Full | Full | Full (requires riscv64 objdump) | None |
| Graph output (graphviz) | Full | Full | Full (graphviz available in distros) | None |
| Web UI | Full | Full | Full | None |
| Mach-O fat binary support | Full | Full | Error (default branch in switch) | Cosmetic (no riscv64 macOS) |
| CI coverage | Full | Partial | None | Testing gap |
| linux/riscv64 binary in distro | Arch:all (stale) | Arch:all (stale) | Arch:all (stale, same) | None material |
Functional gaps: None for Linux/riscv64 ELF profiling. The Mach-O fat binary gap is irrelevant in practice.
Performance gaps: Data not available: no riscv64 vs arm64 performance benchmarks for pprof exist in the public record.
Security hardening gaps: Data not available: no riscv64-specific security hardening analysis was found.
Floating-point / NaN semantics: Not applicable. pprof performs no floating-point computation.
7. CI/CD Infrastructure
Does riscv64 CI exist? No. Confirmed by reading .github/workflows/ci.yaml directly. The string “riscv” does not appear in the file.
CI jobs:
| Job | Runners | Go versions | Architecture |
|---|---|---|---|
| test-linux | ubuntu-22.04, ubuntu-24.04 | 1.25, 1.26 | x86-64 |
| test-mac | macos-14, macos-15 | 1.25, 1.26 | arm64 (macos-14), x86-64 (macos-15) |
| test-windows | windows-2022 | 1.25, 1.26 | x86-64 |
| check | ubuntu-latest | latest | x86-64 |
RISE runners: No RISE riscv64 runners are configured. The RISE project runs Scaleway EM-RV1 instances and an OSU OSL board farm for Go – those are not connected to google/pprof CI.
Hardware used for any riscv64 testing: None.
Comparison table:
| Criterion | amd64 | arm64 | riscv64 |
|---|---|---|---|
| CI runner exists | Yes | Yes (macOS only) | No |
| Tests pass in CI | Yes | Yes | Not tested |
| QEMU emulation | No | No | No |
| GOARCH matrix | No | Implicit (macos-14) | No |
| Release gate | No (no releases) | No | No |
8. Distribution and Release Status
Official binaries: None. github.com/google/pprof/releases explicitly shows “There aren’t any releases here.” pprof is distributed as a Go module only. The latest pseudo-version is v0.0.0-20260825171938-4d453200e7d9.
PyPI: The pprof package on PyPI (version 0.2.0) is an unrelated Python benchmarking framework by Andreas Simbuerger. All wheels are py3-none-any (pure Python, architecture-independent). Not relevant to google/pprof.
Ubuntu / Debian: Package golang-github-google-pprof-dev is available as arch: all, version 0.0~git20211008.947d60d-1. Because it is arch:all (a Go source/library package, not a compiled binary), it installs on riscv64 without a dedicated riscv64 build. It is significantly outdated (2021 snapshot). There is no Ubuntu/Debian compiled riscv64 binary.
Arch Linux RISC-V: pprof was not found in the Arch RISC-V package mirror.
What a user must do to get a working binary on riscv64:
- Install Go >= 1.25 for linux/riscv64 (available at go.dev/dl since Go 1.21 via the RISE project).
- Run
go install github.com/google/pprof@latest– this cross-compiles and installs natively. - Install riscv64 GNU binutils or LLVM for symbolization and disassembly features.
- Optionally install graphviz for graph rendering.
No special patches, forks, or cross-compilation steps beyond the standard Go toolchain are required.
9. Dependencies
Go module dependencies (go.mod):
module github.com/google/pprof
go 1.25.0
require:
github.com/chzyer/readline v1.5.1
github.com/ianlancetaylor/demangle v0.0.0-20250417193237-f615e6bd150b
indirect:
golang.org/x/sys v0.32.0
Dependency table:
| Dependency | Role | riscv64 Build | riscv64 Test | riscv64 Release | Community |
|---|---|---|---|---|---|
| Go toolchain (>= 1.25) | Compiles and runs pprof; provides debug/elf for ELF parsing | Supported (linux/riscv64 secondary port since Go 1.14; linux/riscv64 first-class since Go 1.21) | Passes on upstream RISE/Go builders; freebsd/riscv64 broken (golang/go#76475) but linux/riscv64 unaffected | Go 1.24+ ships linux/riscv64 binaries at go.dev/dl | Active; see project-reports/go.md |
| github.com/chzyer/readline v1.5.1 | Interactive CLI line editing | Pure Go; term_linux.go uses syscall.SYS_IOCTL, present on riscv64; depends on golang.org/x/sys |
No riscv64-specific CI; 0 riscv64 issues filed; architecture-neutral | No tagged releases since v1.5.1 (2022); source module only | Maintainer inactive since 2022; no open riscv issues |
| github.com/ianlancetaylor/demangle | C++ symbol demangling | Pure Go, zero dependencies (go.mod has no require block); no assembly, no arch-specific code | No riscv64 issues filed; demangling is pure string transformation | No version tags; consumed as pseudo-version | Active maintainer (Ian Lance Taylor, Google) |
| golang.org/x/sys v0.32.0 (indirect) | Low-level OS syscall wrappers used by readline for terminal I/O | Full riscv64 support: unix/syscall_linux_riscv64.go (6,262 bytes, 193 lines), unix/asm_linux_riscv64.s, cpu/cpu_riscv64.go (detects V, Zbb, Zbc, Zvbb, Zvbc, Zvkb, Zvkg, Zvkn* extensions), FreeBSD and OpenBSD riscv64 variants |
Tested on upstream RISC-V builders alongside golang/go | v0.32.0 includes all riscv64 files | Active |
| Graphviz / dot (runtime, optional) | Renders call-graph SVGs and PDFs | Portable C codebase with no arch-specific compute; available in Debian/Ubuntu/Fedora for riscv64 | Not tested by pprof CI on any architecture specifically | Available in standard distro packages for riscv64 | Mature project |
| GNU binutils / LLVM (runtime, optional) | Disassembly and symbolization of native profiles via subprocess | Both LLVM (since ~10.0) and GNU binutils (since 2.28) ship riscv64 cross-disassembly support | Not tested by pprof CI on riscv64 | Available in all major Linux distributions for riscv64 | Mature projects |
Deep-dive on critical dependencies:
The Go toolchain is the only dependency with meaningful riscv64 history. The RISE project (“Accelerate the Go Runtime on RISC-V” initiative) has delivered linux/riscv64 binaries at go.dev/dl since Go 1.21, GORISCV64 profile support (RVA20, RVA22, RVA23), vectorized memory ops in internal/bytealg, math/big assembler for riscv64, md5/sha256/sha512 scalar assembler, and plugin mode support (Go 1.25). The Go 1.23 PGO loop alignment optimization explicitly excludes riscv64 (“not yet implemented on other platforms”) – this affects the Go toolchain’s optimization of pprof itself on riscv64 but is not a functional gap. Go objdump gained riscv64 disassembly support in Go 1.24.
No other dependency has architecture-specific concerns relevant to riscv64.
11. Known Bugs and Active Issues
riscv64-specific bugs in google/pprof: None. Zero riscv64 issues exist in the tracker.
Historical riscv64 issue (in Go runtime, not pprof):
| ID | Title | Status | Severity | Notes |
|---|---|---|---|---|
| golang/go#49709 | runtime/pprof tests crash on linux/riscv64 | Closed (fixed Go 1.18) | High (was) | SIGPROF + doSigPreempt stack corruption on Sipeed Nezha / Allwinner D1, Linux 5.4. Fixed in Go runtime, not in google/pprof. |
General open issues in google/pprof (non-riscv64):
| ID | Title | Status | Severity | Notes |
|---|---|---|---|---|
| #936 | Excessive memory consumption (300 MB profile file on Linux/amd64) | Open (Apr 2025) | Medium | Not riscv64-specific |
| #789 | “disasm: no matches found for regexp” | Open (Jul 2023) | Low | Not riscv64-specific |
| #709 | “pprof disasm is not work right after go 1.16” | Open | Low | Not riscv64-specific |
| #1002 | Label with zero int64 value and no unit gets dropped during decoding | Open (Jun 2026) | Medium | Correctness; not riscv64-specific |
No riscv64 correctness bugs exist in google/pprof.
12. Objections and Upstream Blockers
Stated policy objection: CONTRIBUTING.md explicitly lists “support for specific platforms” as a category of changes likely to be refused if the audience is small. Any riscv64-specific patch (e.g., adding riscv64 to the openFatMachO switch, adding riscv64 CI) must be framed to avoid triggering this rejection criterion.
Technical blockers: None for Linux/riscv64 ELF profiling. The tool is already architecture-neutral by design. No technical work is needed for functional enablement.
Organizational blockers: Google CLA required. Informal governance with no public roadmap. No active maintainer has expressed intent to add riscv64 CI.
Acceptance probability for riscv64 CI PR: Moderate. Adding a GOARCH=riscv64 entry to the CI matrix is a low-maintenance change (pure Go, no arch-specific test fixtures). The stated policy concern is about “support for specific platforms requiring ongoing maintenance” – a CI matrix addition for a platform Go already supports natively is unlikely to require maintenance. However, QEMU-based CI (which would be needed for riscv64 unless Scaleway or SiFive runners are contributed) adds infrastructure dependency that Google may not want to own.
Acceptance probability for openFatMachO riscv64 case: Low priority – no riscv64 macOS platform exists, so the fix would have zero users. Likely refused on the stated grounds.
13. Investment Analysis
The RISE project already funds Go runtime improvements (GORISCV64 profiles, vectorized bytealg, assembler routines, plugin mode). pprof itself requires no riscv64-specific investment for functional enablement – it is architecture-neutral and works today via go install.
13.1 Functional Enablement
No work required. pprof builds and runs on linux/riscv64 without modification. ELF profiling is fully functional. The only cosmetic gap (Mach-O fat binary switch) has no practical users.
13.2 Performance Optimization
No architecture-specific performance work is applicable. pprof contains no SIMD, JIT, or hot numeric paths. Its performance is dominated by I/O, subprocess invocations (addr2line, objdump), and Go runtime GC – all of which are outside the pprof module.
13.3 CI/CD Infrastructure
Adding riscv64 CI would close the only real gap. Options:
- GOARCH=riscv64 cross-compilation check (no hardware needed, validates build): trivial addition to existing matrix
- Native riscv64 test run via QEMU (qemu-riscv64-static): requires adding a QEMU setup step; moderate effort; validates correctness
- Native riscv64 test run via hardware runner: requires contributing a Scaleway or SiFive runner to the project; high coordination effort
13.4 Ecosystem Enablement
Not applicable. pprof has no dependent package ecosystem (it is a Go tool, not a library with downstream Go modules requiring riscv64-specific builds).
13.5 Summary Table
| Area | Work Item | Effort (person-weeks) | Owner | Priority |
|---|---|---|---|---|
| Functional | No work needed – pprof is architecture-neutral | 0 | N/A | N/A |
| Performance | No architecture-specific optimization applicable | 0 | N/A | N/A |
| CI/CD | Add GOARCH=riscv64 cross-compilation check to CI matrix | 0.25 | Qualcomm/RISE contributor | Low |
| CI/CD | Add QEMU-based riscv64 test run to CI | 1 | Qualcomm/RISE contributor | Low |
| CI/CD | Contribute riscv64 hardware runner to google/pprof | 3 (coordination) | RISE project | Low |
| Distribution | Upstream golang-github-google-pprof-dev Debian package to current version | 1 | Debian Go team / RISE | Low |
Overall assessment: pprof requires no investment for riscv64 functional enablement. The only meaningful gap is CI coverage, which is low-priority given pprof’s architecture-neutral design. Investment in the Go toolchain (covered by RISE) has more leverage – improvements to the Go runtime on riscv64 directly improve pprof’s execution environment.
14. Updates
No updates yet – initial report dated 2026-08-14.
15. References
- google/pprof repository
- google/pprof CI workflow (.github/workflows/ci.yaml)
- google/pprof CONTRIBUTING.md
- google/pprof issue tracker
- golang/go issue #49709 – runtime/pprof crashes on linux/riscv64
- golang/go issue #76475 – freebsd/riscv64 broken
- google/pprof issue #936 – excessive memory consumption
- google/pprof issue #789 – disasm: no matches found
- google/pprof issue #709 – pprof disasm broken after Go 1.16
- google/pprof issue #1002 – label with zero int64 value dropped during decoding
- github.com/chzyer/readline v1.5.1
- github.com/ianlancetaylor/demangle
- golang.org/x/sys – syscall_linux_riscv64.go
- Ubuntu noble – golang-github-google-pprof-dev package
- RISE Project blog – Advancing Go on RISC-V (Apr 2025)
- RISE Project member list
- Arch Linux RISC-V package mirror
- PyPI pprof package (unrelated Python tool)