Repository: compiler-explorer/compiler-explorer
Pull request #6243 (2024-03-14 01:51:51)

Changes for NVIDIA HPC SDK 24.3
<!-- THIS COMMENT IS INVISIBLE IN THE FINAL PR, BUT FEEL FREE TO REMOVE IT
Thanks for taking the time to improve CE. We really appreciate it.
  Before opening the PR, please make sure that the tests & linter pass their checks,
  by running `make check`.
  In the best case scenario, you are also adding tests to back up your changes,
  but don't sweat it if you don't. We can discuss them at a later date.
Feel free to append your name to the CONTRIBUTORS.md file
Thanks again, we really appreciate this!
-->
Add HPC SDK 24.3 to etc/config/c++.amazon.properties


Patch:
diff --git a/etc/config/c++.amazon.properties b/etc/config/c++.amazon.properties
index 9932b72c4..9485b8717 100644
--- a/etc/config/c++.amazon.properties
+++ b/etc/config/c++.amazon.properties
@@ -387,10 +387,9 @@ compiler.clang1810.options=--gcc-toolchain=/opt/compiler-explorer/gcc-13.2.0
 compiler.clang1810.ldPath=${exePath}/../lib|${exePath}/../lib/x86_64-unknown-linux-gnu
 compiler.clang1810.debugPatched=true
 
-group.clangx86trunk.compilers=clang_trunk:clang_assertions_trunk:clang_concepts:clang_p1144:clang_autonsdmi:clang_lifetime:clang_p1061:clang_parmexpr:clang_patmat:clang_embed:clang_dang:clang_reflection:clang_variadic_friends:clang_widberg:clang_resugar:clang_clangir
+group.clangx86trunk.compilers=clang_trunk:clang_assertions_trunk:clang_concepts:clang_p1144:clang_autonsdmi:clang_bb_p2996:clang_lifetime:clang_p1061:clang_parmexpr:clang_patmat:clang_embed:clang_dang:clang_reflection:clang_variadic_friends:clang_widberg:clang_resugar:clang_clangir
 group.clangx86trunk.intelAsm=-mllvm --x86-asm-syntax=intel
 group.clangx86trunk.options=--gcc-toolchain=/opt/compiler-explorer/gcc-snapshot
-group.clangx86trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 group.clangx86trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 group.clangx86trunk.groupName=Clang x86-64
 group.clangx86trunk.instructionSet=amd64
@@ -426,6 +425,10 @@ compiler.clang_lifetime.exe=/opt/compiler-explorer/clang-lifetime-trunk/bin/clan
 compiler.clang_lifetime.semver=(experimental -Wlifetime)
 compiler.clang_lifetime.options=--gcc-toolchain=/opt/compiler-explorer/gcc-8.2.0 -Wlifetime
 compiler.clang_lifetime.notification=Lifetime profile checker based on Herb Sutter's paper; see <a href="https://herbsutter.com/2018/09/20/lifetime-profile-v1-0-posted/" target="_blank" rel="noopener noreferrer">this blog post <sup><small class="fas fa-external-link-alt opens-new-window" title="Opens in a new window"></small></sup></a> for more information
+compiler.clang_bb_p2996.exe=/opt/compiler-explorer/clang-bb-p2996-trunk/bin/clang++
+compiler.clang_bb_p2996.semver=(experimental P2996)
+compiler.clang_bb_p2996.notification=Experimental Reflection Support; see <a href="https://github.com/bloomberg/clang-p2996/blob/p2996/P2996.md" target="_blank" rel="noopener noreferrer">P2996<sup><small class="fas fa-external-link-alt opens-new-window" title="Opens in a new window"></small></sup></a>
+compiler.clang_bb_p2996.options=-std=c++26 -freflection -stdlib=libc++
 compiler.clang_p1061.exe=/opt/compiler-explorer/clang-p1061-trunk/bin/clang++
 compiler.clang_p1061.semver=(experimental P1061)
 compiler.clang_p1061.notification=Experimental Structure Bindings can introduce a Pack; see <a href="https://wg21.link/P1061" target="_blank" rel="noopener noreferrer">P1061<sup><small class="fas fa-external-link-alt opens-new-window" title="Opens in a new window"></small></sup></a>
@@ -665,7 +668,6 @@ compiler.armv7-clang900.options=-target arm-linux-gnueabi --gcc-toolchain=/opt/c
 # An alias of this name needs to be maintained to allow old URLs to continue to work
 compiler.armv7-clang900.alias=armv7-clang-9
 compiler.armv7-clang-trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang++
-compiler.armv7-clang-trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.armv7-clang-trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.armv7-clang-trunk.semver=(trunk)
 compiler.armv7-clang-trunk.isNightly=true
@@ -733,13 +735,11 @@ compiler.armv8-clang900.options=-target aarch64-linux-gnu --gcc-toolchain=/opt/c
 # An alias of this name needs to be maintained to allow old URLs to continue to work
 compiler.armv8-clang900.alias=armv8-clang-9
 compiler.armv8-clang-trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang++
-compiler.armv8-clang-trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.armv8-clang-trunk.objdumper=/opt/compiler-explorer/arm64/gcc-10.2.0/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/bin/objdump
 compiler.armv8-clang-trunk.semver=(trunk)
 compiler.armv8-clang-trunk.isNightly=true
 compiler.armv8-clang-trunk.options=-target aarch64-linux-gnu --gcc-toolchain=/opt/compiler-explorer/arm64/gcc-12.2.0/aarch64-unknown-linux-gnu --sysroot=/opt/compiler-explorer/arm64/gcc-12.2.0/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/sysroot
 compiler.armv8-full-clang-trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang++
-compiler.armv8-full-clang-trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.armv8-full-clang-trunk.objdumper=/opt/compiler-explorer/arm64/gcc-10.2.0/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/bin/objdump
 compiler.armv8-full-clang-trunk.semver=(all architectural features, trunk)
 compiler.armv8-full-clang-trunk.isNightly=true
@@ -794,7 +794,6 @@ compiler.mos-osi-c1p-trunk.semver=osi-c1p
 ################################
 # Clang for RISC-V
 group.rvclang.compilers=&rv32clang:&rv64clang
-group.rvclang.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 group.rvclang.supportsBinary=true
 group.rvclang.supportsExecute=false
 group.rvclang.isSemVer=true
