Repository: compiler-explorer/compiler-explorer
Pull request #7228 (2024-12-15 21:45:56)

Improve odin codegen processing
- Builtin runtime functions __$startup_runtime, __$cleanup_runtime, __$* are now filtered out
- Label matching regex is fixed for odin, see OdinAsmParser class. This ensures we filter out all labels that don't belong to the current file
- Slightly improved editor support, auto bracket closing and commenting via keyboard shortcuts works now
- procedures within the file are automatically @require as requested by GingerBill (odin lang creator).

There still are a lot of unused labels with data definitions that dont get filtered out.

#7210


Waqar144: > Thanks; let me know if you want to make any other changes else I'll merge later/tomorrow :)

Pushed one more fix. 

I didn't realize that changing the source in a way such that it modifies the number of lines in the original code will affect the highlighting of the "source <-> asm" mapping. The editor still shows the actual code user put in and not the preprocessed one so the lines start getting off by N. I have worked around it by putting the attribute on the same line.

Patch:
diff --git a/etc/config/android-kotlin.amazon.properties b/etc/config/android-kotlin.amazon.properties
index cecccfe5f..30abc8280 100644
--- a/etc/config/android-kotlin.amazon.properties
+++ b/etc/config/android-kotlin.amazon.properties
@@ -1,4 +1,4 @@
-compilers=&android-d8:&android-r8:&dex2oat
+compilers=&android-d8:&android-r8:&dex2oat:&android-kotlinc
 
 group.android-d8.compilers=kotlin-d8-8156:kotlin-d8-8172:kotlin-d8-8233:kotlin-d8-8242:kotlin-d8-8247:kotlin-d8-8336:kotlin-d8-8337:kotlin-d8-8510:kotlin-d8-8527:kotlin-d8-8535
 group.android-d8.compilerType=android-d8
@@ -140,6 +140,162 @@ compiler.kotlin-dex2oat-3310.objdumper=/opt/compiler-explorer/dex2oat-33.10/x86_
 compiler.kotlin-dex2oat-3310.d8Id=kotlin-d8-8242
 compiler.kotlin-dex2oat-3310.profmanPath=/opt/compiler-explorer/dex2oat-33.10/x86_64/bin/profman
 
