diff --git a/lib/std/Target.zig b/lib/std/Target.zig index 5ede5809f370..da64f9b72337 100644 --- a/lib/std/Target.zig +++ b/lib/std/Target.zig @@ -1537,6 +1537,7 @@ pub const Cpu = struct { .x86 => &x86.cpu.pentium4, .nvptx, .nvptx64 => &nvptx.cpu.sm_20, .sparc, .sparcel => &sparc.cpu.v8, + .loongarch64 => &loongarch.cpu.loongarch64, else => generic(arch), }; @@ -1986,6 +1987,7 @@ pub fn stackAlignment(target: Target) u16 { .ve, .wasm32, .wasm64, + .loongarch64, => 16, .powerpc64, .powerpc64le, diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 9e51417ab623..77b9d74fdcea 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -426,7 +426,9 @@ const DataLayoutBuilder = struct { }; if (self.target.cpu.arch == .aarch64_32) continue; if (!info.force_in_data_layout and matches_default and - self.target.cpu.arch != .riscv64 and !(self.target.cpu.arch == .aarch64 and + self.target.cpu.arch != .riscv64 and + self.target.cpu.arch != .loongarch64 and + !(self.target.cpu.arch == .aarch64 and (self.target.os.tag == .uefi or self.target.os.tag == .windows)) and self.target.cpu.arch != .bpfeb and self.target.cpu.arch != .bpfel) continue; try writer.writeAll("-p"); @@ -535,6 +537,7 @@ const DataLayoutBuilder = struct { .nvptx64, => &.{ 16, 32, 64 }, .x86_64 => &.{ 8, 16, 32, 64 }, + .loongarch64 => &.{64}, else => &.{}, }), 0..) |natural, index| switch (index) { 0 => try writer.print("-n{d}", .{natural}), @@ -686,6 +689,14 @@ const DataLayoutBuilder = struct { }, else => {}, }, + .loongarch64 => switch (size) { + 128 => { + abi = size; + pref = size; + force_abi = true; + }, + else => {}, + }, else => {}, } }, @@ -12039,6 +12050,13 @@ pub fn initializeLLVMTarget(arch: std.Target.Cpu.Arch) void { // There is no LLVMInitializeARCAsmParser function. } }, + .loongarch32, .loongarch64 => { + llvm.LLVMInitializeLoongArchTarget(); + llvm.LLVMInitializeLoongArchTargetInfo(); + llvm.LLVMInitializeLoongArchTargetMC(); + llvm.LLVMInitializeLoongArchAsmPrinter(); + llvm.LLVMInitializeLoongArchAsmParser(); + }, // LLVM backends that have no initialization functions. .tce, @@ -12060,8 +12078,6 @@ pub fn initializeLLVMTarget(arch: std.Target.Cpu.Arch) void { .renderscript32, .renderscript64, .dxil, - .loongarch32, - .loongarch64, => {}, .spu_2 => unreachable, // LLVM does not support this backend diff --git a/src/codegen/llvm/bindings.zig b/src/codegen/llvm/bindings.zig index 99a3de043e1d..a32f1d74bc53 100644 --- a/src/codegen/llvm/bindings.zig +++ b/src/codegen/llvm/bindings.zig @@ -177,6 +177,7 @@ pub extern fn LLVMInitializeM68kTargetInfo() void; pub extern fn LLVMInitializeCSKYTargetInfo() void; pub extern fn LLVMInitializeVETargetInfo() void; pub extern fn LLVMInitializeARCTargetInfo() void; +pub extern fn LLVMInitializeLoongArchTargetInfo() void; pub extern fn LLVMInitializeAArch64Target() void; pub extern fn LLVMInitializeAMDGPUTarget() void; @@ -200,6 +201,7 @@ pub extern fn LLVMInitializeM68kTarget() void; pub extern fn LLVMInitializeVETarget() void; pub extern fn LLVMInitializeCSKYTarget() void; pub extern fn LLVMInitializeARCTarget() void; +pub extern fn LLVMInitializeLoongArchTarget() void; pub extern fn LLVMInitializeAArch64TargetMC() void; pub extern fn LLVMInitializeAMDGPUTargetMC() void; @@ -223,6 +225,7 @@ pub extern fn LLVMInitializeM68kTargetMC() void; pub extern fn LLVMInitializeCSKYTargetMC() void; pub extern fn LLVMInitializeVETargetMC() void; pub extern fn LLVMInitializeARCTargetMC() void; +pub extern fn LLVMInitializeLoongArchTargetMC() void; pub extern fn LLVMInitializeAArch64AsmPrinter() void; pub extern fn LLVMInitializeAMDGPUAsmPrinter() void; @@ -244,6 +247,7 @@ pub extern fn LLVMInitializeXCoreAsmPrinter() void; pub extern fn LLVMInitializeM68kAsmPrinter() void; pub extern fn LLVMInitializeVEAsmPrinter() void; pub extern fn LLVMInitializeARCAsmPrinter() void; +pub extern fn LLVMInitializeLoongArchAsmPrinter() void; pub extern fn LLVMInitializeAArch64AsmParser() void; pub extern fn LLVMInitializeAMDGPUAsmParser() void; @@ -264,6 +268,7 @@ pub extern fn LLVMInitializeXtensaAsmParser() void; pub extern fn LLVMInitializeM68kAsmParser() void; pub extern fn LLVMInitializeCSKYAsmParser() void; pub extern fn LLVMInitializeVEAsmParser() void; +pub extern fn LLVMInitializeLoongArchAsmParser() void; extern fn ZigLLDLinkCOFF(argc: c_int, argv: [*:null]const ?[*:0]const u8, can_exit_early: bool, disable_output: bool) bool; extern fn ZigLLDLinkELF(argc: c_int, argv: [*:null]const ?[*:0]const u8, can_exit_early: bool, disable_output: bool) bool;