Repository: compiler-explorer/compiler-explorer
Pull request #7259 (2025-01-11 10:40:12)

upgrade mimic++ header-only library
Adds v4, v5 and v6.

related to: [compiler-explorer/infra](https://github.com/compiler-explorer/infra/pull/1490)


Patch:
diff --git a/.gitignore b/.gitignore
index c07048d01..eb2632812 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,7 @@
 
 # IDE project files
 /.idea/shelf
+/.vs
 /nbproject
 *.vscode
 *.code-workspace
diff --git a/.idea/runConfigurations/Local_instance.xml b/.idea/runConfigurations/Local_instance.xml
index 827015b12..6a74fd3e6 100644
--- a/.idea/runConfigurations/Local_instance.xml
+++ b/.idea/runConfigurations/Local_instance.xml
@@ -1,5 +1,5 @@
 <component name="ProjectRunConfigurationManager">
-  <configuration default="false" name="Local instance" type="NodeJSConfigurationType" path-to-node="/opt/compiler-explorer/node/bin/node" node-parameters="--loader ts-node/esm" path-to-js-file="app.ts" working-dir="$PROJECT_DIR$">
+  <configuration default="false" name="Local instance" type="NodeJSConfigurationType" path-to-node="/opt/compiler-explorer/node/bin/node" path-to-js-file="app.ts" typescript-loader="bundled" working-dir="$PROJECT_DIR$">
     <method v="2" />
   </configuration>
 </component>
\ No newline at end of file
diff --git a/.idea/runConfigurations/Local_instance_C___only.xml b/.idea/runConfigurations/Local_instance_C___only.xml
index 8f5d5597b..c256ad3b6 100644
--- a/.idea/runConfigurations/Local_instance_C___only.xml
+++ b/.idea/runConfigurations/Local_instance_C___only.xml
@@ -1,5 +1,5 @@
 <component name="ProjectRunConfigurationManager">
-  <configuration default="false" name="Local instance C++ only" type="NodeJSConfigurationType" application-parameters=" --language c++" path-to-node="/opt/compiler-explorer/node/bin/node" node-parameters="--loader ts-node/esm" path-to-js-file="app.ts" working-dir="$PROJECT_DIR$">
+  <configuration default="false" name="Local instance C++ only" type="NodeJSConfigurationType" application-parameters=" --language c++" path-to-node="/opt/compiler-explorer/node/bin/node" path-to-js-file="app.ts" typescript-loader="bundled" working-dir="$PROJECT_DIR$">
     <method v="2" />
   </configuration>
 </component>
\ No newline at end of file
diff --git a/docs/WindowsLocal.properties b/docs/WindowsLocal.properties
index cb830f712..8f923d3ea 100644
--- a/docs/WindowsLocal.properties
+++ b/docs/WindowsLocal.properties
@@ -3,16 +3,16 @@
 # you can set it up in that compiler's config, with, say
 # compiler.my_clang.includePath=path_to_libc++
 
-includePath=C:\Program Files (x86)\Microsoft Visual Studio\Preview\Enterprise\VC\Tools\MSVC\14.15.26608\ATLMFC\include;C:\Program Files (x86)\Microsoft Visual Studio\Preview\Enterprise\VC\Tools\MSVC\14.15.26608\include;C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt;C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\shared;C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\um;C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\winrt;C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\cppwinrt
+includePath=c:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.42.34433\include;c:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.42.34433\ATLMFC\include;c:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include;C:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\ucrt;C:\Program Files (x86)\Windows Kits\10\\include\10.0.22621.0\\um;C:\Program Files (x86)\Windows Kits\10\\include\10.0.22621.0\\shared;C:\Program Files (x86)\Windows Kits\10\\include\10.0.22621.0\\winrt;C:\Program Files (x86)\Windows Kits\10\\include\10.0.22621.0\\cppwinrt;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um
 
 # replace with the result of `where undname.exe` from a developer command prompt
 
-demangler=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\Hostx64\x64\undname.exe
-
+demangler=C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.42.34433\bin\Hostx64\x64\undname.exe
+demanglerType=win32
 
 # the compiler you want compiler explorer to start up in
 
-defaultCompiler=vc2017_64
+defaultCompiler=vc2022_64
 
 
 # note: adding new compiler groups
@@ -22,27 +22,36 @@ defaultCompiler=vc2017_64
 # you can uncomment and edit the following lines.
 # check `c++.win32.properties` for how to modify the group options
 
-compilers=&vc2017:&clang
+compilers=&vc2022:&clang
 
-group.vc2017.compilers=vc2017_32:vc2017_64
-group.vc2017.options=-EHsc
-group.vc2017.compilerType=win32-vc
-group.vc2017.needsMulti=false
-group.vc2017.includeFlag=/I
-group.vc2017.versionFlag=/?
-group.vc2017.versionRe=^.*Microsoft \(R\).*$
-group.vc2017.groupName=Visual Studio MSVC
 
-group.clang.compilers=clang_32:clang_64
+# visual C++ 2022 compilers
+# follow the same instructions as for clang
+# note that if CE doesn't find a compiler, it won't break anything
+
+group.vc2022.compilers=vc2022_32:vc2022_64
+group.vc2022.options=-EHsc
+group.vc2022.compilerType=win32-vc
+group.vc2022.needsMulti=false
+group.vc2022.includeFlag=/I
+group.vc2022.versionFlag=/?
+group.vc2022.versionRe=^.*Microsoft \(R\).*$
+group.vc2022.groupName=Visual Studio MSVC
+
+# these are pointed at my own installation;
+# you'll likely have to change the paths for your own machine
+
+compiler.vc2022_32.exe=C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.42.34433\bin\Hostx64\x86\cl.exe
+compiler.vc2022_32.name=VC 2022 x86
+
+compiler.vc2022_64.exe=C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.42.34433\bin\Hostx64\x64\cl.exe
+compiler.vc2022_64.name=VC 2022 amd64
 
 
 # clang compilers
 # if you want more compilers, you can do that by separating the names with `:`
 # and then setting up a compiler.my_clang.exe and compiler.my_clang.name
-
-group.clang_32.compilers=clang_32
-group.clang_64.compilers=clang_64
-
+group.clang.compilers=clang_32:clang_64
 
 # this is the default path that clang++ is installed in
 # if you installed it somewhere else, you should edit both variables
@@ -53,23 +62,3 @@ compiler.clang_32.name=clang x86
 compiler.clang_64.exe=C:\Program Files\LLVM\bin\clang++.exe
 compiler.clang_64.name=clang amd64
 
-# visual C++ 2017 compilers
-# follow the same instructions as for clang
-# note that if CE doesn't find a compiler, it won't break anything
-
-group.vc2017_32.compilers=vc2017_32:vc2017_32_preview
-group.vc2017_64.compilers=vc2017_64:vc2017_64_preview
-
-
-# these are pointed at my own installation;
-# you'll likely have to change the paths for your own machine
-
-compiler.vc2017_32.exe=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\Hostx64\x86\cl.exe
-compiler.vc2017_32.name=VC 2017 x86
-compiler.vc2017_32_preview.exe=C:\Program Files (x86)\Microsoft Visual Studio\Preview\Enterprise\VC\Tools\MSVC\14.15.26608\bin\Hostx64\x86\cl.exe
-compiler.vc2017_32_preview.name=Preview VC 2017 x86
-
-compiler.vc2017_64.exe=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\Hostx64\x64\cl.exe
-compiler.vc2017_64.name=VC 2017 amd64
-compiler.vc2017_64_preview.exe=C:\Program Files (x86)\Microsoft Visual Studio\Preview\Enterprise\VC\Tools\MSVC\14.15.26608\bin\Hostx64\x64\cl.exe
-compiler.vc2017_64_preview.name=Preview VC 2017 amd64
diff --git a/docs/WindowsNative.md b/docs/WindowsNative.md
index b3fd75982..58c98fc78 100644
--- a/docs/WindowsNative.md
+++ b/docs/WindowsNative.md
@@ -60,7 +60,6 @@ attaching to an instance of CE that was launched with `npm run-script debugger`
       "name": "Attach to Process",
       "port": 9229,
       "address": "localhost",
-      "protocol": "inspector",
       "localRoot": "${workspaceRoot}",
       "remoteRoot": "C:\\Users\\${username}\\compiler-explorer"
     }
diff --git a/docs/WindowsSubsystemForLinux.md b/docs/WindowsSubsystemForLinux.md
index c8a57e1c1..63eb81301 100644
--- a/docs/WindowsSubsystemForLinux.md
+++ b/docs/WindowsSubsystemForLinux.md
@@ -42,7 +42,7 @@ following commands from a bash shell:
 - `apt-get update` to make sure apt is up-to-date
 - `apt-get install build-essential libssl-dev`, though you probably have these already
 - Check https://github.com/creationix/nvm/releases for the latest NVM release, substituting it in the next command.
-- `curl https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash` to install NVM
+- `curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash` to install NVM
 - `source ~/.profile` to reload your profile, bringing NVM into your environment
 - `nvm ls-remote --lts` to show the latest long-term supported (LTS) version of node.js
 - `nvm install 10.15.3`, substituting the latest LTS version, to install node.js
