aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Quist <partouf@gmail.com>2022-08-25 21:52:09 +0200
committerGitHub <noreply@github.com>2022-08-25 21:52:09 +0200
commit5b485d36e3708e192b63400d3bc30bb22cf33330 (patch)
treea6db770b803b7b6e82fa7224f331b38b7797f220
parent098e0abc4dc870278f1ab4c060c420a5999b54b3 (diff)
parent16dca9d307220229b80327ea0998c4cecec9137b (diff)
downloadcompiler-explorer-gh-4023.tar.gz
compiler-explorer-gh-4023.zip
Merge branch 'main' into z88dkgh-4023
-rw-r--r--.idea/scopes/Client.xml2
-rw-r--r--CONTRIBUTORS.md1
-rwxr-xr-xapp.js5
-rw-r--r--etc/config/ada.amazon.properties89
-rw-r--r--etc/config/c++.amazon.properties97
-rw-r--r--etc/config/c.amazon.properties103
-rw-r--r--etc/config/cppx_blue.defaults.properties (renamed from etc/config/cppx_blue.default.properties)0
-rw-r--r--etc/config/d.amazon.properties100
-rw-r--r--etc/config/fortran.amazon.properties157
-rw-r--r--etc/config/go.amazon.properties4
-rw-r--r--etc/config/hlsl.amazon.properties40
-rw-r--r--etc/config/hlsl.defaults.properties16
-rw-r--r--etc/config/sponsors.yaml3
-rw-r--r--etc/scripts/util/propscheck.py38
-rw-r--r--etc/scripts/util/propschecktest.py12
-rw-r--r--etc/scripts/util/test/cases/bad_duplicated_compiler.properties4
-rw-r--r--etc/scripts/util/test/cases/bad_duplicated_group.properties4
-rw-r--r--etc/scripts/util/test/cases/suspicious_path.properties3
-rw-r--r--lib/base-compiler.ts64
-rw-r--r--lib/compilers/_all.js1
-rw-r--r--lib/compilers/golang.ts (renamed from lib/compilers/golang.js)136
-rw-r--r--lib/compilers/hlsl.ts (renamed from lib/compilers/hlsl.js)25
-rw-r--r--lib/compilers/rga.ts276
-rw-r--r--lib/compilers/rust.ts32
-rw-r--r--lib/compilers/wine-vc.js5
-rw-r--r--lib/compilers/zig.js14
-rw-r--r--lib/exec.js3
-rw-r--r--lib/handlers/api.js9
-rw-r--r--lib/handlers/compile.js17
-rw-r--r--lib/parsers/llvm-pass-dump-parser.ts30
-rw-r--r--package.json2
-rw-r--r--static/compiler-service.ts6
-rw-r--r--static/main.js2
-rw-r--r--static/panes/llvm-opt-pipeline.ts2
-rw-r--r--static/panes/output.ts3
-rw-r--r--static/panes/pane.ts4
-rw-r--r--static/styles/explorer.scss (renamed from static/explorer.scss)4
-rw-r--r--static/styles/themes/dark-theme.scss (renamed from static/themes/dark-theme.scss)0
-rw-r--r--static/styles/themes/default-theme.scss (renamed from static/themes/default-theme.scss)0
-rw-r--r--types/compilation/llvm-opt-pipeline-output.interfaces.ts1
-rw-r--r--types/libraries/libraries.interfaces.ts4
-rw-r--r--views/templates/panes/compiler-output.pug3
-rw-r--r--views/templates/panes/compiler.pug2
-rw-r--r--views/templates/panes/llvm-opt-pipeline.pug32
44 files changed, 1081 insertions, 274 deletions
diff --git a/.idea/scopes/Client.xml b/.idea/scopes/Client.xml
index e656f0ee6..59a4d3044 100644
--- a/.idea/scopes/Client.xml
+++ b/.idea/scopes/Client.xml
@@ -1,3 +1,3 @@
<component name="DependencyValidationManager">
- <scope name="Client" pattern="file[compiler-explorer]:static/*||file[compiler-explorer]:static/themes/*||file[compiler-explorer]:static/assets/*||file[compiler-explorer]:views/*||file[compiler-explorer]:static/modes/*||file[compiler-explorer]:static/panes/*||file[compiler-explorer]:static/generated/*" />
+ <scope name="Client" pattern="file[compiler-explorer]:static/*||file[compiler-explorer]:static/styles/themes/*||file[compiler-explorer]:static/assets/*||file[compiler-explorer]:views/*||file[compiler-explorer]:static/modes/*||file[compiler-explorer]:static/panes/*||file[compiler-explorer]:static/generated/*" />
</component> \ No newline at end of file
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index 245f7bd16..b39dfe33c 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -121,3 +121,4 @@ From oldest to newest contributor, we would like to thank:
- [Ofek Shilon](https://github.com/ofekshilon)
- [Ross Smyth](https://github.com/RossSmyth)
- [Mike Urbach](https://github.com/mikeurbach)
+- [J. Ryan Stinnett](https://github.com/jryans)
diff --git a/app.js b/app.js
index bb4bdbac5..8643f8a6a 100755
--- a/app.js
+++ b/app.js
@@ -300,7 +300,10 @@ async function setupWebPackDevMiddleware(router) {
router.use(
webpackDevMiddleware(webpackCompiler, {
publicPath: '/static',
- stats: 'errors-only',
+ stats: {
+ preset: 'errors-only',
+ timings: true,
+ },
}),
);
diff --git a/etc/config/ada.amazon.properties b/etc/config/ada.amazon.properties
index 6fae62608..dfb36be8e 100644
--- a/etc/config/ada.amazon.properties
+++ b/etc/config/ada.amazon.properties
@@ -1,20 +1,21 @@
# Default settings for Ada
-compilers=&gnat:&gnatriscv64:&gnatarm:&gnats390x:&gnatmipss:&gnatppcs
-defaultCompiler=gnat121
+compilers=&gnat:&gnatcross
+defaultCompiler=gnat122
versionFlag=--version
compilerType=ada
+
###############################
# GCC (as in GNU Compiler Collection) for x86
-group.gnat.compilers=gnat82:gnat95:gnat102:gnat104:gnat111:gnat112:gnat113:gnat121:gnatsnapshot
+group.gnat.compilers=gnat82:gnat95:gnat102:gnat104:gnat111:gnat112:gnat113:gnat121:gnat122:gnatsnapshot
group.gnat.intelAsm=-masm=intel
group.gnat.groupName=x86-64
-group.gnat.isSemVer=true
group.gnat.baseName=x86-64 gnat
group.gnat.supportsBinary=true
group.gnat.supportsExecute=true
-group.gnat.objdumper=/opt/compiler-explorer/gcc-12.1.0/bin/objdump
-group.gnat.demangler=/opt/compiler-explorer/gcc-12.1.0/bin/c++filt
+group.gnat.objdumper=/opt/compiler-explorer/gcc-12.2.0/bin/objdump
+group.gnat.demangler=/opt/compiler-explorer/gcc-12.2.0/bin/c++filt
+group.gnat.isSemVer=true
compiler.gnat82.exe=/opt/compiler-explorer/gcc-8.2.0/bin/gnatmake
compiler.gnat82.semver=8.2
@@ -32,6 +33,8 @@ compiler.gnat113.exe=/opt/compiler-explorer/gcc-11.3.0/bin/gnatmake
compiler.gnat113.semver=11.3
compiler.gnat121.exe=/opt/compiler-explorer/gcc-12.1.0/bin/gnatmake
compiler.gnat121.semver=12.1
+compiler.gnat122.exe=/opt/compiler-explorer/gcc-12.2.0/bin/gnatmake
+compiler.gnat122.semver=12.2
compiler.gnatsnapshot.exe=/opt/compiler-explorer/gcc-snapshot/bin/gnatmake
compiler.gnatsnapshot.demangler=/opt/compiler-explorer/gcc-snapshot/bin/c++filt
compiler.gnatsnapshot.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
@@ -39,13 +42,17 @@ compiler.gnatsnapshot.name=x86-64 gnat (trunk)
compiler.gnatsnapshot.semver=(trunk)
################################
+# Cross GNAT
+group.gnatcross.compilers=&gnatriscv64:&gnatarm:&gnatarm64:&gnats390x:&gnatmipss:&gnatppcs
+group.gnatcross.supportsExecute=false
+group.gnatcross.supportsBinary=false
+group.gnatcross.isSemVer=true
+
+################################
# GNAT for riscv64
group.gnatriscv64.compilers=gnatriscv64112:gnatriscv64103
group.gnatriscv64.groupName=riscv64
group.gnatriscv64.instructionSet=riscv
-group.gnatriscv64.isSemVer=true
-group.gnatriscv64.supportsBinary=false
-group.gnatriscv64.supportsExecute=false
compiler.gnatriscv64103.exe=/opt/compiler-explorer/riscv64/gnat-riscv64-elf-linux64-10.3.0-2/bin/riscv64-elf-gnatmake
compiler.gnatriscv64103.demangler=/opt/compiler-explorer/riscv64/gnat-riscv64-elf-linux64-10.3.0-2/bin/riscv64-elf-c++filt
@@ -61,83 +68,109 @@ compiler.gnatriscv64112.adarts=/opt/compiler-explorer/riscv64/gnat-riscv64-elf-l
################################
# GNAT for s390x
-group.gnats390x.compilers=gnats390x1120
+group.gnats390x.compilers=gnats390x1120:gnats390x1210
group.gnats390x.groupName=s390x
group.gnats390x.instructionSet=s390x
group.gnats390x.baseName=s390x gnat
-group.gnats390x.isSemVer=true
-group.gnats390x.supportsBinary=false
-group.gnats390x.supportsExecute=false
compiler.gnats390x1120.exe=/opt/compiler-explorer/s390x/gcc-11.2.0/s390x-ibm-linux-gnu/bin/s390x-ibm-linux-gnu-gnatmake
compiler.gnats390x1120.demangler=/opt/compiler-explorer/s390x/gcc-11.2.0/s390x-ibm-linux-gnu/bin/s390x-ibm-linux-gnu-c++filt
compiler.gnats390x1120.semver=11.2.0
+compiler.gnats390x1210.exe=/opt/compiler-explorer/s390x/gcc-12.1.0/s390x-ibm-linux-gnu/bin/s390x-ibm-linux-gnu-gnatmake
+compiler.gnats390x1210.semver=12.1.0
################################
# GNAT for ppc
group.gnatppcs.compilers=&gnatppc:&gnatppc64:&gnatppc64le
group.gnatppcs.instructionSet=ppc
-group.gnatppcs.isSemVer=true
-group.gnatppcs.supportsBinary=false
-group.gnatppcs.supportsExecute=false
## POWER
group.gnatppc.groupName=power
-group.gnatppc.compilers=gnatppc1120
+group.gnatppc.compilers=gnatppc1120:gnatppc1210
group.gnatppc.baseName=powerpc gnat
+
compiler.gnatppc1120.exe=/opt/compiler-explorer/powerpc/gcc-11.2.0/powerpc-unknown-linux-gnu/bin/powerpc-unknown-linux-gnu-gnatmake
compiler.gnatppc1120.demangler=/opt/compiler-explorer/powerpc/gcc-11.2.0/powerpc-unknown-linux-gnu/bin/powerpc-unknown-linux-gnu-c++filt
compiler.gnatppc1120.semver=11.2.0
+compiler.gnatppc1210.exe=/opt/compiler-explorer/powerpc/gcc-12.1.0/powerpc-unknown-linux-gnu/bin/powerpc-unknown-linux-gnu-gnatmake
+compiler.gnatppc1210.demangler=/opt/compiler-explorer/powerpc/gcc-12.1.0/powerpc-unknown-linux-gnu/bin/powerpc-unknown-linux-gnu-c++filt
+compiler.gnatppc1210.semver=12.1.0
+
## POWER64
group.gnatppc64.groupName=power64
-group.gnatppc64.compilers=gnatppc641120
+group.gnatppc64.compilers=gnatppc641120:gnatppc641210
group.gnatppc64.baseName=powerpc64 gnat
+
compiler.gnatppc641120.exe=/opt/compiler-explorer/powerpc64/gcc-11.2.0/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-gnatmake
compiler.gnatppc641120.demangler=/opt/compiler-explorer/powerpc64/gcc-11.2.0/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-c++filt
compiler.gnatppc641120.semver=11.2.0
+compiler.gnatppc641210.exe=/opt/compiler-explorer/powerpc64/gcc-12.1.0/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-gnatmake
+compiler.gnatppc641210.demangler=/opt/compiler-explorer/powerpc64/gcc-12.1.0/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-c++filt
+compiler.gnatppc641210.semver=12.1.0
+
## POWER64LE
group.gnatppc64le.groupName=power64le
-group.gnatppc64le.compilers=gnatppc64le1120
+group.gnatppc64le.compilers=gnatppc64le1120:gnatppc64le1210
group.gnatppc64le.baseName=powerpc64le gnat
+
compiler.gnatppc64le1120.exe=/opt/compiler-explorer/powerpc64le/gcc-11.2.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-gnatmake
compiler.gnatppc64le1120.demangler=/opt/compiler-explorer/powerpc64le/gcc-11.2.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-c++filt
compiler.gnatppc64le1120.semver=11.2.0
+compiler.gnatppc64le1210.exe=/opt/compiler-explorer/powerpc64le/gcc-12.1.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-gnatmake
+compiler.gnatppc64le1210.demangler=/opt/compiler-explorer/powerpc64le/gcc-12.1.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-c++filt
+compiler.gnatppc64le1210.semver=12.1.0
+
################################
-# GNAT for MIPS
+# GNAT for MIPSs
+## GNAT builds for mipsel and mips64el are broken on 12.1.0
group.gnatmipss.compilers=&gnatmips:&gnatmips64
group.gnatmipss.instructionSet=mips
-group.gnatmipss.isSemVer=true
-group.gnatmipss.supportsBinary=false
-group.gnatmipss.supportsExecute=false
## MIPS
group.gnatmips.groupName=mips
-group.gnatmips.compilers=gnatmips1120
+group.gnatmips.compilers=gnatmips1120:gnatmips1210
group.gnatmips.baseName=mips gnat
+
compiler.gnatmips1120.exe=/opt/compiler-explorer/mips/gcc-11.2.0/mips-unknown-linux-gnu/bin/mips-unknown-linux-gnu-gnatmake
compiler.gnatmips1120.demangler=/opt/compiler-explorer/mips/gcc-11.2.0/mips-unknown-linux-gnu/bin/mips-unknown-linux-gnu-c++filt
compiler.gnatmips1120.semver=11.2.0
+compiler.gnatmips1210.exe=/opt/compiler-explorer/mips/gcc-12.1.0/mips-unknown-linux-gnu/bin/mips-unknown-linux-gnu-gnatmake
+compiler.gnatmips1210.semver=12.1.0
+compiler.gnatmips1210.objdumper=/opt/compiler-explorer/mips/gcc-12.1.0/mips-unknown-linux-gnu/bin/mips-unknown-linux-gnu-objdump
+
## MIPS64
group.gnatmips64.groupName=mips64
-group.gnatmips64.compilers=gnatmips641120
+group.gnatmips64.compilers=gnatmips641120:gnatmips641210
group.gnatmips64.baseName=mips64 gnat
compiler.gnatmips641120.exe=/opt/compiler-explorer/mips64/gcc-11.2.0/mips64-unknown-linux-gnu/bin/mips64-unknown-linux-gnu-gnatmake
compiler.gnatmips641120.demangler=/opt/compiler-explorer/mips64/gcc-11.2.0/mips64-unknown-linux-gnu/bin/mips64-unknown-linux-gnu-c++filt
compiler.gnatmips641120.semver=11.2.0
+compiler.gnatmips641210.exe=/opt/compiler-explorer/mips64/gcc-12.1.0/mips64-unknown-linux-gnu/bin/mips64-unknown-linux-gnu-gnatmake
+compiler.gnatmips641210.demangler=/opt/compiler-explorer/mips64/gcc-12.1.0/mips64-unknown-linux-gnu/bin/mips64-unknown-linux-gnu-c++filt
+compiler.gnatmips641210.semver=12.1.0
+
+################################
+# GNAT for arm64
+group.gnatarm64.compilers=gnatarm641210
+group.gnatarm64.groupName=arm64
+group.gnatarm64.baseName=arm64 gnat
+group.gnatarm64.instructionSet=arm64
+
+compiler.gnatarm641210.exe=/opt/compiler-explorer/arm64/gcc-12.1.0/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-gnatmake
+compiler.gnatarm641210.semver=12.1.0
+compiler.gnatarm641210.objdumper=/opt/compiler-explorer/arm64/gcc-12.1.0/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-objdump
+
################################
# GNAT for arm
group.gnatarm.compilers=gnatarm112:gnatarm103
group.gnatarm.groupName=arm
group.gnatarm.instructionSet=arm32
-group.gnatarm.isSemVer=true
-group.gnatarm.supportsBinary=false
-group.gnatarm.supportsExecute=false
compiler.gnatarm103.exe=/opt/compiler-explorer/arm/gnat-arm-elf-linux64-10.3.0-2/bin/arm-eabi-gnatmake
compiler.gnatarm103.demangler=/opt/compiler-explorer/arm/gnat-arm-elf-linux64-10.3.0-2/bin/arm-eabi-c++filt
diff --git a/etc/config/c++.amazon.properties b/etc/config/c++.amazon.properties
index 48ae23f59..5fac61bdb 100644
--- a/etc/config/c++.amazon.properties
+++ b/etc/config/c++.amazon.properties
@@ -1,7 +1,7 @@
compilers=&gcc86:&icc:&icx:&clang:&clangx86trunk:&rvclang:&wasmclang:&cl:&cross:&ellcc:&zapcc:&djggp:www.godbolt.ms@443:&armclang32:&armclang64:&zigcxx:&cxx6502
-defaultCompiler=g121
-demangler=/opt/compiler-explorer/gcc-12.1.0/bin/c++filt
-objdumper=/opt/compiler-explorer/gcc-12.1.0/bin/objdump
+defaultCompiler=g122
+demangler=/opt/compiler-explorer/gcc-12.2.0/bin/c++filt
+objdumper=/opt/compiler-explorer/gcc-12.2.0/bin/objdump
needsMulti=false
buildenvsetup=ceconan
@@ -12,7 +12,7 @@ externalparser.exe=/usr/local/bin/asm-parser
###############################
# GCC for x86
-group.gcc86.compilers=g412:g447:g453:g464:g471:g472:g473:g474:g481:g482:g483:g484:g485:g490:g491:g492:g493:g494:g510:g520:g530:g540:g550:g6:g62:g63:g64:g71:g72:g73:g74:g75:g81:g82:g83:g84:g85:g91:g92:g93:g94:g95:g101:g102:g103:g104:g111:g112:g113:g121:gsnapshot:gcontracts-trunk:gcontract-labels-trunk:gcxx-modules-trunk:gcxx-coroutines-trunk:gcc-embed-trunk:gcc-static-analysis-trunk
+group.gcc86.compilers=g412:g447:g453:g464:g471:g472:g473:g474:g481:g482:g483:g484:g485:g490:g491:g492:g493:g494:g510:g520:g530:g540:g550:g6:g62:g63:g64:g71:g72:g73:g74:g75:g81:g82:g83:g84:g85:g91:g92:g93:g94:g95:g101:g102:g103:g104:g111:g112:g113:g121:g122:gsnapshot:gcontracts-trunk:gcontract-labels-trunk:gcxx-modules-trunk:gcxx-coroutines-trunk:gcc-embed-trunk:gcc-static-analysis-trunk
group.gcc86.groupName=GCC x86-64
group.gcc86.instructionSet=amd64
group.gcc86.baseName=x86-64 gcc
@@ -132,6 +132,9 @@ compiler.g113.exe=/opt/compiler-explorer/gcc-11.3.0/bin/g++
compiler.g113.semver=11.3
compiler.g121.exe=/opt/compiler-explorer/gcc-12.1.0/bin/g++
compiler.g121.semver=12.1
+compiler.g122.exe=/opt/compiler-explorer/gcc-12.2.0/bin/g++
+compiler.g122.semver=12.2
+
compiler.gsnapshot.exe=/opt/compiler-explorer/gcc-snapshot/bin/g++
compiler.gsnapshot.demangler=/opt/compiler-explorer/gcc-snapshot/bin/c++filt
compiler.gsnapshot.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
@@ -701,9 +704,9 @@ group.s390x.compilers=&gccs390x
# GCC for s390x
group.gccs390x.supportsBinary=true
group.gccs390x.supportsExecute=false
-
-group.gccs390x.groupName=s390x G++
-group.gccs390x.compilers=gccs390x1120
+group.gccs390x.baseName=s390x gcc
+group.gccs390x.groupName=s390x gcc
+group.gccs390x.compilers=gccs390x1120:s390xg1210
group.gccs390x.isSemVer=true
group.gccs390x.objdumper=/opt/compiler-explorer/s390x/gcc-11.2.0/s390x-ibm-linux-gnu/bin/s390x-ibm-linux-gnu-objdump
@@ -711,6 +714,10 @@ compiler.gccs390x1120.exe=/opt/compiler-explorer/s390x/gcc-11.2.0/s390x-ibm-linu
compiler.gccs390x1120.name=s390x gcc 11.2.0
compiler.gccs390x1120.semver=11.2.0
+compiler.s390xg1210.exe=/opt/compiler-explorer/s390x/gcc-12.1.0/s390x-ibm-linux-gnu/bin/s390x-ibm-linux-gnu-g++
+compiler.s390xg1210.semver=12.1.0
+compiler.s390xg1210.objdumper=/opt/compiler-explorer/s390x/gcc-12.1.0/s390x-ibm-linux-gnu/bin/s390x-ibm-linux-gnu-objdump
+
###############################
# Cross compilers for PPC
group.ppcs.compilers=&ppc:&ppc64:&ppc64le
@@ -719,32 +726,46 @@ group.ppcs.supportsBinary=true
group.ppcs.supportsExecute=false
## POWER
-group.ppc.compilers=ppcg1120:ppcg48
+group.ppc.compilers=ppcg48:ppcg1120:ppcg1210
group.ppc.groupName=POWER
group.ppc.baseName=power gcc
compiler.ppcg48.exe=/opt/compiler-explorer/powerpc/gcc-4.8.5/bin/powerpc-unknown-linux-gnu-g++
compiler.ppcg48.objdumper=/opt/compiler-explorer/powerpc/gcc-4.8.5/bin/powerpc-unknown-linux-gnu-objdump
compiler.ppcg48.semver=4.8.5
+
compiler.ppcg1120.exe=/opt/compiler-explorer/powerpc/gcc-11.2.0/powerpc-unknown-linux-gnu/bin/powerpc-unknown-linux-gnu-g++
compiler.ppcg1120.objdumper=/opt/compiler-explorer/powerpc/gcc-11.2.0/powerpc-unknown-linux-gnu/bin/powerpc-unknown-linux-gnu-objdump
compiler.ppcg1120.semver=11.2.0
+compiler.ppcg1210.exe=/opt/compiler-explorer/powerpc/gcc-12.1.0/powerpc-unknown-linux-gnu/bin/powerpc-unknown-linux-gnu-g++
+compiler.ppcg1210.semver=12.1.0
+compiler.ppcg1210.objdumper=/opt/compiler-explorer/powerpc/gcc-12.1.0/powerpc-unknown-linux-gnu/bin/powerpc-unknown-linux-gnu-objdump
+
## POWER64
group.ppc64.groupName=POWER64
-group.ppc64.compilers=ppc64g8:ppc64g9:ppc64g1120:ppc64clang
+group.ppc64.baseName=power64 gcc
+group.ppc64.compilers=ppc64g8:ppc64g9:ppc64g1120:ppc64g1210:ppc64clang
+
compiler.ppc64g8.exe=/opt/compiler-explorer/powerpc64/gcc-at12/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-g++
compiler.ppc64g8.objdumper=/opt/compiler-explorer/powerpc64/gcc-at12/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-objdump
compiler.ppc64g8.name=power64 AT12.0 (gcc8)
compiler.ppc64g8.semver=(snapshot)
+
compiler.ppc64g9.exe=/opt/compiler-explorer/powerpc64/gcc-at13/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-g++
compiler.ppc64g9.objdumper=/opt/compiler-explorer/powerpc64/gcc-at13/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-objdump
compiler.ppc64g9.name=power64 AT13.0 (gcc9)
compiler.ppc64g9.semver=(snapshot)
+
compiler.ppc64g1120.exe=/opt/compiler-explorer/powerpc64/gcc-11.2.0/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-g++
compiler.ppc64g1120.objdumper=/opt/compiler-explorer/powerpc64/gcc-11.2.0/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-objdump
compiler.ppc64g1120.semver=power64 gcc 11.2.0
compiler.ppc64g1120.name=power64 gcc 11.2.0
+
+compiler.ppc64g1210.exe=/opt/compiler-explorer/powerpc64/gcc-12.1.0/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-g++
+compiler.ppc64g1210.semver=12.1.0
+compiler.ppc64g1210.objdumper=/opt/compiler-explorer/powerpc64/gcc-12.1.0/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-objdump
+
compiler.ppc64clang.exe=/opt/compiler-explorer/clang-trunk/bin/clang++
compiler.ppc64clang.demangler=/opt/compiler-explorer/gcc-snapshot/bin/c++filt
compiler.ppc64clang.objdumper=/opt/compiler-explorer/gcc-11.2.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-objdump
@@ -755,23 +776,34 @@ compiler.ppc64clang.semver=(snapshot)
## POWER64LE
group.ppc64le.groupName=POWER64LE
-group.ppc64le.compilers=ppc64leg630:ppc64leg8:ppc64leg9:ppc64leg1120:ppc64leclang
+group.ppc64le.compilers=ppc64leg630:ppc64leg8:ppc64leg9:ppc64leg1120:ppc64leg1210:ppc64leclang
+group.ppc64le.baseName=power64le gcc
+
compiler.ppc64leg630.exe=/opt/compiler-explorer/powerpc64le/gcc-6.3.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-g++
compiler.ppc64leg630.objdumper=/opt/compiler-explorer/powerpc64le/gcc-6.3.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-objdump
compiler.ppc64leg630.name=power64le gcc 6.3.0
compiler.ppc64leg630.semver=6.3.0
+
compiler.ppc64leg8.exe=/opt/compiler-explorer/powerpc64le/gcc-at12/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-g++
compiler.ppc64leg8.name=power64le AT12.0 (gcc8)
compiler.ppc64leg8.objdumper=/opt/compiler-explorer/powerpc64le/gcc-at12/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-objdump
compiler.ppc64leg8.semver=(snapshot)
+
compiler.ppc64leg9.exe=/opt/compiler-explorer/powerpc64le/gcc-at13/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-g++
compiler.ppc64leg9.objdumper=/opt/compiler-explorer/powerpc64le/gcc-at13/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-objdump
compiler.ppc64leg9.name=power64le AT13.0 (gcc9)
compiler.ppc64leg9.semver=(snapshot)
+
compiler.ppc64leg1120.exe=/opt/compiler-explorer/powerpc64le/gcc-11.2.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-g++
compiler.ppc64leg1120.objdumper=/opt/compiler-explorer/powerpc64le/gcc-11.2.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-objdump
compiler.ppc64leg1120.name=power64le gcc 11.2.0
compiler.ppc64leg1120.semver=11.2.0
+
+compiler.ppc64leg1210.exe=/opt/compiler-explorer/powerpc64le/gcc-12.1.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-g++
+compiler.ppc64leg1210.semver=12.1.0
+compiler.ppc64leg1120.name=power64le gcc 12.1.0
+compiler.ppc64leg1210.objdumper=/opt/compiler-explorer/powerpc64le/gcc-12.1.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-objdump
+
compiler.ppc64leclang.exe=/opt/compiler-explorer/clang-trunk/bin/clang++
compiler.ppc64leclang.demangler=/opt/compiler-explorer/gcc-snapshot/bin/c++filt
compiler.ppc64leclang.objdumper=/opt/compiler-explorer/gcc-11.2.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-objdump
@@ -879,6 +911,7 @@ compiler.arm1130.exe=/opt/compiler-explorer/arm/gcc-11.3.0/arm-unknown-linux-gnu
compiler.arm1130.name=ARM gcc 11.3 (linux)
compiler.arm1130.semver=11.3.0
compiler.arm1210.exe=/opt/compiler-explorer/arm/gcc-12.1.0/arm-unknown-linux-gnueabihf/bin/arm-unknown-linux-gnueabihf-g++
+compiler.arm1210.objdumper=/opt/compiler-explorer/arm/gcc-12.1.0/arm-unknown-linux-gnueabihf/bin/arm-unknown-linux-gnueabihf-objdump
compiler.arm1210.name=ARM gcc 12.1 (linux)
compiler.arm1210.semver=12.1.0
compiler.armgtrunk.exe=/opt/compiler-explorer/arm/gcc-trunk/arm-unknown-linux-gnueabihf/bin/arm-unknown-linux-gnueabihf-g++
@@ -921,6 +954,7 @@ compiler.arm64g1120.semver=11.2
compiler.arm64g1130.exe=/opt/compiler-explorer/arm64/gcc-11.3.0/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-g++
compiler.arm64g1130.semver=11.3
compiler.arm64g1210.exe=/opt/compiler-explorer/arm64/gcc-12.1.0/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-g++
+compiler.arm64g1210.objdumper=/opt/compiler-explorer/arm64/gcc-12.1.0/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-objdump
compiler.arm64g1210.semver=12.1
compiler.arm64gtrunk.exe=/opt/compiler-explorer/arm64/gcc-trunk/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-g++
compiler.arm64gtrunk.semver=trunk
@@ -1019,7 +1053,7 @@ compiler.msp430g621.semver=6.2.1
################################
# GCC for AVR
-group.avr.compilers=avrg454:avrg464:avrg540:avrg920:avrg930:avrg1030:avrg1100
+group.avr.compilers=avrg454:avrg464:avrg540:avrg920:avrg930:avrg1030:avrg1100:avrg1210
group.avr.groupName=AVR GCC
group.avr.baseName=AVR gcc
group.avr.isSemVer=true
@@ -1028,25 +1062,35 @@ compiler.avrg454.exe=/opt/compiler-explorer/avr/gcc-4.5.4/bin/avr-g++
compiler.avrg454.alias=avrg453
compiler.avrg454.semver=4.5.4
compiler.avrg454.supportsBinary=false
+
compiler.avrg464.exe=/opt/compiler-explorer/avr/gcc-4.6.4/bin/avr-g++
compiler.avrg464.semver=4.6.4
compiler.avrg464.objdumper=/opt/compiler-explorer/avr/gcc-4.6.4/bin/avr-objdump
+
compiler.avrg540.exe=/opt/compiler-explorer/avr/arduino-1.8.9/hardware/tools/avr/bin/avr-g++
compiler.avrg540.semver=5.4.0
compiler.avrg540.objdumper=/opt/compiler-explorer/avr/arduino-1.8.9/hardware/tools/avr/bin/avr-objdump
+
compiler.avrg920.exe=/opt/compiler-explorer/avr/gcc-9.2.0/bin/avr-g++
compiler.avrg920.semver=9.2.0
compiler.avrg920.objdumper=/opt/compiler-explorer/avr/gcc-9.2.0/bin/avr-objdump
+
compiler.avrg930.exe=/opt/compiler-explorer/avr/gcc-9.3.0/bin/avr-g++
compiler.avrg930.semver=9.3.0
compiler.avrg930.objdumper=/opt/compiler-explorer/avr/gcc-9.3.0/bin/avr-objdump
+
compiler.avrg1030.exe=/opt/compiler-explorer/avr/gcc-10.3.0/bin/avr-g++
compiler.avrg1030.semver=10.3.0
compiler.avrg1030.objdumper=/opt/compiler-explorer/avr/gcc-10.3.0/bin/avr-objdump
+
compiler.avrg1100.exe=/opt/compiler-explorer/avr/gcc-11.1.0/bin/avr-g++
compiler.avrg1100.semver=11.1.0
compiler.avrg1100.objdumper=/opt/compiler-explorer/avr/gcc-11.1.0/bin/avr-objdump
+compiler.avrg1210.exe=/opt/compiler-explorer/avr/gcc-12.1.0/avr/bin/avr-g++
+compiler.avrg1210.semver=12.1.0
+compiler.avrg1210.objdumper=/opt/compiler-explorer/avr/gcc-12.1.0/avr/bin/avr-objdump
+
###############################
# GCC for MIPS
group.mipss.compilers=&mips:&mipsel:&mips64:&mips64el
@@ -1057,46 +1101,69 @@ group.mipss.supportsExecute=false
## MIPS
group.mips.groupName=MIPS GCC
-group.mips.compilers=mips5:mips930:mips1120
+group.mips.compilers=mips5:mips930:mips1120:mipsg1210
group.mips.baseName=mips gcc
+
compiler.mips5.exe=/opt/compiler-explorer/mips/gcc-5.4.0/mips-unknown-linux-gnu/bin/mips-unknown-linux-gnu-g++
compiler.mips5.semver=5.4
compiler.mips5.objdumper=/opt/compiler-explorer/mips/gcc-5.4.0/mips-unknown-linux-gnu/bin/mips-unknown-linux-gnu-objdump
+
compiler.mips930.exe=/opt/compiler-explorer/mips/mips-mti-elf/2020.06-01/bin/mips-mti-elf-g++
compiler.mips930.name=mips gcc 9.3.0 (codescape)
compiler.mips930.semver=9.3.0
compiler.mips930.objdumper=/opt/compiler-explorer/mips/mips-mti-elf/2020.06-01/bin/mips-mti-elf-objdump
+
compiler.mips1120.exe=/opt/compiler-explorer/mips/gcc-11.2.0/mips-unknown-linux-gnu/bin/mips-unknown-linux-gnu-g++
compiler.mips1120.semver=11.2.0
compiler.mips1120.objdumper=/opt/compiler-explorer/mips/gcc-11.2.0/mips-unknown-linux-gnu/bin/mips-unknown-linux-gnu-objdump
+compiler.mipsg1210.exe=/opt/compiler-explorer/mips/gcc-12.1.0/mips-unknown-linux-gnu/bin/mips-unknown-linux-gnu-g++
+compiler.mipsg1210.semver=12.1.0
+compiler.mipsg1210.objdumper=/opt/compiler-explorer/mips/gcc-12.1.0/mips-unknown-linux-gnu/bin/mips-unknown-linux-gnu-objdump
+
## MIPS 64
group.mips64.groupName=MIPS64 GCC
-group.mips64.compilers=mips564:mips112064
+group.mips64.compilers=mips564:mips112064:mips64g1210
group.mips64.baseName=mips64 gcc
+
compiler.mips564.exe=/opt/compiler-explorer/mips64/gcc-5.4.0/mips64-unknown-linux-gnu/bin/mips64-unknown-linux-gnu-g++
compiler.mips564.semver=5.4
compiler.mips564.objdumper=/opt/compiler-explorer/mips64/gcc-5.4.0/mips64-unknown-linux-gnu/bin/mips64-unknown-linux-gnu-objdump
+
compiler.mips112064.exe=/opt/compiler-explorer/mips64/gcc-11.2.0/mips64-unknown-linux-gnu/bin/mips64-unknown-linux-gnu-g++
compiler.mips112064.semver=11.2.0
compiler.mips112064.objdumper=/opt/compiler-explorer/mips64/gcc-11.2.0/mips64-unknown-linux-gnu/bin/mips64-unknown-linux-gnu-objdump
+compiler.mips64g1210.exe=/opt/compiler-explorer/mips64/gcc-12.1.0/mips64-unknown-linux-gnu/bin/mips64-unknown-linux-gnu-g++
+compiler.mips64g1210.semver=12.1.0
+compiler.mips64g1210.objdumper=/opt/compiler-explorer/mips64/gcc-12.1.0/mips64-unknown-linux-gnu/bin/mips64-unknown-linux-gnu-objdump
+
## MIPS EL
group.mipsel.groupName=MIPSEL GCC
-group.mipsel.compilers=mips5el
+group.mipsel.compilers=mips5el:mipselg1210
group.mipsel.baseName=mipsel gcc
+
compiler.mips5el.exe=/opt/compiler-explorer/mipsel/gcc-5.4.0/mipsel-unknown-linux-gnu/bin/mipsel-unknown-linux-gnu-g++
compiler.mips5el.semver=5.4
compiler.mips5el.objdumper=/opt/compiler-explorer/mipsel/gcc-5.4.0/mipsel-unknown-linux-gnu/mipsel-unknown-linux-gnu/bin/objdump
+compiler.mipselg1210.exe=/opt/compiler-explorer/mipsel/gcc-12.1.0/mipsel-multilib-linux-gnu/bin/mipsel-multilib-linux-gnu-g++
+compiler.mipselg1210.semver=12.1.0
+compiler.mipselg1210.objdumper=/opt/compiler-explorer/mipsel/gcc-12.1.0/mipsel-multilib-linux-gnu/bin/mipsel-multilib-linux-gnu-objdump
+
## MIPS 64 EL
group.mips64el.groupName=MIPS64EL GCC
-group.mips64el.compilers=mips564el
+group.mips64el.compilers=mips564el:mips64elg1210
group.mips64el.baseName=mips64 (el) gcc
+
compiler.mips564el.exe=/opt/compiler-explorer/mips64el/gcc-5.4.0/mips64el-unknown-linux-gnu/bin/mips64el-unknown-linux-gnu-g++
compiler.mips564el.semver=5.4
compiler.mips564el.objdumper=/opt/compiler-explorer/mips64el/gcc-5.4.0/mips64el-unknown-linux-gnu/bin/mips64el-unknown-linux-gnu-objdump
+compiler.mips64elg1210.exe=/opt/compiler-explorer/mips64el/gcc-12.1.0/mips64el-multilib-linux-uclibc/bin/mips64el-multilib-linux-uclibc-g++
+compiler.mips64elg1210.semver=12.1.0
+compiler.mips64elg1210.objdumper=/opt/compiler-explorer/mips64el/gcc-12.1.0/mips64el-multilib-linux-uclibc/bin/mips64el-multilib-linux-uclibc-objdump
+
###############################
# GCC for nanoMIPS
group.nanomips.compilers=nanomips630
diff --git a/etc/config/c.amazon.properties b/etc/config/c.amazon.properties
index d38f67533..10986347d 100644
--- a/etc/config/c.amazon.properties
+++ b/etc/config/c.amazon.properties
@@ -1,7 +1,7 @@
compilers=&cgcc86:&cclang:&armcclang32:&armcclang64:&rvcclang:&wasmcclang:&ppci:&cicc:&cicx:&ccl:&ccross:&cgcc-classic:&cc65:&sdcc:&ctendra:&tinycc:&zigcc:&cproc86:&chibicc:&z88dk:www.godbolt.ms@443
-defaultCompiler=cg121
-demangler=/opt/compiler-explorer/gcc-12.1.0/bin/c++filt
-objdumper=/opt/compiler-explorer/gcc-12.1.0/bin/objdump
+defaultCompiler=cg122
+demangler=/opt/compiler-explorer/gcc-12.2.0/bin/c++filt
+objdumper=/opt/compiler-explorer/gcc-12.2.0/bin/objdump
needsMulti=false
buildenvsetup=ceconan
@@ -12,7 +12,7 @@ externalparser.exe=/usr/local/bin/asm-parser
###############################
# GCC for x86
-group.cgcc86.compilers=cg412:cg447:cg453:cg464:cg471:cg472:cg473:cg474:cg481:cg482:cg483:cg484:cg485:cg490:cg491:cg492:cg493:cg494:cg510:cg520:cg530:cg540:cg6:cg62:cg63:cg71:cg72:cg73:cg74:cg81:cg82:cg83:cg84:cg85:cg91:cg92:cg93:cg94:cg95:cg101:cg102:cg103:cg104:cg111:cg112:cg113:cg121:cgsnapshot:cgstatic-analysis
+group.cgcc86.compilers=cg412:cg447:cg453:cg464:cg471:cg472:cg473:cg474:cg481:cg482:cg483:cg484:cg485:cg490:cg491:cg492:cg493:cg494:cg510:cg520:cg530:cg540:cg6:cg62:cg63:cg71:cg72:cg73:cg74:cg81:cg82:cg83:cg84:cg85:cg91:cg92:cg93:cg94:cg95:cg101:cg102:cg103:cg104:cg111:cg112:cg113:cg121:cg122:cgsnapshot:cgstatic-analysis
group.cgcc86.groupName=GCC x86-64
group.cgcc86.instructionSet=amd64
group.cgcc86.isSemVer=true
@@ -113,6 +113,9 @@ compiler.cg113.exe=/opt/compiler-explorer/gcc-11.3.0/bin/gcc
compiler.cg113.semver=11.3
compiler.cg121.exe=/opt/compiler-explorer/gcc-12.1.0/bin/gcc
compiler.cg121.semver=12.1
+compiler.cg122.exe=/opt/compiler-explorer/gcc-12.2.0/bin/gcc
+compiler.cg122.semver=12.2
+
compiler.cgsnapshot.exe=/opt/compiler-explorer/gcc-snapshot/bin/gcc
compiler.cgsnapshot.demangler=/opt/compiler-explorer/gcc-snapshot/bin/c++filt
compiler.cgsnapshot.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
@@ -609,17 +612,20 @@ group.ccross.groupName=Cross GCC
group.cs390x.compilers=&cgccs390x
# GCC for s390x
+group.cgccs390x.compilers=cgccs390x112:cs390xg1210
group.cgccs390x.supportsBinary=true
group.cgccs390x.supportsExecute=false
-
+group.cgccs390x.baseName=s390x gcc
group.cgccs390x.groupName=s390x GCC
-group.cgccs390x.compilers=cgccs390x112
group.cgccs390x.isSemVer=true
-group.cgccs390x.objdumper=/opt/compiler-explorer/s390x/gcc-11.2.0/s390x-ibm-linux-gnu/bin/s390x-ibm-linux-gnu-objdump
compiler.cgccs390x112.exe=/opt/compiler-explorer/s390x/gcc-11.2.0/s390x-ibm-linux-gnu/bin/s390x-ibm-linux-gnu-gcc
-compiler.cgccs390x112.name=s390x GCC 11.2.0
compiler.cgccs390x112.semver=11.2.0
+compiler.cgccs390x112.objdumper=/opt/compiler-explorer/s390x/gcc-11.2.0/s390x-ibm-linux-gnu/bin/s390x-ibm-linux-gnu-objdump
+
+compiler.cs390xg1210.exe=/opt/compiler-explorer/s390x/gcc-12.1.0/s390x-ibm-linux-gnu/bin/s390x-ibm-linux-gnu-gcc
+compiler.cs390xg1210.semver=12.1.0
+compiler.cs390xg1210.objdumper=/opt/compiler-explorer/s390x/gcc-12.1.0/s390x-ibm-linux-gnu/bin/s390x-ibm-linux-gnu-objdump
###############################
# Cross compilers for PPC
@@ -628,18 +634,23 @@ group.cppcs.isSemVer=true
group.cppcs.supportsBinary=true
group.cppcs.supportsExecute=false
-group.cppc.compilers=cppcg1120:cppcg48
+group.cppc.compilers=cppcg1210:cppcg1120:cppcg48
group.cppc.groupName=POWER
group.cppc.baseName=power gcc
compiler.cppcg48.exe=/opt/compiler-explorer/powerpc/gcc-4.8.5/bin/powerpc-unknown-linux-gnu-gcc
compiler.cppcg48.objdumper=/opt/compiler-explorer/powerpc/gcc-4.8.5/bin/powerpc-unknown-linux-gnu-objdump
compiler.cppcg48.semver=4.8.5
+
compiler.cppcg1120.exe=/opt/compiler-explorer/powerpc/gcc-11.2.0/powerpc-unknown-linux-gnu/bin/powerpc-unknown-linux-gnu-gcc
compiler.cppcg1120.objdumper=/opt/compiler-explorer/powerpc/gcc-11.2.0/powerpc-unknown-linux-gnu/bin/powerpc-unknown-linux-gnu-objdump
compiler.cppcg1120.semver=11.2.0
-group.cppc64.compilers=cppc64g8:cppc64g9:cppc64g1120:cppc64clang
+compiler.cppcg1210.exe=/opt/compiler-explorer/powerpc/gcc-12.1.0/powerpc-unknown-linux-gnu/bin/powerpc-unknown-linux-gnu-gcc
+compiler.cppcg1210.objdumper=/opt/compiler-explorer/powerpc/gcc-12.1.0/powerpc-unknown-linux-gnu/bin/powerpc-unknown-linux-gnu-objdump
+compiler.cppcg1210.semver=12.1.0
+
+group.cppc64.compilers=cppc64g8:cppc64g9:cppc64g1120:cppc64g1210:cppc64clang
group.cppc64.groupName=POWER64
compiler.cppc64g8.exe=/opt/compiler-explorer/powerpc64/gcc-at12/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-gcc
compiler.cppc64g8.objdumper=/opt/compiler-explorer/powerpc64/gcc-at12/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-objdump
@@ -653,6 +664,12 @@ compiler.cppc64g1120.exe=/opt/compiler-explorer/powerpc64/gcc-11.2.0/powerpc64-u
compiler.cppc64g1120.objdumper=/opt/compiler-explorer/powerpc64/gcc-11.2.0/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-objdump
compiler.cppc64g1120.semver=power64 gcc 11.2.0
compiler.cppc64g1120.name=power64 gcc 11.2.0
+
+compiler.cppc64g1210.exe=/opt/compiler-explorer/powerpc64/gcc-12.1.0/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-gcc
+compiler.cppc64g1210.objdumper=/opt/compiler-explorer/powerpc64/gcc-12.1.0/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-objdump
+compiler.cppc64g1210.semver=power64 gcc 12.1.0
+compiler.cppc64g1210.name=power64 gcc 12.1.0
+
compiler.cppc64clang.exe=/opt/compiler-explorer/clang-trunk/bin/clang
compiler.cppc64clang.demangler=/opt/compiler-explorer/gcc-snapshot/bin/c++filt
compiler.cppc64clang.objdumper=/opt/compiler-explorer/gcc-11.2.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-objdump
@@ -661,24 +678,34 @@ compiler.cppc64clang.options=-target powerpc64
compiler.cppc64clang.supportsBinary=false
compiler.cppc64clang.semver=(snapshot)
-group.cppc64le.compilers=cppc64leg630:cppc64leg8:cppc64leg9:cppc64leg1120:cppc64leclang
+group.cppc64le.compilers=cppc64leg630:cppc64leg8:cppc64leg9:cppc64leg1120:cppc64leg1210:cppc64leclang
group.cppc64le.groupName=POWER64LE
+
compiler.cppc64leg630.exe=/opt/compiler-explorer/powerpc64le/gcc-6.3.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-gcc
compiler.cppc64leg630.objdumper=/opt/compiler-explorer/powerpc64le/gcc-6.3.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-objdump
compiler.cppc64leg630.name=power64le gcc 6.3.0
compiler.cppc64leg630.semver=6.3.0
+
compiler.cppc64leg8.exe=/opt/compiler-explorer/powerpc64le/gcc-at12/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-gcc
compiler.cppc64leg8.name=power64le AT12.0 (gcc8)
compiler.cppc64leg8.objdumper=/opt/compiler-explorer/powerpc64le/gcc-at12/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-objdump
compiler.cppc64leg8.semver=(snapshot)
+
compiler.cppc64leg9.exe=/opt/compiler-explorer/powerpc64le/gcc-at13/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-gcc
compiler.cppc64leg9.objdumper=/opt/compiler-explorer/powerpc64le/gcc-at13/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-objdump
compiler.cppc64leg9.name=power64le AT13.0 (gcc9)
compiler.cppc64leg9.semver=(snapshot)
+
compiler.cppc64leg1120.exe=/opt/compiler-explorer/powerpc64le/gcc-11.2.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-gcc
compiler.cppc64leg1120.objdumper=/opt/compiler-explorer/powerpc64le/gcc-11.2.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-objdump
compiler.cppc64leg1120.name=power64le gcc 11.2.0
compiler.cppc64leg1120.semver=11.2.0
+
+compiler.cppc64leg1210.exe=/opt/compiler-explorer/powerpc64le/gcc-12.1.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-gcc
+compiler.cppc64leg1210.objdumper=/opt/compiler-explorer/powerpc64le/gcc-12.1.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-objdump
+compiler.cppc64leg1210.name=power64le gcc 12.1.0
+compiler.cppc64leg1210.semver=12.1.0
+
compiler.cppc64leclang.exe=/opt/compiler-explorer/clang-trunk/bin/clang
compiler.cppc64leclang.demangler=/opt/compiler-explorer/gcc-snapshot/bin/c++filt
compiler.cppc64leclang.objdumper=/opt/compiler-explorer/gcc-11.2.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-objdump
@@ -785,6 +812,7 @@ compiler.carm1130.exe=/opt/compiler-explorer/arm/gcc-11.3.0/arm-unknown-linux-gn
compiler.carm1130.name=ARM gcc 11.3 (linux)
compiler.carm1130.semver=11.3.0
compiler.carm1210.exe=/opt/compiler-explorer/arm/gcc-12.1.0/arm-unknown-linux-gnueabihf/bin/arm-unknown-linux-gnueabihf-gcc
+compiler.carm1210.objdumper=/opt/compiler-explorer/arm/gcc-12.1.0/arm-unknown-linux-gnueabihf/bin/arm-unknown-linux-gnueabihf-objdump
compiler.carm1210.name=ARM gcc 12.1 (linux)
compiler.carm1210.semver=12.1.0
compiler.carmgtrunk.exe=/opt/compiler-explorer/arm/gcc-trunk/arm-unknown-linux-gnueabihf/bin/arm-unknown-linux-gnueabihf-gcc
@@ -838,6 +866,7 @@ compiler.carm64g1130.exe=/opt/compiler-explorer/arm64/gcc-11.3.0/aarch64-unknown
compiler.carm64g1130.name=ARM64 gcc 11.3
compiler.carm64g1130.semver=11.3.0
compiler.carm64g1210.exe=/opt/compiler-explorer/arm64/gcc-12.1.0/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-gcc
+compiler.carm64g1210.objdumper=/opt/compiler-explorer/arm64/gcc-12.1.0/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-objdump
compiler.carm64g1210.name=ARM64 gcc 12.1
compiler.carm64g1210.semver=12.1.0
compiler.carm64gtrunk.exe=/opt/compiler-explorer/arm64/gcc-trunk/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-gcc
@@ -929,44 +958,59 @@ compiler.carduinomega189.objdumper=/opt/compiler-explorer/avr/arduino-1.8.9/hard
################################
# GCC for MSP
-group.cmsp.compilers=cmsp430g453:cmsp430g530:cmsp430g621
+group.cmsp.compilers=cmsp430g453:cmsp430g530:cmsp430g621:cmsp430g1210
group.cmsp.groupName=MSP GCC
group.cmsp.baseName=MSP430 gcc
group.cmsp.isSemVer=true
+
compiler.cmsp430g453.exe=/opt/compiler-explorer/msp430/gcc-4.5.3/bin/msp430-gcc
compiler.cmsp430g453.semver=4.5.3
+
compiler.cmsp430g530.exe=/opt/compiler-explorer/msp430-gcc-5.3.0.219_linux32/bin/msp430-elf-gcc
compiler.cmsp430g530.semver=5.3.0
+
compiler.cmsp430g621.exe=/opt/compiler-explorer/msp430-gcc-6.2.1.16_linux64/bin/msp430-elf-gcc
compiler.cmsp430g621.semver=6.2.1
+compiler.cmsp430g1210.exe=/opt/compiler-explorer/gcc-12.1.0/msp430-unknown-elf/bin/msp430-unknown-elf-gcc
+compiler.cmsp430g1210.semver=12.1.0
+
################################
# GCC for AVR
-group.cavr.compilers=cavrg454:cavrg464:cavrg540:cavrg920:cavrg930:cavrg1030:cavrg1100
+group.cavr.compilers=cavrg454:cavrg464:cavrg540:cavrg920:cavrg930:cavrg1030:cavrg1100:cavrg1210
group.cavr.groupName=AVR GCC
group.cavr.baseName=AVR gcc
group.cavr.isSemVer=true
+
compiler.cavrg454.exe=/opt/compiler-explorer/avr/gcc-4.5.4/bin/avr-gcc
compiler.cavrg454.semver=4.5.4
compiler.cavrg464.exe=/opt/compiler-explorer/avr/gcc-4.6.4/bin/avr-gcc
compiler.cavrg464.semver=4.6.4
+
compiler.cavrg540.exe=/opt/compiler-explorer/avr/arduino-1.8.9/hardware/tools/avr/bin/avr-gcc
compiler.cavrg540.semver=5.4.0
-compiler.cavrg540.supportsBinary=false
compiler.cavrg540.objdumper=/opt/compiler-explorer/avr/arduino-1.8.9/hardware/tools/avr/bin/avr-objdump
+
compiler.cavrg920.exe=/opt/compiler-explorer/avr/gcc-9.2.0/bin/avr-gcc
compiler.cavrg920.semver=9.2.0
compiler.cavrg920.objdumper=/opt/compiler-explorer/avr/gcc-9.2.0/bin/avr-objdump
+
compiler.cavrg930.exe=/opt/compiler-explorer/avr/gcc-9.3.0/bin/avr-gcc
compiler.cavrg930.semver=9.3.0
compiler.cavrg930.objdumper=/opt/compiler-explorer/avr/gcc-9.3.0/bin/avr-objdump
+
compiler.cavrg1030.exe=/opt/compiler-explorer/avr/gcc-10.3.0/bin/avr-gcc
compiler.cavrg1030.semver=10.3.0
compiler.cavrg1030.objdumper=/opt/compiler-explorer/avr/gcc-10.3.0/bin/avr-objdump
+
compiler.cavrg1100.exe=/opt/compiler-explorer/avr/gcc-11.1.0/bin/avr-gcc
compiler.cavrg1100.semver=11.1.0
compiler.cavrg1100.objdumper=/opt/compiler-explorer/avr/gcc-11.1.0/bin/avr-objdump
+compiler.cavrg1210.exe=/opt/compiler-explorer/avr/gcc-12.1.0/bin/avr-gcc
+compiler.cavrg1210.semver=12.1.0
+compiler.cavrg1210.objdumper=/opt/compiler-explorer/avr/gcc-12.1.0/bin/avr-objdump
+
###############################
# GCC for MIPS
group.cmipss.compilers=&cmips:&cmipsel:&cmips64:&cmips64el
@@ -976,48 +1020,71 @@ group.cmipss.supportsBinary=true
group.cmipss.supportsExecute=false
## MIPS
-group.cmips.compilers=cmips5:cmips930:cmips1120
+group.cmips.compilers=cmips5:cmips930:cmips1120:cmipsg1210
group.cmips.groupName=MIPS GCC
group.cmips.baseName=mips gcc
+
compiler.cmips5.exe=/opt/compiler-explorer/mips/gcc-5.4.0/mips-unknown-linux-gnu/bin/mips-unknown-linux-gnu-gcc
compiler.cmips5.semver=5.4
compiler.cmips5.objdumper=/opt/compiler-explorer/mips/gcc-5.4.0/mips-unknown-linux-gnu/bin/mips-unknown-linux-gnu-objdump
+
compiler.cmips930.exe=/opt/compiler-explorer/mips/mips-mti-elf/2020.06-01/bin/mips-mti-elf-gcc
compiler.cmips930.name=mips gcc 9.3.0 (codescape)
compiler.cmips930.semver=9.3.0
compiler.cmips930.objdumper=/opt/compiler-explorer/mips/mips-mti-elf/2020.06-01/bin/mips-mti-elf-objdump
+
compiler.cmips1120.exe=/opt/compiler-explorer/mips/gcc-11.2.0/mips-unknown-linux-gnu/bin/mips-unknown-linux-gnu-gcc
compiler.cmips1120.semver=11.2.0
compiler.cmips1120.objdumper=/opt/compiler-explorer/mips/gcc-11.2.0/mips-unknown-linux-gnu/bin/mips-unknown-linux-gnu-objdump
+compiler.cmipsg1210.exe=/opt/compiler-explorer/mips/gcc-12.1.0/mips-unknown-linux-gnu/bin/mips-unknown-linux-gnu-gcc
+compiler.cmipsg1210.semver=12.1.0
+compiler.cmipsg1210.objdumper=/opt/compiler-explorer/mips/gcc-12.1.0/mips-unknown-linux-gnu/bin/mips-unknown-linux-gnu-objdump
+
## MIPS64
group.cmips64.groupName=MIPS64 GCC
-group.cmips64.compilers=cmips564:cmips112064
+group.cmips64.compilers=cmips564:cmips112064:cmips64g1210
group.cmips64.baseName=mips64 gcc
+
compiler.cmips564.exe=/opt/compiler-explorer/mips64/gcc-5.4.0/mips64-unknown-linux-gnu/bin/mips64-unknown-linux-gnu-gcc
compiler.cmips564.semver=5.4
compiler.cmips564.objdumper=/opt/compiler-explorer/mips64/gcc-5.4.0/mips64-unknown-linux-gnu/bin/mips64-unknown-linux-gnu-objdump
+
compiler.cmips112064.exe=/opt/compiler-explorer/mips64/gcc-11.2.0/mips64-unknown-linux-gnu/bin/mips64-unknown-linux-gnu-gcc
compiler.cmips112064.semver=11.2.0
compiler.cmips112064.objdumper=/opt/compiler-explorer/mips64/gcc-11.2.0/mips64-unknown-linux-gnu/bin/mips64-unknown-linux-gnu-objdump
+compiler.cmips64g1210.exe=/opt/compiler-explorer/mips64/gcc-12.1.0/mips64-unknown-linux-gnu/bin/mips64-unknown-linux-gnu-gcc
+compiler.cmips64g1210.semver=12.1.0
+compiler.cmips64g1210.objdumper=/opt/compiler-explorer/mips64/gcc-12.1.0/mips64-unknown-linux-gnu/bin/mips64-unknown-linux-gnu-objdump
+
## MIPS EL
group.cmipsel.groupName=MIPSEL GCC
-group.cmipsel.compilers=cmips5el
+group.cmipsel.compilers=cmips5el:cmipselg1210
group.cmipsel.baseName=mips (el) gcc
+
compiler.cmips5el.exe=/opt/compiler-explorer/mipsel/gcc-5.4.0/mipsel-unknown-linux-gnu/bin/mipsel-unknown-linux-gnu-gcc
compiler.cmips5el.semver=5.4
compiler.cmips5el.objdumper=/opt/compiler-explorer/mipsel/gcc-5.4.0/mipsel-unknown-linux-gnu/mipsel-unknown-linux-gnu/bin/objdump
+compiler.cmipselg1210.exe=/opt/compiler-explorer/mipsel/gcc-12.1.0/mipsel-multilib-linux-gnu/bin/mipsel-multilib-linux-gnu-gcc
+compiler.cmipselg1210.semver=12.1.0
+compiler.cmipselg1210.objdumper=/opt/compiler-explorer/mipsel/gcc-12.1.0/mipsel-multilib-linux-gnu/bin/mipsel-multilib-linux-gnu-objdump
+
## MIPS64 EL
group.cmips64el.groupName=MIPS64EL GCC
-group.cmips64el.compilers=cmips564el
+group.cmips64el.compilers=cmips564el:cmips64elg1210
group.cmips64el.baseName=mips64 (el) gcc
+
compiler.cmips564el.exe=/opt/compiler-explorer/mips64el/gcc-5.4.0/mips64el-unknown-linux-gnu/bin/mips64el-unknown-linux-gnu-gcc
compiler.cmips564el.name=MIPS64 gcc 5.4 (el)
compiler.cmips564el.semver=5.4
compiler.cmips564el.objdumper=/opt/compiler-explorer/mips64el/gcc-5.4.0/mips64el-unknown-linux-gnu/bin/mips64el-unknown-linux-gnu-objdump
+compiler.cmips64elg1210.exe=/opt/compiler-explorer/mips64el/gcc-12.1.0/mips64el-multilib-linux-uclibc/bin/mips64el-multilib-linux-uclibc-gcc
+compiler.cmips64elg1210.semver=12.1.0
+compiler.cmips64elg1210.objdumper=/opt/compiler-explorer/mips64el/gcc-12.1.0/mips64el-multilib-linux-uclibc/bin/mips64el-multilib-linux-uclibc-objdump
+
###############################
# GCC for nanoMIPS
group.cnanomips.compilers=cnanomips630
diff --git a/etc/config/cppx_blue.default.properties b/etc/config/cppx_blue.defaults.properties
index d3e9c1253..d3e9c1253 100644
--- a/etc/config/cppx_blue.default.properties
+++ b/etc/config/cppx_blue.defaults.properties
diff --git a/etc/config/d.amazon.properties b/etc/config/d.amazon.properties
index 55a343352..b9dc69004 100644
--- a/etc/config/d.amazon.properties
+++ b/etc/config/d.amazon.properties
@@ -1,13 +1,15 @@
-compilers=&gdc:&ldc:&dmd
+compilers=&gdc:&ldc:&dmd:&gdccross
defaultCompiler=ldc1_30
-objdumper=/opt/compiler-explorer/gcc-12.1.0/bin/objdump
-demangler=/opt/compiler-explorer/ldc1.30.0/ldc2-1.30.0-linux-x86_64/bin/ddemangle
-llvmSymbolizer=/opt/compiler-explorer/clang-14.0.0/bin/llvm-symbolizer
-group.gdc.compilers=gdc48:gdc49:gdc52:gdc92:gdc93:gdc95:gdc101:gdc102:gdc111:gdc113:gdc121:gdctrunk
+group.gdc.compilers=gdc48:gdc49:gdc52:gdc92:gdc93:gdc95:gdc101:gdc102:gdc111:gdc113:gdc121:gdc122:gdctrunk
+group.gdc.groupName=GDC x86-64
group.gdc.includeFlag=-isystem
group.gdc.isSemVer=true
group.gdc.baseName=gdc
+group.gdc.demangler=/opt/compiler-explorer/ldc1.30.0/ldc2-1.30.0-linux-x86_64/bin/ddemangle
+group.gdc.objdumper=/opt/compiler-explorer/gcc-12.2.0/bin/objdump
+group.gdc.llvmSymbolizer=/opt/compiler-explorer/clang-14.0.0/bin/llvm-symbolizer
+
compiler.gdc49.exe=/opt/compiler-explorer/gdc4.9.3/x86_64-pc-linux-gnu/bin/gdc
compiler.gdc49.alias=/opt/x86_64-gdcproject-linux-gnu/bin/gdc
compiler.gdc49.semver=4.9.3
@@ -34,14 +36,102 @@ compiler.gdc113.exe=/opt/compiler-explorer/gcc-11.3.0/bin/gdc
compiler.gdc113.semver=11.3
compiler.gdc121.exe=/opt/compiler-explorer/gcc-12.1.0/bin/gdc
compiler.gdc121.semver=12.1
+compiler.gdc122.exe=/opt/compiler-explorer/gcc-12.2.0/bin/gdc
+compiler.gdc122.semver=12.2
compiler.gdctrunk.exe=/opt/compiler-explorer/gcc-snapshot/bin/gdc
compiler.gdctrunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
compiler.gdctrunk.semver=(trunk)
+## CROSS GDC
+group.gdccross.compilers=&gdcs390x:&gdcppc:&gdcppc64:&gdcppc64le:&gdcmips64:&gdcmips:&gdcmipsel
+group.gdccross.supportsExecute=false
+group.gdccross.supportsBinary=true
+
+### GDC for s390x
+group.gdcs390x.compilers=gdcs390x1210
+group.gdcs390x.groupName=GDC s390x
+group.gdcs390x.includeFlag=-isystem
+group.gdcs390x.isSemVer=true
+group.gdcs390x.baseName=gdc s390x
+
+compiler.gdcs390x1210.exe=/opt/compiler-explorer/s390x/gcc-12.1.0/s390x-ibm-linux-gnu/bin/s390x-ibm-linux-gnu-gdc
+compiler.gdcs390x1210.semver=12.1.0
+compiler.gdcs390x1210.objdumper=/opt/compiler-explorer/s390x/gcc-12.1.0/s390x-ibm-linux-gnu/bin/s390x-ibm-linux-gnu-objdump
+
+### GDC for powerpc
+group.gdcppc.compilers=gdcppc1210
+group.gdcppc.groupName=GDC powerpc
+group.gdcppc.includeFlag=-isystem
+group.gdcppc.isSemVer=true
+group.gdcppc.baseName=gdc powerpc
+
+compiler.gdcppc1210.exe=/opt/compiler-explorer/powerpc/gcc-12.1.0/powerpc-unknown-linux-gnu/bin/powerpc-unknown-linux-gnu-gdc
+compiler.gdcppc1210.semver=12.1.0
+compiler.gdcppc1210.objdumper=/opt/compiler-explorer/powerpc/gcc-12.1.0/powerpc-unknown-linux-gnu/bin/powerpc-unknown-linux-gnu-objdump
+
+### GDC for powerpc64
+group.gdcppc64.compilers=gdcppc641210
+group.gdcppc64.groupName=GDC powerpc64
+group.gdcppc64.includeFlag=-isystem
+group.gdcppc64.isSemVer=true
+group.gdcppc64.baseName=gdc powerpc64
+
+compiler.gdcppc641210.exe=/opt/compiler-explorer/powerpc64/gcc-12.1.0/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-gdc
+compiler.gdcppc641210.semver=12.1.0
+compiler.gdcppc641210.objdumper=/opt/compiler-explorer/powerpc64/gcc-12.1.0/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-objdump
+
+### GDC for powerpc64le
+group.gdcppc64le.compilers=gdcppc64le1210
+group.gdcppc64le.groupName=GDC powerpc64le
+group.gdcppc64le.includeFlag=-isystem
+group.gdcppc64le.isSemVer=true
+group.gdcppc64le.baseName=gdc powerpc64le
+
+compiler.gdcppc64le1210.exe=/opt/compiler-explorer/powerpc64le/gcc-12.1.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-gdc
+compiler.gdcppc64le1210.semver=12.1.0
+compiler.gdcppc64le1210.objdumper=/opt/compiler-explorer/powerpc64le/gcc-12.1.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-objdump
+
+### GDC for mips64
+group.gdcmips64.compilers=gdcmips641210
+group.gdcmips64.groupName=GDC mips64
+group.gdcmips64.includeFlag=-isystem
+group.gdcmips64.isSemVer=true
+group.gdcmips64.baseName=gdc mips64
+
+compiler.gdcmips641210.exe=/opt/compiler-explorer/mips64/gcc-12.1.0/mips64-unknown-linux-gnu/bin/mips64-unknown-linux-gnu-gdc
+compiler.gdcmips641210.semver=12.1.0
+compiler.gdcmips641210.objdumper=/opt/compiler-explorer/mips64/gcc-12.1.0/mips64-unknown-linux-gnu/bin/mips64-unknown-linux-gnu-objdump
+
+### GDC for mips
+group.gdcmips.compilers=gdcmips1210
+group.gdcmips.groupName=GDC mips
+group.gdcmips.includeFlag=-isystem
+group.gdcmips.isSemVer=true
+group.gdcmips.baseName=gdc mips
+
+compiler.gdcmips1210.exe=/opt/compiler-explorer/mips/gcc-12.1.0/mips-unknown-linux-gnu/bin/mips-unknown-linux-gnu-gdc
+compiler.gdcmips1210.semver=12.1.0
+compiler.gdcmips1210.objdumper=/opt/compiler-explorer/mips/gcc-12.1.0/mips-unknown-linux-gnu/bin/mips-unknown-linux-gnu-objdump
+
+### GDC for mipsel
+group.gdcmipsel.compilers=gdcmipsel1210
+group.gdcmipsel.groupName=GDC mipsel
+group.gdcmipsel.includeFlag=-isystem
+group.gdcmipsel.isSemVer=true
+group.gdcmipsel.baseName=gdc mipsel
+
+compiler.gdcmipsel1210.exe=/opt/compiler-explorer/mipsel/gcc-12.1.0/mipsel-multilib-linux-gnu/bin/mipsel-multilib-linux-gnu-gdc
+compiler.gdcmipsel1210.semver=12.1.0
+compiler.gdcmipsel1210.objdumper=/opt/compiler-explorer/mipsel/gcc-12.1.0/mipsel-multilib-linux-gnu/bin/mipsel-multilib-linux-gnu-objdump
+
group.ldc.compilers=ldc017:ldc100:ldc110:ldc120:ldc130:ldc140:ldc150:ldc160:ldc170:ldc180:ldc190:ldc1_10:ldc1_11:ldc1_12:ldc1_13:ldc1_14:ldc1_15:ldc1_16:ldc1_17:ldc1_18:ldc1_19:ldc1_20:ldc1_21:ldc1_22:ldc1_23:ldc1_24:ldc1_25:ldc1_26:ldc1_27:ldc1_28:ldc1_29:ldc1_30:ldcbeta:ldclatestci
group.ldc.compilerType=ldc
group.ldc.isSemVer=true
group.ldc.baseName=ldc
+group.ldc.demangler=/opt/compiler-explorer/ldc1.30.0/ldc2-1.30.0-linux-x86_64/bin/ddemangle
+group.ldc.objdumper=/opt/compiler-explorer/gcc-12.1.0/bin/objdump
+group.ldc.llvmSymbolizer=/opt/compiler-explorer/clang-14.0.0/bin/llvm-symbolizer
+
compiler.ldc017.exe=/opt/compiler-explorer/ldc0.17.2/ldc2-0.17.2-linux-x86_64/bin/ldc2
compiler.ldc017.semver=0.17.2
compiler.ldc100.exe=/opt/compiler-explorer/ldc1.0.0/ldc2-1.0.0-linux-x86_64/bin/ldc2
diff --git a/etc/config/fortran.amazon.properties b/etc/config/fortran.amazon.properties
index e088087d7..3369f9c7f 100644
--- a/etc/config/fortran.amazon.properties
+++ b/etc/config/fortran.amazon.properties
@@ -1,12 +1,12 @@
compilers=&gfortran_86:&ifort:&ifx:&cross:&clang_llvmflang
-defaultCompiler=gfortran121
-demangler=/opt/compiler-explorer/gcc-12.1.0/bin/c++filt
-objdumper=/opt/compiler-explorer/gcc-12.1.0/bin/objdump
+defaultCompiler=gfortran122
+demangler=/opt/compiler-explorer/gcc-12.2.0/bin/c++filt
+objdumper=/opt/compiler-explorer/gcc-12.2.0/bin/objdump
compilerType=fortran
###############################
# GCC (as in GNU Compiler Collection) for x86
-group.gfortran_86.compilers=gfortran494:gfortran550:gfortran63:gfortran71:gfortran72:gfortran73:gfortran81:gfortran82:gfortran83:gfortran84:gfortran85:gfortran91:gfortran92:gfortran93:gfortran94:gfortran101:gfortran102:gfortran103:gfortran104:gfortran111:gfortran112:gfortran113:gfortran121:gfortransnapshot
+group.gfortran_86.compilers=gfortran494:gfortran550:gfortran63:gfortran71:gfortran72:gfortran73:gfortran81:gfortran82:gfortran83:gfortran84:gfortran85:gfortran91:gfortran92:gfortran93:gfortran94:gfortran101:gfortran102:gfortran103:gfortran104:gfortran111:gfortran112:gfortran113:gfortran121:gfortran122:gfortransnapshot
group.gfortran_86.groupName=GFORTRAN x86-64
group.gfortran_86.isSemVer=true
group.gfortran_86.baseName=x86-64 gfortran
@@ -56,6 +56,8 @@ compiler.gfortran113.exe=/opt/compiler-explorer/gcc-11.3.0/bin/gfortran
compiler.gfortran113.semver=11.3
compiler.gfortran121.exe=/opt/compiler-explorer/gcc-12.1.0/bin/gfortran
compiler.gfortran121.semver=12.1
+compiler.gfortran122.exe=/opt/compiler-explorer/gcc-12.2.0/bin/gfortran
+compiler.gfortran122.semver=12.2
compiler.gfortransnapshot.exe=/opt/compiler-explorer/gcc-snapshot/bin/gfortran
compiler.gfortransnapshot.demangler=/opt/compiler-explorer/gcc-snapshot/bin/c++filt
compiler.gfortransnapshot.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
@@ -144,20 +146,38 @@ compiler.ifx202200.semver=2022.0.0
###############################
# GCC Cross-Compilers
-group.cross.compilers=&gccarm:&gccaarch64:&ppc
+group.cross.compilers=&gccarm:&gccaarch64:&ppcs:&gccrv32:&gccrv64:&gccmips:&gccmips64:&gccmipsel:&gccmips64el:&gccs390x
+group.cross.isSemVer=true
group.cross.supportsBinary=false
group.cross.groupName=Cross GCC
###############################
# GCC for ARM
-group.gccarm.compilers=farmg640:farmg730:farmg820
-group.gccarm.groupName=ARM (32bit) GCC
+group.gccarm.compilers=farmg640:farmg730:farmg820:farmg1210
+group.gccarm.groupName=ARM (32bit) gfortran
+group.gccarm.baseName=ARM (32bit) gfortran
+
compiler.farmg640.exe=/opt/compiler-explorer/arm/gcc-6.4.0/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-gfortran
-compiler.farmg640.name=ARM gfortran 6.4
+compiler.farmg640.semver=6.4
+
compiler.farmg730.exe=/opt/compiler-explorer/arm/gcc-7.3.0/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-gfortran
-compiler.farmg730.name=ARM gfortran 7.3
+compiler.farmg730.semver=7.3
+
compiler.farmg820.exe=/opt/compiler-explorer/arm/gcc-8.2.0/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-gfortran
-compiler.farmg820.name=ARM gfortran 8.2
+compiler.farmg820.semver=8.2
+
+compiler.farmg1210.exe=/opt/compiler-explorer/gcc-12.1.0/arm-unknown-linux-gnueabihf/bin/arm-unknown-linux-gnueabihf-gfortran
+compiler.farmg1210.semver=12.1.0
+
+###############################
+## GCC for s390x
+group.gccs390x.compilers=fs390xg1210
+group.gccs390x.groupName=s390x gfortran
+group.gccs390x.baseName=s390x gfortran
+
+compiler.fs390xg1210.exe=/opt/compiler-explorer/s390x/gcc-12.1.0/s390x-ibm-linux-gnu/bin/s390x-ibm-linux-gnu-gfortran
+compiler.fs390xg1210.semver=12.1.0
+compiler.fs390xg1210.objdumper=/opt/compiler-explorer/s390x/gcc-12.1.0/s390x-ibm-linux-gnu/bin/s390x-ibm-linux-gnu-objdump
###############################
# LLVM Flang for X86
@@ -178,7 +198,7 @@ compiler.flangtrunknew.supportsBinary=false
###############################
# GCC for ARM 64bit
-group.gccaarch64.compilers=farm64g640:farm64g730:farm64g820
+group.gccaarch64.compilers=farm64g640:farm64g730:farm64g820:farm64g1210
group.gccaarch64.groupName=ARM (AARCH64) GCC
compiler.farm64g640.exe=/opt/compiler-explorer/arm64/gcc-6.4.0/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-gfortran
compiler.farm64g640.name=AARCH64 gfortran 6.4
@@ -187,24 +207,121 @@ compiler.farm64g730.name=AARCH64 gfortran 7.3
compiler.farm64g820.exe=/opt/compiler-explorer/arm64/gcc-8.2.0/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-gfortran
compiler.farm64g820.name=AARCH64 gfortran 8.2
+compiler.farm64g1210.exe=/opt/compiler-explorer/arm64/gcc-12.1.0/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-gfortran
+compiler.farm64g1210.name=AARCH64 gfortran 12.1.0
+compiler.farm64g1210.exe=/opt/compiler-explorer/arm64/gcc-12.1.0/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-objdump
+
+###############################
+# GCC for PPCs
+group.ppcs.compilers=&ppc64:&ppc64le:&ppc
+group.ppcs.groupName=POWER Compilers
+
###############################
# GCC for PPC
-group.ppc.compilers=fppc64leg8:fppc64g8:fppc64leg9:fppc64g9
-group.ppc.groupName=POWER Compilers
-group.ppc.isSemVer=true
-compiler.fppc64leg8.exe=/opt/compiler-explorer/powerpc64le/gcc-at12/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-gfortran
-compiler.fppc64leg8.name=power64le AT12.0
-compiler.fppc64leg8.semver=(snapshot)
+group.ppc.compilers=fppcg1210
+group.ppc.groupName=POWER gfortran
+group.ppc.baseName=POWER gfortran
+
+compiler.fppcg1210.exe=/opt/compiler-explorer/powerpc/gcc-12.1.0/powerpc-unknown-linux-gnu/bin/powerpc-unknown-linux-gnu-gfortran
+compiler.fppcg1210.semver=12.1.0
+compiler.fppcg1210.objdumper=/opt/compiler-explorer/powerpc/gcc-12.1.0/powerpc-unknown-linux-gnu/bin/powerpc-unknown-linux-gnu-objdump
+
+###############################
+# GCC for PPC64
+group.ppc64.compilers=fppc64g8:fppc64g9:fppc64g1210
+group.ppc64.groupName=POWER64 gfortran
+group.ppc64.baseName=POWER64 gfortran
+
compiler.fppc64g8.exe=/opt/compiler-explorer/powerpc64/gcc-at12/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-gfortran
compiler.fppc64g8.name=power64 AT12.0
compiler.fppc64g8.semver=(snapshot)
-compiler.fppc64leg9.exe=/opt/compiler-explorer/powerpc64le/gcc-at13/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-gfortran
-compiler.fppc64leg9.name=power64le AT13.0
-compiler.fppc64leg9.semver=(snapshot)
+
compiler.fppc64g9.exe=/opt/compiler-explorer/powerpc64/gcc-at13/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-gfortran
compiler.fppc64g9.name=power64 AT13.0
compiler.fppc64g9.semver=(snapshot)
+compiler.fppc64g1210.exe=/opt/compiler-explorer/powerpc64/gcc-12.1.0/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-gfortran
+compiler.fppc64g1210.semver=12.1.0
+compiler.fppc64g1210.objdumper=/opt/compiler-explorer/powerpc64/gcc-12.1.0/powerpc64-unknown-linux-gnu/bin/powerpc64-unknown-linux-gnu-objdump
+
+###############################
+# GCC for PPC64LE
+group.ppc64le.compilers=fppc64leg8:fppc64leg9:fppc64leg1210
+group.ppc64le.groupName=POWER64le gfortran
+group.ppc64le.baseName=POWER64le gfortran
+
+compiler.fppc64leg8.exe=/opt/compiler-explorer/powerpc64le/gcc-at12/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-gfortran
+compiler.fppc64leg8.name=power64le AT12.0
+compiler.fppc64leg8.semver=(snapshot)
+
+compiler.fppc64leg9.exe=/opt/compiler-explorer/powerpc64le/gcc-at13/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-gfortran
+compiler.fppc64leg9.name=power64le AT13.0
+compiler.fppc64leg9.semver=(snapshot)
+
+compiler.fppc64leg1210.exe=/opt/compiler-explorer/powerpc64le/gcc-12.1.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-gfortran
+compiler.fppc64leg1210.semver=12.1.0
+compiler.fppc64leg1210.objdumper=/opt/compiler-explorer/powerpc64le/gcc-12.1.0/powerpc64le-unknown-linux-gnu/bin/powerpc64le-unknown-linux-gnu-objdump
+
+################################
+# GCC for RISC-V 32-bits
+group.gccrv32.compilers=frv32g1210
+group.gccrv32.groupName=RISC-V 32-bits gfortran
+group.gccrv32.baseName=RISC-V 32-bits gfortran
+
+compiler.frv32g1210.exe=/opt/compiler-explorer/gcc-12.1.0/riscv32-unknown-elf/bin/riscv32-unknown-elf-gfortran
+compiler.frv32g1210.semver=12.1.0
+compiler.frv32g1210.objdumper=/opt/compiler-explorer/riscv32/gcc-12.1.0/riscv32-unknown-elf/bin/riscv32-unknown-elf-objdump
+
+################################
+# GCC for RISC-V 64-bits
+group.gccrv64.compilers=frv64g1210
+group.gccrv64.groupName=RISC-V 64-bits gfortran
+group.gccrv64.baseName=RISC-V 64-bits gfortran
+
+compiler.frv64g1210.exe=/opt/compiler-explorer/gcc-12.1.0/riscv64-unknown-elf/bin/riscv64-unknown-elf-gfortran
+compiler.frv64g1210.semver=12.1.0
+compiler.frv64g1210.exe=/opt/compiler-explorer/gcc-12.1.0/riscv64-unknown-elf/bin/riscv64-unknown-elf-objdump
+
+################################
+# GCC for MIPS
+group.gccmips.compilers=fmipsg1210
+group.gccmips.groupName=MIPS gfortran
+group.gccmips.baseName=MIPS gfortran
+
+compiler.fmipsg1210.exe=/opt/compiler-explorer/mips/gcc-12.1.0/mips-unknown-linux-gnu/bin/mips-unknown-linux-gnu-gfortran
+compiler.fmipsg1210.semver=12.1.0
+compiler.fmipsg1210.objdumper=/opt/compiler-explorer/mips/gcc-12.1.0/mips-unknown-linux-gnu/bin/mips-unknown-linux-gnu-objdump
+
+################################
+# GCC for MIPS64
+group.gccmips64.compilers=fmips64g1210
+group.gccmips64.groupName=MIPS64 gfortran
+group.gccmips64.baseName=MIPS64 gfortran
+
+compiler.fmips64g1210.exe=/opt/compiler-explorer/mips64/gcc-12.1.0/mips64-unknown-linux-gnu/bin/mips64-unknown-linux-gnu-gfortran
+compiler.fmips64g1210.semver=12.1.0
+compiler.fmips64g1210.objdumper=/opt/compiler-explorer/mips64/gcc-12.1.0/mips64-unknown-linux-gnu/bin/mips64-unknown-linux-gnu-objdump
+
+################################
+# GCC for MIPSEL
+group.gccmipsel.compilers=fmipselg1210
+group.gccmipsel.groupName=MIPSel gfortran
+group.gccmipsel.baseName=MIPSel gfortran
+
+compiler.fmipselg1210.exe=/opt/compiler-explorer/mipsel/gcc-12.1.0/mipsel-multilib-linux-gnu/bin/mipsel-multilib-linux-gnu-gfortran
+compiler.fmipselg1210.semver=12.1.0
+compiler.fmipselg1210.objdumper=/opt/compiler-explorer/mipsel/gcc-12.1.0/mipsel-multilib-linux-gnu/bin/mipsel-multilib-linux-gnu-objdump
+
+################################
+# GCC for MIPS64el
+group.gccmips64el.compilers=fmips64elg1210
+group.gccmips64el.groupName=MIPS64el gfortran
+group.gccmips64el.baseName=MIPS64el gfortran
+
+compiler.fmips64elg1210.exe=/opt/compiler-explorer/mips64el/gcc-12.1.0/mips64el-multilib-linux-uclibc/bin/mips64el-multilib-linux-uclibc-gfortran
+compiler.fmips64elg1210.semver=12.1.0
+compiler.fmips64elg1210.objdumper=/opt/compiler-explorer/mips64el/gcc-12.1.0/mips64el-multilib-linux-uclibc/bin/mips64el-multilib-linux-uclibc-objdump
+
#################################
#################################
# Installed tools
diff --git a/etc/config/go.amazon.properties b/etc/config/go.amazon.properties
index 9c12eca03..27de65c9b 100644
--- a/etc/config/go.amazon.properties
+++ b/etc/config/go.amazon.properties
@@ -2,7 +2,7 @@ compilers=&gccgo:&gl:&cross
defaultCompiler=gl1190
objdumper=/opt/compiler-explorer/gcc-12.1.0/bin/objdump
-group.gccgo.compilers=gccgo494:gccgo630:gccgo720:gccgo830:gccgo930:gccgo950:gccgo102:gccgo111:gccgo112:gccgo113:gccgo121
+group.gccgo.compilers=gccgo494:gccgo630:gccgo720:gccgo830:gccgo930:gccgo950:gccgo102:gccgo111:gccgo112:gccgo113:gccgo121:gccgo122
group.gccgo.isSemVer=true
group.gccgo.baseName=x86 gccgo
compiler.gccgo494.exe=/opt/compiler-explorer/gcc-4.9.4/bin/gccgo
@@ -29,6 +29,8 @@ compiler.gccgo113.exe=/opt/compiler-explorer/gcc-11.3.0/bin/gccgo
compiler.gccgo113.semver=11.3.0
compiler.gccgo121.exe=/opt/compiler-explorer/gcc-12.1.0/bin/gccgo
compiler.gccgo121.semver=12.1.0
+compiler.gccgo122.exe=/opt/compiler-explorer/gcc-12.2.0/bin/gccgo
+compiler.gccgo122.semver=12.2.0
group.gl.compilers=&x86gl:&armgl:&mipsgl:&ppcgl:&riscvgl:&s390xgl:&wasmgl
diff --git a/etc/config/hlsl.amazon.properties b/etc/config/hlsl.amazon.properties
index 04b3cd56a..a66f7baaa 100644
--- a/etc/config/hlsl.amazon.properties
+++ b/etc/config/hlsl.amazon.properties
@@ -1,8 +1,4 @@
-compilers=&dxc
-supportsBinary=false
-defaultCompiler=dxc_1_7_2207
-compilerType=hlsl
-
+compilers=&dxc:&rga
group.dxc.compilers=dxc_trunk:dxc_1_6_2112:dxc_1_7_2207
group.dxc.groupName=DXC
@@ -15,3 +11,37 @@ compiler.dxc_1_6_2112.exe=/opt/compiler-explorer/dxc-1.6.2112/bin/dxc
compiler.dxc_1_6_2112.semver=1.6.2112
compiler.dxc_1_7_2207.exe=/opt/compiler-explorer/dxc-1.7.2207/bin/dxc
compiler.dxc_1_7_2207.semver=1.7.2207
+
+group.rga.compilers=rga262_dxctrunk:rga262_dxc172207:rga262_dxc162112:rga261_dxc172207:rga261_dxc162112
+group.rga.groupName=RGA
+group.rga.isSemVer=true
+group.rga.compilerType=rga
+
+compiler.rga262_dxctrunk.exe=/opt/compiler-explorer/rga-2.6.2.38/rga
+compiler.rga262_dxctrunk.semver=2.6.2
+compiler.rga262_dxctrunk.dxcPath=/opt/compiler-explorer/dxc-trunk/bin/dxc
+compiler.rga262_dxctrunk.name=RGA 2.6.2 (DXC trunk)
+
+compiler.rga262_dxc172207.exe=/opt/compiler-explorer/rga-2.6.2.38/rga
+compiler.rga262_dxc172207.semver=2.6.2
+compiler.rga262_dxc172207.dxcPath=/opt/compiler-explorer/dxc-1.7.2207/bin/dxc
+compiler.rga262_dxc172207.name=RGA 2.6.2 (DXC 1.7.2207)
+
+compiler.rga262_dxc162112.exe=/opt/compiler-explorer/rga-2.6.2.38/rga
+compiler.rga262_dxc162112.semver=2.6.2
+compiler.rga262_dxc162112.dxcPath=/opt/compiler-explorer/dxc-1.6.2112/bin/dxc
+compiler.rga262_dxc162112.name=RGA 2.6.2 (DXC 1.6.2112)
+
+compiler.rga261_dxc172207.exe=/opt/compiler-explorer/rga-2.6.1.23/rga
+compiler.rga261_dxc172207.semver=2.6.1
+compiler.rga261_dxc172207.dxcPath=/opt/compiler-explorer/dxc-1.7.2207/bin/dxc
+compiler.rga261_dxc172207.name=RGA 2.6.1 (DXC 1.7.2207)
+
+compiler.rga261_dxc162112.exe=/opt/compiler-explorer/rga-2.6.1.23/rga
+compiler.rga261_dxc162112.semver=2.6.1
+compiler.rga261_dxc162112.dxcPath=/opt/compiler-explorer/dxc-1.6.2112/bin/dxc
+compiler.rga261_dxc162112.name=RGA 2.6.1 (DXC 1.6.2112)
+
+supportsBinary=false
+defaultCompiler=dxc_1_7_2207
+compilerType=hlsl
diff --git a/etc/config/hlsl.defaults.properties b/etc/config/hlsl.defaults.properties
index ed717c820..8cfcb4a4d 100644
--- a/etc/config/hlsl.defaults.properties
+++ b/etc/config/hlsl.defaults.properties
@@ -1,7 +1,15 @@
-compilers=dxc_default
-defaultCompiler=dxc_default
-supportsBinary=false
-compilerType=hlsl
+compilers=&dxc:&rga
+group.dxc.compilers=dxc_default
compiler.dxc_default.exe=/usr/dxc-artifacts/bin/dxc
compiler.dxc_default.name=DXC
+
+group.rga.compilers=rga_default
+group.rga.compilerType=rga
+
+compiler.rga_default.exe=/usr/rga/rga
+compiler.rga_default.dxcPath=/usr/dxc-artifacts/bin/dxc
+
+defaultCompiler=dxc
+supportsBinary=false
+compilerType=hlsl
diff --git a/etc/config/sponsors.yaml b/etc/config/sponsors.yaml
index 92f3864eb..9d1257589 100644
--- a/etc/config/sponsors.yaml
+++ b/etc/config/sponsors.yaml
@@ -379,3 +379,6 @@ levels:
- Unstillable
- cedric chanoine
- Cristian Kocza
+ - Benji Smith
+ - John Mertus
+ - Nick Darnell
diff --git a/etc/scripts/util/propscheck.py b/etc/scripts/util/propscheck.py
index bc6b633dd..7d7a623e9 100644
--- a/etc/scripts/util/propscheck.py
+++ b/etc/scripts/util/propscheck.py
@@ -32,15 +32,15 @@ PROP_RE = re.compile(r'[^#]*=.*')
COMPILERS_LIST_RE = re.compile(r'compilers=(.*)')
ALIAS_LIST_RE = re.compile(r'alias=(.*)')
GROUP_NAME_RE = re.compile(r'group\.(.*?)\.')
-COMPILER_EXE_RE = re.compile(r'compiler\.(.*?)\.exe')
+COMPILER_EXE_RE = re.compile(r'compiler\.(.*?)\.exe=(.*)')
DEFAULT_COMPILER_RE = re.compile(r'defaultCompiler=(.*)')
FORMATTERS_LIST_RE = re.compile(r'formatters=(.*)')
-FORMATTER_EXE_RE = re.compile(r'formatter\.(.*?)\.exe')
+FORMATTER_EXE_RE = re.compile(r'formatter\.(.*?)\.exe=(.*)')
LIBS_LIST_RE = re.compile(r'libs=(.+)')
LIB_VERSIONS_LIST_RE = re.compile(r'libs\.(.*?)\.versions=(.*)')
LIB_VERSION_RE = re.compile(r'libs\.(.*?)\.versions\.(.*?)\.version')
TOOLS_LIST_RE = re.compile(r'tools=(.+)')
-TOOL_EXE_RE = re.compile(r'tools\.(.*?)\.exe')
+TOOL_EXE_RE = re.compile(r'tools\.(.*?)\.exe=(.*)')
EMPTY_LIST_RE = re.compile(r'.*(compilers|formatters|versions|tools|alias|exclude|libPath)=((.*::.*)|(:.*)|(.*:))$')
DISABLED_RE = re.compile(r'^# Disabled?:?\s*(.*)')
@@ -94,7 +94,13 @@ def process_file(file: str):
seen_lines = set()
duplicate_lines = set()
- disabled = set()
+ duplicated_compiler_references = set()
+ duplicated_group_references = set()
+
+ suspicious_path = set()
+
+ # By default, consider this one valid as it's in several configs.
+ disabled = set({'/usr/bin/ldd'})
with open(file) as f:
for line_number, text in enumerate(f, start=1):
@@ -122,8 +128,12 @@ def process_file(file: str):
ids = match_compilers.group(1).split(':')
for elem_id in ids:
if elem_id.startswith('&'):
+ if elem_id[1:] in listed_groups:
+ duplicated_group_references.add (elem_id[1:])
listed_groups.add(elem_id[1:])
elif '@' not in elem_id:
+ if elem_id in listed_compilers:
+ duplicated_compiler_references.add (elem_id)
listed_compilers.add(elem_id)
match_libs_versions = LIB_VERSIONS_LIST_RE.match(line.text)
@@ -141,9 +151,18 @@ def process_file(file: str):
match_and_add(line, DEFAULT_COMPILER_RE, default_compiler)
match_and_add(line, GROUP_NAME_RE, seen_groups)
- match_and_add(line, COMPILER_EXE_RE, seen_compilers)
- match_and_add(line, FORMATTER_EXE_RE, seen_formatters)
- match_and_add(line, TOOL_EXE_RE, seen_tools)
+ m = match_and_add(line, COMPILER_EXE_RE, seen_compilers)
+ if m and not m.group(2).startswith('/opt/compiler-explorer'):
+ suspicious_path.add(m.group(2))
+
+ m = match_and_add(line, FORMATTER_EXE_RE, seen_formatters)
+ if m and not m.group(2).startswith('/opt/compiler-explorer'):
+ suspicious_path.add(m.group(2))
+
+ m = match_and_add(line, TOOL_EXE_RE, seen_tools)
+ if m and not m.group(2).startswith('/opt/compiler-explorer'):
+ suspicious_path.add(m.group(2))
+
match_and_update(line, ALIAS_LIST_RE, seen_compilers)
match_and_update(line, FORMATTERS_LIST_RE, listed_formatters)
match_and_update(line, TOOLS_LIST_RE, listed_tools)
@@ -166,7 +185,10 @@ def process_file(file: str):
"bad_tools": bad_tools - disabled,
"bad_default": bad_default,
"empty_separators": empty_separators,
- "duplicate_lines": duplicate_lines
+ "duplicate_lines": duplicate_lines,
+ "duplicated_compiler_references": duplicated_compiler_references,
+ "duplicated_group_references": duplicated_group_references,
+ "suspicious_path": suspicious_path - disabled
}
diff --git a/etc/scripts/util/propschecktest.py b/etc/scripts/util/propschecktest.py
index 4eed2fbbd..c709c58cc 100644
--- a/etc/scripts/util/propschecktest.py
+++ b/etc/scripts/util/propschecktest.py
@@ -53,6 +53,18 @@ class PropsCheckTests(unittest.TestCase):
self.run_test("./test/cases/duplicate_lines.properties", "duplicate_lines",
{str(Line(5, "duplicated.prop=true"))})
+ def test_duplicated_compiler(self):
+ self.run_test("./test/cases/bad_duplicated_compiler.properties", "duplicated_compiler_references",
+ {"duplicatedname"})
+
+ def test_duplicated_group(self):
+ self.run_test("./test/cases/bad_duplicated_group.properties", "duplicated_group_references",
+ {"dupgroup"})
+
+ def test_suspicious_path(self):
+ self.run_test("./test/cases/suspicious_path.properties", "suspicious_path",
+ {"/wrong/path/bin/gcc"})
+
def test_good_file(self):
result = process_file('../../config/c++.amazon.properties')
for k in result:
diff --git a/etc/scripts/util/test/cases/bad_duplicated_compiler.properties b/etc/scripts/util/test/cases/bad_duplicated_compiler.properties
new file mode 100644
index 000000000..0584d7846
--- /dev/null
+++ b/etc/scripts/util/test/cases/bad_duplicated_compiler.properties
@@ -0,0 +1,4 @@
+compilers=&g1:&g2
+
+g1.compilers=c1:duplicatedname
+g2.compilers=c3:c4:duplicatedname
diff --git a/etc/scripts/util/test/cases/bad_duplicated_group.properties b/etc/scripts/util/test/cases/bad_duplicated_group.properties
new file mode 100644
index 000000000..a205177fe
--- /dev/null
+++ b/etc/scripts/util/test/cases/bad_duplicated_group.properties
@@ -0,0 +1,4 @@
+compilers=&g1:&g2
+
+g1.compilers=&dupgroup
+g2.compilers=&dupgroup
diff --git a/etc/scripts/util/test/cases/suspicious_path.properties b/etc/scripts/util/test/cases/suspicious_path.properties
new file mode 100644
index 000000000..c48c61337
--- /dev/null
+++ b/etc/scripts/util/test/cases/suspicious_path.properties
@@ -0,0 +1,3 @@
+compilers=a:b
+compiler.a.exe=/opt/compiler-explorer/some/bin/gcc
+compiler.b.exe=/wrong/path/bin/gcc
diff --git a/lib/base-compiler.ts b/lib/base-compiler.ts
index b8c9ac10d..f6a6c7af5 100644
--- a/lib/base-compiler.ts
+++ b/lib/base-compiler.ts
@@ -451,7 +451,7 @@ export class BaseCompiler {
return fn;
}
- getGccDumpFileName(outputFilename) {
+ getGccDumpFileName(outputFilename: string) {
return outputFilename.replace(path.extname(outputFilename), '.dump');
}
@@ -523,7 +523,7 @@ export class BaseCompiler {
// Returns a list of additional options that may be required by some backend options.
// Meant to be overloaded by compiler classes.
// Default handles the GCC compiler with some debug dump enabled.
- optionsForBackend(backendOptions, outputFilename) {
+ optionsForBackend(backendOptions: Record<string, any>, outputFilename: string): string[] {
let addOpts: string[] = [];
if (backendOptions.produceGccDump && backendOptions.produceGccDump.opened && this.compiler.supportsGccDump) {
@@ -533,7 +533,7 @@ export class BaseCompiler {
return addOpts;
}
- protected optionsForFilter(filters: ParseFilters, outputFilename, userOptions?) {
+ protected optionsForFilter(filters: ParseFilters, outputFilename: string, userOptions?: string[]): string[] {
let options = ['-g', '-o', this.filename(outputFilename)];
if (this.compiler.intelAsm && filters.intel && !filters.binary) {
options = options.concat(this.compiler.intelAsm.split(' '));
@@ -563,8 +563,8 @@ export class BaseCompiler {
return result;
}
- findAutodetectStaticLibLink(linkname): SelectedLibraryVersion | false {
- const foundLib = _.findKey(this.supportedLibraries as object, lib => {
+ findAutodetectStaticLibLink(linkname: string): SelectedLibraryVersion | false {
+ const foundLib = _.findKey(this.supportedLibraries as Record<string, Library>, lib => {
return (
lib.versions.autodetect &&
lib.versions.autodetect.staticliblink &&
@@ -751,31 +751,34 @@ export class BaseCompiler {
);
}
- getIncludeArguments(libraries) {
+ getIncludeArguments(libraries: SelectedLibraryVersion[]): string[] {
const includeFlag = this.compiler.includeFlag || '-I';
+ return libraries.flatMap(selectedLib => {
+ const foundVersion = this.findLibVersion(selectedLib);
+ if (!foundVersion) return [];
- return _.flatten(
- _.map(libraries, selectedLib => {
- const foundVersion = this.findLibVersion(selectedLib);
- if (!foundVersion) return false;
-
- return _.map(foundVersion.path, path => includeFlag + path);
- }),
- );
+ return foundVersion.path.map(path => includeFlag + path);
+ });
}
- getLibraryOptions(libraries) {
- return _.flatten(
- _.map(libraries, selectedLib => {
- const foundVersion = this.findLibVersion(selectedLib);
- if (!foundVersion) return false;
-
- return foundVersion.options;
- }),
- );
+ getLibraryOptions(libraries: SelectedLibraryVersion[]): string[] {
+ return libraries.flatMap(selectedLib => {
+ const foundVersion = this.findLibVersion(selectedLib);
+ if (!foundVersion) return [];
+ return foundVersion.options;
+ });
}
- orderArguments(options, inputFilename, libIncludes, libOptions, libPaths, libLinks, userOptions, staticLibLinks) {
+ orderArguments(
+ options: string[],
+ inputFilename: string,
+ libIncludes: string[],
+ libOptions: string[],
+ libPaths: string[],
+ libLinks: string[],
+ userOptions: string[],
+ staticLibLinks: string[],
+ ) {
return options.concat(
userOptions,
[this.filename(inputFilename)],
@@ -787,7 +790,14 @@ export class BaseCompiler {
);
}
- prepareArguments(userOptions, filters: ParseFilters, backendOptions, inputFilename, outputFilename, libraries) {
+ prepareArguments(
+ userOptions: string[],
+ filters: ParseFilters,
+ backendOptions: Record<string, any>,
+ inputFilename: string,
+ outputFilename: string,
+ libraries,
+ ) {
let options = this.optionsForFilter(filters, outputFilename, userOptions);
backendOptions = backendOptions || {};
@@ -831,7 +841,7 @@ export class BaseCompiler {
return options;
}
- filterUserOptions(userOptions) {
+ filterUserOptions(userOptions: string[]): string[] {
return userOptions;
}
@@ -2359,7 +2369,7 @@ but nothing was dumped. Possible causes are:
return source;
}
- async postProcess(result, outputFilename, filters) {
+ async postProcess(result, outputFilename: string, filters: ParseFilters) {
const postProcess = _.compact(this.compiler.postProcess);
const maxSize = this.env.ceProps('max-asm-size', 64 * 1024 * 1024);
const optPromise = result.hasOptOutput ? this.processOptOutput(result.optPath) : '';
diff --git a/lib/compilers/_all.js b/lib/compilers/_all.js
index 9abb0e5ef..3224acc03 100644
--- a/lib/compilers/_all.js
+++ b/lib/compilers/_all.js
@@ -75,6 +75,7 @@ export {PonyCompiler} from './pony';
export {PPCICompiler} from './ppci';
export {PtxAssembler} from './ptxas';
export {PythonCompiler} from './python';
+export {RGACompiler} from './rga';
export {RubyCompiler} from './ruby';
export {RustcCgGCCCompiler} from './rustc-cg-gcc';
export {RustCompiler} from './rust';
diff --git a/lib/compilers/golang.js b/lib/compilers/golang.ts
index 8aa0fd985..b0abb1498 100644
--- a/lib/compilers/golang.js
+++ b/lib/compilers/golang.ts
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, Compiler Explorer Authors
+// Copyright (c) 2022, Compiler Explorer Authors
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
@@ -24,6 +24,7 @@
import _ from 'underscore';
+import {ResultLine} from '../../types/resultline/resultline.interfaces';
import {BaseCompiler} from '../base-compiler';
import * as utils from '../utils';
@@ -34,40 +35,61 @@ import {ClangParser} from './argument-parsers';
// x86 -> j, b
// arm -> cb, tb
// s390x -> cmpb, cmpub
-const jumpRe = /^(j|b|cb|tb|cmpb|cmpub).*/i;
+const JUMP_RE = /^(j|b|cb|tb|cmpb|cmpub).*/i;
+const LINE_RE = /^\s+(0[Xx]?[\dA-Za-z]+)?\s?(\d+)\s*\(([^:]+):(\d+)\)\s*([A-Z]+)(.*)/;
+const UNKNOWN_RE = /^\s+(0[Xx]?[\dA-Za-z]+)?\s?(\d+)\s*\(<unknown line number>\)\s*([A-Z]+)(.*)/;
+const FUNC_RE = /TEXT\s+[".]*(\S+)\(SB\)/;
+const LOGGING_RE = /^[^:]+:\d+:(\d+:)?\s.*/;
+const DECIMAL_RE = /(\s+)(\d+)(\s?)$/;
+
+type GoEnv = {
+ GOROOT?: string;
+ GOARCH?: string;
+ GOOS?: string;
+};
export class GolangCompiler extends BaseCompiler {
+ private readonly GOENV: GoEnv;
+
static get key() {
return 'golang';
}
constructor(compilerInfo, env) {
super(compilerInfo, env);
- this.goroot = this.compilerProps(`compiler.${this.compiler.id}.goroot`);
- this.goarch = this.compilerProps(`compiler.${this.compiler.id}.goarch`);
- this.goos = this.compilerProps(`compiler.${this.compiler.id}.goos`);
+ const goroot = this.compilerProps(`compiler.${this.compiler.id}.goroot`);
+ const goarch = this.compilerProps(`compiler.${this.compiler.id}.goarch`);
+ const goos = this.compilerProps(`compiler.${this.compiler.id}.goos`);
+
+ this.GOENV = {};
+ if (goroot) {
+ this.GOENV.GOROOT = goroot;
+ }
+ if (goarch) {
+ this.GOENV.GOARCH = goarch;
+ }
+ if (goos) {
+ this.GOENV.GOOS = goos;
+ }
}
- convertNewGoL(code) {
- const re = /^\s+(0[Xx]?[\dA-Za-z]+)?\s?(\d+)\s*\(([^:]+):(\d+)\)\s*([A-Z]+)(.*)/;
- const reUnknown = /^\s+(0[Xx]?[\dA-Za-z]+)?\s?(\d+)\s*\(<unknown line number>\)\s*([A-Z]+)(.*)/;
- const reFunc = /TEXT\s+[".]*(\S+)\(SB\)/;
- let prevLine = null;
- let file = null;
+ convertNewGoL(code: ResultLine[]): string {
+ let prevLine: string | null = null;
+ let file: string | null = null;
let fileCount = 0;
- let func = null;
- const funcCollisions = {};
- const labels = {};
- const usedLabels = {};
+ let func: string | null = null;
+ const funcCollisions: Record<string, number> = {};
+ const labels: Record<string, boolean> = {};
+ const usedLabels: Record<string, boolean> = {};
const lines = code.map(obj => {
- let pcMatch = null;
- let fileMatch = null;
- let lineMatch = null;
- let ins = null;
- let args = null;
+ let pcMatch: string | null = null;
+ let fileMatch: string | null = null;
+ let lineMatch: string | null = null;
+ let ins: string | null = null;
+ let args: string | null = null;
const line = obj.text;
- let match = line.match(re);
+ let match = line.match(LINE_RE);
if (match) {
pcMatch = match[2];
fileMatch = match[3];
@@ -75,17 +97,17 @@ export class GolangCompiler extends BaseCompiler {
ins = match[5];
args = match[6];
} else {
- match = line.match(reUnknown);
+ match = line.match(UNKNOWN_RE);
if (match) {
pcMatch = match[2];
ins = match[3];
args = match[4];
} else {
- return null;
+ return [];
}
}
- match = line.match(reFunc);
+ match = line.match(FUNC_RE);
if (match) {
// Normalize function name.
func = match[1].replace(/[()*.]+/g, '_');
@@ -103,12 +125,12 @@ export class GolangCompiler extends BaseCompiler {
funcCollisions[func] = collisions;
}
- let res = [];
+ const res: string[] = [];
if (pcMatch && !labels[pcMatch]) {
// Create pseudo-label.
let label = pcMatch.replace(/^0{0,4}/, '');
let suffix = '';
- if (funcCollisions[func] > 0) {
+ if (func && funcCollisions[func] > 0) {
suffix = `_${funcCollisions[func]}`;
}
@@ -130,32 +152,37 @@ export class GolangCompiler extends BaseCompiler {
prevLine = lineMatch;
}
- args = this.replaceJump(func, funcCollisions[func], ins, args, usedLabels);
- res.push(`\t${ins}${args}`);
+ if (func) {
+ args = this.replaceJump(func, funcCollisions[func], ins, args, usedLabels);
+ res.push(`\t${ins}${args}`);
+ }
return res;
});
// Find unused pseudo-labels so they can be filtered out.
const unusedLabels = _.mapObject(labels, (val, key) => !usedLabels[key]);
- return _.chain(lines)
- .flatten()
- .compact()
+ return lines
+ .flat()
.filter(line => !unusedLabels[line])
- .value()
.join('\n');
}
- replaceJump(func, collisions, ins, args, usedLabels) {
+ replaceJump(
+ func: string,
+ collisions: number,
+ ins: string,
+ args: string,
+ usedLabels: Record<string, boolean>,
+ ): string {
// Check if last argument is a decimal number.
- const re = /(\s+)(\d+)(\s?)$/;
- const match = args.match(re);
+ const match = args.match(DECIMAL_RE);
if (!match) {
return args;
}
// Check instruction has a jump prefix
- if (jumpRe.test(ins)) {
+ if (JUMP_RE.test(ins)) {
let label = `${func}_pc${match[2]}`;
if (collisions > 0) {
label += `_${collisions}`;
@@ -167,16 +194,16 @@ export class GolangCompiler extends BaseCompiler {
return args;
}
- extractLogging(stdout) {
- let filepath = `./${this.compileFilename}`;
- const reLogging = /^[^:]+:\d+:(\d+:)?\s.*/;
+ extractLogging(stdout: ResultLine[]): string {
+ const filepath = `./${this.compileFilename}`;
+
return stdout
- .filter(obj => obj.text.match(reLogging))
+ .filter(obj => obj.text.match(LOGGING_RE))
.map(obj => obj.text.replace(filepath, '<source>'))
.join('\n');
}
- async postProcess(result) {
+ override async postProcess(result) {
let out = result.stderr;
if (this.compiler.id === '6g141') {
out = result.stdout;
@@ -185,14 +212,14 @@ export class GolangCompiler extends BaseCompiler {
result.asm = this.convertNewGoL(out);
result.stderr = null;
result.stdout = utils.parseOutput(logging, result.inputFilename);
- return [result, ''];
+ return Promise.all([result, '']);
}
- getSharedLibraryPathsAsArguments() {
+ override getSharedLibraryPathsAsArguments() {
return [];
}
- optionsForFilter(filters, outputFilename, userOptions) {
+ override optionsForFilter(filters, outputFilename, userOptions) {
// If we're dealing with an older version...
if (this.compiler.id === '6g141') {
return ['tool', '6g', '-g', '-o', outputFilename, '-S'];
@@ -206,7 +233,7 @@ export class GolangCompiler extends BaseCompiler {
}
}
- filterUserOptions(userOptions) {
+ override filterUserOptions(userOptions) {
if (this.compiler.id === '6g141') {
return userOptions;
}
@@ -214,21 +241,14 @@ export class GolangCompiler extends BaseCompiler {
return [];
}
- getDefaultExecOptions() {
- const execOptions = super.getDefaultExecOptions();
- if (this.goroot) {
- execOptions.env.GOROOT = this.goroot;
- }
- if (this.goarch) {
- execOptions.env.GOARCH = this.goarch;
- }
- if (this.goos) {
- execOptions.env.GOOS = this.goos;
- }
- return execOptions;
+ override getDefaultExecOptions() {
+ return {
+ ...super.getDefaultExecOptions(),
+ ...this.GOENV,
+ };
}
- getArgumentParser() {
+ override getArgumentParser() {
return ClangParser;
}
}
diff --git a/lib/compilers/hlsl.js b/lib/compilers/hlsl.ts
index 25858839e..2925a0154 100644
--- a/lib/compilers/hlsl.js
+++ b/lib/compilers/hlsl.ts
@@ -24,6 +24,7 @@
import path from 'path';
+import {ParseFilters} from '../../types/features/filters.interfaces';
import {BaseCompiler} from '../base-compiler';
export class HLSLCompiler extends BaseCompiler {
@@ -31,21 +32,39 @@ export class HLSLCompiler extends BaseCompiler {
return 'hlsl';
}
- constructor(info, env) {
+ constructor(info: any, env: any) {
super(info, env);
this.compiler.supportsIntel = false;
}
/* eslint-disable no-unused-vars */
- optionsForFilter(filters, outputFilename) {
+ override optionsForFilter(filters: ParseFilters, outputFilename: string, userOptions?: string[]): string[] {
return [
+ '-Zi', // Embed debug information to get DXIL line associations
+ '-Qembed_debug', // Silences the warning associated with embedded debug information
`-Fc ${outputFilename}`, // Output object
];
}
/* eslint-enable no-unused-vars */
- getIrOutputFilename(inputFilename) {
+ override filterUserOptions(userOptions: any) {
+ // RGA supports a non-standard flag --asic [ASIC] which must be removed when compiling with DXC
+ const options = userOptions.slice(0);
+ // Scan for the RGA-specific argument --asic and strip it and its corresponding argument
+ // Assumes the argument exists at most once (compilation will fail if supplied more than
+ // once regardless)
+ for (let i = 0; i !== options.length; ++i) {
+ const option = options[i];
+ if (option === '--asic') {
+ options.splice(i, 2);
+ break;
+ }
+ }
+ return options;
+ }
+
+ override getIrOutputFilename(inputFilename: string) {
return this.getOutputFilename(path.dirname(inputFilename), this.outputFilebase).replace('.s', '.dxil');
}
}
diff --git a/lib/compilers/rga.ts b/lib/compilers/rga.ts
new file mode 100644
index 000000000..aec9d2084
--- /dev/null
+++ b/lib/compilers/rga.ts
@@ -0,0 +1,276 @@
+// Copyright (c) 2022, 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 {readdir, readFile, rename, writeFile} from 'fs-extra';
+
+import {CompilationResult, ExecutionOptions} from '../../types/compilation/compilation.interfaces';
+import {ParseFilters} from '../../types/features/filters.interfaces';
+import {BaseCompiler} from '../base-compiler';
+import * as exec from '../exec';
+import {logger} from '../logger';
+
+interface ASICSelection {
+ asic?: string;
+ error?: string;
+ printASICs?: boolean;
+}
+
+// RGA := Radeon GPU Analyzer
+export class RGACompiler extends BaseCompiler {
+ private dxcPath: string;
+
+ static get key() {
+ return 'rga';
+ }
+
+ constructor(info: any, env: any) {
+ super(info, env);
+
+ this.compiler.supportsIntel = false;
+ this.dxcPath = this.compilerProps(`compiler.${this.compiler.id}.dxcPath`);
+ logger.debug(`RGA compiler ${this.compiler.id} configured to use DXC at ${this.dxcPath}`);
+ }
+
+ override optionsForFilter(filters: ParseFilters, outputFilename: any, userOptions?: any): any[] {
+ return [outputFilename];
+ }
+
+ extractASIC(dxcArgs: string[]): ASICSelection {
+ // Scan dxc args for an `--asic` argument that should be stripped and passed later to RGA
+ // Default to RDNA2
+ let asic = 'gfx1030';
+ let printASICs = true;
+ for (let i = 0; i !== dxcArgs.length; ++i) {
+ const arg = dxcArgs[i];
+ if (arg === '--asic') {
+ // NOTE: the last arguments are the input source file and -spirv, so check
+ // if --asic immediately precedes that
+ if (i === dxcArgs.length - 3) {
+ return {
+ error: '--asic flag supplied without subsequent ASIC!',
+ };
+ }
+ asic = dxcArgs[i + 1];
+ // Do a quick sanity check to determine if a valid ASIC was supplied
+ if (!asic.startsWith('gfx')) {
+ return {
+ error: `The argument immediately following --asic doesn't appear to be a valid ASIC.
+Please supply an ASIC from the following options:`,
+ printASICs: true,
+ };
+ }
+ // Remove these two arguments from the dxcArgs list
+ dxcArgs.splice(i, 2);
+
+ // If the user supplied a specific ASIC, don't bother printing available ASIC options
+ printASICs = false;
+ break;
+ }
+ }
+
+ return {
+ asic,
+ printASICs,
+ };
+ }
+
+ execTime(startTime: bigint, endTime: bigint): string {
+ return ((endTime - startTime) / BigInt(1000000)).toString();
+ }
+
+ override async runCompiler(
+ compiler: string,
+ options: string[],
+ inputFilename: string,
+ execOptions: ExecutionOptions,
+ ): Promise<CompilationResult> {
+ if (!execOptions) {
+ execOptions = this.getDefaultExecOptions();
+ }
+
+ if (!execOptions.customCwd) {
+ execOptions.customCwd = path.dirname(inputFilename);
+ }
+
+ const result = await this.execDXCandRGA(compiler, options, execOptions);
+ result.inputFilename = inputFilename;
+ const transformedInput = result.filenameTransform(inputFilename);
+ this.parseCompilationOutput(result, transformedInput);
+ return result;
+ }
+
+ async execDXCandRGA(filepath: string, args: string[], execOptions: ExecutionOptions): Promise<any> {
+ // RGA is invoked in two steps. First, DXC is invoked to compile the SPIR-V output of the HLSL file.
+ // Next, RGA is invoked to consume the SPIR-V output and produce the requested ISA.
+
+ // Track the total time spent instead of relying on executeDirect's internal timing facility
+ const startTime = process.hrtime.bigint();
+
+ // The first argument is the target output file
+ const outputFile = args[0];
+ const outputDir = path.dirname(outputFile);
+ const spvTemp = 'output.spv.txt';
+ logger.debug(`Intermediate SPIR-V output: ${spvTemp}`);
+
+ const dxcArgs = args.slice(1);
+ if (!dxcArgs.includes('-spirv')) {
+ dxcArgs.push('-spirv');
+ }
+ logger.debug(`DXC args: ${dxcArgs}`);
+
+ const asicSelection = this.extractASIC(dxcArgs);
+ if (asicSelection.error) {
+ // Invalid user ASIC selected, bail out immediately
+ const endTime = process.hrtime.bigint();
+
+ // Synthesize a faux-execution result (see promise resolution code in executeDirect)
+ return {
+ code: -1,
+ okToCache: true,
+ filenameTransform: x => x,
+ stdout: asicSelection.error,
+ execTime: this.execTime(startTime, endTime),
+ };
+ }
+
+ const dxcResult = await exec.execute(this.dxcPath, dxcArgs, execOptions);
+ if (dxcResult.code !== 0) {
+ // Failed to compile SPIR-V intermediate product. Exit immediately with DXC invocation result.
+ const endTime = process.hrtime.bigint();
+ dxcResult.execTime = this.execTime(startTime, endTime);
+ return dxcResult;
+ }
+
+ try {
+ await writeFile(path.join(outputDir, spvTemp), dxcResult.stdout);
+ } catch (e) {
+ const endTime = process.hrtime.bigint();
+ return {
+ code: -1,
+ okToCache: true,
+ filenameTransform: x => x,
+ stdout: 'Failed to emit intermediate SPIR-V result.',
+ execTime: this.execTime(startTime, endTime),
+ };
+ }
+
+ let registerAnalysisFile = 'livereg.txt';
+ const rgaArgs = [
+ '-s',
+ 'vk-spv-txt-offline',
+ '-c',
+ asicSelection.asic,
+ '--isa',
+ outputFile,
+ '--livereg',
+ registerAnalysisFile,
+ spvTemp,
+ ];
+ logger.debug(`RGA args: ${rgaArgs}`);
+
+ const rgaResult = await exec.execute(filepath, rgaArgs, execOptions);
+ if (rgaResult.code !== 0) {
+ // Failed to compile AMD ISA
+ const endTime = process.hrtime.bigint();
+ rgaResult.execTime = this.execTime(startTime, endTime);
+ return rgaResult;
+ }
+
+ // RGA doesn't emit the exact file we requested. It prepends the requested GPU
+ // architecture and appends the shader type (with underscore separators). Here,
+ // we rename the generated file to the output file Compiler Explorer expects.
+
+ const files = await readdir(outputDir, {encoding: 'utf-8'});
+ for (const file of files) {
+ if (file.startsWith((asicSelection.asic as string) + '_output')) {
+ await rename(path.join(outputDir, file), outputFile);
+
+ registerAnalysisFile = path.join(outputDir, file.replace('output', 'livereg').replace('.s', '.txt'));
+ // The register analysis file contains a legend, and register liveness data
+ // for each line of disassembly. Interleave those lines into the final output
+ // as assembly comments.
+ const asm = await readFile(outputFile, 'utf-8');
+ const asmLines = asm.split(/\r?\n/);
+ const analysis = await readFile(registerAnalysisFile, 'utf-8');
+ const analysisLines = analysis.split(/\r?\n/);
+
+ // The first few lines of the register analysis are the legend. Emit those lines
+ // as comments at the start of the output.
+ let analysisOffset = analysisLines.indexOf('');
+ analysisOffset += 3;
+ const epilogueOffset = analysisLines.indexOf('', analysisOffset);
+ const outputAsm = analysisLines.slice(epilogueOffset + 1).map(line => `; ${line}`);
+ outputAsm.push(...analysisLines.slice(0, analysisOffset).map(line => `; ${line}`), '\n');
+
+ let asmOffset = asmLines.indexOf('');
+ outputAsm.push(...asmLines.slice(0, asmOffset));
+ asmOffset += 1;
+
+ // Perform the interleave
+ for (let i = 0; i !== asmOffset + asmLines.length; ++i) {
+ if (i + analysisOffset >= epilogueOffset) {
+ outputAsm.push(...asmLines.slice(i));
+ break;
+ }
+
+ // Check if this line of assembly corresponds to a label. If so, emit the asm line
+ // and continue from the next line (the register analysis file operates on instructions,
+ // and labels are not considered instructions)
+ if (asmLines[i + asmOffset].startsWith('label')) {
+ outputAsm.push(asmLines[i + asmOffset]);
+ ++asmOffset;
+ --i;
+ continue;
+ }
+
+ outputAsm.push(`; ${analysisLines[i + analysisOffset]}`, asmLines[i + asmOffset]);
+ }
+
+ await writeFile(outputFile, outputAsm.join('\n'));
+
+ if (asicSelection.printASICs) {
+ rgaResult.stdout += `ISA compiled with the default AMD ASIC (Radeon RX 6800 series RDNA2).
+To override this, pass --asic [ASIC] to the options above (nonstandard DXC option),
+where [ASIC] corresponds to one of the following options:`;
+
+ const asics = await exec.execute(filepath, ['-s', 'vk-spv-txt-offline', '-l'], execOptions);
+ rgaResult.stdout += '\n';
+ rgaResult.stdout += asics.stdout;
+ }
+
+ const endTime = process.hrtime.bigint();
+ rgaResult.execTime = this.execTime(startTime, endTime);
+ return rgaResult;
+ }
+ }
+
+ // Arriving here means the expected ISA result wasn't emitted. Synthesize an error.
+ const endTime = process.hrtime.bigint();
+ rgaResult.execTime = this.execTime(startTime, endTime);
+ rgaResult.stdout += `\nRGA didn't emit expected ISA output.`;
+ return rgaResult;
+ }
+}
diff --git a/lib/compilers/rust.ts b/lib/compilers/rust.ts
index 89b52533d..f1d0d3a89 100644
--- a/lib/compilers/rust.ts
+++ b/lib/compilers/rust.ts
@@ -35,6 +35,7 @@ import {RustParser} from './argument-parsers';
export class RustCompiler extends BaseCompiler {
linker: string;
+
static get key() {
return 'rust';
}
@@ -69,24 +70,19 @@ export class RustCompiler extends BaseCompiler {
override getIncludeArguments(libraries) {
const includeFlag = '--extern';
- return _.flatten(
- _.map(libraries, selectedLib => {
- const foundVersion = this.findLibVersion(selectedLib);
- if (!foundVersion) return false;
- if (!foundVersion.name) return false;
- const list: string[] = [];
- const lowercaseLibName = foundVersion.name.replaceAll('-', '_');
- for (const rlib of foundVersion.path) {
- list.push(
- includeFlag,
- `${lowercaseLibName}=${foundVersion.name}/build/debug/${rlib}`,
- '-L',
- `dependency=${foundVersion.name}/build/debug/deps`,
- );
- }
- return list;
- }),
- );
+ return libraries.flatMap(selectedLib => {
+ const foundVersion = this.findLibVersion(selectedLib);
+ if (!foundVersion || !foundVersion.name) return [];
+ const lowercaseLibName = foundVersion.name.replaceAll('-', '_');
+ return foundVersion.path.flatMap(rlib => {
+ return [
+ includeFlag,
+ `${lowercaseLibName}=${foundVersion.name}/build/debug/${rlib}`,
+ '-L',
+ `dependency=${foundVersion.name}/build/debug/deps`,
+ ];
+ });
+ });
}
override orderArguments(
diff --git a/lib/compilers/wine-vc.js b/lib/compilers/wine-vc.js
index 653f6289e..be60b94d7 100644
--- a/lib/compilers/wine-vc.js
+++ b/lib/compilers/wine-vc.js
@@ -51,7 +51,10 @@ export class WineVcCompiler extends BaseCompiler {
execOptions = this.getDefaultExecOptions();
}
- execOptions.customCwd = path.dirname(inputFilename).substr(2);
+ execOptions.customCwd = path.dirname(inputFilename);
+ if (inputFilename.startsWith('Z:')) {
+ execOptions.customCwd = execOptions.customCwd.substr(2);
+ }
return super.runCompiler(compiler, options, inputFilename, execOptions);
}
diff --git a/lib/compilers/zig.js b/lib/compilers/zig.js
index 1a9d0512d..d524fc1de 100644
--- a/lib/compilers/zig.js
+++ b/lib/compilers/zig.js
@@ -132,14 +132,12 @@ export class ZigCompiler extends BaseCompiler {
}
getIncludeArguments(libraries) {
- return _.flatten(
- _.map(libraries, selectedLib => {
- const foundVersion = this.findLibVersion(selectedLib);
- if (!foundVersion) return false;
- // Zig should not have more than 1 path
- return ['--pkg-begin', foundVersion.name, foundVersion.path, '--pkg-end'];
- }),
- );
+ return libraries.flatMap(selectedLib => {
+ const foundVersion = this.findLibVersion(selectedLib);
+ if (!foundVersion) return [];
+ // Zig should not have more than 1 path, but it's still an array so spread it
+ return ['--pkg-begin', foundVersion.name, ...foundVersion.path, '--pkg-end'];
+ });
}
getIrOutputFilename(inputFilename) {
diff --git a/lib/exec.js b/lib/exec.js
index 63d65bb25..d7abd789f 100644
--- a/lib/exec.js
+++ b/lib/exec.js
@@ -286,6 +286,9 @@ function sandboxFirejail(command, args, options) {
const sandboxDispatchTable = {
none: (command, args, options) => {
logger.info('Sandbox execution (sandbox disabled)', {command, args});
+ if (needsWine(command)) {
+ return executeWineDirect(command, args, options);
+ }
return executeDirect(command, args, options);
},
nsjail: sandboxNsjail,
diff --git a/lib/handlers/api.js b/lib/handlers/api.js
index c355cb06f..0301aa806 100644
--- a/lib/handlers/api.js
+++ b/lib/handlers/api.js
@@ -91,18 +91,11 @@ export class ApiHandler {
this.handle
.route('/popularArguments/:compiler')
.post(compileHandler.handlePopularArguments.bind(compileHandler))
- .all(methodNotAllowed);
- this.handle
- .route('/optimizationArguments/:compiler')
- .post(compileHandler.handleOptimizationArguments.bind(compileHandler))
- .all(methodNotAllowed);
-
- this.handle
- .route('/popularArguments/:compiler')
.get(compileHandler.handlePopularArguments.bind(compileHandler))
.all(methodNotAllowed);
this.handle
.route('/optimizationArguments/:compiler')
+ .post(compileHandler.handleOptimizationArguments.bind(compileHandler))
.get(compileHandler.handleOptimizationArguments.bind(compileHandler))
.all(methodNotAllowed);
diff --git a/lib/handlers/compile.js b/lib/handlers/compile.js
index e9b7a0e8c..87632dca6 100644
--- a/lib/handlers/compile.js
+++ b/lib/handlers/compile.js
@@ -338,15 +338,19 @@ export class CompileHandler {
return {source, options, backendOptions, filters, bypassCache, tools, executionParameters, libraries};
}
- handlePopularArguments(req, res, next) {
+ handlePopularArguments(req, res) {
const compiler = this.compilerFor(req);
- if (!compiler) return next();
+ if (!compiler) {
+ return res.sendStatus(404);
+ }
res.send(compiler.possibleArguments.getPopularArguments(this.getUsedOptions(req)));
}
- handleOptimizationArguments(req, res, next) {
+ handleOptimizationArguments(req, res) {
const compiler = this.compilerFor(req);
- if (!compiler) return next();
+ if (!compiler) {
+ return res.sendStatus(404);
+ }
res.send(compiler.possibleArguments.getOptimizationArguments(this.getUsedOptions(req)));
}
@@ -377,7 +381,7 @@ export class CompileHandler {
handleCmake(req, res, next) {
const compiler = this.compilerFor(req);
if (!compiler) {
- return next();
+ return res.sendStatus(404);
}
const remote = compiler.getRemote();
@@ -413,8 +417,9 @@ export class CompileHandler {
handle(req, res, next) {
const compiler = this.compilerFor(req);
if (!compiler) {
- return next();
+ return res.sendStatus(404);
}
+
const remote = compiler.getRemote();
if (remote) {
req.url = remote.path;
diff --git a/lib/parsers/llvm-pass-dump-parser.ts b/lib/parsers/llvm-pass-dump-parser.ts
index dc9ca637e..ecb62fed3 100644
--- a/lib/parsers/llvm-pass-dump-parser.ts
+++ b/lib/parsers/llvm-pass-dump-parser.ts
@@ -82,6 +82,8 @@ type SplitPassDump = {
export class LlvmPassDumpParser {
filters: RegExp[];
lineFilters: RegExp[];
+ debugInfoFilters: RegExp[];
+ debugInfoLineFilters: RegExp[];
irDumpHeader: RegExp;
machineCodeDumpHeader: RegExp;
functionDefine: RegExp;
@@ -100,17 +102,23 @@ export class LlvmPassDumpParser {
/^; ModuleID = '.+'$/, // module id line
/^(source_filename|target datalayout|target triple) = ".+"$/, // module metadata
/^; Function Attrs: .+$/, // function attributes
- /^\s+call void @llvm.dbg.value.+$/, // dbg calls
- /^\s+call void @llvm.dbg.declare.+$/, // dbg calls
/^declare .+$/, // declare directives
+ /^attributes #\d+ = { .+ }$/, // attributes directive
+ ];
+ this.lineFilters = [
+ /,? #\d+((?=( {)?$))/, // attribute annotation
+ ];
+
+ // Additional filters conditionally enabled by `filterDebugInfo`
+ this.debugInfoFilters = [
+ /^\s+call void @llvm.dbg.+$/, // dbg calls
+ /^\s+DBG_.+$/, // dbg pseudo-instructions
/^(!\d+) = (?:distinct )?!DI([A-Za-z]+)\(([^)]+?)\)/, // meta
/^(!\d+) = (?:distinct )?!{.*}/, // meta
/^(![.A-Z_a-z-]+) = (?:distinct )?!{.*}/, // meta
- /^attributes #\d+ = { .+ }$/, // attributes directive
];
- this.lineFilters = [
+ this.debugInfoLineFilters = [
/,? ![\dA-Za-z]+((?=( {)?$))/, // debug annotation
- /,? #\d+((?=( {)?$))/, // attribute annotation
];
// Ir dump headers look like "*** IR Dump After XYZ ***"
@@ -435,18 +443,26 @@ export class LlvmPassDumpParser {
}
process(ir: ResultLine[], _: ParseFilters, llvmOptPipelineOptions: LLVMOptPipelineBackendOptions) {
+ // Additional filters conditionally enabled by `filterDebugInfo`
+ let filters = this.filters;
+ let lineFilters = this.lineFilters;
+ if (llvmOptPipelineOptions.filterDebugInfo) {
+ filters = filters.concat(this.debugInfoFilters);
+ lineFilters = lineFilters.concat(this.debugInfoLineFilters);
+ }
+
// Filter a lot of junk before processing
const preprocessed_lines = ir
.slice(
ir.findIndex(line => line.text.match(this.irDumpHeader) || line.text.match(this.machineCodeDumpHeader)),
)
- .filter(line => this.filters.every(re => line.text.match(re) === null)) // apply filters
+ .filter(line => filters.every(re => line.text.match(re) === null)) // apply filters
.map(_line => {
let line = _line.text;
// eslint-disable-next-line no-constant-condition
while (true) {
let newLine = line;
- for (const re of this.lineFilters) {
+ for (const re of lineFilters) {
newLine = newLine.replace(re, '');
}
if (newLine === line) {
diff --git a/package.json b/package.json
index 80675382a..149ba8772 100644
--- a/package.json
+++ b/package.json
@@ -164,7 +164,7 @@
"test": "mocha -b",
"test-min": "mocha -b --config .mocharc-min.yml",
"fix": "npm run lint && npm run format && npm run ts-check",
- "check": "npm run npm run ts-check && npm run lint-check && npm run test-min -- --reporter min",
+ "check": "npm run ts-check && npm run lint-check && npm run test-min -- --reporter min",
"dev": "cross-env NODE_ENV=DEV node -r esm -r ts-node/register app.js",
"debugger": "cross-env NODE_ENV=DEV node --inspect -r esm -r ts-node/register app.js --debug",
"debug": "cross-env NODE_ENV=DEV node -r esm -r ts-node/register app.js --debug",
diff --git a/static/compiler-service.ts b/static/compiler-service.ts
index a1b959723..adc693c8f 100644
--- a/static/compiler-service.ts
+++ b/static/compiler-service.ts
@@ -42,6 +42,8 @@ type CompilationStatus = {
compilerOut: number;
};
+const ASCII_COLORS_RE = new RegExp(/\x1B\[[\d;]*m(.\[K)?/g);
+
export class CompilerService {
private readonly base = window.httpRoot;
private allowStoreCodeDebug: boolean;
@@ -429,11 +431,9 @@ export class CompilerService {
const stdout = result.stdout ?? [];
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
const stderr = result.stderr ?? [];
- // TODO: Make its own const variable at top of module?
- const asciiColorsRe = new RegExp(/\x1B\[[\d;]*m(.\[K)?/g);
function filterAsciiColors(line: ResultLine) {
- return line.text.replace(asciiColorsRe, '');
+ return line.text.replace(ASCII_COLORS_RE, '');
}
const output = stdout.map(filterAsciiColors).concat(stderr.map(filterAsciiColors)).join('\n');
diff --git a/static/main.js b/static/main.js
index 7b3417a6c..4c02fa8d6 100644
--- a/static/main.js
+++ b/static/main.js
@@ -66,7 +66,7 @@ require('bootstrap/dist/css/bootstrap.min.css');
require('golden-layout/src/css/goldenlayout-base.css');
require('tom-select/dist/css/tom-select.bootstrap4.css');
require('./colours.scss');
-require('./explorer.scss');
+require('./styles/explorer.scss');
// Check to see if the current unload is a UI reset.
// Forgive me the global usage here
diff --git a/static/panes/llvm-opt-pipeline.ts b/static/panes/llvm-opt-pipeline.ts
index e12b4e9dd..2e113b8d1 100644
--- a/static/panes/llvm-opt-pipeline.ts
+++ b/static/panes/llvm-opt-pipeline.ts
@@ -61,6 +61,7 @@ export class LLVMOptPipeline extends MonacoPane<monaco.editor.IStandaloneDiffEdi
options: Toggles;
state: LLVMOptPipelineViewState;
lastOptions: LLVMOptPipelineBackendOptions = {
+ filterDebugInfo: true,
fullModule: false,
noDiscardValueNames: true,
demangle: true,
@@ -188,6 +189,7 @@ export class LLVMOptPipeline extends MonacoPane<monaco.editor.IStandaloneDiffEdi
// the backend? Would be a data transfer optimization.
const newOptions: LLVMOptPipelineBackendOptions = {
//'filter-inconsequential-passes': options['filter-inconsequential-passes'],
+ filterDebugInfo: options['filter-debug-info'],
fullModule: options['dump-full-module'],
noDiscardValueNames: options['-fno-discard-value-names'],
demangle: options['demangle-symbols'],
diff --git a/static/panes/output.ts b/static/panes/output.ts
index 54e886782..da6624790 100644
--- a/static/panes/output.ts
+++ b/static/panes/output.ts
@@ -27,6 +27,7 @@ import {Toggles} from '../widgets/toggles';
import _ from 'underscore';
import {Pane} from './pane';
import {ga} from '../analytics';
+import {updateAndCalcTopBarHeight} from '../utils';
import {Container} from 'golden-layout';
import {PaneState} from './pane.interfaces';
import {Hub} from '../hub';
@@ -150,7 +151,7 @@ export class Output extends Pane<OutputState> {
override resize() {
const rootHeight = this.domRoot.height();
- const toolbarHeight = this.optionsToolbar.height();
+ const toolbarHeight = updateAndCalcTopBarHeight(this.domRoot, this.optionsToolbar, this.hideable);
if (rootHeight && toolbarHeight) {
this.contentRoot.height(rootHeight - toolbarHeight - 5);
}
diff --git a/static/panes/pane.ts b/static/panes/pane.ts
index dabc0d555..79b897ae2 100644
--- a/static/panes/pane.ts
+++ b/static/panes/pane.ts
@@ -63,10 +63,10 @@ export abstract class Pane<S> {
this.container = container;
this.eventHub = hub.createEventHub();
this.domRoot = container.getElement();
- this.hideable = this.domRoot.find('.hideable');
-
this.domRoot.html(this.getInitialHTML());
+ this.hideable = this.domRoot.find('.hideable');
+
this.compilerInfo = {
compilerId: state.id,
compilerName: state.compilerName,
diff --git a/static/explorer.scss b/static/styles/explorer.scss
index b64f682d3..040896140 100644
--- a/static/explorer.scss
+++ b/static/styles/explorer.scss
@@ -570,6 +570,10 @@ kbd {
height: 20px !important;
}
+li.lm_tab.lm_active {
+ overflow: hidden;
+}
+
@media (max-width: 768px) {
.lm_header {
height: 50px !important;
diff --git a/static/themes/dark-theme.scss b/static/styles/themes/dark-theme.scss
index b871f22b6..b871f22b6 100644
--- a/static/themes/dark-theme.scss
+++ b/static/styles/themes/dark-theme.scss
diff --git a/static/themes/default-theme.scss b/static/styles/themes/default-theme.scss
index 9f70c7f55..9f70c7f55 100644
--- a/static/themes/default-theme.scss
+++ b/static/styles/themes/default-theme.scss
diff --git a/types/compilation/llvm-opt-pipeline-output.interfaces.ts b/types/compilation/llvm-opt-pipeline-output.interfaces.ts
index 91a72d367..b80923f52 100644
--- a/types/compilation/llvm-opt-pipeline-output.interfaces.ts
+++ b/types/compilation/llvm-opt-pipeline-output.interfaces.ts
@@ -36,6 +36,7 @@ export type Pass = {
export type LLVMOptPipelineOutput = Record<string, Pass[]>;
export type LLVMOptPipelineBackendOptions = {
+ filterDebugInfo: boolean;
fullModule: boolean;
noDiscardValueNames: boolean;
demangle: boolean;
diff --git a/types/libraries/libraries.interfaces.ts b/types/libraries/libraries.interfaces.ts
index 6e544588a..979cb898e 100644
--- a/types/libraries/libraries.interfaces.ts
+++ b/types/libraries/libraries.interfaces.ts
@@ -6,8 +6,8 @@ export type LibraryVersion = {
dependencies: string[];
liblink: string[];
libpath: string[];
- path: string;
- options: string;
+ path: string[];
+ options: string[];
};
export type Library = {
diff --git a/views/templates/panes/compiler-output.pug b/views/templates/panes/compiler-output.pug
index f433dc6bf..dd1f13b84 100644
--- a/views/templates/panes/compiler-output.pug
+++ b/views/templates/panes/compiler-output.pug
@@ -8,5 +8,6 @@
input.d-none(type="checkbox" checked=false)
.btn-group.btn-group-sm(role="group")
button.btn.btn-sm.btn-light.select-all(type="button" title="Select all lines")
- span Select all
+ span.fa.fa-align-justify(style="border: 1px dotted white;border-radius: 0.125em;padding: 2px")
+ span.hideable Select all
pre.content.output-content
diff --git a/views/templates/panes/compiler.pug b/views/templates/panes/compiler.pug
index 8c18ef672..4afc6c623 100644
--- a/views/templates/panes/compiler.pug
+++ b/views/templates/panes/compiler.pug
@@ -61,7 +61,7 @@ mixin newPaneButton(classId, text, title, icon)
+newPaneButton("view-gccdump", "GCC Tree/RTL", "Show GCC Tree/RTL dump", "fas fa-tree")
+newPaneButton("view-gnatdebugtree", "GNAT Debug Tree", "Show GNAT debug tree", "fas fa-tree")
+newPaneButton("view-gnatdebug", "GNAT Debug Expanded Code", "Show GNAT debug expanded code", "fas fa-tree")
- +newPaneButton("view-cfg", "Graph", "Shpw graph output", "fas fa-exchange-alt")
+ +newPaneButton("view-cfg", "Graph", "Show graph output", "fas fa-exchange-alt")
.btn-group.btn-group-sm(role="group")
button.btn.btn-sm.btn-light.dropdown-toggle.add-tool(type="button" title="Add tool" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="Add tooling to this editor and compiler")
span.fas.fa-screwdriver
diff --git a/views/templates/panes/llvm-opt-pipeline.pug b/views/templates/panes/llvm-opt-pipeline.pug
index 0192ee379..c33ad397d 100644
--- a/views/templates/panes/llvm-opt-pipeline.pug
+++ b/views/templates/panes/llvm-opt-pipeline.pug
@@ -1,3 +1,9 @@
+mixin optionButton(bind, isActive, text, title)
+ .button-checkbox
+ button(type="button" class="dropdown-item btn btn-sm btn-light" + (isActive ? " active" : "") title=title data-bind=bind aria-pressed=isActive ? "true" : "false")
+ span #{text}
+ input.d-none(type="checkbox" checked=isActive)
+
#llvm-opt-pipeline
.top-bar.btn-toolbar.bg-light(role="toolbar")
include ../../font-size
@@ -6,26 +12,12 @@
span.fas.fa-anchor
span.hideable Options
.dropdown-menu
- .button-checkbox
- button.dropdown-item.btn.btn-sm.btn-light.filter-inconsequential-passes(type="button" title="Filter passes which do not make changes" data-bind="filter-inconsequential-passes" aria-pressed="false" aria-label="Filter Inconsequential Passes")
- span Filter Inconsequential Passes
- input.d-none(type="checkbox" checked=false)
- .button-checkbox
- button.dropdown-item.btn.btn-sm.btn-light.dump-full-module(type="button" title="Dump the entire module for each pass" data-bind="dump-full-module" aria-pressed="false" aria-label="Filter Inconsequential Passes")
- span Dump Full Module
- input.d-none(type="checkbox" checked=false)
- .button-checkbox
- button.dropdown-item.btn.btn-sm.btn-light.dump-full-module(type="button" title="Demangle Symbols" data-bind="demangle-symbols" aria-pressed="false" aria-label="Demangle Symbols")
- span Demangle Symbols
- input.d-none(type="checkbox" checked=true)
- .button-checkbox
- button.dropdown-item.btn.btn-sm.btn-light.dump-full-module(type="button" title="Keep value names instead of llvm value numbers" data-bind="-fno-discard-value-names" aria-pressed="false" aria-label="-fno-discard-value-names")
- span -fno-discard-value-names
- input.d-none(type="checkbox" checked=true)
- //.button-checkbox
- // button.dropdown-item.btn.btn-sm.btn-light.dump-full-module(type="button" title="Filter Library Functions" data-bind="library-functions" aria-pressed="false" aria-label="Filter Library Functions")
- // span Filter Library Functions
- // input.d-none(type="checkbox" checked=true)
+ +optionButton("filter-inconsequential-passes", false, "Filter Inconsequential Passes", "Filter passes which do not make changes")
+ +optionButton("filter-debug-info", true, "Filter Debug Info", "Filter debug info intrinsics")
+ +optionButton("dump-full-module", false, "Dump Full Module", "Dump the entire module for each pass")
+ +optionButton("demangle-symbols", true, "Demangle Symbols", "Demangle symbols")
+ +optionButton("-fno-discard-value-names", true, "-fno-discard-value-names", "Keep value names instead of LLVM value numbers")
+ //- +optionButton("library-functions", true, "Filter Library Functions", "Filter library functions")
.btn-group.btn-group-sm
.input-group.input-group-sm.mb-auto
.input-group-prepend