Merge pull request #22526 from alexrp/cpu-feature-hacks
`std.zig.system`: Move CPU feature hacks after ABI detection.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -399,23 +399,27 @@ 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));
|
||||
}
|
||||
|
||||
// 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));
|
||||
}
|
||||
|
||||
var result = try detectAbiAndDynamicLinker(cpu, os, query);
|
||||
|
||||
// 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));
|
||||
}
|
||||
|
||||
// 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
|
||||
// OS version, we do at least know that some ABIs require a particular OS version (by way of
|
||||
|
||||
Reference in New Issue
Block a user