Commit 6d1292552e

Jacob Young <jacobly0@users.noreply.github.com>
2022-12-03 13:35:45
cbe: implement function alignment
1 parent ec3116f
Changed files (3)
lib
src
codegen
test
behavior
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)
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 {
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