mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-11-20 02:47:11 +03:00
Rose: replace internal_report with program
Replace the use of the internal_report structure (for reports from engines, MPV etc) with the Rose program interpreter. SOM processing was reworked to use a new som_operation structure that is embedded in the appropriate instructions.
This commit is contained in:
committed by
Matthew Barr
parent
68851742cc
commit
36150bbc19
@@ -445,8 +445,9 @@ void replaceTempSomSlot(ReportManager &rm, NGHolder &g, u32 real_slot) {
|
||||
}
|
||||
|
||||
static
|
||||
void setPrefixReports(ReportManager &rm, NGHolder &g, u8 ir_type, u32 som_loc,
|
||||
const vector<DepthMinMax> &depths, bool prefix_by_rev) {
|
||||
void setPrefixReports(ReportManager &rm, NGHolder &g, ReportType ir_type,
|
||||
u32 som_loc, const vector<DepthMinMax> &depths,
|
||||
bool prefix_by_rev) {
|
||||
Report ir = makeCallback(0U, 0);
|
||||
ir.type = ir_type;
|
||||
ir.onmatch = som_loc;
|
||||
@@ -470,7 +471,7 @@ void setPrefixReports(ReportManager &rm, NGHolder &g, u8 ir_type, u32 som_loc,
|
||||
}
|
||||
|
||||
static
|
||||
void updatePrefixReports(ReportManager &rm, NGHolder &g, u8 ir_type) {
|
||||
void updatePrefixReports(ReportManager &rm, NGHolder &g, ReportType ir_type) {
|
||||
/* update the som action on the prefix report */
|
||||
for (auto v : inv_adjacent_vertices_range(g.accept, g)) {
|
||||
auto &reports = g[v].reports;
|
||||
@@ -555,7 +556,8 @@ bool finalRegion(const NGHolder &g,
|
||||
|
||||
static
|
||||
void replaceExternalReportsWithSomRep(ReportManager &rm, NGHolder &g,
|
||||
NFAVertex v, u8 ir_type, u64a param) {
|
||||
NFAVertex v, ReportType ir_type,
|
||||
u64a param) {
|
||||
assert(!g[v].reports.empty());
|
||||
|
||||
flat_set<ReportID> r_new;
|
||||
@@ -2409,6 +2411,33 @@ bool splitOffBestLiteral(const NGHolder &g,
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace the given graph's EXTERNAL_CALLBACK reports with
|
||||
* EXTERNAL_CALLBACK_SOM_PASS reports.
|
||||
*/
|
||||
void makeReportsSomPass(ReportManager &rm, NGHolder &g) {
|
||||
for (const auto &v : vertices_range(g)) {
|
||||
const auto &reports = g[v].reports;
|
||||
if (reports.empty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
flat_set<ReportID> new_reports;
|
||||
for (const ReportID &id : reports) {
|
||||
const Report &report = rm.getReport(id);
|
||||
if (report.type != EXTERNAL_CALLBACK) {
|
||||
new_reports.insert(id);
|
||||
continue;
|
||||
}
|
||||
Report report2 = report;
|
||||
report2.type = EXTERNAL_CALLBACK_SOM_PASS;
|
||||
new_reports.insert(rm.getInternalId(report2));
|
||||
}
|
||||
|
||||
g[v].reports = new_reports;
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
bool doLitHaigSom(NG &ng, NGHolder &g, som_type som) {
|
||||
ue2_literal lit;
|
||||
@@ -2431,6 +2460,8 @@ bool doLitHaigSom(NG &ng, NGHolder &g, som_type som) {
|
||||
|
||||
assert(lit.length() <= MAX_MASK2_WIDTH || !mixed_sensitivity(lit));
|
||||
|
||||
makeReportsSomPass(ng.rm, *rhs);
|
||||
|
||||
dumpHolder(*rhs, 91, "lithaig_rhs", ng.cc.grey);
|
||||
|
||||
vector<vector<CharReach> > triggers;
|
||||
@@ -2493,6 +2524,8 @@ bool doHaigLitHaigSom(NG &ng, NGHolder &g,
|
||||
return false; /* TODO: handle */
|
||||
}
|
||||
|
||||
makeReportsSomPass(ng.rm, *rhs);
|
||||
|
||||
dumpHolder(*lhs, 92, "haiglithaig_lhs", ng.cc.grey);
|
||||
dumpHolder(*rhs, 93, "haiglithaig_rhs", ng.cc.grey);
|
||||
|
||||
@@ -2628,6 +2661,8 @@ bool doMultiLitHaigSom(NG &ng, NGHolder &g, som_type som) {
|
||||
return false;
|
||||
}
|
||||
|
||||
makeReportsSomPass(ng.rm, *rhs);
|
||||
|
||||
dumpHolder(*rhs, 91, "lithaig_rhs", ng.cc.grey);
|
||||
|
||||
vector<vector<CharReach>> triggers;
|
||||
|
||||
Reference in New Issue
Block a user