From 7f318ac72c2f3b5b598fd009b868d0f7aa04b4be Mon Sep 17 00:00:00 2001 From: "Ben L. Titzer" Date: Sun, 25 Aug 2024 12:41:16 -0400 Subject: [PATCH 1/3] Update issues --- issues.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/issues.txt b/issues.txt index e1810fdd..67aa4632 100644 --- a/issues.txt +++ b/issues.txt @@ -91,13 +91,17 @@ Monitors + trace - engine: gc, compile, load, verify LoopMonitor track and display loop count distribution, improve display ConstArgs track runtime function argument uniqueness to detect specialization/inlining opportunities + Interactive - show an interactive, terminal-animated view of execution, e.g. which function + func | xxx xx | <- color indicates how recent / hot + mem | ====== | + Test Coverage -------------------------------- Interpreter doCallHost of null host function - doCallFunction of host function + doCallFunction of host function pushFrame of EXTERNREF, FUNCREF, RefNullFunc locals traceCallHostFunction deeper than 0 loop unbounded From c76cd6e91a004c7eb188bde30d2f90249addc332 Mon Sep 17 00:00:00 2001 From: "Ben L. Titzer" Date: Sun, 25 Aug 2024 17:51:38 -0400 Subject: [PATCH 2/3] WIP refactor handling of engine options --- src/engine/BinParser.v3 | 4 +- src/engine/EngineOptions.v3 | 63 ++++++---------------- src/engine/TraceOptions.v3 | 22 ++++---- src/engine/x86-64/X86_64Stack.v3 | 2 +- src/engine/x86-64/X86_64Target.v3 | 2 +- src/monitors/BranchMonitor.v3 | 7 ++- src/monitors/FuncProfileMonitor.v3 | 4 +- src/monitors/HotnessMonitor.v3 | 6 +-- src/monitors/InstrCountMonitor.v3 | 4 +- src/monitors/LoopMonitor.v3 | 6 +-- src/monitors/MemStatsMonitor.v3 | 6 +-- src/monitors/MonitorOptions.v3 | 29 +++++----- src/monitors/OpcodeMonitor.v3 | 4 +- src/util/Help.v3 | 86 ++++++++++++++++++++++++++++++ src/wizeng.main.v3 | 86 ++++++++++-------------------- 15 files changed, 172 insertions(+), 159 deletions(-) create mode 100644 src/util/Help.v3 diff --git a/src/engine/BinParser.v3 b/src/engine/BinParser.v3 index 3c119a79..5eb5d05a 100644 --- a/src/engine/BinParser.v3 +++ b/src/engine/BinParser.v3 @@ -9,7 +9,7 @@ class BinParser(extensions: Extension.set, limits: Limits, filename: string) ext def err = ErrorGen.new(filename); var tiering: ExecutionStrategy; var validate_code = true; - var names = true; + var names = !EngineOptions.NO_NAMES.get(); private def cache = Canon.globalCache; private var validator: CodeValidator; @@ -153,7 +153,7 @@ class BinParser(extensions: Extension.set, limits: Limits, filename: string) ext } var payload = decoder.readN(payload_len); module.custom_sections.put(CustomSection.new(name, payload)); - if (EngineOptions.names && Strings.equal("name", name)) module.names = NameSection.new(module, payload); + if (names && Strings.equal("name", name)) module.names = NameSection.new(module, payload); } def readLoop(thing_name: string, count: int, read: int -> void) { for (i < count) { diff --git a/src/engine/EngineOptions.v3 b/src/engine/EngineOptions.v3 index 4b0972a6..21cd1404 100644 --- a/src/engine/EngineOptions.v3 +++ b/src/engine/EngineOptions.v3 @@ -3,13 +3,13 @@ // Parses command-line options that configure an engine. component EngineOptions { - var stackSize = 512u * 1024u; // default value stack size - var jitFilter: DeclFilter; // debugging option to limit JIT compilations - var names = true; // recognize names section + var group = Help.newGroup("ENGINE", printHelp); + def DEFAULT_STACK_SIZE = 512u * 1024u; + def NO_NAMES = group.newBoolOption("no-names", false, "Disables printing of Wasm names from the name section."); + def STACK_SIZE = group.newSizeOption("stack-size", DEFAULT_STACK_SIZE, "Initial stack size in bytes for Wasm execution stacks."); + def JIT_FILTER = group.newDeclFilterOption("jit-filter", "Filters functions compiled by the JIT."); def parse(engine: Engine, arg: string) -> bool { - if (arg == null) return false; - if (arg.length < 1 || arg[0] != '-') return false; if (Strings.startsWith(arg, "-ext:")) { if (Strings.endsWithFrom(arg, 5, "all")) { engine.extensions = Extension.set.all; @@ -22,52 +22,17 @@ component EngineOptions { } } } - if (Strings.startsWith(arg, "-stack-size=")) { - stackSize = parseSize(arg, 12); - Trace.OUT.put1("stack size = %d", stackSize).ln(); - return true; - } if (Strings.startsWith(arg, "-mode=")) { return ExecuteOptions.setMode(arg[6 ...]); } - if (Strings.equal(arg, "-no-names")) { - EngineOptions.names = false; - return true; - } - var jitFilterEq = "-jit-filter="; - if (Strings.startsWith(arg, jitFilterEq)) { - var pat: string; - if (arg.length > jitFilterEq.length) { - pat = Arrays.range(arg, jitFilterEq.length, arg.length); - } - jitFilter = DeclFilters.parseString(pat); - return true; - } return false; } - def parseSize(str: string, pos: int) -> u32 { - var len = str.length; - var last = str[len - 1], scale = 1u, max = u32.max; - match(last) { - 'k', 'K' => { scale = 1024u; max = 4194304u; len--; } - 'm', 'M' => { scale = 1048576u; max = 4096u; len--; } - 'g', 'G' => { scale = 1073741824u; max = 4u; len--; } - } - var p = Ints.parsePosDecimal(str, pos); - if (pos + p.0 == len) { - if (p.1 >= max) return u32.max; - return p.1 * scale; - } - return 0; - } - def printHelp() { - var out = Trace.OUT, H = out.putsln; - H("ENGINE OPTIONS"); - H(""); - H("Wizard supports a number of WebAssembly extensions. None are enabled by default."); - H("Each extension can be enabled independently with its own flag. Some extensions imply"); - H("other extensions as indicated below."); - H(""); + def printHelp(out: TraceBuilder) { + var H = out.putsln, L = out.ln; + H("Wizard supports a number of engine-wide options which enable extensions and configure"); + H("the execution mode. Each extension can be enabled independently with its own flag."); + H("Some extensions imply other extensions as indicated below."); + L(); for (e in Extension) { out.puts(" -ext:"); @@ -90,7 +55,9 @@ component EngineOptions { out.ln(); } } - H(""); - ExecuteOptions.printHelp(); + L(); + H("Other engine configuration options include:"); + L(); + group.print(out); } } diff --git a/src/engine/TraceOptions.v3 b/src/engine/TraceOptions.v3 index 86111e63..6115a9dd 100644 --- a/src/engine/TraceOptions.v3 +++ b/src/engine/TraceOptions.v3 @@ -20,6 +20,12 @@ enum TraceOption(ch: byte, help: string) { // Parses and updates trace options based on arguments. component TraceOptions { + def group = Help.newGroup("TRACING", printHelp); + def FATAL = group.newFlag("fatal", setFatal, "Aborts upon parsing, validation, or test failure."); + + def setFatal(str: string) { + if (str == null || Strings.equal(str, "true")) Trace.fatal = true; + } // Parse command-line argument and update trace flags. Return {true} if the // argument was matched as a trace flag. def parse(arg: string) -> bool { @@ -48,8 +54,6 @@ component TraceOptions { Trace.callsFilter = DeclFilters.parseString(pat); return true; } - } else if (Strings.equal(arg, "-fatal")) { - return Trace.fatal = true; } else if (Strings.startsWith(arg, "-t")) { for (i = 2; i < arg.length; i++) { var ch = arg[i]; @@ -78,11 +82,8 @@ component TraceOptions { whamm => Trace.whamm = true; } } - def printHelp() { - var out = Trace.OUT, H = out.putsln; - H(""); - H("TRACE OPTIONS"); - H(""); + def printHelp(out: TraceBuilder) { + var H = out.putsln; H("A number of tracing options enable debugging output from various components of the engine."); H("These options help debug both the engine and wasm modules, including ones that are"); H("malformed or have type errors."); @@ -107,11 +108,6 @@ component TraceOptions { H(" --trace-calls=[]"); H(" Trace calls into and out of the given functions(s). The pattern can use function"); H(" names from the module or function indexes."); - - H(""); - out.puts(" -fatal"); - out.pad(' ', 32); - out.puts("print stack trace and exit on module errors"); - out.ln().ln(); + group.print(out); } } diff --git a/src/engine/x86-64/X86_64Stack.v3 b/src/engine/x86-64/X86_64Stack.v3 index 5978d227..8ec8ab36 100644 --- a/src/engine/x86-64/X86_64Stack.v3 +++ b/src/engine/x86-64/X86_64Stack.v3 @@ -928,7 +928,7 @@ component X86_64StackManager { var cache: X86_64Stack; def getFreshStack() -> X86_64Stack { - if (cache == null) return X86_64Stack.new(EngineOptions.stackSize); + if (cache == null) return X86_64Stack.new(EngineOptions.STACK_SIZE.get()); var result = cache; cache = null; return result; diff --git a/src/engine/x86-64/X86_64Target.v3 b/src/engine/x86-64/X86_64Target.v3 index 545db88b..82177f01 100644 --- a/src/engine/x86-64/X86_64Target.v3 +++ b/src/engine/x86-64/X86_64Target.v3 @@ -386,7 +386,7 @@ def allocateCodeForModule(module: Module, codeSize: int) { } def applyJitFilter(module: Module, func: FuncDecl, how: string) -> bool { - var filter = EngineOptions.jitFilter; + var filter = EngineOptions.JIT_FILTER.get(); if (filter == null || filter.matches(module, func)) return true; Trace.OUT.put2("func[%d] %s compile suppressed by filter", func.func_index, how).ln(); return false; diff --git a/src/monitors/BranchMonitor.v3 b/src/monitors/BranchMonitor.v3 index ad263920..59f87736 100644 --- a/src/monitors/BranchMonitor.v3 +++ b/src/monitors/BranchMonitor.v3 @@ -37,17 +37,16 @@ class BranchMonitor extends Monitor { i.loops = false; i.ends = false; - if(MonitorOptions.csv) OUT.puts("branch,func,pc,instruction,taken_paths\n"); + if (MonitorOptions.CSV.val) OUT.puts("branch,func,pc,instruction,taken_paths\n"); ModuleInstrumenter.new(module).forEachFunc(instrument(_, _, i)); } def instrument(mm: ModuleInstrumenter, func: FuncDecl, i: ControlInstrumenter) { var ins = i.instrument(mm.module, func); if (ins != null){ - if(MonitorOptions.csv){ + if (MonitorOptions.CSV.val){ MonitorRegistry.addReport(printCSV(mm.module, ins, _)); - } - else{ + } else { MonitorRegistry.addReport(print(mm.module, ins, _)); } } diff --git a/src/monitors/FuncProfileMonitor.v3 b/src/monitors/FuncProfileMonitor.v3 index 1c10e3b5..f87a2c06 100644 --- a/src/monitors/FuncProfileMonitor.v3 +++ b/src/monitors/FuncProfileMonitor.v3 @@ -146,7 +146,7 @@ def output(entries: Vector) { } out.reset(); - if (MonitorOptions.csv) table.putCsvHeader(out); + if (MonitorOptions.CSV.val) table.putCsvHeader(out); else table.putTableHeader(out); out.flush(); @@ -159,7 +159,7 @@ def output(entries: Vector) { C[1].putd(count); C[2].putd(cumul); TraceUtil.renderPercent(C[3], long.view(e.cumul), long.view(total), 3); - if (MonitorOptions.csv) table.putCsvRow(out); + if (MonitorOptions.CSV.val) table.putCsvRow(out); else table.putTableRow(out); out.flush(); } diff --git a/src/monitors/HotnessMonitor.v3 b/src/monitors/HotnessMonitor.v3 index 64579239..06b85e61 100644 --- a/src/monitors/HotnessMonitor.v3 +++ b/src/monitors/HotnessMonitor.v3 @@ -40,11 +40,9 @@ class HotnessMonitor extends Monitor { def onFinish(i: Instance, r: Result) { if (inCodeMode){ hotness.reportCode(); - } - else if (MonitorOptions.csv){ + } else if (MonitorOptions.CSV.val){ hotness.reportCSV(); - } - else{ + } else { hotness.report(); } } diff --git a/src/monitors/InstrCountMonitor.v3 b/src/monitors/InstrCountMonitor.v3 index 3bb094d4..65a0f84c 100644 --- a/src/monitors/InstrCountMonitor.v3 +++ b/src/monitors/InstrCountMonitor.v3 @@ -80,7 +80,7 @@ def output(entries: Vector<(FuncDecl, int, CountProbe)>, names: NameSection) { var out = Trace.OUT, C = table.cells; C[1].color = Color.COUNT; C[2].color = Color.COUNT; - if (MonitorOptions.csv) { + if (MonitorOptions.CSV.val) { table.putCsvHeader(out); } else { var maxlen = int.!(C[0].width); @@ -105,7 +105,7 @@ def output(entries: Vector<(FuncDecl, int, CountProbe)>, names: NameSection) { func.render(names, C[0]); C[1].putd(instrs); C[2].putd(count); - if (MonitorOptions.csv) table.putCsvRow(out); + if (MonitorOptions.CSV.val) table.putCsvRow(out); else table.putTableRow(out); out.flush(); } diff --git a/src/monitors/LoopMonitor.v3 b/src/monitors/LoopMonitor.v3 index 65a88f72..f1630a71 100644 --- a/src/monitors/LoopMonitor.v3 +++ b/src/monitors/LoopMonitor.v3 @@ -38,11 +38,11 @@ class LoopMonitor extends Monitor { def onFinish(i: Instance, r: Result) { if (inCodeMode){ reportCodeMode(entries); - } - else if (MonitorOptions.csv){ + } else if (MonitorOptions.CSV.val) { reportCsv(entries); + } else { + report(entries); } - else report(entries); } private def instrument(mm: ModuleInstrumenter, func: FuncDecl) { diff --git a/src/monitors/MemStatsMonitor.v3 b/src/monitors/MemStatsMonitor.v3 index eefc6599..b6ecfcc9 100644 --- a/src/monitors/MemStatsMonitor.v3 +++ b/src/monitors/MemStatsMonitor.v3 @@ -190,7 +190,7 @@ def print(stats: MemStats, unused: void) { var C = table.cells; C[1].color = Color.COUNT; C[2].color = Color.COUNT; - if (MonitorOptions.csv) table.putCsvHeader(Trace.OUT); + if (MonitorOptions.CSV.val) table.putCsvHeader(Trace.OUT); else table.putTableHeader(Trace.OUT); Trace.OUT.flush(); @@ -210,11 +210,11 @@ def print(stats: MemStats, unused: void) { C[1].putd(reads); C[2].putd(writes); - if (MonitorOptions.csv) table.putCsvRow(Trace.OUT); + if (MonitorOptions.CSV.val) table.putCsvRow(Trace.OUT); else table.putTableRow(Trace.OUT); Trace.OUT.flush(); - if (!MonitorOptions.csv && reads == 0 && writes == 0) { + if (!MonitorOptions.CSV.val && reads == 0 && writes == 0) { var j = i + 1; while (j < max - 1) { if (j >= r.length || r[j] > 0) break; diff --git a/src/monitors/MonitorOptions.v3 b/src/monitors/MonitorOptions.v3 index 5299e636..9c076d08 100644 --- a/src/monitors/MonitorOptions.v3 +++ b/src/monitors/MonitorOptions.v3 @@ -3,16 +3,14 @@ // Parses and updates monitor options based on arguments. component MonitorOptions { + var group = Help.newGroup("MONITOR", printHelp); + def CSV = group.newBoolOption("csv", false, "Enable comma-separated value output for monitors."); + private var monitors = Vector.new(); - var csv = false; // Parse a command-line argument, configuring and updating monitors. Return {true} // if the argument was matched and parsed successfully. def parse(arg: string) -> bool { - if (Strings.equal(arg, "-csv")) { - csv = true; - return true; - } if (!Strings.startsWith(arg, "--monitors=")) return false; var s = 11, pos = s; var inArg = false; @@ -71,25 +69,26 @@ component MonitorOptions { def getMonitors() -> Vector { return monitors; } - def printHelp() { - var out = Trace.OUT, H = out.putsln; - H(""); - H("MONITOR OPTIONS"); - H(""); + def printHelp(out: TraceBuilder) { + var H = out.putsln, L = out.ln; H("Wizard offers instrumentation and dynamic analyses of Wasm programs via monitors."); H("Multiple monitors can enabled simultaneously using the command-line flag."); - H(""); + L(); H(" --monitors={}[,{}]"); - H(""); + L(); H("Each monitor comes with its own set of optional arguments and their modifiers."); H("This build of the Wizard engine supports the following monitors:"); - H(""); + L(); MonitorRegistry.printHelp(); - H(""); + L(); + H("Additional global monitor options include:"); + L(); + group.print(out); + H("Example usage:"); - H(""); + L(); H(" --monitors=loops,coverage{code=instr}"); out.ln(); } diff --git a/src/monitors/OpcodeMonitor.v3 b/src/monitors/OpcodeMonitor.v3 index b9e3ad8c..46a1ec44 100644 --- a/src/monitors/OpcodeMonitor.v3 +++ b/src/monitors/OpcodeMonitor.v3 @@ -56,7 +56,7 @@ def output(entries: Vector) { var C = table.cells; C[1].color = Color.COUNT; C[2].color = Color.COUNT; - if (MonitorOptions.csv) table.putCsvHeader(Trace.OUT); + if (MonitorOptions.CSV.val) table.putCsvHeader(Trace.OUT); else table.putTableHeader(Trace.OUT); Trace.OUT.flush(); var array = entries.copy(); @@ -68,7 +68,7 @@ def output(entries: Vector) { C[0].puts(e.op.name); C[1].putd(e.static_count); C[2].putd(e.count.count); - if (MonitorOptions.csv) table.putCsvRow(Trace.OUT); + if (MonitorOptions.CSV.val) table.putCsvRow(Trace.OUT); else table.putTableRow(Trace.OUT); Trace.OUT.flush(); } diff --git a/src/util/Help.v3 b/src/util/Help.v3 new file mode 100644 index 00000000..6fed029c --- /dev/null +++ b/src/util/Help.v3 @@ -0,0 +1,86 @@ +// Copyright 2024 Wizard authors. All rights reserved. +// See LICENSE for details of Apache 2.0 license. + +// Centralizes management of help for options and sections for various utilities, +// which is used to print out +component Help { + def ALL = BasicOptions.new(null); + var groups: List<(OptionGroup, TraceBuilder -> void)>; + + def newGroup(name: string, printHelp: TraceBuilder -> void) -> OptionGroup { + var g = OptionGroup.new(name, ALL); + groups = List.new((g, printHelp), groups); + return g; + } + def print() { + var out = Trace.OUT; + for (l = groups; l != null; l = l.tail) { + var g = l.head.0, h = l.head.1; + out.put1("%s OPTIONS\n", g.name); + out.ln(); + if (h != null) { + h(out); + } else { + g.print(out); + } + out.ln(); + } + } + def parse(arg: string) -> bool { + return ALL.parseOption(arg); + } +} + +// Collects related options and stores a help string for each. +class OptionGroup(name: string, o: BasicOptions) { + var list: List<(Opt, string, string)>; + + def newDeclFilterOption(name: string, help: string) -> Option { + var r = Option.new(name, null, DeclFilters.parseString); + return add(o.add(r), "=", help); + } + def newIntOption(name: string, defval: int, help: string) -> Option { + return add(o.newIntOption(name, defval), "=", help); + } + def newBoolOption(name: string, defval: bool, help: string) -> Option { + return add(o.newBoolOption(name, defval), "[=(true|false)]", help); + } + def newFlag(name: string, onParse: string -> void, help: string) -> Option { + var r = Option.new(name, (), onParse); + return add(o.add(r), "", help); + } + def newStringOption(name: string, defval: string, help: string) -> Option { + return add(o.newStringOption(name, defval), "=", help); + } + def newPathOption(name: string, defval: string, help: string) -> Option { + return add(o.newStringOption(name, defval), "=", help); + } + def newSizeOption(name: string, defval: u32, help: string) -> Option { + return add(o.newSizeOption(name, defval), "=", help); + } + def newAddrOption(name: string, defval: u64, help: string) -> Option { + return add(o.newAddrOption(name, defval), "=
", help); + } + def newEmptyOption(name: string, help: string) -> Option { + return add(o.newOption(name, false, parseEmpty), "", help); + } + def newOption(name: string, defval: T, typename: string, parseFun: string -> T, help: string) -> Option { + return add(o.newOption(name, defval, parseFun), typename, help); + } + def add(opt: Option, typename: string, help: string) -> Option { + list = List.new((opt, typename, help), list); + return opt; + } + def parseEmpty(str: string) -> bool { + return str == null; + } + def print(buf: StringBuilder) { + for (l = Lists.reverse(list); l != null; l = l.tail) { + var t = l.head; + buf.put2(" -%s%s\n", t.0.name, t.1); + buf.put1(" %s\n", t.2); + } + buf.ln(); + } +} + diff --git a/src/wizeng.main.v3 b/src/wizeng.main.v3 index 7ab510f4..3daaab15 100644 --- a/src/wizeng.main.v3 +++ b/src/wizeng.main.v3 @@ -11,9 +11,9 @@ def main(args: Array) -> int { for (i < args.length) { var a = args[i]; if (a.length > 0 && a[0] == '-') { - var ok = TraceOptions.parse(a) + var ok = Help.parse(a) + || TraceOptions.parse(a) || EngineOptions.parse(engine, a) - || WizengOptions.parse(engine, a) || MonitorOptions.parse(a) || MetricOptions.parse(a) || WasiOptions.parse(a); @@ -30,19 +30,13 @@ def main(args: Array) -> int { } } - if (WizengOptions.pregenFile != null) { - var err = Target.pregenIntoFile(WizengOptions.pregenFile); + if (WizengOptions.PREGEN_FILE.val != null) { + var err = Target.pregenIntoFile(WizengOptions.PREGEN_FILE.val); if (err != null) return err.exit(2); if (path == null) return 0; // all done } - if (WizengOptions.help) { - printHelp(); - return 0; - } - - if (WizengOptions.version) { - printVersion(); + if (WizengOptions.helped) { return 0; } @@ -223,20 +217,6 @@ def printThrowable(thrown: Throwable) { e.ln(); } -def printHelp() { - putWizeng(Trace.OUT).ln(); - Trace.OUT.puts("Usage: wizeng [options] \n\n"); - EngineOptions.printHelp(); - TraceOptions.printHelp(); - MonitorOptions.printHelp(); -} - -def printVersion() { - putWizeng(Trace.OUT).ln(); - if (Version.buildData != null) Trace.OUT.puts("Build data: ").puts(Version.buildData).ln(); - Trace.OUT.flush(); -} - def putWizeng(out: StringBuilder) -> StringBuilder { return out.puts("Wizard Engine ").puts(Version.version).putc('.').putd(Version.minorVersion); } @@ -305,41 +285,29 @@ class ImportTracer(var filter: DeclFilter) { // Options specific to the "wizeng" executable. component WizengOptions { - var help = false; - var version = false; - var pregenFile: string; // file to patch interpreter code into + def group = Help.newGroup("WIZENG", null); + def HELP = group.newFlag("help", printHelp, "Print command-line help."); + def VERSION = group.newFlag("-version", printVersion, "Print build version."); + def PREGEN_FILE = group.newPathOption("pregen", null, "Pre-generate assembly interpreter and stubs into the given file."); + def NO_COLORS = group.newFlag("nocolor", disableColor, "Disable terminal colors."); + def EXPOSE_WIZENG = group.newBoolOption("-expose-wizeng", false, "Expose the \"wizeng\" module's functionality to programs."); // TODO: remove + def EXPOSE = group.newStringOption("-expose", null, "Expose the given host module's functionality to programs."); + def PRINT_RESULT = group.newBoolOption("-print-result", false, "Print the result of the main function upon exit."); + var helped = false; - def parse(engine: Engine, arg: string) -> bool { - if (Strings.startsWith(arg, "-pregen=")) { - pregenFile = Arrays.range(arg, 8, arg.length); - return true; - } - if (Strings.equal(arg, "-help") || Strings.equal("--help", arg)) { - help = true; - return true; - } - if (Strings.equal(arg, "-version")) { - version = true; - return true; - } - if (Strings.equal(arg, "-nocolor")) { - Palettes.on = false; - return true; - } - if (Strings.equal(arg, "--expose-wizeng")) { // TODO: legacy, remove - ModuleRegistry.exposeOne("wizeng"); - return true; - } - if (Strings.startsWith(arg, "--expose=")) { - var pattern = Arrays.range(arg, 9, arg.length); - ModuleRegistry.expose(GlobMatcher.new(pattern)); - return true; - } - if (Strings.equal(arg, "--print-result")) { - print_result = true; - return true; - } - return false; + def printVersion(str: string) { + putWizeng(Trace.OUT).ln(); + if (Version.buildData != null) Trace.OUT.puts("Build data: ").puts(Version.buildData).ln(); + Trace.OUT.flush(); + } + def printHelp(str: string) { + helped = true; + putWizeng(Trace.OUT).ln(); + Trace.OUT.puts("Usage: wizeng [options] \n\n"); + Help.print(); + } + def disableColor(str: string) { + Palettes.on = false; } } def findDefaultMain(instance: Instance) -> (Function, Array) { From 75d440e2203b4e32a3e8702548fae0a823a80da3 Mon Sep 17 00:00:00 2001 From: "Ben L. Titzer" Date: Mon, 26 Aug 2024 00:48:47 -0400 Subject: [PATCH 3/3] Update command-line options --- build.sh | 2 +- src/engine/BinParser.v3 | 2 +- src/engine/EngineOptions.v3 | 13 ++- src/engine/Execute.v3 | 13 +-- src/engine/Metrics.v3 | 22 ----- src/engine/TraceOptions.v3 | 33 +++++-- src/modules/ModuleRegistry.v3 | 3 +- src/modules/wasi/WasiOptions.v3 | 102 ++++++++++----------- src/monitors/MonitorOptions.v3 | 3 +- src/objdump.main.v3 | 6 +- src/util/{Help.v3 => OptionsRegistry.v3} | 19 +++- src/util/Palette.v3 | 3 + src/wizeng.main.v3 | 21 ++--- test/monitors/test.sh | 2 +- test/monitors/update-expected.sh | 2 +- test/monitors/wasm-r3-tests/test.sh | 4 +- test/spectest.main.v3 | 35 ++++--- test/wizeng/force_gc0.wasm.flags | 2 +- test/wizeng/hello.wasm.flags | 2 +- test/wizeng/rdtsc0.wasm.flags | 2 +- test/wizeng/rdtsc1.wasm.flags | 2 +- test/wizeng/test.sh | 2 +- test/wizeng/wizeng_error0.wasm.flags | 2 +- test/wizeng/wizeng_invoke0.wasm.flags | 2 +- test/wizeng/wizeng_new_funcref0.wasm.flags | 2 +- test/wizeng/wizeng_new_funcref1.wasm.flags | 2 +- test/wizeng/wizeng_puti0.wasm.flags | 2 +- test/wizeng/wizeng_tail_invoke0.wasm.flags | 2 +- 28 files changed, 154 insertions(+), 153 deletions(-) rename src/util/{Help.v3 => OptionsRegistry.v3} (86%) diff --git a/build.sh b/build.sh index 4bd37036..5435274a 100755 --- a/build.sh +++ b/build.sh @@ -70,7 +70,7 @@ function make_build_file() { # compute sources if [ "$PROGRAM" = "wizeng" ]; then - SOURCES="$ENGINE $WIZENG $WAVE $WASI $WALI $MONITORS" + SOURCES="$ENGINE $WAVE $WASI $WALI $MONITORS $WIZENG" if [[ "$TARGET" = "x86-64-linux" || "$TARGET" = "x86_64_linux" ]]; then SOURCES="$SOURCES $WASI_X86_64_LINUX $WALI_X86_64_LINUX" fi diff --git a/src/engine/BinParser.v3 b/src/engine/BinParser.v3 index 5eb5d05a..b062881f 100644 --- a/src/engine/BinParser.v3 +++ b/src/engine/BinParser.v3 @@ -9,7 +9,7 @@ class BinParser(extensions: Extension.set, limits: Limits, filename: string) ext def err = ErrorGen.new(filename); var tiering: ExecutionStrategy; var validate_code = true; - var names = !EngineOptions.NO_NAMES.get(); + var names = !TraceOptions.NO_NAMES.get(); private def cache = Canon.globalCache; private var validator: CodeValidator; diff --git a/src/engine/EngineOptions.v3 b/src/engine/EngineOptions.v3 index 21cd1404..39ea884a 100644 --- a/src/engine/EngineOptions.v3 +++ b/src/engine/EngineOptions.v3 @@ -3,21 +3,22 @@ // Parses command-line options that configure an engine. component EngineOptions { - var group = Help.newGroup("ENGINE", printHelp); + var group = OptionsRegistry.newGroup("ENGINE", printHelp); + var extensions: Extension.set; def DEFAULT_STACK_SIZE = 512u * 1024u; - def NO_NAMES = group.newBoolOption("no-names", false, "Disables printing of Wasm names from the name section."); def STACK_SIZE = group.newSizeOption("stack-size", DEFAULT_STACK_SIZE, "Initial stack size in bytes for Wasm execution stacks."); def JIT_FILTER = group.newDeclFilterOption("jit-filter", "Filters functions compiled by the JIT."); + def X_ = OptionsRegistry.addParseFunc(parse); - def parse(engine: Engine, arg: string) -> bool { + def parse(arg: string) -> bool { if (Strings.startsWith(arg, "-ext:")) { if (Strings.endsWithFrom(arg, 5, "all")) { - engine.extensions = Extension.set.all; + extensions = Extension.set.all; return true; } for (e in Extension) { if (Strings.endsWithFrom(arg, 5, e.short_name)) { - engine.extensions |= Extensions.setImplications(e); + extensions |= Extensions.setImplications(e); return true; } } @@ -56,6 +57,8 @@ component EngineOptions { } } L(); + ExecuteOptions.printHelp(out); + L(); H("Other engine configuration options include:"); L(); group.print(out); diff --git a/src/engine/Execute.v3 b/src/engine/Execute.v3 index 419a4a93..cdb3f7f7 100644 --- a/src/engine/Execute.v3 +++ b/src/engine/Execute.v3 @@ -205,11 +205,10 @@ component ExecuteOptions { return false; } // Print help for the supported modes. - def printHelp() { - var out = Trace.OUT, H = out.putsln; - H(""); - H("This build of the Wizard Engine responds to the execution mode flag in the following ways."); - H(""); + def printHelp(out: TraceBuilder) { + var H = out.putsln, L = out.ln; + H("This build of the Wizard Engine supports the following execution modes:"); + L(); for (l = modes; l != null; l = l.tail) { var t = l.head; out.puts(" -mode="); @@ -219,7 +218,5 @@ component ExecuteOptions { out.puts(t.2); out.ln(); } - - H(""); } -} \ No newline at end of file +} diff --git a/src/engine/Metrics.v3 b/src/engine/Metrics.v3 index 04736ec1..6c616844 100644 --- a/src/engine/Metrics.v3 +++ b/src/engine/Metrics.v3 @@ -99,28 +99,6 @@ component Metrics { } } -// Parses and enables collection/reporting of metrics based on arguments. -component MetricOptions { - // TODO: print help for metrics option - // Parse command-line argument and update metric collection. Return {true} if the - // argument was matched as a trace flag. - def parse(arg: string) -> bool { - if (Strings.equal(arg, "--metrics")) { - Metrics.enableAll(); - return true; - } - var prefix = "--metrics="; - if (Strings.startsWith(arg, prefix)) { - var pat = Arrays.range(arg, prefix.length, arg.length); - var glob = GlobMatcher.new(pat); - Metrics.enable(glob); - return true; - } - return false; - } - // TODO: help -} - // Internal representation of a metric. class Metric(name: string, units: string, help: string) { var enabled: bool; diff --git a/src/engine/TraceOptions.v3 b/src/engine/TraceOptions.v3 index 6115a9dd..15c13177 100644 --- a/src/engine/TraceOptions.v3 +++ b/src/engine/TraceOptions.v3 @@ -20,8 +20,12 @@ enum TraceOption(ch: byte, help: string) { // Parses and updates trace options based on arguments. component TraceOptions { - def group = Help.newGroup("TRACING", printHelp); + def group = OptionsRegistry.newGroup("TRACING", printHelp); + def NO_NAMES = group.newBoolOption("no-names", false, "Disables parsing and reporting from the name section."); + def COLORS = group.newBoolOption("colors", true, "Enable or disable terminal colors.") + .onSet(Palettes.reset); def FATAL = group.newFlag("fatal", setFatal, "Aborts upon parsing, validation, or test failure."); + def X_ = OptionsRegistry.addParseFunc(parse); def setFatal(str: string) { if (str == null || Strings.equal(str, "true")) Trace.fatal = true; @@ -63,6 +67,17 @@ component TraceOptions { } return true; } + if (Strings.equal(arg, "--metrics")) { + Metrics.enableAll(); + return true; + } + var prefix = "--metrics="; + if (Strings.startsWith(arg, prefix)) { + var pat = Arrays.range(arg, prefix.length, arg.length); + var glob = GlobMatcher.new(pat); + Metrics.enable(glob); + return true; + } return false; } private def setOption(opt: TraceOption) { @@ -83,15 +98,15 @@ component TraceOptions { } } def printHelp(out: TraceBuilder) { - var H = out.putsln; + var H = out.putsln, L = out.ln; H("A number of tracing options enable debugging output from various components of the engine."); H("These options help debug both the engine and wasm modules, including ones that are"); H("malformed or have type errors."); H("Note that the '-t' short form supports multiple combined options, such as '-tiov'."); - H(""); + L(); for (t in TraceOption) { - out.puts(" -t"); + out.puts(" -t"); out.putc(t.ch); out.puts(" --trace-"); out.puts(t.name); @@ -100,14 +115,16 @@ component TraceOptions { out.puts(t.help); out.ln(); } - H(""); - H(" --trace-module=[]"); + L(); + H(" --trace-module[=]"); H(" Trace calls into the given module(s)."); - H(""); - H(" --trace-calls=[]"); + H(" --trace-calls[=]"); H(" Trace calls into and out of the given functions(s). The pattern can use function"); H(" names from the module or function indexes."); + L(); + H(" --metrics[=]"); + H(" Reports the given metrics."); group.print(out); } } diff --git a/src/modules/ModuleRegistry.v3 b/src/modules/ModuleRegistry.v3 index dc81c47f..598e4503 100644 --- a/src/modules/ModuleRegistry.v3 +++ b/src/modules/ModuleRegistry.v3 @@ -12,7 +12,8 @@ component ModuleRegistry { def add(m: HostModule, exposed: bool) { map[m.name] = (m, exposed); } - def expose(glob: GlobMatcher) { + def expose(pattern: string) { + var glob = GlobMatcher.new(pattern); for (l = Maps.keyList(map); l != null; l = l.tail) { var n = l.head; if (glob.matches(n)) map[n] = (map[n].0, true); diff --git a/src/modules/wasi/WasiOptions.v3 b/src/modules/wasi/WasiOptions.v3 index 01d82137..8daec7e9 100644 --- a/src/modules/wasi/WasiOptions.v3 +++ b/src/modules/wasi/WasiOptions.v3 @@ -1,59 +1,57 @@ // Copyright 2023 Wizard Authors. All rights reserved. // See LICENSE for details of Apache 2.0 license. +// Handles command-line options for WASI. component WasiOptions { - private var envs = Vector.new(); - private var dirs = Vector.new(); + private var envs = Vector.new(); + private var dirs = Vector.new(); - def parse(arg: string) -> bool { - if (Strings.startsWith(arg, "--dir=")) { - var s = 6; - for (i = s; i < arg.length; i++) { - if (arg[i] == ',') { - addDir(arg, s, i); - s = i + 1; - } - } - if (s < arg.length) addDir(arg, s, arg.length); - return true; - } else if (Strings.startsWith(arg, "--env=")) { - var s = 6; - var equal_exists = false; - for (i = s; i < arg.length; i++) { - if (arg[i] == ',') { - equal_exists = addEnv(arg, s, i); - s = i + 1; - } - } - if (s < arg.length) equal_exists = addEnv(arg, s, arg.length); - return equal_exists; - } - return false; - } + private def X_ = OptionsRegistry.addParseFunc(parse); - private def addDir(arg: string, start: int, end: int) { - def name = Arrays.range(arg, start, end); - dirs.put(name); - } - - private def addEnv(arg: string, start: int, end: int) -> bool { - // a flag to check equal exists in environment variable definition (e.g. FOO=BAR) - var equal_exists = false; - def name = Arrays.range(arg, start, end); - for (i < name.length) { - if (name[i] == '=') { - equal_exists = true; - } - } - envs.put(name); - return equal_exists; - } - - def getDirs() -> Vector { - return dirs; - } - - def getEnvs() -> Vector { - return envs; - } + // TODO: use Options.newGroup + def parse(arg: string) -> bool { + if (Strings.startsWith(arg, "--dir=")) { + var s = 6; + for (i = s; i < arg.length; i++) { + if (arg[i] == ',') { + addDir(arg, s, i); + s = i + 1; + } + } + if (s < arg.length) addDir(arg, s, arg.length); + return true; + } else if (Strings.startsWith(arg, "--env=")) { + var s = 6; + var equal_exists = false; + for (i = s; i < arg.length; i++) { + if (arg[i] == ',') { + equal_exists = addEnv(arg, s, i); + s = i + 1; + } + } + if (s < arg.length) equal_exists = addEnv(arg, s, arg.length); + return equal_exists; + } + return false; + } + private def addDir(arg: string, start: int, end: int) { + def name = Arrays.range(arg, start, end); + dirs.put(name); + } + private def addEnv(arg: string, start: int, end: int) -> bool { + // a flag to check equal exists in environment variable definition (e.g. FOO=BAR) + var equal_exists = false; + def name = Arrays.range(arg, start, end); + for (i < name.length) { + if (name[i] == '=') equal_exists = true; + } + envs.put(name); + return equal_exists; + } + def getDirs() -> Vector { + return dirs; + } + def getEnvs() -> Vector { + return envs; + } } \ No newline at end of file diff --git a/src/monitors/MonitorOptions.v3 b/src/monitors/MonitorOptions.v3 index 9c076d08..6baa8210 100644 --- a/src/monitors/MonitorOptions.v3 +++ b/src/monitors/MonitorOptions.v3 @@ -3,8 +3,9 @@ // Parses and updates monitor options based on arguments. component MonitorOptions { - var group = Help.newGroup("MONITOR", printHelp); + var group = OptionsRegistry.newGroup("MONITOR", printHelp); def CSV = group.newBoolOption("csv", false, "Enable comma-separated value output for monitors."); + def X_ = OptionsRegistry.addParseFunc(parse); private var monitors = Vector.new(); diff --git a/src/objdump.main.v3 b/src/objdump.main.v3 index a097e8ee..21f511b4 100644 --- a/src/objdump.main.v3 +++ b/src/objdump.main.v3 @@ -11,15 +11,13 @@ def main(args: Array) -> int { for (i < args.length) { var a = args[i]; if (a.length > 0 && a[0] == '-') { - if (!(TraceOptions.parse(a) - || EngineOptions.parse(engine, a) - || MetricOptions.parse(a) - )) return ErrorBuilder.new() + if (!OptionsRegistry.parse(a)) return ErrorBuilder.new() .puts("objdump: unrecognized option ") .putsq(a) .ln() .exit(1); args[i] = null; + engine.extensions = EngineOptions.extensions; } else if (!Strings.endsWith(a, ".wasm")) { return ErrorBuilder.new() .puts(a) diff --git a/src/util/Help.v3 b/src/util/OptionsRegistry.v3 similarity index 86% rename from src/util/Help.v3 rename to src/util/OptionsRegistry.v3 index 6fed029c..5c12f348 100644 --- a/src/util/Help.v3 +++ b/src/util/OptionsRegistry.v3 @@ -3,15 +3,19 @@ // Centralizes management of help for options and sections for various utilities, // which is used to print out -component Help { +component OptionsRegistry { def ALL = BasicOptions.new(null); var groups: List<(OptionGroup, TraceBuilder -> void)>; + var funcs: List bool>; def newGroup(name: string, printHelp: TraceBuilder -> void) -> OptionGroup { var g = OptionGroup.new(name, ALL); groups = List.new((g, printHelp), groups); return g; } + def addParseFunc(f: string -> bool) { + funcs = List.new(f, funcs); + } def print() { var out = Trace.OUT; for (l = groups; l != null; l = l.tail) { @@ -27,7 +31,18 @@ component Help { } } def parse(arg: string) -> bool { - return ALL.parseOption(arg); + if (ALL.parseOption(arg)) return true; + for (l = funcs; l != null; l = l.tail) { + if (l.head(arg)) return true; + } + return false; + } + def filterArgs(args: Array) { + for (i < args.length) { + var a = args[i]; + if (a == null || a.length < 1 || a[0] != '-') continue; + if (parse(a)) args[i] = null; + } } } diff --git a/src/util/Palette.v3 b/src/util/Palette.v3 index 0a147a25..c5bc2ea2 100644 --- a/src/util/Palette.v3 +++ b/src/util/Palette.v3 @@ -68,4 +68,7 @@ component Palettes { def get() -> Palette { return if(on, defaultOn, defaultOff); } + def reset(on: bool) { + this.on = on; + } } diff --git a/src/wizeng.main.v3 b/src/wizeng.main.v3 index 3daaab15..7b31c76c 100644 --- a/src/wizeng.main.v3 +++ b/src/wizeng.main.v3 @@ -11,18 +11,13 @@ def main(args: Array) -> int { for (i < args.length) { var a = args[i]; if (a.length > 0 && a[0] == '-') { - var ok = Help.parse(a) - || TraceOptions.parse(a) - || EngineOptions.parse(engine, a) - || MonitorOptions.parse(a) - || MetricOptions.parse(a) - || WasiOptions.parse(a); - + var ok = OptionsRegistry.parse(a); if (!ok) return ErrorBuilder.new() .puts("wizeng: unrecognized option ") .putsq(a) .ln() .exit(1); + engine.extensions = EngineOptions.extensions; } else { path = a; programArgs = Arrays.range(args, i, args.length); @@ -285,13 +280,12 @@ class ImportTracer(var filter: DeclFilter) { // Options specific to the "wizeng" executable. component WizengOptions { - def group = Help.newGroup("WIZENG", null); + def group = OptionsRegistry.newGroup("WIZENG", null); def HELP = group.newFlag("help", printHelp, "Print command-line help."); def VERSION = group.newFlag("-version", printVersion, "Print build version."); def PREGEN_FILE = group.newPathOption("pregen", null, "Pre-generate assembly interpreter and stubs into the given file."); - def NO_COLORS = group.newFlag("nocolor", disableColor, "Disable terminal colors."); - def EXPOSE_WIZENG = group.newBoolOption("-expose-wizeng", false, "Expose the \"wizeng\" module's functionality to programs."); // TODO: remove - def EXPOSE = group.newStringOption("-expose", null, "Expose the given host module's functionality to programs."); + def EXPOSE = group.newStringOption("-expose", null, "Expose the given host module's functionality to programs.") + .onSet(ModuleRegistry.expose); def PRINT_RESULT = group.newBoolOption("-print-result", false, "Print the result of the main function upon exit."); var helped = false; @@ -304,10 +298,7 @@ component WizengOptions { helped = true; putWizeng(Trace.OUT).ln(); Trace.OUT.puts("Usage: wizeng [options] \n\n"); - Help.print(); - } - def disableColor(str: string) { - Palettes.on = false; + OptionsRegistry.print(); } } def findDefaultMain(instance: Instance) -> (Function, Array) { diff --git a/test/monitors/test.sh b/test/monitors/test.sh index fda92142..7aeaec78 100755 --- a/test/monitors/test.sh +++ b/test/monitors/test.sh @@ -12,7 +12,7 @@ DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )" make_binary wizeng || exit $? -WIZENG="../../$BINARY $WIZENG_OPTS -nocolor" +WIZENG="../../$BINARY $WIZENG_OPTS -colors=false" target=$TEST_TARGET diff --git a/test/monitors/update-expected.sh b/test/monitors/update-expected.sh index 057a2278..93196898 100755 --- a/test/monitors/update-expected.sh +++ b/test/monitors/update-expected.sh @@ -13,7 +13,7 @@ DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )" make_binary wizeng || exit $? cd $DIR -WIZENG="../../$BINARY -nocolor" +WIZENG="../../$BINARY -colors=false" if [ $# -gt 0 ]; then MONITORS=($@) diff --git a/test/monitors/wasm-r3-tests/test.sh b/test/monitors/wasm-r3-tests/test.sh index b5bfdd49..43e40d5c 100755 --- a/test/monitors/wasm-r3-tests/test.sh +++ b/test/monitors/wasm-r3-tests/test.sh @@ -12,7 +12,7 @@ DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )" make_binary wizeng || exit $? -WIZENG="../../../$BINARY $WIZENG_OPTS -nocolor" +WIZENG="../../../$BINARY $WIZENG_OPTS -colors=false" print_testing cd $DIR @@ -46,4 +46,4 @@ if [ "$RAW" = 0 ]; then run_tests | $PROGRESS else run_tests -fi \ No newline at end of file +fi diff --git a/test/spectest.main.v3 b/test/spectest.main.v3 index 6925d58f..6c395789 100644 --- a/test/spectest.main.v3 +++ b/test/spectest.main.v3 @@ -4,34 +4,27 @@ // Parses and runs binary WebAssembly spec tests (.bin.wast). def OUT = Trace.OUT; component spectest { + def group = OptionsRegistry.newGroup("SPECTEST", null); def expected = Strings.newMap(); + + def HELP = group.newFlag("help", printHelp, "Print command-line help."); + def SKIP_ACTIONS = group.newBoolOption("skip-actions", false, "Parse only and skip actions."); + def EXPECTED = group.newPathOption("expected", null, "File containing expected failures to be ignored.") + .onSet(TestUtil.loadExpectedFile(expected, _)); def trace = TraceBuilder.new(); - var skip_actions = false; + var helped = false; def main(args: Array) -> int { var count = 0; var engine = Engine.new(); - filterOptions(args, TraceOptions.parse); - filterOptions(args, MetricOptions.parse); - filterOptions(args, EngineOptions.parse(engine, _)); + OptionsRegistry.filterArgs(args); + engine.extensions = EngineOptions.extensions; for (i < args.length) { var a = args[i]; if (a == null) continue; - if (Strings.equal(a, "--help")) { - System.puts("usage: spectest [--skip-actions] [-expected=expected_file_name] ...\n"); - return 0; - } - if (Strings.equal(a, "--skip-actions")) { - skip_actions = true; - args[i] = null; - continue; - } - if (Strings.startsWith(a, "-expected=")) { - TestUtil.loadExpectedFile(expected, Arrays.range(a, "-expected=".length, a.length)); - continue; - } if (Strings.endsWith(a, ".wast")) count++; } + if (helped) return 0; if (count == 0) { System.puts("spectest: no input files\n"); return 3; @@ -50,6 +43,12 @@ component spectest { Metrics.report(); return result; } + def printHelp(str: string) { + helped = true; + Trace.OUT.puts("Wizard Engine ").puts(Version.version).putc('.').putd(Version.minorVersion).ln(); + Trace.OUT.puts("Usage: spectest [options] <.bin.wast files>\n\n"); + OptionsRegistry.print(); + } def runTest(engine: Engine, filename: string) -> int { OUT.puts("##+"); OUT.puts(filename); @@ -72,7 +71,7 @@ component spectest { } if (p.ok) { var ip = SpecTestInterpreter.new(engine, filename); - ip.skip_actions = skip_actions; + ip.skip_actions = SKIP_ACTIONS.val; ip.ignore_failure = expected[filename]; if (ip.run(p.commands)) { OUT.puts("##-ok").ln(); diff --git a/test/wizeng/force_gc0.wasm.flags b/test/wizeng/force_gc0.wasm.flags index 787c649c..e827cf20 100644 --- a/test/wizeng/force_gc0.wasm.flags +++ b/test/wizeng/force_gc0.wasm.flags @@ -1 +1 @@ ---expose-wizeng +--expose=wizeng diff --git a/test/wizeng/hello.wasm.flags b/test/wizeng/hello.wasm.flags index 787c649c..e827cf20 100644 --- a/test/wizeng/hello.wasm.flags +++ b/test/wizeng/hello.wasm.flags @@ -1 +1 @@ ---expose-wizeng +--expose=wizeng diff --git a/test/wizeng/rdtsc0.wasm.flags b/test/wizeng/rdtsc0.wasm.flags index 787c649c..e827cf20 100644 --- a/test/wizeng/rdtsc0.wasm.flags +++ b/test/wizeng/rdtsc0.wasm.flags @@ -1 +1 @@ ---expose-wizeng +--expose=wizeng diff --git a/test/wizeng/rdtsc1.wasm.flags b/test/wizeng/rdtsc1.wasm.flags index 612eb439..82e801b9 100644 --- a/test/wizeng/rdtsc1.wasm.flags +++ b/test/wizeng/rdtsc1.wasm.flags @@ -1 +1 @@ ---expose-wizeng -ext:tail-call +--expose=wizeng -ext:tail-call diff --git a/test/wizeng/test.sh b/test/wizeng/test.sh index bf9ae196..d2e433e7 100755 --- a/test/wizeng/test.sh +++ b/test/wizeng/test.sh @@ -12,7 +12,7 @@ DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )" make_binary wizeng || exit $? -WIZENG="../../$BINARY $WIZENG_OPTS -nocolor" +WIZENG="../../$BINARY $WIZENG_OPTS -colors=false" target=$TEST_TARGET diff --git a/test/wizeng/wizeng_error0.wasm.flags b/test/wizeng/wizeng_error0.wasm.flags index 787c649c..e827cf20 100644 --- a/test/wizeng/wizeng_error0.wasm.flags +++ b/test/wizeng/wizeng_error0.wasm.flags @@ -1 +1 @@ ---expose-wizeng +--expose=wizeng diff --git a/test/wizeng/wizeng_invoke0.wasm.flags b/test/wizeng/wizeng_invoke0.wasm.flags index 787c649c..e827cf20 100644 --- a/test/wizeng/wizeng_invoke0.wasm.flags +++ b/test/wizeng/wizeng_invoke0.wasm.flags @@ -1 +1 @@ ---expose-wizeng +--expose=wizeng diff --git a/test/wizeng/wizeng_new_funcref0.wasm.flags b/test/wizeng/wizeng_new_funcref0.wasm.flags index 4bc443c2..ed2f80f8 100644 --- a/test/wizeng/wizeng_new_funcref0.wasm.flags +++ b/test/wizeng/wizeng_new_funcref0.wasm.flags @@ -1 +1 @@ ---expose-wizeng -ext:function-references +--expose=wizeng -ext:function-references diff --git a/test/wizeng/wizeng_new_funcref1.wasm.flags b/test/wizeng/wizeng_new_funcref1.wasm.flags index 4bc443c2..ed2f80f8 100644 --- a/test/wizeng/wizeng_new_funcref1.wasm.flags +++ b/test/wizeng/wizeng_new_funcref1.wasm.flags @@ -1 +1 @@ ---expose-wizeng -ext:function-references +--expose=wizeng -ext:function-references diff --git a/test/wizeng/wizeng_puti0.wasm.flags b/test/wizeng/wizeng_puti0.wasm.flags index 787c649c..e827cf20 100644 --- a/test/wizeng/wizeng_puti0.wasm.flags +++ b/test/wizeng/wizeng_puti0.wasm.flags @@ -1 +1 @@ ---expose-wizeng +--expose=wizeng diff --git a/test/wizeng/wizeng_tail_invoke0.wasm.flags b/test/wizeng/wizeng_tail_invoke0.wasm.flags index 787c649c..e827cf20 100644 --- a/test/wizeng/wizeng_tail_invoke0.wasm.flags +++ b/test/wizeng/wizeng_tail_invoke0.wasm.flags @@ -1 +1 @@ ---expose-wizeng +--expose=wizeng