+group.android-kotlinc.compilers=android-kotlinc-1400:android-kotlinc-1410:android-kotlinc-1420:android-kotlinc-1421:android-kotlinc-1430:android-kotlinc-1431:android-kotlinc-1432:android-kotlinc-1500:android-kotlinc-1510:android-kotlinc-1520:android-kotlinc-1521:android-kotlinc-1530:android-kotlinc-1531:android-kotlinc-1600:android-kotlinc-1610:android-kotlinc-1620:android-kotlinc-1700:android-kotlinc-1800:android-kotlinc-1810:android-kotlinc-1820:android-kotlinc-1900:android-kotlinc-1910:android-kotlinc-1920:android-kotlinc-2000:android-kotlinc-2010:android-kotlinc-2020:android-kotlinc-2021:android-kotlinc-2100
+group.android-kotlinc.compilerType=kotlin
+group.android-kotlinc.versionFlag=-version
+group.android-kotlinc.groupName=kotlinc
+group.android-kotlinc.objdumper=/opt/compiler-explorer/jdk-23.0.1/bin/javap
+group.android-kotlinc.instructionSet=java
+group.android-kotlinc.demangler=
+group.android-kotlinc.postProcess=
+group.android-kotlinc.options=
+group.android-kotlinc.supportsBinary=false
+group.android-kotlinc.needsMulti=false
+group.android-kotlinc.supportsExecute=true
+group.android-kotlinc.interpreted=true
+group.android-kotlinc.isSemVer=true
+group.android-kotlinc.baseName=kotlinc
+
+compiler.android-kotlinc-2100.exe=/opt/compiler-explorer/kotlin-jvm-2.1.0/bin/kotlinc-jvm
+compiler.android-kotlinc-2100.semver=2.1.0
+compiler.android-kotlinc-2100.java_home=/opt/compiler-explorer/jdk-23.0.1
+compiler.android-kotlinc-2100.runtime=/opt/compiler-explorer/jdk-23.0.1/bin/java
+
+compiler.android-kotlinc-2021.exe=/opt/compiler-explorer/kotlin-jvm-2.0.21/bin/kotlinc-jvm
+compiler.android-kotlinc-2021.semver=2.0.21
+compiler.android-kotlinc-2021.java_home=/opt/compiler-explorer/jdk-23.0.1
+compiler.android-kotlinc-2021.runtime=/opt/compiler-explorer/jdk-23.0.1/bin/java
+
+compiler.android-kotlinc-2020.exe=/opt/compiler-explorer/kotlin-jvm-2.0.20/bin/kotlinc-jvm
+compiler.android-kotlinc-2020.semver=2.0.20
+compiler.android-kotlinc-2020.java_home=/opt/compiler-explorer/jdk-23.0.1
+compiler.android-kotlinc-2020.runtime=/opt/compiler-explorer/jdk-23.0.1/bin/java
+
+compiler.android-kotlinc-2010.exe=/opt/compiler-explorer/kotlin-jvm-2.0.10/bin/kotlinc-jvm
+compiler.android-kotlinc-2010.semver=2.0.10
+compiler.android-kotlinc-2010.java_home=/opt/compiler-explorer/jdk-23.0.1
+compiler.android-kotlinc-2010.runtime=/opt/compiler-explorer/jdk-23.0.1/bin/java
+
+compiler.android-kotlinc-2000.exe=/opt/compiler-explorer/kotlin-jvm-2.0.0/bin/kotlinc-jvm
+compiler.android-kotlinc-2000.semver=2.0.0
+compiler.android-kotlinc-2000.java_home=/opt/compiler-explorer/jdk-21.0.0
+compiler.android-kotlinc-2000.runtime=/opt/compiler-explorer/jdk-21.0.0/bin/java
+
+compiler.android-kotlinc-1920.exe=/opt/compiler-explorer/kotlin-jvm-1.9.20/bin/kotlinc-jvm
+compiler.android-kotlinc-1920.semver=1.9.20
+compiler.android-kotlinc-1920.java_home=/opt/compiler-explorer/jdk-21.0.0
+compiler.android-kotlinc-1920.runtime=/opt/compiler-explorer/jdk-21.0.0/bin/java
+
+compiler.android-kotlinc-1910.exe=/opt/compiler-explorer/kotlin-jvm-1.9.10/bin/kotlinc-jvm
+compiler.android-kotlinc-1910.semver=1.9.10
+compiler.android-kotlinc-1910.java_home=/opt/compiler-explorer/jdk-20.0.0
+compiler.android-kotlinc-1910.runtime=/opt/compiler-explorer/jdk-20.0.0/bin/java
+
+compiler.android-kotlinc-1900.exe=/opt/compiler-explorer/kotlin-jvm-1.9.0/bin/kotlinc-jvm
+compiler.android-kotlinc-1900.semver=1.9.0
+compiler.android-kotlinc-1900.java_home=/opt/compiler-explorer/jdk-20.0.0
+compiler.android-kotlinc-1900.runtime=/opt/compiler-explorer/jdk-20.0.0/bin/java
+
+compiler.android-kotlinc-1820.exe=/opt/compiler-explorer/kotlin-jvm-1.8.20/bin/kotlinc-jvm
+compiler.android-kotlinc-1820.semver=1.8.20
+compiler.android-kotlinc-1820.java_home=/opt/compiler-explorer/jdk-19.0.2
+compiler.android-kotlinc-1820.runtime=/opt/compiler-explorer/jdk-19.0.2/bin/java
+
+compiler.android-kotlinc-1810.exe=/opt/compiler-explorer/kotlin-jvm-1.8.10/bin/kotlinc-jvm
+compiler.android-kotlinc-1810.semver=1.8.10
+compiler.android-kotlinc-1810.java_home=/opt/compiler-explorer/jdk-19.0.2
+compiler.android-kotlinc-1810.runtime=/opt/compiler-explorer/jdk-19.0.2/bin/java
+
+compiler.android-kotlinc-1800.exe=/opt/compiler-explorer/kotlin-jvm-1.8.0/bin/kotlinc-jvm
+compiler.android-kotlinc-1800.semver=1.8.0
+compiler.android-kotlinc-1800.java_home=/opt/compiler-explorer/jdk-19.0.2
+compiler.android-kotlinc-1800.runtime=/opt/compiler-explorer/jdk-19.0.2/bin/java
+
+compiler.android-kotlinc-1700.exe=/opt/compiler-explorer/kotlin-jvm-1.7.0/bin/kotlinc-jvm
+compiler.android-kotlinc-1700.semver=1.7.0
+compiler.android-kotlinc-1700.java_home=/opt/compiler-explorer/jdk-18.0.0
+compiler.android-kotlinc-1700.runtime=/opt/compiler-explorer/jdk-18.0.0/bin/java
+
+compiler.android-kotlinc-1620.exe=/opt/compiler-explorer/kotlin-jvm-1.6.20/bin/kotlinc-jvm
+compiler.android-kotlinc-1620.semver=1.6.20
+compiler.android-kotlinc-1620.java_home=/opt/compiler-explorer/jdk-16.0.1
+compiler.android-kotlinc-1620.runtime=/opt/compiler-explorer/jdk-16.0.1/bin/java
+
+compiler.android-kotlinc-1610.exe=/opt/compiler-explorer/kotlin-jvm-1.6.10/bin/kotlinc-jvm
+compiler.android-kotlinc-1610.semver=1.6.10
+compiler.android-kotlinc-1610.java_home=/opt/compiler-explorer/jdk-16.0.1
+compiler.android-kotlinc-1610.runtime=/opt/compiler-explorer/jdk-16.0.1/bin/java
+
+compiler.android-kotlinc-1600.exe=/opt/compiler-explorer/kotlin-jvm-1.6.0/bin/kotlinc-jvm
+compiler.android-kotlinc-1600.semver=1.6.0
+compiler.android-kotlinc-1600.java_home=/opt/compiler-explorer/jdk-16.0.1
+compiler.android-kotlinc-1600.runtime=/opt/compiler-explorer/jdk-16.0.1/bin/java
+
+compiler.android-kotlinc-1531.exe=/opt/compiler-explorer/kotlin-jvm-1.5.31/bin/kotlinc-jvm
+compiler.android-kotlinc-1531.semver=1.5.31
+compiler.android-kotlinc-1531.java_home=/opt/compiler-explorer/jdk-16.0.1
+compiler.android-kotlinc-1531.runtime=/opt/compiler-explorer/jdk-16.0.1/bin/java
+
+compiler.android-kotlinc-1530.exe=/opt/compiler-explorer/kotlin-jvm-1.5.30/bin/kotlinc-jvm
+compiler.android-kotlinc-1530.semver=1.5.30
+compiler.android-kotlinc-1530.java_home=/opt/compiler-explorer/jdk-16.0.1
+compiler.android-kotlinc-1530.runtime=/opt/compiler-explorer/jdk-16.0.1/bin/java
+
+compiler.android-kotlinc-1521.exe=/opt/compiler-explorer/kotlin-jvm-1.5.21/bin/kotlinc-jvm
+compiler.android-kotlinc-1521.semver=1.5.21
+compiler.android-kotlinc-1521.java_home=/opt/compiler-explorer/jdk-16.0.1
+compiler.android-kotlinc-1521.runtime=/opt/compiler-explorer/jdk-16.0.1/bin/java
+
+compiler.android-kotlinc-1520.exe=/opt/compiler-explorer/kotlin-jvm-1.5.20/bin/kotlinc-jvm
+compiler.android-kotlinc-1520.semver=1.5.20
+compiler.android-kotlinc-1520.java_home=/opt/compiler-explorer/jdk-16.0.1
+compiler.android-kotlinc-1520.runtime=/opt/compiler-explorer/jdk-16.0.1/bin/java
+
+compiler.android-kotlinc-1510.exe=/opt/compiler-explorer/kotlin-jvm-1.5.10/bin/kotlinc-jvm
+compiler.android-kotlinc-1510.semver=1.5.10
+compiler.android-kotlinc-1510.java_home=/opt/compiler-explorer/jdk-16.0.1
+compiler.android-kotlinc-1510.runtime=/opt/compiler-explorer/jdk-16.0.1/bin/java
+
+compiler.android-kotlinc-1500.exe=/opt/compiler-explorer/kotlin-jvm-1.5.0/bin/kotlinc-jvm
+compiler.android-kotlinc-1500.semver=1.5.0
+compiler.android-kotlinc-1500.java_home=/opt/compiler-explorer/jdk-16.0.1
+compiler.android-kotlinc-1500.runtime=/opt/compiler-explorer/jdk-16.0.1/bin/java
+
+compiler.android-kotlinc-1432.exe=/opt/compiler-explorer/kotlin-jvm-1.4.32/bin/kotlinc-jvm
+compiler.android-kotlinc-1432.semver=1.4.32
+compiler.android-kotlinc-1432.java_home=/opt/compiler-explorer/jdk-15.0.2
+compiler.android-kotlinc-1432.runtime=/opt/compiler-explorer/jdk-15.0.2/bin/java
+
+compiler.android-kotlinc-1431.exe=/opt/compiler-explorer/kotlin-jvm-1.4.31/bin/kotlinc-jvm
+compiler.android-kotlinc-1431.semver=1.4.31
+compiler.android-kotlinc-1431.java_home=/opt/compiler-explorer/jdk-15.0.2
+compiler.android-kotlinc-1431.runtime=/opt/compiler-explorer/jdk-15.0.2/bin/java
+
+compiler.android-kotlinc-1430.exe=/opt/compiler-explorer/kotlin-jvm-1.4.30/bin/kotlinc-jvm
+compiler.android-kotlinc-1430.semver=1.4.30
+compiler.android-kotlinc-1430.java_home=/opt/compiler-explorer/jdk-15.0.2
+compiler.android-kotlinc-1430.runtime=/opt/compiler-explorer/jdk-15.0.2/bin/java
+
+compiler.android-kotlinc-1421.exe=/opt/compiler-explorer/kotlin-jvm-1.4.21/bin/kotlinc-jvm
+compiler.android-kotlinc-1421.semver=1.4.21
+compiler.android-kotlinc-1421.java_home=/opt/compiler-explorer/jdk-15.0.2
+compiler.android-kotlinc-1421.runtime=/opt/compiler-explorer/jdk-15.0.2/bin/java
+
+compiler.android-kotlinc-1420.exe=/opt/compiler-explorer/kotlin-jvm-1.4.20/bin/kotlinc-jvm
+compiler.android-kotlinc-1420.semver=1.4.20
+compiler.android-kotlinc-1420.java_home=/opt/compiler-explorer/jdk-15.0.2
+compiler.android-kotlinc-1420.runtime=/opt/compiler-explorer/jdk-15.0.2/bin/java
+
+compiler.android-kotlinc-1410.exe=/opt/compiler-explorer/kotlin-jvm-1.4.10/bin/kotlinc-jvm
+compiler.android-kotlinc-1410.semver=1.4.10
+compiler.android-kotlinc-1410.java_home=/opt/compiler-explorer/jdk-15.0.2
+compiler.android-kotlinc-1410.runtime=/opt/compiler-explorer/jdk-15.0.2/bin/java
+
+compiler.android-kotlinc-1400.exe=/opt/compiler-explorer/kotlin-jvm-1.4.0/bin/kotlinc-jvm
+compiler.android-kotlinc-1400.semver=1.4.0
+compiler.android-kotlinc-1400.java_home=/opt/compiler-explorer/jdk-15.0.2
+compiler.android-kotlinc-1400.runtime=/opt/compiler-explorer/jdk-15.0.2/bin/java
+
 defaultCompiler=kotlin-dex2oat-latest
 
 libs=android-api-stubs:r8-keepanno:androidx-annotation
diff --git a/etc/config/assembly.amazon.properties b/etc/config/assembly.amazon.properties
index 880543ecb..1b3b88139 100644
--- a/etc/config/assembly.amazon.properties
+++ b/etc/config/assembly.amazon.properties
@@ -160,7 +160,7 @@ compiler.gnuasriscv32g1320.name=RISC-V binutils 2.38.0
 compiler.gnuasriscv32g1320.semver=2.38.0
 compiler.gnuasriscv32g1320.objdumper=/opt/compiler-explorer/riscv32/gcc-13.2.0/riscv32-unknown-linux-gnu/bin/riscv32-unknown-linux-gnu-objdump
 
