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:

  1. Install Go >= 1.25 for linux/riscv64 (available at go.dev/dl since Go 1.21 via the RISE project).
  2. Run go install github.com/google/pprof@latest – this cross-compiles and installs natively.
  3. Install riscv64 GNU binutils or LLVM for symbolization and disassembly features.
  4. 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