authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-06-04 21:54:07-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-06-05 13:43:35-04:00
logac3faa6cb3244a5db26b4fd5b114da23208e2239
tree654d7b95c0ed568e5d6758289286ea94692180a1
parent332fbb4b027a5529e58b1e46d785718a7faa75e6

LLVM backend: loongarch64 support


3 files changed, 26 insertions(+), 3 deletions(-)

lib/std/Target.zig+2
...@@ -1537,6 +1537,7 @@ pub const Cpu = struct {...@@ -1537,6 +1537,7 @@ pub const Cpu = struct {
1537 .x86 => &x86.cpu.pentium4,1537 .x86 => &x86.cpu.pentium4,
1538 .nvptx, .nvptx64 => &nvptx.cpu.sm_20,1538 .nvptx, .nvptx64 => &nvptx.cpu.sm_20,
1539 .sparc, .sparcel => &sparc.cpu.v8,1539 .sparc, .sparcel => &sparc.cpu.v8,
1540 .loongarch64 => &loongarch.cpu.loongarch64,
15401541
1541 else => generic(arch),1542 else => generic(arch),
1542 };1543 };
...@@ -1986,6 +1987,7 @@ pub fn stackAlignment(target: Target) u16 {...@@ -1986,6 +1987,7 @@ pub fn stackAlignment(target: Target) u16 {
1986 .ve,1987 .ve,
1987 .wasm32,1988 .wasm32,
1988 .wasm64,1989 .wasm64,
1990 .loongarch64,
1989 => 16,1991 => 16,
1990 .powerpc64,1992 .powerpc64,
1991 .powerpc64le,1993 .powerpc64le,
src/codegen/llvm.zig+19-3
...@@ -426,7 +426,9 @@ const DataLayoutBuilder = struct {...@@ -426,7 +426,9 @@ const DataLayoutBuilder = struct {
426 };426 };
427 if (self.target.cpu.arch == .aarch64_32) continue;427 if (self.target.cpu.arch == .aarch64_32) continue;
428 if (!info.force_in_data_layout and matches_default and428 if (!info.force_in_data_layout and matches_default and
429 self.target.cpu.arch != .riscv64 and !(self.target.cpu.arch == .aarch64 and429 self.target.cpu.arch != .riscv64 and
430 self.target.cpu.arch != .loongarch64 and
431 !(self.target.cpu.arch == .aarch64 and
430 (self.target.os.tag == .uefi or self.target.os.tag == .windows)) and432 (self.target.os.tag == .uefi or self.target.os.tag == .windows)) and
431 self.target.cpu.arch != .bpfeb and self.target.cpu.arch != .bpfel) continue;433 self.target.cpu.arch != .bpfeb and self.target.cpu.arch != .bpfel) continue;
432 try writer.writeAll("-p");434 try writer.writeAll("-p");
...@@ -535,6 +537,7 @@ const DataLayoutBuilder = struct {...@@ -535,6 +537,7 @@ const DataLayoutBuilder = struct {
535 .nvptx64,537 .nvptx64,
536 => &.{ 16, 32, 64 },538 => &.{ 16, 32, 64 },
537 .x86_64 => &.{ 8, 16, 32, 64 },539 .x86_64 => &.{ 8, 16, 32, 64 },
540 .loongarch64 => &.{64},
538 else => &.{},541 else => &.{},
539 }), 0..) |natural, index| switch (index) {542 }), 0..) |natural, index| switch (index) {
540 0 => try writer.print("-n{d}", .{natural}),543 0 => try writer.print("-n{d}", .{natural}),
...@@ -686,6 +689,14 @@ const DataLayoutBuilder = struct {...@@ -686,6 +689,14 @@ const DataLayoutBuilder = struct {
686 },689 },
687 else => {},690 else => {},
688 },691 },
692 .loongarch64 => switch (size) {
693 128 => {
694 abi = size;
695 pref = size;
696 force_abi = true;
697 },
698 else => {},
699 },
689 else => {},700 else => {},
690 }701 }
691 },702 },
...@@ -12039,6 +12050,13 @@ pub fn initializeLLVMTarget(arch: std.Target.Cpu.Arch) void {...@@ -12039,6 +12050,13 @@ pub fn initializeLLVMTarget(arch: std.Target.Cpu.Arch) void {
12039 // There is no LLVMInitializeARCAsmParser function.12050 // There is no LLVMInitializeARCAsmParser function.
12040 }12051 }
12041 },12052 },
12053 .loongarch32, .loongarch64 => {
12054 llvm.LLVMInitializeLoongArchTarget();
12055 llvm.LLVMInitializeLoongArchTargetInfo();
12056 llvm.LLVMInitializeLoongArchTargetMC();
12057 llvm.LLVMInitializeLoongArchAsmPrinter();
12058 llvm.LLVMInitializeLoongArchAsmParser();
12059 },
1204212060
12043 // LLVM backends that have no initialization functions.12061 // LLVM backends that have no initialization functions.
12044 .tce,12062 .tce,
...@@ -12060,8 +12078,6 @@ pub fn initializeLLVMTarget(arch: std.Target.Cpu.Arch) void {...@@ -12060,8 +12078,6 @@ pub fn initializeLLVMTarget(arch: std.Target.Cpu.Arch) void {
12060 .renderscript32,12078 .renderscript32,
12061 .renderscript64,12079 .renderscript64,
12062 .dxil,12080 .dxil,
12063 .loongarch32,
12064 .loongarch64,
12065 => {},12081 => {},
1206612082
12067 .spu_2 => unreachable, // LLVM does not support this backend12083 .spu_2 => unreachable, // LLVM does not support this backend
src/codegen/llvm/bindings.zig+5
...@@ -177,6 +177,7 @@ pub extern fn LLVMInitializeM68kTargetInfo() void;...@@ -177,6 +177,7 @@ pub extern fn LLVMInitializeM68kTargetInfo() void;
177pub extern fn LLVMInitializeCSKYTargetInfo() void;177pub extern fn LLVMInitializeCSKYTargetInfo() void;
178pub extern fn LLVMInitializeVETargetInfo() void;178pub extern fn LLVMInitializeVETargetInfo() void;
179pub extern fn LLVMInitializeARCTargetInfo() void;179pub extern fn LLVMInitializeARCTargetInfo() void;
180pub extern fn LLVMInitializeLoongArchTargetInfo() void;
180181
181pub extern fn LLVMInitializeAArch64Target() void;182pub extern fn LLVMInitializeAArch64Target() void;
182pub extern fn LLVMInitializeAMDGPUTarget() void;183pub extern fn LLVMInitializeAMDGPUTarget() void;
...@@ -200,6 +201,7 @@ pub extern fn LLVMInitializeM68kTarget() void;...@@ -200,6 +201,7 @@ pub extern fn LLVMInitializeM68kTarget() void;
200pub extern fn LLVMInitializeVETarget() void;201pub extern fn LLVMInitializeVETarget() void;
201pub extern fn LLVMInitializeCSKYTarget() void;202pub extern fn LLVMInitializeCSKYTarget() void;
202pub extern fn LLVMInitializeARCTarget() void;203pub extern fn LLVMInitializeARCTarget() void;
204pub extern fn LLVMInitializeLoongArchTarget() void;
203205
204pub extern fn LLVMInitializeAArch64TargetMC() void;206pub extern fn LLVMInitializeAArch64TargetMC() void;
205pub extern fn LLVMInitializeAMDGPUTargetMC() void;207pub extern fn LLVMInitializeAMDGPUTargetMC() void;
...@@ -223,6 +225,7 @@ pub extern fn LLVMInitializeM68kTargetMC() void;...@@ -223,6 +225,7 @@ pub extern fn LLVMInitializeM68kTargetMC() void;
223pub extern fn LLVMInitializeCSKYTargetMC() void;225pub extern fn LLVMInitializeCSKYTargetMC() void;
224pub extern fn LLVMInitializeVETargetMC() void;226pub extern fn LLVMInitializeVETargetMC() void;
225pub extern fn LLVMInitializeARCTargetMC() void;227pub extern fn LLVMInitializeARCTargetMC() void;
228pub extern fn LLVMInitializeLoongArchTargetMC() void;
226229
227pub extern fn LLVMInitializeAArch64AsmPrinter() void;230pub extern fn LLVMInitializeAArch64AsmPrinter() void;
228pub extern fn LLVMInitializeAMDGPUAsmPrinter() void;231pub extern fn LLVMInitializeAMDGPUAsmPrinter() void;
...@@ -244,6 +247,7 @@ pub extern fn LLVMInitializeXCoreAsmPrinter() void;...@@ -244,6 +247,7 @@ pub extern fn LLVMInitializeXCoreAsmPrinter() void;
244pub extern fn LLVMInitializeM68kAsmPrinter() void;247pub extern fn LLVMInitializeM68kAsmPrinter() void;
245pub extern fn LLVMInitializeVEAsmPrinter() void;248pub extern fn LLVMInitializeVEAsmPrinter() void;
246pub extern fn LLVMInitializeARCAsmPrinter() void;249pub extern fn LLVMInitializeARCAsmPrinter() void;
250pub extern fn LLVMInitializeLoongArchAsmPrinter() void;
247251
248pub extern fn LLVMInitializeAArch64AsmParser() void;252pub extern fn LLVMInitializeAArch64AsmParser() void;
249pub extern fn LLVMInitializeAMDGPUAsmParser() void;253pub extern fn LLVMInitializeAMDGPUAsmParser() void;
...@@ -264,6 +268,7 @@ pub extern fn LLVMInitializeXtensaAsmParser() void;...@@ -264,6 +268,7 @@ pub extern fn LLVMInitializeXtensaAsmParser() void;
264pub extern fn LLVMInitializeM68kAsmParser() void;268pub extern fn LLVMInitializeM68kAsmParser() void;
265pub extern fn LLVMInitializeCSKYAsmParser() void;269pub extern fn LLVMInitializeCSKYAsmParser() void;
266pub extern fn LLVMInitializeVEAsmParser() void;270pub extern fn LLVMInitializeVEAsmParser() void;
271pub extern fn LLVMInitializeLoongArchAsmParser() void;
267272
268extern fn ZigLLDLinkCOFF(argc: c_int, argv: [*:null]const ?[*:0]const u8, can_exit_early: bool, disable_output: bool) bool;273extern fn ZigLLDLinkCOFF(argc: c_int, argv: [*:null]const ?[*:0]const u8, can_exit_early: bool, disable_output: bool) bool;
269extern fn ZigLLDLinkELF(argc: c_int, argv: [*:null]const ?[*:0]const u8, can_exit_early: bool, disable_output: bool) bool;274extern fn ZigLLDLinkELF(argc: c_int, argv: [*:null]const ?[*:0]const u8, can_exit_early: bool, disable_output: bool) bool;