-group.llvmas.compilers=llvmas30:llvmas31:llvmas32:llvmas33:llvmas341:llvmas350:llvmas351:llvmas352:llvmas37x:llvmas36x:llvmas371:llvmas380:llvmas381:llvmas390:llvmas391:llvmas400:llvmas401:llvmas500:llvmas600:llvmas700:llvmas800:llvmas900:llvmas1000:llvmas1001:llvmas1100:llvmas1101:llvmas1200:llvmas1201:llvmas1300:llvmas1400:llvmas1500:llvmas1600:llvmas1701:llvmas1810:llvmas_trunk:llvmas_assertions_trunk
+group.llvmas.compilers=llvmas30:llvmas31:llvmas32:llvmas33:llvmas341:llvmas350:llvmas351:llvmas352:llvmas37x:llvmas36x:llvmas371:llvmas380:llvmas381:llvmas390:llvmas391:llvmas400:llvmas401:llvmas500:llvmas600:llvmas700:llvmas800:llvmas900:llvmas1000:llvmas1001:llvmas1100:llvmas1101:llvmas1200:llvmas1201:llvmas1300:llvmas1400:llvmas1500:llvmas1600:llvmas1701:llvmas1810:llvmas1910:llvmas_trunk:llvmas_assertions_trunk
 group.llvmas.versionFlag=--version
 group.llvmas.options=-filetype=obj -o example.o
 group.llvmas.versionRe=LLVM version .*
@@ -235,6 +235,8 @@ compiler.llvmas1701.exe=/opt/compiler-explorer/clang-17.0.1/bin/llvm-mc
 compiler.llvmas1701.semver=17.0.1
 compiler.llvmas1810.exe=/opt/compiler-explorer/clang-18.1.0/bin/llvm-mc
 compiler.llvmas1810.semver=18.1.0
+compiler.llvmas1910.exe=/opt/compiler-explorer/clang-19.1.0/bin/llvm-mc
+compiler.llvmas1910.semver=19.1.0
 compiler.llvmas_trunk.exe=/opt/compiler-explorer/clang-trunk/bin/llvm-mc
 compiler.llvmas_trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.llvmas_trunk.semver=(trunk)
diff --git a/etc/config/c++.amazon.properties b/etc/config/c++.amazon.properties
index 704315f15..cb50e0737 100644
--- a/etc/config/c++.amazon.properties
+++ b/etc/config/c++.amazon.properties
@@ -830,7 +830,7 @@ compiler.armv7-clang-trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang++
 compiler.armv7-clang-trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.armv7-clang-trunk.semver=(trunk)
 compiler.armv7-clang-trunk.isNightly=true
-compiler.armv7-clang-trunk.options=-target arm-linux-gnueabi --gcc-toolchain=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabi --sysroot=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot
+compiler.armv7-clang-trunk.options=-target arm-linux-gnueabihf --gcc-toolchain=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabihf --sysroot=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabihf/arm-unknown-linux-gnueabihf/sysroot
 
 ################################
 # Clang for Arm
diff --git a/etc/config/c.amazon.properties b/etc/config/c.amazon.properties
index 67e8583ca..bec57413d 100644
--- a/etc/config/c.amazon.properties
+++ b/etc/config/c.amazon.properties
@@ -426,7 +426,7 @@ compiler.nvc_x86_24_11.semver=24.11
 # Clang for Arm
 # Provides 32- and 64-bit menu items for clang-9 and trunk
 group.armcclang32.groupName=Arm 32-bit clang
-group.armcclang32.compilers=armv7-cclang900:armv7-cclang901:armv7-cclang1000:armv7-cclang1001:armv7-cclang1100:armv7-cclang1101:armv7-cclang1200:armv7-cclang1201:armv7-cclang1300:armv7-cclang1301:armv7-cclang1400:armv7-cclang1500:armv7-cclang1600:armv7-cclang1701:armv7-cclang1810:armv7-cclang-trunk
+group.armcclang32.compilers=armv7-cclang900:armv7-cclang901:armv7-cclang1000:armv7-cclang1001:armv7-cclang1100:armv7-cclang1101:armv7-cclang1200:armv7-cclang1201:armv7-cclang1300:armv7-cclang1301:armv7-cclang1400:armv7-cclang1500:armv7-cclang1600:armv7-cclang1701:armv7-cclang1810:armv7-cclang1910:armv7-cclang-trunk
 group.armcclang32.isSemVer=true
 group.armcclang32.compilerType=clang
 group.armcclang32.supportsExecute=false
@@ -438,7 +438,7 @@ group.armcclang32.compilerCategories=clang
 group.armcclang32.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 
 group.armcclang64.groupName=Arm 64-bit clang
-group.armcclang64.compilers=armv8-cclang900:armv8-cclang901:armv8-cclang1000:armv8-cclang1001:armv8-cclang1100:armv8-cclang1101:armv8-cclang1200:armv8-cclang1201:armv8-cclang1300:armv8-cclang1301:armv8-cclang1400:armv8-cclang1500:armv8-cclang1600:armv8-cclang1701:armv8-cclang1810:armv8-cclang-trunk:armv8-full-cclang-trunk
+group.armcclang64.compilers=armv8-cclang900:armv8-cclang901:armv8-cclang1000:armv8-cclang1001:armv8-cclang1100:armv8-cclang1101:armv8-cclang1200:armv8-cclang1201:armv8-cclang1300:armv8-cclang1301:armv8-cclang1400:armv8-cclang1500:armv8-cclang1600:armv8-cclang1701:armv8-cclang1810:armv8-cclang1910:armv8-cclang-trunk:armv8-full-cclang-trunk
 group.armcclang64.isSemVer=true
 group.armcclang64.compilerType=clang
 group.armcclang64.supportsExecute=false
@@ -449,6 +449,19 @@ group.armcclang64.licensePreamble=The LLVM Project is under the Apache License v
 group.armcclang64.compilerCategories=clang
 group.armcclang64.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 
+compiler.armv7-cclang1910.name=armv7-a clang 19.1.0
+compiler.armv7-cclang1910.exe=/opt/compiler-explorer/clang-19.1.0/bin/clang
+compiler.armv7-cclang1910.semver=19.1.0
+# Arm v7-a with Neon and VFPv3
+compiler.armv7-cclang1910.options=-target arm-linux-gnueabi --gcc-toolchain=/opt/compiler-explorer/arm/gcc-14.2.0/arm-unknown-linux-gnueabihf --sysroot=/opt/compiler-explorer/arm/gcc-14.2.0/arm-unknown-linux-gnueabihf/arm-unknown-linux-gnueabihf/sysroot
+
+compiler.armv8-cclang1910.name=armv8-a clang 19.1.0
+compiler.armv8-cclang1910.exe=/opt/compiler-explorer/clang-19.1.0/bin/clang
+compiler.armv8-cclang1910.semver=19.1.0
+# Arm v8-a
+compiler.armv8-cclang1910.options=-target aarch64-linux-gnu --gcc-toolchain=/opt/compiler-explorer/arm64/gcc-14.2.0/aarch64-unknown-linux-gnu --sysroot=/opt/compiler-explorer/arm64/gcc-14.2.0/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/sysroot
+
+
 compiler.armv7-cclang1810.name=armv7-a clang 18.1.0
 compiler.armv7-cclang1810.exe=/opt/compiler-explorer/clang-18.1.0/bin/clang
 compiler.armv7-cclang1810.semver=18.1.0
@@ -656,7 +669,7 @@ compiler.armv7-cclang-trunk.objdumper=/opt/compiler-explorer/arm/gcc-10.2.0/arm-
 compiler.armv7-cclang-trunk.semver=(trunk)
 compiler.armv7-cclang-trunk.isNightly=true
 # Arm v7-a with Neon and VFPv3
-compiler.armv7-cclang-trunk.options=-target arm-linux-gnueabi --gcc-toolchain=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabi --sysroot=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot
+compiler.armv7-cclang-trunk.options=-target arm-linux-gnueabihf --gcc-toolchain=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabihf --sysroot=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabihf/arm-unknown-linux-gnueabihf/sysroot
 
 compiler.armv8-cclang-trunk.name=armv8-a clang (trunk)
 compiler.armv8-cclang-trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang
