4427 - support for '--trace' argv

This ports commit 4421 to the subx/ program.
This commit is contained in:
Kartik Agaram 2018-07-26 17:00:14 -07:00
parent 87fe3d7a9e
commit a7291869f5
3 changed files with 49 additions and 13 deletions

View File

@ -406,8 +406,6 @@ string trim(const string& s) {
using std::vector;
#include <list>
using std::list;
#include <map>
using std::map;
#include <set>
using std::set;

View File

@ -9,6 +9,19 @@ if (argc <= 1 || is_equal(argv[1], "--help")) {
return 0;
}
//: Support for option parsing.
//: Options always begin with '--' and are always the first arguments. An
//: option will never follow a non-option.
char** arg = &argv[1];
while (argc > 1 && starts_with(*arg, "--")) {
if (false)
; // no-op branch just so any further additions can consistently always start with 'else'
// End Commandline Options(*arg)
else
cerr << "skipping unknown option " << *arg << '\n';
--argc; ++argv; ++arg;
}
if (is_equal(argv[1], "help")) {
if (argc == 2) {
cerr << "help on what?\n";
@ -63,6 +76,8 @@ void init_help() {
" subx translate <input 'source' file> <output ELF binary>\n"
"- Run a SubX binary using SubX itself (for better error messages):\n"
" subx run <ELF binary>\n"
"Add '--trace' to any of these commands to also emit a trace, for debugging purposes.\n"
"However, options starting with '--' must always come before any other arguments.\n"
"\n"
"To start learning how to write SubX programs, run:\n"
" subx help\n"

View File

@ -77,14 +77,36 @@ struct trace_line {
};
:(before "End Globals")
bool Hide_errors = false;
bool Dump_trace = false;
string Dump_label = "";
bool Hide_errors = false; // if set, don't print even error trace lines to screen
bool Dump_trace = false; // if set, print trace lines to screen
string Dump_label = ""; // if set, print trace lines matching a single label to screen
:(before "End Reset")
Hide_errors = false;
Dump_trace = false;
Dump_label = "";
//: Support for tracing an entire run.
//: Traces can have a lot of overhead, so only turn them on when asked.
:(before "End Commandline Options(*arg)")
else if (is_equal(*arg, "--trace")) {
Save_trace = true;
}
:(before "End Commandline Parsing")
if (Save_trace) {
cerr << "initializing trace\n";
Trace_stream = new trace_stream;
}
:(code)
void cleanup_main() {
if (!Trace_stream) return;
if (Save_trace)
Trace_stream->save();
delete Trace_stream;
Trace_stream = NULL;
}
:(before "End One-time Setup")
atexit(cleanup_main);
:(before "End Types")
// Pre-define some global constants that trace_stream needs to know about.
// Since they're in the Types section, they'll be included in any cleaved
@ -116,6 +138,13 @@ struct trace_stream {
return *curr_stream;
}
void save() {
cerr << "saving trace to 'last_run'\n";
ofstream fout("last_run");
fout << readable_contents("");
fout.close();
}
// be sure to call this before messing with curr_stream or curr_label
void newline();
// useful for debugging
@ -189,7 +218,7 @@ ostream& operator<<(ostream& os, end /*unused*/) {
}
:(before "End Globals")
bool Save_trace = false;
bool Save_trace = false; // if set, write out trace to disk
// Trace_stream is a resource, lease_tracer uses RAII to manage it.
:(before "End Types")
@ -200,12 +229,7 @@ struct lease_tracer {
:(code)
lease_tracer::lease_tracer() { Trace_stream = new trace_stream; }
lease_tracer::~lease_tracer() {
if (!Trace_stream) return; // in case tests close Trace_stream
if (Save_trace) {
ofstream fout("last_trace");
fout << Trace_stream->readable_contents("");
fout.close();
}
if (Save_trace) Trace_stream->save();
delete Trace_stream, Trace_stream = NULL;
}
:(before "End Includes")
@ -371,7 +395,6 @@ using std::vector;
using std::list;
#include <set>
using std::set;
#include <algorithm>
#include <sstream>
using std::istringstream;