@@ -913,7 +912,6 @@ group.wasmclang.licensePreamble=The LLVM Project is under the Apache License v2.
 group.wasmclang.compilerCategories=clang
 
 compiler.wasm32clang.exe=/opt/compiler-explorer/clang-trunk/bin/clang++
-compiler.wasm32clang.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.wasm32clang.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.wasm32clang.name=WebAssembly clang (trunk)
 compiler.wasm32clang.options=-target wasm32
@@ -1587,7 +1585,6 @@ compiler.ppc64gtrunk.objdumper=/opt/compiler-explorer/powerpc64/gcc-trunk/powerp
 compiler.ppc64gtrunk.demangler=/opt/compiler-explorer/powerpc64/gcc-trunk/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-c++filt
 
 compiler.ppc64clang.exe=/opt/compiler-explorer/clang-trunk/bin/clang++
-compiler.ppc64clang.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.ppc64clang.objdumper=/opt/compiler-explorer/gcc-11.2.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-objdump
 compiler.ppc64clang.name=powerpc64 clang (trunk)
 compiler.ppc64clang.options=-target powerpc64
@@ -1652,7 +1649,6 @@ compiler.ppc64legtrunk.objdumper=/opt/compiler-explorer/powerpc64le/gcc-trunk/po
 compiler.ppc64legtrunk.demangler=/opt/compiler-explorer/powerpc64le/gcc-trunk/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-c++filt
 
 compiler.ppc64leclang.exe=/opt/compiler-explorer/clang-trunk/bin/clang++
-compiler.ppc64leclang.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.ppc64leclang.objdumper=/opt/compiler-explorer/gcc-11.2.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-objdump
 compiler.ppc64leclang.name=power64le clang (trunk)
 compiler.ppc64leclang.options=-target powerpc64le
@@ -2880,7 +2876,7 @@ compiler.gcc6502_1110.notification=This uses AVR-GCC 11.1.0 to compile C++ and u
 #################################
 # NVHPC nvc++
 
-group.nvcxx_x86_cxx.compilers=nvcxx_x86_cxx22_7:nvcxx_x86_cxx22_9:nvcxx_x86_cxx22_11:nvcxx_x86_cxx23_1:nvcxx_x86_cxx23_3:nvcxx_x86_cxx23_5:nvcxx_x86_cxx23_7:nvcxx_x86_cxx23_9:nvcxx_x86_cxx23_11:nvcxx_x86_cxx24_1
+group.nvcxx_x86_cxx.compilers=nvcxx_x86_cxx22_7:nvcxx_x86_cxx22_9:nvcxx_x86_cxx22_11:nvcxx_x86_cxx23_1:nvcxx_x86_cxx23_3:nvcxx_x86_cxx23_5:nvcxx_x86_cxx23_7:nvcxx_x86_cxx23_9:nvcxx_x86_cxx23_11:nvcxx_x86_cxx24_1:nvcxx_x86_cxx24_3
 group.nvcxx_x86_cxx.options=
 group.nvcxx_x86_cxx.binaryHideFuncRe=^(__.*|_(init|start|fini)|(de)?register_tm_clones|call_gmon_start|frame_dummy|\.plt.*|_dl_relocate_static_pie)$
 group.nvcxx_x86_cxx.needsMulti=false
@@ -2955,7 +2951,13 @@ compiler.nvcxx_x86_cxx24_1.nvdisasm=/opt/compiler-explorer/hpc_sdk/Linux_x86_64/
 compiler.nvcxx_x86_cxx24_1.exe=/opt/compiler-explorer/hpc_sdk/Linux_x86_64/24.1/compilers/bin/nvc++
 compiler.nvcxx_x86_cxx24_1.semver=24.1
 
-group.nvcxx_arm_cxx.compilers=nvcxx_arm_cxx22_7:nvcxx_arm_cxx22_9:nvcxx_arm_cxx22_11:nvcxx_arm_cxx23_1:nvcxx_arm_cxx23_3:nvcxx_arm_cxx23_5:nvcxx_arm_cxx23_7:nvcxx_arm_cxx23_9:nvcxx_arm_cxx23_11:nvcxx_arm_cxx24_1
+compiler.nvcxx_x86_cxx24_3.demangler=/opt/compiler-explorer/hpc_sdk/Linux_x86_64/24.3/compilers/bin/nvdecode
+compiler.nvcxx_x86_cxx24_3.cuobjdump=/opt/compiler-explorer/hpc_sdk/Linux_x86_64/24.3/cuda/12.3/bin/cuobjdump
+compiler.nvcxx_x86_cxx24_3.nvdisasm=/opt/compiler-explorer/hpc_sdk/Linux_x86_64/24.3/cuda/12.3/bin/nvdisasm
+compiler.nvcxx_x86_cxx24_3.exe=/opt/compiler-explorer/hpc_sdk/Linux_x86_64/24.3/compilers/bin/nvc++
+compiler.nvcxx_x86_cxx24_3.semver=24.3
+
+group.nvcxx_arm_cxx.compilers=nvcxx_arm_cxx22_7:nvcxx_arm_cxx22_9:nvcxx_arm_cxx22_11:nvcxx_arm_cxx23_1:nvcxx_arm_cxx23_3:nvcxx_arm_cxx23_5:nvcxx_arm_cxx23_7:nvcxx_arm_cxx23_9:nvcxx_arm_cxx23_11:nvcxx_arm_cxx24_1:nvcxx_arm_cxx24_3
 group.nvcxx_arm_cxx.options=
 group.nvcxx_arm_cxx.supportsBinary=true
 group.nvcxx_arm_cxx.binaryHideFuncRe=^(__.*|_(init|start|fini)|(de)?register_tm_clones|call_gmon_start|frame_dummy|\.plt.*|_dl_relocate_static_pie)$
@@ -3011,6 +3013,10 @@ compiler.nvcxx_arm_cxx24_1.demangler=/opt/compiler-explorer/hpc_sdk/Linux_aarch6
 compiler.nvcxx_arm_cxx24_1.exe=/opt/compiler-explorer/hpc_sdk/Linux_aarch64/24.1/compilers/bin/nvc++
 compiler.nvcxx_arm_cxx24_1.semver=24.1
 