@@ -734,7 +747,7 @@ group.rvcclang.licenseLink=https://github.com/llvm/llvm-project/blob/main/LICENS
 group.rvcclang.licensePreamble=The LLVM Project is under the Apache License v2.0 with LLVM Exceptions
 group.rvcclang.compilerCategories=clang
 
-group.rv32cclang.compilers=rv32-cclang:rv32-cclang1810:rv32-cclang1701:rv32-cclang1600:rv32-cclang1500:rv32-cclang1400:rv32-cclang1301:rv32-cclang1300:rv32-cclang1200:rv32-cclang1201:rv32-cclang1101:rv32-cclang1100:rv32-cclang1001:rv32-cclang1000:rv32-cclang901:rv32-cclang900
+group.rv32cclang.compilers=rv32-cclang:rv32-cclang1910:rv32-cclang1810:rv32-cclang1701:rv32-cclang1600:rv32-cclang1500:rv32-cclang1400:rv32-cclang1301:rv32-cclang1300:rv32-cclang1200:rv32-cclang1201:rv32-cclang1101:rv32-cclang1100:rv32-cclang1001:rv32-cclang1000:rv32-cclang901:rv32-cclang900
 group.rv32cclang.options=-target riscv32-unknown-elf -march=rv32gc -mabi=ilp32d --gcc-toolchain=/opt/compiler-explorer/riscv32/gcc-10.2.0/riscv32-unknown-elf
 group.rv32cclang.objdumper=/opt/compiler-explorer/riscv32/gcc-10.2.0/riscv32-unknown-elf/bin/riscv32-unknown-elf-objdump
 group.rv32cclang.baseName=RISC-V rv32gc clang
@@ -783,12 +796,14 @@ compiler.rv32-cclang1701.exe=/opt/compiler-explorer/clang-17.0.1/bin/clang
 compiler.rv32-cclang1701.semver=17.0.1
 compiler.rv32-cclang1810.exe=/opt/compiler-explorer/clang-18.1.0/bin/clang
 compiler.rv32-cclang1810.semver=18.1.0
+compiler.rv32-cclang1910.exe=/opt/compiler-explorer/clang-19.1.0/bin/clang
+compiler.rv32-cclang1910.semver=19.1.0
 compiler.rv32-cclang.alias=rv32cclang
 compiler.rv32-cclang.exe=/opt/compiler-explorer/clang-trunk/bin/clang
 compiler.rv32-cclang.semver=(trunk)
 compiler.rv32-cclang.isNightly=true
 
-group.rv64cclang.compilers=rv64-cclang:rv64-cclang1810:rv64-cclang1701:rv64-cclang1600:rv64-cclang1500:rv64-cclang1400:rv64-cclang1301:rv64-cclang1300:rv64-cclang1200:rv64-cclang1201:rv64-cclang1101:rv64-cclang1100:rv64-cclang1001:rv64-cclang1000:rv64-cclang901:rv64-cclang900
+group.rv64cclang.compilers=rv64-cclang:rv64-cclang1910:rv64-cclang1810:rv64-cclang1701:rv64-cclang1600:rv64-cclang1500:rv64-cclang1400:rv64-cclang1301:rv64-cclang1300:rv64-cclang1200:rv64-cclang1201:rv64-cclang1101:rv64-cclang1100:rv64-cclang1001:rv64-cclang1000:rv64-cclang901:rv64-cclang900
 group.rv64cclang.options=-target riscv64-unknown-linux-gnu -march=rv64gc -mabi=lp64d --gcc-toolchain=/opt/compiler-explorer/riscv64/gcc-8.2.0/riscv64-unknown-linux-gnu --sysroot=/opt/compiler-explorer/riscv64/gcc-8.2.0/riscv64-unknown-linux-gnu/riscv64-unknown-linux-gnu/sysroot
 group.rv64cclang.objdumper=/opt/compiler-explorer/riscv64/gcc-8.2.0/riscv64-unknown-linux-gnu/bin/riscv64-unknown-linux-gnu-objdump
 group.rv64cclang.baseName=RISC-V rv64gc clang
@@ -834,6 +849,8 @@ compiler.rv64-cclang1701.exe=/opt/compiler-explorer/clang-17.0.1/bin/clang
 compiler.rv64-cclang1701.semver=17.0.1
 compiler.rv64-cclang1810.exe=/opt/compiler-explorer/clang-18.1.0/bin/clang
 compiler.rv64-cclang1810.semver=18.1.0
+compiler.rv64-cclang1910.exe=/opt/compiler-explorer/clang-19.1.0/bin/clang
+compiler.rv64-cclang1910.semver=19.1.0
 compiler.rv64-cclang.alias=rv64cclang
 compiler.rv64-cclang.exe=/opt/compiler-explorer/clang-trunk/bin/clang
 compiler.rv64-cclang.semver=(trunk)
@@ -1068,7 +1085,7 @@ group.cbpf.compilers=&cgccbpf:&cclangbpf
 group.cbpf.demangler=/opt/compiler-explorer/bpf/gcc-trunk/bpf-unknown-none/bin/bpf-unknown-none-c++filt
 
 # Clang for BPF
-group.cclangbpf.compilers=cbpfclangtrunk:cbpfclang1810:cbpfclang1701:cbpfclang1600:cbpfclang1500:cbpfclang1400:cbpfclang1300
+group.cclangbpf.compilers=cbpfclangtrunk:cbpfclang1910:cbpfclang1810:cbpfclang1701:cbpfclang1600:cbpfclang1500:cbpfclang1400:cbpfclang1300
 group.cclangbpf.supportsBinary=false
 group.cclangbpf.supportsExecute=false
 group.cclangbpf.baseName=BPF clang
@@ -1084,6 +1101,9 @@ compiler.cbpfclangtrunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang
 compiler.cbpfclangtrunk.semver=(trunk)
 compiler.cbpfclangtrunk.isNightly=true
 
+compiler.cbpfclang1910.exe=/opt/compiler-explorer/clang-19.1.0/bin/clang
+compiler.cbpfclang1910.semver=19.1.0
+
 compiler.cbpfclang1810.exe=/opt/compiler-explorer/clang-18.1.0/bin/clang
 compiler.cbpfclang1810.semver=18.1.0
 
@@ -2406,7 +2426,7 @@ group.cmipss.supportsExecute=false
 # Clang for all MIPS
 
 ## MIPS
-group.mips-cclang.compilers=mips-cclang1810:mips-cclang1701:mips-cclang1600:mips-cclang1500:mips-cclang1400:mips-cclang1300
+group.mips-cclang.compilers=mips-cclang1910:mips-cclang1810:mips-cclang1701:mips-cclang1600:mips-cclang1500:mips-cclang1400:mips-cclang1300
 group.mips-cclang.instructionSet=mips
 group.mips-cclang.groupName=MIPS clang
 group.mips-cclang.baseName=mips clang
@@ -2417,6 +2437,9 @@ group.mips-cclang.options=-target mips-elf
 group.mips-cclang.compilerCategories=clang
 group.mips-cclang.compilerCategories.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 
+compiler.mips-cclang1910.exe=/opt/compiler-explorer/clang-19.1.0/bin/clang
+compiler.mips-cclang1910.semver=19.1.0
+
 compiler.mips-cclang1810.exe=/opt/compiler-explorer/clang-18.1.0/bin/clang
 compiler.mips-cclang1810.semver=18.1.0
 
@@ -2436,7 +2459,7 @@ compiler.mips-cclang1300.exe=/opt/compiler-explorer/clang-13.0.0/bin/clang
 compiler.mips-cclang1300.semver=13.0.0
 
 ## MIPSEL
-group.mipsel-cclang.compilers=mipsel-cclang1810:mipsel-cclang1701:mipsel-cclang1600:mipsel-cclang1500:mipsel-cclang1400:mipsel-cclang1300
+group.mipsel-cclang.compilers=mipsel-cclang1910:mipsel-cclang1810:mipsel-cclang1701:mipsel-cclang1600:mipsel-cclang1500:mipsel-cclang1400:mipsel-cclang1300
 group.mipsel-cclang.instructionSet=mips
 group.mipsel-cclang.groupName=MIPSEL clang
 group.mipsel-cclang.baseName=mipsel clang
@@ -2447,12 +2470,15 @@ group.mipsel-cclang.options=-target mipsel-elf
 group.mipsel-cclang.compilerCategories=clang
 group.mipsel-cclang.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 
