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.
This commit is contained in:
Justin Viiret 2016-01-14 10:24:19 +11:00 committed by Matthew Barr
parent d7c8ffc7fd
commit 69682ed263
3 changed files with 21 additions and 15 deletions

View File

@ -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 {

View File

@ -51,7 +51,12 @@ aligned_unique_ptr<anchored_matcher_info>
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

View File

@ -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<RoseEngine> RoseBuildImpl::buildFinalEngine(u32 minWidth) {
aligned_unique_ptr<HWLM> sbtable = buildSmallBlockMatcher(*this, &sbsize);
build_context bc;
bc.floatingMinLiteralMatchOffset = findMinFloatingLiteralMatch(*this);
bc.floatingMinLiteralMatchOffset =
findMinFloatingLiteralMatch(*this, atable.get());
// Build NFAs
set<u32> no_retrigger_queues;
@ -4363,12 +4372,8 @@ aligned_unique_ptr<RoseEngine> 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 */