authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-07-23 23:45:01-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-07-23 23:48:18-04:00
log06af9cc101d0e688f7c6a1c2cc009b917f0a7bdf
tree0d2ee72aa43086184a89a846bb77d353066bebfc
parentaa44f8f0fd1a4af9df65a9b9bfc5fe6fa0d31b9f

llvm: fix datalayout generation for more targets

Closes #16482

2 files changed, 44 insertions(+), 27 deletions(-)

lib/std/target.zig+7-3
......@@ -1912,7 +1912,7 @@ pub const Target = struct {
19121912 return switch (target.cpu.arch) {
19131913 .amdgcn => 4,
19141914 .x86 => switch (target.os.tag) {
1915 .windows => 4,
1915 .windows, .uefi => 4,
19161916 else => 16,
19171917 },
19181918 .arm,
......@@ -1931,8 +1931,6 @@ pub const Target = struct {
19311931 .bpfel,
19321932 .mips64,
19331933 .mips64el,
1934 .powerpc64,
1935 .powerpc64le,
19361934 .riscv32,
19371935 .riscv64,
19381936 .sparc64,
......@@ -1941,6 +1939,12 @@ pub const Target = struct {
19411939 .wasm32,
19421940 .wasm64,
19431941 => 16,
1942 .powerpc64,
1943 .powerpc64le,
1944 => switch (target.os.tag) {
1945 else => 8,
1946 .linux => 16,
1947 },
19441948 else => @divExact(target.ptrBitWidth(), 8),
19451949 };
19461950 }
src/codegen/llvm.zig+37-24
......@@ -340,7 +340,6 @@ const DataLayoutBuilder = struct {
340340 _: std.fmt.FormatOptions,
341341 writer: anytype,
342342 ) @TypeOf(writer).Error!void {
343 const is_aarch64_windows = self.target.cpu.arch == .aarch64 and self.target.os.tag == .windows;
344343 try writer.writeByte(switch (self.target.cpu.arch.endian()) {
345344 .Little => 'e',
346345 .Big => 'E',
......@@ -407,7 +406,8 @@ const DataLayoutBuilder = struct {
407406 };
408407 if (self.target.cpu.arch == .aarch64_32) continue;
409408 if (!info.force_in_data_layout and matches_default and
410 self.target.cpu.arch != .riscv64 and !is_aarch64_windows and
409 self.target.cpu.arch != .riscv64 and !(self.target.cpu.arch == .aarch64 and
410 (self.target.os.tag == .uefi or self.target.os.tag == .windows)) and
411411 self.target.cpu.arch != .bpfeb and self.target.cpu.arch != .bpfel) continue;
412412 try writer.writeAll("-p");
413413 if (info.llvm != .default) try writer.print("{d}", .{@intFromEnum(info.llvm)});
......@@ -423,7 +423,7 @@ const DataLayoutBuilder = struct {
423423 if (self.target.cpu.arch == .s390x) try self.typeAlignment(.integer, 1, 8, 8, false, writer);
424424 try self.typeAlignment(.integer, 8, 8, 8, false, writer);
425425 try self.typeAlignment(.integer, 16, 16, 16, false, writer);
426 try self.typeAlignment(.integer, 32, if (is_aarch64_windows) 0 else 32, 32, false, writer);
426 try self.typeAlignment(.integer, 32, 32, 32, false, writer);
427427 try self.typeAlignment(.integer, 64, 32, 64, false, writer);
428428 try self.typeAlignment(.integer, 128, 32, 64, false, writer);
429429 if (backendSupportsF16(self.target)) try self.typeAlignment(.float, 16, 16, 16, false, writer);
......@@ -453,8 +453,15 @@ const DataLayoutBuilder = struct {
453453 try self.typeAlignment(.vector, 128, 128, 128, true, writer);
454454 },
455455 }
456 if (self.target.os.tag != .windows and self.target.cpu.arch != .avr)
457 try self.typeAlignment(.aggregate, 0, 0, 64, false, writer);
456 const swap_agg_nat = switch (self.target.cpu.arch) {
457 .x86, .x86_64 => switch (self.target.os.tag) {
458 .uefi, .windows => true,
459 else => false,
460 },
461 .avr => true,
462 else => false,
463 };
464 if (!swap_agg_nat) try self.typeAlignment(.aggregate, 0, 0, 64, false, writer);
458465 for (@as([]const u24, switch (self.target.cpu.arch) {
459466 .avr => &.{8},
460467 .msp430 => &.{ 8, 16 },
......@@ -498,6 +505,7 @@ const DataLayoutBuilder = struct {
498505 0 => try writer.print("-n{d}", .{natural}),
499506 else => try writer.print(":{d}", .{natural}),
500507 };
508 if (swap_agg_nat) try self.typeAlignment(.aggregate, 0, 0, 64, false, writer);
501509 if (self.target.cpu.arch == .hexagon) {
502510 try self.typeAlignment(.integer, 64, 64, 64, true, writer);
503511 try self.typeAlignment(.integer, 32, 32, 32, true, writer);
......@@ -506,11 +514,9 @@ const DataLayoutBuilder = struct {
506514 try self.typeAlignment(.float, 32, 32, 32, true, writer);
507515 try self.typeAlignment(.float, 64, 64, 64, true, writer);
508516 }
509 if (self.target.os.tag == .windows or self.target.cpu.arch == .avr)
510 try self.typeAlignment(.aggregate, 0, 0, 64, false, writer);
511517 const stack_abi = self.target.stackAlignment() * 8;
512 if (self.target.os.tag == .windows or self.target.cpu.arch == .msp430 or
513 stack_abi != ptr_bit_width)
518 if (self.target.os.tag == .uefi or self.target.os.tag == .windows or
519 self.target.cpu.arch == .msp430 or stack_abi != ptr_bit_width)
514520 try writer.print("-S{d}", .{stack_abi});
515521 switch (self.target.cpu.arch) {
516522 .hexagon, .ve => {
......@@ -571,22 +577,21 @@ const DataLayoutBuilder = struct {
571577 .integer => {
572578 if (self.target.ptrBitWidth() <= 16 and size >= 128) return;
573579 abi = @min(abi, self.target.maxIntAlignment() * 8);
574 switch (self.target.os.tag) {
575 .linux => switch (self.target.cpu.arch) {
576 .aarch64,
577 .aarch64_be,
578 .aarch64_32,
579 .mips,
580 .mipsel,
581 => pref = @max(pref, 32),
582 else => {},
583 },
584 else => {},
585 }
586580 switch (self.target.cpu.arch) {
587581 .aarch64,
588582 .aarch64_be,
589583 .aarch64_32,
584 => if (size == 128) {
585 abi = size;
586 pref = size;
587 } else switch (self.target.os.tag) {
588 .macos => {},
589 .uefi, .windows => {
590 pref = size;
591 force_abi = size >= 32;
592 },
593 else => pref = @max(pref, 32),
594 },
590595 .bpfeb,
591596 .bpfel,
592597 .nvptx,
......@@ -597,6 +602,9 @@ const DataLayoutBuilder = struct {
597602 pref = size;
598603 },
599604 .hexagon => force_abi = true,
605 .mips,
606 .mipsel,
607 => pref = @max(pref, 32),
600608 .mips64,
601609 .mips64el,
602610 => if (size <= 32) {
......@@ -617,7 +625,8 @@ const DataLayoutBuilder = struct {
617625 128 => abi = 64,
618626 else => {},
619627 }
620 } else if ((self.target.cpu.arch.isPPC64() and (size == 256 or size == 512)) or
628 } else if ((self.target.cpu.arch.isPPC64() and self.target.os.tag == .linux and
629 (size == 256 or size == 512)) or
621630 (self.target.cpu.arch.isNvptx() and (size == 16 or size == 32)))
622631 {
623632 force_abi = true;
......@@ -646,17 +655,21 @@ const DataLayoutBuilder = struct {
646655 .hexagon => if (size == 32 or size == 64) {
647656 force_abi = true;
648657 },
649 .aarch64_32 => if (size == 128) {
658 .aarch64_32, .amdgcn => if (size == 128) {
650659 abi = size;
651660 pref = size;
652661 },
662 .wasm32, .wasm64 => if (self.target.os.tag == .emscripten and size == 128) {
663 abi = 64;
664 pref = 64;
665 },
653666 .ve => if (size == 64) {
654667 abi = size;
655668 pref = size;
656669 },
657670 else => {},
658671 },
659 .aggregate => if (self.target.os.tag == .windows or
672 .aggregate => if (self.target.os.tag == .uefi or self.target.os.tag == .windows or
660673 self.target.cpu.arch.isARM() or self.target.cpu.arch.isThumb())
661674 {
662675 pref = @min(pref, self.target.ptrBitWidth());