aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/c.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-09-15 12:37:32 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-09-15 12:37:32 -0700
commit19691c0b174f283ffe5b6c3fe8533ef458736064 (patch)
tree802390ce8ad5d29cc72450262efd4b13140f5f20 /src/codegen/c.zig
parente5fd45003e56f152364a4bdc609fda07a6b524fd (diff)
downloadzig-19691c0b174f283ffe5b6c3fe8533ef458736064.tar.gz
zig-19691c0b174f283ffe5b6c3fe8533ef458736064.zip
stage2: implement `@fence`
Diffstat (limited to 'src/codegen/c.zig')
-rw-r--r--src/codegen/c.zig12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig
index ff49b18f7b..a2e2d7b20d 100644
--- a/src/codegen/c.zig
+++ b/src/codegen/c.zig
@@ -842,6 +842,7 @@ fn genBody(o: *Object, body: []const Air.Inst.Index) error{ AnalysisFail, OutOfM
.breakpoint => try airBreakpoint(o),
.unreach => try airUnreach(o),
+ .fence => try airFence(o, inst),
// TODO use a different strategy for add that communicates to the optimizer
// that wrapping is UB.
@@ -1439,6 +1440,17 @@ fn airBreakpoint(o: *Object) !CValue {
return CValue.none;
}
+fn airFence(o: *Object, inst: Air.Inst.Index) !CValue {
+ const atomic_order = o.air.instructions.items(.data)[inst].fence;
+ const writer = o.writer();
+
+ try writer.writeAll("zig_fence(");
+ try writeMemoryOrder(writer, atomic_order);
+ try writer.writeAll(");\n");
+
+ return CValue.none;
+}
+
fn airUnreach(o: *Object) !CValue {
try o.writer().writeAll("zig_unreachable();\n");
return CValue.none;