| ... | @@ -14,19 +14,20 @@ comptime { | ... | @@ -14,19 +14,20 @@ comptime { |
| 14 | // When the self-hosted compiler is further along, all the logic from c_stage1.zig will | 14 | // When the self-hosted compiler is further along, all the logic from c_stage1.zig will |
| 15 | // be migrated to this file and then c_stage1.zig will be deleted. Until then we have a | 15 | // be migrated to this file and then c_stage1.zig will be deleted. Until then we have a |
| 16 | // simpler implementation of c.zig that only uses features already implemented in self-hosted. | 16 | // simpler implementation of c.zig that only uses features already implemented in self-hosted. |
| 17 | if (builtin.zig_backend != .stage1) { | 17 | if (builtin.zig_backend == .stage1) { |
| 18 | @export(memset, .{ .name = "memset", .linkage = .Strong }); | | |
| 19 | @export(memcpy, .{ .name = "memcpy", .linkage = .Strong }); | | |
| 20 | | | |
| 21 | @export(trunc, .{ .name = "trunc", .linkage = .Strong }); | | |
| 22 | @export(truncf, .{ .name = "truncf", .linkage = .Strong }); | | |
| 23 | @export(truncl, .{ .name = "truncl", .linkage = .Strong }); | | |
| 24 | | | |
| 25 | @export(log, .{ .name = "log", .linkage = .Strong }); | | |
| 26 | @export(logf, .{ .name = "logf", .linkage = .Strong }); | | |
| 27 | } else { | | |
| 28 | _ = @import("c_stage1.zig"); | 18 | _ = @import("c_stage1.zig"); |
| 29 | } | 19 | } |
| | 20 | |
| | 21 | @export(memset, .{ .name = "memset", .linkage = .Strong }); |
| | 22 | @export(__memset, .{ .name = "__memset", .linkage = .Strong }); |
| | 23 | @export(memcpy, .{ .name = "memcpy", .linkage = .Strong }); |
| | 24 | |
| | 25 | @export(trunc, .{ .name = "trunc", .linkage = .Strong }); |
| | 26 | @export(truncf, .{ .name = "truncf", .linkage = .Strong }); |
| | 27 | @export(truncl, .{ .name = "truncl", .linkage = .Strong }); |
| | 28 | |
| | 29 | @export(log, .{ .name = "log", .linkage = .Strong }); |
| | 30 | @export(logf, .{ .name = "logf", .linkage = .Strong }); |
| 30 | } | 31 | } |
| 31 | | 32 | |
| 32 | // Avoid dragging in the runtime safety mechanisms into this .o file, | 33 | // Avoid dragging in the runtime safety mechanisms into this .o file, |
| ... | @@ -65,6 +66,12 @@ fn memset(dest: ?[*]u8, c: u8, len: usize) callconv(.C) ?[*]u8 { | ... | @@ -65,6 +66,12 @@ fn memset(dest: ?[*]u8, c: u8, len: usize) callconv(.C) ?[*]u8 { |
| 65 | return dest; | 66 | return dest; |
| 66 | } | 67 | } |
| 67 | | 68 | |
| | 69 | fn __memset(dest: ?[*]u8, c: u8, n: usize, dest_n: usize) callconv(.C) ?[*]u8 { |
| | 70 | if (dest_n < n) |
| | 71 | @panic("buffer overflow"); |
| | 72 | return memset(dest, c, n); |
| | 73 | } |
| | 74 | |
| 68 | fn memcpy(noalias dest: ?[*]u8, noalias src: ?[*]const u8, len: usize) callconv(.C) ?[*]u8 { | 75 | fn memcpy(noalias dest: ?[*]u8, noalias src: ?[*]const u8, len: usize) callconv(.C) ?[*]u8 { |
| 69 | @setRuntimeSafety(false); | 76 | @setRuntimeSafety(false); |
| 70 | | 77 | |
| ... | @@ -73,7 +80,7 @@ fn memcpy(noalias dest: ?[*]u8, noalias src: ?[*]const u8, len: usize) callconv( | ... | @@ -73,7 +80,7 @@ fn memcpy(noalias dest: ?[*]u8, noalias src: ?[*]const u8, len: usize) callconv( |
| 73 | var s = src.?; | 80 | var s = src.?; |
| 74 | var n = len; | 81 | var n = len; |
| 75 | while (true) { | 82 | while (true) { |
| 76 | d.* = s.*; | 83 | d[0] = s[0]; |
| 77 | n -= 1; | 84 | n -= 1; |
| 78 | if (n == 0) break; | 85 | if (n == 0) break; |
| 79 | d += 1; | 86 | d += 1; |