-compiler.mipsel-cclang1701.exe=/opt/compiler-explorer/clang-17.0.1/bin/clang
-compiler.mipsel-cclang1701.semver=17.0.1
+compiler.mipsel-cclang1910.exe=/opt/compiler-explorer/clang-19.1.0/bin/clang
+compiler.mipsel-cclang1910.semver=19.1.0
 
 compiler.mipsel-cclang1810.exe=/opt/compiler-explorer/clang-18.1.0/bin/clang
 compiler.mipsel-cclang1810.semver=18.1.0
 
+compiler.mipsel-cclang1701.exe=/opt/compiler-explorer/clang-17.0.1/bin/clang
+compiler.mipsel-cclang1701.semver=17.0.1
+
 compiler.mipsel-cclang1600.exe=/opt/compiler-explorer/clang-16.0.0/bin/clang
 compiler.mipsel-cclang1600.semver=16.0.0
 
@@ -2466,7 +2492,7 @@ compiler.mipsel-cclang1300.exe=/opt/compiler-explorer/clang-13.0.0/bin/clang
 compiler.mipsel-cclang1300.semver=13.0.0
 
 ## MIPS64
-group.mips64-cclang.compilers=mips64-cclang1810:mips64-cclang1701:mips64-cclang1600:mips64-cclang1500:mips64-cclang1400:mips64-cclang1300
+group.mips64-cclang.compilers=mips64-cclang1910:mips64-cclang1810:mips64-cclang1701:mips64-cclang1600:mips64-cclang1500:mips64-cclang1400:mips64-cclang1300
 group.mips64-cclang.groupName=MIPS64 clang
 group.mips64-cclang.instructionSet=mips
 group.mips64-cclang.baseName=mips64 clang
@@ -2477,6 +2503,9 @@ group.mips64-cclang.options=-target mips64-elf
 group.mips64-cclang.compilerCategories=clang
 group.mips64-cclang.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 
+compiler.mips64-cclang1910.exe=/opt/compiler-explorer/clang-19.1.0/bin/clang
+compiler.mips64-cclang1910.semver=19.1.0
+
 compiler.mips64-cclang1810.exe=/opt/compiler-explorer/clang-18.1.0/bin/clang
 compiler.mips64-cclang1810.semver=18.1.0
 
@@ -2496,7 +2525,7 @@ compiler.mips64-cclang1300.exe=/opt/compiler-explorer/clang-13.0.0/bin/clang
 compiler.mips64-cclang1300.semver=13.0.0
 
 ## MIPS64EL
-group.mips64el-cclang.compilers=mips64el-cclang1810:mips64el-cclang1701:mips64el-cclang1600:mips64el-cclang1500:mips64el-cclang1400:mips64el-cclang1300
+group.mips64el-cclang.compilers=mips64el-cclang1910:mips64el-cclang1810:mips64el-cclang1701:mips64el-cclang1600:mips64el-cclang1500:mips64el-cclang1400:mips64el-cclang1300
 group.mips64el-cclang.groupName=MIPS64EL clang
 group.mips64el-cclang.instructionSet=mips
 group.mips64el-cclang.baseName=mips64el clang
@@ -2507,6 +2536,9 @@ group.mips64el-cclang.options=-target mips64el-elf
 group.mips64el-cclang.compilerCategories=clang
 group.mips64el-cclang.demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
 
+compiler.mips64el-cclang1910.exe=/opt/compiler-explorer/clang-19.1.0/bin/clang
+compiler.mips64el-cclang1910.semver=19.1.0
+
 compiler.mips64el-cclang1810.exe=/opt/compiler-explorer/clang-18.1.0/bin/clang
 compiler.mips64el-cclang1810.semver=18.1.0
 
diff --git a/etc/config/cpp_for_opencl.amazon.properties b/etc/config/cpp_for_opencl.amazon.properties
index f2410f514..df1235462 100644
--- a/etc/config/cpp_for_opencl.amazon.properties
+++ b/etc/config/cpp_for_opencl.amazon.properties
@@ -37,7 +37,7 @@ compiler.armv7-cpp4oclclang1500.name=armv7-a clang 15.0.0
 compiler.armv7-cpp4oclclang1500.exe=/opt/compiler-explorer/clang-15.0.0/bin/clang
 compiler.armv7-cpp4oclclang1500.semver=15.0.0
 # Arm v7-a with Neon and VFPv3
-compiler.armv7-cpp4oclclang1500.options=-target arm-linux-gnueabi --gcc-toolchain=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabi --sysroot=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot
+compiler.armv7-cpp4oclclang1500.options=-target arm-linux-gnueabihf --gcc-toolchain=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabihf --sysroot=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabihf/arm-unknown-linux-gnueabihf/sysroot
 
 compiler.armv8-cpp4oclclang1500.name=armv8-a clang 15.0.0
 compiler.armv8-cpp4oclclang1500.exe=/opt/compiler-explorer/clang-15.0.0/bin/clang
@@ -50,7 +50,7 @@ compiler.armv7-cpp4oclclang1400.name=armv7-a clang 14.0.0
 compiler.armv7-cpp4oclclang1400.exe=/opt/compiler-explorer/clang-14.0.0/bin/clang
 compiler.armv7-cpp4oclclang1400.semver=14.0.0
 # Arm v7-a with Neon and VFPv3
-compiler.armv7-cpp4oclclang1400.options=-target arm-linux-gnueabi --gcc-toolchain=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabi --sysroot=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot
+compiler.armv7-cpp4oclclang1400.options=-target arm-linux-gnueabhf --gcc-toolchain=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabihf --sysroot=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabihf/arm-unknown-linux-gnueabihf/sysroot
 
 compiler.armv8-cpp4oclclang1400.name=armv8-a clang 14.0.0
 compiler.armv8-cpp4oclclang1400.exe=/opt/compiler-explorer/clang-14.0.0/bin/clang
@@ -143,7 +143,7 @@ compiler.armv7-cpp4oclclang-trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/
 compiler.armv7-cpp4oclclang-trunk.semver=(trunk)
 compiler.armv7-cpp4oclclang-trunk.isNightly=true
 # Arm v7-a with Neon and VFPv3
-compiler.armv7-cpp4oclclang-trunk.options=-target arm-linux-gnueabi --gcc-toolchain=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabi --sysroot=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot
+compiler.armv7-cpp4oclclang-trunk.options=-target arm-linux-gnueabihf --gcc-toolchain=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabihf --sysroot=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabihf/arm-unknown-linux-gnueabihf/sysroot
 
 compiler.armv7-cpp4oclclang-trunk-assertions.name=armv7-a clang (trunk, assertions)
 compiler.armv7-cpp4oclclang-trunk-assertions.exe=/opt/compiler-explorer/clang-assertions-trunk/bin/clang
@@ -151,7 +151,7 @@ compiler.armv7-cpp4oclclang-trunk-assertions.objdumper=/opt/compiler-explorer/gc
 compiler.armv7-cpp4oclclang-trunk-assertions.semver=(assertions trunk)
 compiler.armv7-cpp4oclclang-trunk-assertions.isNightly=true
 # Arm v7-a with Neon and VFPv3
-compiler.armv7-cpp4oclclang-trunk-assertions.options=-target arm-linux-gnueabi --gcc-toolchain=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabi --sysroot=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot
+compiler.armv7-cpp4oclclang-trunk-assertions.options=-target arm-linux-gnueabihf --gcc-toolchain=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabihf --sysroot=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabihf/arm-unknown-linux-gnueabihf/sysroot
 
 compiler.armv8-cpp4oclclang-trunk.name=armv8-a clang (trunk)
 compiler.armv8-cpp4oclclang-trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang
diff --git a/etc/config/kotlin.amazon.properties b/etc/config/kotlin.amazon.properties
index 9c245b057..5ea01b1bb 100644
--- a/etc/config/kotlin.amazon.properties
+++ b/etc/config/kotlin.amazon.properties
@@ -3,7 +3,7 @@ compilerType=kotlin
 versionFlag=-version
 objdumper=/opt/compiler-explorer/jdk-23.0.1/bin/javap
 instructionSet=java
-defaultCompiler=kotlinc2021
+defaultCompiler=kotlinc2100
 demangler=
 postProcess=
 options=
