Skip to content

Commit acf7043

Browse files
committed
work around llvm failing to lower memcpy
triggers an assertion in LegalizeDAG otherwise
1 parent 59acfb1 commit acf7043

File tree

1 file changed

+26
-2
lines changed

1 file changed

+26
-2
lines changed

lib/compiler_rt/memcpy.zig

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,36 @@ comptime {
99
}
1010
}
1111

12+
const llvm_cannot_lower = switch (builtin.cpu.arch) {
13+
.arm, .armeb, .thumb, .thumbeb => builtin.zig_backend == .stage2_llvm,
14+
else => false,
15+
};
16+
1217
fn memcpy(noalias opt_dest: ?[*]u8, noalias opt_src: ?[*]const u8, len: usize) callconv(.C) ?[*]u8 {
13-
return memmove(opt_dest, opt_src, len);
18+
if (llvm_cannot_lower) {
19+
for (0..len) |i| opt_dest.?[i] = opt_src.?[i];
20+
return opt_dest;
21+
} else {
22+
return memmove(opt_dest, opt_src, len);
23+
}
1424
}
1525

26+
/// A port of https://github.com/facebook/folly/blob/1c8bc50e88804e2a7361a57cd9b551dd10f6c5fd/folly/memcpy.S
1627
fn memmove(opt_dest: ?[*]u8, opt_src: ?[*]const u8, len: usize) callconv(.C) ?[*]u8 {
17-
// a port of https://github.com/facebook/folly/blob/1c8bc50e88804e2a7361a57cd9b551dd10f6c5fd/folly/memcpy.S
28+
if (llvm_cannot_lower) {
29+
if (@intFromPtr(opt_dest) < @intFromPtr(opt_src)) {
30+
for (0..len) |i| opt_dest.?[i] = opt_src.?[i];
31+
return opt_dest;
32+
} else {
33+
var index = len;
34+
while (index != 0) {
35+
index -= 1;
36+
opt_dest.?[index] = opt_src.?[index];
37+
}
38+
return opt_dest;
39+
}
40+
}
41+
1842
if (len == 0) {
1943
@branchHint(.unlikely);
2044
return opt_dest;

0 commit comments

Comments
 (0)