Commit ddcf6fcdf3

Alex Rønne Petersen <alex@alexrp.com>
2025-04-06 17:36:24
compiler: Allow using LLVM's SPIR-V backend.
1 parent 991560f
Changed files (3)
src/codegen/llvm/bindings.zig
@@ -211,6 +211,7 @@ pub extern fn LLVMInitializeCSKYTargetInfo() void;
 pub extern fn LLVMInitializeVETargetInfo() void;
 pub extern fn LLVMInitializeARCTargetInfo() void;
 pub extern fn LLVMInitializeLoongArchTargetInfo() void;
+pub extern fn LLVMInitializeSPIRVTargetInfo() void;
 
 pub extern fn LLVMInitializeAArch64Target() void;
 pub extern fn LLVMInitializeAMDGPUTarget() void;
@@ -235,6 +236,7 @@ pub extern fn LLVMInitializeVETarget() void;
 pub extern fn LLVMInitializeCSKYTarget() void;
 pub extern fn LLVMInitializeARCTarget() void;
 pub extern fn LLVMInitializeLoongArchTarget() void;
+pub extern fn LLVMInitializeSPIRVTarget() void;
 
 pub extern fn LLVMInitializeAArch64TargetMC() void;
 pub extern fn LLVMInitializeAMDGPUTargetMC() void;
@@ -259,6 +261,7 @@ pub extern fn LLVMInitializeCSKYTargetMC() void;
 pub extern fn LLVMInitializeVETargetMC() void;
 pub extern fn LLVMInitializeARCTargetMC() void;
 pub extern fn LLVMInitializeLoongArchTargetMC() void;
+pub extern fn LLVMInitializeSPIRVTargetMC() void;
 
 pub extern fn LLVMInitializeAArch64AsmPrinter() void;
 pub extern fn LLVMInitializeAMDGPUAsmPrinter() void;
@@ -281,6 +284,7 @@ pub extern fn LLVMInitializeM68kAsmPrinter() void;
 pub extern fn LLVMInitializeVEAsmPrinter() void;
 pub extern fn LLVMInitializeARCAsmPrinter() void;
 pub extern fn LLVMInitializeLoongArchAsmPrinter() void;
+pub extern fn LLVMInitializeSPIRVAsmPrinter() void;
 
 pub extern fn LLVMInitializeAArch64AsmParser() void;
 pub extern fn LLVMInitializeAMDGPUAsmParser() void;
src/codegen/llvm.zig
@@ -12723,12 +12723,15 @@ pub fn initializeLLVMTarget(arch: std.Target.Cpu.Arch) void {
             llvm.LLVMInitializeLoongArchAsmPrinter();
             llvm.LLVMInitializeLoongArchAsmParser();
         },
-
-        // We don't currently support using these backends.
         .spirv,
         .spirv32,
         .spirv64,
-        => {},
+        => {
+            llvm.LLVMInitializeSPIRVTarget();
+            llvm.LLVMInitializeSPIRVTargetInfo();
+            llvm.LLVMInitializeSPIRVTargetMC();
+            llvm.LLVMInitializeSPIRVAsmPrinter();
+        },
 
         // LLVM does does not have a backend for these.
         .kalimba,
src/target.zig
@@ -172,6 +172,9 @@ pub fn hasLlvmSupport(target: std.Target, ofmt: std.Target.ObjectFormat) bool {
         .riscv64,
         .sparc,
         .sparc64,
+        .spirv,
+        .spirv32,
+        .spirv64,
         .s390x,
         .thumb,
         .thumbeb,
@@ -187,12 +190,6 @@ pub fn hasLlvmSupport(target: std.Target, ofmt: std.Target.ObjectFormat) bool {
         .ve,
         => true,
 
-        // An LLVM backend exists but we don't currently support using it.
-        .spirv,
-        .spirv32,
-        .spirv64,
-        => false,
-
         // No LLVM backend exists.
         .kalimba,
         .propeller,
@@ -213,7 +210,7 @@ pub fn hasLldSupport(ofmt: std.Target.ObjectFormat) bool {
 /// debug mode. A given target should only return true here if it is passing greater
 /// than or equal to the number of behavior tests as the respective LLVM backend.
 pub fn selfHostedBackendIsAsRobustAsLlvm(target: std.Target) bool {
-    _ = target;
+    if (target.cpu.arch.isSpirV()) return true;
     return false;
 }