@@ -12,7 +12,7 @@ needsMulti=false
 supportsExecute=true
 interpreted=true
 
-group.kotlin.compilers=kotlinc1400:kotlinc1410:kotlinc1420:kotlinc1421:kotlinc1430:kotlinc1431:kotlinc1432:kotlinc1500:kotlinc1510:kotlinc1520:kotlinc1521:kotlinc1530:kotlinc1531:kotlinc1600:kotlinc1610:kotlinc1620:kotlinc1700:kotlinc1800:kotlinc1810:kotlinc1820:kotlinc1900:kotlinc1910:kotlinc1920:kotlinc2000:kotlinc2010:kotlinc2020:kotlinc2021
+group.kotlin.compilers=kotlinc1400:kotlinc1410:kotlinc1420:kotlinc1421:kotlinc1430:kotlinc1431:kotlinc1432:kotlinc1500:kotlinc1510:kotlinc1520:kotlinc1521:kotlinc1530:kotlinc1531:kotlinc1600:kotlinc1610:kotlinc1620:kotlinc1700:kotlinc1800:kotlinc1810:kotlinc1820:kotlinc1900:kotlinc1910:kotlinc1920:kotlinc2000:kotlinc2010:kotlinc2020:kotlinc2021:kotlinc2100
 group.kotlin.groupName=Kotlin
 group.kotlin.baseName=kotlinc
 group.kotlin.isSemVer=true
@@ -127,3 +127,7 @@ compiler.kotlinc2021.exe=/opt/compiler-explorer/kotlin-jvm-2.0.21/bin/kotlinc-jv
 compiler.kotlinc2021.semver=2.0.21
 compiler.kotlinc2021.java_home=/opt/compiler-explorer/jdk-23.0.1
 compiler.kotlinc2021.runtime=/opt/compiler-explorer/jdk-23.0.1/bin/java
+compiler.kotlinc2100.exe=/opt/compiler-explorer/kotlin-jvm-2.1.0/bin/kotlinc-jvm
+compiler.kotlinc2100.semver=2.1.0
+compiler.kotlinc2100.java_home=/opt/compiler-explorer/jdk-23.0.1
+compiler.kotlinc2100.runtime=/opt/compiler-explorer/jdk-23.0.1/bin/java
diff --git a/etc/config/llvm_mir.amazon.properties b/etc/config/llvm_mir.amazon.properties
index 007939da3..b7e094a9e 100644
--- a/etc/config/llvm_mir.amazon.properties
+++ b/etc/config/llvm_mir.amazon.properties
@@ -8,7 +8,7 @@ licenseName=LLVM Apache 2
 licenseLink=https://github.com/llvm/llvm-project/blob/main/LICENSE.TXT
 licensePreamble=The LLVM Project is under the Apache License v2.0 with LLVM Exceptions
 
-group.mirllc.compilers=mirllc32:mirllc33:mirllc391:mirllc400:mirllc401:mirllc500:mirllc600:mirllc700:mirllc800:mirllc900:mirllc1000:mirllc1001:mirllc1100:mirllc1101:mirllc1200:mirllc1201:mirllc1300:mirllc1400:mirllc1500:mirllc1600:mirllc1701:mirllc1810:mirllctrunk:mirllc-assertions-trunk
+group.mirllc.compilers=mirllc32:mirllc33:mirllc391:mirllc400:mirllc401:mirllc500:mirllc600:mirllc700:mirllc800:mirllc900:mirllc1000:mirllc1001:mirllc1100:mirllc1101:mirllc1200:mirllc1201:mirllc1300:mirllc1400:mirllc1500:mirllc1600:mirllc1701:mirllc1810:mirllc1910:mirllctrunk:mirllc-assertions-trunk
 group.mirllc.compilerType=llc
 group.mirllc.supportsExecute=false
 group.mirllc.intelAsm=-masm=intel
@@ -61,6 +61,8 @@ compiler.mirllc1701.exe=/opt/compiler-explorer/clang-17.0.1/bin/llc
 compiler.mirllc1701.semver=17.0.1
 compiler.mirllc1810.exe=/opt/compiler-explorer/clang-18.1.0/bin/llc
 compiler.mirllc1810.semver=18.1.0
+compiler.mirllc1910.exe=/opt/compiler-explorer/clang-19.1.0/bin/llc
+compiler.mirllc1910.semver=19.1.0
 compiler.mirllctrunk.exe=/opt/compiler-explorer/clang-trunk/bin/llc
 compiler.mirllctrunk.demangler=/opt/compiler-explorer/gcc-snapshot/bin/c++filt
 compiler.mirllctrunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
diff --git a/etc/config/openclc.amazon.properties b/etc/config/openclc.amazon.properties
index 2be477449..011f24431 100644
--- a/etc/config/openclc.amazon.properties
+++ b/etc/config/openclc.amazon.properties
@@ -37,7 +37,7 @@ compiler.armv7-oclcclang1500.name=armv7-a clang 15.0.0
 compiler.armv7-oclcclang1500.exe=/opt/compiler-explorer/clang-15.0.0/bin/clang
 compiler.armv7-oclcclang1500.semver=15.0.0
 # Arm v7-a with Neon and VFPv3
-compiler.armv7-oclcclang1500.options=-target arm-linux-gnueabi --gcc-toolchain=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabi --sysroot=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot
+compiler.armv7-oclcclang1500.options=-target arm-linux-gnueabihf --gcc-toolchain=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabihf --sysroot=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabihf/arm-unknown-linux-gnueabihf/sysroot
 
 compiler.armv8-oclcclang1500.name=armv8-a clang 15.0.0
 compiler.armv8-oclcclang1500.exe=/opt/compiler-explorer/clang-15.0.0/bin/clang
@@ -50,7 +50,7 @@ compiler.armv7-oclcclang1400.name=armv7-a clang 14.0.0
 compiler.armv7-oclcclang1400.exe=/opt/compiler-explorer/clang-14.0.0/bin/clang
 compiler.armv7-oclcclang1400.semver=14.0.0
 # Arm v7-a with Neon and VFPv3
-compiler.armv7-oclcclang1400.options=-target arm-linux-gnueabi --gcc-toolchain=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabi --sysroot=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot
+compiler.armv7-oclcclang1400.options=-target arm-linux-gnueabihf --gcc-toolchain=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabihf --sysroot=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabihf/arm-unknown-linux-gnueabihf/sysroot
 
 compiler.armv8-oclcclang1400.name=armv8-a clang 14.0.0
 compiler.armv8-oclcclang1400.exe=/opt/compiler-explorer/clang-14.0.0/bin/clang
@@ -167,14 +167,14 @@ compiler.armv7-oclcclang-trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang
 compiler.armv7-oclcclang-trunk.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.armv7-oclcclang-trunk.semver=(trunk)
 # Arm v7-a with Neon and VFPv3
-compiler.armv7-oclcclang-trunk.options=-target arm-linux-gnueabi --gcc-toolchain=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabi --sysroot=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot
+compiler.armv7-oclcclang-trunk.options=-target arm-linux-gnueabihf --gcc-toolchain=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabihf --sysroot=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabihf/arm-unknown-linux-gnueabihf/sysroot
 
 compiler.armv7-oclcclang-trunk-assertions.name=armv7-a clang (trunk, assertions)
 compiler.armv7-oclcclang-trunk-assertions.exe=/opt/compiler-explorer/clang-assertions-trunk/bin/clang
 compiler.armv7-oclcclang-trunk-assertions.objdumper=/opt/compiler-explorer/gcc-snapshot/bin/objdump
 compiler.armv7-oclcclang-trunk-assertions.semver=(assertions trunk)
 # Arm v7-a with Neon and VFPv3
-compiler.armv7-oclcclang-trunk-assertions.options=-target arm-linux-gnueabi --gcc-toolchain=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabi --sysroot=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot
+compiler.armv7-oclcclang-trunk-assertions.options=-target arm-linux-gnueabihf --gcc-toolchain=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabihf --sysroot=/opt/compiler-explorer/arm/gcc-12.2.0/arm-unknown-linux-gnueabihf/arm-unknown-linux-gnueabihf/sysroot
 
 compiler.armv8-oclcclang-trunk.name=armv8-a clang (trunk)
 compiler.armv8-oclcclang-trunk.exe=/opt/compiler-explorer/clang-trunk/bin/clang
