From 9a77743cc71008d7186614212e542eb2d930af57 Mon Sep 17 00:00:00 2001 From: kcbanner Date: Tue, 13 Dec 2022 21:58:03 -0500 Subject: [PATCH] cbe: add doNotOptimizeAwayC to handle not having __asm support in msvc --- lib/std/mem.zig | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/lib/std/mem.zig b/lib/std/mem.zig index 774db2caa4..42b35281e0 100644 --- a/lib/std/mem.zig +++ b/lib/std/mem.zig @@ -3771,7 +3771,7 @@ pub fn doNotOptimizeAway(val: anytype) void { .Bool => doNotOptimizeAway(@boolToInt(val)), .Int => { const bits = t.Int.bits; - if (bits <= max_gp_register_bits) { + if (bits <= max_gp_register_bits and builtin.zig_backend != .stage2_c) { const val2 = @as( std.meta.Int(t.Int.signedness, @max(8, std.math.ceilPowerOfTwoAssert(u16, bits))), val, @@ -3783,18 +3783,24 @@ pub fn doNotOptimizeAway(val: anytype) void { } else doNotOptimizeAway(&val); }, .Float => { - if (t.Float.bits == 32 or t.Float.bits == 64) { + if ((t.Float.bits == 32 or t.Float.bits == 64) and builtin.zig_backend != .stage2_c) { asm volatile ("" : : [val] "rm" (val), ); } else doNotOptimizeAway(&val); }, - .Pointer => asm volatile ("" - : - : [val] "m" (val), - : "memory" - ), + .Pointer => { + if (builtin.zig_backend == .stage2_c) { + doNotOptimizeAwayC(val); + } else { + asm volatile ("" + : + : [val] "m" (val), + : "memory" + ); + } + }, .Array => { if (t.Array.len * @sizeOf(t.Array.child) <= 64) { for (val) |v| doNotOptimizeAway(v); @@ -3804,6 +3810,16 @@ pub fn doNotOptimizeAway(val: anytype) void { } } +/// .stage2_c doesn't support asm blocks yet, so use volatile stores instead +var deopt_target: if (builtin.zig_backend == .stage2_c) u8 else void = undefined; +fn doNotOptimizeAwayC(ptr: anytype) void { + const dest = @ptrCast(*volatile u8, &deopt_target); + for (asBytes(ptr)) |b| { + dest.* = b; + } + dest.* = 0; +} + test "doNotOptimizeAway" { comptime doNotOptimizeAway("test");