Repository: compiler-explorer/compiler-explorer
Pull request #7513 (2025-03-24 02:00:37)

fix: add build to sway options
Add `build` command to Sway compiler options to ensure Compiler Explorer correctly executes `forc build --offline` when running Sway code.

This should resolve the error that was reported by @partouf [here](https://github.com/compiler-explorer/compiler-explorer/pull/7456#issuecomment-2721747677).




Patch:
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index 76577d410..96a2e5dfc 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -157,3 +157,4 @@ From oldest to newest contributor, we would like to thank:
 - [Stephen Heumann](https://github.com/sheumann)
 - [Joshua Batty](https://github.com/joshuabatty)
 - [Dana Jansens](https://github.com/danakj)
+- [Mathias Gredal](https://github.com/mathiasgredal)
diff --git a/biome.json b/biome.json
index 33aa5e28e..6675cdc3e 100644
--- a/biome.json
+++ b/biome.json
@@ -40,7 +40,8 @@
       "complexity": {
         "noStaticOnlyClass": "off",
         "noForEach": "off",
-        "useLiteralKeys": "off"
+        "useLiteralKeys": "off",
+        "noThisInStatic": "off"
       }
     }
   },
diff --git a/docs/SupportedEmulators.md b/docs/SupportedEmulators.md
index 8271baf6c..a463ba176 100644
--- a/docs/SupportedEmulators.md
+++ b/docs/SupportedEmulators.md
@@ -25,4 +25,5 @@ These are using Javascript and/or using external websites to facilitate emulatio
 - Hello World with default sprites with CC65 https://compiler-explorer.com/z/e7eGa8rKa
 - Hello World with custom sprites with CC65 https://compiler-explorer.com/z/s8E3PeWfM
 - Hello World with LLVM-MOS C64 https://compiler-explorer.com/z/EveEETnKT
+- Hello World with MadPascal C64 https://compiler-explorer.com/z/fobvf78vY
 - Bouncing balls with CC65 https://compiler-explorer.com/z/ajav6Menq
diff --git a/etc/config/algol68.amazon.properties b/etc/config/algol68.amazon.properties
index 086fc8143..21ec3d772 100644
--- a/etc/config/algol68.amazon.properties
+++ b/etc/config/algol68.amazon.properties
@@ -39,8 +39,8 @@ tools.llvm-mcatrunk.type=postcompilation
 tools.llvm-mcatrunk.class=llvm-mca-tool
 tools.llvm-mcatrunk.stdinHint=disabled
 
-tools.osacatrunk.name=OSACA (0.6.1)
-tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+tools.osacatrunk.name=OSACA (0.7.0)
+tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 tools.osacatrunk.type=postcompilation
 tools.osacatrunk.class=osaca-tool
 tools.osacatrunk.stdinHint=disabled
diff --git a/etc/config/analysis.amazon.properties b/etc/config/analysis.amazon.properties
index 5ffec638b..bbb3351b6 100644
--- a/etc/config/analysis.amazon.properties
+++ b/etc/config/analysis.amazon.properties
@@ -22,7 +22,7 @@ group.osaca.supportsBinary=false
 group.osaca.demangler=/opt/compiler-explorer/gcc-10.2.0/bin/c++filt
 group.osaca.compilerType=osaca
 
-compiler.osacatrunk.name=OSACA (0.6.1)
-compiler.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+compiler.osacatrunk.name=OSACA (0.7.0)
+compiler.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 # Intel syntax currently unsupported (WIP)
 # compiler.osacatrunk.intelAsm=--intel-syntax
diff --git a/etc/config/android-java.amazon.properties b/etc/config/android-java.amazon.properties
index c03ab7c69..8219ba5ea 100644
--- a/etc/config/android-java.amazon.properties
+++ b/etc/config/android-java.amazon.properties
@@ -107,7 +107,7 @@ group.dex2oat.compilerType=dex2oat
 group.dex2oat.isSemVer=true
 group.dex2oat.instructionSet=aarch64
 
-compiler.java-dex2oat-latest.name=ART dex2oat latest
+compiler.java-dex2oat-latest.name=ART dex2oat latest quarterly release
 compiler.java-dex2oat-latest.artArtifactDir=/opt/compiler-explorer/dex2oat-latest
 compiler.java-dex2oat-latest.exe=/opt/compiler-explorer/dex2oat-latest/x86_64/bin/dex2oat64
 compiler.java-dex2oat-latest.objdumper=/opt/compiler-explorer/dex2oat-latest/x86_64/bin/oatdump
diff --git a/etc/config/android-kotlin.amazon.properties b/etc/config/android-kotlin.amazon.properties
index 006741ba0..9c42c2bb7 100644
--- a/etc/config/android-kotlin.amazon.properties
+++ b/etc/config/android-kotlin.amazon.properties
@@ -108,7 +108,7 @@ group.dex2oat.compilerType=dex2oat
 group.dex2oat.isSemVer=true
 group.dex2oat.instructionSet=aarch64
 
-compiler.kotlin-dex2oat-latest.name=ART dex2oat latest
+compiler.kotlin-dex2oat-latest.name=ART dex2oat latest quarterly release
 compiler.kotlin-dex2oat-latest.artArtifactDir=/opt/compiler-explorer/dex2oat-latest
 compiler.kotlin-dex2oat-latest.exe=/opt/compiler-explorer/dex2oat-latest/x86_64/bin/dex2oat64
 compiler.kotlin-dex2oat-latest.objdumper=/opt/compiler-explorer/dex2oat-latest/x86_64/bin/oatdump
diff --git a/etc/config/c++.amazon.properties b/etc/config/c++.amazon.properties
index ddeb76af4..f73ddc485 100644
--- a/etc/config/c++.amazon.properties
+++ b/etc/config/c++.amazon.properties
@@ -702,7 +702,7 @@ compiler.clang201assert.semver=20.1.0 (assertions)
 compiler.clang201assert.options=--gcc-toolchain=/opt/compiler-explorer/gcc-14.2.0
 compiler.clang201assert.ldPath=${exePath}/../lib|${exePath}/../lib/x86_64-unknown-linux-gnu
 
-group.clang-rocm.compilers=clang-rocm-trunk:clang-rocm-40502:clang-rocm-50002:clang-rocm-50103:clang-rocm-50203:clang-rocm-50303:clang-rocm-50700:clang-rocm-60002:clang-rocm-60102
+group.clang-rocm.compilers=clang-rocm-trunk:clang-rocm-40502:clang-rocm-50002:clang-rocm-50103:clang-rocm-50203:clang-rocm-50303:clang-rocm-50700:clang-rocm-60002:clang-rocm-60102:clang-rocm-60204:clang-rocm-60303
 group.clang-rocm.intelAsm=-mllvm --x86-asm-syntax=intel
 group.clang-rocm.groupName=ROCm clang x86-64
 group.clang-rocm.instructionSet=amd64
@@ -760,6 +760,14 @@ compiler.clang-rocm-60102.exe=/opt/compiler-explorer/clang-rocm-6.1.2/bin/clang+
 compiler.clang-rocm-60102.semver=rocm-6.1.2
 compiler.clang-rocm-60102.options=--gcc-toolchain=/opt/compiler-explorer/gcc-12.2.0
 compiler.clang-rocm-60102.ldPath=${exePath}/../lib|${exePath}/../lib/x86_64-unknown-linux-gnu
+compiler.clang-rocm-60204.exe=/opt/compiler-explorer/clang-rocm-6.2.4/bin/clang++
+compiler.clang-rocm-60204.semver=rocm-6.2.4
+compiler.clang-rocm-60204.options=--gcc-toolchain=/opt/compiler-explorer/gcc-14.2.0
+compiler.clang-rocm-60204.ldPath=${exePath}/../lib|${exePath}/../lib/x86_64-unknown-linux-gnu
+compiler.clang-rocm-60303.exe=/opt/compiler-explorer/clang-rocm-6.3.3/bin/clang++
+compiler.clang-rocm-60303.semver=rocm-6.3.3
+compiler.clang-rocm-60303.options=--gcc-toolchain=/opt/compiler-explorer/gcc-14.2.0
+compiler.clang-rocm-60303.ldPath=${exePath}/../lib|${exePath}/../lib/x86_64-unknown-linux-gnu
 
 ################################
 # Clang for Arm
@@ -1373,7 +1381,7 @@ compiler.icc2021100.options=-gxx-name=/opt/compiler-explorer/gcc-12.2.0/bin/g++
 
 ################################
 # icx for x86
-group.icx.compilers=icx202112:icx202120:icx202130:icx202140:icx202200:icx202210:icx202220:icx202221:icx202300:icx202310:icx202321:icx202400:icx202410:icx202420:icx202421:icx202500:icx202501:icx202503:icx202504:icxlatest
+group.icx.compilers=icx202112:icx202120:icx202130:icx202140:icx202200:icx202210:icx202220:icx202221:icx202300:icx202310:icx202321:icx202400:icx202410:icx202420:icx202421:icx202500:icx202501:icx202503:icx202504:icx202510:icxlatest
 group.icx.intelAsm=-masm=intel
 group.icx.options=
 group.icx.groupName=ICX x86-64
@@ -1500,10 +1508,16 @@ compiler.icx202504.libPath=/opt/compiler-explorer/intel-cpp-2025.0.4.20/compiler
 compiler.icx202504.semver=2025.0.4
 compiler.icx202504.options=--gcc-toolchain=/opt/compiler-explorer/gcc-13.3.0
 
-compiler.icxlatest.exe=/opt/compiler-explorer/intel-cpp-2025.0.4.20/compiler/latest/bin/icpx
-compiler.icxlatest.ldPath=/opt/compiler-explorer/intel-cpp-2025.0.4.20/compiler/latest/lib
-compiler.icxlatest.libPath=/opt/compiler-explorer/intel-cpp-2025.0.4.20/compiler/latest/lib:/opt/compiler-explorer/intel-cpp-2025.0.4.20/tbb/latest/lib
-compiler.icxlatest.semver=2025.0.4
+compiler.icx202510.exe=/opt/compiler-explorer/intel-cpp-2025.1.0.573/compiler/latest/bin/icpx
+compiler.icx202510.ldPath=/opt/compiler-explorer/intel-cpp-2025.1.0.573/compiler/latest/lib
+compiler.icx202510.libPath=/opt/compiler-explorer/intel-cpp-2025.1.0.573/compiler/latest/lib:/opt/compiler-explorer/intel-cpp-2025.1.0.573/tbb/latest/lib
+compiler.icx202510.semver=2025.1.0
+compiler.icx202510.options=--gcc-toolchain=/opt/compiler-explorer/gcc-13.3.0
+
+compiler.icxlatest.exe=/opt/compiler-explorer/intel-cpp-2025.1.0.573/compiler/latest/bin/icpx
+compiler.icxlatest.ldPath=/opt/compiler-explorer/intel-cpp-2025.1.0.573/compiler/latest/lib
+compiler.icxlatest.libPath=/opt/compiler-explorer/intel-cpp-2025.1.0.573/compiler/latest/lib:/opt/compiler-explorer/intel-cpp-2025.1.0.573/tbb/latest/lib
+compiler.icxlatest.semver=2025.1.0
 compiler.icxlatest.options=--gcc-toolchain=/opt/compiler-explorer/gcc-13.3.0
 
 ################################
@@ -4079,7 +4093,7 @@ libs.belleviews.versions.trunk.path=/opt/compiler-explorer/libs/belleviews/trunk
 
 libs.beman_iterator_interface.name=beman.iterator_interface
 libs.beman_iterator_interface.versions=trunk
-libs.beman_iterator_interface.url=https://github.com/beman-project/iterator_interface
+libs.beman_iterator_interface.url=https://github.com/bemanproject/iterator_interface
 libs.beman_iterator_interface.packagedheaders=true
 libs.beman_iterator_interface.staticliblink=beman.iterator_interface
 libs.beman_iterator_interface.versions.trunk.version=trunk
@@ -4087,7 +4101,7 @@ libs.beman_iterator_interface.versions.trunk.lookupversion=main
 
 libs.beman_optional.name=beman.optional
 libs.beman_optional.versions=trunk
-libs.beman_optional.url=https://github.com/beman-project/optional
+libs.beman_optional.url=https://github.com/bemanproject/optional
 libs.beman_optional.versions.trunk.version=trunk
 libs.beman_optional.versions.trunk.path=/opt/compiler-explorer/libs/beman_optional/main/include
 
@@ -4731,7 +4745,7 @@ libs.gemmlowp.versions.trunk.path=/opt/compiler-explorer/libs/gemmlowp/trunk
 
 libs.glaze.name=glaze
 libs.glaze.description=JSON, reflection, and interface library
-libs.glaze.versions=trunk:198:203
+libs.glaze.versions=trunk:198:203:500
 libs.glaze.url=https://github.com/stephenberry/glaze
 libs.glaze.versions.trunk.version=trunk
 libs.glaze.versions.trunk.path=/opt/compiler-explorer/libs/glaze/trunk/include
@@ -4739,6 +4753,8 @@ libs.glaze.versions.198.version=1.9.8
 libs.glaze.versions.198.path=/opt/compiler-explorer/libs/glaze/v1.9.8/include
 libs.glaze.versions.203.version=2.0.3
 libs.glaze.versions.203.path=/opt/compiler-explorer/libs/glaze/v2.0.3/include
+libs.glaze.versions.500.version=5.0.0
+libs.glaze.versions.500.path=/opt/compiler-explorer/libs/glaze/v5.0.0/include
 
 libs.glm.name=GLM
 libs.glm.description=OpenGL Mathematics
@@ -5393,7 +5409,7 @@ libs.qt.versions.680.path=/app/qt/include/QtCore
 
 libs.quill.name=Quill
 libs.quill.description=C++ Low Latency Logging Library
-libs.quill.versions=611:700:721:730:750:810:820
+libs.quill.versions=611:700:721:730:750:810:820:900
 libs.quill.url=https://github.com/odygrd/quill
 libs.quill.versions.611.version=6.1.1
 libs.quill.versions.611.path=/opt/compiler-explorer/libs/quill/v6.1.1/quill/include
@@ -5409,6 +5425,8 @@ libs.quill.versions.810.version=8.1.0
 libs.quill.versions.810.path=/opt/compiler-explorer/libs/quill/v8.1.0/include
 libs.quill.versions.820.version=8.2.0
 libs.quill.versions.820.path=/opt/compiler-explorer/libs/quill/v8.2.0/include
+libs.quill.versions.900.version=9.0.0
+libs.quill.versions.900.path=/opt/compiler-explorer/libs/quill/v9.0.0/include
 
 libs.rangesv3.name=range-v3
 libs.rangesv3.versions=trunk:030:035:036:091:0100:0110:0120
@@ -6015,8 +6033,8 @@ tools.llvm-mcatrunk.class=llvm-mca-tool
 tools.llvm-mcatrunk.exclude=avr:rv32:armv7:mips:msp:ppc:cl19:cl_new:djggp
 tools.llvm-mcatrunk.stdinHint=disabled
 
-tools.osacatrunk.name=OSACA (0.6.1)
-tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+tools.osacatrunk.name=OSACA (0.7.0)
+tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 tools.osacatrunk.type=postcompilation
 tools.osacatrunk.class=osaca-tool
 tools.osacatrunk.exclude=avr:rv32:armv7:mips:msp:ppc:cl19:cl_new:djggp:kvx:k1c:armhf:armg:arm5
diff --git a/etc/config/c.amazon.properties b/etc/config/c.amazon.properties
index 296399b24..84b5e8043 100644
--- a/etc/config/c.amazon.properties
+++ b/etc/config/c.amazon.properties
@@ -1,4 +1,4 @@
-compilers=&cgcc86:&cclang:&nvc_x86:&armcclang32:&armcclang64:&cmosclang-trunk:&rvcclang:&wasmcclang:&ppci:&cicc:&cicx:&ccl:&ccross:&cgcc-classic:&cc65:&sdcc:&ctendra:&tinycc:&zigcc:&cproc86:&chibicc:&z88dk:&compcert:godbolt.org@443/winprod:&movfuscator:&lc3:&upmem-clang:&cvast:&orcac
+compilers=&cgcc86:&cclang:&nvc_x86:&armcclang32:&armcclang64:&cmosclang-trunk:&rvcclang:&wasmcclang:&ppci:&cicc:&cicx:&ccl:&ccross:&cgcc-classic:&cc65:&sdcc:&ctendra:&tinycc:&zigcc:&cproc86:&chibicc:&z88dk:&compcert:godbolt.org@443/winprod:&movfuscator:&lc3:&upmem-clang:&cvast:&orcac:&c2rust
 defaultCompiler=cg142
 # We use the llvm-trunk demangler for all c/c++ compilers, as c++filt tends to lag behind
 demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
@@ -3576,6 +3576,17 @@ compiler.orcac220.semver=2.2.0
 compiler.orcac221.goldenGate=/opt/compiler-explorer/orca-c-2.2.1
 compiler.orcac221.semver=2.2.1
 
+# C2Rust transpiler
+
+group.c2rust.compilers=c2rust-master
+group.c2rust.compilerType=c2rust
+group.c2rust.supportsExecute=false
+group.c2rust.supportsBinary=false
+group.c2rust.supportsBinaryObject=false
+
+compiler.c2rust-master.exe=/opt/compiler-explorer/c2rust-master/c2rust
+compiler.c2rust-master.name=C2Rust (master)
+
 #################################
 #################################
 # Libraries
@@ -3767,8 +3778,8 @@ tools.llvm-mcatrunk.class=llvm-mca-tool
 tools.llvm-mcatrunk.exclude=cavr:carm:caarch:cmips:cmsp:cppc:ppci
 tools.llvm-mcatrunk.stdinHint=disabled
 
-tools.osacatrunk.name=OSACA (0.6.1)
-tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+tools.osacatrunk.name=OSACA (0.7.0)
+tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 tools.osacatrunk.type=postcompilation
 tools.osacatrunk.class=osaca-tool
 tools.osacatrunk.exclude=cavr:carm:cmips:cmsp:cppc:ppci:armv7:ckvx:ck1c:carduino:carmh:carm5:carmg:carmce:cfr:rv6
diff --git a/etc/config/clean.amazon.properties b/etc/config/clean.amazon.properties
index b060db2b8..8d560cf03 100644
--- a/etc/config/clean.amazon.properties
+++ b/etc/config/clean.amazon.properties
@@ -49,8 +49,8 @@ tools.llvm-mcatrunk.class=llvm-mca-tool
 tools.llvm-mcatrunk.exclude=_32
 tools.llvm-mcatrunk.stdinHint=disabled
 
-tools.osacatrunk.name=OSACA (0.6.1)
-tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+tools.osacatrunk.name=OSACA (0.7.0)
+tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 tools.osacatrunk.type=postcompilation
 tools.osacatrunk.class=osaca-tool
 tools.osacatrunk.exclude=_32
diff --git a/etc/config/cppx.amazon.properties b/etc/config/cppx.amazon.properties
index dcc77ce7e..d5027f1c2 100644
--- a/etc/config/cppx.amazon.properties
+++ b/etc/config/cppx.amazon.properties
@@ -40,8 +40,8 @@ tools.llvm-mcatrunk.type=postcompilation
 tools.llvm-mcatrunk.class=llvm-mca-tool
 tools.llvm-mcatrunk.stdinHint=disabled
 
-tools.osacatrunk.name=OSACA (0.6.1)
-tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+tools.osacatrunk.name=OSACA (0.7.0)
+tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 tools.osacatrunk.type=postcompilation
 tools.osacatrunk.class=osaca-tool
 tools.osacatrunk.stdinHint=disabled
diff --git a/etc/config/cppx_blue.amazon.properties b/etc/config/cppx_blue.amazon.properties
index c8b65d03d..65b2beba3 100644
--- a/etc/config/cppx_blue.amazon.properties
+++ b/etc/config/cppx_blue.amazon.properties
@@ -24,8 +24,8 @@ tools.llvm-mcatrunk.type=postcompilation
 tools.llvm-mcatrunk.class=llvm-mca-tool
 tools.llvm-mcatrunk.stdinHint=disabled
 
-tools.osacatrunk.name=OSACA (0.6.1)
-tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+tools.osacatrunk.name=OSACA (0.7.0)
+tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 tools.osacatrunk.type=postcompilation
 tools.osacatrunk.class=osaca-tool
 tools.osacatrunk.stdinHint=disabled
diff --git a/etc/config/cppx_gold.amazon.properties b/etc/config/cppx_gold.amazon.properties
index bbc9e6688..1b3db8e15 100644
--- a/etc/config/cppx_gold.amazon.properties
+++ b/etc/config/cppx_gold.amazon.properties
@@ -24,8 +24,8 @@ tools.llvm-mcatrunk.type=postcompilation
 tools.llvm-mcatrunk.class=llvm-mca-tool
 tools.llvm-mcatrunk.stdinHint=disabled
 
-tools.osacatrunk.name=OSACA (0.6.1)
-tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+tools.osacatrunk.name=OSACA (0.7.0)
+tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 tools.osacatrunk.type=postcompilation
 tools.osacatrunk.class=osaca-tool
 tools.osacatrunk.stdinHint=disabled
diff --git a/etc/config/crystal.amazon.properties b/etc/config/crystal.amazon.properties
index 4f9cd0a43..9758af953 100644
--- a/etc/config/crystal.amazon.properties
+++ b/etc/config/crystal.amazon.properties
@@ -1,7 +1,7 @@
 compilers=&crystal
-defaultCompiler=crystal1151
+defaultCompiler=crystal1160
 
-group.crystal.compilers=crystal1151:crystal1141:crystal1133:crystal1122:crystal1111:crystal1101:crystal192:crystal182:crystal173:crystal162:crystal151:crystal141:crystal132:crystal122:crystal11:crystal10:crystal036:crystal035:crystal034:crystal033:crystal032:crystal031:crystal030:crystal029
+group.crystal.compilers=crystal1160:crystal1151:crystal1141:crystal1133:crystal1122:crystal1111:crystal1101:crystal192:crystal182:crystal173:crystal162:crystal151:crystal141:crystal132:crystal122:crystal11:crystal10:crystal036:crystal035:crystal034:crystal033:crystal032:crystal031:crystal030:crystal029
 group.crystal.isSemVer=true
 group.crystal.baseName=Crystal
 group.crystal.groupName=Crystal x86-64
@@ -13,6 +13,9 @@ group.crystal.licenseLink=https://github.com/crystal-lang/crystal/blob/master/LI
 group.crystal.licenseName=Apache 2.0 with Swift exception
 group.crystal.licensePreamble=Copyright 2012-2025 Manas Technology Solutions.
 
+compiler.crystal1160.semver=1.16.0
+compiler.crystal1160.exe=/opt/compiler-explorer/crystal-1.16.0/bin/crystal
+compiler.crystal1160.cc=/opt/compiler-explorer/gcc-snapshot/bin/gcc
 compiler.crystal1151.semver=1.15.1
 compiler.crystal1151.exe=/opt/compiler-explorer/crystal-1.15.1/bin/crystal
 compiler.crystal1151.cc=/opt/compiler-explorer/gcc-snapshot/bin/gcc
diff --git a/etc/config/cuda.amazon.properties b/etc/config/cuda.amazon.properties
index 302acccfd..7b7d5d29b 100644
--- a/etc/config/cuda.amazon.properties
+++ b/etc/config/cuda.amazon.properties
@@ -320,7 +320,7 @@ compiler.cltrunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang++
 compiler.cltrunk.demangler=/opt/compiler-explorer/gcc-snapshot/bin/c++filt
 compiler.cltrunk.options=--gcc-toolchain=/opt/compiler-explorer/gcc-snapshot --cuda-path=/opt/compiler-explorer/cuda/12.6.1 --cuda-gpu-arch=sm_90 --cuda-device-only -Wno-unknown-cuda-version -D_ALLOW_UNSUPPORTED_LIBCPP
 
-group.hipclang.compilers=hiptrunk:hipclang-rocm-40502:hipclang-rocm-50002:hipclang-rocm-50103:hipclang-rocm-50203:hipclang-rocm-50302:hipclang-rocm-50700:hipclang-rocm-60002:hipclang-rocm-60102:hipclang-trunk-rocm-60102:hipclang-staging-rocm-60102
+group.hipclang.compilers=hiptrunk:hipclang-rocm-40502:hipclang-rocm-50002:hipclang-rocm-50103:hipclang-rocm-50203:hipclang-rocm-50302:hipclang-rocm-50700:hipclang-rocm-60002:hipclang-rocm-60102:hipclang-trunk-rocm-60102:hipclang-staging-rocm-60102:hipclang-rocm-60204:hipclang-trunk-rocm-60204:hipclang-staging-rocm-60204:hipclang-rocm-60303:hipclang-trunk-rocm-60303:hipclang-staging-rocm-60303
 group.hipclang.isSemVer=true
 group.hipclang.baseName=clang
 group.hipclang.compilerType=clang-hip
@@ -395,6 +395,42 @@ compiler.hipclang-staging-rocm-60102.name=clang staging rocm-6.1.2
 compiler.hipclang-staging-rocm-60102.nvdisasm=/opt/compiler-explorer/clang-rocm-trunk/bin/llvm-objdump
 compiler.hipclang-staging-rocm-60102.objdumper=/opt/compiler-explorer/clang-rocm-trunk/bin/llvm-objdump
 compiler.hipclang-staging-rocm-60102.options=-x hip --cuda-device-only -O3 -D__HIP_PLATFORM_AMD__=1 -D__HIP_PLATFORM_HCC__=1 -isystem /opt/compiler-explorer/libs/rocm/6.1.2/include --rocm-path=/opt/compiler-explorer/libs/rocm/6.1.2 -include hip/hip_runtime.h
+compiler.hipclang-rocm-60204.exe=/opt/compiler-explorer/clang-rocm-6.2.4/bin/clang++
+compiler.hipclang-rocm-60204.semver=6.2.4
+compiler.hipclang-rocm-60204.name=clang rocm-6.2.4
+compiler.hipclang-rocm-60204.nvdisasm=/opt/compiler-explorer/clang-rocm-6.2.4/bin/llvm-objdump
+compiler.hipclang-rocm-60204.objdumper=/opt/compiler-explorer/clang-rocm-6.2.4/bin/llvm-objdump
+compiler.hipclang-rocm-60204.options=-x hip --cuda-device-only -O3 --rocm-path=/opt/compiler-explorer/libs/rocm/6.2.4 -include hip/hip_runtime.h
+compiler.hipclang-trunk-rocm-60204.exe=/opt/compiler-explorer/clang-assertions-trunk/bin/clang++
+compiler.hipclang-trunk-rocm-60204.semver=trunk-6.2.4
+compiler.hipclang-trunk-rocm-60204.name=clang trunk rocm-6.2.4
+compiler.hipclang-trunk-rocm-60204.nvdisasm=/opt/compiler-explorer/clang-assertions-trunk/bin/llvm-objdump
+compiler.hipclang-trunk-rocm-60204.objdumper=/opt/compiler-explorer/clang-assertions-trunk/bin/llvm-objdump
+compiler.hipclang-trunk-rocm-60204.options=-x hip --cuda-device-only -O3 --rocm-path=/opt/compiler-explorer/libs/rocm/6.2.4 -include hip/hip_runtime.h
+compiler.hipclang-staging-rocm-60204.exe=/opt/compiler-explorer/clang-rocm-trunk/bin/clang++
+compiler.hipclang-staging-rocm-60204.semver=staging-6.2.4
+compiler.hipclang-staging-rocm-60204.name=clang staging rocm-6.2.4
+compiler.hipclang-staging-rocm-60204.nvdisasm=/opt/compiler-explorer/clang-rocm-trunk/bin/llvm-objdump
+compiler.hipclang-staging-rocm-60204.objdumper=/opt/compiler-explorer/clang-rocm-trunk/bin/llvm-objdump
+compiler.hipclang-staging-rocm-60204.options=-x hip --cuda-device-only -O3 --rocm-path=/opt/compiler-explorer/libs/rocm/6.2.4 -include hip/hip_runtime.h
+compiler.hipclang-rocm-60303.exe=/opt/compiler-explorer/clang-rocm-6.3.3/bin/clang++
+compiler.hipclang-rocm-60303.semver=6.3.3
+compiler.hipclang-rocm-60303.name=clang rocm-6.3.3
+compiler.hipclang-rocm-60303.nvdisasm=/opt/compiler-explorer/clang-rocm-6.3.3/bin/llvm-objdump
+compiler.hipclang-rocm-60303.objdumper=/opt/compiler-explorer/clang-rocm-6.3.3/bin/llvm-objdump
+compiler.hipclang-rocm-60303.options=-x hip --cuda-device-only -O3 --rocm-path=/opt/compiler-explorer/libs/rocm/6.3.3 -include hip/hip_runtime.h
+compiler.hipclang-trunk-rocm-60303.exe=/opt/compiler-explorer/clang-assertions-trunk/bin/clang++
+compiler.hipclang-trunk-rocm-60303.semver=trunk-6.3.3
+compiler.hipclang-trunk-rocm-60303.name=clang trunk rocm-6.3.3
+compiler.hipclang-trunk-rocm-60303.nvdisasm=/opt/compiler-explorer/clang-assertions-trunk/bin/llvm-objdump
+compiler.hipclang-trunk-rocm-60303.objdumper=/opt/compiler-explorer/clang-assertions-trunk/bin/llvm-objdump
+compiler.hipclang-trunk-rocm-60303.options=-x hip --cuda-device-only -O3 --rocm-path=/opt/compiler-explorer/libs/rocm/6.3.3 -include hip/hip_runtime.h
+compiler.hipclang-staging-rocm-60303.exe=/opt/compiler-explorer/clang-rocm-trunk/bin/clang++
+compiler.hipclang-staging-rocm-60303.semver=staging-6.3.3
+compiler.hipclang-staging-rocm-60303.name=clang staging rocm-6.3.3
+compiler.hipclang-staging-rocm-60303.nvdisasm=/opt/compiler-explorer/clang-rocm-trunk/bin/llvm-objdump
+compiler.hipclang-staging-rocm-60303.objdumper=/opt/compiler-explorer/clang-rocm-trunk/bin/llvm-objdump
+compiler.hipclang-staging-rocm-60303.options=-x hip --cuda-device-only -O3 --rocm-path=/opt/compiler-explorer/libs/rocm/6.3.3 -include hip/hip_runtime.h
 
 group.nvrtc.compilers=nvrtc121:nvrtc120u1:nvrtc120:nvrtc118:nvrtc117u1:nvrtc117:nvrtc116u2:nvrtc116u1:nvrtc116:nvrtc115u2:nvrtc115u1:nvrtc115:nvrtc114u1:nvrtc114:nvrtc113u1:nvrtc113:nvrtc112u2:nvrtc112u1:nvrtc112:nvrtc111u1:nvrtc111:nvrtc11u1:nvrtc11
 group.nvrtc.compilerType=nvrtc
@@ -614,7 +650,7 @@ libs.nsimd.versions.22.path=/opt/compiler-explorer/libs/nsimd/v2.2/cuda/include
 libs.nsimd.versions.301.version=3.0.1
 libs.nsimd.versions.301.path=/opt/compiler-explorer/libs/nsimd/v3.0.1/cuda/include
 libs.hip-amd.name=HIP (AMD Platform)
-libs.hip-amd.versions=60102:60002:50700:50203:50103:50002:40502
+libs.hip-amd.versions=60303:60204:60102:60002:50700:50203:50103:50002:40502
 libs.hip-amd.url=https://github.com/ROCm-Developer-Tools/hipamd
 libs.hip-amd.versions.40502.version=4.5.2
 libs.hip-amd.versions.40502.path=/opt/compiler-explorer/libs/rocm/4.5.2
@@ -630,3 +666,7 @@ libs.hip-amd.versions.60002.version=6.0.2
 libs.hip-amd.versions.60002.path=/opt/compiler-explorer/libs/rocm/6.0.2
 libs.hip-amd.versions.60102.version=6.1.2
 libs.hip-amd.versions.60102.path=/opt/compiler-explorer/libs/rocm/6.1.2
+libs.hip-amd.versions.60204.version=6.2.4
+libs.hip-amd.versions.60204.path=/opt/compiler-explorer/libs/rocm/6.2.4
+libs.hip-amd.versions.60303.version=6.3.3
+libs.hip-amd.versions.60303.path=/opt/compiler-explorer/libs/rocm/6.3.3
diff --git a/etc/config/d.amazon.properties b/etc/config/d.amazon.properties
index f94aa3f9f..03be5e453 100644
--- a/etc/config/d.amazon.properties
+++ b/etc/config/d.amazon.properties
@@ -958,8 +958,8 @@ tools.llvm-mcatrunk.class=llvm-mca-tool
 tools.llvm-mcatrunk.exclude=dmd
 tools.llvm-mcatrunk.stdinHint=disabled
 
-tools.osacatrunk.name=OSACA (0.6.1)
-tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+tools.osacatrunk.name=OSACA (0.7.0)
+tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 tools.osacatrunk.type=postcompilation
 tools.osacatrunk.class=osaca-tool
 tools.osacatrunk.exclude=dmd
diff --git a/etc/config/fortran.amazon.properties b/etc/config/fortran.amazon.properties
index a7bd70aa8..fce60f823 100644
--- a/etc/config/fortran.amazon.properties
+++ b/etc/config/fortran.amazon.properties
@@ -1422,8 +1422,8 @@ tools.llvm-mcatrunk.type=postcompilation
 tools.llvm-mcatrunk.class=llvm-mca-tool
 tools.llvm-mcatrunk.stdinHint=disabled
 
-tools.osacatrunk.name=OSACA (0.6.1)
-tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+tools.osacatrunk.name=OSACA (0.7.0)
+tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 tools.osacatrunk.type=postcompilation
 tools.osacatrunk.class=osaca-tool
 tools.osacatrunk.stdinHint=disabled
diff --git a/etc/config/gimple.amazon.properties b/etc/config/gimple.amazon.properties
index 6c6af0dc4..28d9f190a 100644
--- a/etc/config/gimple.amazon.properties
+++ b/etc/config/gimple.amazon.properties
@@ -1712,8 +1712,8 @@ tools.llvm-mcatrunk.class=llvm-mca-tool
 tools.llvm-mcatrunk.exclude=cavr:carm:caarch:cmips:cmsp:cppc:ppci
 tools.llvm-mcatrunk.stdinHint=disabled
 
-tools.osacatrunk.name=OSACA (0.6.1)
-tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+tools.osacatrunk.name=OSACA (0.7.0)
+tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 tools.osacatrunk.type=postcompilation
 tools.osacatrunk.class=osaca-tool
 tools.osacatrunk.exclude=cavr:carm:cmips:cmsp:cppc:ppci:armv7:ckvx:ck1c:carduino:carmh:carm5:carmg:carmce:cfr:rv6
diff --git a/etc/config/go.amazon.properties b/etc/config/go.amazon.properties
index 0fe945ae7..8f57560e1 100644
--- a/etc/config/go.amazon.properties
+++ b/etc/config/go.amazon.properties
@@ -1,5 +1,5 @@
 compilers=&gccgo:&gl:&cross
-defaultCompiler=gl1232
+defaultCompiler=gl1242
 objdumper=/opt/compiler-explorer/gcc-13.1.0/bin/objdump
 
 group.gccgo.compilers=&gccgoassert:gccgo494:gccgo630:gccgo720:gccgo830:gccgo930:gccgo950:gccgo102:gccgo105:gccgo111:gccgo112:gccgo113:gccgo114:gccgo121:gccgo122:gccgo123:gccgo124:gccgo131:gccgo132:gccgo133:gccgo141:gccgo142
@@ -92,7 +92,7 @@ group.gl.isSemVer=true
 ###### x86 GC ######
 group.x86gl.compilers=&amd64gl:&386gl
 
-group.amd64gl.compilers=6g141:gl172:gl185:gl187:gl192:gl194:gl1100:gl1101:gl1110:gl1120:gl1130:gl1140:gl1150:gl1160:gl1170:gl1180:gl1190:gl1200:gl1210:gl1221:gl1232:gltip
+group.amd64gl.compilers=6g141:gl172:gl185:gl187:gl192:gl194:gl1100:gl1101:gl1110:gl1120:gl1130:gl1140:gl1150:gl1160:gl1170:gl1180:gl1190:gl1200:gl12113:gl12212:gl1238:gl1242:gltip
 group.amd64gl.groupName=x86-64 GC
 group.amd64gl.baseName=x86-64 gc
 
@@ -152,21 +152,24 @@ compiler.gl1190.goroot=/opt/compiler-explorer/golang-1.19/go
 compiler.gl1200.exe=/opt/compiler-explorer/golang-1.20/go/bin/go
 compiler.gl1200.semver=1.20
 compiler.gl1200.goroot=/opt/compiler-explorer/golang-1.20/go
-compiler.gl1210.exe=/opt/compiler-explorer/golang-1.21.0/go/bin/go
-compiler.gl1210.semver=1.21
-compiler.gl1210.goroot=/opt/compiler-explorer/golang-1.21.0/go
-compiler.gl1221.exe=/opt/compiler-explorer/golang-1.22.1/go/bin/go
-compiler.gl1221.semver=1.22.1
-compiler.gl1221.goroot=/opt/compiler-explorer/golang-1.22.1/go
-compiler.gl1232.exe=/opt/compiler-explorer/golang-1.23.2/go/bin/go
-compiler.gl1232.semver=1.23.2
-compiler.gl1232.goroot=/opt/compiler-explorer/golang-1.23.2/go
+compiler.gl12113.exe=/opt/compiler-explorer/golang-1.21.13/go/bin/go
+compiler.gl12113.semver=1.21.13
+compiler.gl12113.goroot=/opt/compiler-explorer/golang-1.21.13/go
+compiler.gl12212.exe=/opt/compiler-explorer/golang-1.22.12/go/bin/go
+compiler.gl12212.semver=1.22.12
+compiler.gl12212.goroot=/opt/compiler-explorer/golang-1.22.12/go
+compiler.gl1238.exe=/opt/compiler-explorer/golang-1.23.2/go/bin/go
+compiler.gl1238.semver=1.23.8
+compiler.gl1238.goroot=/opt/compiler-explorer/golang-1.23.8/go
+compiler.gl1242.exe=/opt/compiler-explorer/golang-1.24.8/go/bin/go
+compiler.gl1242.semver=1.24.2
+compiler.gl1242.goroot=/opt/compiler-explorer/golang-1.24.2/go
 compiler.gltip.exe=/opt/compiler-explorer/go-tip/bin/go
 compiler.gltip.semver=(tip)
 compiler.gltip.isNightly=true
 compiler.gltip.goroot=/opt/compiler-explorer/go-tip
 
-group.386gl.compilers=386_gl114:386_gl115:386_gl116:386_gl117:386_gl118:386_gl119:386_gl120:386_gl121:386_gl122:386_gl123:386_gltip
+group.386gl.compilers=386_gl114:386_gl115:386_gl116:386_gl117:386_gl118:386_gl119:386_gl120:386_gl121:386_gl122:386_gl123:386_gl124:386_gltip
 group.386gl.groupName=x86 GC
 group.386gl.baseName=x86 gc
 group.386gl.goarch=386
@@ -185,12 +188,14 @@ compiler.386_gl119.exe=/opt/compiler-explorer/golang-1.19/go/bin/go
 compiler.386_gl119.semver=1.19
 compiler.386_gl120.exe=/opt/compiler-explorer/golang-1.20/go/bin/go
 compiler.386_gl120.semver=1.20
-compiler.386_gl121.exe=/opt/compiler-explorer/golang-1.21.0/go/bin/go
-compiler.386_gl121.semver=1.21
-compiler.386_gl122.exe=/opt/compiler-explorer/golang-1.22.1/go/bin/go
-compiler.386_gl122.semver=1.22.1
-compiler.386_gl123.exe=/opt/compiler-explorer/golang-1.23.2/go/bin/go
-compiler.386_gl123.semver=1.23.2
+compiler.386_gl121.exe=/opt/compiler-explorer/golang-1.21.13/go/bin/go
+compiler.386_gl121.semver=1.21.13
+compiler.386_gl122.exe=/opt/compiler-explorer/golang-1.22.12/go/bin/go
+compiler.386_gl122.semver=1.22.12
+compiler.386_gl123.exe=/opt/compiler-explorer/golang-1.23.8/go/bin/go
+compiler.386_gl123.semver=1.23.8
+compiler.386_gl124.exe=/opt/compiler-explorer/golang-1.24.2/go/bin/go
+compiler.386_gl124.semver=1.24.2
 compiler.386_gltip.exe=/opt/compiler-explorer/go-tip/bin/go
 compiler.386_gltip.semver=(tip)
 compiler.386_gltip.isNightly=true
@@ -200,7 +205,7 @@ compiler.386_gltip.isNightly=true
 group.armgl.compilers=&arm32gl:&arm64gl
 group.armgl.supportsBinary=false
 
-group.arm32gl.compilers=arm_gl114:arm_gl115:arm_gl116:arm_gl117:arm_gl118:arm_gl119:arm_gl120:arm_gl121:arm_gl122:arm_gl123:arm_gltip
+group.arm32gl.compilers=arm_gl114:arm_gl115:arm_gl116:arm_gl117:arm_gl118:arm_gl119:arm_gl120:arm_gl121:arm_gl122:arm_gl123:arm_gl124:arm_gltip
 group.arm32gl.groupName=ARM GC
 group.arm32gl.baseName=ARM gc
 group.arm32gl.goarch=arm
@@ -219,17 +224,19 @@ compiler.arm_gl119.exe=/opt/compiler-explorer/golang-1.19/go/bin/go
 compiler.arm_gl119.semver=1.19
 compiler.arm_gl120.exe=/opt/compiler-explorer/golang-1.20/go/bin/go
 compiler.arm_gl120.semver=1.20
-compiler.arm_gl121.exe=/opt/compiler-explorer/golang-1.21.0/go/bin/go
-compiler.arm_gl121.semver=1.21
-compiler.arm_gl122.exe=/opt/compiler-explorer/golang-1.22.1/go/bin/go
-compiler.arm_gl122.semver=1.22.1
-compiler.arm_gl123.exe=/opt/compiler-explorer/golang-1.23.2/go/bin/go
-compiler.arm_gl123.semver=1.23.2
+compiler.arm_gl121.exe=/opt/compiler-explorer/golang-1.21.13/go/bin/go
+compiler.arm_gl121.semver=1.21.13
+compiler.arm_gl122.exe=/opt/compiler-explorer/golang-1.22.12/go/bin/go
+compiler.arm_gl122.semver=1.22.12
+compiler.arm_gl123.exe=/opt/compiler-explorer/golang-1.23.8/go/bin/go
+compiler.arm_gl123.semver=1.23.8
+compiler.arm_gl124.exe=/opt/compiler-explorer/golang-1.24.2/go/bin/go
+compiler.arm_gl124.semver=1.24.2
 compiler.arm_gltip.exe=/opt/compiler-explorer/go-tip/bin/go
 compiler.arm_gltip.semver=(tip)
 compiler.arm_gltip.isNightly=true
 
-group.arm64gl.compilers=arm64_gl114:arm64_gl115:arm64_gl116:arm64_gl117:arm64_gl118:arm64_gl119:arm64_gl120:arm64_gl121:arm64_gl122:arm64_gl123:arm64_gltip
+group.arm64gl.compilers=arm64_gl114:arm64_gl115:arm64_gl116:arm64_gl117:arm64_gl118:arm64_gl119:arm64_gl120:arm64_gl121:arm64_gl122:arm64_gl123:arm64_gl124:arm64_gltip
 group.arm64gl.groupName=ARM64 GC
 group.arm64gl.baseName=ARM64 gc
 group.arm64gl.goarch=arm64
@@ -248,12 +255,14 @@ compiler.arm64_gl119.exe=/opt/compiler-explorer/golang-1.19/go/bin/go
 compiler.arm64_gl119.semver=1.19
 compiler.arm64_gl120.exe=/opt/compiler-explorer/golang-1.20/go/bin/go
 compiler.arm64_gl120.semver=1.20
-compiler.arm64_gl121.exe=/opt/compiler-explorer/golang-1.21.0/go/bin/go
-compiler.arm64_gl121.semver=1.21
-compiler.arm64_gl122.exe=/opt/compiler-explorer/golang-1.22.1/go/bin/go
-compiler.arm64_gl122.semver=1.22.1
-compiler.arm64_gl123.exe=/opt/compiler-explorer/golang-1.23.2/go/bin/go
-compiler.arm64_gl123.semver=1.23.2
+compiler.arm64_gl121.exe=/opt/compiler-explorer/golang-1.21.13/go/bin/go
+compiler.arm64_gl121.semver=1.21.13
+compiler.arm64_gl122.exe=/opt/compiler-explorer/golang-1.22.12/go/bin/go
+compiler.arm64_gl122.semver=1.22.12
+compiler.arm64_gl123.exe=/opt/compiler-explorer/golang-1.23.8/go/bin/go
+compiler.arm64_gl123.semver=1.23.8
+compiler.arm64_gl124.exe=/opt/compiler-explorer/golang-1.24.2/go/bin/go
+compiler.arm64_gl124.semver=1.24.2
 compiler.arm64_gltip.exe=/opt/compiler-explorer/go-tip/bin/go
 compiler.arm64_gltip.semver=(tip)
 compiler.arm64_gltip.isNightly=true
@@ -265,7 +274,7 @@ group.mipsgl.supportsBinary=false
 
 group.mips32gl.compilers=&mips32legl:&mips32begl
 
-group.mips32legl.compilers=mipsle_gl114:mipsle_gl115:mipsle_gl116:mipsle_gl117:mipsle_gl118:mipsle_gl119:mipsle_gl120:mipsle_gl121:mipsle_gl122:mipsle_gl123:mipsle_gltip
+group.mips32legl.compilers=mipsle_gl114:mipsle_gl115:mipsle_gl116:mipsle_gl117:mipsle_gl118:mipsle_gl119:mipsle_gl120:mipsle_gl121:mipsle_gl122:mipsle_gl123:mipsle_gl124:mipsle_gltip
 group.mips32legl.goarch=mipsle
 group.mips32legl.groupName=MIPSLE GC
 group.mips32legl.baseName=MIPSLE gc
@@ -284,17 +293,19 @@ compiler.mipsle_gl119.exe=/opt/compiler-explorer/golang-1.19/go/bin/go
 compiler.mipsle_gl119.semver=1.19
 compiler.mipsle_gl120.exe=/opt/compiler-explorer/golang-1.20/go/bin/go
 compiler.mipsle_gl120.semver=1.20
-compiler.mipsle_gl121.exe=/opt/compiler-explorer/golang-1.21.0/go/bin/go
-compiler.mipsle_gl121.semver=1.21
-compiler.mipsle_gl122.exe=/opt/compiler-explorer/golang-1.22.1/go/bin/go
-compiler.mipsle_gl122.semver=1.22.1
-compiler.mipsle_gl123.exe=/opt/compiler-explorer/golang-1.23.2/go/bin/go
-compiler.mipsle_gl123.semver=1.23.2
+compiler.mipsle_gl121.exe=/opt/compiler-explorer/golang-1.21.13/go/bin/go
+compiler.mipsle_gl121.semver=1.21.13
+compiler.mipsle_gl122.exe=/opt/compiler-explorer/golang-1.22.12/go/bin/go
+compiler.mipsle_gl122.semver=1.22.12
+compiler.mipsle_gl123.exe=/opt/compiler-explorer/golang-1.23.8/go/bin/go
+compiler.mipsle_gl123.semver=1.23.8
+compiler.mipsle_gl124.exe=/opt/compiler-explorer/golang-1.24.2/go/bin/go
+compiler.mipsle_gl124.semver=1.24.2
 compiler.mipsle_gltip.exe=/opt/compiler-explorer/go-tip/bin/go
 compiler.mipsle_gltip.semver=(tip)
 compiler.mipsle_gltip.isNightly=true
 
-group.mips32begl.compilers=mips_gl114:mips_gl115:mips_gl116:mips_gl117:mips_gl118:mips_gl119:mips_gl120:mips_gl121:mips_gl122:mips_gl123:mips_gltip
+group.mips32begl.compilers=mips_gl114:mips_gl115:mips_gl116:mips_gl117:mips_gl118:mips_gl119:mips_gl120:mips_gl121:mips_gl122:mips_gl123:mips_gl124:mips_gltip
 group.mips32begl.goarch=mips
 group.mips32begl.groupName=MIPS GC
 group.mips32begl.baseName=MIPS gc
@@ -313,19 +324,21 @@ compiler.mips_gl119.exe=/opt/compiler-explorer/golang-1.19/go/bin/go
 compiler.mips_gl119.semver=1.19
 compiler.mips_gl120.exe=/opt/compiler-explorer/golang-1.20/go/bin/go
 compiler.mips_gl120.semver=1.20
-compiler.mips_gl121.exe=/opt/compiler-explorer/golang-1.21.0/go/bin/go
-compiler.mips_gl121.semver=1.21
-compiler.mips_gl122.exe=/opt/compiler-explorer/golang-1.22.1/go/bin/go
-compiler.mips_gl122.semver=1.22.1
-compiler.mips_gl123.exe=/opt/compiler-explorer/golang-1.23.2/go/bin/go
-compiler.mips_gl123.semver=1.23.2
+compiler.mips_gl121.exe=/opt/compiler-explorer/golang-1.21.13/go/bin/go
+compiler.mips_gl121.semver=1.21.13
+compiler.mips_gl122.exe=/opt/compiler-explorer/golang-1.22.12/go/bin/go
+compiler.mips_gl122.semver=1.22.12
+compiler.mips_gl123.exe=/opt/compiler-explorer/golang-1.23.8/go/bin/go
+compiler.mips_gl123.semver=1.23.8
+compiler.mips_gl124.exe=/opt/compiler-explorer/golang-1.24.2/go/bin/go
+compiler.mips_gl124.semver=1.24.2
 compiler.mips_gltip.exe=/opt/compiler-explorer/go-tip/bin/go
 compiler.mips_gltip.semver=(tip)
 compiler.mips_gltip.isNightly=true
 
 group.mips64gl.compilers=&mips64legl:&mips64begl
 
-group.mips64begl.compilers=mips64_gl114:mips64_gl115:mips64_gl116:mips64_gl117:mips64_gl118:mips64_gl119:mips64_gl120:mips64_gl121:mips64_gl122:mips64_gl123:mips64_gltip
+group.mips64begl.compilers=mips64_gl114:mips64_gl115:mips64_gl116:mips64_gl117:mips64_gl118:mips64_gl119:mips64_gl120:mips64_gl121:mips64_gl122:mips64_gl123:mips64_gl124:mips64_gltip
 group.mips64begl.goarch=mips64
 group.mips64begl.groupName=MIPS64 GC
 group.mips64begl.baseName=MIPS64 gc
@@ -344,18 +357,20 @@ compiler.mips64_gl119.exe=/opt/compiler-explorer/golang-1.19/go/bin/go
 compiler.mips64_gl119.semver=1.19
 compiler.mips64_gl120.exe=/opt/compiler-explorer/golang-1.20/go/bin/go
 compiler.mips64_gl120.semver=1.20
-compiler.mips64_gl121.exe=/opt/compiler-explorer/golang-1.21.0/go/bin/go
-compiler.mips64_gl121.semver=1.21
-compiler.mips64_gl122.exe=/opt/compiler-explorer/golang-1.22.1/go/bin/go
-compiler.mips64_gl122.semver=1.22.1
-compiler.mips64_gl123.exe=/opt/compiler-explorer/golang-1.23.2/go/bin/go
-compiler.mips64_gl123.semver=1.23.2
+compiler.mips64_gl121.exe=/opt/compiler-explorer/golang-1.21.13/go/bin/go
+compiler.mips64_gl121.semver=1.21.13
+compiler.mips64_gl122.exe=/opt/compiler-explorer/golang-1.22.12/go/bin/go
+compiler.mips64_gl122.semver=1.22.12
+compiler.mips64_gl123.exe=/opt/compiler-explorer/golang-1.23.8/go/bin/go
+compiler.mips64_gl123.semver=1.23.8
+compiler.mips64_gl124.exe=/opt/compiler-explorer/golang-1.24.2/go/bin/go
+compiler.mips64_gl124.semver=1.24.2
 compiler.mips64_gltip.exe=/opt/compiler-explorer/go-tip/bin/go
 compiler.mips64_gltip.semver=(tip)
 compiler.mips64_gltip.isNightly=true
 
 
-group.mips64legl.compilers=mips64le_gl114:mips64le_gl115:mips64le_gl116:mips64le_gl117:mips64le_gl118:mips64le_gl119:mips64le_gl120:mips64le_gl121:mips64le_gl122:mips64le_gl123:mips64le_gltip
+group.mips64legl.compilers=mips64le_gl114:mips64le_gl115:mips64le_gl116:mips64le_gl117:mips64le_gl118:mips64le_gl119:mips64le_gl120:mips64le_gl121:mips64le_gl122:mips64le_gl123:mips64le_gl124:mips64le_gltip
 group.mips64legl.goarch=mips64le
 group.mips64legl.groupName=MIPS64LE GC
 group.mips64legl.baseName=MIPS64LE gc
@@ -375,12 +390,14 @@ compiler.mips64le_gl119.exe=/opt/compiler-explorer/golang-1.19/go/bin/go
 compiler.mips64le_gl119.semver=1.19
 compiler.mips64le_gl120.exe=/opt/compiler-explorer/golang-1.20/go/bin/go
 compiler.mips64le_gl120.semver=1.20
-compiler.mips64le_gl121.exe=/opt/compiler-explorer/golang-1.21.0/go/bin/go
-compiler.mips64le_gl121.semver=1.21
-compiler.mips64le_gl122.exe=/opt/compiler-explorer/golang-1.22.1/go/bin/go
-compiler.mips64le_gl122.semver=1.22.1
-compiler.mips64le_gl123.exe=/opt/compiler-explorer/golang-1.23.2/go/bin/go
-compiler.mips64le_gl123.semver=1.23.2
+compiler.mips64le_gl121.exe=/opt/compiler-explorer/golang-1.21.13/go/bin/go
+compiler.mips64le_gl121.semver=1.21.13
+compiler.mips64le_gl122.exe=/opt/compiler-explorer/golang-1.22.12/go/bin/go
+compiler.mips64le_gl122.semver=1.22.12
+compiler.mips64le_gl123.exe=/opt/compiler-explorer/golang-1.23.8/go/bin/go
+compiler.mips64le_gl123.semver=1.23.8
+compiler.mips64le_gl124.exe=/opt/compiler-explorer/golang-1.24.2/go/bin/go
+compiler.mips64le_gl124.semver=1.24.2
 compiler.mips64le_gltip.exe=/opt/compiler-explorer/go-tip/bin/go
 compiler.mips64le_gltip.semver=(tip)
 compiler.mips64le_gltip.isNightly=true
@@ -391,7 +408,7 @@ group.ppcgl.compilers=&ppc64legl:&ppc64begl
 group.ppcgl.supportsBinary=false
 group.ppcgl.instructionSet=powerpc
 
-group.ppc64legl.compilers=ppc64le_gl114:ppc64le_gl115:ppc64le_gl116:ppc64le_gl117:ppc64le_gl118:ppc64le_gl119:ppc64le_gl120:ppc64le_gl121:ppc64le_gl122:ppc64le_gl123:ppc64le_gltip
+group.ppc64legl.compilers=ppc64le_gl114:ppc64le_gl115:ppc64le_gl116:ppc64le_gl117:ppc64le_gl118:ppc64le_gl119:ppc64le_gl120:ppc64le_gl121:ppc64le_gl122:ppc64le_gl123:ppc64le_gl124:ppc64le_gltip
 group.ppc64legl.goarch=ppc64le
 group.ppc64legl.groupName=POWER64LE GC
 group.ppc64legl.baseName=POWER64LE gc
@@ -410,18 +427,20 @@ compiler.ppc64le_gl119.exe=/opt/compiler-explorer/golang-1.19/go/bin/go
 compiler.ppc64le_gl119.semver=1.19
 compiler.ppc64le_gl120.exe=/opt/compiler-explorer/golang-1.20/go/bin/go
 compiler.ppc64le_gl120.semver=1.20
-compiler.ppc64le_gl121.exe=/opt/compiler-explorer/golang-1.21.0/go/bin/go
-compiler.ppc64le_gl121.semver=1.21
-compiler.ppc64le_gl122.exe=/opt/compiler-explorer/golang-1.22.1/go/bin/go
-compiler.ppc64le_gl122.semver=1.22.1
-compiler.ppc64le_gl123.exe=/opt/compiler-explorer/golang-1.23.2/go/bin/go
-compiler.ppc64le_gl123.semver=1.23.2
+compiler.ppc64le_gl121.exe=/opt/compiler-explorer/golang-1.21.13/go/bin/go
+compiler.ppc64le_gl121.semver=1.21.13
+compiler.ppc64le_gl122.exe=/opt/compiler-explorer/golang-1.22.1)/go/bin/go
+compiler.ppc64le_gl122.semver=1.22.12
+compiler.ppc64le_gl123.exe=/opt/compiler-explorer/golang-1.23.8/go/bin/go
+compiler.ppc64le_gl123.semver=1.23.8
+compiler.ppc64le_gl124.exe=/opt/compiler-explorer/golang-1.2+.2/go/bin/go
+compiler.ppc64le_gl124.semver=1.2+.2
 compiler.ppc64le_gltip.exe=/opt/compiler-explorer/go-tip/bin/go
 compiler.ppc64le_gltip.semver=(tip)
 compiler.ppc64le_gltip.isNightly=true
 
 
-group.ppc64begl.compilers=ppc64_gl114:ppc64_gl115:ppc64_gl116:ppc64_gl117:ppc64_gl118:ppc64_gl119:ppc64_gl120:ppc64_gl121:ppc64_gl122:ppc64_gl123:ppc64_gltip
+group.ppc64begl.compilers=ppc64_gl114:ppc64_gl115:ppc64_gl116:ppc64_gl117:ppc64_gl118:ppc64_gl119:ppc64_gl120:ppc64_gl121:ppc64_gl122:ppc64_gl123:ppc64_gl124:ppc64_gltip
 group.ppc64begl.goarch=ppc64
 group.ppc64begl.groupName=POWER64 GC
 group.ppc64begl.baseName=POWER64 gc
@@ -440,19 +459,21 @@ compiler.ppc64_gl119.exe=/opt/compiler-explorer/golang-1.19/go/bin/go
 compiler.ppc64_gl119.semver=1.19
 compiler.ppc64_gl120.exe=/opt/compiler-explorer/golang-1.20/go/bin/go
 compiler.ppc64_gl120.semver=1.20
-compiler.ppc64_gl121.exe=/opt/compiler-explorer/golang-1.21.0/go/bin/go
-compiler.ppc64_gl121.semver=1.21
-compiler.ppc64_gl122.exe=/opt/compiler-explorer/golang-1.22.1/go/bin/go
-compiler.ppc64_gl122.semver=1.22.1
-compiler.ppc64_gl123.exe=/opt/compiler-explorer/golang-1.23.2/go/bin/go
-compiler.ppc64_gl123.semver=1.23.2
+compiler.ppc64_gl121.exe=/opt/compiler-explorer/golang-1.21.13/go/bin/go
+compiler.ppc64_gl121.semver=1.21.13
+compiler.ppc64_gl122.exe=/opt/compiler-explorer/golang-1.22.12/go/bin/go
+compiler.ppc64_gl122.semver=1.22.12
+compiler.ppc64_gl123.exe=/opt/compiler-explorer/golang-1.23.8/go/bin/go
+compiler.ppc64_gl123.semver=1.23.8
+compiler.ppc64_gl124.exe=/opt/compiler-explorer/golang-1.24.2/go/bin/go
+compiler.ppc64_gl124.semver=1.24.2
 compiler.ppc64_gltip.exe=/opt/compiler-explorer/go-tip/bin/go
 compiler.ppc64_gltip.semver=(tip)
 compiler.ppc64_gltip.isNightly=true
 
 
 ###### RSICV GL ######
-group.riscvgl.compilers=riscv64_gl114:riscv64_gl115:riscv64_gl116:riscv64_gl117:riscv64_gl118:riscv64_gl119:riscv64_gl120:riscv64_gl121:riscv64_gl122:riscv64_gl123:riscv64_gltip
+group.riscvgl.compilers=riscv64_gl114:riscv64_gl115:riscv64_gl116:riscv64_gl117:riscv64_gl118:riscv64_gl119:riscv64_gl120:riscv64_gl121:riscv64_gl122:riscv64_gl123:riscv64_gl124:riscv64_gltip
 group.riscvgl.supportsBinary=false
 group.riscvgl.groupName=RISC-V 64 GC
 group.riscvgl.baseName=RISC-V 64 gc
@@ -472,19 +493,21 @@ compiler.riscv64_gl119.exe=/opt/compiler-explorer/golang-1.19/go/bin/go
 compiler.riscv64_gl119.semver=1.19
 compiler.riscv64_gl120.exe=/opt/compiler-explorer/golang-1.20/go/bin/go
 compiler.riscv64_gl120.semver=1.20
-compiler.riscv64_gl121.exe=/opt/compiler-explorer/golang-1.21.0/go/bin/go
-compiler.riscv64_gl121.semver=1.21
-compiler.riscv64_gl122.exe=/opt/compiler-explorer/golang-1.22.1/go/bin/go
-compiler.riscv64_gl122.semver=1.22.1
-compiler.riscv64_gl123.exe=/opt/compiler-explorer/golang-1.23.2/go/bin/go
-compiler.riscv64_gl123.semver=1.23.2
+compiler.riscv64_gl121.exe=/opt/compiler-explorer/golang-1.21.13/go/bin/go
+compiler.riscv64_gl121.semver=1.21.13
+compiler.riscv64_gl122.exe=/opt/compiler-explorer/golang-1.22.12/go/bin/go
+compiler.riscv64_gl122.semver=1.22.12
+compiler.riscv64_gl123.exe=/opt/compiler-explorer/golang-1.23.8/go/bin/go
+compiler.riscv64_gl123.semver=1.23.8
+compiler.riscv64_gl124.exe=/opt/compiler-explorer/golang-1.24.2/go/bin/go
+compiler.riscv64_gl124.semver=1.24.2
 compiler.riscv64_gltip.exe=/opt/compiler-explorer/go-tip/bin/go
 compiler.riscv64_gltip.semver=(tip)
 compiler.riscv64_gltip.isNightly=true
 
 
 ##### s390x GL ######
-group.s390xgl.compilers=s390x_gl114:s390x_gl115:s390x_gl116:s390x_gl117:s390x_gl118:s390x_gl119:s390x_gl120:s390x_gl121:s390x_gl122:s390x_gl123:s390x_gltip
+group.s390xgl.compilers=s390x_gl114:s390x_gl115:s390x_gl116:s390x_gl117:s390x_gl118:s390x_gl119:s390x_gl120:s390x_gl121:s390x_gl122:s390x_gl123:s390x_gl124:s390x_gltip
 group.s390xgl.supportsBinary=false
 group.s390xgl.goarch=s390x
 group.s390xgl.groupName=S390X GC
@@ -505,12 +528,14 @@ compiler.s390x_gl119.exe=/opt/compiler-explorer/golang-1.19/go/bin/go
 compiler.s390x_gl119.semver=1.19
 compiler.s390x_gl120.exe=/opt/compiler-explorer/golang-1.20/go/bin/go
 compiler.s390x_gl120.semver=1.20
-compiler.s390x_gl121.exe=/opt/compiler-explorer/golang-1.21.0/go/bin/go
-compiler.s390x_gl121.semver=1.21
-compiler.s390x_gl122.exe=/opt/compiler-explorer/golang-1.22.1/go/bin/go
-compiler.s390x_gl122.semver=1.22.1
-compiler.s390x_gl123.exe=/opt/compiler-explorer/golang-1.23.2/go/bin/go
-compiler.s390x_gl123.semver=1.23.2
+compiler.s390x_gl121.exe=/opt/compiler-explorer/golang-1.21.13/go/bin/go
+compiler.s390x_gl121.semver=1.21.13
+compiler.s390x_gl122.exe=/opt/compiler-explorer/golang-1.22.12/go/bin/go
+compiler.s390x_gl122.semver=1.22.12
+compiler.s390x_gl123.exe=/opt/compiler-explorer/golang-1.23.8/go/bin/go
+compiler.s390x_gl123.semver=1.23.8
+compiler.s390x_gl124.exe=/opt/compiler-explorer/golang-1.24.2/go/bin/go
+compiler.s390x_gl124.semver=1.24.2
 compiler.s390x_gltip.exe=/opt/compiler-explorer/go-tip/bin/go
 compiler.s390x_gltip.semver=(tip)
 compiler.s390x_gltip.isNightly=true
@@ -518,7 +543,7 @@ compiler.s390x_gltip.isNightly=true
 
 ###############################
 # WASM GO
-group.wasmgl.compilers=wasm_gl114:wasm_gl115:wasm_gl116:wasm_gl117:wasm_gl118:wasm_gl119:wasm_gl120:wasm_gl121:wasm_gl122:wasm_gl123:wasm_gltip
+group.wasmgl.compilers=wasm_gl114:wasm_gl115:wasm_gl116:wasm_gl117:wasm_gl118:wasm_gl119:wasm_gl120:wasm_gl121:wasm_gl122:wasm_gl123:wasm_gl124:wasm_gltip
 group.wasmgl.supportsBinary=false
 group.wasmgl.groupName=WASM GC
 group.wasmgl.goarch=wasm
@@ -539,12 +564,14 @@ compiler.wasm_gl119.exe=/opt/compiler-explorer/golang-1.19/go/bin/go
 compiler.wasm_gl119.semver=1.19
 compiler.wasm_gl120.exe=/opt/compiler-explorer/golang-1.20/go/bin/go
 compiler.wasm_gl120.semver=1.20
-compiler.wasm_gl121.exe=/opt/compiler-explorer/golang-1.21.0/go/bin/go
-compiler.wasm_gl121.semver=1.21
-compiler.wasm_gl122.exe=/opt/compiler-explorer/golang-1.22.1/go/bin/go
-compiler.wasm_gl122.semver=1.22.1
-compiler.wasm_gl123.exe=/opt/compiler-explorer/golang-1.23.2/go/bin/go
-compiler.wasm_gl123.semver=1.23.2
+compiler.wasm_gl121.exe=/opt/compiler-explorer/golang-1.21.13/go/bin/go
+compiler.wasm_gl121.semver=1.21.13
+compiler.wasm_gl122.exe=/opt/compiler-explorer/golang-1.22.12/go/bin/go
+compiler.wasm_gl122.semver=1.22.12
+compiler.wasm_gl123.exe=/opt/compiler-explorer/golang-1.23.8/go/bin/go
+compiler.wasm_gl123.semver=1.23.8
+compiler.wasm_gl124.exe=/opt/compiler-explorer/golang-1.24.2/go/bin/go
+compiler.wasm_gl124.semver=1.24.2
 compiler.wasm_gltip.exe=/opt/compiler-explorer/go-tip/bin/go
 compiler.wasm_gltip.semver=(tip)
 compiler.wasm_gltip.isNightly=true
@@ -1206,8 +1233,8 @@ tools.llvm-mcatrunk.class=llvm-mca-tool
 tools.llvm-mcatrunk.exclude=gl:6g141
 tools.llvm-mcatrunk.stdinHint=disabled
 
-tools.osacatrunk.name=OSACA (0.6.1)
-tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+tools.osacatrunk.name=OSACA (0.7.0)
+tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 tools.osacatrunk.type=postcompilation
 tools.osacatrunk.class=osaca-tool
 tools.osacatrunk.exclude=gl:6g141
diff --git a/etc/config/haskell.amazon.properties b/etc/config/haskell.amazon.properties
index c994ba670..6062e9034 100644
--- a/etc/config/haskell.amazon.properties
+++ b/etc/config/haskell.amazon.properties
@@ -58,8 +58,8 @@ tools.llvm-mcatrunk.type=postcompilation
 tools.llvm-mcatrunk.class=llvm-mca-tool
 tools.llvm-mcatrunk.stdinHint=disabled
 
-tools.osacatrunk.name=OSACA (0.6.1)
-tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+tools.osacatrunk.name=OSACA (0.7.0)
+tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 tools.osacatrunk.type=postcompilation
 tools.osacatrunk.class=osaca-tool
 tools.osacatrunk.stdinHint=disabled
diff --git a/etc/config/hlsl.amazon.properties b/etc/config/hlsl.amazon.properties
index 225314c9a..cc484d037 100644
--- a/etc/config/hlsl.amazon.properties
+++ b/etc/config/hlsl.amazon.properties
@@ -1,6 +1,6 @@
 compilers=&dxc:&rga:&clang
 
-group.dxc.compilers=dxc_trunk:dxc_1_6_2112:dxc_1_7_2207:dxc_1_7_2212:dxc_1_7_2308:dxc_1_8_2306:dxc_1_8_2403:dxc_1_8_2403_1:dxc_1_8_2403_2:dxc_1_8_2405:dxc_1_8_2407
+group.dxc.compilers=dxc_trunk:dxc_1_6_2112:dxc_1_7_2207:dxc_1_7_2212:dxc_1_7_2308:dxc_1_8_2306:dxc_1_8_2403:dxc_1_8_2403_1:dxc_1_8_2403_2:dxc_1_8_2405:dxc_1_8_2407:dxc_1_8_2502
 group.dxc.groupName=DXC
 group.dxc.isSemVer=true
 group.dxc.baseName=DXC
@@ -28,6 +28,8 @@ compiler.dxc_1_8_2405.exe=/opt/compiler-explorer/dxc-1.8.2405/bin/dxc
 compiler.dxc_1_8_2405.semver=1.8.2405
 compiler.dxc_1_8_2407.exe=/opt/compiler-explorer/dxc-1.8.2407/bin/dxc
 compiler.dxc_1_8_2407.semver=1.8.2407
+compiler.dxc_1_8_2502.exe=/opt/compiler-explorer/dxc-1.8.2502/bin/dxc
+compiler.dxc_1_8_2502.semver=1.8.2502
 
 group.rga.compilers=rga262_dxctrunk:rga262_dxc172207:rga262_dxc162112:rga261_dxc172207:rga261_dxc162112:rga290_dxctrunk
 group.rga.groupName=RGA
diff --git a/etc/config/ispc.amazon.properties b/etc/config/ispc.amazon.properties
index 84377ff0f..ca7f1963a 100644
--- a/etc/config/ispc.amazon.properties
+++ b/etc/config/ispc.amazon.properties
@@ -93,8 +93,8 @@ tools.llvm-mcatrunk.type=postcompilation
 tools.llvm-mcatrunk.class=llvm-mca-tool
 tools.llvm-mcatrunk.stdinHint=disabled
 
-tools.osacatrunk.name=OSACA (0.6.1)
-tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+tools.osacatrunk.name=OSACA (0.7.0)
+tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 tools.osacatrunk.type=postcompilation
 tools.osacatrunk.class=osaca-tool
 tools.osacatrunk.stdinHint=disabled
diff --git a/etc/config/java.amazon.properties b/etc/config/java.amazon.properties
index 0bb2fb1ec..0ba16609d 100644
--- a/etc/config/java.amazon.properties
+++ b/etc/config/java.amazon.properties
@@ -1,4 +1,4 @@
-compilers=&java8:&java9:&java10:&java11:&java12:&java13:&java14:&java15:&java16:&java17:&java18:&java19:&java20:&java21:&java22:&java23
+compilers=&java8:&java9:&java10:&java11:&java12:&java13:&java14:&java15:&java16:&java17:&java18:&java19:&java20:&java21:&java22:&java23:&java24
 compilerType=java
 versionFlag=-version
 defaultCompiler=java2102
@@ -150,3 +150,10 @@ group.java23.objdumper=/opt/compiler-explorer/jdk-23.0.1/bin/javap
 compiler.java2301.exe=/opt/compiler-explorer/jdk-23.0.1/bin/javac
 compiler.java2301.runtime=/opt/compiler-explorer/jdk-23.0.1/bin/java
 compiler.java2301.semver=23.0.1
+
+group.java24.compilers=java2400
+group.java24.groupName=OpenJDK 24
+group.java24.objdumper=/opt/compiler-explorer/jdk-24.0.0/bin/javap
+compiler.java2400.exe=/opt/compiler-explorer/jdk-24.0.0/bin/javac
+compiler.java2400.runtime=/opt/compiler-explorer/jdk-24.0.0/bin/java
+compiler.java2400.semver=24.0.0
diff --git a/etc/config/llvm.amazon.properties b/etc/config/llvm.amazon.properties
index 031814454..fa756dea8 100644
--- a/etc/config/llvm.amazon.properties
+++ b/etc/config/llvm.amazon.properties
@@ -218,8 +218,8 @@ tools.llvm-mcatrunk.class=llvm-mca-tool
 tools.llvm-mcatrunk.exclude=opt
 tools.llvm-mcatrunk.stdinHint=disabled
 
-tools.osacatrunk.name=OSACA (0.6.1)
-tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+tools.osacatrunk.name=OSACA (0.7.0)
+tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 tools.osacatrunk.type=postcompilation
 tools.osacatrunk.class=osaca-tool
 tools.osacatrunk.exclude=opt
diff --git a/etc/config/objc++.amazon.properties b/etc/config/objc++.amazon.properties
index 0f9f115e6..150b3c601 100644
--- a/etc/config/objc++.amazon.properties
+++ b/etc/config/objc++.amazon.properties
@@ -2204,8 +2204,8 @@ tools.llvm-mcatrunk.class=llvm-mca-tool
 tools.llvm-mcatrunk.exclude=avr:rv32:arm:aarch:mips:msp:ppc:cl19:cl_new:djggp
 tools.llvm-mcatrunk.stdinHint=disabled
 
-tools.osacatrunk.name=OSACA (0.6.1)
-tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+tools.osacatrunk.name=OSACA (0.7.0)
+tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 tools.osacatrunk.type=postcompilation
 tools.osacatrunk.class=osaca-tool
 tools.osacatrunk.exclude=avr:rv32:armv7:mips:msp:ppc:cl19:cl_new:djggp:kvx:k1c:armhf:armg:arm5
diff --git a/etc/config/objc.amazon.properties b/etc/config/objc.amazon.properties
index 1256f1182..e3d56d89d 100644
--- a/etc/config/objc.amazon.properties
+++ b/etc/config/objc.amazon.properties
@@ -1103,8 +1103,8 @@ tools.llvm-mcatrunk.class=llvm-mca-tool
 tools.llvm-mcatrunk.exclude=cavr:carm:caarch:cmips:cmsp:cppc:ppci
 tools.llvm-mcatrunk.stdinHint=disabled
 
-tools.osacatrunk.name=OSACA (0.6.1)
-tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+tools.osacatrunk.name=OSACA (0.7.0)
+tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 tools.osacatrunk.type=postcompilation
 tools.osacatrunk.class=osaca-tool
 tools.osacatrunk.exclude=cavr:carm:cmips:cmsp:cppc:ppci:armv7:ckvx:ck1c:carduino:carmh:carm5:carmg:carmce:cfr:rv6
diff --git a/etc/config/pascal.amazon.properties b/etc/config/pascal.amazon.properties
index bf069555d..dd30a7c70 100644
--- a/etc/config/pascal.amazon.properties
+++ b/etc/config/pascal.amazon.properties
@@ -68,8 +68,8 @@ tools.llvm-mcatrunk.class=llvm-mca-tool
 tools.llvm-mcatrunk.stdinHint=disabled
 tools.llvm-mcatrunk.exclude=mptrunk
 
-tools.osacatrunk.name=OSACA (0.6.1)
-tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+tools.osacatrunk.name=OSACA (0.7.0)
+tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 tools.osacatrunk.type=postcompilation
 tools.osacatrunk.class=osaca-tool
 tools.osacatrunk.stdinHint=disabled
diff --git a/etc/config/rust.amazon.properties b/etc/config/rust.amazon.properties
index c89cd3247..5513caee9 100644
--- a/etc/config/rust.amazon.properties
+++ b/etc/config/rust.amazon.properties
@@ -2,14 +2,14 @@ compilers=&rust:&rustgcc:&mrustc:&rustccggcc
 objdumper=/opt/compiler-explorer/gcc-14.1.0/bin/objdump
 linker=/opt/compiler-explorer/gcc-14.1.0/bin/gcc
 aarch64linker=/opt/compiler-explorer/arm64/gcc-14.1.0/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-gcc
-defaultCompiler=r1850
+defaultCompiler=r1860
 demangler=/opt/compiler-explorer/gcc-14.1.0/bin/c++filt
 demanglerArgs=--format=rust
 
 buildenvsetup=ceconan-rust
 buildenvsetup.host=https://conan.compiler-explorer.com
 
-group.rust.compilers=r1850:r1840:r1830:r1820:r1810:r1800:r1790:r1780:r1770:r1760:r1750:r1740:r1730:r1720:r1710:r1700:r1690:r1680:r1670:r1660:r1650:r1640:r1630:r1620:r1610:r1600:r1590:r1580:r1570:r1560:r1550:r1540:r1530:r1520:r1510:r1500:r1490:r1480:r1470:r1460:r1452:r1450:r1440:r1430:r1420:r1410:r1400:r1390:r1380:r1370:r1360:r1350:r1340:r1330:r1320:r1310:r1300:r1290:r1280:r1271:r1270:r1260:r1250:r1240:r1230:r1220:r1210:r1200:r1190:r1180:r1170:r1160:r1151:r1140:r1130:r1120:r1110:r1100:r190:r180:r170:r160:r150:r140:r130:r120:r110:r100:nightly:beta
+group.rust.compilers=r1860:r1850:r1840:r1830:r1820:r1810:r1800:r1790:r1780:r1770:r1760:r1750:r1740:r1730:r1720:r1710:r1700:r1690:r1680:r1670:r1660:r1650:r1640:r1630:r1620:r1610:r1600:r1590:r1580:r1570:r1560:r1550:r1540:r1530:r1520:r1510:r1500:r1490:r1480:r1470:r1460:r1452:r1450:r1440:r1430:r1420:r1410:r1400:r1390:r1380:r1370:r1360:r1350:r1340:r1330:r1320:r1310:r1300:r1290:r1280:r1271:r1270:r1260:r1250:r1240:r1230:r1220:r1210:r1200:r1190:r1180:r1170:r1160:r1151:r1140:r1130:r1120:r1110:r1100:r190:r180:r170:r160:r150:r140:r130:r120:r110:r100:nightly:beta
 group.rust.compilerType=rust
 group.rust.isSemVer=true
 group.rust.unwiseOptions=-Ctarget-cpu=native|target-cpu=native
@@ -22,6 +22,9 @@ group.rust.supportsBinaryObject=true
 group.rust.supportsClippy=true
 # Rust 1.83+ needs `libPath` for execution with dynamically linked standard library
 # see https://github.com/compiler-explorer/compiler-explorer/pull/7367
+compiler.r1860.exe=/opt/compiler-explorer/rust-1.86.0/bin/rustc
+compiler.r1860.semver=1.86.0
+compiler.r1860.libPath=${exePath}/../lib/rustlib/x86_64-unknown-linux-gnu/lib
 compiler.r1850.exe=/opt/compiler-explorer/rust-1.85.0/bin/rustc
 compiler.r1850.semver=1.85.0
 compiler.r1850.libPath=${exePath}/../lib/rustlib/x86_64-unknown-linux-gnu/lib
@@ -1024,8 +1027,8 @@ tools.llvm-dwarfdumptrunk.type=postcompilation
 tools.llvm-dwarfdumptrunk.class=llvm-dwarfdump-tool
 tools.llvm-dwarfdumptrunk.stdinHint=disabled
 
-tools.osacatrunk.name=OSACA (0.6.1)
-tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+tools.osacatrunk.name=OSACA (0.7.0)
+tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 tools.osacatrunk.type=postcompilation
 tools.osacatrunk.class=osaca-tool
 tools.osacatrunk.stdinHint=disabled
diff --git a/etc/config/slang.amazon.properties b/etc/config/slang.amazon.properties
index ac3102a94..d05a1dc8b 100644
--- a/etc/config/slang.amazon.properties
+++ b/etc/config/slang.amazon.properties
@@ -1,16 +1,18 @@
 compilers=&defaultslangc
 
-defaultCompiler=slangc_2025_2_2
+defaultCompiler=slangc_2025_6_2
 supportsBinary=false
 compilerType=slang
 instructionSet=spirv
 
 disassemblerPath=/opt/compiler-explorer/SPIRV-Tools-master/build/tools/spirv-dis
 
-group.defaultslangc.compilers=slangc_2024_14_6:slangc_2025_2_2
+group.defaultslangc.compilers=slangc_2024_14_6:slangc_2025_2_2:slangc_2025_6_2
 group.defaultslangc.versionFlag=-version
 
 compiler.slangc_2024_14_6.exe=/opt/compiler-explorer/slang-2024.14.6/bin/slangc
 compiler.slangc_2024_14_6.name=slangc 2024.14.6
 compiler.slangc_2025_2_2.exe=/opt/compiler-explorer/slang-2025.2.2/bin/slangc
 compiler.slangc_2025_2_2.name=slangc 2025.2.2
+compiler.slangc_2025_6_2.exe=/opt/compiler-explorer/slang-2025.6.2/bin/slangc
+compiler.slangc_2025_6_2.name=slangc 2025.6.2
diff --git a/etc/config/spice.amazon.properties b/etc/config/spice.amazon.properties
index 06a9c0e61..33897bac6 100644
--- a/etc/config/spice.amazon.properties
+++ b/etc/config/spice.amazon.properties
@@ -1,7 +1,7 @@
 compilers=&spice
-defaultCompiler=spice02200
+defaultCompiler=spice02201
 
-group.spice.compilers=spice01902:spice01903:spice01904:spice01905:spice01906:spice02000:spice02001:spice02002:spice02003:spice02004:spice02005:spice02006:spice02100:spice02101:spice02200
+group.spice.compilers=spice01902:spice01903:spice01904:spice01905:spice01906:spice02000:spice02001:spice02002:spice02003:spice02004:spice02005:spice02006:spice02100:spice02101:spice02200:spice02201
 group.spice.demangler=/opt/compiler-explorer/gcc-14.2.0/bin/c++filt
 group.spice.objdumper=/opt/compiler-explorer/gcc-14.2.0/bin/objdump
 group.spice.isSemVer=true
@@ -45,6 +45,8 @@ compiler.spice02101.exe=/opt/compiler-explorer/spice-0.21.1/spice
 compiler.spice02101.semver=0.21.1
 compiler.spice02200.exe=/opt/compiler-explorer/spice-0.22.0/spice
 compiler.spice02200.semver=0.22.0
+compiler.spice02201.exe=/opt/compiler-explorer/spice-0.22.1/spice
+compiler.spice02201.semver=0.22.1
 
 #################################
 #################################
@@ -63,8 +65,8 @@ tools.llvm-mcatrunk.type=postcompilation
 tools.llvm-mcatrunk.class=llvm-mca-tool
 tools.llvm-mcatrunk.stdinHint=disabled
 
-tools.osacatrunk.name=OSACA (0.6.1)
-tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+tools.osacatrunk.name=OSACA (0.7.0)
+tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 tools.osacatrunk.type=postcompilation
 tools.osacatrunk.class=osaca-tool
 tools.osacatrunk.stdinHint=disabled
diff --git a/etc/config/spirv.amazon.properties b/etc/config/spirv.amazon.properties
index 0caf5633e..dc5d39dbd 100644
--- a/etc/config/spirv.amazon.properties
+++ b/etc/config/spirv.amazon.properties
@@ -17,12 +17,12 @@ group.spirv-val.compilerType=spirv-tools
 
 group.spirv-cross.groupName=Translate
 group.spirv-cross.baseName=SPIRV-Cross
-group.spirv-cross.compilers=spirv-cross-sdk-296:spirv-cross-sdk-304
+group.spirv-cross.compilers=spirv-cross-sdk-296:spirv-cross-sdk-304:spirv-cross-sdk-309
 group.spirv-cross.compilerType=spirv-tools
 
 group.spirv-reflect.groupName=Reflection
 group.spirv-reflect.baseName=SPIRV-Reflect
-group.spirv-reflect.compilers=spirv-reflect-sdk-304
+group.spirv-reflect.compilers=spirv-reflect-sdk-304:spirv-reflect-sdk-309
 group.spirv-reflect.compilerType=spirv-tools
 
 assemblerPath=/opt/compiler-explorer/SPIRV-Tools-master/build/tools/spirv-as
@@ -40,3 +40,8 @@ compiler.spirv-cross-sdk-304.exe=/opt/compiler-explorer/vulkan-sdk/v1.4.304.0/x8
 compiler.spirv-cross-sdk-304.name=spirv-cross (sdk-304)
 compiler.spirv-reflect-sdk-304.exe=/opt/compiler-explorer/vulkan-sdk/v1.4.304.0/x86_64/bin/spirv-reflect
 compiler.spirv-reflect-sdk-304.name=spirv-reflect (sdk-304)
+
+compiler.spirv-cross-sdk-309.exe=/opt/compiler-explorer/vulkan-sdk/v1.4.309.0/x86_64/bin/spirv-cross
+compiler.spirv-cross-sdk-309.name=spirv-cross (sdk-309)
+compiler.spirv-reflect-sdk-309.exe=/opt/compiler-explorer/vulkan-sdk/v1.4.309.0/x86_64/bin/spirv-reflect
+compiler.spirv-reflect-sdk-309.name=spirv-reflect (sdk-309)
diff --git a/etc/config/sponsors.yaml b/etc/config/sponsors.yaml
index 1a8228819..e7e701fa7 100644
--- a/etc/config/sponsors.yaml
+++ b/etc/config/sponsors.yaml
@@ -513,3 +513,4 @@ levels:
       - elliot
       - Cemalettin Dervis
       - Yuki ITO
+      - André Brand
diff --git a/etc/config/sway.amazon.properties b/etc/config/sway.amazon.properties
index d6ac0bdd4..affbce3b8 100644
--- a/etc/config/sway.amazon.properties
+++ b/etc/config/sway.amazon.properties
@@ -10,7 +10,7 @@ group.sway.irArg=--ir final
 group.sway.supportsBinary=true
 group.sway.supportsAsm=true
 group.sway.asmArg=--asm all
-group.sway.options=--offline
+group.sway.options=build --offline
 
 compiler.swayv0667.exe=/opt/compiler-explorer/sway-0.66.7/forc-binaries/forc
 compiler.swayv0667.semver=0.66.7
diff --git a/etc/config/swift.amazon.properties b/etc/config/swift.amazon.properties
index e5e30e5d2..d8b63dac7 100644
--- a/etc/config/swift.amazon.properties
+++ b/etc/config/swift.amazon.properties
@@ -1,6 +1,6 @@
 compilers=&swift:&arm-swift
-demangler=/opt/compiler-explorer/swift-6.0.3/usr/bin/swift-demangle
-defaultCompiler=swift603
+demangler=/opt/compiler-explorer/swift-6.1/usr/bin/swift-demangle
+defaultCompiler=swift61
 objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 
 #################################
@@ -8,7 +8,7 @@ objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 #################################
 
 # swift (x86_64)
-group.swift.compilers=swift311:swift402:swift403:swift41:swift411:swift412:swift42:swift50:swift51:swift52:swift53:swift54:swift55:swift56:swift57:swift58:swift59:swift510:swift603:swiftdevsnapshot:swiftnightly
+group.swift.compilers=swift311:swift402:swift403:swift41:swift411:swift412:swift42:swift50:swift51:swift52:swift53:swift54:swift55:swift56:swift57:swift58:swift59:swift510:swift603:swift61:swiftdevsnapshot:swiftnightly
 group.swift.isSemVer=true
 group.swift.groupName=swift (x86-64)
 group.swift.baseName=x86-64 swiftc
@@ -38,6 +38,9 @@ compiler.swiftdevsnapshot.semver=devsnapshot
 
 # 6.x (x86)
 
+compiler.swift61.exe=/opt/compiler-explorer/swift-6.1/usr/bin/swiftc
+compiler.swift61.semver=6.1
+
 compiler.swift603.exe=/opt/compiler-explorer/swift-6.0.3/usr/bin/swiftc
 compiler.swift603.semver=6.0.3
 
@@ -133,8 +136,8 @@ tools.llvm-mcatrunk.type=postcompilation
 tools.llvm-mcatrunk.class=llvm-mca-tool
 tools.llvm-mcatrunk.stdinHint=disabled
 
-tools.osacatrunk.name=OSACA (0.6.1)
-tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+tools.osacatrunk.name=OSACA (0.7.0)
+tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 tools.osacatrunk.type=postcompilation
 tools.osacatrunk.class=osaca-tool
 tools.osacatrunk.stdinHint=disabled
diff --git a/etc/config/zig.amazon.properties b/etc/config/zig.amazon.properties
index 8859e84a9..f1299b770 100644
--- a/etc/config/zig.amazon.properties
+++ b/etc/config/zig.amazon.properties
@@ -72,8 +72,8 @@ tools.llvm-mcatrunk.type=postcompilation
 tools.llvm-mcatrunk.class=llvm-mca-tool
 tools.llvm-mcatrunk.stdinHint=disabled
 
-tools.osacatrunk.name=OSACA (0.6.1)
-tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.6.1/bin/osaca
+tools.osacatrunk.name=OSACA (0.7.0)
+tools.osacatrunk.exe=/opt/compiler-explorer/osaca-0.7.0/bin/osaca
 tools.osacatrunk.type=postcompilation
 tools.osacatrunk.class=osaca-tool
 tools.osacatrunk.stdinHint=disabled
diff --git a/examples/algol68/default.a68 b/examples/algol68/default.a68
index 857efccc7..364a2c8a8 100644
--- a/examples/algol68/default.a68
+++ b/examples/algol68/default.a68
@@ -1,4 +1,1 @@
-PROGRAM
-BEGIN puts ("Hello world!\n");
-      0
-END
+BEGIN puts ("Hello world!\n") END
diff --git a/lib/base-compiler.ts b/lib/base-compiler.ts
index d094d58ee..4f5b63b25 100644
--- a/lib/base-compiler.ts
+++ b/lib/base-compiler.ts
@@ -814,8 +814,9 @@ export class BaseCompiler {
 
         if (!result) return false;
 
-        result.name = foundLib.name;
-        return result;
+        const copiedResult = structuredClone(result);
+        copiedResult.name = foundLib.name;
+        return copiedResult;
     }
 
     protected optionsForDemangler(filters?: ParseFiltersAndOutputOptions): string[] {
@@ -1152,6 +1153,10 @@ export class BaseCompiler {
         return options;
     }
 
+    prepareOptRemarksArgs(options: string[], outputFilename: string): string[] {
+        return options.concat(unwrap(this.compiler.optArg));
+    }
+
     prepareArguments(
         userOptions: string[],
         filters: ParseFiltersAndOutputOptions,
@@ -1171,7 +1176,7 @@ export class BaseCompiler {
         }
 
         if (this.compiler.supportsOptOutput && backendOptions.produceOptInfo) {
-            options = options.concat(unwrap(this.compiler.optArg));
+            options = this.prepareOptRemarksArgs(options, outputFilename);
         }
         if (this.compiler.supportsStackUsageOutput && backendOptions.produceStackUsageInfo) {
             options = options.concat(unwrap(this.compiler.stackUsageArg));
@@ -2321,6 +2326,10 @@ export class BaseCompiler {
         }
     }
 
+    getOptYamlPath(dirPath: string, outputFilebase: string): string {
+        return path.join(dirPath, `${outputFilebase}.opt.yaml`);
+    }
+
     async doCompilation(
         inputFilename: string,
         dirPath: string,
@@ -2455,7 +2464,7 @@ export class BaseCompiler {
 
         asmResult.tools = toolsResult;
         if (this.compiler.supportsOptOutput && backendOptions.produceOptInfo) {
-            const optPath = path.join(dirPath, `${this.outputFilebase}.opt.yaml`);
+            const optPath = this.getOptYamlPath(dirPath, this.outputFilebase);
             if (await utils.fileExists(optPath)) {
                 asmResult.optPath = optPath;
             }
diff --git a/lib/compilers/_all.ts b/lib/compilers/_all.ts
index a07abbbaf..bd6df1f21 100644
--- a/lib/compilers/_all.ts
+++ b/lib/compilers/_all.ts
@@ -27,6 +27,7 @@ export {AnalysisTool} from './analysis-tool.js';
 export {AssemblyCompiler} from './assembly.js';
 export {AvrGcc6502Compiler} from './avrgcc6502.js';
 export {BeebAsmCompiler} from './beebasm.js';
+export {C2RustCompiler} from './c2rust.js';
 export {C3Compiler} from './c3c.js';
 export {CIRCTCompiler} from './circt.js';
 export {CL430Compiler} from './cl430.js';
diff --git a/lib/compilers/argument-parsers.ts b/lib/compilers/argument-parsers.ts
index cf8ee938e..a6dfd144c 100644
--- a/lib/compilers/argument-parsers.ts
+++ b/lib/compilers/argument-parsers.ts
@@ -59,7 +59,7 @@ export class BaseParser {
     }
 
     static getExampleFilepath(): string {
-        let filename = path.join(BaseParser.getExamplesRoot(), BaseParser.getDefaultExampleFilename());
+        let filename = path.join(this.getExamplesRoot(), this.getDefaultExampleFilename());
         if (!path.isAbsolute(filename)) filename = path.join(process.cwd(), filename);
 
         return filename;
@@ -75,7 +75,7 @@ export class BaseParser {
                 previousOption = match1[1].trim();
                 if (previousOption) {
                     options[previousOption] = {
-                        description: BaseParser.spaceCompress(match1[2].trim()),
+                        description: this.spaceCompress(match1[2].trim()),
                         timesused: 0,
                     };
                 }
@@ -108,7 +108,7 @@ export class BaseParser {
                     }
                 }
 
-                options[previousOption].description = BaseParser.spaceCompress(options[previousOption].description);
+                options[previousOption].description = this.spaceCompress(options[previousOption].description);
             } else {
                 previousOption = false;
             }
@@ -139,7 +139,7 @@ export class BaseParser {
         const optionFinder2 = /^ *(--?[\d#+,<=>[\]a-z|-]* ?[\d+,<=>[\]a-z|-]*)/i;
         const result = await compiler.execCompilerCached(compiler.compiler.exe, [helpArg]);
         const options =
-            result.code === 0 ? BaseParser.parseLines(result.stdout + result.stderr, optionFinder1, optionFinder2) : {};
+            result.code === 0 ? this.parseLines(result.stdout + result.stderr, optionFinder1, optionFinder2) : {};
         compiler.possibleArguments.populateOptions(options);
         return options;
     }
@@ -167,21 +167,21 @@ export class GCCParser extends BaseParser {
     static override async setCompilerSettingsFromOptions(compiler: BaseCompiler, options: Record<string, Argument>) {
         const keys = _.keys(options);
         logger.debug(`gcc-like compiler options: ${keys.join(' ')}`);
-        if (GCCParser.hasSupport(options, '-masm=')) {
-            await GCCParser.checkAndSetMasmIntelIfSupported(compiler);
+        if (this.hasSupport(options, '-masm=')) {
+            await this.checkAndSetMasmIntelIfSupported(compiler);
         }
-        if (GCCParser.hasSupport(options, '-fstack-usage')) {
+        if (this.hasSupport(options, '-fstack-usage')) {
             compiler.compiler.stackUsageArg = '-fstack-usage';
             compiler.compiler.supportsStackUsageOutput = true;
         }
-        if (GCCParser.hasSupport(options, '-fdiagnostics-color')) {
+        if (this.hasSupport(options, '-fdiagnostics-color')) {
             if (compiler.compiler.options) compiler.compiler.options += ' ';
             compiler.compiler.options += '-fdiagnostics-color=always';
         }
-        if (GCCParser.hasSupport(options, '-fverbose-asm')) {
+        if (this.hasSupport(options, '-fverbose-asm')) {
             compiler.compiler.supportsVerboseAsm = true;
         }
-        if (GCCParser.hasSupport(options, '-fopt-info')) {
+        if (this.hasSupport(options, '-fopt-info')) {
             compiler.compiler.optArg = '-fopt-info-all';
             compiler.compiler.supportsOptOutput = true;
         }
@@ -194,22 +194,22 @@ export class GCCParser extends BaseParser {
             // not produce anything.
             compiler.compiler.removeEmptyGccDump = true;
         }
-        if (GCCParser.hasSupportStartsWith(options, '-march=')) compiler.compiler.supportsMarch = true;
-        if (GCCParser.hasSupportStartsWith(options, '--target=')) compiler.compiler.supportsTargetIs = true;
-        if (GCCParser.hasSupportStartsWith(options, '--target ')) compiler.compiler.supportsTarget = true;
+        if (this.hasSupportStartsWith(options, '-march=')) compiler.compiler.supportsMarch = true;
+        if (this.hasSupportStartsWith(options, '--target=')) compiler.compiler.supportsTargetIs = true;
+        if (this.hasSupportStartsWith(options, '--target ')) compiler.compiler.supportsTarget = true;
     }
 
     static override async parse(compiler: BaseCompiler) {
         const results = await Promise.all([
-            GCCParser.getOptions(compiler, '-fsyntax-only --help'),
-            GCCParser.getOptions(compiler, '-fsyntax-only --target-help'),
-            GCCParser.getOptions(compiler, '-fsyntax-only --help=common'),
-            GCCParser.getOptions(compiler, '-fsyntax-only --help=warnings'),
-            GCCParser.getOptions(compiler, '-fsyntax-only --help=optimizers'),
-            GCCParser.getOptions(compiler, '-fsyntax-only --help=target'),
+            this.getOptions(compiler, '-fsyntax-only --help'),
+            this.getOptions(compiler, '-fsyntax-only --target-help'),
+            this.getOptions(compiler, '-fsyntax-only --help=common'),
+            this.getOptions(compiler, '-fsyntax-only --help=warnings'),
+            this.getOptions(compiler, '-fsyntax-only --help=optimizers'),
+            this.getOptions(compiler, '-fsyntax-only --help=target'),
         ]);
         const options = Object.assign({}, ...results);
-        await GCCParser.setCompilerSettingsFromOptions(compiler, options);
+        await this.setCompilerSettingsFromOptions(compiler, options);
         return compiler;
     }
 
@@ -229,7 +229,7 @@ export class GCCParser extends BaseParser {
 
     static override async getPossibleStdvers(compiler: BaseCompiler): Promise<CompilerOverrideOptions> {
         const possible: CompilerOverrideOptions = [];
-        const options = await GCCParser.getOptionsStrict(compiler, GCCParser.getLanguageSpecificHelpFlags());
+        const options = await this.getOptionsStrict(compiler, this.getLanguageSpecificHelpFlags());
         for (const opt in options) {
             if (opt.startsWith('-std=') && !options[opt].description?.startsWith('Deprecated')) {
                 const stdver = opt.substring(5);
@@ -247,7 +247,7 @@ export class GCCParser extends BaseParser {
         const optionFinder2 = /^ *(--?[\d#+,<=>[\]a-z|-]* ?[\d+,<=>[\]a-z|-]*)/i;
         const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArg.split(' '));
         const options =
-            result.code === 0 ? GCCParser.parseLines(result.stdout + result.stderr, optionFinder1, optionFinder2) : {};
+            result.code === 0 ? this.parseLines(result.stdout + result.stderr, optionFinder1, optionFinder2) : {};
         compiler.possibleArguments.populateOptions(options);
         return options;
     }
@@ -255,7 +255,7 @@ export class GCCParser extends BaseParser {
     static async getOptionsStrict(compiler: BaseCompiler, helpArgs: string[]) {
         const optionFinder = /^ {2}(--?[\d+,<=>[\]a-z|-]*) *(.*)/i;
         const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArgs);
-        return result.code === 0 ? GCCParser.parseLines(result.stdout + result.stderr, optionFinder) : {};
+        return result.code === 0 ? this.parseLines(result.stdout + result.stderr, optionFinder) : {};
     }
 }
 
@@ -270,25 +270,25 @@ export class ClangParser extends BaseParser {
             logger.error(`compiler options appear empty for ${compiler.compiler.id}`);
         }
 
-        if (ClangParser.hasSupport(options, '-fsave-optimization-record')) {
+        if (this.hasSupport(options, '-fsave-optimization-record')) {
             compiler.compiler.optArg = '-fsave-optimization-record';
             compiler.compiler.supportsOptOutput = true;
         }
-        if (ClangParser.hasSupport(options, '-fstack-usage')) {
+        if (this.hasSupport(options, '-fstack-usage')) {
             compiler.compiler.stackUsageArg = '-fstack-usage';
             compiler.compiler.supportsStackUsageOutput = true;
         }
-        if (ClangParser.hasSupport(options, '-fverbose-asm')) {
+        if (this.hasSupport(options, '-fverbose-asm')) {
             compiler.compiler.supportsVerboseAsm = true;
         }
 
-        if (ClangParser.hasSupport(options, '-emit-llvm')) {
+        if (this.hasSupport(options, '-emit-llvm')) {
             compiler.compiler.supportsIrView = true;
             compiler.compiler.irArg = ['-Xclang', '-emit-llvm', '-fsyntax-only'];
             compiler.compiler.minIrArgs = ['-emit-llvm'];
         }
 
-        // if (ClangParser.hasSupport(options, '-emit-cir')) {
+        // if (this.hasSupport(options, '-emit-cir')) {
         // #7265: clang-trunk supposedly has '-emit-cir', but it's not doing much. Checking explicitly
         // for clangir in the compiler name instead.
         if (compiler.compiler.name?.includes('clangir')) {
@@ -296,29 +296,28 @@ export class ClangParser extends BaseParser {
         }
 
         if (
-            ClangParser.hasSupport(options, '-mllvm') &&
-            ClangParser.mllvmOptions.has('--print-before-all') &&
-            ClangParser.mllvmOptions.has('--print-after-all')
+            this.hasSupport(options, '-mllvm') &&
+            this.mllvmOptions.has('--print-before-all') &&
+            this.mllvmOptions.has('--print-after-all')
         ) {
             compiler.compiler.optPipeline = {
                 arg: ['-mllvm', '--print-before-all', '-mllvm', '--print-after-all'],
                 moduleScopeArg: [],
                 noDiscardValueNamesArg: [],
             };
-            if (ClangParser.mllvmOptions.has('--print-module-scope')) {
+            if (this.mllvmOptions.has('--print-module-scope')) {
                 compiler.compiler.optPipeline.moduleScopeArg = ['-mllvm', '-print-module-scope'];
             }
-            if (ClangParser.hasSupport(options, '-fno-discard-value-names')) {
+            if (this.hasSupport(options, '-fno-discard-value-names')) {
                 compiler.compiler.optPipeline.noDiscardValueNamesArg = ['-fno-discard-value-names'];
             }
         }
 
-        if (ClangParser.hasSupport(options, '-fcolor-diagnostics')) compiler.compiler.options += ' -fcolor-diagnostics';
-        if (ClangParser.hasSupport(options, '-fno-crash-diagnostics'))
-            compiler.compiler.options += ' -fno-crash-diagnostics';
+        if (this.hasSupport(options, '-fcolor-diagnostics')) compiler.compiler.options += ' -fcolor-diagnostics';
+        if (this.hasSupport(options, '-fno-crash-diagnostics')) compiler.compiler.options += ' -fno-crash-diagnostics';
 
-        if (ClangParser.hasSupportStartsWith(options, '--target=')) compiler.compiler.supportsTargetIs = true;
-        if (ClangParser.hasSupportStartsWith(options, '--target ')) compiler.compiler.supportsTarget = true;
+        if (this.hasSupportStartsWith(options, '--target=')) compiler.compiler.supportsTargetIs = true;
+        if (this.hasSupportStartsWith(options, '--target ')) compiler.compiler.supportsTarget = true;
     }
 
     static getMainHelpOptions(): string[] {
@@ -339,21 +338,14 @@ export class ClangParser extends BaseParser {
 
     static override async parse(compiler: BaseCompiler) {
         try {
-            const options = await ClangParser.getOptions(compiler, ClangParser.getMainHelpOptions().join(' '));
-
-            const filename = ClangParser.getExampleFilepath();
-
-            ClangParser.mllvmOptions = new Set(
-                _.keys(
-                    await ClangParser.getOptions(
-                        compiler,
-                        ClangParser.getHiddenHelpOptions(filename).join(' '),
-                        false,
-                        true,
-                    ),
-                ),
+            const options = await this.getOptions(compiler, this.getMainHelpOptions().join(' '));
+
+            const filename = this.getExampleFilepath();
+
+            this.mllvmOptions = new Set(
+                _.keys(await this.getOptions(compiler, this.getHiddenHelpOptions(filename).join(' '), false, true)),
             );
-            ClangParser.setCompilerSettingsFromOptions(compiler, options);
+            this.setCompilerSettingsFromOptions(compiler, options);
         } catch (error) {
             const err = `Error while trying to generate llvm backend arguments for ${compiler.compiler.id}: ${error}`;
             logger.error(err);
@@ -388,22 +380,22 @@ export class ClangParser extends BaseParser {
         const re4 = /note: use '([\w+:]*)', '([\w+:]*)', '([\w+:]*)', or '([\w+:]*)' for '(.*)' standard/;
         for (const line of lines) {
             let match = line.match(re1);
-            let stdvers = ClangParser.getRegexMatchesAsStdver(match, 2);
+            let stdvers = this.getRegexMatchesAsStdver(match, 2);
             possible.push(...stdvers);
             if (stdvers.length > 0) continue;
 
             match = line.match(re2);
-            stdvers = ClangParser.getRegexMatchesAsStdver(match, 3);
+            stdvers = this.getRegexMatchesAsStdver(match, 3);
             possible.push(...stdvers);
             if (stdvers.length > 0) continue;
 
             match = line.match(re3);
-            stdvers = ClangParser.getRegexMatchesAsStdver(match, 4);
+            stdvers = this.getRegexMatchesAsStdver(match, 4);
             possible.push(...stdvers);
             if (stdvers.length > 0) continue;
 
             match = line.match(re4);
-            stdvers = ClangParser.getRegexMatchesAsStdver(match, 5);
+            stdvers = this.getRegexMatchesAsStdver(match, 5);
             possible.push(...stdvers);
         }
         return possible;
@@ -413,20 +405,16 @@ export class ClangParser extends BaseParser {
         let possible: CompilerOverrideOptions = [];
 
         // clang doesn't have a --help option to get the std versions, we'll have to compile with a fictional stdversion to coax a response
-        const filename = ClangParser.getExampleFilepath();
-
-        const result = await compiler.execCompilerCached(
-            compiler.compiler.exe,
-            ClangParser.getStdVersHelpOptions(filename),
-            {
-                ...compiler.getDefaultExecOptions(),
-                createAndUseTempDir: true,
-            },
-        );
+        const filename = this.getExampleFilepath();
+
+        const result = await compiler.execCompilerCached(compiler.compiler.exe, this.getStdVersHelpOptions(filename), {
+            ...compiler.getDefaultExecOptions(),
+            createAndUseTempDir: true,
+        });
         if (result.stderr) {
             const lines = utils.splitLines(result.stderr);
 
-            possible = ClangParser.extractPossibleStdvers(lines);
+            possible = this.extractPossibleStdvers(lines);
             possible.sort((a, b) => {
                 return a.value === b.value ? 0 : a.value > b.value ? 1 : -1;
             });
@@ -449,8 +437,8 @@ export class ClangParser extends BaseParser {
     }
 
     static override async getPossibleTargets(compiler: BaseCompiler): Promise<string[]> {
-        const result = await compiler.execCompilerCached(compiler.compiler.exe, ClangParser.getTargetsHelpOptions());
-        return ClangParser.extractPossibleTargets(utils.splitLines(result.stdout));
+        const result = await compiler.execCompilerCached(compiler.compiler.exe, this.getTargetsHelpOptions());
+        return this.extractPossibleTargets(utils.splitLines(result.stdout));
     }
 
     static override async getOptions(compiler: BaseCompiler, helpArg: string, populate = true, isolate = false) {
@@ -461,7 +449,7 @@ export class ClangParser extends BaseParser {
         const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArg.split(' '), execOptions);
         const options =
             result.code === 0
-                ? ClangParser.parseLines(result.stdout + result.stderr, optionFinderWithDesc, optionFinderWithoutDesc)
+                ? this.parseLines(result.stdout + result.stderr, optionFinderWithDesc, optionFinderWithoutDesc)
                 : {};
         if (populate) compiler.possibleArguments.populateOptions(options);
         return options;
@@ -513,7 +501,7 @@ export class CircleParser extends ClangParser {
         const optionFinder1 = /^ +(--?[\w#,.<=>[\]|-]*) {2,}- (.*)/i;
         const optionFinder2 = /^ +(--?[\w#,.<=>[\]|-]*)/i;
         const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArg.split(' '));
-        const options = result.code === 0 ? CircleParser.parseLines(result.stdout, optionFinder1, optionFinder2) : {};
+        const options = result.code === 0 ? this.parseLines(result.stdout, optionFinder1, optionFinder2) : {};
         compiler.possibleArguments.populateOptions(options);
         return options;
     }
@@ -550,44 +538,44 @@ export class CircleParser extends ClangParser {
 
 export class LDCParser extends BaseParser {
     static override async setCompilerSettingsFromOptions(compiler: BaseCompiler, options: Record<string, Argument>) {
-        if (LDCParser.hasSupport(options, '--fsave-optimization-record')) {
+        if (this.hasSupport(options, '--fsave-optimization-record')) {
             compiler.compiler.optArg = '--fsave-optimization-record';
             compiler.compiler.supportsOptOutput = true;
         }
 
-        if (LDCParser.hasSupport(options, '-fverbose-asm')) {
+        if (this.hasSupport(options, '-fverbose-asm')) {
             compiler.compiler.supportsVerboseAsm = true;
         }
 
-        if (LDCParser.hasSupport(options, '--print-before-all') && LDCParser.hasSupport(options, '--print-after-all')) {
+        if (this.hasSupport(options, '--print-before-all') && this.hasSupport(options, '--print-after-all')) {
             compiler.compiler.optPipeline = {
                 arg: ['--print-before-all', '--print-after-all'],
                 moduleScopeArg: [],
                 noDiscardValueNamesArg: [],
             };
-            if (LDCParser.hasSupport(options, '--print-module-scope')) {
+            if (this.hasSupport(options, '--print-module-scope')) {
                 compiler.compiler.optPipeline.moduleScopeArg = ['--print-module-scope'];
             }
-            if (LDCParser.hasSupport(options, '--fno-discard-value-names')) {
+            if (this.hasSupport(options, '--fno-discard-value-names')) {
                 compiler.compiler.optPipeline.noDiscardValueNamesArg = ['--fno-discard-value-names'];
             }
         }
 
-        if (LDCParser.hasSupport(options, '--enable-color')) {
+        if (this.hasSupport(options, '--enable-color')) {
             compiler.compiler.options += ' --enable-color';
         }
     }
 
     static override async parse(compiler: BaseCompiler) {
-        const options = await LDCParser.getOptions(compiler, '--help-hidden');
-        LDCParser.setCompilerSettingsFromOptions(compiler, options);
+        const options = await this.getOptions(compiler, '--help-hidden');
+        this.setCompilerSettingsFromOptions(compiler, options);
         return compiler;
     }
 
     static override async getOptions(compiler: BaseCompiler, helpArg: string, populate = true) {
         const optionFinder = /^\s*(--?[\d+,<=>[\]a-z|-]*)\s*(.*)/i;
         const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArg.split(' '));
-        const options = result.code === 0 ? LDCParser.parseLines(result.stdout + result.stderr, optionFinder) : {};
+        const options = result.code === 0 ? this.parseLines(result.stdout + result.stderr, optionFinder) : {};
         if (populate) {
             compiler.possibleArguments.populateOptions(options);
         }
@@ -597,21 +585,21 @@ export class LDCParser extends BaseParser {
 
 export class ElixirParser extends BaseParser {
     static override async parse(compiler: BaseCompiler) {
-        await ElixirParser.getOptions(compiler, '--help');
+        await this.getOptions(compiler, '--help');
         return compiler;
     }
 }
 
 export class ErlangParser extends BaseParser {
     static override async parse(compiler: BaseCompiler) {
-        await ErlangParser.getOptions(compiler, '-help');
+        await this.getOptions(compiler, '-help');
         return compiler;
     }
 }
 
 export class PascalParser extends BaseParser {
     static override async parse(compiler: BaseCompiler) {
-        await PascalParser.getOptions(compiler, '-help');
+        await this.getOptions(compiler, '-help');
         return compiler;
     }
 }
@@ -619,11 +607,11 @@ export class PascalParser extends BaseParser {
 export class ICCParser extends GCCParser {
     static override async setCompilerSettingsFromOptions(compiler: BaseCompiler, options: Record<string, Argument>) {
         const keys = _.keys(options);
-        if (ICCParser.hasSupport(options, '-masm=')) {
+        if (this.hasSupport(options, '-masm=')) {
             compiler.compiler.intelAsm = '-masm=intel';
             compiler.compiler.supportsIntel = true;
         }
-        if (ICCParser.hasSupport(options, '-fdiagnostics-color')) {
+        if (this.hasSupport(options, '-fdiagnostics-color')) {
             if (compiler.compiler.options) compiler.compiler.options += ' ';
             compiler.compiler.options += '-fdiagnostics-color=always';
         }
@@ -631,9 +619,9 @@ export class ICCParser extends GCCParser {
             compiler.compiler.supportsGccDump = true;
             compiler.compiler.removeEmptyGccDump = true;
         }
-        if (ICCParser.hasSupportStartsWith(options, '-march=')) compiler.compiler.supportsMarch = true;
-        if (ICCParser.hasSupportStartsWith(options, '--target=')) compiler.compiler.supportsTargetIs = true;
-        if (ICCParser.hasSupportStartsWith(options, '--target ')) compiler.compiler.supportsTarget = true;
+        if (this.hasSupportStartsWith(options, '-march=')) compiler.compiler.supportsMarch = true;
+        if (this.hasSupportStartsWith(options, '--target=')) compiler.compiler.supportsTargetIs = true;
+        if (this.hasSupportStartsWith(options, '--target ')) compiler.compiler.supportsTarget = true;
     }
 
     static extractPossibleStdvers(lines: string[]): CompilerOverrideOptions {
@@ -673,35 +661,35 @@ export class ICCParser extends GCCParser {
         const result = await compiler.execCompilerCached(compiler.compiler.exe, ['--help']);
         const lines = utils.splitLines(result.stdout);
 
-        return ICCParser.extractPossibleStdvers(lines);
+        return this.extractPossibleStdvers(lines);
     }
 
     static override async parse(compiler: BaseCompiler) {
-        const results = await Promise.all([ICCParser.getOptions(compiler, '-fsyntax-only --help')]);
+        const results = await Promise.all([this.getOptions(compiler, '-fsyntax-only --help')]);
         const options = Object.assign({}, ...results);
-        await ICCParser.setCompilerSettingsFromOptions(compiler, options);
+        await this.setCompilerSettingsFromOptions(compiler, options);
         return compiler;
     }
 }
 
 export class ISPCParser extends BaseParser {
     static override async setCompilerSettingsFromOptions(compiler: BaseCompiler, options: Record<string, Argument>) {
-        if (ISPCParser.hasSupport(options, '--x86-asm-syntax')) {
+        if (this.hasSupport(options, '--x86-asm-syntax')) {
             compiler.compiler.intelAsm = '--x86-asm-syntax=intel';
             compiler.compiler.supportsIntel = true;
         }
     }
 
     static override async parse(compiler: BaseCompiler) {
-        const options = await ISPCParser.getOptions(compiler, '--help');
-        await ISPCParser.setCompilerSettingsFromOptions(compiler, options);
+        const options = await this.getOptions(compiler, '--help');
+        await this.setCompilerSettingsFromOptions(compiler, options);
         return compiler;
     }
 
     static override async getOptions(compiler: BaseCompiler, helpArg: string) {
         const result = await compiler.execCompilerCached(compiler.compiler.exe, [helpArg]);
         const optionFinder = /^\s*\[(--?[\d\s()+,/<=>a-z{|}-]*)]\s*(.*)/i;
-        const options = result.code === 0 ? ISPCParser.parseLines(result.stdout + result.stderr, optionFinder) : {};
+        const options = result.code === 0 ? this.parseLines(result.stdout + result.stderr, optionFinder) : {};
         compiler.possibleArguments.populateOptions(options);
         return options;
     }
@@ -709,28 +697,28 @@ export class ISPCParser extends BaseParser {
 
 export class JavaParser extends BaseParser {
     static override async parse(compiler: BaseCompiler) {
-        await JavaParser.getOptions(compiler, '-help');
+        await this.getOptions(compiler, '-help');
         return compiler;
     }
 }
 
 export class KotlinParser extends BaseParser {
     static override async parse(compiler: BaseCompiler) {
-        await KotlinParser.getOptions(compiler, '-help');
+        await this.getOptions(compiler, '-help');
         return compiler;
     }
 }
 
 export class ScalaParser extends BaseParser {
     static override async parse(compiler: BaseCompiler) {
-        await ScalaParser.getOptions(compiler, '-help');
+        await this.getOptions(compiler, '-help');
         return compiler;
     }
 }
 
 export class VCParser extends BaseParser {
     static override async parse(compiler: BaseCompiler) {
-        await VCParser.getOptions(compiler, '/help');
+        await this.getOptions(compiler, '/help');
         return compiler;
     }
 
@@ -822,13 +810,13 @@ export class VCParser extends BaseParser {
         const result = await compiler.execCompilerCached(compiler.compiler.exe, ['/help']);
         const lines = utils.splitLines(result.stdout);
 
-        return VCParser.extractPossibleStdvers(lines);
+        return this.extractPossibleStdvers(lines);
     }
 
     static override async getOptions(compiler: BaseCompiler, helpArg: string) {
         const result = await compiler.execCompilerCached(compiler.compiler.exe, [helpArg]);
         const optionFinder = /^\s*(\/[\w#+,.:<=>[\]{|}-]*)\s*(.*)/i;
-        const options = result.code === 0 ? VCParser.parseLines(result.stdout, optionFinder) : {};
+        const options = result.code === 0 ? this.parseLines(result.stdout, optionFinder) : {};
         compiler.possibleArguments.populateOptions(options);
         return options;
     }
@@ -836,22 +824,22 @@ export class VCParser extends BaseParser {
 
 export class RustParser extends BaseParser {
     static override async setCompilerSettingsFromOptions(compiler: BaseCompiler, options: Record<string, Argument>) {
-        if (RustParser.hasSupport(options, '--color')) {
+        if (this.hasSupport(options, '--color')) {
             if (compiler.compiler.options) compiler.compiler.options += ' ';
             compiler.compiler.options += '--color=always';
         }
-        if (RustParser.hasSupportStartsWith(options, '--target=')) compiler.compiler.supportsTargetIs = true;
-        if (RustParser.hasSupportStartsWith(options, '--target ')) compiler.compiler.supportsTarget = true;
+        if (this.hasSupportStartsWith(options, '--target=')) compiler.compiler.supportsTargetIs = true;
+        if (this.hasSupportStartsWith(options, '--target ')) compiler.compiler.supportsTarget = true;
     }
 
     static override async parse(compiler: BaseCompiler) {
         const results = await Promise.all([
-            RustParser.getOptions(compiler, '--help'),
-            RustParser.getOptions(compiler, '-C help'),
-            RustParser.getOptions(compiler, '--help -v'),
+            this.getOptions(compiler, '--help'),
+            this.getOptions(compiler, '-C help'),
+            this.getOptions(compiler, '--help -v'),
         ]);
         const options = Object.assign({}, ...results);
-        await RustParser.setCompilerSettingsFromOptions(compiler, options);
+        await this.setCompilerSettingsFromOptions(compiler, options);
         return compiler;
     }
 
@@ -929,9 +917,9 @@ export class RustParser extends BaseParser {
             if (helpArg === '-C help') {
                 const optionFinder = /^\s*(-c\s*[\d=a-z-]*)\s--\s(.*)/i;
 
-                options = RustParser.parseLines(result.stdout + result.stderr, optionFinder);
+                options = this.parseLines(result.stdout + result.stderr, optionFinder);
             } else {
-                options = RustParser.parseRustHelpLines(result.stdout + result.stderr);
+                options = this.parseRustHelpLines(result.stdout + result.stderr);
             }
         }
         compiler.possibleArguments.populateOptions(options);
@@ -941,29 +929,36 @@ export class RustParser extends BaseParser {
 
 export class ZksolcParser extends RustParser {
     static override async parse(compiler: BaseCompiler) {
-        const options = await ZksolcParser.getOptions(compiler, '--help');
-        await ZksolcParser.setCompilerSettingsFromOptions(compiler, options);
+        const options = await this.getOptions(compiler, '--help');
+        await this.setCompilerSettingsFromOptions(compiler, options);
         return compiler;
     }
 }
 
 export class MrustcParser extends BaseParser {
     static override async parse(compiler: BaseCompiler) {
-        await MrustcParser.getOptions(compiler, '--help');
+        await this.getOptions(compiler, '--help');
+        return compiler;
+    }
+}
+
+export class C2RustParser extends BaseParser {
+    static override async parse(compiler: BaseCompiler) {
+        await C2RustParser.getOptions(compiler, '--help');
         return compiler;
     }
 }
 
 export class NimParser extends BaseParser {
     static override async parse(compiler: BaseCompiler) {
-        await NimParser.getOptions(compiler, '-help');
+        await this.getOptions(compiler, '-help');
         return compiler;
     }
 }
 
 export class CrystalParser extends BaseParser {
     static override async parse(compiler: BaseCompiler) {
-        await CrystalParser.getOptions(compiler, 'build');
+        await this.getOptions(compiler, 'build');
         return compiler;
     }
 }
@@ -971,7 +966,7 @@ export class CrystalParser extends BaseParser {
 export class TableGenParser extends BaseParser {
     static async getPossibleActions(compiler: BaseCompiler): Promise<CompilerOverrideOptions> {
         const result = await compiler.execCompilerCached(compiler.compiler.exe, ['--help']);
-        return TableGenParser.extractPossibleActions(utils.splitLines(result.stdout));
+        return this.extractPossibleActions(utils.splitLines(result.stdout));
     }
 
     static extractPossibleActions(lines: string[]): CompilerOverrideOptions {
@@ -1005,21 +1000,21 @@ export class TableGenParser extends BaseParser {
 
 export class TypeScriptNativeParser extends BaseParser {
     static override async parse(compiler: BaseCompiler) {
-        await TypeScriptNativeParser.getOptions(compiler, '--help');
+        await this.getOptions(compiler, '--help');
         return compiler;
     }
 }
 
 export class TurboCParser extends BaseParser {
     static override async parse(compiler: BaseCompiler) {
-        await TurboCParser.getOptions(compiler, '');
+        await this.getOptions(compiler, '');
         return compiler;
     }
 }
 
 export class ToitParser extends BaseParser {
     static override async parse(compiler: BaseCompiler) {
-        await ToitParser.getOptions(compiler, '-help');
+        await this.getOptions(compiler, '-help');
         return compiler;
     }
 }
@@ -1032,13 +1027,13 @@ export class JuliaParser extends BaseParser {
             compiler.compilerWrapperPath,
             helpArg,
         ]);
-        const options = result.code === 0 ? JuliaParser.parseLines(result.stdout + result.stderr, optionFinder) : {};
+        const options = result.code === 0 ? this.parseLines(result.stdout + result.stderr, optionFinder) : {};
         compiler.possibleArguments.populateOptions(options);
         return options;
     }
 
     static override async parse(compiler: JuliaCompiler) {
-        await JuliaParser.getOptions(compiler, '--help');
+        await this.getOptions(compiler, '--help');
         return compiler;
     }
 }
@@ -1059,7 +1054,7 @@ export class Z88dkParser extends BaseParser {
 
 export class WasmtimeParser extends BaseParser {
     static override async parse(compiler: BaseCompiler) {
-        await WasmtimeParser.getOptions(compiler, '--help');
+        await this.getOptions(compiler, '--help');
         return compiler;
     }
 }
@@ -1108,12 +1103,12 @@ export class FlangParser extends ClangParser {
     }
 
     static override async setCompilerSettingsFromOptions(compiler: BaseCompiler, options: Record<string, Argument>) {
-        ClangParser.setCompilerSettingsFromOptions(compiler, options);
+        super.setCompilerSettingsFromOptions(compiler, options);
 
         // flang does not allow -emit-llvm to be used as it is with clang
         // as -Xflang -emit-llvm. Instead you just give -emit-llvm to flang
         // directly.
-        if (FlangParser.hasSupport(options, '-emit-llvm')) {
+        if (this.hasSupport(options, '-emit-llvm')) {
             compiler.compiler.supportsIrView = true;
             compiler.compiler.irArg = ['-emit-llvm'];
             compiler.compiler.minIrArgs = ['-emit-llvm'];
@@ -1148,9 +1143,9 @@ export class FlangParser extends ClangParser {
 
 export class GHCParser extends GCCParser {
     static override async parse(compiler: BaseCompiler) {
-        const results = await Promise.all([GHCParser.getOptions(compiler, '--help')]);
+        const results = await Promise.all([this.getOptions(compiler, '--help')]);
         const options = Object.assign({}, ...results);
-        await GHCParser.setCompilerSettingsFromOptions(compiler, options);
+        await this.setCompilerSettingsFromOptions(compiler, options);
         return compiler;
     }
 
@@ -1158,7 +1153,7 @@ export class GHCParser extends GCCParser {
         const optionFinder1 = /^ {4}(-[\w[\]]+)\s+(.*)/i;
         const optionFinder2 = /^ {4}(-[\w[\]]+)/;
         const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArg.split(' '));
-        const options = result.code === 0 ? GHCParser.parseLines(result.stdout, optionFinder1, optionFinder2) : {};
+        const options = result.code === 0 ? this.parseLines(result.stdout, optionFinder1, optionFinder2) : {};
 
         compiler.possibleArguments.populateOptions(options);
         return options;
@@ -1167,9 +1162,9 @@ export class GHCParser extends GCCParser {
 
 export class SwiftParser extends ClangParser {
     static override async parse(compiler: BaseCompiler) {
-        const results = await Promise.all([SwiftParser.getOptions(compiler, '--help')]);
+        const results = await Promise.all([this.getOptions(compiler, '--help')]);
         const options = Object.assign({}, ...results);
-        SwiftParser.setCompilerSettingsFromOptions(compiler, options);
+        this.setCompilerSettingsFromOptions(compiler, options);
         return compiler;
     }
 
@@ -1184,16 +1179,16 @@ export class SwiftParser extends ClangParser {
 
 export class TendraParser extends GCCParser {
     static override async parse(compiler: BaseCompiler) {
-        const results = await Promise.all([TendraParser.getOptions(compiler, '--help')]);
+        const results = await Promise.all([this.getOptions(compiler, '--help')]);
         const options = Object.assign({}, ...results);
-        await TendraParser.setCompilerSettingsFromOptions(compiler, options);
+        await this.setCompilerSettingsFromOptions(compiler, options);
         return compiler;
     }
 
     static override async getOptions(compiler: BaseCompiler, helpArg: string) {
         const optionFinder = /^ *(-[\d#+,<=>[\]a-z|-]* ?[\d+,<=>[\]a-z|-]*) : +(.*)/i;
         const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArg.split(' '));
-        const options = TendraParser.parseLines(result.stdout + result.stderr, optionFinder);
+        const options = this.parseLines(result.stdout + result.stderr, optionFinder);
         compiler.possibleArguments.populateOptions(options);
         return options;
     }
@@ -1214,13 +1209,10 @@ export class GolangParser extends GCCParser {
 
     static override async parse(compiler: BaseCompiler) {
         const results = await Promise.all([
-            GolangParser.getOptions(
-                compiler,
-                'build -o ./output.s "-gcflags=-S --help" ' + GolangParser.getExampleFilepath(),
-            ),
+            this.getOptions(compiler, 'build -o ./output.s "-gcflags=-S --help" ' + this.getExampleFilepath()),
         ]);
         const options = Object.assign({}, ...results);
-        await GolangParser.setCompilerSettingsFromOptions(compiler, options);
+        await this.setCompilerSettingsFromOptions(compiler, options);
         return compiler;
     }
 
@@ -1231,7 +1223,7 @@ export class GolangParser extends GCCParser {
             ...compiler.getDefaultExecOptions(),
             createAndUseTempDir: true,
         });
-        const options = GolangParser.parseLines(result.stdout + result.stderr, optionFinder1, optionFinder2);
+        const options = this.parseLines(result.stdout + result.stderr, optionFinder1, optionFinder2);
         compiler.possibleArguments.populateOptions(options);
         return options;
     }
@@ -1244,7 +1236,7 @@ export class GnuCobolParser extends GCCParser {
 
     static override async getPossibleStdvers(compiler: BaseCompiler): Promise<CompilerOverrideOptions> {
         const possible: CompilerOverrideOptions = [];
-        const options = await GnuCobolParser.getOptionsStrict(compiler, GnuCobolParser.getLanguageSpecificHelpFlags());
+        const options = await this.getOptionsStrict(compiler, this.getLanguageSpecificHelpFlags());
         for (const opt in options) {
             if (opt.startsWith('-std=')) {
                 const vers = options[opt].description
@@ -1267,16 +1259,16 @@ export class GnuCobolParser extends GCCParser {
 
 export class MadpascalParser extends GCCParser {
     static override async parse(compiler: BaseCompiler) {
-        const results = await Promise.all([MadpascalParser.getOptions(compiler, '')]);
+        const results = await Promise.all([this.getOptions(compiler, '')]);
         const options = Object.assign({}, ...results);
-        await MadpascalParser.setCompilerSettingsFromOptions(compiler, options);
+        await this.setCompilerSettingsFromOptions(compiler, options);
         return compiler;
     }
 
     static override async getOptions(compiler: BaseCompiler, helpArg: string) {
         const optionFinder = /^(-[\w:<>]*) *(.*)/i;
         const result = await compiler.execCompilerCached(compiler.compiler.exe, []);
-        const options = MadpascalParser.parseLines(result.stdout + result.stderr, optionFinder);
+        const options = this.parseLines(result.stdout + result.stderr, optionFinder);
         compiler.possibleArguments.populateOptions(options);
         return options;
     }
@@ -1292,7 +1284,7 @@ export class MadpascalParser extends GCCParser {
 
 export class GlslangParser extends BaseParser {
     static override async parse(compiler: BaseCompiler) {
-        await GlslangParser.getOptions(compiler, '--help');
+        await this.getOptions(compiler, '--help');
         return compiler;
     }
 
@@ -1301,7 +1293,7 @@ export class GlslangParser extends BaseParser {
         const optionFinder2 = /^ *(--?[\d#+,<=>[\]a-z|-]* ?[\d+,<=>[\]a-z|-]*)/i;
         const result = await compiler.execCompilerCached(compiler.compiler.exe, [helpArg]);
         // glslang will return a return code of 1 when calling --help (since it means nothing was compiled)
-        const options = GlslangParser.parseLines(result.stdout + result.stderr, optionFinder1, optionFinder2);
+        const options = this.parseLines(result.stdout + result.stderr, optionFinder1, optionFinder2);
         compiler.possibleArguments.populateOptions(options);
         return options;
     }
diff --git a/lib/compilers/c2rust.ts b/lib/compilers/c2rust.ts
new file mode 100644
index 000000000..5300e25e6
--- /dev/null
+++ b/lib/compilers/c2rust.ts
@@ -0,0 +1,61 @@
+import path from 'node:path';
+
+import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';
+import {BaseCompiler} from '../base-compiler.js';
+
+import {ParsedAsmResult} from '../../types/asmresult/asmresult.interfaces.js';
+import {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
+import {CompilationEnvironment} from '../compilation-env.js';
+import {IAsmParser} from '../parsers/asm-parser.interfaces.js';
+import {AsmRegex} from '../parsers/asmregex.js';
+import * as utils from '../utils.js';
+import {C2RustParser} from './argument-parsers.js';
+
+// Simple parser that only does bare minimum, handling whitespace. In particular, Rust
+// comments `#[]` etc are important, and as this isn't even slightly "assembly" we don't
+// try and do anything like "dead code removal".
+class NoOpParser implements IAsmParser {
+    process(asmResult: string, filters: ParseFiltersAndOutputOptions): ParsedAsmResult {
+        let asmLines = utils.splitLines(asmResult);
+        if (filters.preProcessLines !== undefined) {
+            asmLines = filters.preProcessLines(asmLines);
+        }
+        const asm = asmLines.map(line => {
+            line = utils.expandTabs(line);
+
+            const text = AsmRegex.filterAsmLine(line, filters);
+
+            return {text, source: null, labels: []};
+        });
+
+        return {asm};
+    }
+}
+
+export class C2RustCompiler extends BaseCompiler {
+    static get key() {
+        return 'c2rust';
+    }
+
+    constructor(compilerInfo: PreliminaryCompilerInfo, env: CompilationEnvironment) {
+        super(compilerInfo, env);
+
+        this.asm = new NoOpParser();
+    }
+
+    override optionsForFilter(filters: ParseFiltersAndOutputOptions, outputFilename: string) {
+        return ['transpile'];
+    }
+
+    override getArgumentParserClass() {
+        return C2RustParser;
+    }
+
+    override getCompilerResultLanguageId(filters?: ParseFiltersAndOutputOptions): string | undefined {
+        return 'rust';
+    }
+
+    override getOutputFilename(dirPath: string) {
+        return path.join(dirPath, 'example.rs');
+    }
+}
diff --git a/lib/compilers/dotnet.ts b/lib/compilers/dotnet.ts
index 2b7d594ad..bad334c6f 100644
--- a/lib/compilers/dotnet.ts
+++ b/lib/compilers/dotnet.ts
@@ -721,6 +721,7 @@ do()
         } else if (isAot) {
             const ilcResult = await this.runIlc(
                 this.ilcPath,
+                codegenArch,
                 execOptions,
                 programDllPath,
                 toolOptions,
@@ -906,6 +907,7 @@ do()
 
     async runIlc(
         compiler: string,
+        arch: string,
         execOptions: ExecutionOptions,
         dllPath: string,
         options: string[],
@@ -919,7 +921,7 @@ do()
             '-r',
             this.disassemblyLoaderPath,
             '-r',
-            path.join(this.clrBuildDir, 'aotsdk', '*.dll'),
+            path.join(this.clrBuildDir, 'aotsdk', arch, '*.dll'),
             '-r',
             path.join(this.clrBuildDir, '*.dll'),
             '--initassembly:System.Private.CoreLib',
diff --git a/lib/compilers/rust.ts b/lib/compilers/rust.ts
index ee77a612e..0f8a85022 100644
--- a/lib/compilers/rust.ts
+++ b/lib/compilers/rust.ts
@@ -22,8 +22,8 @@
 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 // POSSIBILITY OF SUCH DAMAGE.
 
+import {readdirSync} from 'node:fs';
 import path from 'node:path';
-
 import {SemVer} from 'semver';
 import _ from 'underscore';
 
@@ -62,6 +62,10 @@ export class RustCompiler extends BaseCompiler {
         // are only available for Nightly
         this.compiler.supportsRustMacroExpView = isNightly;
         this.compiler.supportsRustHirView = isNightly;
+        if (this.compiler.name === 'rustc nightly') {
+            this.compiler.supportsOptOutput = true;
+            // not setting compiler.optArg, overriding prepareOptRemarksArgs instead (2 args needed)
+        }
 
         this.compiler.irArg = ['--emit', 'llvm-ir'];
         this.compiler.minIrArgs = ['--emit=llvm-ir'];
@@ -245,6 +249,23 @@ export class RustCompiler extends BaseCompiler {
         return opts;
     }
 
+    override getOptYamlPath(dirPath: string, outputFilebase: string): string {
+        // Find a file in dirPath that ends with codegen.opt.yaml, and return it
+        // A bit of a hack, but it works for now
+        const files = readdirSync(dirPath);
+        for (const file of files) {
+            if (file.endsWith('codegen.opt.yaml')) {
+                return path.join(dirPath, file);
+            }
+        }
+        return '';
+    }
+
+    override prepareOptRemarksArgs(options: string[], outputFilename: string): string[] {
+        const outputDir = path.dirname(outputFilename);
+        return options.concat(['-Cremark=all', `-Zremark-dir=${outputDir}`]);
+    }
+
     override optionsForFilter(filters: ParseFiltersAndOutputOptions, outputFilename: string, userOptions?: string[]) {
         let options = ['-C', 'debuginfo=2', '-o', this.filename(outputFilename)];
 
diff --git a/lib/runtime-tools/heaptrack-wrapper.ts b/lib/runtime-tools/heaptrack-wrapper.ts
index 8db6290f6..382cf5187 100644
--- a/lib/runtime-tools/heaptrack-wrapper.ts
+++ b/lib/runtime-tools/heaptrack-wrapper.ts
@@ -24,6 +24,7 @@
 
 import {WriteStream, createWriteStream} from 'node:fs';
 import {constants as fsConstants} from 'node:fs';
+import * as oldfs from 'node:fs';
 import * as fs from 'node:fs/promises';
 import * as net from 'node:net';
 import path from 'node:path';
@@ -111,7 +112,7 @@ export class HeaptrackWrapper extends BaseRuntimeTool {
         return this.execFunc(this.interpreter, [this.rawOutput], execOptions);
     }
 
-    private async finishPipesAndStreams(fd: fs.FileHandle, file: WriteStream, socket: net.Socket) {
+    private async finishPipesAndStreams(fd: number, file: WriteStream, socket: net.Socket) {
         socket.push(null);
         await new Promise(resolve => socket.end(() => resolve(true)));
 
@@ -129,7 +130,7 @@ export class HeaptrackWrapper extends BaseRuntimeTool {
             });
         });
 
-        await fd.close();
+        return new Promise(resolve => oldfs.close(fd, () => resolve(true)));
     }
 
     private async interpretAndSave(execOptions: ExecutionOptions, result: UnprocessedExecResult) {
@@ -168,8 +169,8 @@ export class HeaptrackWrapper extends BaseRuntimeTool {
 
         await this.makePipe();
 
-        const fd = await fs.open(this.pipe, O_NONBLOCK | fsConstants.O_RDWR);
-        const socket = new net.Socket({fd: fd.fd, readable: true, writable: true});
+        const fd = oldfs.openSync(this.pipe, O_NONBLOCK | fsConstants.O_RDWR);
+        const socket = new net.Socket({fd: fd, readable: true, writable: true});
 
         const file = createWriteStream(this.rawOutput);
         pipeline(socket, file, err => {
diff --git a/lib/tooling/osaca-tool.ts b/lib/tooling/osaca-tool.ts
index 513a348b4..07c691c1e 100644
--- a/lib/tooling/osaca-tool.ts
+++ b/lib/tooling/osaca-tool.ts
@@ -47,10 +47,6 @@ export class OSACATool extends BaseTool {
             return this.createErrorResponse('<cannot run analysis on binary>');
         }
 
-        if (compilationInfo.filters.intel) {
-            return this.createErrorResponse('<cannot run analysis on Intel assembly>');
-        }
-
         const rewrittenOutputFilename = compilationInfo.outputFilename + '.osaca';
         await this.writeAsmFile(
             compilationInfo.asmParser,
diff --git a/package-lock.json b/package-lock.json
index c7ab8f6b5..30beb9b95 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5913,9 +5913,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001701",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001701.tgz",
-      "integrity": "sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==",
+      "version": "1.0.30001707",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz",
+      "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==",
       "funding": [
         {
           "type": "opencollective",
@@ -13640,9 +13640,9 @@
       "license": "MIT"
     },
     "node_modules/vite": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.0.tgz",
-      "integrity": "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==",
+      "version": "6.2.6",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.6.tgz",
+      "integrity": "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
diff --git a/static/panes/gccdump-view.ts b/static/panes/gccdump-view.ts
index 6e3b2eda7..41d0a803f 100644
--- a/static/panes/gccdump-view.ts
+++ b/static/panes/gccdump-view.ts
@@ -230,6 +230,17 @@ export class GccDump extends MonacoPane<monaco.editor.IStandaloneCodeEditor, Gcc
             // Prevent overflowing the window
             const dropdown = this.selectize.dropdown_content;
             dropdown.style.maxHeight = `${window.innerHeight - dropdown.getBoundingClientRect().top - 10}px`;
+            if (!this.selectedPass) return;
+            const activeOption = Object.entries(this.selectize.options).find(
+                op => op[1].filename_suffix === this.selectedPass,
+            );
+            const selectedPassId = activeOption![0];
+            const option = this.selectize.getOption(selectedPassId);
+            // Workaround for a TomSelect glitch: onFocus sets the active option to the first one
+            // on the first re-open, so this setActiveOption call needs to be delayed.
+            setTimeout(() => {
+                this.selectize.setActiveOption(option);
+            }, 0);
         });
         this.selectize.on('dropdown_close', () => {
             // scroll back to the selection on the next open


Test patch:
diff --git a/.github/workflows/test-and-deploy.yml b/.github/workflows/test-and-deploy.yml
index 0c3682ce3..68cca8af7 100644
--- a/.github/workflows/test-and-deploy.yml
+++ b/.github/workflows/test-and-deploy.yml
@@ -35,7 +35,7 @@ jobs:
           verbose: true
 
   build_minimum_support:
-    runs-on: ubuntu-20.04
+    runs-on: ubuntu-22.04
     steps:
       - name: Checkout repository
         uses: actions/checkout@v4