diff --git a/etc/config/sponsors.yaml b/etc/config/sponsors.yaml
index fdcc0ded0..677b295df 100644
--- a/etc/config/sponsors.yaml
+++ b/etc/config/sponsors.yaml
@@ -424,7 +424,7 @@ levels:
       - Michael Sartain
       - Patricia Aas
       - Rasmus
-      - Siyuan Han
+      - Siyuan.H
       - Vezel
       - lcnr
       - Abhishek Bhrushundi
@@ -496,3 +496,9 @@ levels:
       - Per Tillisch
       - Tobias Neukom
       - mason
+      - Apostolos Piperis
+      - Patrik Bachan
+      - Simon Turner
+      - Sharad Khanna
+      - Kim Gräsman
+      - Waffles The Dog
diff --git a/lib/base-compiler.ts b/lib/base-compiler.ts
index 67c3aeb34..5b9ac7447 100644
--- a/lib/base-compiler.ts
+++ b/lib/base-compiler.ts
@@ -3162,6 +3162,10 @@ export class BaseCompiler {
             if (match) {
                 const [_, file, lineNum, colNum, type, message] = match;
                 if (!file || (file !== '<source>' && !file.includes(compileFileName))) continue;
+                if (type === 'warning' || type === 'error') {
+                    nonRemarkStderr.push(line);
+                    continue;
+                }
 
                 // convert to llvm-emitted OptRemark format, just because it was here first
                 remarks.push({
diff --git a/lib/compilers/kotlin.ts b/lib/compilers/kotlin.ts
index e86bbb16d..24b015fd9 100644
--- a/lib/compilers/kotlin.ts
+++ b/lib/compilers/kotlin.ts
@@ -22,7 +22,16 @@
 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 // POSSIBILITY OF SUCH DAMAGE.
 
-import {BypassCache, CacheKey, CompilationResult} from '../../types/compilation/compilation.interfaces.js';
+import path from 'path';
+
+import _ from 'underscore';
+
+import {
+    BypassCache,
+    CacheKey,
+    CompilationResult,
+    ExecutionOptionsWithEnv,
+} from '../../types/compilation/compilation.interfaces.js';
 import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
 import {ExecutableExecutionOptions} from '../../types/execution/execution.interfaces.js';
 import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';
@@ -45,6 +54,33 @@ export class KotlinCompiler extends JavaCompiler implements SimpleOutputFilename
         this.javaHome = this.compilerProps<string>(`compiler.${this.compiler.id}.java_home`);
     }
 
+    override async runCompiler(
+        compiler: string,
+        options: string[],
+        inputFilename: string,
+        execOptions: ExecutionOptionsWithEnv,
+        filters?: ParseFiltersAndOutputOptions,
+    ): Promise<CompilationResult> {
+        if (!execOptions) {
+            execOptions = this.getDefaultExecOptions();
+        }
+        if (!execOptions.customCwd) {
+            execOptions.customCwd = path.dirname(inputFilename);
+        }
+        // The items in 'options' before the source file are user inputs.
+        const sourceFileOptionIndex = options.findIndex(option => {
+            return option.endsWith('.kt');
+        });
+        const userOptions = options.slice(0, sourceFileOptionIndex);
+        const kotlinOptions = _.compact([...this.getClasspathArgument(), ...userOptions, inputFilename]);
+        const result = await this.exec(compiler, kotlinOptions, execOptions);
+        return {
+            ...this.transformToCompilationResult(result, inputFilename),
+            languageId: this.getCompilerResultLanguageId(filters),
+            instructionSet: this.getInstructionSetFromCompilerArgs(options),
+        };
+    }
+
     override getDefaultExecOptions() {
         const execOptions = super.getDefaultExecOptions();
         if (this.javaHome) {
diff --git a/lib/compilers/odin.ts b/lib/compilers/odin.ts
index 251fa5ff2..a5a9157c2 100644
--- a/lib/compilers/odin.ts
+++ b/lib/compilers/odin.ts
@@ -1,9 +1,11 @@
 import path from 'path';
 
 import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
-import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';
+import type {CompilerOutputOptions, ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';
 import {BaseCompiler} from '../base-compiler.js';
 import {CompilationEnvironment} from '../compilation-env.js';
+import {OdinAsmParser} from '../parsers/asm-parser-odin.js';
+import * as utils from '../utils.js';
 
 export class OdinCompiler extends BaseCompiler {
     private clangPath?: string;
@@ -14,6 +16,7 @@ export class OdinCompiler extends BaseCompiler {
 
     constructor(info: PreliminaryCompilerInfo, env: CompilationEnvironment) {
         super(info, env);
+        this.asm = new OdinAsmParser(this.compilerProps);
         this.compiler.supportsIrView = true;
         this.compiler.irArg = [];
         this.compiler.supportsIntel = false;
@@ -24,6 +27,8 @@ export class OdinCompiler extends BaseCompiler {
         if (filters.execute || filters.binary) {
             return ['-debug', '-keep-temp-files', `-out:${this.filename(outputFilename)}`];
         }
+
+        filters.preProcessLines = this.preProcessLines.bind(this);
         return ['-build-mode:asm', '-debug', '-keep-temp-files', `-out:${this.filename(outputFilename)}`];
     }
 
@@ -63,4 +68,182 @@ export class OdinCompiler extends BaseCompiler {
         // we dont need demangling
         return result;
     }
+
+    /**
+     * Preprocess the source code to '@require' all the functions
+     * so that their asm is emitted
+     */
+    override preProcess(source: string, filters: CompilerOutputOptions): string {
+        if (filters.binary && !this.stubRe.test(source)) {
+            source += `\n${this.stubText}\n`;
+        }
+
+        if (!filters.binary && !filters.execute) {
+            const sourceLines = utils.splitLines(source);
+            const outputLines: string[] = [];
+            const procRE = /^\s*([A-Za-z]\w+)\s*:\s*:\s*proc\s*("\w+")?\s*\(/;
+            let lastLine = '';
+            for (const line of sourceLines) {
+                // skip if the line doesn't contain proc keyword
+                if (!line.includes('proc')) {
+                    outputLines.push(line);
+                    lastLine = line;
+                    continue;
+                }
+
+                const match = line.match(procRE);
+                if (!match) {
+                    outputLines.push(line);
+                    lastLine = line;
+                    continue;
+                }
+
+                // skip main
+                if (match[1] === 'main') {
+                    outputLines.push(line);
+                    lastLine = line;
+                    continue;
+                }
+
+                // last line already has require?
+                if (lastLine.includes('@require') || lastLine.includes('@(require)')) {
+                    outputLines.push(line);
+                    continue;
+                }
+
+                // @require the function so they dont get inlined
+                // put @require on the same line so that output source
+                // has same number of lines so that asm<->source mapping
+                // in ui works correctly.
+                outputLines.push('@(require) ' + line);
+                lastLine = line;
+            }
+
+            let text = outputLines.join('\n');
+            // append a final trailing newline
+            if (!text.endsWith('\n')) {
+                text += '\n';
+            }
+            return text;
+        }
+
+        return source;
+    }
+
+    preProcessLines(asmLines: string[]) {
+        let i = 0;
+        let funcStart = -1;
+        while (i < asmLines.length) {
+            const line = asmLines[i];
+            // filter out __$ builtin functions
+            if (funcStart === -1 && line.startsWith('__$') && line.endsWith(':')) {
+                // ensure there is cfi_startproc
+                for (let j = i; j < asmLines.length && j < i + 5; j++) {
+                    if (asmLines[j].includes('.cfi_startproc')) {
+                        funcStart = i;
+                        break;
+                    }
+                }
+
+                // make sure this is a globl
+                if (funcStart !== -1) {
+                    for (let j = i; j >= 0 && j >= i - 3; --j) {
+                        if (asmLines[j].includes('.globl')) {
+                            funcStart = j;
+                            break;
+                        }
+                    }
+                }
+            }
+
+            if (funcStart !== -1 && line.includes('.cfi_endproc')) {
+                const len = i - funcStart;
+                asmLines.splice(funcStart, len + 1);
+                i = funcStart - 1;
+                funcStart = -1;
+            }
+            i++;
+        }
+
+        return this.removeNonMainSourceFunctions(asmLines);
+    }
+
+    parseFiles(asmLines: string[]) {
+        const files: Record<number, string> = {};
+        const fileFind = /^\s*\.(?:cv_)?file\s+(\d+)\s+"([^"]+)"(\s+"([^"]+)")?.*/;
+        for (const line of asmLines) {
+            const match = line.match(fileFind);
+            if (match) {
+                const lineNum = parseInt(match[1]);
+                if (match[4] && !line.includes('.cv_file')) {
+                    // Clang-style file directive '.file X "dir" "filename"'
+                    if (match[4].startsWith('/')) {
+                        files[lineNum] = match[4];
+                    } else {
+                        files[lineNum] = match[2] + '/' + match[4];
+                    }
+                } else {
+                    files[lineNum] = match[2];
+                }
+            }
+        }
+        return files;
+    }
+
+    removeNonMainSourceFunctions(asmLines: string[]): string[] {
+        const files = this.parseFiles(asmLines);
+        const sourceTag = /^\s*\.loc\s+(\d+)\s+(\d+)\s+(.*)/;
+        const stdInLooking = /<stdin>|^-$|example\.[^/]+$|<source>/;
+        let i = 0;
+        let funcStart = -1;
+        while (i < asmLines.length) {
+            const line = asmLines[i];
+            // find a label
+            if (funcStart === -1 && line.endsWith(':')) {
+                // scan the next 5 lines for a source loc label
+                for (let j = i; j < i + 5 && j < asmLines.length; j++) {
+                    const fline = asmLines[j];
+                    const match = fline.match(sourceTag);
+                    if (!match) continue;
+                    const file = files[match[1]];
+                    if (!file) continue;
+                    // if the file is not current file we remove this function
+                    if (!stdInLooking.test(file)) {
+                        funcStart = i;
+                        break;
+                    }
+                }
+
+                // ensure there is cfi_startproc
+                if (funcStart !== -1) {
+                    funcStart = -1;
+                    for (let j = i; j < asmLines.length && j < i + 5; j++) {
+                        if (asmLines[j].includes('.cfi_startproc')) {
+                            funcStart = i;
+                            break;
+                        }
+                    }
+                }
+
+                if (funcStart !== -1) {
+                    for (let j = i; j >= 0 && j >= i - 3; --j) {
+                        if (asmLines[j].includes('.type') && asmLines[j].endsWith('@function')) {
+                            funcStart = j;
+                            break;
+                        }
+                    }
+                }
+            }
+
+            if (funcStart !== -1 && line.includes('.cfi_endproc')) {
+                const len = i - funcStart;
+                asmLines.splice(funcStart, len + 1);
+                i = funcStart - 1;
+                funcStart = -1;
+            }
+            i++;
+        }
+
+        return asmLines;
+    }
 }
diff --git a/lib/parsers/asm-parser-odin.ts b/lib/parsers/asm-parser-odin.ts
new file mode 100644
index 000000000..a20bb6cb8
--- /dev/null
+++ b/lib/parsers/asm-parser-odin.ts
@@ -0,0 +1,36 @@
+// Copyright (c) 2024, 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 {PropertyGetter} from '../properties.interfaces.js';
+
+import {AsmParser} from './asm-parser.js';
+
+export class OdinAsmParser extends AsmParser {
+    constructor(compilerProps?: PropertyGetter) {
+        super(compilerProps);
+
+        this.labelDef = /^(?:.proc\s+)?([\w"$.@-]+):/i;
+        this.labelFindNonMips = /[".A-Z_a-z][\w"$.-]*/g;
+    }
+}
diff --git a/package-lock.json b/package-lock.json
index c242fe731..a94e349e9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5937,9 +5937,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001684",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz",
-      "integrity": "sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==",
+      "version": "1.0.30001690",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz",
+      "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==",
       "funding": [
         {
           "type": "opencollective",
diff --git a/static/modes/odin-mode.ts b/static/modes/odin-mode.ts
index 46a2d6610..1dc6d0002 100644
--- a/static/modes/odin-mode.ts
+++ b/static/modes/odin-mode.ts
@@ -237,7 +237,39 @@ function definition(): monaco.languages.IMonarchLanguage {
     };
 }
 
+function configuration(): monaco.languages.LanguageConfiguration {
+    return {
+        comments: {
+            lineComment: '//',
+            blockComment: ['/*', '*/'],
+        },
+
+        brackets: [
+            ['{', '}'],
+            ['[', ']'],
+            ['(', ')'],
+        ],
+
+        autoClosingPairs: [
+            {open: '[', close: ']'},
+            {open: '{', close: '}'},
+            {open: '(', close: ')'},
+            {open: "'", close: "'", notIn: ['string', 'comment']},
+            {open: '"', close: '"', notIn: ['string']},
+        ],
+
+        surroundingPairs: [
+            {open: '{', close: '}'},
+            {open: '[', close: ']'},
+            {open: '(', close: ')'},
+            {open: '"', close: '"'},
+            {open: "'", close: "'"},
+        ],
+    };
+}
+
 monaco.languages.register({id: 'odin'});
 monaco.languages.setMonarchTokensProvider('odin', definition());
+monaco.languages.setLanguageConfiguration('odin', configuration());
 
 export {};


Test patch:
diff --git a/test/odin-tests.ts b/test/odin-tests.ts
new file mode 100644
index 000000000..8e396eb99
--- /dev/null
+++ b/test/odin-tests.ts
@@ -0,0 +1,72 @@
+// Copyright (c) 2024, 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 {beforeAll, describe, expect, it} from 'vitest';
+
+import {OdinCompiler} from '../lib/compilers/odin.js';
+import {CompilerOutputOptions} from '../types/features/filters.interfaces.js';
+import {LanguageKey} from '../types/languages.interfaces.js';
+
+import {fs, makeCompilationEnvironment, makeFakeCompilerInfo} from './utils.js';
+
+const languages = {
+    odin: {id: 'odin' as LanguageKey},
+};
+
+let ce;
+const info = {
+    exe: '/dev/null',
+    remote: {
+        target: 'example',
+        path: 'dummy',
+        cmakePath: 'cmake',
+    },
+    lang: languages.odin.id,
+};
+
+describe('GO asm tests', () => {
+    beforeAll(() => {
+        ce = makeCompilationEnvironment({languages});
+    });
+
+    it('Test @require attribute is added correctly', async () => {
+        const compiler = new OdinCompiler(makeFakeCompilerInfo(info), ce);
+        const inputFile = 'test/odin/add_require.odin';
+        const filter: CompilerOutputOptions = {};
+        const output = compiler.preProcess(fs.readFileSync(inputFile).toString(), filter);
+        const expectedOutputFile = 'test/odin/add_require.odin.expected';
+        const expectedOutput = fs.readFileSync(expectedOutputFile).toString();
+        expect(output).toEqual(expectedOutput);
+    });
+
+    it('Test source unmodified with binary or execute filter', async () => {
+        const compiler = new OdinCompiler(makeFakeCompilerInfo(info), ce);
+        const inputFile = 'test/odin/add_require.odin';
+        const filter: CompilerOutputOptions = {execute: true};
+        const output = compiler.preProcess(fs.readFileSync(inputFile).toString(), filter);
+        const expectedOutputFile = 'test/odin/add_require.odin';
+        const expectedOutput = fs.readFileSync(expectedOutputFile).toString();
+        expect(output).toEqual(expectedOutput);
+    });
+});
diff --git a/test/odin/add_require.odin b/test/odin/add_require.odin
new file mode 100644
index 000000000..d0bfaba37
--- /dev/null
+++ b/test/odin/add_require.odin
@@ -0,0 +1,18 @@
+package main
+
+import "core:fmt"
+
+test_proc :: proc() {
+}
+
+@(require)
+test_proc1 :: proc() {
+}
+
+@require
+test_proc2 :: proc() {
+}
+
+main :: proc() {
+    fmt.println("asd")
+}
diff --git a/test/odin/add_require.odin.expected b/test/odin/add_require.odin.expected
new file mode 100644
index 000000000..5020a61df
--- /dev/null
+++ b/test/odin/add_require.odin.expected
@@ -0,0 +1,18 @@
+package main
+
+import "core:fmt"
+
+@(require) test_proc :: proc() {
+}
+
+@(require)
+test_proc1 :: proc() {
+}
+
+@require
+test_proc2 :: proc() {
+}
+
+main :: proc() {
+    fmt.println("asd")
+}