+compiler.nvcxx_arm_cxx24_3.demangler=/opt/compiler-explorer/hpc_sdk/Linux_aarch64/24.3/compilers/bin/nvdecode
+compiler.nvcxx_arm_cxx24_3.exe=/opt/compiler-explorer/hpc_sdk/Linux_aarch64/24.3/compilers/bin/nvc++
+compiler.nvcxx_arm_cxx24_3.semver=24.3
+
 #################################
 # EDG compiler
 group.edg.compilers=&edg-gnu:&edg-default
@@ -3326,7 +3332,7 @@ libs.cppitertools.versions.200.version=v2.0
 libs.cppitertools.versions.200.path=/opt/compiler-explorer/libs/cppitertools/v2.0
 
 libs.cpptrace.name=cpptrace
-libs.cpptrace.versions=021:030:031:040:041
+libs.cpptrace.versions=021:030:031:040:041:050
 libs.cpptrace.url=https://github.com/jeremy-rifkin/cpptrace
 libs.cpptrace.description=Simple, portable, and self-contained stacktrace library for C++11 and newer
 libs.cpptrace.staticliblink=cpptrace
@@ -3342,6 +3348,8 @@ libs.cpptrace.versions.040.version=0.4.0
 libs.cpptrace.versions.040.path=/opt/compiler-explorer/libs/cpptrace/v0.4.0/include
 libs.cpptrace.versions.041.version=0.4.1
 libs.cpptrace.versions.041.path=/opt/compiler-explorer/libs/cpptrace/v0.4.1/include
+libs.cpptrace.versions.050.version=0.5.0
+libs.cpptrace.versions.050.path=/opt/compiler-explorer/libs/cpptrace/v0.5.0/include
 
 libs.crosscables.name=Crosscables
 libs.crosscables.url=https://github.com/partouf/Crosscables
diff --git a/etc/config/c.amazon.properties b/etc/config/c.amazon.properties
index 912caa9fd..a91655d16 100644
--- a/etc/config/c.amazon.properties
+++ b/etc/config/c.amazon.properties
@@ -295,19 +295,16 @@ compiler.cclang1810.exe=/opt/compiler-explorer/clang-18.1.0/bin/clang
 compiler.cclang1810.semver=18.1.0
 compiler.cclang1810.options=--gcc-toolchain=/opt/compiler-explorer/gcc-13.2.0
 compiler.cclang_trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang
-compiler.cclang_trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.cclang_trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.cclang_trunk.semver=(trunk)
 compiler.cclang_trunk.isNightly=true
 compiler.cclang_trunk.options=--gcc-toolchain=/opt/compiler-explorer/gcc-snapshot
 compiler.cclang_assertions_trunk.exe=/opt/compiler-explorer/clang-assertions-trunk/bin/clang
-compiler.cclang_assertions_trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.cclang_assertions_trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.cclang_assertions_trunk.semver=(assertions trunk)
 compiler.cclang_assertions_trunk.isNightly=true
 compiler.cclang_assertions_trunk.options=--gcc-toolchain=/opt/compiler-explorer/gcc-snapshot
 compiler.cclang_dang.exe=/opt/compiler-explorer/clang-dang-main/bin/clang
-compiler.cclang_dang.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.cclang_dang.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.cclang_dang.semver=(thephd.dev)
 compiler.cclang_dang.isNightly=true
@@ -545,7 +542,6 @@ compiler.armv8-cclang900.alias=armv8-cclang-9
 
 compiler.armv7-cclang-trunk.name=armv7-a clang (trunk)
 compiler.armv7-cclang-trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang
-compiler.armv7-cclang-trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.armv7-cclang-trunk.objdumper=/opt/compiler-explorer/arm/gcc-10.2.0/arm-unknown-linux-gnueabihf/bin/arm-unknown-linux-gnueabihf-objdump
 compiler.armv7-cclang-trunk.semver=(trunk)
 compiler.armv7-cclang-trunk.isNightly=true
@@ -554,7 +550,6 @@ compiler.armv7-cclang-trunk.options=-target arm-linux-gnueabi --gcc-toolchain=/o
 
 compiler.armv8-cclang-trunk.name=armv8-a clang (trunk)
 compiler.armv8-cclang-trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang
-compiler.armv8-cclang-trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.armv8-cclang-trunk.objdumper=/opt/compiler-explorer/arm64/gcc-10.2.0/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/bin/objdump
 compiler.armv8-cclang-trunk.semver=(trunk)
 compiler.armv8-cclang-trunk.isNightly=true
@@ -563,7 +558,6 @@ compiler.armv8-cclang-trunk.options=-target aarch64-linux-gnu --gcc-toolchain=/o
 
 compiler.armv8-full-cclang-trunk.name=armv8-a clang (all architectural features, trunk)
 compiler.armv8-full-cclang-trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang
-compiler.armv8-full-cclang-trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.armv8-full-cclang-trunk.objdumper=/opt/compiler-explorer/arm64/gcc-10.2.0/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/bin/objdump
 compiler.armv8-full-cclang-trunk.semver=(trunk allfeats)
 compiler.armv8-full-cclang-trunk.isNightly=true
@@ -620,7 +614,6 @@ compiler.cmos-osi-c1p-trunk.semver=osi-c1p
 ################################
 # Clang for RISC-V
 group.rvcclang.compilers=&rv32cclang:&rv64cclang
-group.rvcclang.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 group.rvcclang.supportsBinary=true
 group.rvcclang.supportsBinaryObject=true
 group.rvcclang.supportsExecute=false
@@ -745,7 +738,6 @@ group.wasmcclang.licensePreamble=The LLVM Project is under the Apache License v2
 group.wasmcclang.compilerCategories=clang
 
 compiler.wasm32cclang.exe=/opt/compiler-explorer/clang-trunk/bin/clang
-compiler.wasm32cclang.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.wasm32cclang.name=WebAssembly clang (trunk)
 compiler.wasm32cclang.isNightly=true
 compiler.wasm32cclang.options=-target wasm32
@@ -1384,7 +1376,6 @@ compiler.cppc64gtrunk.objdumper=/opt/compiler-explorer/powerpc64/gcc-trunk/power
 compiler.cppc64gtrunk.demangler=/opt/compiler-explorer/powerpc64/gcc-trunk/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-c++filt
 
 compiler.cppc64clang.exe=/opt/compiler-explorer/clang-trunk/bin/clang
