84f1893c18
in favor of CPU features. Also rearrange the `std.Target` data structure. * note: `@import("builtin")` was already deprecated in favor of `@import("std").builtin`. * `std.builtin.arch` is now deprecated in favor of `std.builtin.cpu.arch`. * `std.Target.CpuFeatures.Cpu` is now `std.Target.Cpu.Model`. * `std.Target.CpuFeatures` is now `std.Target.Cpu`. * `std.Target` no longer has an `arch` field. Instead it has a `cpu` field, which has `arch`, `model`, and `features`. * `std.Target` no longer has a `cpu_features` field. * `std.Target.Arch` is moved to `std.Target.Cpu.Arch` and it is an enum instead of a tagged union. * `std.Target.parseOs` is moved to `std.Target.Os.parse`. * `std.Target.parseAbi` is moved to `std.Target.Abi.parse`. * `std.Target.parseArchSub` is only for arch now and moved to `std.Target.Cpu.Arch.parse`. * `std.Target.parse` is improved to accept CPU name and features. * `std.Target.Arch.getBaselineCpuFeatures` is moved to `std.Target.Cpu.baseline`. * `std.Target.allCpus` is renamed to `std.Target.allCpuModels`. * `std.Target.defaultAbi` is moved to `std.Target.Abi.default`. * Significant cleanup of aarch64 and arm CPU features, resulting in the needed bit count for cpu feature set going from 174 to 138. * Add `std.Target.Cpu.Feature.Set.addFeatureSet` for merging feature sets together. `-target-feature` and `-target-cpu` are removed in favor of `-mcpu`, to conform to established conventions, and it gains additional power to support cpu features. The syntax is: -mcpu=name+on1+on2-off1-off2 closes #4261
236 lines
6.0 KiB
Zig
236 lines
6.0 KiB
Zig
const std = @import("std");
|
|
const fs = std.fs;
|
|
const io = std.io;
|
|
const mem = std.mem;
|
|
const Allocator = mem.Allocator;
|
|
const Target = std.Target;
|
|
|
|
// TODO this is hard-coded until self-hosted gains this information canonically
|
|
const available_libcs = [_][]const u8{
|
|
"aarch64_be-linux-gnu",
|
|
"aarch64_be-linux-musl",
|
|
"aarch64_be-windows-gnu",
|
|
"aarch64-linux-gnu",
|
|
"aarch64-linux-musl",
|
|
"aarch64-windows-gnu",
|
|
"armeb-linux-gnueabi",
|
|
"armeb-linux-gnueabihf",
|
|
"armeb-linux-musleabi",
|
|
"armeb-linux-musleabihf",
|
|
"armeb-windows-gnu",
|
|
"arm-linux-gnueabi",
|
|
"arm-linux-gnueabihf",
|
|
"arm-linux-musleabi",
|
|
"arm-linux-musleabihf",
|
|
"arm-windows-gnu",
|
|
"i386-linux-gnu",
|
|
"i386-linux-musl",
|
|
"i386-windows-gnu",
|
|
"mips64el-linux-gnuabi64",
|
|
"mips64el-linux-gnuabin32",
|
|
"mips64el-linux-musl",
|
|
"mips64-linux-gnuabi64",
|
|
"mips64-linux-gnuabin32",
|
|
"mips64-linux-musl",
|
|
"mipsel-linux-gnu",
|
|
"mipsel-linux-musl",
|
|
"mips-linux-gnu",
|
|
"mips-linux-musl",
|
|
"powerpc64le-linux-gnu",
|
|
"powerpc64le-linux-musl",
|
|
"powerpc64-linux-gnu",
|
|
"powerpc64-linux-musl",
|
|
"powerpc-linux-gnu",
|
|
"powerpc-linux-musl",
|
|
"riscv64-linux-gnu",
|
|
"riscv64-linux-musl",
|
|
"s390x-linux-gnu",
|
|
"s390x-linux-musl",
|
|
"sparc-linux-gnu",
|
|
"sparcv9-linux-gnu",
|
|
"wasm32-freestanding-musl",
|
|
"x86_64-linux-gnu (native)",
|
|
"x86_64-linux-gnux32",
|
|
"x86_64-linux-musl",
|
|
"x86_64-windows-gnu",
|
|
};
|
|
|
|
// TODO this is hard-coded until self-hosted gains this information canonically
|
|
const available_glibcs = [_][]const u8{
|
|
"2.0",
|
|
"2.1",
|
|
"2.1.1",
|
|
"2.1.2",
|
|
"2.1.3",
|
|
"2.2",
|
|
"2.2.1",
|
|
"2.2.2",
|
|
"2.2.3",
|
|
"2.2.4",
|
|
"2.2.5",
|
|
"2.2.6",
|
|
"2.3",
|
|
"2.3.2",
|
|
"2.3.3",
|
|
"2.3.4",
|
|
"2.4",
|
|
"2.5",
|
|
"2.6",
|
|
"2.7",
|
|
"2.8",
|
|
"2.9",
|
|
"2.10",
|
|
"2.11",
|
|
"2.12",
|
|
"2.13",
|
|
"2.14",
|
|
"2.15",
|
|
"2.16",
|
|
"2.17",
|
|
"2.18",
|
|
"2.19",
|
|
"2.22",
|
|
"2.23",
|
|
"2.24",
|
|
"2.25",
|
|
"2.26",
|
|
"2.27",
|
|
"2.28",
|
|
"2.29",
|
|
"2.30",
|
|
};
|
|
|
|
pub fn cmdTargets(
|
|
allocator: *Allocator,
|
|
args: []const []const u8,
|
|
stdout: *io.OutStream(fs.File.WriteError),
|
|
native_target: Target,
|
|
) !void {
|
|
const BOS = io.BufferedOutStream(fs.File.WriteError);
|
|
var bos = BOS.init(stdout);
|
|
var jws = std.json.WriteStream(BOS.Stream, 6).init(&bos.stream);
|
|
|
|
try jws.beginObject();
|
|
|
|
try jws.objectField("arch");
|
|
try jws.beginArray();
|
|
{
|
|
inline for (@typeInfo(Target.Cpu.Arch).Enum.fields) |field| {
|
|
try jws.arrayElem();
|
|
try jws.emitString(field.name);
|
|
}
|
|
}
|
|
try jws.endArray();
|
|
|
|
try jws.objectField("os");
|
|
try jws.beginArray();
|
|
inline for (@typeInfo(Target.Os).Enum.fields) |field| {
|
|
try jws.arrayElem();
|
|
try jws.emitString(field.name);
|
|
}
|
|
try jws.endArray();
|
|
|
|
try jws.objectField("abi");
|
|
try jws.beginArray();
|
|
inline for (@typeInfo(Target.Abi).Enum.fields) |field| {
|
|
try jws.arrayElem();
|
|
try jws.emitString(field.name);
|
|
}
|
|
try jws.endArray();
|
|
|
|
try jws.objectField("libc");
|
|
try jws.beginArray();
|
|
for (available_libcs) |libc| {
|
|
try jws.arrayElem();
|
|
try jws.emitString(libc);
|
|
}
|
|
try jws.endArray();
|
|
|
|
try jws.objectField("glibc");
|
|
try jws.beginArray();
|
|
for (available_glibcs) |glibc| {
|
|
try jws.arrayElem();
|
|
try jws.emitString(glibc);
|
|
}
|
|
try jws.endArray();
|
|
|
|
try jws.objectField("cpus");
|
|
try jws.beginObject();
|
|
inline for (@typeInfo(Target.Cpu.Arch).Enum.fields) |field| {
|
|
try jws.objectField(field.name);
|
|
try jws.beginObject();
|
|
const arch = @field(Target.Cpu.Arch, field.name);
|
|
for (arch.allCpuModels()) |model| {
|
|
try jws.objectField(model.name);
|
|
try jws.beginArray();
|
|
for (arch.allFeaturesList()) |feature, i| {
|
|
if (model.features.isEnabled(@intCast(u8, i))) {
|
|
try jws.arrayElem();
|
|
try jws.emitString(feature.name);
|
|
}
|
|
}
|
|
try jws.endArray();
|
|
}
|
|
try jws.endObject();
|
|
}
|
|
try jws.endObject();
|
|
|
|
try jws.objectField("cpuFeatures");
|
|
try jws.beginObject();
|
|
inline for (@typeInfo(Target.Cpu.Arch).Enum.fields) |field| {
|
|
try jws.objectField(field.name);
|
|
try jws.beginArray();
|
|
const arch = @field(Target.Cpu.Arch, field.name);
|
|
for (arch.allFeaturesList()) |feature| {
|
|
try jws.arrayElem();
|
|
try jws.emitString(feature.name);
|
|
}
|
|
try jws.endArray();
|
|
}
|
|
try jws.endObject();
|
|
|
|
try jws.objectField("native");
|
|
try jws.beginObject();
|
|
{
|
|
const triple = try native_target.zigTriple(allocator);
|
|
defer allocator.free(triple);
|
|
try jws.objectField("triple");
|
|
try jws.emitString(triple);
|
|
}
|
|
{
|
|
try jws.objectField("cpu");
|
|
try jws.beginObject();
|
|
try jws.objectField("arch");
|
|
try jws.emitString(@tagName(native_target.getArch()));
|
|
|
|
try jws.objectField("name");
|
|
const cpu = native_target.getCpu();
|
|
try jws.emitString(cpu.model.name);
|
|
|
|
{
|
|
try jws.objectField("features");
|
|
try jws.beginArray();
|
|
for (native_target.getArch().allFeaturesList()) |feature, i_usize| {
|
|
const index = @intCast(Target.Cpu.Feature.Set.Index, i_usize);
|
|
if (cpu.features.isEnabled(index)) {
|
|
try jws.arrayElem();
|
|
try jws.emitString(feature.name);
|
|
}
|
|
}
|
|
try jws.endArray();
|
|
}
|
|
try jws.endObject();
|
|
}
|
|
try jws.objectField("os");
|
|
try jws.emitString(@tagName(native_target.getOs()));
|
|
try jws.objectField("abi");
|
|
try jws.emitString(@tagName(native_target.getAbi()));
|
|
// TODO implement native glibc version detection in self-hosted
|
|
try jws.endObject();
|
|
|
|
try jws.endObject();
|
|
|
|
try bos.stream.writeByte('\n');
|
|
return bos.flush();
|
|
}
|