rubycc 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +61 -0
- data/README.md +26 -14
- data/data/verified_gems.json +85 -63
- data/exe/rubycc-ar +11 -3
- data/include/libc/sys/cdefs.h +12 -0
- data/lib/rubycc/backend/aarch64.rb +705 -117
- data/lib/rubycc/backend/slot_residency.rb +169 -0
- data/lib/rubycc/backend/x86_64.rb +924 -137
- data/lib/rubycc/command_line.rb +339 -0
- data/lib/rubycc/compile_error.rb +6 -3
- data/lib/rubycc/compiler.rb +17 -2
- data/lib/rubycc/diagnostics.rb +105 -0
- data/lib/rubycc/doctor/gemfile.rb +12 -3
- data/lib/rubycc/doctor/verified_gems.rb +5 -1
- data/lib/rubycc/driver.rb +66 -10
- data/lib/rubycc/front/ast.rb +18 -7
- data/lib/rubycc/front/constant_evaluator.rb +12 -0
- data/lib/rubycc/front/lexeme_reader.rb +3 -1
- data/lib/rubycc/front/parser.rb +51 -18
- data/lib/rubycc/ir/analysis.rb +82 -0
- data/lib/rubycc/ir/call_convention.rb +74 -7
- data/lib/rubycc/ir/generator.rb +319 -9
- data/lib/rubycc/ir/ir.rb +39 -1
- data/lib/rubycc/ir/promotion.rb +255 -0
- data/lib/rubycc/ir/simplify.rb +570 -0
- data/lib/rubycc/link/library_resolver.rb +17 -5
- data/lib/rubycc/link/partial_linker.rb +8 -1
- data/lib/rubycc/link/shared_linker.rb +2 -2
- data/lib/rubycc/mkmf_shim.rb +178 -12
- data/lib/rubycc/objfile/ar_archive.rb +13 -2
- data/lib/rubycc/objfile/elf_reader.rb +13 -2
- data/lib/rubycc/pkgconf/parser.rb +4 -0
- data/lib/rubycc/pkgconf/resolver.rb +3 -1
- data/lib/rubycc/pkgconf/system_path_filter.rb +8 -2
- data/lib/rubycc/preprocess/preprocessor.rb +161 -37
- data/lib/rubycc/preprocess/scanner.rb +69 -14
- data/lib/rubycc/preprocess/token_converter.rb +11 -1
- data/lib/rubycc/rmake/cli.rb +32 -4
- data/lib/rubycc/rmake/executor.rb +157 -226
- data/lib/rubycc/rmake/makefile.rb +35 -13
- data/lib/rubycc/rmake/parser.rb +8 -2
- data/lib/rubycc/rmake/rmake.rb +1 -0
- data/lib/rubycc/rmake/tool_command.rb +69 -0
- data/lib/rubycc/shell.rb +510 -0
- data/lib/rubycc/type.rb +23 -7
- data/lib/rubycc/version.rb +1 -1
- data/lib/rubycc.rb +12 -0
- data/lib/rubygems_plugin.rb +31 -3
- metadata +14 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 861b57742eceb0ccaae07c12aa35ab800fff5396e3cb2ffe467d7bf92f922b49
|
|
4
|
+
data.tar.gz: 36602f2eb36bb4e2ff4d42a258768242381ff94452ed034e68289bf70aea0561
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: '09cd40c86ed9f14ab49a0080ea7c10a18855d2351b0ef9c6189a1779cc5bbbf1047d5151488f8dd55a21894d35694c3d0d6ce8498cd476fe9751ac68ab52e945'
|
|
7
|
+
data.tar.gz: 7f3a1465ab1cd07274fb30e690f66b214ff21daf7c2b4690a51a827b5e5f4e75fa27e2ae0590678c40cc86518dc887afa811868c9e4d67845afb48173953e912
|
data/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,67 @@ Versioning follows semver with one project-specific rule: **a regression in the
|
|
|
8
8
|
pass rate is a breaking change**, whatever the code change looked like. See the
|
|
9
9
|
Versioning section of the README.
|
|
10
10
|
|
|
11
|
+
## 1.1.0 (2026-09-12)
|
|
12
|
+
|
|
13
|
+
84 pull requests since 1.0.0, and no breaking change — including under this project's own
|
|
14
|
+
rule, since the corpus pass rate went up rather than down.
|
|
15
|
+
|
|
16
|
+
### Corpus
|
|
17
|
+
|
|
18
|
+
- **Pass rate 91.2% → 94.3%**: 33 of the 35 gems in the R10 machine-gate denominator are
|
|
19
|
+
verified. `rbs` left the denominator because its upstream suite fails identically under
|
|
20
|
+
the reference compiler — the basis `byebug`, `unicorn` and `debug` were excluded on —
|
|
21
|
+
and `debug_inspector` and `bindex` were added and verified in the same step, so the
|
|
22
|
+
denominator grew from 34 to 35 rather than shrinking. Verification is recorded per
|
|
23
|
+
environment; both new gems are recorded against glibc x86-64 / Ruby 3.3.12.
|
|
24
|
+
- A candidate-discovery pipeline: a scanner over popularity rankings, a pinned artifact
|
|
25
|
+
schema, arbitrary candidate code confined to a manual workflow, and a skill that
|
|
26
|
+
inspects one candidate at a time.
|
|
27
|
+
|
|
28
|
+
### Compiler
|
|
29
|
+
|
|
30
|
+
- **`long double` passed to a variadic function now works** (the first half of the known
|
|
31
|
+
limitation). The width stays 8 bytes, but a value handed to `...` is converted to the
|
|
32
|
+
80-bit extended format (binary128 on AArch64) before it is pushed, so
|
|
33
|
+
`printf("%Lg", x)` agrees with glibc.
|
|
34
|
+
- **Macro re-expansion now matches gcc**: the hide set of a call is the intersection of
|
|
35
|
+
its name's and its closing paren's (6.10.3.4), and argument-borne tokens are painted
|
|
36
|
+
with the call's own name. c-testsuite 00201 passes, and so does `f(f)(1)`.
|
|
37
|
+
- `__builtin_popcountll` and the other bit-count / bit-scan builtins.
|
|
38
|
+
- The five byte-order predefined macros gcc supplies (`__BYTE_ORDER__` and friends).
|
|
39
|
+
- The `#warning` directive.
|
|
40
|
+
- The `__attr_*` macros in the bundled `sys/cdefs.h`, which the host's `<malloc.h>` reaches
|
|
41
|
+
for on a glibc host.
|
|
42
|
+
|
|
43
|
+
### Generated code
|
|
44
|
+
|
|
45
|
+
- Spill traffic reduction and a register allocator that keeps a value in one register
|
|
46
|
+
across a function, on both x86-64 and AArch64.
|
|
47
|
+
|
|
48
|
+
### Toolchain
|
|
49
|
+
|
|
50
|
+
- **rmake interprets a shell subset itself** — `for`, `if`, brace groups, shell variables
|
|
51
|
+
and the `test` / `[` builtins — so the install rules Automake and libtool generate run.
|
|
52
|
+
It never hands anything to `/bin/sh`: pipes, command substitution and `while` are
|
|
53
|
+
refused rather than approximated.
|
|
54
|
+
- A recipe fragment could reach `/bin/sh` after all: `Process.spawn` routes a lone shell
|
|
55
|
+
reserved word to a shell, so a one-word command behaved differently from a two-word one.
|
|
56
|
+
Closed.
|
|
57
|
+
- mkmf's conftest command runs without a shell.
|
|
58
|
+
- **Everything rubycc reads is bytes**: C source, `ARGV`, the include search path, and the
|
|
59
|
+
names `ar` and ELF readers return. Two strings holding the same non-ASCII bytes under
|
|
60
|
+
different encodings are not equal, so one spelling per name is the only way the
|
|
61
|
+
comparisons hold.
|
|
62
|
+
|
|
63
|
+
### CI
|
|
64
|
+
|
|
65
|
+
- The deterministic acceptance contract (pinned archives, no network) runs on **every pull
|
|
66
|
+
request**. Tier A skips five of its seven required IDs, so a pull request had never run
|
|
67
|
+
extconf or either gem install.
|
|
68
|
+
- The musl weekly job is green again: shared-object fixtures, a glibc-only fixture that is
|
|
69
|
+
not valid C on musl, and symbol collisions between fixtures that musl's no-op `dlclose`
|
|
70
|
+
leaves resident.
|
|
71
|
+
|
|
11
72
|
## 1.0.0 (2026-08-12)
|
|
12
73
|
|
|
13
74
|
First release. rubycc builds Ruby C extensions with no gcc, no binutils, no make and no
|
data/README.md
CHANGED
|
@@ -35,8 +35,8 @@ The verified environments are:
|
|
|
35
35
|
The bundled headers match the ABI of the supported environments on both architectures
|
|
36
36
|
and both C libraries.
|
|
37
37
|
|
|
38
|
-
The current corpus census has
|
|
39
|
-
and
|
|
38
|
+
The current corpus census has 41 candidates, 35 gems in the R10 machine-gate denominator,
|
|
39
|
+
and 33 verified gems: **94.3%**, which meets the 90% the design requires. `pg` and
|
|
40
40
|
`sqlite3` are in that denominator through explicit DESIGN-compatible profiles (pg's
|
|
41
41
|
native-source path, sqlite3 with `--enable-system-libraries`), so the rate is measured
|
|
42
42
|
against a larger corpus than the 90.6% reported before those two were added. See
|
|
@@ -122,17 +122,19 @@ rubycc --target=aarch64 -c foo.c -o foo.o
|
|
|
122
122
|
- **`__GNUC__` is deliberately not defined.** Headers take their non-GNU fallback path.
|
|
123
123
|
- **128-bit integers**: passing, returning and shifting work; division, remainder, bitwise
|
|
124
124
|
`& | ^` and variadic passing do not.
|
|
125
|
-
- **`long double`
|
|
126
|
-
|
|
127
|
-
Arithmetic therefore
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
125
|
+
- **`long double` carries double's range and precision, and `sizeof(long double)` is 8**
|
|
126
|
+
where the x86-64 psABI says 16 (80-bit x87) and AArch64 says 16 (IEEE binary128).
|
|
127
|
+
Arithmetic therefore has double's 53-bit significand rather than the wider format's.
|
|
128
|
+
|
|
129
|
+
**Passing one to a variadic function does work**: a call site converts the value to the
|
|
130
|
+
platform's wide format, so `printf("%Lg", x)` prints what gcc prints — including the
|
|
131
|
+
signed zeros, the infinities, NaNs and subnormals, checked against gcc's own bytes.
|
|
132
|
+
|
|
133
|
+
What still differs is everything that depends on the *width*: `sizeof`, `_Alignof`,
|
|
134
|
+
`max_align_t`, a struct member's offset, and a `long double` passed as a **named**
|
|
135
|
+
argument or returned by value (so a call to `frexpl` and friends still mismatches).
|
|
136
|
+
Closing that changes the ABI of every object file, so it is batched with the other two
|
|
137
|
+
known ABI deviations into one major release rather than shipped piecemeal.
|
|
136
138
|
- **Out of scope**: C++ input is rejected with a diagnostic (the compiler accepts C only),
|
|
137
139
|
so gems needing a C++ compiler (grpc) are out of scope. Gems that run `configure` through
|
|
138
140
|
mini_portile (nokogiri's vendored build; `--use-system-libraries` is fine), or that ship
|
|
@@ -163,11 +165,21 @@ not a rubycc workaround.
|
|
|
163
165
|
Semantic versioning, with one project-specific rule:
|
|
164
166
|
|
|
165
167
|
- **A regression in the corpus pass rate is a breaking change.** The corpus
|
|
166
|
-
(`test/corpus/gems.rb`,
|
|
168
|
+
(`test/corpus/gems.rb`, 41 candidates and currently 35 R10 machine-gate targets) is the
|
|
167
169
|
contract. The selected profile and exact extconf arguments are part of each target's
|
|
168
170
|
identity; they do not by themselves count as an upstream-suite verification.
|
|
169
171
|
If a release stops building a gem that the previous release built, that is major-version
|
|
170
172
|
territory, not a patch — regardless of how small the code change was.
|
|
173
|
+
- **A change to the generated code's ABI is a breaking change too**, even when the corpus
|
|
174
|
+
pass rate goes up. Type sizes, alignments and struct layouts are what object files agree
|
|
175
|
+
on: an object compiled by one major cannot be linked against one compiled by another if
|
|
176
|
+
those move. `long double`'s width, `enum`'s underlying type and `wchar_t`'s signedness
|
|
177
|
+
are the three known deviations from the platform ABI still open, and closing any of them
|
|
178
|
+
moves exactly those values.
|
|
179
|
+
- **Known ABI deviations are closed together, not one at a time.** Each one alone would
|
|
180
|
+
justify a major release, and shipping three majors would make every consumer rebuild
|
|
181
|
+
three times for what is, from their side, one change: "rubycc now matches the platform
|
|
182
|
+
ABI". They are batched into a single major for that reason.
|
|
171
183
|
- **Minor** releases add language or header coverage, new targets, or new gems that build.
|
|
172
184
|
- **Patch** releases fix bugs and improve performance without changing what builds.
|
|
173
185
|
- The generated code's *speed* is not part of the compatibility contract, but throughput
|
data/data/verified_gems.json
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
{
|
|
5
5
|
"versions": ["2.21.1"],
|
|
6
6
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
7
|
-
"verified_at": "2026-
|
|
8
|
-
"evidence": "Built with rubycc (parser.so + generator.so via rmake); gem's own test suite passed 606 tests / 100% (Step 54). B6 in-process rmake build re-confirmed (Step 61), hermetic distroless-headers gem install succeeded (Step 64)."
|
|
7
|
+
"verified_at": "2026-08-15",
|
|
8
|
+
"evidence": "Built with rubycc (parser.so + generator.so via rmake); gem's own test suite passed 606 tests / 100% (Step 54). B6 in-process rmake build re-confirmed (Step 61), hermetic distroless-headers gem install succeeded (Step 64). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 606 tests / 3,433 assertions / 0 failures / 0 errors."
|
|
9
9
|
},
|
|
10
10
|
{
|
|
11
11
|
"versions": ["2.21.1"],
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
{
|
|
28
28
|
"versions": ["1.8.3"],
|
|
29
29
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
30
|
-
"verified_at": "2026-
|
|
31
|
-
"evidence": "Built with rubycc (12 translation units via rmake, jobs:4); gem's own RSpec suite passed 455 examples / 0 failures (Step 54). B6 in-process rmake build re-confirmed (Step 61), hermetic distroless-headers gem install succeeded (Step 64). Re-confirmed in H4 (Step 98) with no compiler changes: all MRI-applicable examples among the upstream 468 examples passed, with the 13 JRuby-only examples excluded as not applicable."
|
|
30
|
+
"verified_at": "2026-08-15",
|
|
31
|
+
"evidence": "Built with rubycc (12 translation units via rmake, jobs:4); gem's own RSpec suite passed 455 examples / 0 failures (Step 54). B6 in-process rmake build re-confirmed (Step 61), hermetic distroless-headers gem install succeeded (Step 64). Re-confirmed in H4 (Step 98) with no compiler changes: all MRI-applicable examples among the upstream 468 examples passed, with the 13 JRuby-only examples excluded as not applicable. Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own RSpec suite passed 455 examples / 0 failures."
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
"versions": ["1.8.3"],
|
|
@@ -44,8 +44,8 @@
|
|
|
44
44
|
{
|
|
45
45
|
"versions": ["4.1.2"],
|
|
46
46
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
47
|
-
"verified_at": "2026-08-
|
|
48
|
-
"evidence": "RUBYCC=1 gem install bigdecimal succeeded (lib/bigdecimal.so built through rmake); the gem's own test suite passed 265 tests / 8,267 assertions / 0 failures / 0 errors (Steps 93-97). Re-verified with tools/verify_gem_tests.rb (Step 162): the gem's own test/unit suite passed 265 tests / 8,267 assertions / 0 failures / 0 errors."
|
|
47
|
+
"verified_at": "2026-08-15",
|
|
48
|
+
"evidence": "RUBYCC=1 gem install bigdecimal succeeded (lib/bigdecimal.so built through rmake); the gem's own test suite passed 265 tests / 8,267 assertions / 0 failures / 0 errors (Steps 93-97). Re-verified with tools/verify_gem_tests.rb (Step 162): the gem's own test/unit suite passed 265 tests / 8,267 assertions / 0 failures / 0 errors. Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 265 tests / 8,165 assertions / 0 failures / 0 errors."
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
51
|
"versions": ["4.1.2"],
|
|
@@ -61,8 +61,8 @@
|
|
|
61
61
|
{
|
|
62
62
|
"versions": ["3.6.1"],
|
|
63
63
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
64
|
-
"verified_at": "2026-
|
|
65
|
-
"evidence": "RUBYCC=1 gem install redcarpet succeeded; the gem's own test/unit suite passed 136 tests / 206 assertions / 0 failures / 0 errors / 0 skips (Step 98)."
|
|
64
|
+
"verified_at": "2026-08-15",
|
|
65
|
+
"evidence": "RUBYCC=1 gem install redcarpet succeeded; the gem's own test/unit suite passed 136 tests / 206 assertions / 0 failures / 0 errors / 0 skips (Step 98). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 136 tests / 206 assertions / 0 failures / 0 errors."
|
|
66
66
|
}
|
|
67
67
|
],
|
|
68
68
|
"notes": "extconf.rb is a pure C-extension build with no configure-time probes."
|
|
@@ -72,8 +72,8 @@
|
|
|
72
72
|
{
|
|
73
73
|
"versions": ["1.8.1"],
|
|
74
74
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
75
|
-
"verified_at": "2026-08-
|
|
76
|
-
"evidence": "RUBYCC=1 gem install racc built ext/racc/cparse (cparse.so); the gem's own test/unit suite passed 71 tests / 319 assertions / 0 failures / 0 errors (Step 99). Re-verified with tools/verify_gem_tests.rb (Step codex/gaps-debt-20260808-1): the gem's own test/unit suite passed 71 tests / 319 assertions / 0 failures / 0 errors."
|
|
75
|
+
"verified_at": "2026-08-15",
|
|
76
|
+
"evidence": "RUBYCC=1 gem install racc built ext/racc/cparse (cparse.so); the gem's own test/unit suite passed 71 tests / 319 assertions / 0 failures / 0 errors (Step 99). Re-verified with tools/verify_gem_tests.rb (Step codex/gaps-debt-20260808-1): the gem's own test/unit suite passed 71 tests / 319 assertions / 0 failures / 0 errors. Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 71 tests / 319 assertions / 0 failures / 0 errors."
|
|
77
77
|
}
|
|
78
78
|
],
|
|
79
79
|
"notes": "This was not a fully hands-off gem install: the generated file lib/racc/parser-text.rb had to be manually supplied from the rmake build's generated output."
|
|
@@ -83,8 +83,8 @@
|
|
|
83
83
|
{
|
|
84
84
|
"versions": ["3.5.1"],
|
|
85
85
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
86
|
-
"verified_at": "2026-
|
|
87
|
-
"evidence": "RUBYCC=1 gem install date succeeded (lib/date_core.so built); the gem's own test/unit suite passed 143 tests / 162,593 assertions / 0 failures / 0 errors / 0 skips (Steps 99-104)."
|
|
86
|
+
"verified_at": "2026-08-15",
|
|
87
|
+
"evidence": "RUBYCC=1 gem install date succeeded (lib/date_core.so built); the gem's own test/unit suite passed 143 tests / 162,593 assertions / 0 failures / 0 errors / 0 skips (Steps 99-104). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 143 tests / 162,593 assertions / 0 failures / 0 errors."
|
|
88
88
|
}
|
|
89
89
|
],
|
|
90
90
|
"notes": ""
|
|
@@ -94,8 +94,8 @@
|
|
|
94
94
|
{
|
|
95
95
|
"versions": ["0.3.0"],
|
|
96
96
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
97
|
-
"verified_at": "2026-
|
|
98
|
-
"evidence": "RUBYCC=1 gem install nkf succeeded (nkf.so built through rmake); the gem's own test/unit suite passed 8 tests / 46 assertions / 0 failures / 0 errors (Step 151)."
|
|
97
|
+
"verified_at": "2026-08-15",
|
|
98
|
+
"evidence": "RUBYCC=1 gem install nkf succeeded (nkf.so built through rmake); the gem's own test/unit suite passed 8 tests / 46 assertions / 0 failures / 0 errors (Step 151). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 8 tests / 46 assertions / 0 failures / 0 errors."
|
|
99
99
|
}
|
|
100
100
|
],
|
|
101
101
|
"notes": "nkf ships bundled with the interpreter, so this run is against the .so injected from the rubycc build (the sanity check confirms it via $LOADED_FEATURES). Building it required the incomplete-array-type composition from C11 6.2.7p3 (Step 150): nkf-utf8/utf8tbl.c combines an `extern const unsigned short euc_to_utf8_1byte[];` forward declaration with a bounds-fixing initializer."
|
|
@@ -105,8 +105,8 @@
|
|
|
105
105
|
{
|
|
106
106
|
"versions": ["0.2.28"],
|
|
107
107
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
108
|
-
"verified_at": "2026-
|
|
109
|
-
"evidence": "RUBYCC=1 gem install stackprof succeeded (stackprof.so built through rmake); the gem's own test/unit suite passed 31 tests / 184 assertions / 0 failures / 0 errors (Step 153)."
|
|
108
|
+
"verified_at": "2026-08-15",
|
|
109
|
+
"evidence": "RUBYCC=1 gem install stackprof succeeded (stackprof.so built through rmake); the gem's own test/unit suite passed 31 tests / 184 assertions / 0 failures / 0 errors (Step 153). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 31 tests / 184 assertions / 0 failures / 0 errors."
|
|
110
110
|
}
|
|
111
111
|
],
|
|
112
112
|
"notes": "Building this required the __dso_handle synthesis from Step 152: stackprof calls pthread_atfork, which glibc's shared libc does not provide (it ships only in libc_nonshared.a), and the archive member that supplies it references __dso_handle. It also required the _POSIX_MONOTONIC_CLOCK definition from Step 149; without it stackprof falls into the upstream's dead #else branch, which has a syntax error. Step 156 closed the gap this entry originally recorded: the linker now synthesizes a .fini_array entry calling __cxa_finalize(__dso_handle), so the handlers this .so registers are dropped when it is dlclose'd (measured on the built stackprof.so)."
|
|
@@ -116,8 +116,8 @@
|
|
|
116
116
|
{
|
|
117
117
|
"versions": ["3.1.6"],
|
|
118
118
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
119
|
-
"verified_at": "2026-
|
|
120
|
-
"evidence": "RUBYCC=1 gem install strscan succeeded (strscan.so built through rmake); the gem's own test/unit suite passed 150 tests / 1,049 assertions / 0 failures / 0 errors (Step 157)."
|
|
119
|
+
"verified_at": "2026-08-15",
|
|
120
|
+
"evidence": "RUBYCC=1 gem install strscan succeeded (strscan.so built through rmake); the gem's own test/unit suite passed 150 tests / 1,049 assertions / 0 failures / 0 errors (Step 157). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 150 tests / 1,047 assertions / 0 failures / 0 errors."
|
|
121
121
|
}
|
|
122
122
|
],
|
|
123
123
|
"notes": "strscan is a default gem shipped with the interpreter, so this run is against the .so injected from the rubycc build: the sanity check confirms through $LOADED_FEATURES that the injected copy, not the interpreter's own strscan.so, is what the suite loaded. Init_strscan calls rb_require(\"strscan/strscan\"), so the upstream tree's lib/strscan/strscan.rb (which defines StringScanner#scan_integer) must be on the load path as well; it ships in the tarball, so nothing had to be supplied by hand. No test was excluded and the build needed no extra flag."
|
|
@@ -127,8 +127,8 @@
|
|
|
127
127
|
{
|
|
128
128
|
"versions": ["3.2.0"],
|
|
129
129
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
130
|
-
"verified_at": "2026-
|
|
131
|
-
"evidence": "RUBYCC=1 gem install stringio succeeded (stringio.so built through rmake); the gem's own test/unit suite passed 103 tests / 626 assertions / 0 failures / 0 errors (Step 157)."
|
|
130
|
+
"verified_at": "2026-08-15",
|
|
131
|
+
"evidence": "RUBYCC=1 gem install stringio succeeded (stringio.so built through rmake); the gem's own test/unit suite passed 103 tests / 626 assertions / 0 failures / 0 errors (Step 157). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 103 tests / 626 assertions / 0 failures / 0 errors."
|
|
132
132
|
},
|
|
133
133
|
{
|
|
134
134
|
"versions": ["3.2.0"],
|
|
@@ -150,8 +150,8 @@
|
|
|
150
150
|
{
|
|
151
151
|
"versions": ["1.4.6"],
|
|
152
152
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
153
|
-
"verified_at": "2026-08-
|
|
154
|
-
"evidence": "RUBYCC=1 gem install etc succeeded (etc.so built through rmake); the gem's own test/unit suite passed 18 tests / 449 assertions / 0 failures / 0 errors (Step 162)."
|
|
153
|
+
"verified_at": "2026-08-15",
|
|
154
|
+
"evidence": "RUBYCC=1 gem install etc succeeded (etc.so built through rmake); the gem's own test/unit suite passed 18 tests / 449 assertions / 0 failures / 0 errors (Step 162). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 18 tests / 608 assertions / 0 failures / 0 errors."
|
|
155
155
|
}
|
|
156
156
|
],
|
|
157
157
|
"notes": "This entry needs three Step-158-to-161 changes at once: rmake's POSIX backslash removal (Step 158), the confstr/fpathconf/pathconf declarations added to the bundled unistd.h (Step 160), and the __atomic_* builtins (Step 161) that ruby.h reaches unconditionally. The bundled unistd.h defines only _CS_PATH and _PC_PIPE_BUF of the 46 _CS_*/_PC_* constants ext/etc/mkconstants.rb publishes, so ext/etc/constdefs.h comes out with 11 constants where the gcc build gets 179; test_etc.rb guards test_confstr and test_pathconf with 'if defined?', so the shortfall shows up as tests that are never defined rather than as failures. The run reported 2 omissions (not failures)."
|
|
@@ -161,8 +161,8 @@
|
|
|
161
161
|
{
|
|
162
162
|
"versions": ["0.3.2"],
|
|
163
163
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
164
|
-
"verified_at": "2026-08-
|
|
165
|
-
"evidence": "RUBYCC=1 gem install io-nonblock succeeded (nonblock.so built through rmake); the gem's own test/unit suite passed 2 tests / 8 assertions / 0 failures / 0 errors (Step 164)."
|
|
164
|
+
"verified_at": "2026-08-15",
|
|
165
|
+
"evidence": "RUBYCC=1 gem install io-nonblock succeeded (nonblock.so built through rmake); the gem's own test/unit suite passed 2 tests / 8 assertions / 0 failures / 0 errors (Step 164). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 2 tests / 8 assertions / 0 failures / 0 errors."
|
|
166
166
|
}
|
|
167
167
|
],
|
|
168
168
|
"notes": "io/nonblock ships with the interpreter, so this run is against the .so injected from the rubycc build; the sanity check confirms through $LOADED_FEATURES that the injected copy, not the interpreter's own, is what the suite loaded. Two tests is the whole of what upstream ships at this tag -- nothing was excluded. test/io/nonblock/test_flush.rb wraps its own require in a rescue LoadError and guards the entire class with `if IO.method_defined?(:nonblock)`, so a suite that loaded nothing at all would report zero failures rather than an error; the recipe requires io/nonblock outside that rescue so that state cannot be recorded as a pass. This build takes the same path gcc's does: all three extconf probes (rb_io_descriptor, O_NONBLOCK, F_GETFL) come out yes under rubycc exactly as under the host gcc control, so HAVE_RB_IO_DESCRIPTOR is defined and the io_descriptor_fallback branch is compiled out on both sides. Building it needed the Step 163 linker fix: before that the r-x load segment did not cover the tail of .plt, and requiring the .so segfaulted on the first call through rb_ext_ractor_safe@plt."
|
|
@@ -172,8 +172,8 @@
|
|
|
172
172
|
{
|
|
173
173
|
"versions": ["0.4.0"],
|
|
174
174
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
175
|
-
"verified_at": "2026-08-
|
|
176
|
-
"evidence": "RUBYCC=1 gem install io-wait succeeded (wait.so built through rmake); the gem's own test/unit suite passed 26 tests / 41 assertions / 0 failures / 0 errors (Step 165)."
|
|
175
|
+
"verified_at": "2026-08-15",
|
|
176
|
+
"evidence": "RUBYCC=1 gem install io-wait succeeded (wait.so built through rmake); the gem's own test/unit suite passed 26 tests / 41 assertions / 0 failures / 0 errors (Step 165). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 26 tests / 41 assertions / 0 failures / 0 errors."
|
|
177
177
|
},
|
|
178
178
|
{
|
|
179
179
|
"versions": ["0.4.0"],
|
|
@@ -195,8 +195,8 @@
|
|
|
195
195
|
{
|
|
196
196
|
"versions": ["6.0.1.1"],
|
|
197
197
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
198
|
-
"verified_at": "2026-08-
|
|
199
|
-
"evidence": "RUBYCC=1 gem install erb succeeded (escape.so built through rmake); the gem's own test/unit suite passed 48 tests / 143 assertions / 0 failures / 0 errors (Step 166)."
|
|
198
|
+
"verified_at": "2026-08-15",
|
|
199
|
+
"evidence": "RUBYCC=1 gem install erb succeeded (escape.so built through rmake); the gem's own test/unit suite passed 48 tests / 143 assertions / 0 failures / 0 errors (Step 166). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 48 tests / 143 assertions / 0 failures / 0 errors."
|
|
200
200
|
}
|
|
201
201
|
],
|
|
202
202
|
"notes": "erb ships with the interpreter, so this run is against the .so injected from the rubycc build; the sanity check confirms through $LOADED_FEATURES that the injected copy, not the interpreter's own erb/escape.so, is what the suite loaded. Only ext/erb/escape is C -- everything else in the gem is Ruby, and lib/erb/util.rb wraps `require 'erb/escape'` in a rescue LoadError with a pure-Ruby ERB::Escape#html_escape over CGI.escapeHTML behind it. Measured how visible that fallback is: corrupting the injected escape.so leaves 47 of the 48 tests passing, and the single failure is upstream's own test_html_escape_extension, which asserts html_escape has no source_location. So this suite does detect its own fallback; what it cannot detect is the wrong copy, since the interpreter's escape.so satisfies that assertion just as well. The one extconf probe, have_func(\"rb_ext_ractor_safe\", \"ruby.h\"), comes out yes under rubycc exactly as under the host gcc control, so HAVE_RB_EXT_RACTOR_SAFE is defined and Init_escape calls rb_ext_ractor_safe(true) on both sides. No test was excluded and the build needed no extra flag."
|
|
@@ -206,8 +206,8 @@
|
|
|
206
206
|
{
|
|
207
207
|
"versions": ["0.8.2"],
|
|
208
208
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
209
|
-
"verified_at": "2026-08-
|
|
210
|
-
"evidence": "RUBYCC=1 gem install io-console succeeded (console.so built through rmake); the gem's own test/unit suite passed 28 tests / 109 assertions / 0 failures / 0 errors (Step 169)."
|
|
209
|
+
"verified_at": "2026-08-15",
|
|
210
|
+
"evidence": "RUBYCC=1 gem install io-console succeeded (console.so built through rmake); the gem's own test/unit suite passed 28 tests / 109 assertions / 0 failures / 0 errors (Step 169). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 28 tests / 108 assertions / 0 failures / 0 errors."
|
|
211
211
|
}
|
|
212
212
|
],
|
|
213
213
|
"notes": "io/console ships with the interpreter, and the gem also carries a pure-Ruby FFI implementation under lib/ffi/ for JRuby; the sanity check confirms through $LOADED_FEATURES that neither is what the suite loaded, but the .so injected from the rubycc build. This gem took two rubycc changes to build at all. Step 167: the bundled termios.h did not declare cfmakeraw and the bundled unistd.h did not declare ttyname_r, which mkmf's have_func probes cannot notice because they declare the function themselves -- the error only appears compiling the body. Step 168: console.c reaches ruby/ractor.h, which forward-declares rb_ractor_shareable_p_continue from inside a static inline function's body, and rubycc rejected block-scope function declarations outright. All 13 extconf probes come out yes under rubycc exactly as under the host gcc control. 28 of the 37 `def test_` in the source actually run, and this is a property of the environment, not of rubycc: five (test_get_winsize_console, test_set_winsize_console, test_getch_timeout, test_pressed_valid, test_pressed_invalid) sit inside a class_eval guarded by `IO.console`, so with no controlling terminal they are never defined, and four names are defined twice across two class_eval blocks so the later definition wins. The tty tests that go through PTY.open (test_raw, test_noecho, test_getpass, test_intr, test_cursor_position and the rest) do run and pass. A host gcc control built from the same upstream tree runs the same 28 tests / 109 assertions / 0 failures / 0 errors / 0 omissions, identical."
|
|
@@ -217,8 +217,8 @@
|
|
|
217
217
|
{
|
|
218
218
|
"versions": ["3.2.1"],
|
|
219
219
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
220
|
-
"verified_at": "2026-08-
|
|
221
|
-
"evidence": "RUBYCC=1 gem install digest succeeded (digest.so + bubblebabble.so + md5.so + rmd160.so + sha1.so + sha2.so built through rmake); the gem's own test/unit suite passed 98 tests / 215 assertions / 0 failures / 0 errors (Step 170)."
|
|
220
|
+
"verified_at": "2026-08-15",
|
|
221
|
+
"evidence": "RUBYCC=1 gem install digest succeeded (digest.so + bubblebabble.so + md5.so + rmd160.so + sha1.so + sha2.so built through rmake); the gem's own test/unit suite passed 98 tests / 215 assertions / 0 failures / 0 errors (Step 170). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 98 tests / 215 assertions / 0 failures / 0 errors."
|
|
222
222
|
}
|
|
223
223
|
],
|
|
224
224
|
"notes": "The first corpus gem with more than one extension: six extconf.rb under ext/digest, six .so, all six built by rubycc through rmake in one gem install with no flag and no change to the mkmf shim. digest ships with the interpreter, so the run is against the injected copies; the sanity check requires all six by name, because requiring only \"digest\" loads two of them and leaves the other four unproven (Digest's const_missing pulls the algorithm extensions in lazily), and the gate demands every injected .so appear in $LOADED_FEATURES. What this suite proves is unusually direct for a corpus gem: it checks digests of known inputs against known hex outputs, so a miscompiled round function would show up as a wrong value rather than as a crash. The three extconf probes (CommonCrypto/CommonDigest.h no, u_int8_t yes, sys/cdefs.h yes) come out identical under rubycc and the host gcc control -- CommonCrypto is macOS-only, so both sides compile the bundled algorithm sources rather than the platform ones. The upstream tree keeps digest/loader.rb and digest/sha2/loader.rb under ext/digest/lib (gem install copies them into lib/), so that directory has to be on the load path as the Rakefile puts it there."
|
|
@@ -228,8 +228,8 @@
|
|
|
228
228
|
{
|
|
229
229
|
"versions": ["3.2.3"],
|
|
230
230
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
231
|
-
"verified_at": "2026-08-
|
|
232
|
-
"evidence": "RUBYCC=1 gem install zlib succeeded (zlib.so built through rmake); the gem's own test/unit suite passed 97 tests / 540 assertions / 0 failures / 0 errors (Step 171)."
|
|
231
|
+
"verified_at": "2026-08-15",
|
|
232
|
+
"evidence": "RUBYCC=1 gem install zlib succeeded (zlib.so built through rmake); the gem's own test/unit suite passed 97 tests / 540 assertions / 0 failures / 0 errors (Step 171). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 97 tests / 538 assertions / 0 failures / 0 errors."
|
|
233
233
|
},
|
|
234
234
|
{
|
|
235
235
|
"versions": ["3.2.3"],
|
|
@@ -238,15 +238,15 @@
|
|
|
238
238
|
"evidence": "RUBYCC=1 gem install zlib succeeded (zlib.so built through rmake); the gem's own test/unit suite passed 97 tests / 538 assertions / 0 failures / 0 errors (Step m4-aarch64-acceptance-2)."
|
|
239
239
|
}
|
|
240
240
|
],
|
|
241
|
-
"notes": "The first corpus gem that links a host system library, the case R10 names. extconf's have_library('z', 'deflateReset(NULL)', 'zlib.h') is a try_link, so its success means rubycc both found the host's /usr/include/zlib.h and linked -lz; had it failed, the build would not have stopped but switched to the bundled-zlib branch, so the choice was read out of the generated Makefile rather than assumed. All seven probes come out yes under rubycc exactly as under the host gcc control (deflateReset in -lz, crc32_combine, adler32_combine, z_crc_t, z_size_t, crc32_z, adler32_z), the Makefile carries -DHAVE_ZLIB_SIZE_T_FUNCS and no ZSRC, and the built zlib.so records libz.so.1 in DT_NEEDED exactly as the gcc-built one does. One difference from the gcc control's .so: gcc's also lists libm.so.6 in DT_NEEDED while rubycc's does not, because rubycc's linker records only libraries that actually supply a needed symbol and zlib.c references none from libm; every undefined symbol resolves and the suite passes either way. zlib ships with the interpreter, so the run is against the injected copy, which the sanity check confirms through $LOADED_FEATURES. The run reported 1 omission (not failures). The same three markers were measured again for the AArch64 record -- -DHAVE_ZLIB_SIZE_T_FUNCS in CPPFLAGS, -lz in LIBS, and libz.so.1 in the built .so's DT_NEEDED with deflate left undefined -- because a library search is per-architecture, and that is precisely the layer that was broken on AArch64 once (Step 208, where the resolver looked in x86-64's multiarch directory). The AArch64 omission is test_path_tmpfile, which the container's filesystem answers with EOPNOTSUPP."
|
|
241
|
+
"notes": "The first corpus gem that links a host system library, the case R10 names. extconf's have_library('z', 'deflateReset(NULL)', 'zlib.h') is a try_link, so its success means rubycc both found the host's /usr/include/zlib.h and linked -lz; had it failed, the build would not have stopped but switched to the bundled-zlib branch, so the choice was read out of the generated Makefile rather than assumed. All seven probes come out yes under rubycc exactly as under the host gcc control (deflateReset in -lz, crc32_combine, adler32_combine, z_crc_t, z_size_t, crc32_z, adler32_z), the Makefile carries -DHAVE_ZLIB_SIZE_T_FUNCS and no ZSRC, and the built zlib.so records libz.so.1 in DT_NEEDED exactly as the gcc-built one does. One difference from the gcc control's .so: gcc's also lists libm.so.6 in DT_NEEDED while rubycc's does not, because rubycc's linker records only libraries that actually supply a needed symbol and zlib.c references none from libm; every undefined symbol resolves and the suite passes either way. zlib ships with the interpreter, so the run is against the injected copy, which the sanity check confirms through $LOADED_FEATURES. The run reported 1 omission (not failures). The same three markers were measured again for the AArch64 record -- -DHAVE_ZLIB_SIZE_T_FUNCS in CPPFLAGS, -lz in LIBS, and libz.so.1 in the built .so's DT_NEEDED with deflate left undefined -- because a library search is per-architecture, and that is precisely the layer that was broken on AArch64 once (Step 208, where the resolver looked in x86-64's multiarch directory). The AArch64 omission is test_path_tmpfile, which the container's filesystem answers with EOPNOTSUPP. The run reported 1 pending (not failures)."
|
|
242
242
|
},
|
|
243
243
|
"psych": {
|
|
244
244
|
"verifications": [
|
|
245
245
|
{
|
|
246
246
|
"versions": ["5.3.1"],
|
|
247
247
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
248
|
-
"verified_at": "2026-08-
|
|
249
|
-
"evidence": "RUBYCC=1 gem install psych succeeded (psych.so built through rmake); the gem's own test/unit suite passed 633 tests / 1,598 assertions / 0 failures / 0 errors (Step 172)."
|
|
248
|
+
"verified_at": "2026-08-15",
|
|
249
|
+
"evidence": "RUBYCC=1 gem install psych succeeded (psych.so built through rmake); the gem's own test/unit suite passed 633 tests / 1,598 assertions / 0 failures / 0 errors (Step 172). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 635 tests / 1,602 assertions / 0 failures / 0 errors."
|
|
250
250
|
}
|
|
251
251
|
],
|
|
252
252
|
"notes": "The second corpus gem that links a host system library, and the first whose configure path rubycc's own pkg-config shim *changed*. extconf tries pkg_config('yaml-0.1') first and only falls back to find_header('yaml.h') + find_library('yaml', 'yaml_get_version') when that comes up empty. This host has no pkg-config at all, so the gcc control gets \"not found\" and takes the fallback branch, while under rubycc the transcript reads `checking for pkg-config for yaml-0.1... [\" \", \"\", \"-lyaml\"]` -- exe/rubycc-pkgconf answered, so the pkg_config branch ran instead. Both branches converge on the same LIBS = $(LIBRUBYARG_SHARED) -lyaml -lm -lpthread -lc and the suite passes, but the two sides did not configure through the same code path, which is recorded here rather than left implicit (Step 160's lesson: a matching pass count is not evidence that the same thing was built). The build also exposed a separate rmake gap, fixed in Step 173: the Makefile's `-cd libyaml && $(MAKE) clean` echoed as `cd libyaml && clean` because rmake did not predefine the MAKE macro that POSIX requires. It was harmless here -- the rule is `-`-prefixed so its failure is ignored, and this build uses the host libyaml rather than the bundled one -- but it would have silently no-opped the recursive-make rule that builds bundled libyaml. psych ships with the interpreter and MRI has no pure-Ruby parser to fall back to (ext/java is JRuby's SnakeYAML binding), so the sanity check's $LOADED_FEATURES test is what rules out the interpreter's own copy winning the require."
|
|
@@ -256,8 +256,8 @@
|
|
|
256
256
|
{
|
|
257
257
|
"versions": ["0.3.0"],
|
|
258
258
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
259
|
-
"verified_at": "2026-08-
|
|
260
|
-
"evidence": "RUBYCC=1 gem install syslog succeeded (syslog_ext.so built through rmake); the gem's own test/unit suite passed 32 tests / 234 assertions / 0 failures / 0 errors (Step 209)."
|
|
259
|
+
"verified_at": "2026-08-15",
|
|
260
|
+
"evidence": "RUBYCC=1 gem install syslog succeeded (syslog_ext.so built through rmake); the gem's own test/unit suite passed 32 tests / 234 assertions / 0 failures / 0 errors (Step 209). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 32 tests / 234 assertions / 0 failures / 0 errors."
|
|
261
261
|
}
|
|
262
262
|
],
|
|
263
263
|
"notes": "Ruby 3.4.5 glibc x86_64; upstream tests ran against rubycc-built extension."
|
|
@@ -267,8 +267,8 @@
|
|
|
267
267
|
{
|
|
268
268
|
"versions": ["0.8.1"],
|
|
269
269
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
270
|
-
"verified_at": "2026-08-
|
|
271
|
-
"evidence": "RUBYCC=1 gem install http_parser.rb succeeded (ruby_http_parser.so built through rmake); the gem's own RSpec suite passed 72 examples / 0 failures (Step 209)."
|
|
270
|
+
"verified_at": "2026-08-15",
|
|
271
|
+
"evidence": "RUBYCC=1 gem install http_parser.rb succeeded (ruby_http_parser.so built through rmake); the gem's own RSpec suite passed 72 examples / 0 failures (Step 209). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own RSpec suite passed 72 examples / 0 failures."
|
|
272
272
|
}
|
|
273
273
|
],
|
|
274
274
|
"notes": "Ruby 3.4.5 glibc x86_64; upstream tests ran against rubycc-built extension."
|
|
@@ -278,8 +278,8 @@
|
|
|
278
278
|
{
|
|
279
279
|
"versions": ["0.8.2"],
|
|
280
280
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
281
|
-
"verified_at": "2026-08-
|
|
282
|
-
"evidence": "RUBYCC=1 gem install websocket-driver succeeded (websocket_mask.so built through rmake); the gem's own RSpec suite passed 196 examples / 0 failures (Step 209)."
|
|
281
|
+
"verified_at": "2026-08-15",
|
|
282
|
+
"evidence": "RUBYCC=1 gem install websocket-driver succeeded (websocket_mask.so built through rmake); the gem's own RSpec suite passed 196 examples / 0 failures (Step 209). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own RSpec suite passed 196 examples / 0 failures."
|
|
283
283
|
}
|
|
284
284
|
],
|
|
285
285
|
"notes": "The upstream RSpec suite passed 196 examples against the injected websocket_mask.so. The run used the recipe's synthetic Gemfile to activate the runtime/test dependencies without resolving the repository's development-only bundle."
|
|
@@ -289,8 +289,8 @@
|
|
|
289
289
|
{
|
|
290
290
|
"versions": ["1.24.6"],
|
|
291
291
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
292
|
-
"verified_at": "2026-08-
|
|
293
|
-
"evidence": "RUBYCC=1 gem install bootsnap succeeded (bootsnap.so built through rmake); the gem's own test/unit suite passed 154 tests / 331 assertions / 0 failures / 0 errors (Step 210)."
|
|
292
|
+
"verified_at": "2026-08-15",
|
|
293
|
+
"evidence": "RUBYCC=1 gem install bootsnap succeeded (bootsnap.so built through rmake); the gem's own test/unit suite passed 154 tests / 331 assertions / 0 failures / 0 errors (Step 210). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 154 tests / 331 assertions / 0 failures / 0 errors."
|
|
294
294
|
}
|
|
295
295
|
],
|
|
296
296
|
"notes": "The upstream test/unit suite passed 154 tests / 331 assertions against the injected bootsnap.so. The run used the recipe's synthetic Gemfile and pinned minitest 5.25.5, matching the suite's compatibility requirement."
|
|
@@ -300,8 +300,8 @@
|
|
|
300
300
|
{
|
|
301
301
|
"versions": ["1.4.3"],
|
|
302
302
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
303
|
-
"verified_at": "2026-08-
|
|
304
|
-
"evidence": "RUBYCC=1 gem install yajl-ruby succeeded (yajl.so built through rmake); the gem's own RSpec suite passed 416 examples / 0 failures (Step 211)."
|
|
303
|
+
"verified_at": "2026-08-15",
|
|
304
|
+
"evidence": "RUBYCC=1 gem install yajl-ruby succeeded (yajl.so built through rmake); the gem's own RSpec suite passed 416 examples / 0 failures (Step 211). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own RSpec suite passed 416 examples / 0 failures."
|
|
305
305
|
}
|
|
306
306
|
],
|
|
307
307
|
"notes": "The upstream RSpec suite passed 416 examples against the injected yajl.so; the extension was loaded from the rubycc build, not a fallback implementation."
|
|
@@ -311,8 +311,8 @@
|
|
|
311
311
|
{
|
|
312
312
|
"versions": ["1.8.1"],
|
|
313
313
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
314
|
-
"verified_at": "2026-08-
|
|
315
|
-
"evidence": "RUBYCC=1 gem install prism succeeded (prism.so built through rmake); the gem's own test/unit suite passed 17,306 tests / 1,762,400 assertions / 0 failures / 0 errors (Step 212)."
|
|
314
|
+
"verified_at": "2026-08-15",
|
|
315
|
+
"evidence": "RUBYCC=1 gem install prism succeeded (prism.so built through rmake); the gem's own test/unit suite passed 17,306 tests / 1,762,400 assertions / 0 failures / 0 errors (Step 212). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 17,306 tests / 1,762,400 assertions / 0 failures / 0 errors."
|
|
316
316
|
}
|
|
317
317
|
],
|
|
318
318
|
"notes": "The upstream test/unit suite passed 17,306 tests / 1,762,400 assertions against the injected prism.so. The run reported 3 omissions (not failures); the source archive was supplemented with the generated Ruby API files present in the gem package."
|
|
@@ -322,8 +322,8 @@
|
|
|
322
322
|
{
|
|
323
323
|
"versions": ["1.1.8"],
|
|
324
324
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
325
|
-
"verified_at": "2026-08-
|
|
326
|
-
"evidence": "RUBYCC=1 gem install fiddle succeeded (fiddle.so built through rmake); the gem's own test/unit suite passed 227 tests / 615 assertions / 0 failures / 0 errors (Step 213)."
|
|
325
|
+
"verified_at": "2026-08-15",
|
|
326
|
+
"evidence": "RUBYCC=1 gem install fiddle succeeded (fiddle.so built through rmake); the gem's own test/unit suite passed 227 tests / 615 assertions / 0 failures / 0 errors (Step 213). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 227 tests / 615 assertions / 0 failures / 0 errors."
|
|
327
327
|
}
|
|
328
328
|
],
|
|
329
329
|
"notes": "The upstream test/unit suite passed 227 tests / 615 assertions against the injected fiddle.so, with the system libffi ABI path enabled."
|
|
@@ -333,8 +333,8 @@
|
|
|
333
333
|
{
|
|
334
334
|
"versions": ["2.7.5"],
|
|
335
335
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
336
|
-
"verified_at": "2026-08-
|
|
337
|
-
"evidence": "RUBYCC=1 gem install nio4r succeeded (nio4r_ext.so built through rmake); the gem's own RSpec suite passed 112 examples / 0 failures (Step atomic-type-4)."
|
|
336
|
+
"verified_at": "2026-08-15",
|
|
337
|
+
"evidence": "RUBYCC=1 gem install nio4r succeeded (nio4r_ext.so built through rmake); the gem's own RSpec suite passed 112 examples / 0 failures (Step atomic-type-4). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own RSpec suite passed 112 examples / 0 failures."
|
|
338
338
|
}
|
|
339
339
|
],
|
|
340
340
|
"notes": "PR #19 recorded nio4r as blocked by sandbox socket/PTY constraints; a re-measurement showed TCP, PTY and UNIX sockets all work here, and the suite passed with no rubycc change. The run reported 2 pendings (not failures)."
|
|
@@ -344,8 +344,8 @@
|
|
|
344
344
|
{
|
|
345
345
|
"versions": ["4.35.1"],
|
|
346
346
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
347
|
-
"verified_at": "2026-08-
|
|
348
|
-
"evidence": "RUBYCC=1 gem install google-protobuf succeeded (protobuf_c.so built through rmake); the gem's own test/unit suite passed 328 tests / 555,716 assertions / 0 failures / 0 errors (Step atomic-type-14)."
|
|
347
|
+
"verified_at": "2026-08-15",
|
|
348
|
+
"evidence": "RUBYCC=1 gem install google-protobuf succeeded (protobuf_c.so built through rmake); the gem's own test/unit suite passed 328 tests / 555,716 assertions / 0 failures / 0 errors (Step atomic-type-14). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 328 tests / 569,998 assertions / 0 failures / 0 errors."
|
|
349
349
|
}
|
|
350
350
|
],
|
|
351
351
|
"notes": "Verification requires protoc: the upstream tarball ships no _pb.rb, so the recipe generates all 27 of them (12 well-known + 15 test protos) with the protoc matching the pinned tag. Measured with libprotoc 35.1 -- note the gemspec version 4.35.1 and the upstream tag v35.1 differ. The gemspec lists two extensions in one directory, so RubyGems overwrites gem_make.out with the second (non-compiling) one; the Makefile's CC=rubycc is what proves the build, and the .so carries no .comment section (a gcc-built .so on this host carries 'GCC: (Ubuntu 13.3.0-...)'). The run reported 2 omissions (not failures)."
|
|
@@ -355,8 +355,8 @@
|
|
|
355
355
|
{
|
|
356
356
|
"versions": ["0.5.7"],
|
|
357
357
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
358
|
-
"verified_at": "2026-08-
|
|
359
|
-
"evidence": "RUBYCC=1 gem install mysql2 succeeded (mysql2.so built through rmake); the gem's own RSpec suite passed 340 examples / 0 failures (Step atomic-type-15)."
|
|
358
|
+
"verified_at": "2026-08-15",
|
|
359
|
+
"evidence": "RUBYCC=1 gem install mysql2 succeeded (mysql2.so built through rmake); the gem's own RSpec suite passed 340 examples / 0 failures (Step atomic-type-15). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own RSpec suite passed 340 examples / 0 failures."
|
|
360
360
|
}
|
|
361
361
|
],
|
|
362
362
|
"notes": "Verification needs a MariaDB server AND a small-socket-buffer network namespace: spec/mysql2/result_spec.rb:240 asserts that net_write_timeout aborts a stream the client reads too slowly, and that never fires on an ordinary loopback -- the 10,000-row / 2.4 MiB result fits entirely inside the host's tcp_wmem (4 MiB) and tcp_rmem (6 MiB), so the server never blocks writing. Measured: the same test raises 'Lost connection to server during query' at row 47,248 when the table is grown to 60,000 rows (14.6 MiB). It fails identically under gcc without this environment, and passes identically under gcc with it. The recipe therefore runs the suite inside the DB container's network namespace, whose buffers are pinned to 32 KiB both ways; see suite_exec in tools/verify_gem_tests.rb. The run also mounts a host libyaml-0.so.2 because the mariadb:11 image has none and Ruby's psych needs it. The run reported 6 pendings (not failures)."
|
|
@@ -366,8 +366,8 @@
|
|
|
366
366
|
{
|
|
367
367
|
"versions": ["8.0.2"],
|
|
368
368
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
369
|
-
"verified_at": "2026-08-
|
|
370
|
-
"evidence": "RUBYCC=1 gem install puma succeeded (puma_http11.so built through rmake); the gem's own test/unit suite passed 840 tests / 2,490 assertions / 0 failures / 0 errors (Step corpus-ninety-2)."
|
|
369
|
+
"verified_at": "2026-08-15",
|
|
370
|
+
"evidence": "RUBYCC=1 gem install puma succeeded (puma_http11.so built through rmake); the gem's own test/unit suite passed 840 tests / 2,490 assertions / 0 failures / 0 errors (Step corpus-ninety-2). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 840 tests / 2,492 assertions / 0 failures / 0 errors."
|
|
371
371
|
}
|
|
372
372
|
],
|
|
373
373
|
"notes": "The suite must run the way upstream runs it: under bundler with puma's own Gemfile, and with CI=1. Without bundler 12 of the 840 tests fail on their absence alone (TestWorkerGemIndependence calls Bundler.with_unbundled_env, TestPreserveBundlerEnv asserts BUNDLE_GEMFILE survives a phased restart, prune_bundler has nothing to prune, and TestRackUp cannot find the rackup binstub) -- identically under gcc. CI=1 is what test/helper.rb:118 checks before enabling minitest-retry: the TestIntegrationCluster fork/phased-restart cases are inherently timing-dependent (measured: two runs of the same gcc build gave 6 and 7 failures, and rubycc and gcc each failed a different single case), so upstream itself runs them with retries. PUMA_NO_RUBOCOP=1 keeps the lint-only half of the Gemfile out. The run reported 8 skips (not failures)."
|
|
@@ -377,8 +377,8 @@
|
|
|
377
377
|
{
|
|
378
378
|
"versions": ["2.9.5"],
|
|
379
379
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
380
|
-
"verified_at": "2026-08-
|
|
381
|
-
"evidence": "RUBYCC=1 gem install sqlite3 succeeded (sqlite3_native.so built through rmake); the gem's own test/unit suite passed 334 tests / 661 assertions / 0 failures / 0 errors (Step corpus-sqlite3-pg-1)."
|
|
380
|
+
"verified_at": "2026-08-15",
|
|
381
|
+
"evidence": "RUBYCC=1 gem install sqlite3 succeeded (sqlite3_native.so built through rmake); the gem's own test/unit suite passed 334 tests / 661 assertions / 0 failures / 0 errors (Step corpus-sqlite3-pg-1). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own test/unit suite passed 334 tests / 661 assertions / 0 failures / 0 errors."
|
|
382
382
|
}
|
|
383
383
|
],
|
|
384
384
|
"notes": "Installed with --enable-system-libraries, the R10 profile test/corpus/gems.rb declares for this gem: the default path builds the bundled amalgamation through mini_portile2 and configure, which R10 excludes. The sanity expression asserts SQLite3::SQLITE_PACKAGED_LIBRARIES == false, so the record is evidence about the system-library build and no other. The run reported 5 skips (not failures); 3 of them are test/test_database_uri.rb's own `skip(\"system libraries may not allow URIs\") unless SQLite3::SQLITE_PACKAGED_LIBRARIES`, i.e. a consequence of that same profile rather than of rubycc."
|
|
@@ -388,10 +388,32 @@
|
|
|
388
388
|
{
|
|
389
389
|
"versions": ["1.6.3"],
|
|
390
390
|
"environment": "glibc x86_64 / ruby 3.4.5",
|
|
391
|
-
"verified_at": "2026-08-
|
|
392
|
-
"evidence": "RUBYCC=1 gem install pg succeeded (pg_ext.so built through rmake); the gem's own RSpec suite passed 1,040 examples / 0 failures (Step corpus-sqlite3-pg-2)."
|
|
391
|
+
"verified_at": "2026-08-15",
|
|
392
|
+
"evidence": "RUBYCC=1 gem install pg succeeded (pg_ext.so built through rmake); the gem's own RSpec suite passed 1,040 examples / 0 failures (Step corpus-sqlite3-pg-2). Re-verified with tools/verify_gem_tests.rb (Step corpus-reverify-1): the gem's own RSpec suite passed 1,044 examples / 0 failures."
|
|
393
393
|
}
|
|
394
394
|
],
|
|
395
395
|
"notes": "The suite starts its own PostgreSQL server from `pg_config --bindir`, so the host needs the server package and not only libpq; the socket directory it uses must also stay under the 107-byte sun_path limit, which a long work directory silently breaks (the server then refuses to start and no example runs at all). The run reported 4 pendings (not failures): two are upstream's own `skip` when port 5432 is already taken (spec/pg/connection_spec.rb:840), which is the case whenever a normal PostgreSQL install is running, and two apply to native binary gems only. A dozen specs assert on wall-clock durations read from Time.now, so a host that steps its clock fails them at random: measured here at 2/40 runs for rubycc and 3/40 for the gcc control, while the underlying connection took 2.003-2.010 s on both sides in all 80 measurements (Step corpus-sqlite3-pg-2). The recorded run was made with the clock stepping stopped."
|
|
396
|
+
},
|
|
397
|
+
"debug_inspector": {
|
|
398
|
+
"verifications": [
|
|
399
|
+
{
|
|
400
|
+
"versions": ["1.2.0"],
|
|
401
|
+
"environment": "glibc x86_64 / ruby 3.3.12",
|
|
402
|
+
"verified_at": "2026-09-10",
|
|
403
|
+
"evidence": "RUBYCC=1 gem install debug_inspector succeeded (debug_inspector.so built through rmake); the gem's own test/unit suite passed 6 tests / 29 assertions / 0 failures / 0 errors (Step corpus-debug-inspector-rbs-1). Re-verified with tools/verify_gem_tests.rb (Step corpus-debug-inspector-rbs-1): the gem's own test/unit suite passed 6 tests / 29 assertions / 0 failures / 0 errors."
|
|
404
|
+
}
|
|
405
|
+
],
|
|
406
|
+
"notes": ""
|
|
407
|
+
},
|
|
408
|
+
"bindex": {
|
|
409
|
+
"verifications": [
|
|
410
|
+
{
|
|
411
|
+
"versions": ["0.8.1"],
|
|
412
|
+
"environment": "glibc x86_64 / ruby 3.3.12",
|
|
413
|
+
"verified_at": "2026-09-10",
|
|
414
|
+
"evidence": "RUBYCC=1 gem install bindex succeeded (cruby.so built through rmake); the gem's own test/unit suite passed 10 tests / 19 assertions / 0 failures / 0 errors (Step corpus-debug-inspector-rbs-1)."
|
|
415
|
+
}
|
|
416
|
+
],
|
|
417
|
+
"notes": ""
|
|
396
418
|
}
|
|
397
419
|
}
|
data/exe/rubycc-ar
CHANGED
|
@@ -35,7 +35,14 @@ if ARGV.include?("--version") || ARGV.include?("-v")
|
|
|
35
35
|
exit 0
|
|
36
36
|
end
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
# The command line crosses into rubycc here, so it is re-tagged as bytes
|
|
39
|
+
# (lib/rubycc.rb): the flag word below is matched with a regexp, and the file
|
|
40
|
+
# names are matched — as Hash keys and with == — against member names read out
|
|
41
|
+
# of the archive, which ArReader returns as bytes whatever their length. Only
|
|
42
|
+
# with both sides tagged alike does a name of non-ASCII bytes compare equal;
|
|
43
|
+
# when it did not, `r` appended a duplicate member instead of replacing one and
|
|
44
|
+
# `x` wrote nothing and still exited 0.
|
|
45
|
+
args = ARGV.map { |arg| arg.encoding == Encoding::BINARY ? arg : arg.b }
|
|
39
46
|
usage_error("no operation specified") if args.empty?
|
|
40
47
|
|
|
41
48
|
# The first word is the combined flag string (e.g. "rcs", "t", "x"), with an
|
|
@@ -70,8 +77,9 @@ begin
|
|
|
70
77
|
data_by_name = {}
|
|
71
78
|
if File.exist?(archive)
|
|
72
79
|
Reader.read_file(archive).members.reject(&:special?).each do |m|
|
|
73
|
-
|
|
74
|
-
|
|
80
|
+
name = m.name
|
|
81
|
+
order << name
|
|
82
|
+
data_by_name[name] = m.data
|
|
75
83
|
end
|
|
76
84
|
end
|
|
77
85
|
|
data/include/libc/sys/cdefs.h
CHANGED
|
@@ -72,6 +72,18 @@
|
|
|
72
72
|
#define __result_use_check
|
|
73
73
|
#define __COLD
|
|
74
74
|
|
|
75
|
+
/* Static-analysis annotations: __attr_access describes which parameter is a
|
|
76
|
+
buffer and how it is used, __attr_access_none says a parameter is not
|
|
77
|
+
accessed at all, and __attr_dealloc (plus the fclose/free object-like
|
|
78
|
+
spellings some headers apply directly) pairs an allocating function with
|
|
79
|
+
the one that must free its result. rubycc performs no such analysis, so
|
|
80
|
+
each expands to nothing, the same as the __attribute_* group above. */
|
|
81
|
+
#define __attr_access(params)
|
|
82
|
+
#define __attr_access_none(argno)
|
|
83
|
+
#define __attr_dealloc(dealloc, argno)
|
|
84
|
+
#define __attr_dealloc_fclose
|
|
85
|
+
#define __attr_dealloc_free
|
|
86
|
+
|
|
75
87
|
#define __nonnull(params)
|
|
76
88
|
#define __always_inline __inline
|
|
77
89
|
#define __extern_inline extern __inline
|