authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-11-02 13:55:24-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-11-03 20:05:32-07:00
logf8c24c2cd012a93fd005480411bf0936933e2fbb
treed47f5395d87152d704524bd80e7365c7ba3e10f1
parent1ccc68f307d4a2208118a8798d43119d63b53e05

add zig reduce subcommand

Also adds `-Donly-reduce` flag in build.zig which disables LLVM and irrelevant code for faster iteration cycles.

3 files changed, 60 insertions(+), 0 deletions(-)

build.zig+8
......@@ -33,6 +33,7 @@ pub fn build(b: *std.Build) !void {
3333 const skip_install_langref = b.option(bool, "no-langref", "skip copying of langref to the installation prefix") orelse skip_install_lib_files;
3434 const skip_install_autodocs = b.option(bool, "no-autodocs", "skip copying of standard library autodocs to the installation prefix") orelse skip_install_lib_files;
3535 const no_bin = b.option(bool, "no-bin", "skip emitting compiler binary") orelse false;
36 const only_reduce = b.option(bool, "only-reduce", "only build zig reduce") orelse false;
3637
3738 const docgen_exe = b.addExecutable(.{
3839 .name = "docgen",
......@@ -193,6 +194,10 @@ pub fn build(b: *std.Build) !void {
193194 };
194195
195196 const exe = addCompilerStep(b, optimize, target);
197 if (only_reduce) {
198 exe.use_llvm = false;
199 exe.use_lld = false;
200 }
196201 exe.strip = strip;
197202 exe.pie = pie;
198203 exe.sanitize_thread = sanitize_thread;
......@@ -236,6 +241,7 @@ pub fn build(b: *std.Build) !void {
236241 exe_options.addOption(bool, "force_gpa", force_gpa);
237242 exe_options.addOption(bool, "only_c", only_c);
238243 exe_options.addOption(bool, "only_core_functionality", only_c);
244 exe_options.addOption(bool, "only_reduce", only_reduce);
239245
240246 if (link_libc) {
241247 exe.linkLibC();
......@@ -391,6 +397,7 @@ pub fn build(b: *std.Build) !void {
391397 test_cases_options.addOption(bool, "force_gpa", force_gpa);
392398 test_cases_options.addOption(bool, "only_c", only_c);
393399 test_cases_options.addOption(bool, "only_core_functionality", true);
400 test_cases_options.addOption(bool, "only_reduce", false);
394401 test_cases_options.addOption(bool, "enable_qemu", b.enable_qemu);
395402 test_cases_options.addOption(bool, "enable_wine", b.enable_wine);
396403 test_cases_options.addOption(bool, "enable_wasmtime", b.enable_wasmtime);
......@@ -549,6 +556,7 @@ fn addWasiUpdateStep(b: *std.Build, version: [:0]const u8) !void {
549556 exe_options.addOption(bool, "enable_tracy_allocation", false);
550557 exe_options.addOption(bool, "value_tracing", false);
551558 exe_options.addOption(bool, "only_core_functionality", true);
559 exe_options.addOption(bool, "only_reduce", false);
552560
553561 const run_opt = b.addSystemCommand(&.{
554562 "wasm-opt",
src/main.zig+8
......@@ -212,6 +212,14 @@ pub fn main() anyerror!void {
212212 }
213213 }
214214
215 if (build_options.only_reduce) {
216 if (mem.eql(u8, args[1], "reduce")) {
217 return @import("reduce.zig").main(gpa, arena, args);
218 } else {
219 @panic("only reduce is supported in a -Donly-reduce build");
220 }
221 }
222
215223 return mainArgs(gpa, arena, args);
216224}
217225
src/reduce.zig created+44
......@@ -0,0 +1,44 @@
1const std = @import("std");
2const Allocator = std.mem.Allocator;
3const assert = std.debug.assert;
4
5const usage =
6 \\zig reduce [source_file] [transformation]
7 \\
8;
9
10const Transformation = enum {
11 none,
12};
13
14pub fn main(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
15 const file_path = args[2];
16 const transformation = std.meta.stringToEnum(Transformation, args[3]);
17
18 assert(transformation == .none);
19
20 const source_code = try std.fs.cwd().readFileAllocOptions(
21 arena,
22 file_path,
23 std.math.maxInt(u32),
24 null,
25 1,
26 0,
27 );
28
29 var tree = try std.zig.Ast.parse(gpa, source_code, .zig);
30 defer tree.deinit(gpa);
31
32 if (tree.errors.len != 0) {
33 @panic("syntax errors occurred");
34 }
35 var rendered = std.ArrayList(u8).init(gpa);
36 defer rendered.deinit();
37 rendered.clearRetainingCapacity();
38 try tree.renderToArrayList(&rendered);
39
40 const stdout = std.io.getStdOut();
41 try stdout.writeAll(rendered.items);
42
43 return std.process.cleanExit();
44}