mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-06-28 16:41:01 +03:00
rose: preserve lit properties when building masks
This fixes a bug with commit 6a6b0e5, which did not preserve the requires_explode and requires_benefits properties when a new literal was generated to add an HWLM and/cmp mask. Also extends the requires_explode handling to allow masked literals.
This commit is contained in:
parent
b73bd9b6e1
commit
bfaa0acaea
@ -381,7 +381,8 @@ void findMoreLiteralMasks(RoseBuildImpl &build) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
assert(!msk.empty());
|
assert(!msk.empty());
|
||||||
DEBUG_PRINTF("found advisory mask for lit_id=%u\n", id);
|
DEBUG_PRINTF("found advisory mask for lit_id=%u (%s)\n", id,
|
||||||
|
dumpString(lit.s).c_str());
|
||||||
u32 new_id = build.getLiteralId(lit.s, msk, cmp, lit.delay, lit.table);
|
u32 new_id = build.getLiteralId(lit.s, msk, cmp, lit.delay, lit.table);
|
||||||
assert(new_id != id);
|
assert(new_id != id);
|
||||||
DEBUG_PRINTF("replacing with new lit_id=%u\n", new_id);
|
DEBUG_PRINTF("replacing with new lit_id=%u\n", new_id);
|
||||||
@ -390,6 +391,8 @@ void findMoreLiteralMasks(RoseBuildImpl &build) {
|
|||||||
// We assume that this transform is happening prior to group assignment.
|
// We assume that this transform is happening prior to group assignment.
|
||||||
assert(lit_info.group_mask == 0);
|
assert(lit_info.group_mask == 0);
|
||||||
auto &new_info = build.literal_info.at(new_id);
|
auto &new_info = build.literal_info.at(new_id);
|
||||||
|
|
||||||
|
// Move the vertices across.
|
||||||
new_info.vertices.insert(begin(lit_info.vertices),
|
new_info.vertices.insert(begin(lit_info.vertices),
|
||||||
end(lit_info.vertices));
|
end(lit_info.vertices));
|
||||||
for (auto v : lit_info.vertices) {
|
for (auto v : lit_info.vertices) {
|
||||||
@ -397,6 +400,10 @@ void findMoreLiteralMasks(RoseBuildImpl &build) {
|
|||||||
build.g[v].literals.insert(new_id);
|
build.g[v].literals.insert(new_id);
|
||||||
}
|
}
|
||||||
lit_info.vertices.clear();
|
lit_info.vertices.clear();
|
||||||
|
|
||||||
|
// Preserve other properties.
|
||||||
|
new_info.requires_explode = lit_info.requires_explode;
|
||||||
|
new_info.requires_benefits = lit_info.requires_benefits;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -546,17 +553,24 @@ vector<hwlmLiteral> fillHamsterLiteralList(const RoseBuildImpl &build,
|
|||||||
|
|
||||||
if (info.requires_explode) {
|
if (info.requires_explode) {
|
||||||
DEBUG_PRINTF("exploding lit\n");
|
DEBUG_PRINTF("exploding lit\n");
|
||||||
const vector<u8> empty_msk; // msk/cmp will be empty
|
|
||||||
case_iter cit = caseIterateBegin(lit);
|
case_iter cit = caseIterateBegin(lit);
|
||||||
case_iter cite = caseIterateEnd();
|
case_iter cite = caseIterateEnd();
|
||||||
for (; cit != cite; ++cit) {
|
for (; cit != cite; ++cit) {
|
||||||
|
string s = *cit;
|
||||||
|
bool nocase = false;
|
||||||
|
|
||||||
DEBUG_PRINTF("id=%u, s='%s', nocase=%d, noruns=%d msk=%s, "
|
DEBUG_PRINTF("id=%u, s='%s', nocase=%d, noruns=%d msk=%s, "
|
||||||
"cmp=%s (exploded)\n",
|
"cmp=%s (exploded)\n",
|
||||||
final_id, escapeString(lit.get_string()).c_str(),
|
final_id, escapeString(s).c_str(), nocase, noruns,
|
||||||
0, noruns, dumpMask(msk).c_str(),
|
dumpMask(msk).c_str(), dumpMask(cmp).c_str());
|
||||||
dumpMask(cmp).c_str());
|
|
||||||
lits.emplace_back(*cit, false, noruns, final_id, groups,
|
if (!maskIsConsistent(s, nocase, msk, cmp)) {
|
||||||
empty_msk, empty_msk);
|
DEBUG_PRINTF("msk/cmp for literal can't match, skipping\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
lits.emplace_back(move(s), nocase, noruns, final_id, groups,
|
||||||
|
msk, cmp);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const std::string &s = lit.get_string();
|
const std::string &s = lit.get_string();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user