From 6d1292552e14a5678f069c1880adf04022951138 Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Sat, 3 Dec 2022 07:35:45 -0500 Subject: [PATCH] cbe: implement function alignment --- lib/zig.h | 11 ++++++++++- src/codegen/c.zig | 1 + test/behavior/align.zig | 1 - 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/zig.h b/lib/zig.h index 7f120efb4e..f827af1d5c 100644 --- a/lib/zig.h +++ b/lib/zig.h @@ -65,8 +65,17 @@ typedef char bool; #elif zig_has_attribute(aligned) #define zig_align(alignment) __attribute__((aligned(alignment))) #elif _MSC_VER +#define zig_align zig_align_unavailable #else -#error the C compiler being used does not support aligning variables +#define zig_align zig_align_unavailable +#endif + +#if zig_has_attribute(aligned) +#define zig_align_fn(alignment) __attribute__((aligned(alignment))) +#elif _MSC_VER +#define zig_align_fn zig_align_fn_unavailable +#else +#define zig_align_fn zig_align_fn_unavailable #endif #if zig_has_builtin(unreachable) diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 75d705003c..a5767d2d25 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -1387,6 +1387,7 @@ pub const DeclGen = struct { try dg.renderType(w, Type.void, kind); } try w.writeByte(')'); + if (fn_info.alignment > 0) try w.print(" zig_align_fn({})", .{fn_info.alignment}); } fn renderPtrToFnTypedef(dg: *DeclGen, t: Type) error{ OutOfMemory, AnalysisFail }![]const u8 { diff --git a/test/behavior/align.zig b/test/behavior/align.zig index 912e7cfdb6..884b6d23c9 100644 --- a/test/behavior/align.zig +++ b/test/behavior/align.zig @@ -520,7 +520,6 @@ test "align(@alignOf(T)) T does not force resolution of T" { test "align(N) on functions" { if (builtin.zig_backend == .stage1) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO 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_sparc64) return error.SkipZigTest; // TODO