-compiler.cppc64clang.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.cppc64clang.objdumper=/opt/compiler-explorer/gcc-11.2.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-objdump
 compiler.cppc64clang.name=powerpc64 clang (trunk)
 compiler.cppc64clang.options=-target powerpc64
@@ -1445,7 +1436,6 @@ compiler.cppc64legtrunk.objdumper=/opt/compiler-explorer/powerpc64le/gcc-trunk/p
 compiler.cppc64legtrunk.demangler=/opt/compiler-explorer/powerpc64le/gcc-trunk/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-c++filt
 
 compiler.cppc64leclang.exe=/opt/compiler-explorer/clang-trunk/bin/clang
-compiler.cppc64leclang.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.cppc64leclang.objdumper=/opt/compiler-explorer/gcc-11.2.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-objdump
 compiler.cppc64leclang.name=power64le clang (trunk)
 compiler.cppc64leclang.options=-target powerpc64le
diff --git a/etc/config/cpp_for_opencl.amazon.properties b/etc/config/cpp_for_opencl.amazon.properties
index 20ae69cdd..16b14a97a 100644
--- a/etc/config/cpp_for_opencl.amazon.properties
+++ b/etc/config/cpp_for_opencl.amazon.properties
@@ -137,7 +137,6 @@ compiler.armv8-cpp4oclclang1000.options=-cl-std=clc++ -x cl -Xclang -finclude-de
 #main dev version
 compiler.armv7-cpp4oclclang-trunk.name=armv7-a clang (trunk)
 compiler.armv7-cpp4oclclang-trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang
-compiler.armv7-cpp4oclclang-trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.armv7-cpp4oclclang-trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.armv7-cpp4oclclang-trunk.semver=(trunk)
 compiler.armv7-cpp4oclclang-trunk.isNightly=true
@@ -146,7 +145,6 @@ compiler.armv7-cpp4oclclang-trunk.options=-target arm-linux-gnueabi --gcc-toolch
 
 compiler.armv7-cpp4oclclang-trunk-assertions.name=armv7-a clang (trunk, assertions)
 compiler.armv7-cpp4oclclang-trunk-assertions.exe=/opt/compiler-explorer/clang-assertions-trunk/bin/clang
-compiler.armv7-cpp4oclclang-trunk-assertions.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.armv7-cpp4oclclang-trunk-assertions.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.armv7-cpp4oclclang-trunk-assertions.semver=(assertions trunk)
 compiler.armv7-cpp4oclclang-trunk-assertions.isNightly=true
@@ -155,7 +153,6 @@ compiler.armv7-cpp4oclclang-trunk-assertions.options=-target arm-linux-gnueabi -
 
 compiler.armv8-cpp4oclclang-trunk.name=armv8-a clang (trunk)
 compiler.armv8-cpp4oclclang-trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang
-compiler.armv8-cpp4oclclang-trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.armv8-cpp4oclclang-trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.armv8-cpp4oclclang-trunk.semver=(trunk)
 compiler.armv8-cpp4oclclang-trunk.isNightly=true
@@ -164,7 +161,6 @@ compiler.armv8-cpp4oclclang-trunk.options=-target aarch64-linux-gnu --gcc-toolch
 
 compiler.armv8-cpp4oclclang-trunk-assertions.name=armv8-a clang (trunk, assertions)
 compiler.armv8-cpp4oclclang-trunk-assertions.exe=/opt/compiler-explorer/clang-assertions-trunk/bin/clang
-compiler.armv8-cpp4oclclang-trunk-assertions.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.armv8-cpp4oclclang-trunk-assertions.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.armv8-cpp4oclclang-trunk-assertions.semver=(assertions trunk)
 compiler.armv8-cpp4oclclang-trunk-assertions.isNightly=true
@@ -173,7 +169,6 @@ compiler.armv8-cpp4oclclang-trunk-assertions.options=-target aarch64-linux-gnu -
 
 compiler.armv8-full-cpp4oclclang-trunk.name=armv8-a clang (all architectural features, trunk)
 compiler.armv8-full-cpp4oclclang-trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang
-compiler.armv8-full-cpp4oclclang-trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.armv8-full-cpp4oclclang-trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.armv8-full-cpp4oclclang-trunk.semver=(trunk allfeats)
 compiler.armv8-full-cpp4oclclang-trunk.isNightly=true
@@ -203,7 +198,6 @@ group.spirv64cpp4oclclang.baseOptions=-finclude-default-header -fdeclare-opencl-
 compiler.spirv32-cpp4oclclang-trunk.alias=armv7-cpp4oclclang-trunk-spir
 compiler.spirv32-cpp4oclclang-trunk.name=clang & llvm-spirv (trunk)
 compiler.spirv32-cpp4oclclang-trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang
-compiler.spirv32-cpp4oclclang-trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.spirv32-cpp4oclclang-trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.spirv32-cpp4oclclang-trunk.semver=(trunk)
 compiler.spirv32-cpp4oclclang-trunk.isNightly=true
@@ -211,7 +205,6 @@ compiler.spirv32-cpp4oclclang-trunk.isNightly=true
 compiler.spirv32-cpp4oclclang-trunk-assertions.alias=armv7-cpp4oclclang-trunk-assertions-spir
 compiler.spirv32-cpp4oclclang-trunk-assertions.name=clang & llvm-spirv (trunk, assertions)
 compiler.spirv32-cpp4oclclang-trunk-assertions.exe=/opt/compiler-explorer/clang-assertions-trunk/bin/clang
-compiler.spirv32-cpp4oclclang-trunk-assertions.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.spirv32-cpp4oclclang-trunk-assertions.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.spirv32-cpp4oclclang-trunk-assertions.semver=(assertions trunk)
 compiler.spirv32-cpp4oclclang-trunk-assertions.isNightly=true
@@ -220,7 +213,6 @@ compiler.spirv32-cpp4oclclang-trunk-assertions.isNightly=true
 compiler.spirv64-cpp4oclclang-trunk.alias=armv8-cpp4oclclang-trunk-spir64
 compiler.spirv64-cpp4oclclang-trunk.name=clang & llvm-spirv (trunk)
 compiler.spirv64-cpp4oclclang-trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang
-compiler.spirv64-cpp4oclclang-trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.spirv64-cpp4oclclang-trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.spirv64-cpp4oclclang-trunk.semver=(trunk)
 compiler.spirv64-cpp4oclclang-trunk.isNightly=true
@@ -228,7 +220,6 @@ compiler.spirv64-cpp4oclclang-trunk.isNightly=true
 compiler.spirv64-cpp4oclclang-trunk-assertions.alias=armv8-cpp4oclclang-trunk-assertions-spir64
 compiler.spirv64-cpp4oclclang-trunk-assertions.name=clang & llvm-spirv (trunk, assertions)
 compiler.spirv64-cpp4oclclang-trunk-assertions.exe=/opt/compiler-explorer/clang-assertions-trunk/bin/clang
-compiler.spirv64-cpp4oclclang-trunk-assertions.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.spirv64-cpp4oclclang-trunk-assertions.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.spirv64-cpp4oclclang-trunk-assertions.semver=(assertions trunk)
 compiler.spirv64-cpp4oclclang-trunk-assertions.isNightly=true
diff --git a/etc/config/llvm.amazon.properties b/etc/config/llvm.amazon.properties
index c3c2f6b48..4b4e6e434 100644
--- a/etc/config/llvm.amazon.properties
+++ b/etc/config/llvm.amazon.properties
@@ -50,11 +50,9 @@ compiler.irclang1600.semver=16.0.0
 compiler.irclang1701.exe=/opt/compiler-explorer/clang-17.0.1/bin/clang++
 compiler.irclang1701.semver=17.0.1
 compiler.irclangtrunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang++
-compiler.irclangtrunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.irclangtrunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.irclangtrunk.semver=(trunk)
 compiler.irclang-assertions-trunk.exe=/opt/compiler-explorer/clang-assertions-trunk/bin/clang++
-compiler.irclang-assertions-trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.irclang-assertions-trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.irclang-assertions-trunk.semver=(assertions trunk)
 
@@ -110,11 +108,9 @@ compiler.llc1600.semver=16.0.0
 compiler.llc1701.exe=/opt/compiler-explorer/clang-17.0.1/bin/llc
 compiler.llc1701.semver=17.0.1
 compiler.llctrunk.exe=/opt/compiler-explorer/clang-trunk/bin/llc
-compiler.llctrunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.llctrunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.llctrunk.semver=(trunk)
 compiler.llc-assertions-trunk.exe=/opt/compiler-explorer/clang-assertions-trunk/bin/llc
-compiler.llc-assertions-trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.llc-assertions-trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.llc-assertions-trunk.semver=(assertions trunk)
 
@@ -172,11 +168,9 @@ compiler.opt1600.semver=16.0.0
 compiler.opt1701.exe=/opt/compiler-explorer/clang-17.0.1/bin/opt
 compiler.opt1701.semver=17.0.1
 compiler.opttrunk.exe=/opt/compiler-explorer/clang-trunk/bin/opt
-compiler.opttrunk.demangler=/opt/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.opttrunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.opttrunk.semver=(trunk)
 compiler.opt-assertions-trunk.exe=/opt/compiler-explorer/clang-assertions-trunk/bin/opt
-compiler.opt-assertions-trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.opt-assertions-trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.opt-assertions-trunk.semver=(assertions trunk)
 
diff --git a/etc/config/openclc.amazon.properties b/etc/config/openclc.amazon.properties
index 26ba45c93..a96358c52 100644
--- a/etc/config/openclc.amazon.properties
+++ b/etc/config/openclc.amazon.properties
@@ -162,7 +162,6 @@ compiler.armv8-oclcclang900.options=-Xclang -finclude-default-header -target aar
 
 compiler.armv7-oclcclang-trunk.name=armv7-a clang (trunk)
 compiler.armv7-oclcclang-trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang
-compiler.armv7-oclcclang-trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.armv7-oclcclang-trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.armv7-oclcclang-trunk.semver=(trunk)
 # Arm v7-a with Neon and VFPv3
@@ -170,7 +169,6 @@ compiler.armv7-oclcclang-trunk.options=-target arm-linux-gnueabi --gcc-toolchain
 
 compiler.armv7-oclcclang-trunk-assertions.name=armv7-a clang (trunk, assertions)
 compiler.armv7-oclcclang-trunk-assertions.exe=/opt/compiler-explorer/clang-assertions-trunk/bin/clang
-compiler.armv7-oclcclang-trunk-assertions.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.armv7-oclcclang-trunk-assertions.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.armv7-oclcclang-trunk-assertions.semver=(assertions trunk)
 # Arm v7-a with Neon and VFPv3
@@ -178,7 +176,6 @@ compiler.armv7-oclcclang-trunk-assertions.options=-target arm-linux-gnueabi --gc
 
 compiler.armv8-oclcclang-trunk.name=armv8-a clang (trunk)
 compiler.armv8-oclcclang-trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang
-compiler.armv8-oclcclang-trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.armv8-oclcclang-trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.armv8-oclcclang-trunk.semver=(trunk)
 # Arm v8-a
@@ -186,7 +183,6 @@ compiler.armv8-oclcclang-trunk.options=-target aarch64-linux-gnu --gcc-toolchain
 
 compiler.armv8-oclcclang-trunk-assertions.name=armv8-a clang (trunk, assertions)
 compiler.armv8-oclcclang-trunk-assertions.exe=/opt/compiler-explorer/clang-assertions-trunk/bin/clang
-compiler.armv8-oclcclang-trunk-assertions.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.armv8-oclcclang-trunk-assertions.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.armv8-oclcclang-trunk-assertions.semver=(assertions trunk)
 # Arm v8-a
@@ -194,7 +190,6 @@ compiler.armv8-oclcclang-trunk-assertions.options=-target aarch64-linux-gnu --gc
 
 compiler.armv8-full-oclcclang-trunk.name=armv8-a clang (all architectural features, trunk)
 compiler.armv8-full-oclcclang-trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang
-compiler.armv8-full-oclcclang-trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.armv8-full-oclcclang-trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.armv8-full-oclcclang-trunk.semver=(trunk allfeats)
 # Arm v8-a with all supported architectural features
@@ -223,14 +218,12 @@ group.spirv64oclcclang.baseOptions=-finclude-default-header -fdeclare-opencl-bui
 compiler.spirv32-oclcclang-trunk.alias=armv7-oclcclang-trunk-spir
 compiler.spirv32-oclcclang-trunk.name=clang & llvm-spirv (trunk)
 compiler.spirv32-oclcclang-trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang
-compiler.spirv32-oclcclang-trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.spirv32-oclcclang-trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.spirv32-oclcclang-trunk.semver=(trunk)
 
 compiler.spirv32-oclcclang-trunk-assertions.alias=armv7-oclcclang-trunk-assertions-spir
 compiler.spirv32-oclcclang-trunk-assertions.name=clang & llvm-spirv (trunk, assertions)
 compiler.spirv32-oclcclang-trunk-assertions.exe=/opt/compiler-explorer/clang-assertions-trunk/bin/clang
-compiler.spirv32-oclcclang-trunk-assertions.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.spirv32-oclcclang-trunk-assertions.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.spirv32-oclcclang-trunk-assertions.semver=(assertions trunk)
 
@@ -238,14 +231,12 @@ compiler.spirv32-oclcclang-trunk-assertions.semver=(assertions trunk)
 compiler.spirv64-oclcclang-trunk.alias=armv8-oclcclang-trunk-spir64
 compiler.spirv64-oclcclang-trunk.name=clang & llvm-spirv (trunk)
 compiler.spirv64-oclcclang-trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang
-compiler.spirv64-oclcclang-trunk.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.spirv64-oclcclang-trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.spirv64-oclcclang-trunk.semver=(trunk)
 
 compiler.spirv64-oclcclang-trunk-assertions.alias=armv8-oclcclang-trunk-assertions-spir64
 compiler.spirv64-oclcclang-trunk-assertions.name=clang & llvm-spirv (trunk, assertions)
 compiler.spirv64-oclcclang-trunk-assertions.exe=/opt/compiler-explorer/clang-assertions-trunk/bin/clang
-compiler.spirv64-oclcclang-trunk-assertions.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 compiler.spirv64-oclcclang-trunk-assertions.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.spirv64-oclcclang-trunk-assertions.semver=(assertions trunk)
 
diff --git a/etc/scripts/docenizers/docenizer-riscv64.py b/etc/scripts/docenizers/docenizer-riscv64.py
index 5df4fba31..a95c2ff8b 100755
--- a/etc/scripts/docenizers/docenizer-riscv64.py
+++ b/etc/scripts/docenizers/docenizer-riscv64.py
@@ -40,7 +40,7 @@ class operation:
         html_opcode_args = f"<span class=\"opcode\"><b>{opcode}</b> {', '.join(yaml_record['opcode_args'])}</span>"
 
         # What ISA does this opcode belong to?
-        # Is is a psuedo opcode?
+        # Is it a psuedo opcode?
         group=""
 
         if 'main_desc' in yaml_record:
diff --git a/lib/compilers/clang.ts b/lib/compilers/clang.ts
index dab518bc7..73d14531e 100644
--- a/lib/compilers/clang.ts
+++ b/lib/compilers/clang.ts
@@ -55,10 +55,13 @@ export class ClangCompiler extends BaseCompiler {
     }
 
     constructor(info: PreliminaryCompilerInfo, env) {
-        // If a compiler-local llvm demangler exists - use it
-        const demanglerPath = path.join(path.dirname(info.exe), 'llvm-cxxfilt');
-        if (fs.existsSync(demanglerPath)) {
-            info.demangler = demanglerPath;
+        // By default use the compiler-local llvm demangler, but allow overriding from config
+        // (for bpf)
+        if (info.demangler === undefined) {
+            const demanglerPath = path.join(path.dirname(info.exe), 'llvm-cxxfilt');
+            if (fs.existsSync(demanglerPath)) {
+                info.demangler = demanglerPath;
+            }
         }
 
         super(info, env);
diff --git a/lib/parsers/dex2oat-pass-dump-parser.ts b/lib/parsers/dex2oat-pass-dump-parser.ts
index e10365ca9..6bd4ff543 100644
--- a/lib/parsers/dex2oat-pass-dump-parser.ts
+++ b/lib/parsers/dex2oat-pass-dump-parser.ts
@@ -111,7 +111,7 @@ export class Dex2OatPassDumpParser {
 
     // This method merges each function's (before) and (after) optimization
     // passes' text into a series of Pass objects.
-    // This method was adapted from from llvm-pass-dump-parser.ts.
+    // This method was adapted from llvm-pass-dump-parser.ts.
     mergeBeforeAfterPassDumps(functionsToPassDumps: Record<string, PassDump[]>) {
         const finalOutput: OptPipelineResults = {};
         for (const [functionName, passDumps] of Object.entries(functionsToPassDumps)) {
diff --git a/lib/sources/builtin.ts b/lib/sources/builtin.ts
index dda448971..d95a018d9 100644
--- a/lib/sources/builtin.ts
+++ b/lib/sources/builtin.ts
@@ -26,12 +26,11 @@ import fs from 'fs';
 import fsp from 'fs/promises';
 import path from 'path';
 
-import * as utils from '../utils.js';
 import * as props from '../properties.js';
 
 import type {Source, SourceEntry} from './index.js';
 
-const EXAMPLES_PATH = utils.resolvePathFromAppRoot(props.get('builtin', 'sourcePath', './examples/'));
+const EXAMPLES_PATH = props.get('builtin', 'sourcePath', './examples/');
 const NAME_SUBSTUTION_PATTERN = new RegExp('_', 'g');
 const ALL_EXAMPLES: SourceEntry[] = fs.readdirSync(EXAMPLES_PATH).flatMap(folder => {
     // Recurse through the language folders
diff --git a/static/panes/compiler.ts b/static/panes/compiler.ts
index 8b5d22319..a1d53d09f 100644
--- a/static/panes/compiler.ts
+++ b/static/panes/compiler.ts
@@ -33,7 +33,6 @@ import {LRUCache} from 'lru-cache';
 import {options} from '../options.js';
 import * as monaco from 'monaco-editor';
 import {Alert} from '../widgets/alert.js';
-import bigInt from 'big-integer';
 import {LibsWidget} from '../widgets/libs-widget.js';
 import * as codeLensHandler from '../codelens-handler.js';
 import * as monacoConfig from '../monaco-config.js';
@@ -80,7 +79,7 @@ import {CompilerShared} from '../compiler-shared.js';
 import {SentryCapture} from '../sentry.js';
 import {LLVMIrBackendOptions} from '../compilation/ir.interfaces.js';
 import {InstructionSet} from '../instructionsets.js';
-import {addDigitSeparator, escapeHTML} from '../../shared/common-utils.js';
+import {escapeHTML} from '../../shared/common-utils.js';
 import {CompilerVersionInfo, setCompilerVersionPopoverForPane} from '../widgets/compiler-version-info.js';
 
 const toolIcons = require.context('../../views/resources/logos', false, /\.(png|svg)$/);
@@ -3477,70 +3476,6 @@ export class Compiler extends MonacoPane<monaco.editor.IStandaloneCodeEditor, Co
         });
     }
 
-    private static readonly hexLike = /^(#?[$]|0x)([0-9a-fA-F]+)$/;
-    private static readonly hexLike2 = /^(#?)([0-9a-fA-F]+)H$/;
-    private static readonly decimalLike = /^(#?)(-?[0-9]+)$/;
-    private static readonly ptxFloat32 = /^0[fF]([0-9a-fA-F]{8})$/;
-    private static readonly ptxFloat64 = /^0[dD]([0-9a-fA-F]{16})$/;
-
-    private static parseNumericValue(value: string): bigInt.BigInteger | null {
-        const hexMatch = this.hexLike.exec(value) || this.hexLike2.exec(value);
-        if (hexMatch) return bigInt(hexMatch[2], 16);
-
-        const hexMatchPTX = this.ptxFloat32.exec(value) ?? this.ptxFloat64.exec(value);
-        if (hexMatchPTX) return bigInt(hexMatchPTX[1], 16);
-
-        const decMatch = this.decimalLike.exec(value);
-        if (decMatch) return bigInt(decMatch[2]);
-
-        return null;
-    }
-
-    public static getNumericToolTip(value: string, digitSeparator?: string) {
-        const formatNumber = (number, base, chunkSize) => {
-            const numberString = number.toString(base).toUpperCase();
-            if (digitSeparator !== undefined) {
-                return addDigitSeparator(numberString, digitSeparator, chunkSize);
-            } else {
-                return numberString;
-            }
-        };
-        const numericValue = this.parseNumericValue(value);
-        if (numericValue === null) return null;
-
-        // PTX floats
-        const view = new DataView(new ArrayBuffer(8));
-        view.setBigUint64(0, BigInt(numericValue.toString()), true);
-        if (this.ptxFloat32.test(value)) return view.getFloat32(0, true).toPrecision(9) + 'f';
-        if (this.ptxFloat64.test(value)) return view.getFloat64(0, true).toPrecision(17);
-
-        // Decimal representation.
-        let result = formatNumber(numericValue, 10, 3);
-
-        // Hexadecimal representation.
-        if (numericValue.isNegative()) {
-            const masked = bigInt('ffffffffffffffff', 16).and(numericValue);
-            result += ' = 0x' + formatNumber(masked, 16, 4);
-        } else {
-            result += ' = 0x' + formatNumber(numericValue, 16, 4);
-        }
-
-        // Float32/64 representation.
-        view.setBigUint64(0, BigInt(numericValue.toString()), true);
-        if (numericValue.bitLength().lesserOrEquals(32))
-            result += ' = ' + view.getFloat32(0, true).toPrecision(9) + 'f';
-        // only subnormal doubles and zero may have upper 32 bits all 0, assume unlikely to be double
-        else result += ' = ' + view.getFloat64(0, true).toPrecision(17);
-
-        // Printable ASCII character.
-        if (numericValue.greaterOrEquals(0x20) && numericValue.lesserOrEquals(0x7e)) {
-            const char = String.fromCharCode(numericValue.valueOf());
-            result += " = '" + char + "'";
-        }
-
-        return result;
-    }
-
     public static async getAsmInfo(
         opcode: string,
         instructionSet: InstructionSet,
@@ -3637,7 +3572,7 @@ export class Compiler extends MonacoPane<monaco.editor.IStandaloneCodeEditor, Co
             );
             const lang = this.compiler?.lang;
             const language = lang === undefined ? undefined : languages[lang];
-            const numericToolTip = Compiler.getNumericToolTip(word, language?.digitSeparator);
+            const numericToolTip = utils.getNumericToolTip(word, language?.digitSeparator);
             if (numericToolTip) {
                 this.decorations.numericToolTip = [
                     {
diff --git a/static/panes/device-view.ts b/static/panes/device-view.ts
index 70e5cd6f3..01cb29d4a 100644
--- a/static/panes/device-view.ts
+++ b/static/panes/device-view.ts
@@ -41,6 +41,7 @@ import {assert} from '../assert.js';
 import {Alert} from '../widgets/alert';
 import {Compiler} from './compiler';
 import {InstructionSet} from '../instructionsets.js';
+import * as utils from '../utils.js';
 
 export class DeviceAsm extends MonacoPane<monaco.editor.IStandaloneCodeEditor, DeviceAsmState> {
     private decorations: Record<string, monaco.editor.IModelDeltaDecoration[]>;
@@ -420,7 +421,7 @@ export class DeviceAsm extends MonacoPane<monaco.editor.IStandaloneCodeEditor, D
                 e.target.position.lineNumber,
                 currentWord.endColumn,
             );
-            const numericToolTip = Compiler.getNumericToolTip(word);
+            const numericToolTip = utils.getNumericToolTip(word);
             if (numericToolTip) {
                 this.decorations.numericToolTip = [
                     {
diff --git a/static/utils.ts b/static/utils.ts
index 83ba2b574..81decfae9 100644
--- a/static/utils.ts
+++ b/static/utils.ts
@@ -22,6 +22,9 @@
 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 // POSSIBILITY OF SUCH DAMAGE.
 
+import bigInt from 'big-integer';
+import {addDigitSeparator} from '../shared/common-utils.js';
+
 export function updateAndCalcTopBarHeight(domRoot: JQuery, topBar: JQuery, hideable: JQuery): number {
     let topBarHeight = 0;
     if (!topBar.hasClass('d-none')) {
@@ -83,3 +86,77 @@ export function formatISODate(dt: Date, full = false) {
         return dt.getUTCFullYear() + '-' + month.padStart(2, '0') + '-' + day.padStart(2, '0');
     }
 }
+
+const hexLike = /^(#?[$]|0x)([0-9a-fA-F]+)$/;
+const hexLike2 = /^(#?)([0-9a-fA-F]+)H$/;
+const decimalLike = /^(#?)(-?[0-9]+)$/;
+const ptxFloat32 = /^0[fF]([0-9a-fA-F]{8})$/;
+const ptxFloat64 = /^0[dD]([0-9a-fA-F]{16})$/;
+
+function parseNumericValue(value: string): bigInt.BigInteger | null {
+    const hexMatch = hexLike.exec(value) || hexLike2.exec(value);
+    if (hexMatch) return bigInt(hexMatch[2], 16);
+
+    const hexMatchPTX = ptxFloat32.exec(value) ?? ptxFloat64.exec(value);
+    if (hexMatchPTX) return bigInt(hexMatchPTX[1], 16);
+
+    const decMatch = decimalLike.exec(value);
+    if (decMatch) return bigInt(decMatch[2]);
+
+    return null;
+}
+
+export function getNumericToolTip(value: string, digitSeparator?: string): string | null {
+    const formatNumber = (number, base, chunkSize) => {
+        const numberString = number.toString(base).toUpperCase();
+        if (digitSeparator !== undefined) {
+            return addDigitSeparator(numberString, digitSeparator, chunkSize);
+        } else {
+            return numberString;
+        }
+    };
+    const numericValue = parseNumericValue(value);
+    if (numericValue === null) return null;
+
+    // PTX floats
+    const view = new DataView(new ArrayBuffer(8));
+    view.setBigUint64(0, BigInt(numericValue.toString()), true);
+    if (ptxFloat32.test(value)) return view.getFloat32(0, true).toPrecision(9) + 'f';
+    if (ptxFloat64.test(value)) return view.getFloat64(0, true).toPrecision(17);
+
+    // Decimal representation.
+    let result = formatNumber(numericValue, 10, 3);
+
+    // Hexadecimal representation.
+    if (numericValue.isNegative()) {
+        const masked = bigInt('ffffffffffffffff', 16).and(numericValue);
+        result += ' = 0x' + formatNumber(masked, 16, 4);
+    } else {
+        result += ' = 0x' + formatNumber(numericValue, 16, 4);
+    }
+
+    // Float32/64 representation.
+    view.setBigUint64(0, BigInt(numericValue.toString()), true);
+    if (numericValue.bitLength().lesserOrEquals(32)) result += ' = ' + view.getFloat32(0, true).toPrecision(9) + 'f';
+    // only subnormal doubles and zero may have upper 32 bits all 0, assume unlikely to be double
+    else result += ' = ' + view.getFloat64(0, true).toPrecision(17);
+
+    // Printable UTF-8 characters.
+    const bytes = numericValue.isNegative()
+        ? // bytes of negative number without sign extension
+          numericValue
+              .add(1)
+              .toArray(256)
+              .value.map(byte => byte ^ 0xff)
+        : numericValue.toArray(256).value;
+    // This assumes that `numericValue` is encoded as little-endian.
+    bytes.reverse();
+    const decoder = new TextDecoder('utf-8', {fatal: true});
+    try {
+        result += ' = ' + JSON.stringify(decoder.decode(Uint8Array.from(bytes)));
+    } catch (e) {
+        // ignore `TypeError` when the number is not valid UTF-8
+    }
+
+    return result;
+}


Test patch:
diff --git a/test/static/utils-tests.ts b/test/static/utils-tests.ts
new file mode 100644
index 000000000..b190b9ab1
--- /dev/null
+++ b/test/static/utils-tests.ts
@@ -0,0 +1,40 @@
+import {describe, expect, it} from 'vitest';
+
+import * as utils from '../../static/utils.js';
+
+describe('numeric tooltip', () => {
+    it('handles ASCII characters', () => {
+        expect(utils.getNumericToolTip('42')).toEqual('42 = 0x2A = 5.88545355e-44f = "*"');
+        expect(utils.getNumericToolTip('97')).toEqual('97 = 0x61 = 1.35925951e-43f = "a"');
+        expect(utils.getNumericToolTip('10')).toEqual('10 = 0xA = 1.40129846e-44f = "\\n"');
+        expect(utils.getNumericToolTip('92')).toEqual('92 = 0x5C = 1.28919459e-43f = "\\\\"');
+        expect(utils.getNumericToolTip('1')).toEqual('1 = 0x1 = 1.40129846e-45f = "\\u0001"');
+    });
+    it('handles ASCII strings', () => {
+        expect(utils.getNumericToolTip('0x61626364')).toEqual('1633837924 = 0x61626364 = 2.61007876e+20f = "dcba"');
+        expect(utils.getNumericToolTip('8583909746840200552')).toEqual(
+            '8583909746840200552 = 0x77202C6F6C6C6568 = 6.5188685003648344e+265 = "hello, w"',
+        );
+    });
+    it('handles UTF-8 strings', () => {
+        expect(utils.getNumericToolTip('-6934491452449512253')).toEqual(
+            '-6934491452449512253 = 0x9FC3BCC3B6C3A4C3 = -1.1500622354593239e-155 = "äöüß"',
+        );
+        expect(utils.getNumericToolTip('-1530699166')).toEqual(
+            '-1530699166 = 0xFFFFFFFFA4C36262 = -8.47344364e-17f = "bbä"',
+        );
+        expect(utils.getNumericToolTip('-23357')).toEqual('-23357 = 0xFFFFFFFFFFFFA4C3 = NaNf = "ä"');
+    });
+    it('inserts digit separators', () => {
+        expect(utils.getNumericToolTip('1234', '_')).toEqual('1_234 = 0x4D2 = 1.72920230e-42f');
+        expect(utils.getNumericToolTip('1234567', "'")).toEqual("1'234'567 = 0x12'D687 = 1.72999684e-39f");
+        expect(utils.getNumericToolTip('-6934491452449512253', '_')).toEqual(
+            '-6_934_491_452_449_512_253 = 0x9FC3_BCC3_B6C3_A4C3 = -1.1500622354593239e-155 = "äöüß"',
+        );
+    });
+    it('does nothing for strings that are not numbers', () => {
+        expect(utils.getNumericToolTip('word')).toEqual(null);
+        expect(utils.getNumericToolTip('NaN')).toEqual(null);
+        expect(utils.getNumericToolTip('1.5')).toEqual(null);
+    });
+});