commit 4c50c4b6e5ba1b57e37194fb307d176bef16f810 (tree)
parent 473df0c106c6b72321832d7e9c7d656f46762a9a
Author: Alex Rønne Petersen <alex@alexrp.com>
Date: Mon, 19 Jan 2026 23:56:26 +0100
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.
Diffstat:
5 files changed, 7 insertions(+), 5 deletions(-)
diff --git 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
@@ -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
@@ -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
@@ -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
@@ -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(