aboutsummaryrefslogtreecommitdiff
path: root/src-self-hosted/stage1.zig
diff options
context:
space:
mode:
authorLayne Gustafson <lgustaf1@binghamton.edu>2019-12-17 09:45:30 -0500
committerAndrew Kelley <andrew@ziglang.org>2020-01-19 20:53:18 -0500
commit5bc4690d85bfaade48393c182b2b3aa207ebebc7 (patch)
tree5ab2de0fba2b7b20601d99a1effb9da69f8db750 /src-self-hosted/stage1.zig
parent21908e100e42c5630e1e4253167496fb76238670 (diff)
downloadzig-5bc4690d85bfaade48393c182b2b3aa207ebebc7.tar.gz
zig-5bc4690d85bfaade48393c182b2b3aa207ebebc7.zip
Make targets cmd able to list CPUs and features
Diffstat (limited to 'src-self-hosted/stage1.zig')
-rw-r--r--src-self-hosted/stage1.zig99
1 files changed, 99 insertions, 0 deletions
diff --git a/src-self-hosted/stage1.zig b/src-self-hosted/stage1.zig
index ec683e4ba8..fc6cb18bf2 100644
--- a/src-self-hosted/stage1.zig
+++ b/src-self-hosted/stage1.zig
@@ -6,9 +6,12 @@ const io = std.io;
const mem = std.mem;
const fs = std.fs;
const process = std.process;
+const feature = std.target.feature;
+const cpu = std.target.cpu;
const Allocator = mem.Allocator;
const ArrayList = std.ArrayList;
const Buffer = std.Buffer;
+const Target = std.Target;
const self_hosted_main = @import("main.zig");
const errmsg = @import("errmsg.zig");
const DepTokenizer = @import("dep_tokenizer.zig").Tokenizer;
@@ -527,3 +530,99 @@ export fn stage2_progress_update_node(node: *std.Progress.Node, done_count: usiz
node.activate();
node.context.maybeRefresh();
}
+
+// ABI warning
+export fn stage2_list_features_for_arch(arch_name_ptr: [*]const u8, arch_name_len: usize, show_subfeatures: bool) void {
+ print_features_for_arch(arch_name_ptr[0..arch_name_len], show_subfeatures) catch |err| {
+ std.debug.warn("Failed to list features: {}\n", .{ @errorName(err) });
+ };
+}
+
+fn print_features_for_arch(arch_name: []const u8, show_subfeatures: bool) !void {
+ const stdout_stream = &std.io.getStdOut().outStream().stream;
+
+ const arch = Target.parseArchTag(arch_name) catch {
+ std.debug.warn("Failed to parse arch '{}'\nInvoke 'zig targets' for a list of valid architectures\n", .{ arch_name });
+ return;
+ };
+
+ inline for (@typeInfo(@TagType(Target.Arch)).Enum.fields) |arch_enum_field| {
+ if (@enumToInt(arch) == arch_enum_field.value) {
+ const enum_arch = @intToEnum(@TagType(Target.Arch), arch_enum_field.value);
+
+ const feature_infos = feature.ArchFeature(enum_arch).feature_infos;
+
+ try stdout_stream.print("Available features for {}:\n", .{ arch_enum_field.name });
+
+ var longest_len: usize = 0;
+ for (feature_infos) |feature_info| {
+ if (feature_info.name.len > longest_len) longest_len = feature_info.name.len;
+ }
+
+ for (feature_infos) |feature_info| {
+ try stdout_stream.print(" {}", .{ feature_info.name });
+
+ var i: usize = 0;
+ while (i < longest_len - feature_info.name.len) : (i += 1) {
+ try stdout_stream.write(" ");
+ }
+
+ try stdout_stream.print(" - {}\n", .{ feature_info.description });
+
+ if (show_subfeatures and feature_info.subfeatures.len > 0) {
+ for (feature_info.subfeatures) |subfeature| {
+ try stdout_stream.print(" {}\n", .{ subfeature.getInfo().name });
+ }
+ }
+ }
+ }
+ }
+}
+
+// ABI warning
+export fn stage2_list_cpus_for_arch(arch_name_ptr: [*]const u8, arch_name_len: usize, show_subfeatures: bool) void {
+ print_cpus_for_arch(arch_name_ptr[0..arch_name_len], show_subfeatures) catch |err| {
+ std.debug.warn("Failed to list features: {}\n", .{ @errorName(err) });
+ };
+}
+
+fn print_cpus_for_arch(arch_name: []const u8, show_subfeatures: bool) !void {
+ const stdout_stream = &std.io.getStdOut().outStream().stream;
+
+ const arch = Target.parseArchTag(arch_name) catch {
+ std.debug.warn("Failed to parse arch '{}'\nInvoke 'zig targets' for a list of valid architectures\n", .{ arch_name });
+ return;
+ };
+
+ inline for (@typeInfo(@TagType(Target.Arch)).Enum.fields) |arch_enum_field| {
+ if (@enumToInt(arch) == arch_enum_field.value) {
+ const enum_arch = @intToEnum(@TagType(Target.Arch), arch_enum_field.value);
+
+ const cpu_infos = cpu.ArchCpu(enum_arch).cpu_infos;
+
+ try stdout_stream.print("Available cpus for {}:\n", .{ arch_enum_field.name });
+
+ var longest_len: usize = 0;
+ for (cpu_infos) |cpu_info| {
+ if (cpu_info.name.len > longest_len) longest_len = cpu_info.name.len;
+ }
+
+ for (cpu_infos) |cpu_info| {
+ try stdout_stream.print(" {}", .{ cpu_info.name });
+
+ var i: usize = 0;
+ while (i < longest_len - cpu_info.name.len) : (i += 1) {
+ try stdout_stream.write(" ");
+ }
+
+ try stdout_stream.write("\n");
+
+ if (show_subfeatures and cpu_info.features.len > 0) {
+ for (cpu_info.features) |subfeature| {
+ try stdout_stream.print(" {}\n", .{ subfeature.getInfo().name });
+ }
+ }
+ }
+ }
+ }
+}