util: Make m5 commands return a bool instead of calling usage.
authorGabe Black <gabeblack@google.com>
Tue, 7 Apr 2020 07:40:27 +0000 (00:40 -0700)
committerGabe Black <gabeblack@google.com>
Mon, 27 Jul 2020 08:28:42 +0000 (08:28 +0000)
By delegating actually calling usage() elsewhere, we can remove a dependency
from the commands themselves, and also make testing easier since we won't
exit() every time we call a command with bad arguments.

Change-Id: I6b8e2cb77ce0456b16673f10349362cc53218bba
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/27565
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
15 files changed:
util/m5/src/command.cc
util/m5/src/command.hh
util/m5/src/command.test.cc
util/m5/src/command/addsymbol.cc
util/m5/src/command/checkpoint.cc
util/m5/src/command/dumpresetstats.cc
util/m5/src/command/dumpstats.cc
util/m5/src/command/exit.cc
util/m5/src/command/fail.cc
util/m5/src/command/initparam.cc
util/m5/src/command/loadsymbol.cc
util/m5/src/command/readfile.cc
util/m5/src/command/resetstats.cc
util/m5/src/command/sum.cc
util/m5/src/command/writefile.cc

index d7dc030283d8104a1c6c15adb12df84fc2ed3730..2527dc6aec4506c5a1660daf931baaca5a05beac 100644 (file)
@@ -52,6 +52,5 @@ Command::run(const DispatchTable &dt, Args &args)
     if (num_args < cmd.minArgs || num_args > cmd.maxArgs)
         return false;
 
-    cmd.func(dt, args);
-    return true;
+    return cmd.func(dt, args);
 }
index 8348d1116707c8123f2673d0e0edee44593bd93e..7321d39731a8820a8407ba8111d430229d60c331 100644 (file)
@@ -46,7 +46,7 @@ class Command
     // The maximum number of arguments the command can handle.
     const int maxArgs;
 
-    using FuncType = void (*)(const DispatchTable &dt, Args &args);
+    using FuncType = bool (*)(const DispatchTable &dt, Args &args);
     // A function which processes command line arguments and passes them to
     // the underlying function through the dispatch table.
     FuncType func;
index 342a42cd43a6e00610fd036ee354be426ac57ddc..b29d648fdf05148147fd6e75e7e0d515f39c59b3 100644 (file)
@@ -40,18 +40,20 @@ class DispatchTable {};
 
 DispatchTable dt;
 
-void
+bool
 do_test1(const DispatchTable &dt, Args &args)
 {
     ran_test1 = true;
+    return true;
 }
 
 bool ran_test2 = false;
 
-void
+bool
 do_test2(const DispatchTable &dt, Args &args)
 {
     ran_test2 = true;
+    return true;
 }
 
 TEST(CommandTest, OneCommandNoArgs)
index dfd20d7c9258fb79ee290066c7a964040eb2f2c0..0ebd6b29aa3171db9a8bed2142c8781cff932e21 100644 (file)
 #include "args.hh"
 #include "command.hh"
 #include "dispatch_table.hh"
