From 4c50c4b6e5ba1b57e37194fb307d176bef16f810 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Mon, 19 Jan 2026 23:56:26 +0100 Subject: [PATCH] llvm: wire up the xtensa backend As of LLVM 22, it can produce assembly and object files. No LLD support, however, so using it is still a bit of a pain. --- src/codegen/llvm.zig | 2 +- src/codegen/llvm/bindings.zig | 1 + src/link/Lld.zig | 3 ++- src/target.zig | 2 +- test/llvm_targets.zig | 4 ++-- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 3c34860c00dd604059d124840cf9ca8c267600d0..9e5f0deb43ef1a8cac4f25b5c08ecbd193837c63 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -4818,7 +4818,7 @@ pub fn initializeLLVMTarget(arch: std.Target.Cpu.Arch) void { bindings.LLVMInitializeXtensaTarget(); bindings.LLVMInitializeXtensaTargetInfo(); bindings.LLVMInitializeXtensaTargetMC(); - // There is no LLVMInitializeXtensaAsmPrinter function. + bindings.LLVMInitializeXtensaAsmPrinter(); bindings.LLVMInitializeXtensaAsmParser(); } }, diff --git a/src/codegen/llvm/bindings.zig b/src/codegen/llvm/bindings.zig index 9f7ea2ca41c9234a4a90a5f4ecf6c8df67a390f5..38f0c300bc625c399bc4d074a78ef4570158f254 100644 --- a/src/codegen/llvm/bindings.zig +++ b/src/codegen/llvm/bindings.zig @@ -279,6 +279,7 @@ pub extern fn LLVMInitializeSystemZAsmPrinter() void; pub extern fn LLVMInitializeWebAssemblyAsmPrinter() void; pub extern fn LLVMInitializeX86AsmPrinter() void; pub extern fn LLVMInitializeXCoreAsmPrinter() void; +pub extern fn LLVMInitializeXtensaAsmPrinter() void; pub extern fn LLVMInitializeM68kAsmPrinter() void; pub extern fn LLVMInitializeVEAsmPrinter() void; pub extern fn LLVMInitializeARCAsmPrinter() void; diff --git a/src/link/Lld.zig b/src/link/Lld.zig index ffb9020e7f64e3f4caa169407730d4365aa7c080..76dd85e332319206b8680358a334dbb712e44779 100644 --- a/src/link/Lld.zig +++ b/src/link/Lld.zig @@ -812,7 +812,8 @@ fn elfLink(lld: *Lld, arena: Allocator) !void { target.cpu.arch == .m68k or target.cpu.arch.isSPARC() or target.cpu.arch == .ve or - target.cpu.arch == .xcore)) + target.cpu.arch == .xcore or + target.cpu.arch == .xtensa)) { // In this case we must do a simple file copy // here. TODO: think carefully about how we can avoid this redundant operation when doing diff --git a/src/target.zig b/src/target.zig index 5798b58ca9d965c64104cf47f1c097be71418946..47957d34a8ad49f4dc61f186a0f3c282ba57674c 100644 --- a/src/target.zig +++ b/src/target.zig @@ -227,11 +227,11 @@ pub fn hasLlvmSupport(target: *const std.Target, ofmt: std.Target.ObjectFormat) .wasm32, .wasm64, .ve, + .xtensa, => true, // LLVM backend exists but can produce neither assembly nor object files. .csky, - .xtensa, => false, // Third-party LLVM backend exists. diff --git a/test/llvm_targets.zig b/test/llvm_targets.zig index 6b768a277c3c5b981779715d22263bff22535c16..5119a6b605ef7cfc1dd31ddb028a35c87a2cfac3 100644 --- a/test/llvm_targets.zig +++ b/test/llvm_targets.zig @@ -344,8 +344,8 @@ const targets = [_]std.Target.Query{ .{ .cpu_arch = .xcore, .os_tag = .freestanding, .abi = .none }, - // .{ .cpu_arch = .xtensa, .os_tag = .freestanding, .abi = .none }, - // .{ .cpu_arch = .xtensa, .os_tag = .linux, .abi = .none }, + .{ .cpu_arch = .xtensa, .os_tag = .freestanding, .abi = .none }, + .{ .cpu_arch = .xtensa, .os_tag = .linux, .abi = .none }, }; pub fn addCases( -- 2.54.0