diff --git a/src/link/Elf/ZigObject.zig b/src/link/Elf/ZigObject.zig index b27601b420ee84b4e43fac335305ccb527f16054..451c363f568e395c2ec8fc5f05e7ff38b77e127f 100644 --- a/src/link/Elf/ZigObject.zig +++ b/src/link/Elf/ZigObject.zig @@ -906,7 +906,9 @@ fn updateDeclCode( log.debug("updateDeclCode {}{*}", .{ decl_name.fmt(&mod.intern_pool), decl }); - const required_alignment = decl.getAlignment(mod); + const required_alignment = decl.getAlignment(mod).max( + target_util.minFunctionAlignment(mod.getTarget()), + ); const sym = elf_file.symbol(sym_index); const esym = &self.local_esyms.items(.elf_sym)[sym.esym_index]; @@ -1634,6 +1636,7 @@ const log = std.log.scoped(.link); const mem = std.mem; const relocation = @import("relocation.zig"); const trace = @import("../../tracy.zig").trace; +const target_util = @import("../../target.zig"); const std = @import("std"); const Air = @import("../../Air.zig"); diff --git a/src/target.zig b/src/target.zig index 6af301e001015817013a267a9d517ad5b912bbee..8f6473ba8eff9a2631dbebddabf21544aae61fa5 100644 --- a/src/target.zig +++ b/src/target.zig @@ -431,6 +431,13 @@ pub fn defaultFunctionAlignment(target: std.Target) Alignment { }; } +pub fn minFunctionAlignment(target: std.Target) Alignment { + return switch (target.cpu.arch) { + .riscv64 => .@"2", + else => .@"1", + }; +} + pub fn supportsFunctionAlignment(target: std.Target) bool { return switch (target.cpu.arch) { .wasm32, .wasm64 => false, diff --git a/test/behavior/align.zig b/test/behavior/align.zig index 3e22d8e175d718cfe721651c35eaa93676d0163c..533b5dce7799e23a6c415259ed115ddc83abe70b 100644 --- a/test/behavior/align.zig +++ b/test/behavior/align.zig @@ -311,7 +311,6 @@ test "function alignment" { if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // function alignment is a compile error on wasm32/wasm64 if (native_arch == .wasm32 or native_arch == .wasm64) return error.SkipZigTest; diff --git a/test/behavior/defer.zig b/test/behavior/defer.zig index 4ea6f5478778d727844116899402f98f1216c125..fc764f55e3ab576749407794fd3b1fdeec80cf2e 100644 --- a/test/behavior/defer.zig +++ b/test/behavior/defer.zig @@ -116,7 +116,6 @@ test "errdefer with payload" { if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; const S = struct { fn foo() !i32 { @@ -139,7 +138,6 @@ test "reference to errdefer payload" { if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; const S = struct { fn foo() !i32 { diff --git a/test/behavior/optional.zig b/test/behavior/optional.zig index 5af4e42b5c0a380227f0e7cd8752ba928f75e0b2..ad90d5fd0aa1f1619167547df36cf8c4fec7537c 100644 --- a/test/behavior/optional.zig +++ b/test/behavior/optional.zig @@ -601,7 +601,6 @@ test "cast slice to const slice nested in error union and optional" { if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; const S = struct { fn inner() !?[]u8 { diff --git a/test/behavior/switch.zig b/test/behavior/switch.zig index b875caa94a5a730ba8ee081992d5390ebd1793c1..8db6989b98502910f4c822fb3e4ad2c15e48f81a 100644 --- a/test/behavior/switch.zig +++ b/test/behavior/switch.zig @@ -431,7 +431,6 @@ test "else prong of switch on error set excludes other cases" { if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; const S = struct { fn doTheTest() !void { @@ -467,7 +466,6 @@ test "switch prongs with error set cases make a new error set type for capture v if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; const S = struct { fn doTheTest() !void { diff --git a/test/behavior/try.zig b/test/behavior/try.zig index 53fdc48934575009ae833201ca0000ba091bf2c6..cc76658e937ccb2c28b1c7a847ce05a770ccc7bd 100644 --- a/test/behavior/try.zig +++ b/test/behavior/try.zig @@ -51,7 +51,6 @@ test "`try`ing an if/else expression" { if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; const S = struct { fn getError() !void {