diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 591ee50a..0bcd33e7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,7 +31,7 @@ jobs: runtime: name: build the runtime and run what stands above it (${{ matrix.toolchain }}) runs-on: ubuntu-24.04 - # ⚠️ Raised for the self-build step below, which is temporary. See the note + # Raised for the self-build step below, which is temporary. See the note # there: when mcpp#486 ships, that step goes and so does this. timeout-minutes: 90 strategy: @@ -59,7 +59,7 @@ jobs: - name: Install mcpp run: bash tools/install-mcpp.sh - # ⭐ THE ENGINE EVERY STEP BELOW WILL USE, COMPARED AGAINST THE ONE BUILT. + # THE ENGINE EVERY STEP BELOW WILL USE, COMPARED AGAINST THE ONE BUILT. # # The step above appends a directory to GITHUB_PATH, which governs the # steps that follow it, so that step cannot observe its own effect. Whether @@ -97,7 +97,7 @@ jobs: - name: The runtime builds run: mcpp build - # ⚠️ THE ONE OBSERVATION A BUILD CANNOT MAKE. + # THE ONE OBSERVATION A BUILD CANNOT MAKE. # # An unwinder that cannot find the program's frame descriptions compiles, # links, and runs every path that does not throw. Measured while this @@ -106,7 +106,7 @@ jobs: # _Unwind_Backtrace walking zero frames --- and nothing named the cause. # So the throw is the check, and the destructor beside it is what says the # unwind was correct rather than merely non-fatal. - # ⭐ THE UNWINDER, AND EVERY POSITION `__config_site` DECLARES. + # THE UNWINDER, AND EVERY POSITION `__config_site` DECLARES. # # The throw and the destructor beside it are what say the runtime is # really there. The rest of the probe asks whether the CLAIMS this package @@ -222,7 +222,7 @@ jobs: echo " ok the declaration holds: no terminal support is claimed and none is present" fi - # ⭐⭐ THE SAME PROGRAM ON A MACHINE WITH NO OPERATING SYSTEM. + # THE SAME PROGRAM ON A MACHINE WITH NO OPERATING SYSTEM. # # Everything above this step runs on a host, and a host has a C library, a # C++ runtime and an unwinder already installed. A program that reaches @@ -235,7 +235,7 @@ jobs: # cannot go green by accident, which is why the design document makes it # the acceptance criterion rather than one more row. # - # ⚠️ The assertion is on the OUTPUT and not on the exit status: firmware + # The assertion is on the OUTPUT and not on the exit status: firmware # that never reaches the payload exits zero, and so does a payload whose # console writes go nowhere. - name: Install the emulator @@ -250,14 +250,14 @@ jobs: set -euo pipefail cd examples/same-source Q=$(ls -d "$HOME"/.mcpp/registry/data/xpkgs/xim-x-qemu-riscv/*/bin/qemu-system-riscv64 | head -1) - # ⚠️ Anchored on the BARE NAME, so a checkout that already carries a + # Anchored on the BARE NAME, so a checkout that already carries a # path is left alone rather than getting a path inside a path. The # manifest is required to carry the bare name; the note beside it says # why, and this is the step that relies on it. grep -q '"qemu-system-riscv64"' mcpp.toml \ || { echo "::error::the manifest no longer carries the bare emulator name"; exit 1; } sed -i "s|\"qemu-system-riscv64\"|\"$Q\"|" mcpp.toml - # ⚠️ `--target riscv64-none-elf`, AND THE FLAG IS THE WHOLE STEP. + # `--target riscv64-none-elf`, AND THE FLAG IS THE WHOLE STEP. # # This manifest carries no `[build] target`, so a bare `mcpp run` # builds for the HOST and passes — the four lines below appear either @@ -271,10 +271,10 @@ jobs: grep -q 'Boot HART' out.log # firmware ran; this is OpenSBI grep -q 'sorted: 2 4 7' out.log # containers + algorithms + the allocator grep -q 'caught: 42' out.log # the unwinder found the handler - grep -q 'unwound: true' out.log # ⭐ and ran a destructor on the way + grep -q 'unwound: true' out.log # and ran a destructor on the way grep -q 'import std over openkal: ok' out.log - # ⭐⭐ AND THE SAME SOURCE ON THIS MACHINE, WHICH IS WHAT MAKES THE STEP + # AND THE SAME SOURCE ON THIS MACHINE, WHICH IS WHAT MAKES THE STEP # ABOVE A DEMONSTRATION RATHER THAN AN ILLUSTRATION. # # Nothing is edited between the two commands — no `#if`, no second @@ -289,7 +289,7 @@ jobs: grep -q 'import std over openkal: ok' host.log # The four lines are the same four lines. # - # ⚠️ `tr -d '\r'` ON BOTH SIDES, AND IT IS NOT COSMETIC. The bare-metal + # `tr -d '\r'` ON BOTH SIDES, AND IT IS NOT COSMETIC. The bare-metal # run reaches the console through an emulated 16550 UART, and a serial # console terminates lines with CRLF; the native run does not. Without # this the diff reports four differing lines whose visible text is @@ -299,14 +299,14 @@ jobs: diff <(grep -E '^(sorted|caught|unwound|import std over openkal):' out.log | tr -d '\r') \ <(grep -E '^(sorted|caught|unwound|import std over openkal):' host.log | tr -d '\r') - # ⭐⭐ AND THE SAME SOURCE FOR TWO MACHINES THIS ONE IS NOT. + # AND THE SAME SOURCE FOR TWO MACHINES THIS ONE IS NOT. # # The two steps above prove the source does not know which machine it is # for. These prove the BUILD does not need to be on it: one Linux host # produces a PE and a Mach-O, and the jobs below run them on the real # thing with nothing installed. # - # ⚠️ THE ARTEFACT IS THE ARGUMENT, WHICH IS WHY THOSE JOBS INSTALL NOTHING. + # THE ARTEFACT IS THE ARGUMENT, WHICH IS WHY THOSE JOBS INSTALL NOTHING. # Not mcpp, not a compiler, not a C runtime — the program carries its C # library, its C++ runtime and its unwinder, and what remains is the # operating system it was built for. A run that needed a redistributable @@ -325,13 +325,13 @@ jobs: echo "$t → $(file -b "$a")" cp "$a" "$RUNNER_TEMP/cross/" done - # ⚠️ The format is asserted here rather than left to the run jobs. A + # The format is asserted here rather than left to the run jobs. A # run that fails tells you the program did not work; this tells you # what was produced, and the two failures need different fixes. file "$RUNNER_TEMP/cross/openkal-same-source.exe" | grep -q 'PE32+ executable' file "$RUNNER_TEMP/cross/openkal-same-source" | grep -q 'Mach-O 64-bit arm64' - # ⭐ AND A TRANSLATION UNIT THAT INCLUDES A STANDARD HEADER, FOR THE SAME TWO. + # AND A TRANSLATION UNIT THAT INCLUDES A STANDARD HEADER, FOR THE SAME TWO. # # `same-source` imports std, and the std module is compiled with this # package's own flags, so it cannot see what a consumer's translation unit @@ -359,7 +359,7 @@ jobs: if-no-files-found: error # --------------------------------------------------------------------------- - # ⭐⭐ THE ACCEPTANCE CRITERION FOR PORTABILITY OF THE ARTEFACT. + # THE ACCEPTANCE CRITERION FOR PORTABILITY OF THE ARTEFACT. # # A cross build that produces a well-formed file proves the compiler was told # the right target. It does not prove the program runs, and every difference @@ -367,7 +367,7 @@ jobs: # thread-local, the unwinder's search for its own tables, the personality # routine — links successfully and fails at run time. # - # ⚠️ These jobs deliberately have NO toolchain steps. If one is ever added + # These jobs deliberately have NO toolchain steps. If one is ever added # because "the program needs it", that is the finding, not the fix. run-on-windows: name: the artefact built on Linux runs on Windows @@ -386,7 +386,7 @@ jobs: ./art/openkal-same-source.exe 2>&1 | tee out.log grep -q 'sorted: 2 4 7' out.log grep -q 'caught: 42' out.log - # ⭐ The line a link cannot fake: a destructor ran during the unwind, + # The line a link cannot fake: a destructor ran during the unwind, # so libunwind found `.eh_frame` by reading the image rather than by # asking the operating system to enumerate modules. grep -q 'unwound: true' out.log @@ -403,14 +403,14 @@ jobs: - name: It runs, and it unwinds run: | set -euo pipefail - # ⚠️ The executable bit does not survive an artefact upload. + # The executable bit does not survive an artefact upload. chmod +x art/openkal-same-source - # ⚠️ AND THE SIGNATURE DOES. arm64 macOS refuses an unsigned image, so + # AND THE SIGNATURE DOES. arm64 macOS refuses an unsigned image, so # this is asserted before the run: a failure here is "the linker did # not ad-hoc sign it", which is a different repair from "the program # crashed". codesign -dv art/openkal-same-source 2>&1 | grep -q 'adhoc\|Signature' - # ⚠️ A CRASH IS DIAGNOSED HERE RATHER THAN GUESSED AT LATER. This is + # A CRASH IS DIAGNOSED HERE RATHER THAN GUESSED AT LATER. This is # the first time an artefact of this stack has run on this system, and # the interesting failures — the entry point's assumptions about what # the kernel hands it, the thread pointer, the two borrowed names — @@ -418,18 +418,18 @@ jobs: # One CI cycle that prints a backtrace is worth several that do not. if ! ./art/openkal-same-source > out.log 2>&1; then echo "--- how far the loader got ---" - # ⚠️ To a file, then read. Piping into `tail` interleaves dyld's + # To a file, then read. Piping into `tail` interleaves dyld's # output with the shell's own report of the signal, and the last # lines — the ones that say which initializer was running — are the # ones that get lost. DYLD_PRINT_INITIALIZERS=1 ./art/openkal-same-source > dyld.log 2>&1 || true tail -40 dyld.log echo "--- it did not run; what the debugger saw ---" - # ⭐ `lr` IS THE DATUM. A jump to address 0 leaves no frame to + # `lr` IS THE DATUM. A jump to address 0 leaves no frame to # unwind, so `bt` says only "frame #0: 0x0" — which is the symptom # restated. The link register still holds the return address of # whoever made that call, and `image lookup` turns it into a name. - # ⚠️ `-k` AND NOT `-o`. In `--batch` lldb abandons the remaining + # `-k` AND NOT `-o`. In `--batch` lldb abandons the remaining # `-o` commands after the first one that errors, and reading # register state at a PC of 0 errors — so the three commands that # would have said something never ran. `-k` is the list lldb @@ -454,7 +454,7 @@ jobs: grep -q 'import std over openkal: ok' out.log # --------------------------------------------------------------------------- - # ⭐⭐ THE HOST DIMENSION — THE HALF OF THE CLAIM THE JOBS ABOVE DO NOT TOUCH. + # THE HOST DIMENSION — THE HALF OF THE CLAIM THE JOBS ABOVE DO NOT TOUCH. # # Everything above builds on Linux. That establishes "one host reaches every # target" and leaves open the thing an N×N matrix would otherwise have to @@ -462,7 +462,7 @@ jobs: # — the target side is a set of packages and the compiler is a retargetable # clang, so N hosts × N targets collapses to N implementations plus one tool. # - # ⚠️ THAT IS A CLAIM, AND CLAIMS OF THIS SHAPE HAVE BEEN WRONG HERE BEFORE: + # THAT IS A CLAIM, AND CLAIMS OF THIS SHAPE HAVE BEEN WRONG HERE BEFORE: # the Linux host needed four separate repairs before it reached PE, and every # one of them was invisible until a build was actually run. Two more hosts # cost two jobs; asserting the collapse without running them costs a paragraph @@ -510,7 +510,7 @@ jobs: - name: Install mcpp run: bash tools/install-mcpp.sh - # ⭐ THE ENGINE EVERY STEP BELOW WILL USE, COMPARED AGAINST THE ONE BUILT. + # THE ENGINE EVERY STEP BELOW WILL USE, COMPARED AGAINST THE ONE BUILT. # # The step above appends a directory to GITHUB_PATH, which governs the # steps that follow it, so that step cannot observe its own effect. Whether @@ -534,7 +534,7 @@ jobs: fi echo " every step below runs $on_path, built from $MCPP_SOURCE_REF" - # ⭐ THE SAME ENGINE AND THE SAME STACK AS THE LINUX JOB, FROM A DIFFERENT + # THE SAME ENGINE AND THE SAME STACK AS THE LINUX JOB, FROM A DIFFERENT # HOST. This job had neither: it installed the released engine and # resolved this ecosystem from the index, so a change spanning these # repositories was validated on one host of three and reported as @@ -542,7 +542,7 @@ jobs: - name: Select the toolchain run: | set -euo pipefail - # ⚠️ INSTALL, THEN SELECT. `toolchain default` names a toolchain and + # INSTALL, THEN SELECT. `toolchain default` names a toolchain and # does not fetch one, so selecting an absent payload fails with # `llvm@22.1.8 is not installed` — measured on both rows of this job. mcpp toolchain install llvm 22.1.8 @@ -563,9 +563,9 @@ jobs: echo "$t → $(file -b "$a" 2>/dev/null || echo built)" done - # ⭐ And the one that is this machine, run rather than inspected — the same + # And the one that is this machine, run rather than inspected — the same # criterion the Linux job holds itself to, applied from a different host. - # ⭐ AND A HOSTED C++ PROGRAM, WHICH IS WHERE THREADS AND FILES ARE. + # AND A HOSTED C++ PROGRAM, WHICH IS WHERE THREADS AND FILES ARE. # # `same-source` also runs on bare metal, so it cannot start a thread; # `examples/cxx` can, and on Windows a joined std::thread was an access @@ -583,7 +583,7 @@ jobs: grep -q 'ok: a detached thread runs and ends' out.log grep -q "ok: a string grows past the allocator's own mappings" out.log - # ⚠️ AND BUILT WITH --release, WHICH IS WHAT A USER SHIPS. Until + # AND BUILT WITH --release, WHICH IS WHAT A USER SHIPS. Until # openkal-macos 0.9.1 a release program faulted before `main' on macOS (a # returned register declared an input), and until openkal-windows 0.7.1 its # arguments were shortened on Windows (a loop became `wcslen'). The dev diff --git a/.gitignore b/.gitignore index b4f8ce20..95f64b1a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,13 +2,13 @@ target/ compile_commands.json mcpp.lock .cache/ -# ⚠️ THE ONE THIS REPOSITORY DID NOT HAVE, AND THE ONE THAT SLIPPED IN. +# THE ONE THIS REPOSITORY DID NOT HAVE, AND THE ONE THAT SLIPPED IN. # `.mcpp/` is where the build tool keeps a workspace's own state; every other # repository in this ecosystem ignores it and this one did not, so a # `.mcpp/.xlings.json` from an experiment was committed with the bare-metal # work and then travelled in the pull request. .mcpp/ -# ⚠️ One `.mcpp/` rule matches the directory at any depth, and it does not +# One `.mcpp/` rule matches the directory at any depth, and it does not # remove a file that is ALREADY TRACKED. This repository had two: one at the # root and one under `examples/import-std/`. The first cleanup found only the # root one, because the scan it used anchored the path at the beginning. diff --git a/README.md b/README.md index 07112b0b..6a7554e1 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ C library. ```toml [dependencies] -openkal-llvm-runtime = "0.7.0" +openkal-llvm-runtime = "0.10.0" ``` A C++ standard library is not portable in the way a program is. It is @@ -62,7 +62,7 @@ __locale:439: error: unknown rune table for this platform With it at `1`, none. -⚠️ **A claim that drifts from what the port provides fails neither the build nor +**A claim that drifts from what the port provides fails neither the build nor the link.** It produces a program that takes a path the environment cannot support, and reports nothing. `_LIBCPP_HAS_RANDOM_DEVICE` was `0` until openkal gained `openkal.random`; `_LIBCPP_HAS_TERMINAL` was `1` while every `isatty` @@ -94,7 +94,7 @@ only under it — LLVM's own runtimes build defines it for the same reason). objects, `ELF 64-bit LSB relocatable, UCB RISC-V`, with `__cxa_throw` and `__cxa_begin_catch` defined. -⚠️ `import std;` on such a target is still refused, and not by this package: +`import std;` on such a target is still refused, and not by this package: ``` error: `import std;` is not available on 'riscv64-none-elf' @@ -129,7 +129,7 @@ whether a hosted standard library is *present*. `examples/import-std` asserts the other half: `import std;` — the module, not the headers — with `std::ranges::sort` and `std::println`. -## ⚠️ The observation a build cannot make +## The observation a build cannot make The last two assertions are the package. Everything else here a runtime that was linked but never worked would also satisfy. @@ -170,7 +170,7 @@ reaches one of them by mistake still works. There is nothing to reach on the fourth: the C library is openkal-musl, the standard library and the unwinder are this package's, and beneath them is firmware whose whole interface is `ecall`. -⚠️ **And the artefacts are run on the real machines, not inspected.** Continuous +**And the artefacts are run on the real machines, not inspected.** Continuous integration builds all three hosted targets on Linux and executes each on the system it was built for; `mcpp`'s own `openkal-cross` workflow builds them from three hosts and runs all nine combinations. Every difference this package had to @@ -189,7 +189,7 @@ definitions — **links successfully and fails at run time**. The port is Apache-2.0. The vendored sources under `llvm/` are Apache-2.0 with LLVM exceptions; `llvm/LICENSE.TXT` is theirs. -⚠️ They are **almost** unchanged, and the exceptions are enumerated rather than +They are **almost** unchanged, and the exceptions are enumerated rather than described. `llvm/PATCHES.md` lists every one — five regions in four files, each between `// ─── openkal ─── BEGIN` and `// ─── openkal ─── END`, countable with diff --git a/examples/cxx/src/main.cpp b/examples/cxx/src/main.cpp index 9e3051a2..d758e58c 100644 --- a/examples/cxx/src/main.cpp +++ b/examples/cxx/src/main.cpp @@ -2,7 +2,7 @@ // settles whether the runtime is really there: an exception thrown across a // frame and caught. // -// ⭐ AND THE PARTS OF THE STANDARD LIBRARY WHOSE AVAILABILITY IS A STATEMENT +// AND THE PARTS OF THE STANDARD LIBRARY WHOSE AVAILABILITY IS A STATEMENT // ABOUT THE ENVIRONMENT BENEATH. `__config_site` declares // `_LIBCPP_HAS_FILESYSTEM 1` and `_LIBCPP_HAS_RANDOM_DEVICE 1` for a hosted // row; those declarations are this package's claim about openkal-musl, and a @@ -22,7 +22,7 @@ #include #include -// ⭐ THREE NAMES A PROGRAM ABOVE THIS STACK MAY USE, ASSERTED BY COMPILING. +// THREE NAMES A PROGRAM ABOVE THIS STACK MAY USE, ASSERTED BY COMPILING. // // musl's INTERNAL header overlay defines `hidden`, `weak` and `weak_alias` as // macros that mean something only to musl's own sources, and openkal-musl used @@ -72,7 +72,7 @@ int main() { // --- std::thread, which is the C++ face of openkal.task ----------------- // - // ⚠️ A THREAD THAT STARTS IS NOT A THREAD THAT IS JOINED. libc++ keeps the + // A THREAD THAT STARTS IS NOT A THREAD THAT IS JOINED. libc++ keeps the // pthread_t it was given, and musl declared that type `unsigned long` for // C++ --- thirty-two bits on Windows --- so the join read through half a // pointer and ended the program. Fixed in openkal-musl 0.13.2. @@ -84,7 +84,7 @@ int main() { check(joinable && written == 42 && !worker.joinable(), "a thread is started and joined"); } - // ⚠️ AND A DETACHED THREAD ENDS WITHOUT ENDING THE PROGRAM. musl released a + // AND A DETACHED THREAD ENDS WITHOUT ENDING THE PROGRAM. musl released a // detached thread's mapping from a 256-byte stack every exiting thread // shares, and openkal-musl's path for the calls that end the thread overran // it into the context table; on macOS the program stopped as the thread @@ -100,7 +100,7 @@ int main() { // --- the allocator, past the size musl maps on its own -------------------- // - // ⚠️ A STRING THAT GROWS PAST A MAPPING KEEPS WHAT IT HOLDS. musl obtains an + // A STRING THAT GROWS PAST A MAPPING KEEPS WHAT IT HOLDS. musl obtains an // allocation of 131,052 bytes or more as a mapping of its own and uses it to // the end of its last page; openkal-musl's mapping was only the length asked // for, and on Windows the rest of the page was the next heap block, so a @@ -143,14 +143,14 @@ int main() { check(fs::file_size(dir / "b.txt", ec) == 10 && !ec, "and the copy has the same size"); - // ⭐⭐ AND THE OPERATION openkal HAS NO ATOM FOR, CHECKED AS A REFUSAL. + // AND THE OPERATION openkal HAS NO ATOM FOR, CHECKED AS A REFUSAL. // // `kal_node_info` carries a boolean `writable` and not a mode word, so // openkal-musl refuses `chmod` rather than succeeding and reporting // something else afterwards --- and a refusal that arrives as a // `std::error_code` is what a C++ caller can act upon. // - // ⚠️ THIS IS THE HALF THAT WOULD BE OMITTED. A probe checking only that the + // THIS IS THE HALF THAT WOULD BE OMITTED. A probe checking only that the // supported operations work would pass just as well for a port that // silently accepted it, which is the outcome the report // (openkal-linux#13) described as "expected 0600, got 0777". @@ -158,20 +158,20 @@ int main() { fs::permissions(dir / "a.txt", fs::perms::owner_read, ec); check(static_cast(ec), "changing permission bits is refused, not ignored"); - // ⭐⭐ AND THE ONE THAT WAS A REFUSAL AND IS NOW AN OPERATION. + // AND THE ONE THAT WAS A REFUSAL AND IS NOW AN OPERATION. // // This block read `create_symlink ... check(ec)` --- a link was refused, // and the refusal was the assertion. openkal 0.9 added `kal_fs_link_create` // and `kal_fs_link_read`, openkal-musl 0.7 answers `symlinkat` and // `readlinkat` with them, and the refusal stopped arriving. // - // ⚠️ A TEST THAT ASSERTS A LIMITATION BECOMES FALSE WHEN THE LIMITATION IS + // A TEST THAT ASSERTS A LIMITATION BECOMES FALSE WHEN THE LIMITATION IS // LIFTED, AND IT FAILS RATHER THAN GOING QUIET. That is the good case and // it is why the assertion was written this way round: had it merely // tolerated both answers, the arrival of the operation would have been // invisible here, and this file is the only place in the ecosystem where a // C++ standard library exercises it. - // ⚠️ THE TARGET IS `a.txt' AND NOT `dir / "a.txt"'. A link's content is + // THE TARGET IS `a.txt' AND NOT `dir / "a.txt"'. A link's content is // resolved relative to the directory HOLDING THE LINK, not to the working // directory --- so the second spelling, which looks more careful, produces // `cxx-probe.d/cxx-probe.d/a.txt' and a dangling link. It was written that @@ -194,7 +194,7 @@ int main() { check(fs::file_size(dir / "link", ec) == 10 && !ec, "so the size read through it is the file's"); - // ⭐ AND THE TREE IS STILL WALKABLE. `remove_all` recurses, and a directory + // AND THE TREE IS STILL WALKABLE. `remove_all` recurses, and a directory // holding a link is the case where resolving during the walk removes the // wrong node or loops. fs::remove_all(dir, ec); @@ -205,7 +205,7 @@ int main() { { std::random_device rd; const unsigned a = rd(), b = rd(), c = rd(); - // ⚠️ THE CRITERION IS THAT THEY DIFFER, NOT THAT ANY ONE OF THEM IS + // THE CRITERION IS THAT THEY DIFFER, NOT THAT ANY ONE OF THEM IS // ANYTHING. A source stuck at a constant satisfies "a number was // produced" and is exactly what a port that forgot to fill the buffer // would produce. diff --git a/examples/same-source/build.mcpp b/examples/same-source/build.mcpp index 5d1e94ac..ba4344bc 100644 --- a/examples/same-source/build.mcpp +++ b/examples/same-source/build.mcpp @@ -1,20 +1,20 @@ import mcpp; -// ⚠️ THIS FILE STATES NOTHING, AND ITS EMPTINESS IS WHAT THE EXAMPLE IS ABOUT. +// THIS FILE STATES NOTHING, AND ITS EMPTINESS IS WHAT THE EXAMPLE IS ABOUT. // // Until 2026-08-23 it carried a linker script for the machine with no operating // system — where OpenSBI hands control over, how much stack, where the heap is // — behind a condition on the target. The condition was the honest part: those // are statements about a MACHINE and not about this program. // -// ⭐ Which is exactly why they do not belong here either. `openkal-opensbi` is +// Which is exactly why they do not belong here either. `openkal-opensbi` is // the package that knows that machine, and it supplies the map the same way it // supplies its `kal_*` definitions: through its own build program, reaching // every consumer's link line. A program adds nothing and gets a layout that // works, and the claim this directory makes — same source, different machine, // nothing edited — becomes true of the build files as well as of the source. // -// ⚠️ Measured while both copies existed, because a board fact reaches its +// Measured while both copies existed, because a board fact reaches its // consumers TRANSITIVELY and this example is a consumer: // // ld.lld: error: section .eh_frame file range overlaps with diff --git a/examples/same-source/mcpp.toml b/examples/same-source/mcpp.toml index bac58d0a..e334d838 100644 --- a/examples/same-source/mcpp.toml +++ b/examples/same-source/mcpp.toml @@ -2,7 +2,7 @@ name = "openkal-same-source" version = "0.1.0" -# ⚠️ NO `[build] target`, AND THAT IS THE POINT OF THE DIRECTORY. +# NO `[build] target`, AND THAT IS THE POINT OF THE DIRECTORY. # # The same `src/main.cpp` is built two ways from here: # @@ -17,7 +17,7 @@ version = "0.1.0" # is the emulator with firmware, because `-bios default` is what supplies the # SBI this program's openkal implementation calls. # -# ⚠️ THE EMULATOR IS NAMED WITHOUT A PATH AND MUST STAY THAT WAY. +# THE EMULATOR IS NAMED WITHOUT A PATH AND MUST STAY THAT WAY. # # Running this locally means pointing the name at an installed emulator, and the # obvious way to do that is to edit this line. Doing so and committing puts one @@ -43,7 +43,7 @@ openkal-llvm-runtime = { path = "../.." } # here at all — it follows from the one dependency above, and mcpp resolves it # after the dependency graph exists. # -# ⚠️ This file used to name `openkal-llvm@22.1.8`, a toolchain family that +# This file used to name `openkal-llvm@22.1.8`, a toolchain family that # downloaded nothing `llvm` does not: the same payload, the same clang, the same # version. What differed was what mcpp then believed about the target side. That # belief now comes from what the packages declare, so the family name carries diff --git a/examples/same-source/src/main.cpp b/examples/same-source/src/main.cpp index ffd75e0b..c02d5ebe 100644 --- a/examples/same-source/src/main.cpp +++ b/examples/same-source/src/main.cpp @@ -1,6 +1,6 @@ // `import std;` on a machine with no operating system. // -// ⭐⭐ ONE SOURCE, TWO MACHINES, NOTHING EDITED BETWEEN THEM. +// ONE SOURCE, TWO MACHINES, NOTHING EDITED BETWEEN THEM. // // mcpp run — this machine, over openkal-linux // mcpp run --target riscv64-none-elf — riscv64, over OpenSBI, no OS @@ -9,7 +9,7 @@ // about building above openkal, written as something a reader can run rather // than something they have to believe. // -// ⭐ AND THE SECOND COMMAND IS THE ACCEPTANCE CRITERION, BECAUSE IT CANNOT GO +// AND THE SECOND COMMAND IS THE ACCEPTANCE CRITERION, BECAUSE IT CANNOT GO // GREEN BY ACCIDENT. // // A hosted target has a C library, a C++ runtime and an unwinder already @@ -60,7 +60,7 @@ int main() { std::println("unwound: {}", unwound); const bool ok = v[0] == 2 && v[2] == 7 && caught == 42 && unwound; - // ⚠️ The outcome is an ARGUMENT and not the format string: a format string + // The outcome is an ARGUMENT and not the format string: a format string // is consumed by a consteval constructor, and a value computed at run time // cannot be one. The compiler says so, which is the whole reason it is // written this way. diff --git a/mcpp.toml b/mcpp.toml index 6f458fda..e3def1da 100644 --- a/mcpp.toml +++ b/mcpp.toml @@ -1,7 +1,7 @@ [package] namespace = "mcpplibs" name = "openkal-llvm-runtime" -version = "0.9.7" +version = "0.10.0" description = "LLVM's C++ runtime libraries — libc++, libc++abi and libunwind — configured for openkal-musl rather than for a host C library." license = "Apache-2.0" authors = ["mcpplibs"] @@ -29,7 +29,7 @@ standard = "c++23" provides = [ "hosted-standard-library", "mcpp:c++-abi=libc++", - # ⚠️ THE LARGER HALF OF THIS PACKAGE, AND IT IS NOT A C++ THING. + # THE LARGER HALF OF THIS PACKAGE, AND IT IS NOT A C++ THING. # # Of the 729 objects built here, 498 are compiler-rt's builtins and 21 are # libunwind's. Those are what a C PROGRAM needs — `__udivti3` and its @@ -51,7 +51,7 @@ provides = [ # 2026.8.24.1 exit 2 REFUSED # 2026.8.24.3 exit 0 resolved # -# ⚠️ THE TWO ZEROES AT 2026.8.19.4 ARE NOT THE SAME KIND OF SUCCESS AS THE ONE +# THE TWO ZEROES AT 2026.8.19.4 ARE NOT THE SAME KIND OF SUCCESS AS THE ONE # AT 2026.8.24.3. That tool predates the layer vocabulary and ignores the whole # array, so it neither refuses the declaration nor reads it. A CI pinned there # would report green over a manifest whose central claim was never examined, @@ -85,7 +85,7 @@ requires = ["mcpp:compiler=llvm"] # knows nothing about, and its configuration is in llvm-generated/ rather than # beside the compiler. std-module = "llvm-generated/std.cppm" -# ⚠️ AND THE COMPAT MODULE, BECAUSE IT IS THE SAME LIBRARY. +# AND THE COMPAT MODULE, BECAUSE IT IS THE SAME LIBRARY. # # `std.compat` re-exports the C library's names into the global namespace over # the SAME libc++. Naming only the first leaves the second resolving to the @@ -96,7 +96,7 @@ std-module = "llvm-generated/std.cppm" # …/share/libc++/v1/std.compat.cppm → __config:13 '__config_site' not found std-compat-module = "llvm-generated/std.compat.cppm" std-module-flags = [ - # ⚠️ --no-default-config, and it is not tidiness. + # --no-default-config, and it is not tidiness. # # The toolchain payload ships a clang++.cfg that names a host C library's # headers unconditionally. For an ordinary translation unit that is right and @@ -104,7 +104,7 @@ std-module-flags = [ # package first, and the module fails compiling with names that # library expects the host compiler to have supplied. Measured. "--no-default-config", - # ⚠️ AND THE RUNTIME LIBRARY BACK, BECAUSE `--no-default-config` TOOK IT AND + # AND THE RUNTIME LIBRARY BACK, BECAUSE `--no-default-config` TOOK IT AND # IT DECIDES TARGET FEATURES. # # The flag above exists to keep the payload's `clang++.cfg` from putting a @@ -117,7 +117,7 @@ std-module-flags = [ # +outline-atomics +v8a # … --rtlib=libgcc / --rtlib=platform (as the first line) # - # ⭐ ONLY compiler-rt ENABLES IT. `outline-atomics` needs `__aarch64_*` + # ONLY compiler-rt ENABLES IT. `outline-atomics` needs `__aarch64_*` # helpers at run time and clang turns the feature on exactly when the runtime # library it was told about supplies them. # @@ -127,7 +127,7 @@ std-module-flags = [ # error: precompiled file 'std.pcm' was compiled with the target feature # '-fmv' but the current translation unit is not # - # ⚠️ x86_64 HAS NO SUCH FEATURE, so the two sides agreed there and the defect + # x86_64 HAS NO SUCH FEATURE, so the two sides agreed there and the defect # was invisible until a second architecture was built. Measured: on # `x86_64-…-musl` both sides list nothing at all, with or without this flag. # @@ -155,7 +155,7 @@ std-module-flags = [ # criterion the whole package exists to satisfy is the one openkal keeps # returning to --- whether an implementation has been configured FOR this # target, not whether its headers can be found. -# ⭐⭐ THE 125 OUTLINE-ATOMICS HELPERS ARE SUPPLIED BY THIS PACKAGE, BECAUSE +# THE 125 OUTLINE-ATOMICS HELPERS ARE SUPPLIED BY THIS PACKAGE, BECAUSE # THIS PACKAGE IS THAT compiler-rt. # # `--rtlib=compiler-rt` makes clang enable `+outline-atomics` on aarch64, and it @@ -166,7 +166,7 @@ std-module-flags = [ # ld.lld: error: undefined symbol: __aarch64_swp4_acq # ld.lld: error: undefined symbol: __aarch64_cas8_acq_rel # -# ⚠️ The references came from `openkal-linux/src/memory.o` and +# The references came from `openkal-linux/src/memory.o` and # `openkal-musl/port/src/okm_fd.o` --- two packages that know nothing about any # of this and merely used an atomic operation. What was missing was something # this runtime is supposed to carry. @@ -178,24 +178,24 @@ std-module-flags = [ # that DECLARES THE MACROS ITSELF AND THEN INCLUDES THE SHARED BODY. The body is # upstream's, unmodified, and stays where it is. # -# ⭐ That moves the macros from the COMMAND LINE into the FILE, rather than +# That moves the macros from the COMMAND LINE into the FILE, rather than # copying the implementation 125 times. [target.'cfg(arch = "aarch64")'.build] sources = [ "llvm-generated/outline-atomics/*.S", - # ⚠️ And the file that defines the probe. Every one of the 125 helpers reads + # And the file that defines the probe. Every one of the 125 helpers reads # `__aarch64_have_lse_atomics`, which decides at run time between the LSE # instructions and a load/store-exclusive loop. Without it: # # ld.lld: error: undefined hidden symbol: __aarch64_have_lse_atomics # - # ⭐ It is in `cpu_model/aarch64.c`, and the `[build]` section's glob is + # It is in `cpu_model/aarch64.c`, and the `[build]` section's glob is # `llvm/compiler-rt/lib/builtins/*.c` --- WHICH DOES NOT DESCEND INTO # SUBDIRECTORIES, so that file had never been compiled. Upstream lists it in # `aarch64_SOURCES`, in the same set as this section. "llvm/compiler-rt/lib/builtins/cpu_model/aarch64.c", ] -# ⚠️ FUNCTION MULTI-VERSIONING IS TURNED OFF, AND THAT IS NOT OPTIONAL TIDYING: +# FUNCTION MULTI-VERSIONING IS TURNED OFF, AND THAT IS NOT OPTIONAL TIDYING: # that half of the file does not compile on a macOS host at all. # # The second half of `cpu_model/aarch64.c` implements function multi-versioning, @@ -204,11 +204,11 @@ sources = [ # aarch64/fmv/apple.inc:1:10: fatal error: 'TargetConditionals.h' file not found # # and this package's `include_dirs` deliberately contains no path that comes -# from the machine --- see ⭐⭐ NOTHING FROM THE MACHINE in that section. -# ⚠️ It compiles on this Linux machine and fails only on the macOS row of +# from the machine --- see NOTHING FROM THE MACHINE in that section. +# It compiles on this Linux machine and fails only on the macOS row of # continuous integration, which is the shape one host cannot see. # -# ⭐ And this package does NOT need multi-versioning: what it wants is +# And this package does NOT need multi-versioning: what it wants is # `__aarch64_have_lse_atomics`, which is defined outside # `#if !defined(DISABLE_AARCH64_FMV)`. Upstream has the same switch # (`COMPILER_RT_DISABLE_AARCH64_FMV`), so this goes through the door upstream @@ -216,11 +216,11 @@ sources = [ cflags = ["-DDISABLE_AARCH64_FMV=1"] [dependencies] -openkal-musl = "0.13.5" +openkal-musl = "0.14.0" [build] -# ⚠️ WHAT IS VENDORED AND WHAT IS NOT. +# WHAT IS VENDORED AND WHAT IS NOT. # # Four subtrees of llvm-project at the revision the toolchain itself was built # from (llvm/UPSTREAM-REV). The compiler and the linker are NOT vendored and are @@ -243,7 +243,7 @@ sources = [ # dynamic casts, and the terminate handler. "llvm/libcxxabi/src/*.cpp", "!llvm/libcxxabi/src/cxa_noexception.cpp", - # ⭐⭐ THE SAME CODE TWICE, AND IT SAYS SO ITSELF. `libcxx/src/new.cpp`: + # THE SAME CODE TWICE, AND IT SAYS SO ITSELF. `libcxx/src/new.cpp`: # # "The code below is copied as-is into libc++abi's # libcxxabi/src/stdlib_new_delete.cpp file. The version in this file is @@ -253,7 +253,7 @@ sources = [ # This package builds them into ONE artefact, so both definitions arrive on # the same link line — every `operator new` and `operator delete`, twice. # - # ⚠️ AND IT WAS INVISIBLE ON THREE TARGETS OUT OF FOUR. Both copies are weak, + # AND IT WAS INVISIBLE ON THREE TARGETS OUT OF FOUR. Both copies are weak, # and on ELF and Mach-O a duplicate weak definition is what weak MEANS: the # linker picks one and says nothing. COFF's weak externals carry the comdat # they default to, so the same two definitions became 30 errors: @@ -270,7 +270,7 @@ sources = [ # The standard library. "llvm/libcxx/src/*.cpp", - # ⭐ AND `random.cpp` IS BUILT, BECAUSE openkal NOW HAS A SOURCE OF ENTROPY. + # AND `random.cpp` IS BUILT, BECAUSE openkal NOW HAS A SOURCE OF ENTROPY. # # It used to be excluded, paired with `_LIBCPP_HAS_RANDOM_DEVICE 0`, and the # note here said openkal had no source and this port would not invent one. @@ -279,18 +279,18 @@ sources = [ # `/dev/urandom` --- a capability-oriented filesystem hands over roots rather # than the whole namespace. # - # ⚠️ Neither bypassing the interface layer nor inventing entropy was + # Neither bypassing the interface layer nor inventing entropy was # acceptable, so the layer gained an interface: `openkal.random`. The chain # now runs entirely inside it: # # std::random_device → getentropy → getrandom → kal_random_fill → backend # - # ⚠️ THE BACKEND IS SELECTED EXPLICITLY IN `__config_site`. libc++ falls back + # THE BACKEND IS SELECTED EXPLICITLY IN `__config_site`. libc++ falls back # to `_LIBCPP_USING_DEV_RANDOM` for anything it does not recognise, and that # one opens `/dev/urandom` by absolute path. `_LIBCPP_USING_GETENTROPY` needs # no descriptor and no path. # - # ⚠️ THE FREESTANDING CONFIGURATION KEEPS THE SWITCH AT 0, AND WHAT THAT + # THE FREESTANDING CONFIGURATION KEEPS THE SWITCH AT 0, AND WHAT THAT # MEANS IS NOT WHAT AN EARLIER VERSION OF THIS NOTE SAID. # # It said clause 6.1 would report the absence at link time. It does not: @@ -303,7 +303,7 @@ sources = [ # it is written, beside `_LIBCPP_HAS_FILESYSTEM 0` and for the same reason. # That is the better diagnosis of the two, and it is the one that happens. # - # ⚠️ It is also a STATIC answer to a fact that varies. A board with a + # It is also a STATIC answer to a fact that varies. A board with a # hardware source could have a backend that provides `openkal.random`, and # this switch would still be 0. Deciding it per backend needs a signal this # package does not have --- the configuration is generated once, before any @@ -322,7 +322,7 @@ sources = [ # build if it reaches a that is not its own. The generated # configuration precedes both, because every header of the library includes it. include_dirs = [ - # ⭐ THE OVERLAY, FIRST. Every difference from vendored libc++ lives in one + # THE OVERLAY, FIRST. Every difference from vendored libc++ lives in one # directory that shadows it, exactly as openkal-musl's `port/` shadows # vendored musl — so the vendored tree stays byte-identical to upstream and # `git diff` against a fresh checkout of it is empty. port/include's own @@ -337,7 +337,7 @@ include_dirs = [ "llvm/libunwind/src", # libc++ reuses llvm-libc's floating-point utilities; the two are one project # and the headers are shared rather than copied. - # ⚠️ `llvm/libc' ONLY. Adding `llvm/libc/shared' as well puts llvm-libc's own + # `llvm/libc' ONLY. Adding `llvm/libc/shared' as well puts llvm-libc's own # ahead of the C library's, and llvm-libc's overlay-mode header then # includes itself instead of musl --- so `math_errhandling', which musl # defines unconditionally, is undeclared. The includes are written @@ -345,7 +345,7 @@ include_dirs = [ "llvm/libc", ] -# ⚠️ THE CONFIGURATION IS PER TARGET, AND THAT IS WHAT `llvm-generated' IS FOR. +# THE CONFIGURATION IS PER TARGET, AND THAT IS WHAT `llvm-generated' IS FOR. # # A hosted target lets libc++ work out for itself that the thread API is # pthread's, because it recognises the system. A target with no operating system @@ -355,7 +355,7 @@ include_dirs = [ # So the freestanding configuration states it, and states the two facilities # that environment does not have. Nothing else differs: the C library beneath is # the same one. -# ⚠️ THE COMPILER'S OWN RUNTIME, ON EVERY TARGET WHOSE DRIVER SELECTION WE +# THE COMPILER'S OWN RUNTIME, ON EVERY TARGET WHOSE DRIVER SELECTION WE # REPLACED — WHICH IS EVERY CROSS, AND NOT THE HOST. # # `__udivti3` and its relatives are what the compiler decided to call; no source @@ -363,7 +363,7 @@ include_dirs = [ # `libclang_rt.builtins`, which the driver adds. A cross does not — the target # side comes from this graph — so this package has to supply them. # -# ⚠️ AND IT MUST NOT SUPPLY THEM NATIVELY. Measured 2026-08-23: adding them to +# AND IT MUST NOT SUPPLY THEM NATIVELY. Measured 2026-08-23: adding them to # the package-wide source list broke the HOST build with duplicate definitions # of `__muloti4` and its neighbours, against the archive the driver had already # linked. The fact is "the driver's runtime selection was replaced", and the @@ -371,14 +371,14 @@ include_dirs = [ # repository's builds" — stated per format rather than once, which is the cost # of the manifest not being able to say it directly. [target.'cfg(os = "macos")'.build] -# ⚠️ AND compiler-rt's emutls, WHICH THE EXCLUSION LIST OTHERWISE DROPS. +# AND compiler-rt's emutls, WHICH THE EXCLUSION LIST OTHERWISE DROPS. # # The package-wide exclusions leave `emutls.c` out because it needs an # environment — pthread keys and an allocator. This target has both, from # openkal-musl, and `-femulated-tls` below makes every thread-local access call # into it. Measured: without it, `undefined symbol: __emutls_get_address`. # -# ⭐ EMULATED THREAD-LOCAL STORAGE, WHICH THIS OBJECT FORMAT NEEDS AND openkal +# EMULATED THREAD-LOCAL STORAGE, WHICH THIS OBJECT FORMAT NEEDS AND openkal # ALREADY VALIDATED. # # Mach-O reaches a `thread_local` through a descriptor the dynamic loader @@ -388,20 +388,20 @@ include_dirs = [ # an ordinary function call resolved by compiler-rt against a key the C library # owns. # -# ⚠️ Measured 2026-08-23: `undefined symbol: _tlv_bootstrap`, after everything +# Measured 2026-08-23: `undefined symbol: _tlv_bootstrap`, after everything # else on this target linked. And the mechanism is not new — the ecosystem # design's experiment A validated exactly this route (32 assertions, 0 -# failures); ⚠️ that experiment also recorded that the flag is LLVM-only, which +# failures); that experiment also recorded that the flag is LLVM-only, which # is why it can be stated here at all: this target's compiler is clang by # construction. -# ⚠️ AND THE FLAG ITSELF IS NO LONGER STATED HERE. It was +# AND THE FLAG ITSELF IS NO LONGER STATED HERE. It was # `cxxflags = ["-femulated-tls"]`, which reached this package's objects and # stopped — the consumer's own `thread_local` would have been compiled the other # way, and the two would have linked. mcpp derives it now for every unit in the # graph, from the fact this package's `std-module` establishes # (`targetCxxRuntime`) plus the target's object format. The paragraphs above are # kept because they are the measurement that determined the rule. -# ⚠️ libc++ carries its OWN copy of the 128-bit multiply-overflow helper, for +# libc++ carries its OWN copy of the 128-bit multiply-overflow helper, for # platforms where compiler-rt is not linked. Supplying compiler-rt's makes them # a pair: `duplicate symbol: __muloti4`. The freestanding block never hit it # because it excludes the whole filesystem directory for a different reason. @@ -411,7 +411,7 @@ sources = [ "llvm/compiler-rt/lib/builtins/emutls.c", "!llvm/compiler-rt/lib/builtins/atomic*.c", "!llvm/compiler-rt/lib/builtins/clear_cache.c", - # ⚠️ `emutls.c` IS NOT EXCLUDED HERE, AND THE ORDER DOES NOT DECIDE THAT — + # `emutls.c` IS NOT EXCLUDED HERE, AND THE ORDER DOES NOT DECIDE THAT — # AN EXCLUSION ANYWHERE IN A LIST BEATS AN INCLUSION ANYWHERE ELSE IN IT. # Measured: adding the include above while leaving the exclusion below it # produced no object and `undefined symbol: __emutls_get_address`. So the @@ -421,7 +421,7 @@ sources = [ "!llvm/compiler-rt/lib/builtins/gcc_personality_v0.c", "!llvm/compiler-rt/lib/builtins/crtbegin.c", "!llvm/compiler-rt/lib/builtins/crtend.c", - # ⚠️ Darwin's own: it asks Apple's SDK which OS version is running, so that a + # Darwin's own: it asks Apple's SDK which OS version is running, so that a # weakly-linked symbol can be probed. openkal is not that OS, and nothing here # weak-links against it. (`apple_versioning.c` is already outside the # architecture's list; this one is inside it and still Darwin's.) @@ -430,7 +430,7 @@ sources = [ "!llvm/compiler-rt/lib/builtins/*xc3.c", ] -# ⭐ THE EXCEPTION MECHANISM FOLLOWS THE UNWINDER WE SHIP, NOT THE PLATFORM'S +# THE EXCEPTION MECHANISM FOLLOWS THE UNWINDER WE SHIP, NOT THE PLATFORM'S # DEFAULT. # # clang targeting this triple defines `__SEH__`, because that is what mingw uses @@ -440,19 +440,19 @@ sources = [ # unwind.h:22 → /usr/x86_64-w64-mingw32/include/windows.h # → crtdefs.h → corecrt.h:98 typedef redefinition # -# ⚠️ That is the same class of failure as every other one on this target: a +# That is the same class of failure as every other one on this target: a # vendor SDK reached because a platform macro was read as a statement about what # is underneath. Here the answer is a flag rather than an overlay, because the # question is genuinely a build decision: this program's unwinder is the one in # this package, and it reads DWARF tables — the same ones it reads on ELF and on # Mach-O. # -# ⚠️ IT HAS TO REACH EVERY TRANSLATION UNIT IN THE GRAPH, for the reason +# IT HAS TO REACH EVERY TRANSLATION UNIT IN THE GRAPH, for the reason # docs/13 records about `-fno-exceptions`: the model is recorded in a BMI, and a # dependency compiled one way cannot be imported by a unit compiled the other. # Stated here it covers this package; a consumer states it too, and mcpp # deciding it from the capability is the shape that would remove the repetition. -# ⭐⭐ THE COMPILER'S OWN RUNTIME, ON THE ONE TARGET THAT WAS STILL BORROWING +# THE COMPILER'S OWN RUNTIME, ON THE ONE TARGET THAT WAS STILL BORROWING # ANOTHER COMPILER'S. # # macOS, Windows and bare metal all take the routines a compiler emits calls to @@ -460,7 +460,7 @@ sources = [ # which is in this package. Linux did not: `openkal-musl` named `-lgcc`, and on # a Linux host that resolves against a payload that happens to be installed. # -# ⚠️ Measured 2026-08-23, a macOS host cross-building for `x86_64-linux-gnu` +# Measured 2026-08-23, a macOS host cross-building for `x86_64-linux-gnu` # over openkal: # # ld.lld: error: unable to find library -lgcc @@ -469,7 +469,7 @@ sources = [ # there should be: the compiler is clang and its runtime is compiler-rt. The # flag only ever worked because the host and the target agreed. # -# ⚠️ Building these alongside `-lgcc` is not a duplicate-definition hazard. An +# Building these alongside `-lgcc` is not a duplicate-definition hazard. An # archive contributes only what is still undefined, so if ours are linked first # the archive is never consulted for them. [target.'cfg(os = "linux")'.build] @@ -483,14 +483,14 @@ sources = [ "!llvm/compiler-rt/lib/builtins/gcc_personality_v0.c", "!llvm/compiler-rt/lib/builtins/crtbegin.c", "!llvm/compiler-rt/lib/builtins/crtend.c", - # ⚠️ Darwin's own; it asks Apple's SDK which OS version is running. + # Darwin's own; it asks Apple's SDK which OS version is running. "!llvm/compiler-rt/lib/builtins/os_version_check.c", - # ⚠️ libc++ carries its OWN copy of the 128-bit multiply-overflow helper. + # libc++ carries its OWN copy of the 128-bit multiply-overflow helper. # Supplying compiler-rt's makes them a pair: `duplicate symbol: __muloti4`. "!llvm/libcxx/src/filesystem/int128_builtins.cpp", ] -# ⚠️ THE x87 ROUTINES ARE AN ARCHITECTURE PROPERTY, AND THE BLOCK ABOVE SORTS +# THE x87 ROUTINES ARE AN ARCHITECTURE PROPERTY, AND THE BLOCK ABOVE SORTS # BY OPERATING SYSTEM. # # `*xf*.c` and `*xc3.c` are the 80-bit `long double` routines. On x86 that type @@ -504,7 +504,7 @@ sources = [ # truncxfhf2.c:13:36: error: unknown type name 'xf_float'; # did you mean 'tf_float'? # -# ⭐ Both blocks were right about their own case and both sorted on the wrong +# Both blocks were right about their own case and both sorted on the wrong # axis: `os = "macos"` and `os = "none"` happen to imply a non-x87 architecture # today, so the exclusion looked like an OS property. It is not. Sorting on the # axis the fact actually lives on is what makes a second architecture work @@ -516,14 +516,14 @@ sources = [ ] [target.'cfg(windows)'.build] -# ⚠️ `-fdwarf-exceptions` WAS HERE AND IS NOT ANY MORE, for the reason the macOS +# `-fdwarf-exceptions` WAS HERE AND IS NOT ANY MORE, for the reason the macOS # block above records: it decides what a `throw` COMPILES INTO, so it is true of # the graph rather than of this package. mcpp derives it; see # `graph_runtime_compile_flags`. sources = [ "!llvm/libcxx/src/filesystem/int128_builtins.cpp", "llvm/compiler-rt/lib/builtins/*.c", - # ⭐ EMULATED TLS, THE THIRD FORMAT TO NEED IT AND FOR THE SAME REASON. + # EMULATED TLS, THE THIRD FORMAT TO NEED IT AND FOR THE SAME REASON. # # Mach-O reaches a `thread_local` through `_tlv_bootstrap` and PE through # `_tls_index`; both are bootstrapped by a DYNAMIC LOADER, and a self-contained @@ -536,7 +536,7 @@ sources = [ # block found the same wall at `_tlv_bootstrap`, which is why this line is a # copy of that one rather than a new idea. "llvm/compiler-rt/lib/builtins/emutls.c", - # ⭐ THE STACK PROBE, AND IT IS `.S` RATHER THAN `.c` — WHICH IS WHY THE GLOB + # THE STACK PROBE, AND IT IS `.S` RATHER THAN `.c` — WHICH IS WHY THE GLOB # ABOVE MISSES IT. # # The compiler emits a call to `___chkstk_ms` before a frame large enough to @@ -544,19 +544,19 @@ sources = [ # runtime rather than of the C library. compiler-rt has it, in the # architecture's own directory: `x86_64/chkstk.S`. # - # ⚠️ Measured 2026-08-22, after `-lgcc` came off `openkal-musl`'s link line for + # Measured 2026-08-22, after `-lgcc` came off `openkal-musl`'s link line for # this format — that archive is GCC's, and it had been quietly supplying this # to a link whose compiler is clang: # # ld.lld: error: undefined symbol: ___chkstk_ms # - # ⚠️ ONE FILE FROM THAT DIRECTORY AND NOT THE DIRECTORY. `x86_64/` also holds + # ONE FILE FROM THAT DIRECTORY AND NOT THE DIRECTORY. `x86_64/` also holds # `floatdidf.c` and its neighbours, which the generic list above already # supplies; taking the whole directory would define each of them twice. "llvm/compiler-rt/lib/builtins/x86_64/chkstk.S", "!llvm/compiler-rt/lib/builtins/atomic*.c", "!llvm/compiler-rt/lib/builtins/clear_cache.c", - # ⚠️ AND THE EXCLUSION IS DELETED RATHER THAN LEFT BELOW THE INCLUSION — an + # AND THE EXCLUSION IS DELETED RATHER THAN LEFT BELOW THE INCLUSION — an # exclusion anywhere in a list beats an inclusion anywhere else in it, which # the macOS block records having measured (no object, and # `undefined symbol: __emutls_get_address`). @@ -565,12 +565,12 @@ sources = [ "!llvm/compiler-rt/lib/builtins/gcc_personality_v0.c", "!llvm/compiler-rt/lib/builtins/crtbegin.c", "!llvm/compiler-rt/lib/builtins/crtend.c", - # ⚠️ Darwin's own: it asks Apple's SDK which OS version is running, so that a + # Darwin's own: it asks Apple's SDK which OS version is running, so that a # weakly-linked symbol can be probed. openkal is not that OS, and nothing here # weak-links against it. (`apple_versioning.c` is already outside the # architecture's list; this one is inside it and still Darwin's.) "!llvm/compiler-rt/lib/builtins/os_version_check.c", - # ⚠️ THE TWO EXCLUSIONS THAT WERE HERE WERE COPIED FROM THE macOS BLOCK, AND + # THE TWO EXCLUSIONS THAT WERE HERE WERE COPIED FROM THE macOS BLOCK, AND # THE FACT THEY REST ON IS NOT TRUE OF THIS TARGET. # # `*xf*.c` and `*xc3.c` are the x87 80-bit `long double` routines. On Apple's @@ -578,7 +578,7 @@ sources = [ # is dead weight — which is why that block excludes them. On this target # `long double` IS x87 80-bit, so the calls are real. # - # ⚠️ Measured 2026-08-22, after `-lgcc` came off this format's link line: + # Measured 2026-08-22, after `-lgcc` came off this format's link line: # # ld.lld: error: undefined symbol: __mulxc3 # @@ -597,7 +597,7 @@ include_dirs = ["llvm-generated/freestanding"] # (dladdr and _GNU_SOURCE moved to the package-wide list above: both are # facts about openkal rather than about this target, and leaving them here # meant every new object format rediscovered them.) -# _LIBUNWIND_IS_BAREMETAL — ⭐ the unwinder finds its tables through symbols +# _LIBUNWIND_IS_BAREMETAL — the unwinder finds its tables through symbols # the linker script defines rather than through the program headers. Both # routes exist upstream and this target must take the second: the headers are # reachable only through `__ehdr_start`, which requires the ELF header to lie @@ -610,12 +610,12 @@ include_dirs = ["llvm-generated/freestanding"] # The symbols are `__eh_frame_start` / `__eh_frame_end` (and the `_hdr_` # pair), and AddressSpace.hpp carries the linker script fragment that defines # them. examples/same-source/link.ld is that fragment. -# ⚠️ `-U` then `-D`: the package-wide list above already defined it, and a +# `-U` then `-D`: the package-wide list above already defined it, and a # second `-D` of a different value is a redefinition warning rather than an # override. cxxflags = ["-D_LIBUNWIND_IS_BAREMETAL=1", "-UOPENKAL_HAS_TASK", "-DOPENKAL_HAS_TASK=0"] cflags = ["-UOPENKAL_HAS_TASK", "-DOPENKAL_HAS_TASK=0"] -# ⚠️ THE FLAG BELONGS TO THIS PACKAGE AND LANDS ON THE CONSUMER'S LINK. +# THE FLAG BELONGS TO THIS PACKAGE AND LANDS ON THE CONSUMER'S LINK. # # `_LIBUNWIND_IS_BAREMETAL` above makes the unwinder read `__eh_frame_hdr_start` # and `__eh_frame_hdr_end`, which a linker script derives from the SIZE of @@ -631,7 +631,7 @@ ldflags = ["-Wl,--eh-frame-hdr"] # not be compiled --- the same rule as random.cpp above, and the same one libc++'s # own build applies with the same switch. # -# ⭐⭐ AND THE COMPILER'S OWN RUNTIME, WHICH ONLY THIS TARGET HAS TO BUILD. +# AND THE COMPILER'S OWN RUNTIME, WHICH ONLY THIS TARGET HAS TO BUILD. # # A hosted target links `libclang_rt.builtins` from the toolchain and nobody # notices it exists. This target has no such archive to link, and what it needs @@ -642,7 +642,7 @@ ldflags = ["-Wl,--eh-frame-hdr"] # # Measured 2026-08-23, after the C library's own link errors were gone: twenty # undefined names, all of the form `__addtf3`, `__letf2`, `__fixtfdi`, -# `__udivti3`. ⚠️ Not one of them appears in any source in this repository --- +# `__udivti3`. Not one of them appears in any source in this repository --- # they are what the compiler decided to call, which is why reading the sources # would never have found them and why the first evidence of the gap is a link. # @@ -663,7 +663,7 @@ ldflags = ["-Wl,--eh-frame-hdr"] sources = [ "!llvm/libcxx/src/filesystem/*.cpp", - # ⭐ AND `random.cpp`, FOR THE SAME REASON AND BY THE SAME RULE. + # AND `random.cpp`, FOR THE SAME REASON AND BY THE SAME RULE. # # This configuration keeps `_LIBCPP_HAS_RANDOM_DEVICE` at 0 --- a bare-metal # backend provides `openkal.random` only if its board has a source, and @@ -675,7 +675,7 @@ sources = [ # llvm/libcxx/src/random.cpp:68:1: # error: use of undeclared identifier 'random_device' # - # ⚠️ The exclusion was removed together with the hosted one when openkal + # The exclusion was removed together with the hosted one when openkal # gained an entropy source, and the two are not the same decision: the # hosted configuration turned the switch ON, and this one did not. "!llvm/libcxx/src/random.cpp", @@ -689,7 +689,7 @@ sources = [ "!llvm/compiler-rt/lib/builtins/gcc_personality_v0.c", "!llvm/compiler-rt/lib/builtins/crtbegin.c", "!llvm/compiler-rt/lib/builtins/crtend.c", - # ⚠️ Darwin's own: it asks Apple's SDK which OS version is running, so that a + # Darwin's own: it asks Apple's SDK which OS version is running, so that a # weakly-linked symbol can be probed. openkal is not that OS, and nothing here # weak-links against it. (`apple_versioning.c` is already outside the # architecture's list; this one is inside it and still Darwin's.) @@ -709,7 +709,7 @@ cxxflags = [ # it takes. The C sources had it and the C++ ones did not, which is the kind of # split a single flags list does not have. "-D_LIBUNWIND_IS_NATIVE_ONLY", - # ⭐ NO `dladdr`, ON ANY TARGET — WHICH IS A FACT ABOUT openkal, NOT ABOUT ONE + # NO `dladdr`, ON ANY TARGET — WHICH IS A FACT ABOUT openkal, NOT ABOUT ONE # PLATFORM. # # libunwind uses it to put a FUNCTION NAME on a frame, which is a convenience @@ -720,12 +720,12 @@ cxxflags = [ # openkal has no dynamic loader on any target: a program built this way is one # image. So the answer is the same everywhere, and it is stated once here # rather than per target — which is what stops the next object format from - # rediscovering it. ⚠️ It was in the `cfg(os = "none")` block before, and the + # rediscovering it. It was in the `cfg(os = "none")` block before, and the # macOS target then failed on `unknown type name 'Dl_info'` — the same fact, # asked again, at a place that had not been told. "-D_LIBUNWIND_USE_DLADDR=0", - # ⭐⭐ `_WIN32` SAYS WHAT THE OBJECT FORMAT IS, NOT WHAT IS BENEATH. + # `_WIN32` SAYS WHAT THE OBJECT FORMAT IS, NOT WHAT IS BENEATH. # # The same correction `port/include/__config` makes for libc++, made for the # unwinder — and it has to be a flag rather than an overlay because both @@ -741,16 +741,16 @@ cxxflags = [ # RWMutex.hpp what read-write lock does this platform have? # → pthreads, i.e. musl, i.e. `kal_task_wait` # - # ⚠️ Package-wide and not under `cfg(windows)`, for the reason `_GNU_SOURCE` + # Package-wide and not under `cfg(windows)`, for the reason `_GNU_SOURCE` # and dladdr were moved up: it is a fact about openkal rather than about a # target, and leaving it below means the next object format rediscovers it. "-DOPENKAL=1", - # ⭐⭐ NOTHING FROM THE MACHINE. This package states every header it needs in + # NOTHING FROM THE MACHINE. This package states every header it needs in # `include_dirs`; anything the compiler finds on its own is a header of # whatever system is doing the building, and taking one makes the build depend # on where it happens. # - # ⚠️ Measured 2026-08-23, building this package ON macOS with the target side + # Measured 2026-08-23, building this package ON macOS with the target side # from the graph — the flag was on `std-module-flags` and nowhere else: # # libcxx/src/chrono.cpp:59 → …/MacOSX.sdk/usr/include/mach/mach_time.h:55: @@ -763,7 +763,7 @@ cxxflags = [ # to libc++ and the paths this build takes do not use it; the defect is that # the question could be asked at all. "-nostdinc", - # ⭐ WHETHER THE IMPLEMENTATION BENEATH PROVIDES `openkal.task`. + # WHETHER THE IMPLEMENTATION BENEATH PROVIDES `openkal.task`. # # `llvm/libcxx/src/atomic.cpp` asks openkal for the suspension primitive # rather than asking an operating system — see llvm/PATCHES.md. An @@ -771,16 +771,16 @@ cxxflags = [ # openkal expresses that by the interface being absent, so the C++ runtime has # to know before it is compiled. # - # ⚠️ THE SAME FACT openkal-musl STATES AS `OKM_HAS_TASK`. Two consumers, two + # THE SAME FACT openkal-musl STATES AS `OKM_HAS_TASK`. Two consumers, two # declarations, because a manifest cannot yet read what an implementation # provides. Cleared for `cfg(os = "none")` below, exactly as musl's is. "-DOPENKAL_HAS_TASK=1", - # ⭐ musl's non-standard names live behind this, and they are not optional for + # musl's non-standard names live behind this, and they are not optional for # libc++: the locale backend calls `vasprintf`, `strtof_l`, `strtod_l`, # `strtold_l`, and libc++abi's guard reaches `syscall`. All of them are musl's # to declare, and musl declares them here. # - # ⚠️ It was in the `cfg(os = "none")` block, where it happened to be needed + # It was in the `cfg(os = "none")` block, where it happened to be needed # first. Measured on the macOS cross: `no member named 'strtof_l' in the # global namespace`, from a header the freestanding block never applied to. # The fact is about the C LIBRARY, so it is stated once for the package. @@ -813,16 +813,16 @@ cxxflags = [ cflags = [ "-D_LIBUNWIND_IS_NATIVE_ONLY", - # ⚠️ AND ON THE C SIDE TOO, WHICH IS NOT A DUPLICATE — `compiler-rt` is C, and + # AND ON THE C SIDE TOO, WHICH IS NOT A DUPLICATE — `compiler-rt` is C, and # `emutls.c` asks the same "which OS is beneath" question that libunwind's # headers do. One name for one fact; see the cxxflags entry for what it means. "-DOPENKAL=1", - # ⭐⭐ NOTHING FROM THE MACHINE. This package states every header it needs in + # NOTHING FROM THE MACHINE. This package states every header it needs in # `include_dirs`; anything the compiler finds on its own is a header of # whatever system is doing the building, and taking one makes the build depend # on where it happens. # - # ⚠️ Measured 2026-08-23, building this package ON macOS with the target side + # Measured 2026-08-23, building this package ON macOS with the target side # from the graph — the flag was on `std-module-flags` and nowhere else: # # libcxx/src/chrono.cpp:59 → …/MacOSX.sdk/usr/include/mach/mach_time.h:55: diff --git a/port/include/AvailabilityMacros.h b/port/include/AvailabilityMacros.h index 796b3d94..89bacdb1 100644 --- a/port/include/AvailabilityMacros.h +++ b/port/include/AvailabilityMacros.h @@ -1,7 +1,7 @@ // A stub for a header openkal has no reason to have, providing exactly the one // macro that is read. // -// ⭐ THE SAME MOVE AS openkal-macos's `libSystem.tbd`, WHICH IS TWO NAMES. +// THE SAME MOVE AS openkal-macos's `libSystem.tbd`, WHICH IS TWO NAMES. // // libunwind's public header asks how old a deployment target may be before its // entry points become unavailable, and it asks Apple's SDK. There is no Apple @@ -17,7 +17,7 @@ // // libunwind.h: AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER // -// ⚠️ EMPTY IS THE ANSWER, NOT A PLACEHOLDER. The macro's job upstream is to +// EMPTY IS THE ANSWER, NOT A PLACEHOLDER. The macro's job upstream is to // attach an availability attribute, which describes when a symbol appeared in // Apple's shipping libSystem. Nothing here comes from Apple's libSystem, so // there is no version at which it appeared and nothing to attach. diff --git a/port/include/__atomic/atomic_waitable_traits.h b/port/include/__atomic/atomic_waitable_traits.h index 4406d519..09f9fd1b 100644 --- a/port/include/__atomic/atomic_waitable_traits.h +++ b/port/include/__atomic/atomic_waitable_traits.h @@ -1,6 +1,6 @@ // Which widths the platform's wait primitive serves natively. // -// ⭐ THE COMPANION TO `__atomic/contention_t.h` BESIDE THIS FILE, AND BOTH ARE +// THE COMPANION TO `__atomic/contention_t.h` BESIDE THIS FILE, AND BOTH ARE // NEEDED — WHICH IS THE FINDING. // // Upstream answers by operating system: 4 on Linux, 4 and 8 on Apple, 8 on @@ -10,7 +10,7 @@ // openkal's suspension primitive is `kal_task_wait(const kal_u32*, …)` — four // bytes, on every target, because that is what the specification says it takes. // -// ⚠️ SETTING THE CONTENTION TYPE ALONE DID NOT WORK, and the way it failed is +// SETTING THE CONTENTION TYPE ALONE DID NOT WORK, and the way it failed is // worth keeping. Measured 2026-08-23: after `__cxx_contention_t` was made // `int32_t` here, the same assertion came back unchanged — // diff --git a/port/include/__atomic/contention_t.h b/port/include/__atomic/contention_t.h index 38badf44..451c1c0d 100644 --- a/port/include/__atomic/contention_t.h +++ b/port/include/__atomic/contention_t.h @@ -1,7 +1,7 @@ // The width `std::atomic`'s contention counter has — which is the width the // platform's wait primitive takes, and openkal's is four bytes. // -// ⭐ THE SAME QUESTION AS EVERY OTHER OVERLAY HERE, AND IT IS THE ONE THAT +// THE SAME QUESTION AS EVERY OTHER OVERLAY HERE, AND IT IS THE ONE THAT // DECIDES WHICH `__platform_wait_on_address` GETS INSTANTIATED. // // Upstream picks by operating system — `int32_t` on Linux, `int64_t` on Apple, @@ -15,7 +15,7 @@ // primitive takes. So the answer here follows the C library, exactly as the // locale backend and the CRT selection do. // -// ⚠️ Measured 2026-08-23, after `atomic.cpp`'s platform block was replaced but +// Measured 2026-08-23, after `atomic.cpp`'s platform block was replaced but // before this file existed: // // static assertion failed due to requirement '8UL == 4': @@ -25,7 +25,7 @@ // upstream had already chosen four and elsewhere it had chosen eight. The // failure named the assertion rather than the type that produced the eight. // -// ⚠️ AND THIS IS AN ABI DECISION. `__cxx_contention_t` appears in the mangled +// AND THIS IS AN ABI DECISION. `__cxx_contention_t` appears in the mangled // names of the four exported entry points, so a program and a libc++ that // disagree about it do not link. That is the right failure — and it is why this // belongs in a header both sides read rather than in a flag one side passes. @@ -34,7 +34,7 @@ #include <__config> -// ⚠️ THE CONDITION IS THE C LIBRARY ALONE. It used to also require +// THE CONDITION IS THE C LIBRARY ALONE. It used to also require // `_LIBCPP_ABI_ATOMIC_WAIT_NATIVE_BY_SIZE`, mirroring upstream's own structure // — and measured, the overlay was reached and took the other branch, because // that macro is not defined at the point this header is first pulled in. The diff --git a/port/include/__config b/port/include/__config index 27c7513e..3902954b 100644 --- a/port/include/__config +++ b/port/include/__config @@ -1,6 +1,6 @@ // libc++'s configuration, plus the one correction openkal has to make to it. // -// ⭐ WHY `__config` AND NOT `__config_site`. `__config_site` is where a build +// WHY `__config` AND NOT `__config_site`. `__config_site` is where a build // states its answers, and this package generates one — it is how // `_LIBCPP_HAS_MUSL_LIBC`, the thread API and the filesystem switch are set. // What follows below is not an answer libc++ asks for: it is a conclusion @@ -16,7 +16,7 @@ // OBJECT FORMAT and the calling convention, and the C library underneath is // musl — the same musl that is underneath on ELF and on Mach-O. // -// ⚠️ Measured 2026-08-23, cross-compiling for `x86_64-windows-gnu` over openkal: +// Measured 2026-08-23, cross-compiling for `x86_64-windows-gnu` over openkal: // // fstream:741: use of undeclared identifier '_wfopen' // fstream:1004: use of undeclared identifier '_ftelli64' @@ -28,7 +28,7 @@ // where musl is the C library. Nothing new is written; an existing answer is // made reachable. // -// ⚠️ BOTH NAMES, NOT ONE. `_LIBCPP_MSVCRT_LIKE` selects the C runtime and +// BOTH NAMES, NOT ONE. `_LIBCPP_MSVCRT_LIKE` selects the C runtime and // `_LIBCPP_WIN32API` selects the operating-system API — and on this target // neither is what is beneath. Withdrawing only the first would leave libc++ // reaching for `CreateFileW` while calling `fopen`. @@ -47,7 +47,7 @@ # ifdef _LIBCPP_WIN32API # undef _LIBCPP_WIN32API # endif -// ⚠️ AND THE CONCLUSION DRAWN FROM THE CONCLUSION. `_LIBCPP_HAS_OPEN_WITH_WCHAR` +// AND THE CONCLUSION DRAWN FROM THE CONCLUSION. `_LIBCPP_HAS_OPEN_WITH_WCHAR` // is set to 1 inside the same `_WIN32` block, and it is a `#define` to a VALUE // rather than a name to withdraw — so undefining the two above leaves it at 1 // and `` still reaches for `_wfopen`. Measured: withdrawing the first diff --git a/port/include/__locale_dir/locale_base_api.h b/port/include/__locale_dir/locale_base_api.h index e49b8976..7c3a8c6f 100644 --- a/port/include/__locale_dir/locale_base_api.h +++ b/port/include/__locale_dir/locale_base_api.h @@ -1,4 +1,4 @@ -// ⭐⭐ libc++ 的平台后端按 OS 宏选,而 openkal 的答案按「配置的是哪个 C 库」。 +// libc++ 的平台后端按 OS 宏选,而 openkal 的答案按「配置的是哪个 C 库」。 // // THE OVERLAY, NOT AN EDIT. openkal-musl's `port/` carries every difference // from vendored musl in one directory that shadows it on the include path, and @@ -30,7 +30,7 @@ // // — Apple's locale extensions, which musl does not have and never claimed to. // -// ⚠️ WHY THIS IS NOT EXPRESSIBLE AS A `__config_site` SWITCH, WHICH WAS TRIED +// WHY THIS IS NOT EXPRESSIBLE AS A `__config_site` SWITCH, WHICH WAS TRIED // FIRST. `__config_site` is where this package states every other decision // (which C library, whether there is a filesystem, whether there is a random // device), and it is the right place for anything libc++ offers a knob for. @@ -52,7 +52,7 @@ #include <__config> -// ⭐ THE PREDICATE IS THE C LIBRARY, FULL STOP — NOT "the C library, on Apple". +// THE PREDICATE IS THE C LIBRARY, FULL STOP — NOT "the C library, on Apple". // // It was `&& defined(__APPLE__)` at first, because Apple was the target that // exposed it. Measured 2026-08-23 on the next one: `x86_64-windows-gnu` over diff --git a/port/include/__thread/support.h b/port/include/__thread/support.h index 0af1a040..35cd3fab 100644 --- a/port/include/__thread/support.h +++ b/port/include/__thread/support.h @@ -1,7 +1,7 @@ // The threading support header, plus the two PLATFORM names libc++abi looks for // at this point and that openkal answers differently. // -// ⭐ WHY HERE. `cxa_guard_impl.h` includes this unconditionally and then asks +// WHY HERE. `cxa_guard_impl.h` includes this unconditionally and then asks // // #if defined(__APPLE__) && _LIBCPP_HAS_THREAD_API_PTHREAD // ... pthread_mach_thread_np(...) → mach_port_t @@ -10,14 +10,14 @@ // #else // constexpr uint32_t (*PlatformThreadID)() = nullptr; // -// ⚠️ ALL THREE BRANCHES ARE FINE FOR openkal EXCEPT THE FIRST, WHICH IS THE ONE +// ALL THREE BRANCHES ARE FINE FOR openkal EXCEPT THE FIRST, WHICH IS THE ONE // THAT MATCHES. The second routes through musl's system-call shim, which this // ecosystem answers with `kal_task_*`; the third is a legal answer that the // guard implementations already handle. The first names Apple's Mach kernel, // and there is no Mach here — the platform is `openkal-macos`, and `__APPLE__` // is a statement about the OBJECT FORMAT. // -// ⚠️ AND IT CANNOT BE SWITCHED OFF. `_LIBCPP_HAS_THREAD_API_PTHREAD` is ours to +// AND IT CANNOT BE SWITCHED OFF. `_LIBCPP_HAS_THREAD_API_PTHREAD` is ours to // set, and clearing it would remove the whole threading layer to route around // one identity function. `_LIBCXXABI_USE_FUTEX` selects a different // IMPLEMENTATION but does not stop this function from being DEFINED, so it @@ -40,7 +40,7 @@ typedef std::uint32_t mach_port_t; // A value that is the same for one execution context and different between two. // -// ⚠️ THAT IS THE WHOLE CONTRACT AT THIS CALL SITE. The identity is used to +// THAT IS THE WHOLE CONTRACT AT THIS CALL SITE. The identity is used to // notice that a guarded initialisation has re-entered itself — it is compared // for equality and never for anything else, never published, and never handed // to the system. Apple's answer is a Mach port name because Mach is what diff --git a/port/include/mach-o/dyld.h b/port/include/mach-o/dyld.h index f61a0f40..6f716ee3 100644 --- a/port/include/mach-o/dyld.h +++ b/port/include/mach-o/dyld.h @@ -1,7 +1,7 @@ // The dynamic loader's enquiry interface — declared, and answering that there // is nothing loaded. // -// ⚠️ THIS ONE IS NOT A COMPILE-TIME STUB. Two places call these at RUN time: +// THIS ONE IS NOT A COMPILE-TIME STUB. Two places call these at RUN time: // // libcxx/src/include/refstring.h — asks whether a string literal lies in a // read-only segment, so that a copy can be @@ -15,7 +15,7 @@ // back to copying, and the unwinder falls back to the DWARF tables it is // configured to use here anyway. // -// ⚠️ Answering zero is NOT the same as leaving the symbols undefined. Undefined +// Answering zero is NOT the same as leaving the symbols undefined. Undefined // would be a link error naming Apple's loader in a program that never wanted // one; zero is the state of a program that is not dynamically loaded, and it is // true rather than a simulation. @@ -35,14 +35,14 @@ static inline const struct mach_header* _dyld_get_image_header(uint32_t) { retur static inline intptr_t _dyld_get_image_vmaddr_slide(uint32_t) { return 0; } static inline const char* _dyld_get_image_name(uint32_t) { return 0; } -// ⚠️ AND THE UNLOAD HOOK, WHICH IS WHY THIS FILE IS NOT ONLY ENQUIRIES. +// AND THE UNLOAD HOOK, WHICH IS WHY THIS FILE IS NOT ONLY ENQUIRIES. // // libunwind's frame-description cache registers a callback so that entries can // be dropped when an image is unloaded. Nothing is ever unloaded here — there // is one image and no loader to unload it — so registering is complete when it // does nothing, and the callback would never be called even if it were kept. // -// ⭐ Stubbing it here rather than shadowing UnwindCursor.hpp keeps the whole of +// Stubbing it here rather than shadowing UnwindCursor.hpp keeps the whole of // this package's difference from upstream in headers upstream does not own. // The rule the overlay follows: replace the PLATFORM, never the library. static inline void _dyld_register_func_for_remove_image( diff --git a/tools/branch-graph.sh b/tools/branch-graph.sh index 61c6bdb6..963c555f 100755 --- a/tools/branch-graph.sh +++ b/tools/branch-graph.sh @@ -13,12 +13,12 @@ # remedy is to put the working trees in place of the versions, for the whole # graph rather than for its first edge. # -# ⚠️ WHY THIS IS A SCRIPT AND NOT A STEP. It was a step, in one job of two, and +# WHY THIS IS A SCRIPT AND NOT A STEP. It was a step, in one job of two, and # the other job resolved from the index and failed exactly as above the moment # the versions moved. Two copies of a procedure that must agree are two copies # that will not; one file called twice cannot drift. # -# ⚠️ THE SUBSTITUTED PATHS ARE RELATIVE, AND DELIBERATELY SO. +# THE SUBSTITUTED PATHS ARE RELATIVE, AND DELIBERATELY SO. # # An absolute path names a directory of one machine. A manifest carrying one has # been committed in this ecosystem and published, and every consumer resolving @@ -27,7 +27,7 @@ # `pwd` under MSYS reports `/d/a/...`, which is not a path the engine resolves, # so an absolute form would need a Windows-only conversion here. # -# ⚠️ `sed -i` IS NOT PORTABLE. BSD sed, which is macOS's, reads the argument +# `sed -i` IS NOT PORTABLE. BSD sed, which is macOS's, reads the argument # after -i as a backup suffix; the same command that edits a file on Linux # consumes the next expression on macOS. In-place editing goes through a # temporary file below for that reason. @@ -67,7 +67,7 @@ fetch openkal .spec manifests=(mcpp.toml .musl/mcpp.toml) -# ⚠️ EVERY BACKEND THE C LIBRARY NAMES, DISCOVERED RATHER THAN LISTED. +# EVERY BACKEND THE C LIBRARY NAMES, DISCOVERED RATHER THAN LISTED. # # openkal-musl names a backend per target --- linux, macos, windows, opensbi --- # each conditional on the target it serves. Their versions all move with a change @@ -106,7 +106,7 @@ grep -q 'path = "./.musl"' mcpp.toml \ grep -q 'path = "../.spec"' .musl/mcpp.toml \ || { echo "::error::the specification substitution matched nothing"; exit 1; } -# ⭐ THE CHECK THAT WOULD HAVE CAUGHT EVERY FAILURE ABOVE AT ITS FIRST OCCURRENCE: +# THE CHECK THAT WOULD HAVE CAUGHT EVERY FAILURE ABOVE AT ITS FIRST OCCURRENCE: # nothing anywhere in the substituted graph still names a version. The three # defects this file records were each found by a build failing one link further # down than the last; this asks the whole graph at once. diff --git a/tools/install-mcpp.sh b/tools/install-mcpp.sh index f587ac49..030a8ce7 100755 --- a/tools/install-mcpp.sh +++ b/tools/install-mcpp.sh @@ -10,11 +10,11 @@ # set --- the engine built from that reference, which is how a change to # mcpp is validated against this ecosystem before it is merged. # -# ⚠️ THE PIN MAY NAME A RELEASE THIS RUN IS VALIDATING, and so may not exist. In +# THE PIN MAY NAME A RELEASE THIS RUN IS VALIDATING, and so may not exist. In # that case the bootstrap takes whatever the index has; it is only the compiler # that compiles the compiler, and the build it produces is what goes on PATH. # -# ⚠️ WHY THIS IS A SCRIPT AND NOT A STEP. It was a step in one job of this +# WHY THIS IS A SCRIPT AND NOT A STEP. It was a step in one job of this # workflow and absent from another, so that job installed a released engine and # built manifests written for an unreleased one. The engine accepts a manifest # key it does not know without failing, so the mismatch does not announce @@ -58,7 +58,7 @@ src="${RUNNER_TEMP:-/tmp}/mcpp-src" # source compiled by the mcpp installed above, which is what removing it leaves. rm -f "$src/.xlings.json" -# ⚠️ THE PRODUCT OF THIS BUILD IS IDENTIFIED BY ABSENCE, NOT BY RECENCY. +# THE PRODUCT OF THIS BUILD IS IDENTIFIED BY ABSENCE, NOT BY RECENCY. # # `target/` holds one directory per configuration and accumulates them, and a # restored cache writes every timestamp to the moment of extraction. Both @@ -81,7 +81,7 @@ fi echo "$(cd "$(dirname "$built")" && pwd)" >> "$GITHUB_PATH" echo "under review: $("$built" --version) (from $MCPP_SOURCE_REF)" -# ⚠️ THE APPEND ABOVE IS NOT EVIDENCE THAT THE APPEND TOOK EFFECT. +# THE APPEND ABOVE IS NOT EVIDENCE THAT THE APPEND TOOK EFFECT. # # `GITHUB_PATH` governs the steps that follow, so nothing observable in this one # can distinguish a directory that wins from a directory that is ignored, and a