@@ -87,44 +87,7 @@ CE only required a few changes in order to run properly under WSL. Those changes
 
 ## Debugging
 
-The only viable option for debugging under WSL is to use [VS Code](https://code.visualstudio.com). Because VS Code
-doesn't currently run natively under WSL, you have to attach to a running CE instance. The following is a `launch.json`
-that works for attaching to an instance of CE that was launched with the `--inspect` flag.
-
-```json
-{
-  "version": "0.2.0",
-  "configurations": [
-    {
-      "type": "node",
-      "request": "attach",
-      "name": "Attach to Process",
-      "port": "9229",
-      "address": "localhost",
-      "protocol": "inspector",
-      "localRoot": "${workspaceRoot}",
-      "remoteRoot": "/mnt/c/src/compiler-explorer"
-    }
-  ]
-}
-```
-
-Launch CE with `make NODE_ARGS="--inspect"` to have node listen on port 9229.
-
-Because you can only attach to the process, as opposed to launching the process, you're limited to `printf` debugging
-for startup code. Search the code for `logger.info` to see examples of how to `printf` debug.
-
-## MSVC setup
-
-TODO. There's no real MSVC setup at this point because there's no good way to pass the environment to an invocation of
-`CL.exe`. Just point the `properties` file at your compiler binary and hack on the `/I` options until something works.
-
-When I get this working in a generalized fashion, CE's config will expect that MSVC drops match the format used by the
-daily NuGet compiler drops at https://visualcpp.myget/org. (NuGet packages are just renamed ZIP files plus metadata so
-they make an easy distribution method for compiler toolset drops.)
-
-## Putting it all together
-
-This should be enough information to get you started running CE under WSL. If there's information that you wish you
-would have had, please submit a PR to document. If there's information you're lacking to get running, please enter an
-Issue on the CE repo or contact me directly.
+The only viable option for debugging under WSL is to use [VS Code](https://code.visualstudio.com). VSCode's 'Auto
+Attach' option works on wsl and is the easiest way to start debugging. Make sure 'Auto Attach' is on (it is by default),
+then at the VSCode terminal start an instance any way you prefer: `make` or `npm start` or similar. (`make` is required
+at least for the first run).
diff --git a/etc/config/c++.amazon.properties b/etc/config/c++.amazon.properties
index cb50e0737..5852846af 100644
--- a/etc/config/c++.amazon.properties
+++ b/etc/config/c++.amazon.properties
@@ -4991,7 +4991,7 @@ libs.mfem.versions.47.packagedheaders=true
 
 libs.mimicpp.name=mimic++
 libs.mimicpp.description=A modern and (mostly) macro free mocking framework.
-libs.mimicpp.versions=trunk:1:2:3
+libs.mimicpp.versions=trunk:1:2:3:4:5:6
 libs.mimicpp.url=https://github.com/DNKpp/mimicpp
 libs.mimicpp.versions.trunk.version=trunk
 libs.mimicpp.versions.trunk.path=/opt/compiler-explorer/libs/mimicpp/trunk/include
@@ -5001,6 +5001,12 @@ libs.mimicpp.versions.2.version=v2
 libs.mimicpp.versions.2.path=/opt/compiler-explorer/libs/mimicpp/v2/include
 libs.mimicpp.versions.3.version=v3
 libs.mimicpp.versions.3.path=/opt/compiler-explorer/libs/mimicpp/v3/include
+libs.mimicpp.versions.4.version=v4
+libs.mimicpp.versions.4.path=/opt/compiler-explorer/libs/mimicpp/v4/include
+libs.mimicpp.versions.5.version=v5
+libs.mimicpp.versions.5.path=/opt/compiler-explorer/libs/mimicpp/v5/include
+libs.mimicpp.versions.6.version=v6
+libs.mimicpp.versions.6.path=/opt/compiler-explorer/libs/mimicpp/v6/include
 
 libs.mlir.name=MLIR
 libs.mlir.description=MLIR
@@ -5184,7 +5190,7 @@ libs.pybind11.versions.2_11_1.path=/opt/compiler-explorer/libs/pybind11/v2.11.1/
 
 libs.python.name=Python
 libs.python.url=https://python.org
-libs.python.versions=359:3610:376:381
+libs.python.versions=359:3610:376:381:396:3100:3110:3121:3130
 libs.python.versions.359.version=3.5.9
 libs.python.versions.359.path=/opt/compiler-explorer/python-3.5.9/include/python3.5
 libs.python.versions.3610.version=3.6.10
@@ -5193,6 +5199,16 @@ libs.python.versions.376.version=3.7.6
 libs.python.versions.376.path=/opt/compiler-explorer/python-3.7.6/include/python3.7
 libs.python.versions.381.version=3.8.1
 libs.python.versions.381.path=/opt/compiler-explorer/python-3.8.1/include/python3.8
+libs.python.versions.396.version=3.9.6
+libs.python.versions.396.path=/opt/compiler-explorer/python-3.9.6/include/python3.9
+libs.python.versions.3100.version=3.10.0
+libs.python.versions.3100.path=/opt/compiler-explorer/python-3.10.0/include/python3.10
+libs.python.versions.3110.version=3.11.0
+libs.python.versions.3110.path=/opt/compiler-explorer/python-3.11.0/include/python3.11
+libs.python.versions.3121.version=3.12.1
+libs.python.versions.3121.path=/opt/compiler-explorer/python-3.12.1/include/python3.12
+libs.python.versions.3130.version=3.13.0
+libs.python.versions.3130.path=/opt/compiler-explorer/python-3.13.0/include/python3.13
 
 libs.qt.name=Qt
 libs.qt.url=https://www.qt.io
diff --git a/etc/config/c.amazon.properties b/etc/config/c.amazon.properties
index bec57413d..c1bf4e1f2 100644
--- a/etc/config/c.amazon.properties
+++ b/etc/config/c.amazon.properties
@@ -3577,7 +3577,7 @@ libs.openssl.versions.111g.libpath=/opt/compiler-explorer/libs/openssl/openssl_1
 
 libs.python.name=Python
 libs.python.url=https://python.org
-libs.python.versions=359:3610:376:381
+libs.python.versions=359:3610:376:381:396:3100:3110:3121:3130
 libs.python.versions.359.version=3.5.9
 libs.python.versions.359.path=/opt/compiler-explorer/python-3.5.9/include/python3.5
 libs.python.versions.3610.version=3.6.10
@@ -3586,6 +3586,16 @@ libs.python.versions.376.version=3.7.6
 libs.python.versions.376.path=/opt/compiler-explorer/python-3.7.6/include/python3.7
 libs.python.versions.381.version=3.8.1
 libs.python.versions.381.path=/opt/compiler-explorer/python-3.8.1/include/python3.8
+libs.python.versions.396.version=3.9.6
+libs.python.versions.396.path=/opt/compiler-explorer/python-3.9.6/include/python3.9
+libs.python.versions.3100.version=3.10.0
+libs.python.versions.3100.path=/opt/compiler-explorer/python-3.10.0/include/python3.10
+libs.python.versions.3110.version=3.11.0
+libs.python.versions.3110.path=/opt/compiler-explorer/python-3.11.0/include/python3.11
+libs.python.versions.3121.version=3.12.1
+libs.python.versions.3121.path=/opt/compiler-explorer/python-3.12.1/include/python3.12
+libs.python.versions.3130.version=3.13.0
+libs.python.versions.3130.path=/opt/compiler-explorer/python-3.13.0/include/python3.13
 
 libs.simde.name=SIMDe
 libs.simde.description=Implementations of SIMD instruction sets for systems which don't natively support them.
diff --git a/etc/config/circle.amazon.properties b/etc/config/circle.amazon.properties
index 6d7f48ee7..f6f238cbe 100644
--- a/etc/config/circle.amazon.properties
+++ b/etc/config/circle.amazon.properties
@@ -894,7 +894,7 @@ libs.pugixml.versions.1114.path=/opt/compiler-explorer/libs/pugixml/v1.11.4/src/
 
 libs.python.name=Python
 libs.python.url=https://python.org
-libs.python.versions=359:3610:376:381
+libs.python.versions=359:3610:376:381:396:3100:3110:3121:3130
 libs.python.versions.359.version=3.5.9
 libs.python.versions.359.path=/opt/compiler-explorer/python-3.5.9/include/python3.5
 libs.python.versions.3610.version=3.6.10
@@ -903,6 +903,16 @@ libs.python.versions.376.version=3.7.6
 libs.python.versions.376.path=/opt/compiler-explorer/python-3.7.6/include/python3.7
 libs.python.versions.381.version=3.8.1
 libs.python.versions.381.path=/opt/compiler-explorer/python-3.8.1/include/python3.8
+libs.python.versions.396.version=3.9.6
+libs.python.versions.396.path=/opt/compiler-explorer/python-3.9.6/include/python3.9
+libs.python.versions.3100.version=3.10.0
+libs.python.versions.3100.path=/opt/compiler-explorer/python-3.10.0/include/python3.10
+libs.python.versions.3110.version=3.11.0
+libs.python.versions.3110.path=/opt/compiler-explorer/python-3.11.0/include/python3.11
+libs.python.versions.3121.version=3.12.1
+libs.python.versions.3121.path=/opt/compiler-explorer/python-3.12.1/include/python3.12
+libs.python.versions.3130.version=3.13.0
+libs.python.versions.3130.path=/opt/compiler-explorer/python-3.13.0/include/python3.13
 
 libs.rangesv3.name=range-v3
 libs.rangesv3.versions=trunk:030:035:036:091:0100:0110
diff --git a/etc/config/elixir.defaults.properties b/etc/config/elixir.defaults.properties
index 6d585862c..5422b97d0 100644
--- a/etc/config/elixir.defaults.properties
+++ b/etc/config/elixir.defaults.properties
@@ -1,15 +1,23 @@
 # Default settings for Elixir
-compilers=&elixir
-compilerType=elixir
+compilers=&elixir:&elixirasm
+
 versionFlag=--short-version
 objdumper=
-instructionSet=beam
 
 group.elixir.compilers=elixirdefault
+group.elixir.compilerType=elixir
+group.elixir.instructionSet=beam
 compiler.elixirdefault.exe=/urs/bin/elixir
 compiler.elixirdefault.runtime=/urs/bin/elixir
 compiler.elixirdefault.name=elixirc default
 
+group.elixirasm.compilers=elixirasmdefault
+group.elixirasm.compilerType=elixirasm
+group.elixirasm.instructionSet=amd64
+compiler.elixirasmdefault.exe=/urs/bin/elixir
+compiler.elixirasmdefault.runtime=/urs/bin/elixir
+compiler.elixirasmdefault.name=elixirc default
+
 defaultCompiler=elixirdefault
 demangler=
 postProcess=
diff --git a/etc/config/gimple.amazon.properties b/etc/config/gimple.amazon.properties
index 90315dcea..60b4410f4 100644
--- a/etc/config/gimple.amazon.properties
+++ b/etc/config/gimple.amazon.properties
@@ -1616,7 +1616,7 @@ libs.openssl.versions.111g.libpath=/opt/compiler-explorer/libs/openssl/openssl_1
 
 libs.python.name=Python
 libs.python.url=https://python.org
-libs.python.versions=359:3610:376:381
+libs.python.versions=359:3610:376:381:396:3100:3110:3121:3130
 libs.python.versions.359.version=3.5.9
 libs.python.versions.359.path=/opt/compiler-explorer/python-3.5.9/include/python3.5
 libs.python.versions.3610.version=3.6.10
@@ -1625,6 +1625,16 @@ libs.python.versions.376.version=3.7.6
 libs.python.versions.376.path=/opt/compiler-explorer/python-3.7.6/include/python3.7
 libs.python.versions.381.version=3.8.1
 libs.python.versions.381.path=/opt/compiler-explorer/python-3.8.1/include/python3.8
+libs.python.versions.396.version=3.9.6
+libs.python.versions.396.path=/opt/compiler-explorer/python-3.9.6/include/python3.9
+libs.python.versions.3100.version=3.10.0
+libs.python.versions.3100.path=/opt/compiler-explorer/python-3.10.0/include/python3.10
+libs.python.versions.3110.version=3.11.0
+libs.python.versions.3110.path=/opt/compiler-explorer/python-3.11.0/include/python3.11
+libs.python.versions.3121.version=3.12.1
+libs.python.versions.3121.path=/opt/compiler-explorer/python-3.12.1/include/python3.12
+libs.python.versions.3130.version=3.13.0
+libs.python.versions.3130.path=/opt/compiler-explorer/python-3.13.0/include/python3.13
 
 libs.simde.name=SIMDe
 libs.simde.description=Implementations of SIMD instruction sets for systems which don't natively support them.
diff --git a/etc/config/ispc.amazon.properties b/etc/config/ispc.amazon.properties
index 475213481..639085c5a 100644
--- a/etc/config/ispc.amazon.properties
+++ b/etc/config/ispc.amazon.properties
@@ -1,54 +1,77 @@
 compilers=&ispc
 defaultCompiler=ispc1253
+objdumper=/opt/compiler-explorer/gcc-14.2.0/bin/objdump
 
 group.ispc.compilers=ispc1253:ispc1250:ispc1240:ispc1230:ispc1220:ispc1210:ispc1200:ispc1190:ispc1180:ispc1170:ispc1161:ispc1160:ispc1150:ispc1141:ispc1140:ispc1130:ispc1120:ispc1110:ispc1100:ispc192:ispc191:ispc-trunk
 group.ispc.isSemVer=true
 group.ispc.baseName=ispc
 compiler.ispc1253.exe=/opt/compiler-explorer/ispc-1.25.3/bin/ispc
 compiler.ispc1253.semver=1.25.3
+compiler.ispc1253.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc1250.exe=/opt/compiler-explorer/ispc-1.25.0/bin/ispc
 compiler.ispc1250.semver=1.25.0
+compiler.ispc1250.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc1240.exe=/opt/compiler-explorer/ispc-1.24.0/bin/ispc
 compiler.ispc1240.semver=1.24.0
+compiler.ispc1240.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc1230.exe=/opt/compiler-explorer/ispc-1.23.0/bin/ispc
 compiler.ispc1230.semver=1.23.0
+compiler.ispc1230.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc1220.exe=/opt/compiler-explorer/ispc-1.22.0/bin/ispc
 compiler.ispc1220.semver=1.22.0
+compiler.ispc1220.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc1210.exe=/opt/compiler-explorer/ispc-1.21.0/bin/ispc
 compiler.ispc1210.semver=1.21.0
+compiler.ispc1210.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc1200.exe=/opt/compiler-explorer/ispc-1.20.0/bin/ispc
 compiler.ispc1200.semver=1.20.0
+compiler.ispc1200.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc1190.exe=/opt/compiler-explorer/ispc-1.19.0/bin/ispc
 compiler.ispc1190.semver=1.19.0
+compiler.ispc1190.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc1180.exe=/opt/compiler-explorer/ispc-1.18.0/bin/ispc
 compiler.ispc1180.semver=1.18.0
+compiler.ispc1180.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc1170.exe=/opt/compiler-explorer/ispc-1.17.0/bin/ispc
 compiler.ispc1170.semver=1.17.0
+compiler.ispc1170.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc1161.exe=/opt/compiler-explorer/ispc-1.16.1/bin/ispc
 compiler.ispc1161.semver=1.16.1
+compiler.ispc1161.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc1160.exe=/opt/compiler-explorer/ispc-1.16.0/bin/ispc
 compiler.ispc1160.semver=1.16.0
+compiler.ispc1160.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc1150.exe=/opt/compiler-explorer/ispc-1.15.0/bin/ispc
 compiler.ispc1150.semver=1.15.0
+compiler.ispc1150.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc1141.exe=/opt/compiler-explorer/ispc-1.14.1/bin/ispc
 compiler.ispc1141.semver=1.14.1
+compiler.ispc1141.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc1140.exe=/opt/compiler-explorer/ispc-1.14.0/bin/ispc
 compiler.ispc1140.semver=1.14.0
+compiler.ispc1140.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc1130.exe=/opt/compiler-explorer/ispc-1.13.0/bin/ispc
 compiler.ispc1130.semver=1.13.0
+compiler.ispc1130.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc1120.exe=/opt/compiler-explorer/ispc-1.12.0/bin/ispc
 compiler.ispc1120.semver=1.12.0
+compiler.ispc1120.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc1110.exe=/opt/compiler-explorer/ispc-1.11.0/bin/ispc
 compiler.ispc1110.semver=1.11.0
+compiler.ispc1110.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc1100.exe=/opt/compiler-explorer/ispc-1.10.0/bin/ispc
 compiler.ispc1100.semver=1.10.0
+compiler.ispc1100.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc192.exe=/opt/compiler-explorer/ispc-1.9.2/ispc
 compiler.ispc192.semver=1.9.2
+compiler.ispc192.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc191.exe=/opt/compiler-explorer/ispc-1.9.1/ispc
 compiler.ispc191.semver=1.9.1
+compiler.ispc191.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc-trunk.exe=/opt/compiler-explorer/ispc-trunk/bin/ispc
 compiler.ispc-trunk.semver=(trunk)
 compiler.ispc-trunk.isNightly=true
+compiler.ispc-trunk.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 
 #################################
 #################################
diff --git a/etc/config/ispc.defaults.properties b/etc/config/ispc.defaults.properties
index c8e124747..cc2c9dc29 100644
--- a/etc/config/ispc.defaults.properties
+++ b/etc/config/ispc.defaults.properties
@@ -1,6 +1,10 @@
-supportsBinary=false
+supportsBinary=true
+supportsBinaryObject=true
+supportsExecute=true
 compilerType=ispc
-
+objdumper=objdump
+stubRe=\bmain\b
+stubText=extern "C" uniform int main() { return 0; }
 
 #################################
 #################################
diff --git a/etc/config/llvm.amazon.properties b/etc/config/llvm.amazon.properties
index c75f54cf6..8cec56218 100644
--- a/etc/config/llvm.amazon.properties
+++ b/etc/config/llvm.amazon.properties
@@ -1,4 +1,4 @@
-compilers=&irclang:&llc:&opt
+compilers=&irclang:&irhexagon-clang:&llc:&opt
 defaultCompiler=llctrunk
 
 demangler=/opt/compiler-explorer/gcc-14.2.0/bin/c++filt
@@ -61,6 +61,18 @@ compiler.irclang-assertions-trunk.exe=/opt/compiler-explorer/clang-assertions-tr
 compiler.irclang-assertions-trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.irclang-assertions-trunk.semver=(assertions trunk)
 
+group.irhexagon-clang.groupName=Hexagon clang
+group.irhexagon-clang.baseName=hexagon-clang
+group.irhexagon-clang.compilers=irhexagonclang1605
+group.irhexagon-clang.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
+group.irhexagon-clang.options=-x ir
+
+compiler.irhexagonclang1605.semver=16.0.5
+compiler.irhexagonclang1605.name=hexagon-clang 16.0.5
+compiler.irhexagonclang1605.exe=/opt/compiler-explorer/clang+llvm-16.0.5-cross-hexagon-unknown-linux-musl/x86_64-linux-gnu/bin/clang++
+compiler.irhexagonclang1605.compilerType=clang-hexagon
+compiler.irhexagonclang1605.compilerCategories=clang-hexagon
+
 group.llc.compilers=llc32:llc33:llc391:llc400:llc401:llc500:llc600:llc700:llc800:llc900:llc1000:llc1001:llc1100:llc1101:llc1200:llc1201:llc1300:llc1400:llc1500:llc1600:llc1701:llc1810:llc1910:llctrunk:llc-assertions-trunk
 group.llc.compilerType=llc
 group.llc.supportsExecute=false
diff --git a/etc/config/objc++.amazon.properties b/etc/config/objc++.amazon.properties
index 67a6ac7e9..0f9f115e6 100644
--- a/etc/config/objc++.amazon.properties
+++ b/etc/config/objc++.amazon.properties
@@ -1682,7 +1682,7 @@ libs.pugixml.versions.1114.path=/opt/compiler-explorer/libs/pugixml/v1.11.4/src/
 
 libs.python.name=Python
 libs.python.url=https://python.org
-libs.python.versions=359:3610:376:381
+libs.python.versions=359:3610:376:381:396:3100:3110:3121:3130
 libs.python.versions.359.version=3.5.9
 libs.python.versions.359.path=/opt/compiler-explorer/python-3.5.9/include/python3.5
 libs.python.versions.3610.version=3.6.10
@@ -1691,6 +1691,16 @@ libs.python.versions.376.version=3.7.6
 libs.python.versions.376.path=/opt/compiler-explorer/python-3.7.6/include/python3.7
 libs.python.versions.381.version=3.8.1
 libs.python.versions.381.path=/opt/compiler-explorer/python-3.8.1/include/python3.8
+libs.python.versions.396.version=3.9.6
+libs.python.versions.396.path=/opt/compiler-explorer/python-3.9.6/include/python3.9
+libs.python.versions.3100.version=3.10.0
+libs.python.versions.3100.path=/opt/compiler-explorer/python-3.10.0/include/python3.10
+libs.python.versions.3110.version=3.11.0
+libs.python.versions.3110.path=/opt/compiler-explorer/python-3.11.0/include/python3.11
+libs.python.versions.3121.version=3.12.1
+libs.python.versions.3121.path=/opt/compiler-explorer/python-3.12.1/include/python3.12
+libs.python.versions.3130.version=3.13.0
+libs.python.versions.3130.path=/opt/compiler-explorer/python-3.13.0/include/python3.13
 
 libs.rangesv3.name=range-v3
 libs.rangesv3.versions=trunk:030:035:036:091:0100:0110:0120
diff --git a/etc/config/objc.amazon.properties b/etc/config/objc.amazon.properties
index 0f52371bf..1256f1182 100644
--- a/etc/config/objc.amazon.properties
+++ b/etc/config/objc.amazon.properties
@@ -1024,7 +1024,7 @@ libs.openssl.versions.111g.libpath=/opt/compiler-explorer/libs/openssl/openssl_1
 
 libs.python.name=Python
 libs.python.url=https://python.org
-libs.python.versions=359:3610:376:381
+libs.python.versions=359:3610:376:381:396:3100:3110:3121:3130
 libs.python.versions.359.version=3.5.9
 libs.python.versions.359.path=/opt/compiler-explorer/python-3.5.9/include/python3.5
 libs.python.versions.3610.version=3.6.10
@@ -1033,6 +1033,16 @@ libs.python.versions.376.version=3.7.6
 libs.python.versions.376.path=/opt/compiler-explorer/python-3.7.6/include/python3.7
 libs.python.versions.381.version=3.8.1
 libs.python.versions.381.path=/opt/compiler-explorer/python-3.8.1/include/python3.8
+libs.python.versions.396.version=3.9.6
+libs.python.versions.396.path=/opt/compiler-explorer/python-3.9.6/include/python3.9
+libs.python.versions.3100.version=3.10.0
+libs.python.versions.3100.path=/opt/compiler-explorer/python-3.10.0/include/python3.10
+libs.python.versions.3110.version=3.11.0
+libs.python.versions.3110.path=/opt/compiler-explorer/python-3.11.0/include/python3.11
+libs.python.versions.3121.version=3.12.1
+libs.python.versions.3121.path=/opt/compiler-explorer/python-3.12.1/include/python3.12
+libs.python.versions.3130.version=3.13.0
+libs.python.versions.3130.path=/opt/compiler-explorer/python-3.13.0/include/python3.13
 
 libs.simde.name=SIMDe
 libs.simde.description=Implementations of SIMD instruction sets for systems which don't natively support them.
diff --git a/etc/config/odin.amazon.properties b/etc/config/odin.amazon.properties
index 81887838f..7dd307d20 100644
--- a/etc/config/odin.amazon.properties
+++ b/etc/config/odin.amazon.properties
@@ -1,15 +1,18 @@
 compilers=&odin
 compilerType=odin
-defaultCompiler=odin202411
+defaultCompiler=odin202501
 supportsBinary=true
 supportsExecute=true
 
 objdumper=/opt/compiler-explorer/gcc-14.2.0/bin/objdump
 clangPath=/opt/compiler-explorer/clang-19.1.0/bin/clang
 
-group.odin.compilers=odin202411
+group.odin.compilers=odin202411:odin202501
 group.odin.isSemVer=false
 group.odin.baseName=odin
 
 compiler.odin202411.exe=/opt/compiler-explorer/odin-dev-2024-11/odin
 compiler.odin202411.name=Odin (2024-11)
+
+compiler.odin202501.exe=/opt/compiler-explorer/odin-dev-2025-01/odin
+compiler.odin202501.name=Odin (2025-01)
diff --git a/etc/config/scala.amazon.properties b/etc/config/scala.amazon.properties
index 4bd9ea5be..848a8ab45 100644
--- a/etc/config/scala.amazon.properties
+++ b/etc/config/scala.amazon.properties
@@ -3,8 +3,7 @@ compilerType=scala
 versionFlag=-version
 objdumper=/opt/compiler-explorer/jdk-19.0.2/bin/javap
 instructionSet=java
-# Scala 3.0 was recently released, so it's a bit early to make it the default
-defaultCompiler=scalac2136
+defaultCompiler=scalac362
 demangler=
 postProcess=
 options=
@@ -19,20 +18,61 @@ group.scala.baseName=scalac
 group.scala.isSemVer=true
 group.scala.licenseName=Apache License 2.0
 
-group.scala2.compilers=scalac2136:scalac21214
+group.scala2.compilers=scalac2136:scalac21214:scalac21315
 group.scala2.licenseLink=https://github.com/scala/scala/blob/2.13.x/LICENSE
 
+compiler.scalac21315.exe=/opt/compiler-explorer/scala-2.13.15/bin/scalac
+compiler.scalac21315.semver=2.13.15
+compiler.scalac21315.java_home=/opt/compiler-explorer/jdk-21.0.0
+compiler.scalac21315.runtime=/opt/compiler-explorer/jdk-21.0.0/bin/java
+
 compiler.scalac2136.exe=/opt/compiler-explorer/scala-2.13.6/bin/scalac
 compiler.scalac2136.semver=2.13.6
 compiler.scalac2136.java_home=/opt/compiler-explorer/jdk-16.0.1
 compiler.scalac2136.runtime=/opt/compiler-explorer/jdk-16.0.1/bin/java
+
 compiler.scalac21214.exe=/opt/compiler-explorer/scala-2.12.14/bin/scalac
 compiler.scalac21214.semver=2.12.14
 compiler.scalac21214.java_home=/opt/compiler-explorer/jdk-16.0.1
 compiler.scalac21214.runtime=/opt/compiler-explorer/jdk-16.0.1/bin/java
 
-group.scala3.compilers=scalac300
-group.scala3.licenseLink=https://github.com/lampepfl/dotty/blob/main/LICENSE
+group.scala3.compilers=scalac300:scalac310:scalac320:scalac330:scalac334:scalac340:scalac350:scalac362
+group.scala3.licenseLink=https://github.com/scala/scala3/blob/main/LICENSE
+
+compiler.scalac362.exe=/opt/compiler-explorer/scala3-3.6.2/bin/scalac
+compiler.scalac362.semver=3.6.2
+compiler.scalac362.java_home=/opt/compiler-explorer/jdk-21.0.0
+compiler.scalac362.runtime=/opt/compiler-explorer/jdk-21.0.0/bin/java
+
+compiler.scalac350.exe=/opt/compiler-explorer/scala3-3.5.0/bin/scalac
+compiler.scalac350.semver=3.5.0
+compiler.scalac350.java_home=/opt/compiler-explorer/jdk-21.0.0
+compiler.scalac350.runtime=/opt/compiler-explorer/jdk-21.0.0/bin/java
+
+compiler.scalac340.exe=/opt/compiler-explorer/scala3-3.4.0/bin/scalac
+compiler.scalac340.semver=3.4.0
+compiler.scalac340.java_home=/opt/compiler-explorer/jdk-21.0.0
+compiler.scalac340.runtime=/opt/compiler-explorer/jdk-21.0.0/bin/java
+
+compiler.scalac334.exe=/opt/compiler-explorer/scala3-3.3.4/bin/scalac
+compiler.scalac334.semver=3.3.4
+compiler.scalac334.java_home=/opt/compiler-explorer/jdk-21.0.0
+compiler.scalac334.runtime=/opt/compiler-explorer/jdk-21.0.0/bin/java
+
+compiler.scalac330.exe=/opt/compiler-explorer/scala3-3.3.0/bin/scalac
+compiler.scalac330.semver=3.3.0
+compiler.scalac330.java_home=/opt/compiler-explorer/jdk-21.0.0
+compiler.scalac330.runtime=/opt/compiler-explorer/jdk-21.0.0/bin/java
+
+compiler.scalac320.exe=/opt/compiler-explorer/scala3-3.2.0/bin/scalac
+compiler.scalac320.semver=3.2.0
+compiler.scalac320.java_home=/opt/compiler-explorer/jdk-21.0.0
+compiler.scalac320.runtime=/opt/compiler-explorer/jdk-21.0.0/bin/java
+
+compiler.scalac310.exe=/opt/compiler-explorer/scala3-3.1.0/bin/scalac
+compiler.scalac310.semver=3.1.0
+compiler.scalac310.java_home=/opt/compiler-explorer/jdk-21.0.0
+compiler.scalac310.runtime=/opt/compiler-explorer/jdk-21.0.0/bin/java
 
 compiler.scalac300.exe=/opt/compiler-explorer/scala3-3.0.0/bin/scalac
 compiler.scalac300.semver=3.0.0
diff --git a/etc/config/sponsors.yaml b/etc/config/sponsors.yaml
index 677b295df..c68de6d5f 100644
--- a/etc/config/sponsors.yaml
+++ b/etc/config/sponsors.yaml
@@ -45,6 +45,15 @@ levels:
         topIconShowEvery: 3
         displayType: SideBySide
         statsId: jetbrains
+      - name: Cppcon
+        description: Join the CppCon family live &amp; in-person this September in Aurora, Colorado, USA! Pre-register for CppCon 2025 at <a href="https://www.CppCon.org" target="_blank">www.CppCon.org</a>.
+        img: https://static.ce-cdn.net/cppcon/cppcon-white-gold-5.svg
+        icon: https://static.ce-cdn.net/cppcon/cppcon-blue-gold-5.svg
+        icon_dark: https://static.ce-cdn.net/cppcon/cppcon-white-gold-5.svg
+        url: https://cppcon.org/
+        displayType: SideBySide
+        topIconShowEvery: 3
+        statsId: cppcon
   - name: Patreon Legends
     description: 'These amazing people have pledged at the highest level of support. Huge thanks to these fine folks:'
     class: legendary
diff --git a/etc/config/swift.amazon.properties b/etc/config/swift.amazon.properties
index d47d10fdb..33075658d 100644
--- a/etc/config/swift.amazon.properties
+++ b/etc/config/swift.amazon.properties
@@ -1,9 +1,9 @@
 compilers=&swift
-demangler=/opt/compiler-explorer/swift-5.10/usr/bin/swift-demangle
-defaultCompiler=swift510
+demangler=/opt/compiler-explorer/swift-6.0.3/usr/bin/swift-demangle
+defaultCompiler=swift603
 objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 
-group.swift.compilers=swift311:swift402:swift403:swift41:swift411:swift412:swift42:swift50:swift51:swift52:swift53:swift54:swift55:swift56:swift57:swift58:swift59:swift510:swiftnightly
+group.swift.compilers=swift311:swift402:swift403:swift41:swift411:swift412:swift42:swift50:swift51:swift52:swift53:swift54:swift55:swift56:swift57:swift58:swift59:swift510:swift603:swiftnightly
 group.swift.isSemVer=true
 group.swift.baseName=x86-64 swiftc
 compiler.swift311.exe=/opt/compiler-explorer/swift-3.1.1/usr/bin/swiftc
@@ -50,6 +50,8 @@ compiler.swift59.exe=/opt/compiler-explorer/swift-5.9/usr/bin/swiftc
 compiler.swift59.semver=5.9
 compiler.swift510.exe=/opt/compiler-explorer/swift-5.10/usr/bin/swiftc
 compiler.swift510.semver=5.10
+compiler.swift603.exe=/opt/compiler-explorer/swift-6.0.3/usr/bin/swiftc
+compiler.swift603.semver=6.0.3
 compiler.swift510.alias=switf510nightly
 compiler.swiftnightly.exe=/opt/compiler-explorer/swift-nightly/usr/bin/swiftc
 compiler.swiftnightly.semver=nightly
diff --git a/examples/ispc/default.ispc b/examples/ispc/default.ispc
index 0924dc0b6..8d8ec61ac 100644
--- a/examples/ispc/default.ispc
+++ b/examples/ispc/default.ispc
@@ -1,4 +1,18 @@
 // Type your code here, or load an example.
-uniform int square(uniform int num) {
-    return num * num;
+varying int square_even(varying int num) {
+    if (num % 2 == 0) {
+        return num * num;
+    } else {
+        return num;
+    }
 }
+
+// Uncomment this if you would like to execute the code
+/*
+extern "C" uniform int main() {
+    print("Hello, World!\n");
+    print("programCount = %\n", programCount);
+    print("square_even(%) = %\n", programIndex, square_even(programIndex));
+    return 0;
+}
+*/
diff --git a/lib/base-compiler.ts b/lib/base-compiler.ts
index 5b9ac7447..23d814dc0 100644
--- a/lib/base-compiler.ts
+++ b/lib/base-compiler.ts
@@ -1190,17 +1190,12 @@ export class BaseCompiler {
 
         const libIncludes = this.getIncludeArguments(libraries, dirPath);
         const libOptions = this.getLibraryOptions(libraries);
-        let libLinks: string[] = [];
-        let libPaths: string[] = [];
-        let libPathsAsFlags: string[] = [];
-        let staticLibLinks: string[] = [];
-
-        if (filters.binary) {
-            libLinks = (this.getSharedLibraryLinks(libraries).filter(Boolean) as string[]) || [];
-            libPathsAsFlags = this.getSharedLibraryPathsAsArguments(libraries, undefined, toolchainPath, dirPath);
-            libPaths = this.getSharedLibraryPaths(libraries, dirPath);
-            staticLibLinks = (this.getStaticLibraryLinks(libraries, libPaths).filter(Boolean) as string[]) || [];
-        }
+        const {libLinks, libPathsAsFlags, staticLibLinks} = this.getLibLinkInfo(
+            filters,
+            libraries,
+            toolchainPath,
+            dirPath,
+        );
 
         userOptions = this.filterUserOptions(userOptions) || [];
         [options, overrides] = this.fixIncompatibleOptions(options, userOptions, overrides);
@@ -1218,6 +1213,25 @@ export class BaseCompiler {
         );
     }
 
+    protected getLibLinkInfo(
+        filters: ParseFiltersAndOutputOptions,
+        libraries: SelectedLibraryVersion[],
+        toolchainPath: string,
+        dirPath: string,
+    ) {
+        let libLinks: string[] = [];
+        let libPathsAsFlags: string[] = [];
+        let staticLibLinks: string[] = [];
+
+        if (filters.binary) {
+            libLinks = (this.getSharedLibraryLinks(libraries).filter(Boolean) as string[]) || [];
+            libPathsAsFlags = this.getSharedLibraryPathsAsArguments(libraries, undefined, toolchainPath, dirPath);
+            const libPaths = this.getSharedLibraryPaths(libraries, dirPath);
+            staticLibLinks = (this.getStaticLibraryLinks(libraries, libPaths).filter(Boolean) as string[]) || [];
+        }
+        return {libLinks, libPathsAsFlags, staticLibLinks};
+    }
+
     protected fixIncompatibleOptions(
         options: string[],
         userOptions: string[],
@@ -1651,9 +1665,14 @@ export class BaseCompiler {
         return utils.changeExtension(inputFilename, '.ll');
     }
 
-    getOutputFilename(dirPath: string, outputFilebase: string, key?: any): string {
-        let filename;
-        if (key && key.backendOptions && key.backendOptions.customOutputFilename) {
+    isCacheKey(key: CacheKey | CompilationCacheKey | undefined): key is CacheKey {
+        return key !== undefined && (key as CacheKey).backendOptions !== undefined;
+    }
+
+    getOutputFilename(dirPath: string, outputFilebase: string, key?: CacheKey | CompilationCacheKey): string {
+        let filename: string;
+
+        if (this.isCacheKey(key) && key.backendOptions.customOutputFilename) {
             filename = key.backendOptions.customOutputFilename;
         } else {
             filename = `${outputFilebase}.s`;
@@ -1803,7 +1822,7 @@ export class BaseCompiler {
 
     buildExecutable(compiler: string, options: string[], inputFilename: string, execOptions: ExecutionOptionsWithEnv) {
         // default implementation, but should be overridden by compilers
-        return this.runCompiler(compiler, options, inputFilename, execOptions);
+        return this.runCompiler(compiler, options, inputFilename, execOptions, {execute: true, binary: true});
     }
 
     protected maskPathsInArgumentsForUser(args: string[]): string[] {
diff --git a/lib/compilers/_all.ts b/lib/compilers/_all.ts
index 5e10b9f3c..75f445722 100644
--- a/lib/compilers/_all.ts
+++ b/lib/compilers/_all.ts
@@ -63,10 +63,11 @@ export {
     DotNetNativeAotCompiler,
 } from './dotnet.js';
 export {EDGCompiler} from './edg.js';
-export {EllccCompiler} from './ellcc.js';
+export {ElixirAsmCompiler} from './elixirasm.js';
 export {ElixirCompiler} from './elixir.js';
-export {ErlangCompiler} from './erlang.js';
+export {EllccCompiler} from './ellcc.js';
 export {ErlangAsmCompiler} from './erlangasm.js';
+export {ErlangCompiler} from './erlang.js';
 export {EWARMCompiler} from './ewarm.js';
 export {EWAVRCompiler} from './ewavr.js';
 export {FakeCompiler} from './fake-for-test.js';
diff --git a/lib/compilers/dex2oat.ts b/lib/compilers/dex2oat.ts
index fbfa80729..6fe875606 100644
--- a/lib/compilers/dex2oat.ts
+++ b/lib/compilers/dex2oat.ts
@@ -145,7 +145,7 @@ export class Dex2OatCompiler extends BaseCompiler {
 
         // Regexes that apply to .smali files (R8/D8 dump output).
         this.smaliLineNumberRegex = /^\s+\.line\s+(\d+).*$/;
-        this.smaliClassRegex = /^\.class\s(.*)$/;
+        this.smaliClassRegex = /^\.class\s.*(L.*;)$/;
         this.smaliDexPcRegex = /^\s+#@(\w+).*$/;
         this.smaliMethodStartRegex = /^\.method\s(.*)$/;
         this.smaliMethodEndRegex = /^\s*\.end\smethod.*$/;
diff --git a/lib/compilers/elixirasm.ts b/lib/compilers/elixirasm.ts
new file mode 100644
index 000000000..ec5a66614
--- /dev/null
+++ b/lib/compilers/elixirasm.ts
@@ -0,0 +1,73 @@
+// Copyright (c) 2025, Compiler Explorer Authors
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//     * Redistributions of source code must retain the above copyright notice,
+//       this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above copyright
+//       notice, this list of conditions and the following disclaimer in the
+//       documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+import path from 'path';
+
+import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';
+import {BaseCompiler} from '../base-compiler.js';
+
+import {ElixirParser} from './argument-parsers.js';
+
+export class ElixirAsmCompiler extends BaseCompiler {
+    static get key() {
+        return 'elixirasm';
+    }
+
+    override optionsForFilter(filters: ParseFiltersAndOutputOptions, outputFilename: string): string[] {
+        return [
+            '--eval',
+            '[input] = Code.required_files();' +
+                'code = Code.compile_file(input);' +
+                ':erts_debug.set_internal_state(:available_internal_state, true);' +
+                ':erts_debug.set_internal_state(:jit_asm_dump, true);' +
+                'code = Code.compile_file(input)' +
+                '|> Enum.map(fn {module,_} -> File.read!(:erlang.atom_to_list(module) ++ ".asm") end) ' +
+                '|> Enum.join("\n"); ' +
+                `:ok = File.write("${outputFilename}", code);`,
+        ];
+    }
+
+    override orderArguments(
+        options: string[],
+        inputFilename: string,
+        libIncludes: string[],
+        libOptions: string[],
+        libPaths: string[],
+        libLinks: string[],
+        userOptions: string[],
+        staticLibLinks: string[],
+    ): string[] {
+        return ['-r', inputFilename]
+            .concat(options)
+            .concat(libIncludes, libOptions, libPaths, libLinks, userOptions, staticLibLinks);
+    }
+
+    override getOutputFilename(dirPath: string, outputFilebase: string): string {
+        return path.join(dirPath, `${outputFilebase}.asm`);
+    }
+
+    override getArgumentParserClass() {
+        return ElixirParser;
+    }
+}
diff --git a/lib/compilers/ispc.ts b/lib/compilers/ispc.ts
index 271b527b8..29dbcb2c9 100644
--- a/lib/compilers/ispc.ts
+++ b/lib/compilers/ispc.ts
@@ -22,20 +22,31 @@
 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 // POSSIBILITY OF SUCH DAMAGE.
 
+import fs from 'fs-extra';
 import Semver from 'semver';
 
+import {
+    CacheKey,
+    CompilationCacheKey,
+    CompilationResult,
+    ExecutionOptionsWithEnv,
+} from '../../types/compilation/compilation.interfaces.js';
 import {LLVMIrBackendOptions} from '../../types/compilation/ir.interfaces.js';
 import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
 import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';
+import {SelectedLibraryVersion} from '../../types/libraries/libraries.interfaces.js';
 import type {ResultLine} from '../../types/resultline/resultline.interfaces.js';
 import {unwrap} from '../assert.js';
 import {BaseCompiler} from '../base-compiler.js';
 import {CompilationEnvironment} from '../compilation-env.js';
 import {asSafeVer} from '../utils.js';
+import * as utils from '../utils.js';
 
 import {ISPCParser} from './argument-parsers.js';
 
 export class ISPCCompiler extends BaseCompiler {
+    private readonly executableLinker: string;
+
     static get key() {
         return 'ispc';
     }
@@ -44,16 +55,40 @@ export class ISPCCompiler extends BaseCompiler {
         super(info, env);
         this.compiler.supportsIrView = true;
         this.compiler.irArg = ['--emit-llvm-text'];
+        // TODO(#7150) do away with this kind of thing and share the same linker for everything.
+        this.executableLinker = this.compilerProps<string>(`compiler.${this.compiler.id}.executableLinker`);
     }
 
     override couldSupportASTDump(version: string) {
         return Semver.gte(asSafeVer(this.compiler.semver), '1.18.0', true);
     }
 
+    override getOutputFilename(dirPath: string, outputFilebase: string, key?: CacheKey | CompilationCacheKey): string {
+        const outputFilename = super.getOutputFilename(dirPath, outputFilebase, key);
+        if (this.isCacheKey(key)) {
+            // ispc gets a bit annoyed about the output filename extension. If we're in binary object mode we _have_ to
+            // output a `.o` file, else ispc complains.
+            if (key.filters.binary || key.filters.binaryObject) {
+                return utils.changeExtension(outputFilename, '.o');
+            }
+        }
+        return outputFilename;
+    }
+
+    override getExecutableFilename(dirPath: string, outputFilebase: string, key?: CacheKey | CompilationCacheKey) {
+        // ispc gets a bit annoyed about the output filename extension. If we're in binary object mode we _have_ to
+        // output a `.o` file, else ispc complains. We can't defer this to getOutputFilename, else we'll rename the
+        // output of executed but non-binary, non-binary-object files, which need to remain `.s`.
+        return utils.changeExtension(super.getOutputFilename(dirPath, outputFilebase, key), '.o');
+    }
+
     override optionsForFilter(filters: ParseFiltersAndOutputOptions, outputFilename: string) {
-        let options = ['--target=avx2-i32x8', '--emit-asm', '-g', '-o', this.filename(outputFilename)];
+        const options = ['--target=avx2-i32x8', '-g', '-o', this.filename(outputFilename)];
+        if (!filters.binary && !filters.binaryObject) {
+            options.push('--emit-asm');
+        }
         if (this.compiler.intelAsm && filters.intel && !filters.binary) {
-            options = options.concat(this.compiler.intelAsm.split(' '));
+            options.push(...this.compiler.intelAsm.split(' '));
         }
         return options;
     }
@@ -91,7 +126,43 @@ export class ISPCCompiler extends BaseCompiler {
         );
     }
 
+    override getLibLinkInfo(
+        filters: ParseFiltersAndOutputOptions,
+        libraries: SelectedLibraryVersion[],
+        toolchainPath: string,
+        dirPath: string,
+    ) {
+        // Prevent any library linking flags from being passed to ispc during compilation.
+        return {libLinks: [], libPathsAsFlags: [], staticLibLinks: []};
+    }
+
     override isCfgCompiler() {
         return true;
     }
+
+    async linkExecutable(options: string[], execOptions: ExecutionOptionsWithEnv) {
+        // Rely on the fact we definitely put a `-o` in the options.
+        const outputFile = options[options.indexOf('-o') + 1];
+        const renamedFile = outputFile + '.tmp';
+        await fs.rename(outputFile, renamedFile);
+        return await this.exec(this.executableLinker, ['-o', outputFile, renamedFile], execOptions);
+    }
+
+    override async runCompiler(
+        compiler: string,
+        options: string[],
+        inputFilename: string,
+        execOptions: ExecutionOptionsWithEnv,
+        filters?: ParseFiltersAndOutputOptions,
+    ): Promise<CompilationResult> {
+        const result = await super.runCompiler(compiler, options, inputFilename, execOptions, filters);
+        if (result.code !== 0) return result;
+        if (filters?.binary) {
+            const linkResult = await this.linkExecutable(options, execOptions);
+            if (linkResult.code !== 0) {
+                return {...result, ...this.transformToCompilationResult(linkResult, inputFilename)};
+            }
+        }
+        return result;
+    }
 }
diff --git a/lib/compilers/rust.ts b/lib/compilers/rust.ts
index 0d70412c1..4e28546ba 100644
--- a/lib/compilers/rust.ts
+++ b/lib/compilers/rust.ts
@@ -247,7 +247,7 @@ export class RustCompiler extends BaseCompiler {
     }
 
     override optionsForFilter(filters: ParseFiltersAndOutputOptions, outputFilename: string, userOptions?: string[]) {
-        let options = ['-C', 'debuginfo=1', '-o', this.filename(outputFilename)];
+        let options = ['-C', 'debuginfo=2', '-o', this.filename(outputFilename)];
 
         const userRequestedEmit = _.any(unwrap(userOptions), opt => opt.includes('--emit'));
         if (filters.binary) {
diff --git a/lib/compilers/win32.ts b/lib/compilers/win32.ts
index 85db574f3..9ad52618a 100644
--- a/lib/compilers/win32.ts
+++ b/lib/compilers/win32.ts
@@ -128,12 +128,23 @@ export class Win32Compiler extends BaseCompiler {
         [options, overrides] = this.fixIncompatibleOptions(options, userOptions, overrides);
         this.changeOptionsBasedOnOverrides(options, overrides);
 
+        // `/link` and all that follows must come after the filename
+        const linkIndex = userOptions.indexOf('/link');
+        let linkUserOptions: string[] = [];
+        let compileUserOptions = userOptions;
+        if (linkIndex !== -1) {
+            linkUserOptions = userOptions.slice(linkIndex + 1);
+            compileUserOptions = userOptions.slice(0, linkIndex);
+            preLink = ['/link'];
+        }
+
         return options.concat(
             libIncludes,
             libOptions,
-            userOptions,
+            compileUserOptions,
             [this.filename(inputFilename)],
             preLink,
+            linkUserOptions,
             libPaths,
             libLinks,
             staticlibLinks,
diff --git a/lib/parsers/asm-parser.ts b/lib/parsers/asm-parser.ts
index 70034d264..0b6af58da 100644
--- a/lib/parsers/asm-parser.ts
+++ b/lib/parsers/asm-parser.ts
@@ -99,7 +99,7 @@ export class AsmParser extends AsmRegex implements IAsmParser {
         this.labelFindMips = /[$.A-Z_a-z][\w$.]*/g;
         this.mipsLabelDefinition = /^\$[\w$.]+:/;
         this.dataDefn =
-            /^\s*\.(ascii|asciz|[1248]?byte|dc(?:\.[abdlswx])?|dcb(?:\.[bdlswx])?|ds(?:\.[bdlpswx])?|double|dword|fill|float|half|hword|int|long|octa|quad|short|single|skip|space|string(?:8|16|32|64)?|value|word|xword|zero)/;
+            /^\s*\.(ascii|asciz|base64|[1248]?byte|dc(?:\.[abdlswx])?|dcb(?:\.[bdlswx])?|ds(?:\.[bdlpswx])?|double|dword|fill|float|half|hword|int|long|octa|quad|short|single|skip|space|string(?:8|16|32|64)?|value|word|xword|zero)/;
         this.fileFind = /^\s*\.(?:cv_)?file\s+(\d+)\s+"([^"]+)"(\s+"([^"]+)")?.*/;
         // Opcode expression here matches LLVM-style opcodes of the form `%blah = opcode`
         this.hasOpcodeRe = /^\s*(%[$.A-Z_a-z][\w$.]*\s*=\s*)?[A-Za-z]/;
diff --git a/package-lock.json b/package-lock.json
index a94e349e9..2c4c3f965 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15438,10 +15438,11 @@
       "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g=="
     },
     "node_modules/undici": {
-      "version": "6.20.1",
-      "resolved": "https://registry.npmjs.org/undici/-/undici-6.20.1.tgz",
-      "integrity": "sha512-AjQF1QsmqfJys+LXfGTNum+qw4S88CojRInG/6t31W/1fk6G59s92bnAvGz5Cmur+kQv2SURXEvvudLmbrE8QA==",
+      "version": "6.21.1",
+      "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.1.tgz",
+      "integrity": "sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=18.17"
       }
@@ -15614,10 +15615,11 @@
       "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
     },
     "node_modules/vite": {
-      "version": "5.4.10",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz",
-      "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==",
+      "version": "5.4.14",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz",
+      "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "esbuild": "^0.21.3",
         "postcss": "^8.4.43",


Test patch:
diff --git a/test/base-compiler-tests.ts b/test/base-compiler-tests.ts
index 6da95af7e..a54c865e8 100644
--- a/test/base-compiler-tests.ts
+++ b/test/base-compiler-tests.ts
@@ -856,7 +856,7 @@ describe('Rust overrides', () => {
         );
         expect(originalOptions).toEqual([
             '-C',
-            'debuginfo=1',
+            'debuginfo=2',
             '-o',
             'output.txt',
             '--crate-type',
@@ -870,6 +870,6 @@ describe('Rust overrides', () => {
                     value: 'aarch64-linux-something',
                 },
             ]),
-        ).toEqual(['-C', 'debuginfo=1', '-o', 'output.txt', '--crate-type', 'bin', '-Clinker=/usr/aarch64/bin/gcc']);
+        ).toEqual(['-C', 'debuginfo=2', '-o', 'output.txt', '--crate-type', 'bin', '-Clinker=/usr/aarch64/bin/gcc']);
     });
 });
diff --git a/test/filters-cases/bug-7280.asm b/test/filters-cases/bug-7280.asm
new file mode 100644
index 000000000..f6e5260cc
--- /dev/null
+++ b/test/filters-cases/bug-7280.asm
@@ -0,0 +1,17 @@
+        .arch armv8-a
+        .file   "example.cpp"
+        .text
+        .global a
+        .section        .rodata
+        .align  3
+.LC0:
+        .string "a"
+        .base64 "AGIA"
+        .data
+        .align  3
+        .type   a, %object
+        .size   a, 8
+a:
+        .xword  .LC0
+        .ident  "GCC: (GNU) 15.0.1 20250115 (experimental)"
+        .section        .note.GNU-stack,"",@progbits
diff --git a/test/filters-cases/bug-7280.asm.binary.directives.labels.comments.json b/test/filters-cases/bug-7280.asm.binary.directives.labels.comments.json
new file mode 100644
index 000000000..720205208
--- /dev/null
+++ b/test/filters-cases/bug-7280.asm.binary.directives.labels.comments.json
@@ -0,0 +1,4 @@
+{
+  "asm": [],
+  "labelDefinitions": {}
+}
\ No newline at end of file
diff --git a/test/filters-cases/bug-7280.asm.directives.comments.json b/test/filters-cases/bug-7280.asm.directives.comments.json
new file mode 100644
index 000000000..805e10c8f
--- /dev/null
+++ b/test/filters-cases/bug-7280.asm.directives.comments.json
@@ -0,0 +1,49 @@
+{
+  "asm": [
+    {
+      "labels": [],
+      "source": null,
+      "text": ".LC0:"
+    },
+    {
+      "labels": [
+        {
+          "name": "a",
+          "range": {
+            "endCol": 19,
+            "startCol": 18
+          }
+        }
+      ],
+      "source": null,
+      "text": "        .string \"a\""
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "        .base64 \"AGIA\""
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "a:"
+    },
+    {
+      "labels": [
+        {
+          "name": ".LC0",
+          "range": {
+            "endCol": 21,
+            "startCol": 17
+          }
+        }
+      ],
+      "source": null,
+      "text": "        .xword  .LC0"
+    }
+  ],
+  "labelDefinitions": {
+    ".LC0": 1,
+    "a": 4
+  }
+}
\ No newline at end of file
diff --git a/test/filters-cases/bug-7280.asm.directives.json b/test/filters-cases/bug-7280.asm.directives.json
new file mode 100644
index 000000000..805e10c8f
--- /dev/null
+++ b/test/filters-cases/bug-7280.asm.directives.json
@@ -0,0 +1,49 @@
+{
+  "asm": [
+    {
+      "labels": [],
+      "source": null,
+      "text": ".LC0:"
+    },
+    {
+      "labels": [
+        {
+          "name": "a",
+          "range": {
+            "endCol": 19,
+            "startCol": 18
+          }
+        }
+      ],
+      "source": null,
+      "text": "        .string \"a\""
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "        .base64 \"AGIA\""
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "a:"
+    },
+    {
+      "labels": [
+        {
+          "name": ".LC0",
+          "range": {
+            "endCol": 21,
+            "startCol": 17
+          }
+        }
+      ],
+      "source": null,
+      "text": "        .xword  .LC0"
+    }
+  ],
+  "labelDefinitions": {
+    ".LC0": 1,
+    "a": 4
+  }
+}
\ No newline at end of file
diff --git a/test/filters-cases/bug-7280.asm.directives.labels.comments.json b/test/filters-cases/bug-7280.asm.directives.labels.comments.json
new file mode 100644
index 000000000..805e10c8f
--- /dev/null
+++ b/test/filters-cases/bug-7280.asm.directives.labels.comments.json
@@ -0,0 +1,49 @@
+{
+  "asm": [
+    {
+      "labels": [],
+      "source": null,
+      "text": ".LC0:"
+    },
+    {
+      "labels": [
+        {
+          "name": "a",
+          "range": {
+            "endCol": 19,
+            "startCol": 18
+          }
+        }
+      ],
+      "source": null,
+      "text": "        .string \"a\""
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "        .base64 \"AGIA\""
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "a:"
+    },
+    {
+      "labels": [
+        {
+          "name": ".LC0",
+          "range": {
+            "endCol": 21,
+            "startCol": 17
+          }
+        }
+      ],
+      "source": null,
+      "text": "        .xword  .LC0"
+    }
+  ],
+  "labelDefinitions": {
+    ".LC0": 1,
+    "a": 4
+  }
+}
\ No newline at end of file
diff --git a/test/filters-cases/bug-7280.asm.directives.labels.comments.library.dontMaskFilenames.json b/test/filters-cases/bug-7280.asm.directives.labels.comments.library.dontMaskFilenames.json
new file mode 100644
index 000000000..805e10c8f
--- /dev/null
+++ b/test/filters-cases/bug-7280.asm.directives.labels.comments.library.dontMaskFilenames.json
@@ -0,0 +1,49 @@
+{
+  "asm": [
+    {
+      "labels": [],
+      "source": null,
+      "text": ".LC0:"
+    },
+    {
+      "labels": [
+        {
+          "name": "a",
+          "range": {
+            "endCol": 19,
+            "startCol": 18
+          }
+        }
+      ],
+      "source": null,
+      "text": "        .string \"a\""
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "        .base64 \"AGIA\""
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "a:"
+    },
+    {
+      "labels": [
+        {
+          "name": ".LC0",
+          "range": {
+            "endCol": 21,
+            "startCol": 17
+          }
+        }
+      ],
+      "source": null,
+      "text": "        .xword  .LC0"
+    }
+  ],
+  "labelDefinitions": {
+    ".LC0": 1,
+    "a": 4
+  }
+}
\ No newline at end of file
diff --git a/test/filters-cases/bug-7280.asm.directives.labels.comments.library.json b/test/filters-cases/bug-7280.asm.directives.labels.comments.library.json
new file mode 100644
index 000000000..805e10c8f
--- /dev/null
+++ b/test/filters-cases/bug-7280.asm.directives.labels.comments.library.json
@@ -0,0 +1,49 @@
+{
+  "asm": [
+    {
+      "labels": [],
+      "source": null,
+      "text": ".LC0:"
+    },
+    {
+      "labels": [
+        {
+          "name": "a",
+          "range": {
+            "endCol": 19,
+            "startCol": 18
+          }
+        }
+      ],
+      "source": null,
+      "text": "        .string \"a\""
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "        .base64 \"AGIA\""
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "a:"
+    },
+    {
+      "labels": [
+        {
+          "name": ".LC0",
+          "range": {
+            "endCol": 21,
+            "startCol": 17
+          }
+        }
+      ],
+      "source": null,
+      "text": "        .xword  .LC0"
+    }
+  ],
+  "labelDefinitions": {
+    ".LC0": 1,
+    "a": 4
+  }
+}
\ No newline at end of file
diff --git a/test/filters-cases/bug-7280.asm.directives.labels.json b/test/filters-cases/bug-7280.asm.directives.labels.json
new file mode 100644
index 000000000..805e10c8f
--- /dev/null
+++ b/test/filters-cases/bug-7280.asm.directives.labels.json
@@ -0,0 +1,49 @@
+{
+  "asm": [
+    {
+      "labels": [],
+      "source": null,
+      "text": ".LC0:"
+    },
+    {
+      "labels": [
+        {
+          "name": "a",
+          "range": {
+            "endCol": 19,
+            "startCol": 18
+          }
+        }
+      ],
+      "source": null,
+      "text": "        .string \"a\""
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "        .base64 \"AGIA\""
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "a:"
+    },
+    {
+      "labels": [
+        {
+          "name": ".LC0",
+          "range": {
+            "endCol": 21,
+            "startCol": 17
+          }
+        }
+      ],
+      "source": null,
+      "text": "        .xword  .LC0"
+    }
+  ],
+  "labelDefinitions": {
+    ".LC0": 1,
+    "a": 4
+  }
+}
\ No newline at end of file
diff --git a/test/filters-cases/bug-7280.asm.directives.library.json b/test/filters-cases/bug-7280.asm.directives.library.json
new file mode 100644
index 000000000..805e10c8f
--- /dev/null
+++ b/test/filters-cases/bug-7280.asm.directives.library.json
@@ -0,0 +1,49 @@
+{
+  "asm": [
+    {
+      "labels": [],
+      "source": null,
+      "text": ".LC0:"
+    },
+    {
+      "labels": [
+        {
+          "name": "a",
+          "range": {
+            "endCol": 19,
+            "startCol": 18
+          }
+        }
+      ],
+      "source": null,
+      "text": "        .string \"a\""
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "        .base64 \"AGIA\""
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "a:"
+    },
+    {
+      "labels": [
+        {
+          "name": ".LC0",
+          "range": {
+            "endCol": 21,
+            "startCol": 17
+          }
+        }
+      ],
+      "source": null,
+      "text": "        .xword  .LC0"
+    }
+  ],
+  "labelDefinitions": {
+    ".LC0": 1,
+    "a": 4
+  }
+}
\ No newline at end of file
diff --git a/test/filters-cases/bug-7280.asm.none.json b/test/filters-cases/bug-7280.asm.none.json
new file mode 100644
index 000000000..d3d3c00b6
--- /dev/null
+++ b/test/filters-cases/bug-7280.asm.none.json
@@ -0,0 +1,141 @@
+{
+  "asm": [
+    {
+      "labels": [
+        {
+          "name": "a",
+          "range": {
+            "endCol": 22,
+            "startCol": 21
+          }
+        }
+      ],
+      "source": null,
+      "text": "        .arch armv8-a"
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "        .file   \"example.cpp\""
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "        .text"
+    },
+    {
+      "labels": [
+        {
+          "name": "a",
+          "range": {
+            "endCol": 18,
+            "startCol": 17
+          }
+        }
+      ],
+      "source": null,
+      "text": "        .global a"
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "        .section        .rodata"
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "        .align  3"
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": ".LC0:"
+    },
+    {
+      "labels": [
+        {
+          "name": "a",
+          "range": {
+            "endCol": 19,
+            "startCol": 18
+          }
+        }
+      ],
+      "source": null,
+      "text": "        .string \"a\""
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "        .base64 \"AGIA\""
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "        .data"
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "        .align  3"
+    },
+    {
+      "labels": [
+        {
+          "name": "a",
+          "range": {
+            "endCol": 18,
+            "startCol": 17
+          }
+        }
+      ],
+      "source": null,
+      "text": "        .type   a, %object"
+    },
+    {
+      "labels": [
+        {
+          "name": "a",
+          "range": {
+            "endCol": 18,
+            "startCol": 17
+          }
+        }
+      ],
+      "source": null,
+      "text": "        .size   a, 8"
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "a:"
+    },
+    {
+      "labels": [
+        {
+          "name": ".LC0",
+          "range": {
+            "endCol": 21,
+            "startCol": 17
+          }
+        }
+      ],
+      "source": null,
+      "text": "        .xword  .LC0"
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "        .ident  \"GCC: (GNU) 15.0.1 20250115 (experimental)\""
+    },
+    {
+      "labels": [],
+      "source": null,
+      "text": "        .section        .note.GNU-stack,\"\",@progbits"
+    }
+  ],
+  "labelDefinitions": {
+    ".LC0": 7,
+    "a": 14
+  }
+}
\ No newline at end of file