authorgravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-05-05 19:41:23-07:00
committergravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-06-13 02:21:38-07:00
log381a1043eb53971b9fe5bde088211d04e63dfd58
tree2b3d06a7206f4d30ec64c099ebce70ee46547f78
parent6603a9c26cda297e9c0baaa48e2fb263de60484d
signaturelock-open Commit is signed but in an unrecognized format.

ZigObject: enforce min function alignement on riscv


7 files changed, 11 insertions(+), 8 deletions(-)

src/link/Elf/ZigObject.zig+4-1
...@@ -906,7 +906,9 @@ fn updateDeclCode(...@@ -906,7 +906,9 @@ fn updateDeclCode(
906906
907 log.debug("updateDeclCode {}{*}", .{ decl_name.fmt(&mod.intern_pool), decl });907 log.debug("updateDeclCode {}{*}", .{ decl_name.fmt(&mod.intern_pool), decl });
908908
909 const required_alignment = decl.getAlignment(mod);909 const required_alignment = decl.getAlignment(mod).max(
910 target_util.minFunctionAlignment(mod.getTarget()),
911 );
910912
911 const sym = elf_file.symbol(sym_index);913 const sym = elf_file.symbol(sym_index);
912 const esym = &self.local_esyms.items(.elf_sym)[sym.esym_index];914 const esym = &self.local_esyms.items(.elf_sym)[sym.esym_index];
...@@ -1634,6 +1636,7 @@ const log = std.log.scoped(.link);...@@ -1634,6 +1636,7 @@ const log = std.log.scoped(.link);
1634const mem = std.mem;1636const mem = std.mem;
1635const relocation = @import("relocation.zig");1637const relocation = @import("relocation.zig");
1636const trace = @import("../../tracy.zig").trace;1638const trace = @import("../../tracy.zig").trace;
1639const target_util = @import("../../target.zig");
1637const std = @import("std");1640const std = @import("std");
16381641
1639const Air = @import("../../Air.zig");1642const Air = @import("../../Air.zig");
src/target.zig+7
...@@ -431,6 +431,13 @@ pub fn defaultFunctionAlignment(target: std.Target) Alignment {...@@ -431,6 +431,13 @@ pub fn defaultFunctionAlignment(target: std.Target) Alignment {
431 };431 };
432}432}
433433
434pub fn minFunctionAlignment(target: std.Target) Alignment {
435 return switch (target.cpu.arch) {
436 .riscv64 => .@"2",
437 else => .@"1",
438 };
439}
440
434pub fn supportsFunctionAlignment(target: std.Target) bool {441pub fn supportsFunctionAlignment(target: std.Target) bool {
435 return switch (target.cpu.arch) {442 return switch (target.cpu.arch) {
436 .wasm32, .wasm64 => false,443 .wasm32, .wasm64 => false,
test/behavior/align.zig-1
...@@ -311,7 +311,6 @@ test "function alignment" {...@@ -311,7 +311,6 @@ test "function alignment" {
311 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;311 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
312 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;312 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
313 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO313 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
314 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
315314
316 // function alignment is a compile error on wasm32/wasm64315 // function alignment is a compile error on wasm32/wasm64
317 if (native_arch == .wasm32 or native_arch == .wasm64) return error.SkipZigTest;316 if (native_arch == .wasm32 or native_arch == .wasm64) return error.SkipZigTest;
test/behavior/defer.zig-2
...@@ -116,7 +116,6 @@ test "errdefer with payload" {...@@ -116,7 +116,6 @@ test "errdefer with payload" {
116 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO116 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
117 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO117 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
118 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;118 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
119 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
120119
121 const S = struct {120 const S = struct {
122 fn foo() !i32 {121 fn foo() !i32 {
...@@ -139,7 +138,6 @@ test "reference to errdefer payload" {...@@ -139,7 +138,6 @@ test "reference to errdefer payload" {
139 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO138 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
140 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO139 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
141 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO140 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
142 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
143141
144 const S = struct {142 const S = struct {
145 fn foo() !i32 {143 fn foo() !i32 {
test/behavior/optional.zig-1
...@@ -601,7 +601,6 @@ test "cast slice to const slice nested in error union and optional" {...@@ -601,7 +601,6 @@ test "cast slice to const slice nested in error union and optional" {
601 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;601 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
602 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;602 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
603 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;603 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
604 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
605604
606 const S = struct {605 const S = struct {
607 fn inner() !?[]u8 {606 fn inner() !?[]u8 {
test/behavior/switch.zig-2
...@@ -431,7 +431,6 @@ test "else prong of switch on error set excludes other cases" {...@@ -431,7 +431,6 @@ test "else prong of switch on error set excludes other cases" {
431 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO431 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
432 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO432 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
433 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;433 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
434 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
435434
436 const S = struct {435 const S = struct {
437 fn doTheTest() !void {436 fn doTheTest() !void {
...@@ -467,7 +466,6 @@ test "switch prongs with error set cases make a new error set type for capture v...@@ -467,7 +466,6 @@ test "switch prongs with error set cases make a new error set type for capture v
467 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO466 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
468 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO467 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
469 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;468 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
470 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
471469
472 const S = struct {470 const S = struct {
473 fn doTheTest() !void {471 fn doTheTest() !void {
test/behavior/try.zig-1
...@@ -51,7 +51,6 @@ test "`try`ing an if/else expression" {...@@ -51,7 +51,6 @@ test "`try`ing an if/else expression" {
51 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO51 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
52 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO52 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
53 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;53 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
54 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
5554
56 const S = struct {55 const S = struct {
57 fn getError() !void {56 fn getError() !void {