From 69682ed2630017ba4996938682b649e5ca9a72a0 Mon Sep 17 00:00:00 2001 From: Justin Viiret Date: Thu, 14 Jan 2016 10:24:19 +1100 Subject: [PATCH] Account for multi-dfa case with ANCHORED_DELAY Specifically, we must set build_context::floatingMinLiteralMatchOffset to 1 when thew anchored table contains multiple DFAs, as they can produce unordered matches. This check was already been done, but too late to affect the generation of ANCHORED_DELAY instructions. --- src/rose/rose_build_anchored.cpp | 10 +++------- src/rose/rose_build_anchored.h | 7 ++++++- src/rose/rose_build_bytecode.cpp | 19 ++++++++++++------- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/rose/rose_build_anchored.cpp b/src/rose/rose_build_anchored.cpp index ef0026d4..d7c255fc 100644 --- a/src/rose/rose_build_anchored.cpp +++ b/src/rose/rose_build_anchored.cpp @@ -235,13 +235,9 @@ u32 anchoredStateSize(const anchored_matcher_info *atable) { return curr->state_offset + nfa->scratchStateSize; } -bool anchoredIsMulti(const RoseEngine &engine) { - const struct anchored_matcher_info *curr - = (const anchored_matcher_info *)getALiteralMatcher(&engine); - - return curr && curr->next_offset; - } - +bool anchoredIsMulti(const anchored_matcher_info *atable) { + return atable && atable->next_offset; +} namespace { diff --git a/src/rose/rose_build_anchored.h b/src/rose/rose_build_anchored.h index 3ccd8cfb..a212c84d 100644 --- a/src/rose/rose_build_anchored.h +++ b/src/rose/rose_build_anchored.h @@ -51,7 +51,12 @@ aligned_unique_ptr buildAnchoredAutomataMatcher(RoseBuildImpl &build, size_t *asize); u32 anchoredStateSize(const anchored_matcher_info *atable); -bool anchoredIsMulti(const RoseEngine &engine); + +/** + * \brief True if there is an anchored matcher and it consists of multiple + * DFAs. + */ +bool anchoredIsMulti(const anchored_matcher_info *atable); #define ANCHORED_FAIL 0 #define ANCHORED_SUCCESS 1 diff --git a/src/rose/rose_build_bytecode.cpp b/src/rose/rose_build_bytecode.cpp index 910f320b..2fa710f4 100644 --- a/src/rose/rose_build_bytecode.cpp +++ b/src/rose/rose_build_bytecode.cpp @@ -2243,7 +2243,15 @@ void enforceEngineSizeLimit(const NFA *n, const size_t nfa_size, const Grey &gre } static -u32 findMinFloatingLiteralMatch(const RoseBuildImpl &build) { +u32 findMinFloatingLiteralMatch(const RoseBuildImpl &build, + const anchored_matcher_info *atable) { + if (anchoredIsMulti(atable)) { + DEBUG_PRINTF("multiple anchored dfas\n"); + /* We must regard matches from other anchored tables as unordered, as + * we do for floating matches. */ + return 1; + } + const RoseGraph &g = build.g; u32 minWidth = ROSE_BOUND_INF; for (auto v : vertices_range(g)) { @@ -4036,7 +4044,8 @@ aligned_unique_ptr RoseBuildImpl::buildFinalEngine(u32 minWidth) { aligned_unique_ptr sbtable = buildSmallBlockMatcher(*this, &sbsize); build_context bc; - bc.floatingMinLiteralMatchOffset = findMinFloatingLiteralMatch(*this); + bc.floatingMinLiteralMatchOffset = + findMinFloatingLiteralMatch(*this, atable.get()); // Build NFAs set no_retrigger_queues; @@ -4363,12 +4372,8 @@ aligned_unique_ptr RoseBuildImpl::buildFinalEngine(u32 minWidth) { write_out(&engine->state_init, (char *)engine.get(), state_scatter, state_scatter_aux_offset); - if (anchoredIsMulti(*engine)) { - DEBUG_PRINTF("multiple anchored dfas\n"); + if (anchoredIsMulti(atable.get())) { engine->maxSafeAnchoredDROffset = 1; - engine->floatingMinLiteralMatchOffset = 1; /* regard matches from other - anchored tables as - floating as unordered. */ } else { /* overly conservative, really need the min offset of non dr anchored matches */