Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
89 commits
Select commit Hold shift + click to select a range
aff2665
build: split package compilation stages
zhouguangyuan0718 Jul 30, 2026
36de60c
test: cover package build stage boundaries
zhouguangyuan0718 Jul 30, 2026
0be4014
test: cover empty package dependencies
zhouguangyuan0718 Jul 30, 2026
d84ca29
test: cover cgo command environment parsing
zhouguangyuan0718 Jul 30, 2026
6d29a37
test: cover cgo pkg-config invocation
zhouguangyuan0718 Jul 30, 2026
d24eb12
test: cover cgo pkg-config failures
zhouguangyuan0718 Jul 31, 2026
e67a384
build: archive LLVM package objects in memory
zhouguangyuan0718 Jul 31, 2026
dcf4cca
test: cover package stage and archive branches
zhouguangyuan0718 Aug 1, 2026
7b39688
test: cover package pipeline error paths
zhouguangyuan0718 Aug 2, 2026
39ffae9
build: update LLVM bindings to v0.9.6
zhouguangyuan0718 Aug 2, 2026
275f153
ci: retry macOS docs install
zhouguangyuan0718 Aug 2, 2026
4b7324f
build: unify package task state
zhouguangyuan0718 Aug 2, 2026
db979b9
feat: add hidden closure environment ABI
cpunion Jul 31, 2026
757043c
test: close closure environment coverage gaps
cpunion Aug 1, 2026
0ab21c9
cl,ssa,reflect: address closure ABI review feedback
cpunion Aug 1, 2026
229bd78
cl: preserve named rangefunc yield closure types
cpunion Aug 1, 2026
7b87a5d
cl: collect closure env directives during syntax scan
cpunion Aug 1, 2026
ea6708b
cl: make syntax scan the sole closure env extractor
cpunion Aug 1, 2026
3fcdbc8
pcln: finalize function-centric metadata model
cpunion Aug 1, 2026
fbce776
reflect: inline MakeFunc implementation
cpunion Aug 2, 2026
5bdaccc
runtime/ffi: call libffi Go ABI directly when compatible
cpunion Aug 2, 2026
dc319bb
runtime/ffi: remove redundant env trampolines
cpunion Aug 2, 2026
3a659e9
runtime/ffi: retain system-libffi x86 fallback
cpunion Aug 2, 2026
ac1e562
ssa: document Windows closure env fallback
cpunion Aug 2, 2026
2c4a8e8
doc: clarify closure env platform fallbacks
cpunion Aug 2, 2026
b2d1602
runtime/ffi: enforce target-compatible env final hops
cpunion Aug 2, 2026
572a29f
runtime/ffi: finalize hidden-env platform contract
cpunion Aug 2, 2026
e30b572
chore: restore portable libffi setup
cpunion Aug 2, 2026
443369e
runtime/ffi: support system libffi on x86
cpunion Aug 2, 2026
a87b9bb
test/goroot: separate not-applicable cases
cpunion Aug 3, 2026
6946e5d
Merge pull request #2175 from zhouguangyuan0718/agent/parallel-build-pr1
xushiwei Aug 3, 2026
11125dc
Merge pull request #2260 from cpunion/codex/goroot-maymorestack-20260801
cpunion Aug 3, 2026
2326692
ci: compare benchmarks on the same runner
cpunion Aug 3, 2026
49ba5ee
ci: stabilize paired benchmark samples
cpunion Aug 3, 2026
df0bb22
ci: collect five microbenchmark samples
cpunion Aug 3, 2026
d39ed76
Merge pull request #2255 from cpunion/codex/closure-env-2170-v2
xushiwei Aug 3, 2026
3c05bb9
fix: prefer compiler syntax diagnostics
MeteorsLiu Aug 3, 2026
8088399
build(debug): run LLVM passes with DWARF
cpunion Jul 21, 2026
80a0231
fix(debug): ignore DebugRefs during static init
cpunion Jul 22, 2026
642f668
fix(debug): preserve defer locations under LTO
cpunion Jul 21, 2026
0aa1d46
fix(build): keep DebugRefs with reordered return loads
cpunion Jul 21, 2026
557f212
fix(build): preserve DebugRefs in select order repair
cpunion Jul 22, 2026
dbd2588
test(lto): cover DWARF-preserved string values
cpunion Jul 22, 2026
390453a
docs(ssa): clarify DWARF optimized marker
cpunion Jul 28, 2026
d4e9757
fix(build): finalize consolidated DebugRef ordering
cpunion Aug 3, 2026
276472f
fix(build): document SSA move precondition
cpunion Aug 3, 2026
f33c208
refactor(build): share DebugRef move analysis
cpunion Aug 3, 2026
17ac3d3
test(lto): align DWARF symbol checks with main
cpunion Aug 3, 2026
9642a9e
cl: fold constant comparisons before lowering
cpunion Aug 1, 2026
5133432
test: isolate constant comparison folding
cpunion Aug 1, 2026
bc92da0
test: update folded comparison snapshot
cpunion Aug 1, 2026
bf416bc
ssa: use static defer continuation selectors
cpunion Aug 3, 2026
47d94be
ssa: initialize defer selectors explicitly
cpunion Aug 3, 2026
2353dec
test: cover defer selector dispatch end to end
cpunion Aug 3, 2026
96b82b9
ssa/wasm: preserve native defer dispatch
cpunion Aug 3, 2026
bca3c5c
build: derive wasm platform from named target
cpunion Aug 3, 2026
09b8b95
test: generate complete defer dispatch checks
cpunion Aug 3, 2026
91d416b
Merge pull request #2271 from cpunion/codex/benchmark-same-runner-bas…
cpunion Aug 3, 2026
756a51c
ssa: clarify defer dispatch invariants
cpunion Aug 3, 2026
7523cf4
llgen: derive platform from flags target
cpunion Aug 3, 2026
b593d59
runtime: keep workers alive after main Goexit
cpunion Aug 1, 2026
0139545
runtime: make main Goexit lifecycle release atomic
cpunion Aug 1, 2026
dcff207
build: skip object emission in generation mode
cpunion Aug 3, 2026
ca0d419
Merge pull request #2208 from cpunion/codex/wasm-static-defer-dispatch
cpunion Aug 3, 2026
dde7788
Merge pull request #2257 from cpunion/codex/goroot-unreachable-bodyle…
xushiwei Aug 3, 2026
d37108c
Merge pull request #2259 from cpunion/codex/goroot-goexit-20260801
xushiwei Aug 3, 2026
b651575
build(deps): bump xgo-dev/setup-benchmark-go-action from 1 to 1.0.3
dependabot[bot] Aug 4, 2026
1928ddf
fix(build): reject invalid SSA move anchors
cpunion Aug 4, 2026
7e290ae
test: replace legacy out.ll workflow with LIT checks
cpunion Aug 4, 2026
2381bb9
test(build): cover DebugRef move boundaries
cpunion Aug 4, 2026
d9b118f
test: keep existing IR tooling unchanged
cpunion Aug 4, 2026
275b202
test: expand migrated LIT coverage
cpunion Aug 4, 2026
9f0c76a
Merge pull request #2274 from MeteorsLiu/fix/goroot-authoritative-syn…
cpunion Aug 4, 2026
022f3ed
build: schedule package initialization in Go order
cpunion Aug 1, 2026
6670dae
Merge pull request #2143 from cpunion/codex/dwarf-opt-pipeline
xushiwei Aug 4, 2026
7e4bcc6
runtime: drain BDWGC finalizers during explicit GC
cpunion Aug 4, 2026
880b903
ssa: make recursive type conversion order-independent
zhouguangyuan0718 Aug 4, 2026
06b5378
test(ssa): keep conversion predicate in sync
zhouguangyuan0718 Aug 5, 2026
c1728af
build: prepare read-only package backend state
zhouguangyuan0718 Aug 5, 2026
e9a4a52
Merge pull request #2280 from zhouguangyuan0718/agent/recursive-type-…
xushiwei Aug 9, 2026
a4a1222
Merge pull request #2282 from zhouguangyuan0718/agent/parallel-build-…
xushiwei Aug 9, 2026
cdd8611
Merge pull request #2283 from cpunion/codex/fix-finalizer-flake-20260804
xushiwei Aug 9, 2026
ca40b8f
Merge pull request #2277 from xgo-dev/dependabot/github_actions/xgo-d…
xushiwei Aug 9, 2026
41a336e
Merge pull request #2254 from cpunion/codex/goroot-package-init-20260801
xushiwei Aug 9, 2026
7bc442f
test: use shared repository root helper
cpunion Aug 9, 2026
87c7602
Merge pull request #2288 from cpunion/codex/fix-package-init-repo-roo…
cpunion Aug 9, 2026
e82e95f
Merge pull request #2281 from cpunion/codex/test-migrate-outll-sentinels
xushiwei Aug 9, 2026
d606bba
debug: let supported targets retain DWARF
cpunion Aug 1, 2026
a16528c
debug: clarify target DWARF policy paths
cpunion Aug 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 36 additions & 49 deletions .github/workflows/benchmark.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,15 @@ jobs:
steps:
- uses: actions/checkout@v7

