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 3c34860c00..9e5f0deb43 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 9f7ea2ca41..38f0c300bc 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 ffb9020e7f..76dd85e332 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 5798b58ca9..47957d34a8 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 6b768a277c..5119a6b605 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(