diff --git a/src/rose/program_runtime.h b/src/rose/program_runtime.h index 10a87c8b..090913ae 100644 --- a/src/rose/program_runtime.h +++ b/src/rose/program_runtime.h @@ -484,7 +484,6 @@ static rose_inline hwlmcb_rv_t roseReport(const struct RoseEngine *t, struct hs_scratch *scratch, u64a end, ReportID onmatch, s32 offset_adjust, u32 ekey) { - assert(!t->needsCatchup || end == scratch->tctxt.minMatchOffset); DEBUG_PRINTF("firing callback onmatch=%u, end=%llu\n", onmatch, end); updateLastMatchOffset(&scratch->tctxt, end); @@ -518,13 +517,11 @@ hwlmcb_rv_t roseCatchUpAndHandleChainMatch(const struct RoseEngine *t, } static rose_inline -void roseHandleSom(UNUSED const struct RoseEngine *t, - struct hs_scratch *scratch, const struct som_operation *sr, +void roseHandleSom(struct hs_scratch *scratch, const struct som_operation *sr, u64a end) { DEBUG_PRINTF("end=%llu, minMatchOffset=%llu\n", end, scratch->tctxt.minMatchOffset); - assert(!t->needsCatchup || end == scratch->tctxt.minMatchOffset); updateLastMatchOffset(&scratch->tctxt, end); handleSomInternal(scratch, sr, end); } @@ -533,7 +530,6 @@ static rose_inline hwlmcb_rv_t roseReportSom(const struct RoseEngine *t, struct hs_scratch *scratch, u64a start, u64a end, ReportID onmatch, s32 offset_adjust, u32 ekey) { - assert(!t->needsCatchup || end == scratch->tctxt.minMatchOffset); DEBUG_PRINTF("firing som callback onmatch=%u, start=%llu, end=%llu\n", onmatch, start, end); updateLastMatchOffset(&scratch->tctxt, end); @@ -553,13 +549,11 @@ hwlmcb_rv_t roseReportSom(const struct RoseEngine *t, } static rose_inline -void roseHandleSomSom(UNUSED const struct RoseEngine *t, - struct hs_scratch *scratch, +void roseHandleSomSom(struct hs_scratch *scratch, const struct som_operation *sr, u64a start, u64a end) { DEBUG_PRINTF("start=%llu, end=%llu, minMatchOffset=%llu\n", start, end, scratch->tctxt.minMatchOffset); - assert(!t->needsCatchup || end == scratch->tctxt.minMatchOffset); updateLastMatchOffset(&scratch->tctxt, end); setSomFromSomAware(scratch, sr, start, end); } @@ -2211,14 +2205,14 @@ hwlmcb_rv_t roseRunProgram_i(const struct RoseEngine *t, PROGRAM_CASE(REPORT_SOM_INT) { updateSeqPoint(tctxt, end, from_mpv); - roseHandleSom(t, scratch, &ri->som, end); + roseHandleSom(scratch, &ri->som, end); work_done = 1; } PROGRAM_NEXT_INSTRUCTION PROGRAM_CASE(REPORT_SOM_AWARE) { updateSeqPoint(tctxt, end, from_mpv); - roseHandleSomSom(t, scratch, &ri->som, som, end); + roseHandleSomSom(scratch, &ri->som, som, end); work_done = 1; } PROGRAM_NEXT_INSTRUCTION diff --git a/src/rose/rose_build_bytecode.cpp b/src/rose/rose_build_bytecode.cpp index bd7481ab..a53cc534 100644 --- a/src/rose/rose_build_bytecode.cpp +++ b/src/rose/rose_build_bytecode.cpp @@ -231,9 +231,9 @@ struct build_context : noncopyable { * RoseEngine. */ RoseEngineBlob engine_blob; - /** \brief True if reports need CATCH_UP instructions, to catch up anchored - * matches, suffixes, outfixes etc. */ - bool needs_catchup = false; + /** \brief True if reports need CATCH_UP instructions to catch up suffixes, + * outfixes etc. */ + bool needs_catchup; /** \brief True if this Rose engine has an MPV engine. */ bool needs_mpv_catchup = false; @@ -327,38 +327,39 @@ u32 countRosePrefixes(const vector &roses) { } /** - * \brief True if this Rose engine needs to run a catch up whenever a report is - * generated. + * \brief True if this Rose engine needs to run a catch up whenever a literal + * report is generated. * * Catch up is necessary if there are output-exposed engines (suffixes, - * outfixes) or an anchored table (anchored literals, acyclic DFAs). + * outfixes). */ static -bool needsCatchup(const RoseBuildImpl &build, - const vector &anchored_dfas) { +bool needsCatchup(const RoseBuildImpl &build) { + /* Note: we could be more selective about when we need to generate catch up + * instructions rather than just a boolean yes/no - for instance, if we know + * that a role can only match before the point that an outfix/suffix could + * match, we do not strictly need a catchup instruction. + * + * However, this would add a certain amount of complexity to the + * catchup logic and would likely have limited applicability - how many + * reporting roles have a fixed max offset and how much time is spent on + * catchup for these cases? + */ + if (!build.outfixes.empty()) { + /* TODO: check that they have non-eod reports */ DEBUG_PRINTF("has outfixes\n"); return true; } - if (!anchored_dfas.empty()) { - DEBUG_PRINTF("has anchored dfas\n"); - return true; - } const RoseGraph &g = build.g; for (auto v : vertices_range(g)) { - if (build.root == v) { - continue; - } - if (build.anchored_root == v) { - continue; - } if (g[v].suffix) { + /* TODO: check that they have non-eod reports */ DEBUG_PRINTF("vertex %zu has suffix\n", g[v].index); return true; } - } DEBUG_PRINTF("no need for catch-up on report\n"); @@ -4794,7 +4795,7 @@ static RoseProgram makeLiteralProgram(const RoseBuildImpl &build, build_context &bc, ProgramBuild &prog_build, u32 lit_id, const vector &lit_edges, - bool is_anchored_program) { + bool is_anchored_replay_program) { const auto &g = build.g; DEBUG_PRINTF("lit id=%u, %zu lit edges\n", lit_id, lit_edges.size()); @@ -4844,7 +4845,7 @@ RoseProgram makeLiteralProgram(const RoseBuildImpl &build, build_context &bc, makeGroupSquashInstruction(build, lit_id, root_block); // Literal may be anchored and need to be recorded. - if (!is_anchored_program) { + if (!is_anchored_replay_program) { makeRecordAnchoredInstruction(build, prog_build, lit_id, root_block); } @@ -4863,7 +4864,7 @@ static RoseProgram makeLiteralProgram(const RoseBuildImpl &build, build_context &bc, ProgramBuild &prog_build, u32 lit_id, const map> &lit_edge_map, - bool is_anchored_program) { + bool is_anchored_replay_program) { const vector no_edges; DEBUG_PRINTF("lit_id=%u\n", lit_id); @@ -4875,7 +4876,7 @@ RoseProgram makeLiteralProgram(const RoseBuildImpl &build, build_context &bc, } return makeLiteralProgram(build, bc, prog_build, lit_id, *edges_ptr, - is_anchored_program); + is_anchored_replay_program); } /** @@ -5726,7 +5727,7 @@ bytecode_ptr RoseBuildImpl::buildFinalEngine(u32 minWidth) { u32 floatingMinLiteralMatchOffset = findMinFloatingLiteralMatch(*this, anchored_dfas); bc.longLitLengthThreshold = longLitLengthThreshold; - bc.needs_catchup = needsCatchup(*this, anchored_dfas); + bc.needs_catchup = needsCatchup(*this); recordResources(bc.resources, *this, fragments); if (!anchored_dfas.empty()) { bc.resources.has_anchored = true; @@ -5891,8 +5892,6 @@ bytecode_ptr RoseBuildImpl::buildFinalEngine(u32 minWidth) { proto.somLocationCount = ssm.numSomSlots(); proto.somLocationFatbitSize = fatbit_size(proto.somLocationCount); - proto.needsCatchup = bc.needs_catchup ? 1 : 0; - proto.runtimeImpl = pickRuntimeImpl(*this, bc.resources, proto.outfixEndQueue); proto.mpvTriggeredByLeaf = anyEndfixMpvTriggers(*this); diff --git a/src/rose/rose_build_dump.cpp b/src/rose/rose_build_dump.cpp index a52830b0..73ed830e 100644 --- a/src/rose/rose_build_dump.cpp +++ b/src/rose/rose_build_dump.cpp @@ -2112,7 +2112,6 @@ void roseDumpStructRaw(const RoseEngine *t, FILE *f) { DUMP_U8(t, canExhaust); DUMP_U8(t, hasSom); DUMP_U8(t, somHorizon); - DUMP_U8(t, needsCatchup); DUMP_U32(t, mode); DUMP_U32(t, historyRequired); DUMP_U32(t, ekeyCount); diff --git a/src/rose/rose_internal.h b/src/rose/rose_internal.h index 06a9b069..777e7234 100644 --- a/src/rose/rose_internal.h +++ b/src/rose/rose_internal.h @@ -304,7 +304,6 @@ struct RoseEngine { u8 hasSom; /**< has at least one pattern which tracks SOM. */ u8 somHorizon; /**< width in bytes of SOM offset storage (governed by SOM precision) */ - u8 needsCatchup; /** catch up needs to be run on every report. */ u32 mode; /**< scanning mode, one of HS_MODE_{BLOCK,STREAM,VECTORED} */ u32 historyRequired; /**< max amount of history required for streaming */ u32 ekeyCount; /**< number of exhaustion keys */