- name: Check out pull request base benchmark source
if: github.event_name == 'pull_request'
uses: actions/checkout@v7
with:
repository: ${{ github.event.pull_request.base.repo.full_name }}
ref: ${{ github.event.pull_request.base.sha }}
path: .benchmark/source
persist-credentials: false

- name: Install dependencies
uses: ./.github/actions/setup-deps
with:
Expand All @@ -40,63 +49,41 @@ jobs:
- name: Set up Go
uses: ./.github/actions/setup-go

- name: Build LLGo
run: |
set -euo pipefail
mkdir -p .benchmark
go build -p=1 -o .benchmark/llgo ./cmd/llgo

- name: Measure programs
- name: Measure pull request base
if: github.event_name == 'pull_request'
run: |
set -euo pipefail
go run ./benchmark/baseline \
-llgo "$GITHUB_WORKSPACE/.benchmark/llgo" \
-out "$GITHUB_WORKSPACE/.benchmark/results"
benchmark/baseline/run.sh \
"$GITHUB_WORKSPACE/.benchmark/source" \
"$GITHUB_WORKSPACE/.benchmark/base-llgo" \
"$GITHUB_WORKSPACE/.benchmark/base-results"

- name: Run selected Go benchmarks
run: |
set -euo pipefail
results="$GITHUB_WORKSPACE/.benchmark/results/go.txt"
GOMAXPROCS=1 go test \
-run '^$' \
-bench '^(BenchmarkMergeCompilerFlags|BenchmarkMergeLinkerFlags|BenchmarkLookupPCRandom)$' \
-benchtime=250ms \
-count=1 \
-cpu=1 \
./internal/clang ./internal/build/funcinfo \
| tee "$results"

