Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 2 additions & 26 deletions lib/compiler_rt/memcpy.zig
Original file line number Diff line number Diff line change
Expand Up @@ -9,36 +9,12 @@ comptime {
}
}

const llvm_cannot_lower = switch (builtin.cpu.arch) {
.arm, .armeb, .thumb, .thumbeb => builtin.zig_backend == .stage2_llvm,
else => false,
};

fn memcpy(noalias opt_dest: ?[*]u8, noalias opt_src: ?[*]const u8, len: usize) callconv(.C) ?[*]u8 {
if (llvm_cannot_lower) {
for (0..len) |i| opt_dest.?[i] = opt_src.?[i];
return opt_dest;
} else {
return memmove(opt_dest, opt_src, len);
}
return memmove(opt_dest, opt_src, len);
}

/// A port of https://github.com/facebook/folly/blob/1c8bc50e88804e2a7361a57cd9b551dd10f6c5fd/folly/memcpy.S
fn memmove(opt_dest: ?[*]u8, opt_src: ?[*]const u8, len: usize) callconv(.C) ?[*]u8 {
if (llvm_cannot_lower) {
if (@intFromPtr(opt_dest) < @intFromPtr(opt_src)) {
for (0..len) |i| opt_dest.?[i] = opt_src.?[i];
return opt_dest;
} else {
var index = len;
while (index != 0) {
index -= 1;
opt_dest.?[index] = opt_src.?[index];
}
return opt_dest;
}
}

// a port of https://github.com/facebook/folly/blob/1c8bc50e88804e2a7361a57cd9b551dd10f6c5fd/folly/memcpy.S
if (len == 0) {
@branchHint(.unlikely);
return opt_dest;
Expand Down
32 changes: 18 additions & 14 deletions lib/std/zig/system.zig
Original file line number Diff line number Diff line change
Expand Up @@ -399,22 +399,26 @@ pub fn resolveTargetQuery(query: Target.Query) DetectError!Target {
query.cpu_features_sub,
);

if (cpu.arch == .hexagon) {
// Both LLVM and LLD have broken support for the small data area. Yet LLVM has the feature
// on by default for all Hexagon CPUs. Clang sort of solves this by defaulting the `-gpsize`
// command line parameter for the Hexagon backend to 0, so that no constants get placed in
// the SDA. (This of course breaks down if the user passes `-G <n>` to Clang...) We can't do
// the `-gpsize` hack because we can have multiple concurrent LLVM emit jobs, and command
// line options in LLVM are shared globally. So just force this feature off. Lovely stuff.
cpu.features.removeFeature(@intFromEnum(Target.hexagon.Feature.small_data));
}
var result = try detectAbiAndDynamicLinker(cpu, os, query);

// https://github.com/llvm/llvm-project/issues/105978
if (cpu.arch.isArm() and query_abi.floatAbi() == .soft) {
cpu.features.removeFeature(@intFromEnum(Target.arm.Feature.vfp2));
}
// These CPU feature hacks have to come after ABI detection.
{
if (result.cpu.arch == .hexagon) {
// Both LLVM and LLD have broken support for the small data area. Yet LLVM has the
// feature on by default for all Hexagon CPUs. Clang sort of solves this by defaulting
// the `-gpsize` command line parameter for the Hexagon backend to 0, so that no
// constants get placed in the SDA. (This of course breaks down if the user passes
// `-G <n>` to Clang...) We can't do the `-gpsize` hack because we can have multiple
// concurrent LLVM emit jobs, and command line options in LLVM are shared globally. So
// just force this feature off. Lovely stuff.
result.cpu.features.removeFeature(@intFromEnum(Target.hexagon.Feature.small_data));
}

var result = try detectAbiAndDynamicLinker(cpu, os, query);
// https://github.com/llvm/llvm-project/issues/105978
if (result.cpu.arch.isArm() and result.abi.floatAbi() == .soft) {
result.cpu.features.removeFeature(@intFromEnum(Target.arm.Feature.vfp2));
}
}

// It's possible that we detect the native ABI, but fail to detect the OS version or were told
// to use the default OS version range. In that case, while we can't determine the exact native
Expand Down