rose: dump lit programs from frag map

This commit is contained in:
Justin Viiret 2017-01-31 11:10:30 +11:00 committed by Matthew Barr
parent c6bf1919d0
commit bd3357d3ac

View File

@ -1140,35 +1140,29 @@ void dumpProgram(ofstream &os, const RoseEngine *t, const char *pc) {
#undef PROGRAM_NEXT_INSTRUCTION #undef PROGRAM_NEXT_INSTRUCTION
static static
void dumpRoseLitPrograms(const RoseEngine *t, const string &filename) { void dumpRoseLitPrograms(const RoseBuildImpl &build, const RoseEngine *t,
const string &filename) {
ofstream os(filename); ofstream os(filename);
const u32 *litPrograms = // Collect all programs referenced by a literal fragment.
(const u32 *)loadFromByteCodeOffset(t, t->litProgramOffset); vector<u32> programs;
const u32 *delayRebuildPrograms = programs.reserve(build.final_to_frag_map.size());
(const u32 *)loadFromByteCodeOffset(t, t->litDelayRebuildProgramOffset);
for (u32 i = 0; i < t->literalCount; i++) { for (const auto &m : build.final_to_frag_map) {
os << "Literal " << i << endl; const auto &frag = m.second;
os << "---------------" << endl; if (frag.lit_program_offset) {
programs.push_back(frag.lit_program_offset);
if (litPrograms[i]) {
os << "Program @ " << litPrograms[i] << ":" << endl;
const char *prog =
(const char *)loadFromByteCodeOffset(t, litPrograms[i]);
dumpProgram(os, t, prog);
} else {
os << "<No Program>" << endl;
} }
if (frag.delay_program_offset) {
if (delayRebuildPrograms[i]) { programs.push_back(frag.delay_program_offset);
os << "Delay Rebuild Program @ " << delayRebuildPrograms[i] << ":"
<< endl;
const char *prog = (const char *)loadFromByteCodeOffset(
t, delayRebuildPrograms[i]);
dumpProgram(os, t, prog);
} }
}
sort_and_unique(programs);
for (u32 prog_offset : programs) {
os << "Program @ " << prog_offset << ":" << endl;
const char *prog = (const char *)loadFromByteCodeOffset(t, prog_offset);
dumpProgram(os, t, prog);
os << endl; os << endl;
} }
@ -1215,30 +1209,6 @@ void dumpRoseReportPrograms(const RoseEngine *t, const string &filename) {
os.close(); os.close();
} }
static
void dumpRoseDelayPrograms(const RoseEngine *t, const string &filename) {
ofstream os(filename);
const u32 *programs =
(const u32 *)loadFromByteCodeOffset(t, t->delayProgramOffset);
for (u32 i = 0; i < t->delay_count; i++) {
os << "Delay entry " << i << endl;
os << "---------------" << endl;
if (programs[i]) {
os << "Program @ " << programs[i] << ":" << endl;
const char *prog =
(const char *)loadFromByteCodeOffset(t, programs[i]);
dumpProgram(os, t, prog);
} else {
os << "<No Program>" << endl;
}
}
os.close();
}
static static
void dumpRoseAnchoredPrograms(const RoseEngine *t, const string &filename) { void dumpRoseAnchoredPrograms(const RoseEngine *t, const string &filename) {
ofstream os(filename); ofstream os(filename);
@ -1896,10 +1866,14 @@ void roseDumpComponents(const RoseEngine *t, bool dump_raw,
dumpAnchored(t, base); dumpAnchored(t, base);
dumpRevComponentInfo(t, base); dumpRevComponentInfo(t, base);
dumpRevNfas(t, dump_raw, base); dumpRevNfas(t, dump_raw, base);
dumpRoseLitPrograms(t, base + "/rose_lit_programs.txt"); }
static
void roseDumpPrograms(const RoseBuildImpl &build, const RoseEngine *t,
const string &base) {
dumpRoseLitPrograms(build, t, base + "/rose_lit_programs.txt");
dumpRoseEodPrograms(t, base + "/rose_eod_programs.txt"); dumpRoseEodPrograms(t, base + "/rose_eod_programs.txt");
dumpRoseReportPrograms(t, base + "/rose_report_programs.txt"); dumpRoseReportPrograms(t, base + "/rose_report_programs.txt");
dumpRoseDelayPrograms(t, base + "/rose_delay_programs.txt");
dumpRoseAnchoredPrograms(t, base + "/rose_anchored_programs.txt"); dumpRoseAnchoredPrograms(t, base + "/rose_anchored_programs.txt");
} }
@ -1928,6 +1902,7 @@ void dumpRose(const RoseBuild &build_base, const RoseEngine *t,
fclose(f); fclose(f);
roseDumpComponents(t, false, grey.dumpPath); roseDumpComponents(t, false, grey.dumpPath);
roseDumpPrograms(build, t, grey.dumpPath);
// Graph. // Graph.
dumpRoseGraph(build, t, "rose.dot"); dumpRoseGraph(build, t, "rose.dot");