GOMAXPROCS=1 "$GITHUB_WORKSPACE/.benchmark/llgo" test \
-run '^$' \
-bench '^(BenchmarkRuntimeGetG|BenchmarkGlobal(Read|Write)|Benchmark(DirectCall|InterfaceCall|Defer|ChannelBuffered|ChannelHandoff))$' \
-benchtime=250ms \
-count=1 \
./test/llgoext \
| tee -a "$results"

# The current native backend creates one pthread per goroutine and
# intentionally has a bounded lifecycle stress limit. Keep creation
# monitoring deterministic instead of letting testing auto-calibrate
# to millions of host threads.
GOMAXPROCS=1 "$GITHUB_WORKSPACE/.benchmark/llgo" test \
-run '^$' \
-bench '^BenchmarkGoroutine$' \
-benchtime=100x \
-count=1 \
./test/llgoext \
| tee -a "$results"
- name: Check out pull request head benchmark source
if: github.event_name == 'pull_request'
uses: actions/checkout@v7
with:
repository: ${{ github.event.pull_request.head.repo.full_name }}
ref: ${{ github.event.pull_request.head.sha }}
path: .benchmark/source
persist-credentials: false

- name: Validate and export benchmark artifact
- name: Measure current revision
run: |
go run ./benchmark/baseline \
-mode export \
-out .benchmark/results \
-benchmark-output .benchmark/results/benchmark.txt
source_root="$GITHUB_WORKSPACE"
if [[ "$GITHUB_EVENT_NAME" == pull_request ]]; then
source_root="$GITHUB_WORKSPACE/.benchmark/source"
fi
benchmark/baseline/run.sh \
"$source_root" \
"$GITHUB_WORKSPACE/.benchmark/llgo" \
"$GITHUB_WORKSPACE/.benchmark/results"

