// ltoProbe.c - Phase 5.2 ThinLTO smoke probe. // Calls a helper compiled in a SEPARATE TU (ltoProbeHelper.c) via the // scripts/ltoLink.sh driver. The helper returns a constant; under LTO // the value gets constant-folded into main and printf sees the literal. // In the non-LTO build, the call survives as a real jsl long. // // Build commands (LTO): // CC=tools/llvm-mos-build/bin/clang // $CC --target=w65816 -I runtime/include -O2 -ffunction-sections \ // -emit-llvm -c demos/ltoProbe.c -o /tmp/ltoProbe.bc // $CC --target=w65816 -I runtime/include -O2 -ffunction-sections \ // -emit-llvm -c demos/ltoProbeHelper.c -o /tmp/ltoProbeHelper.bc // bash scripts/ltoLink.sh -o /tmp/ltoProbeMerged.o \ // /tmp/ltoProbe.bc /tmp/ltoProbeHelper.bc // ... then link /tmp/ltoProbeMerged.o with crt0Gno + libcGno + ... // via tools/link816, wrap with tools/omfEmit, run under runInGno.sh. #include #include extern int computeMagic(void); int main(int argc, char **argv) { int m = computeMagic(); printf("magic=0x%x\n", m); *(volatile uint16_t *)0x025000UL = (uint16_t)m; for (volatile unsigned long i = 0; i < 100000UL; i++) {} return 0; }