-#include "usage.hh"
 
 namespace
 {
 
-void
+bool
 do_add_symbol(const DispatchTable &dt, Args &args)
 {
     uint64_t addr;
     if (!args.pop(addr))
-        usage();
+        return false;
     const std::string &symbol = args.pop();
 
     (*dt.m5_add_symbol)(addr, symbol.c_str());
+
+    return true;
 }
 
 Command add_symbol = {
index bd234a7ce10d546bb68ab3a508c347c540e56c78..b16307ceeffb6397838c6d769daf6f557b99975f 100644 (file)
 #include "args.hh"
 #include "command.hh"
 #include "dispatch_table.hh"
-#include "usage.hh"
 
 namespace
 {
 
-void
+bool
 do_checkpoint(const DispatchTable &dt, Args &args)
 {
     uint64_t ns_delay, ns_period;
     if (!args.pop(ns_delay, 0) || !args.pop(ns_period, 0))
-        usage();
+        return false;
 
     (*dt.m5_checkpoint)(ns_delay, ns_period);
+    return true;
 }
 
 Command checkpoint = {
index e3a7cc60e97942781fc1b2f9a0fc5ad37f2786c5..b5337afaed1d39d9283a15f32dd2abd628f636ed 100644 (file)
 #include "args.hh"
 #include "command.hh"
 #include "dispatch_table.hh"
-#include "usage.hh"
 
 namespace
 {
 
-void
+bool
 do_dump_reset_stats(const DispatchTable &dt, Args &args)
 {
     uint64_t ns_delay, ns_period;
     if (!args.pop(ns_delay, 0) || !args.pop(ns_period, 0))
-        usage();
+        return false;
 
     (*dt.m5_dump_reset_stats)(ns_delay, ns_period);
+
+    return true;
 }
 
 Command dump_reset_stats = {
index eef3b383ce4351282e01cdc0ecb976b215246e49..106f822a120831d3a722448383e824ed166682cc 100644 (file)
 #include "args.hh"
 #include "command.hh"
 #include "dispatch_table.hh"
-#include "usage.hh"
 
 namespace
 {
 
-void
+bool
 do_dump_stats(const DispatchTable &dt, Args &args)
 {
     uint64_t ns_delay, ns_period;
     if (!args.pop(ns_delay, 0) || !args.pop(ns_period, 0))
-        usage();
+        return false;
 
     (*dt.m5_dump_stats)(ns_delay, ns_period);
+
+    return true;
 }
 
 Command dump_stats = {
index ea322ca0257bab756b3c7df68f71d724489a6306..4f8815c27943e9e30a3aca4e52c3e1188413d4ad 100644 (file)
 #include "args.hh"
 #include "command.hh"
 #include "dispatch_table.hh"
-#include "usage.hh"
 
 namespace
 {
 
-void
+bool
 do_exit(const DispatchTable &dt, Args &args)
 {
     uint64_t ns_delay;
     if (!args.pop(ns_delay, 0))
-        usage();
+        return false;
 
     (*dt.m5_exit)(ns_delay);
+
+    return true;
 }
 
 Command exit_cmd = {
index db21979cafaa96a300ccfc900c915d4f68aea045..c34571c5cdf412a5f5cecc35f349f365ca58c86f 100644 (file)
 #include "args.hh"
 #include "command.hh"
 #include "dispatch_table.hh"
-#include "usage.hh"
 
 namespace
 {
 
-void
+bool
 do_fail(const DispatchTable &dt, Args &args)
 {
     uint64_t ns_delay, code;
     if (!args.pop(code) || !args.pop(ns_delay, 0))
-        usage();
+        return false;
 
     (*dt.m5_fail)(ns_delay, code);
+
+    return true;
 }
 
 Command fail_cmd = {
index 3fe000c10c8fb6afcafb6194fdb0209a1e3c6823..eb1fdff4603e96b2d9fab962d74b1283ab6415bd 100644 (file)
 #include "args.hh"
 #include "command.hh"
 #include "dispatch_table.hh"
-#include "usage.hh"
 
 namespace
 {
 
-void
+bool
 do_initparam(const DispatchTable &dt, Args &args)
 {
     uint64_t key_str[2];
     if (!args.pop(key_str, 2))
-        usage();
+        return false;
+
     uint64_t val = (*dt.m5_init_param)(key_str[0], key_str[1]);
     std::cout << val;
+
+    return true;
 }
 
 Command init_param = {
index c55ae9905c3b3c152009afd5eb9c6a4e79bf0b6e..794e53b474ba914c2d7138ae1225e13f25da9e49 100644 (file)
 #include "args.hh"
 #include "command.hh"
 #include "dispatch_table.hh"
-#include "usage.hh"
 
 namespace
 {
 
-void
+bool
 do_loadsymbol(const DispatchTable &dt, Args &args)
 {
     (*dt.m5_load_symbol)();
+    return true;
 }
 
 Command load_symbol = {
index 9295dfd95e03af8557fe3e3211032474d88699a0..92c39e25f36b0c3112769e1dc4a6fd6809abee43 100644 (file)
@@ -32,7 +32,6 @@
 #include "args.hh"
 #include "command.hh"
 #include "dispatch_table.hh"
-#include "usage.hh"
 
 namespace
 {
@@ -62,13 +61,15 @@ read_file(const DispatchTable &dt, std::ostream &os)
     return offset;
 }
 
-void
+bool
 do_read_file(const DispatchTable &dt, Args &args)
 {
     if (args.size() > 0)
-        usage();
+        return false;
 
     read_file(dt, std::cout);
+
+    return true;
 }
 
 Command read_file_cmd = {
index 2408fb3341da6ce1ac4c704f2388f745c54d675a..cf51bfb5aaf809a0782f5581f0f9ccd17e2f68d0 100644 (file)
 #include "args.hh"
 #include "command.hh"
 #include "dispatch_table.hh"
-#include "usage.hh"
 
 namespace
 {
 
-void
+bool
 do_reset_stats(const DispatchTable &dt, Args &args)
 {
     uint64_t ns_delay, ns_period;
     if (!args.pop(ns_delay, 0) || !args.pop(ns_period, 0))
-        usage();
+        return false;
 
     (*dt.m5_reset_stats)(ns_delay, ns_period);
+
+    return true;
 }
 
 Command reset_stats = {
index c7d44b397e880fbeee78cfceb56a71f92beed3bc..8b1b3d276e1ccfc4d49fc44717f5e3bc14d06600 100644 (file)
 #include "args.hh"
 #include "command.hh"
 #include "dispatch_table.hh"
-#include "usage.hh"
 
 namespace
 {
 
 // For testing purposes.
-void
+bool
 do_sum(const DispatchTable &dt, Args &args)
 {
     uint64_t a, b, c, d, e, f;
     if (!args.pop(a) || !args.pop(b) || !args.pop(c, 0) ||
             !args.pop(d, 0) || !args.pop(e, 0) || !args.pop(f, 0))
-        usage();
+        return false;
 
     unsigned sum = (*dt.m5_sum)(a, b, c, d, e, f);
     std::cout << "Sum is " << sum << "." << std::endl;
+
+    return true;
 }
 
 Command sum = {
index 801b7af2a336dd81f9e71d245d3cf2f206e80aba..bef193296e9ba501ea73389a90e3c195585a3919 100644 (file)
@@ -33,7 +33,6 @@
 #include "args.hh"
 #include "command.hh"
 #include "dispatch_table.hh"
-#include "usage.hh"
 
 namespace
 {
@@ -75,13 +74,15 @@ write_file(const DispatchTable &dt, const std::string &filename,
     std::cerr << "Wrote " << offset << " bytes." << std::endl;
 }
 
-void
+bool
 do_write_file(const DispatchTable &dt, Args &args)
 {
     const std::string &filename = args.pop();
     const std::string &host_filename = args.pop(filename);
 
     write_file(dt, filename, host_filename);
+
+    return true;
 }
 
 Command write_file_cmd = {