- name: Record benchmark result
uses: xgo-dev/setup-benchmark-go-action@v1
uses: xgo-dev/setup-benchmark-go-action@v1.0.3
with:
config: .github/llgo-benchmark.yml
benchmark-file: .benchmark/results/benchmark.txt
baseline-benchmark-file: >-
${{ github.event_name == 'pull_request' &&
'.benchmark/base-results/benchmark.txt' || '' }}
platform-id: ${{ matrix.id }}
platform-label: ${{ matrix.display }}
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@ brew link --overwrite llvm@19 lld@19 libffi
echo "deb http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-19 main" | sudo tee /etc/apt/sources.list.d/llvm.list
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
sudo apt-get update
sudo apt-get install -y llvm-19-dev clang-19 libclang-19-dev lld-19 libunwind-19-dev libc++-19-dev pkg-config libgc-dev libssl-dev zlib1g-dev libcjson-dev libsqlite3-dev libuv1-dev
sudo apt-get install -y llvm-19-dev clang-19 libclang-19-dev lld-19 libunwind-19-dev libc++-19-dev pkg-config libgc-dev libssl-dev zlib1g-dev libffi-dev libcjson-dev libsqlite3-dev libuv1-dev
sudo apt-get install -y python3.12-dev # optional
#curl https://raw.githubusercontent.com/xgo-dev/llgo/refs/heads/main/install.sh | bash
./install.sh
Expand Down
37 changes: 23 additions & 14 deletions benchmark/baseline/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,27 @@ The program workloads reuse:
- `benchmark/binary_size/println`: only the built-in `println`;
- `benchmark/binary_size/fmtprintf`: `fmt.Printf`.

For each workload, the collector records median warm build time, median process
time, file size, executable-code bytes, allocated non-executable data, and
zero-filled data. On ELF, read-only constants are included in the data bucket;
on Mach-O, `__TEXT` constants are included in the text bucket. The Go benchmark
stream adds selected compiler helpers and LLGo-generated core-language
operations: direct/interface calls, defer, goroutine creation, channels,
`getg`, and global access.
For each workload, the collector performs an unmeasured warm build, then records
median build time, median process time, file size, executable-code bytes,
allocated non-executable data, and zero-filled data. On ELF, read-only constants
are included in the data bucket; on Mach-O, `__TEXT` constants are included in
the text bucket. The Go benchmark stream records five samples of selected
compiler helpers and LLGo-generated core-language operations: direct/interface
calls, defer, goroutine creation, channels, `getg`, and global access.

The trusted publisher compares each platform against the latest matching
`main` data and commits the history and generated site to the `pages` branch of
the configured data repository. Every LLGo repository defaults to
`<owner>/llgo-benchmark-data`:
For pull requests, each platform job checks out the recorded base and current
commits into the same source path, then runs both suites sequentially on the same
runner. The pull request comment compares that pair, avoiding differences from
runner machines and embedded source paths. Dependency setup is shared, and Go's
build cache can be reused by unchanged packages; main pushes still run the suite
only once. Very small changes can still be scheduler, frequency, or thermal
noise and should be confirmed by repeated workflow runs. If a workflow does not
provide a paired result, the publisher falls back to the latest matching `main`
data.

The trusted publisher commits the current result history and generated site to
the `pages` branch of the configured data repository. Every LLGo repository
defaults to `<owner>/llgo-benchmark-data`:

```text
llgo/baseline/series/main/main
Expand Down Expand Up @@ -55,15 +64,15 @@ results=.benchmark/results/go.txt
GOMAXPROCS=1 go test \
-run '^$' \
-bench '^(BenchmarkMergeCompilerFlags|BenchmarkMergeLinkerFlags|BenchmarkLookupPCRandom)$' \
-benchtime=250ms -count=1 -cpu=1 \
-benchtime=250ms -count=5 -cpu=1 \
./internal/clang ./internal/build/funcinfo | tee "$results"
GOMAXPROCS=1 .benchmark/llgo test \
-run '^$' \
-bench '^(BenchmarkRuntimeGetG|BenchmarkGlobal(Read|Write)|Benchmark(DirectCall|InterfaceCall|Defer|ChannelBuffered|ChannelHandoff))$' \
-benchtime=250ms -count=1 \
-benchtime=250ms -count=5 \
./test/llgoext | tee -a "$results"
GOMAXPROCS=1 .benchmark/llgo test \
-run '^$' -bench '^BenchmarkGoroutine$' -benchtime=100x -count=1 \
-run '^$' -bench '^BenchmarkGoroutine$' -benchtime=100x -count=5 \
./test/llgoext | tee -a "$results"
```

Expand Down
28 changes: 20 additions & 8 deletions benchmark/baseline/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ var expectedGoBenchmarks = []string{
"BenchmarkRuntimeGetG",
}

const goBenchmarkSamples = 5

type footprint struct {
file uint64
text uint64
Expand Down Expand Up @@ -221,6 +223,11 @@ func collect(ctx context.Context, root, llgo, out string, buildRuns, runRuns int
var sizes, timings []metric
for _, item := range workloads {
binary := filepath.Join(binDir, item.name)
// Keep first-use toolchain and filesystem caches out of the measured
// median so the first revision is not systematically disadvantaged.
if err := run(ctx, env, io.Discard, llgo, "build", "-o", binary, filepath.Join(root, item.source)); err != nil {
return fmt.Errorf("warm build %s: %w", item.name, err)
}
buildDurations := make([]time.Duration, 0, buildRuns)
for range buildRuns {
start := time.Now()
Expand Down Expand Up @@ -433,9 +440,9 @@ func validateMetrics(path string, expected map[string]string) error {
}

func validateGoBenchmarks(r io.Reader) error {
expected := make(map[string]bool, len(expectedGoBenchmarks))
expected := make(map[string]int, len(expectedGoBenchmarks))
for _, name := range expectedGoBenchmarks {
expected[name] = false
expected[name] = 0
}
scanner := bufio.NewScanner(r)
for scanner.Scan() {
Expand All @@ -444,12 +451,12 @@ func validateGoBenchmarks(r io.Reader) error {
continue
}
name := cpuSuffix.ReplaceAllString(fields[0], "")
seen, ok := expected[name]
samples, ok := expected[name]
if !ok {
return fmt.Errorf("unexpected Go benchmark %q", name)
}
if seen {
return fmt.Errorf("duplicate Go benchmark %q", name)
if samples >= goBenchmarkSamples {
return fmt.Errorf("too many samples for Go benchmark %q", name)
}
if len(fields) < 4 || (len(fields)-2)%2 != 0 {
return fmt.Errorf("malformed Go benchmark line %q", scanner.Text())
Expand All @@ -474,20 +481,25 @@ func validateGoBenchmarks(r io.Reader) error {
if !hasTime {
return fmt.Errorf("benchmark %q has no ns/op result", name)
}
expected[name] = true
expected[name] = samples + 1
}
if err := scanner.Err(); err != nil {
return err
}
var missing []string
for name, seen := range expected {
if !seen {
for name, samples := range expected {
if samples == 0 {
missing = append(missing, name)
}
}
slices.Sort(missing)
if len(missing) != 0 {
return fmt.Errorf("missing Go benchmarks: %s", strings.Join(missing, ", "))
}
for name, samples := range expected {
if samples != goBenchmarkSamples {
return fmt.Errorf("Go benchmark %q has %d samples, want %d", name, samples, goBenchmarkSamples)
}
}
return nil
}
18 changes: 13 additions & 5 deletions benchmark/baseline/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
"debug/macho"
"encoding/json"
"errors"
"fmt"
"io"
"math"
"os"
Expand Down Expand Up @@ -157,8 +158,10 @@ func TestValidateMetricsRejectsInvalidData(t *testing.T) {
func TestValidateGoBenchmarks(t *testing.T) {
var input strings.Builder
for _, name := range expectedGoBenchmarks {
input.WriteString(name)
input.WriteString("-1 100 12.5 ns/op\n")
for range goBenchmarkSamples {
input.WriteString(name)
input.WriteString("-1 100 12.5 ns/op\n")
}
}
if err := validateGoBenchmarks(strings.NewReader(input.String())); err != nil {
t.Fatal(err)
Expand All @@ -170,7 +173,9 @@ func TestValidateGoBenchmarksRejectsInvalidData(t *testing.T) {
var input strings.Builder
for _, name := range expectedGoBenchmarks {
if name != skip {
input.WriteString(name + "-1 100 12.5 ns/op\n")
for range goBenchmarkSamples {
input.WriteString(name + "-1 100 12.5 ns/op\n")
}
}
}
return input.String()
Expand All @@ -182,7 +187,8 @@ func TestValidateGoBenchmarksRejectsInvalidData(t *testing.T) {
}{
{"missing", valid(expectedGoBenchmarks[0]), "missing Go benchmarks"},
{"unknown", valid("") + "BenchmarkUnknown-1 1 1 ns/op\n", `unexpected Go benchmark "BenchmarkUnknown"`},
{"duplicate", valid("") + expectedGoBenchmarks[0] + "-1 1 1 ns/op\n", "duplicate Go benchmark"},
{"too many samples", valid("") + expectedGoBenchmarks[0] + "-1 1 1 ns/op\n", "too many samples"},
{"too few samples", strings.Replace(valid(""), expectedGoBenchmarks[0]+"-1 100 12.5 ns/op\n", "", 1), fmt.Sprintf("has %d samples, want %d", goBenchmarkSamples-1, goBenchmarkSamples)},
{"malformed", strings.Replace(valid(""), " 100 12.5 ns/op", " bad", 1), "malformed Go benchmark"},
{"iterations", strings.Replace(valid(""), " 100 ", " bad ", 1), "invalid iteration count"},
{"value", strings.Replace(valid(""), "12.5", "bad", 1), "invalid value"},
Expand Down Expand Up @@ -523,7 +529,9 @@ func writeValidArtifact(t *testing.T, dir string) {
func makeGoBenchmarkText() string {
var input strings.Builder
for _, name := range expectedGoBenchmarks {
input.WriteString(name + "-1 100 12.5 ns/op\n")
for range goBenchmarkSamples {
input.WriteString(name + "-1 100 12.5 ns/op\n")
}
}
return input.String()
}
Expand Down
74 changes: 74 additions & 0 deletions benchmark/baseline/run.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#!/usr/bin/env bash

set -euo pipefail

if [[ $# -ne 3 ]]; then
echo "usage: $0 <source-root> <llgo-output> <result-directory>" >&2
exit 2
fi

harness_root="$(cd "$(dirname "$0")/../.." && pwd)"

source_root="$(cd "$1" && pwd)"
mkdir -p "$(dirname "$2")" "$3"
llgo_output="$(cd "$(dirname "$2")" && pwd)/$(basename "$2")"
result_directory="$(cd "$3" && pwd)"

(
cd "$source_root"
LLGO_ROOT="$source_root" go build -p=1 -o "$llgo_output" ./cmd/llgo
)

(
cd "$harness_root"
# Keep one current-checkout harness for both source revisions. Benchmark
# suite changes must therefore remain executable against the PR base.
LLGO_ROOT="$source_root" go run ./benchmark/baseline \
-root "$source_root" \
-llgo "$llgo_output" \
-out "$result_directory"
)

go_results="$result_directory/go.txt"
: > "$go_results"
(
cd "$source_root"
GOMAXPROCS=1 LLGO_ROOT="$source_root" go test \
-run '^$' \
-bench '^(BenchmarkMergeCompilerFlags|BenchmarkMergeLinkerFlags|BenchmarkLookupPCRandom)$' \
-benchtime=250ms \
-count=5 \
-cpu=1 \
./internal/clang ./internal/build/funcinfo
) | tee -a "$go_results"

(
cd "$source_root"
GOMAXPROCS=1 LLGO_ROOT="$source_root" "$llgo_output" test \
-run '^$' \
-bench '^(BenchmarkRuntimeGetG|BenchmarkGlobal(Read|Write)|Benchmark(DirectCall|InterfaceCall|Defer|ChannelBuffered|ChannelHandoff))$' \
-benchtime=250ms \
-count=5 \
./test/llgoext
) | tee -a "$go_results"

# The current native backend creates one pthread per goroutine and intentionally
# has a bounded lifecycle stress limit. Keep creation monitoring deterministic
# instead of letting testing auto-calibrate to millions of host threads.
(
cd "$source_root"
GOMAXPROCS=1 LLGO_ROOT="$source_root" "$llgo_output" test \
-run '^$' \
-bench '^BenchmarkGoroutine$' \
-benchtime=100x \
-count=5 \
./test/llgoext
) | tee -a "$go_results"

(
cd "$harness_root"
go run ./benchmark/baseline \
-mode export \
-out "$result_directory" \
-benchmark-output "$result_directory/benchmark.txt"
)
Loading
Loading