hwlm: use bytecode_ptr for HWLM structures

This commit is contained in:
Justin Viiret
2017-04-03 13:56:49 +10:00
committed by Matthew Barr
parent 813f1e3fb9
commit 7b17d418e7
5 changed files with 52 additions and 71 deletions

View File

@@ -5832,35 +5832,30 @@ bytecode_ptr<RoseEngine> RoseBuildImpl::buildFinalEngine(u32 minWidth) {
// Build floating HWLM matcher.
rose_group fgroups = 0;
size_t fsize = 0;
auto ftable = buildFloatingMatcher(*this, fragments,
bc.longLitLengthThreshold,
&fgroups, &fsize, &historyRequired);
bc.longLitLengthThreshold, &fgroups, &historyRequired);
if (ftable) {
proto.fmatcherOffset = bc.engine_blob.add(ftable.get(), fsize, 64);
proto.fmatcherOffset = bc.engine_blob.add(ftable);
bc.resources.has_floating = true;
}
// Build delay rebuild HWLM matcher.
size_t drsize = 0;
auto drtable = buildDelayRebuildMatcher(*this, fragments,
bc.longLitLengthThreshold, &drsize);
bc.longLitLengthThreshold);
if (drtable) {
proto.drmatcherOffset = bc.engine_blob.add(drtable.get(), drsize, 64);
proto.drmatcherOffset = bc.engine_blob.add(drtable);
}
// Build EOD-anchored HWLM matcher.
size_t esize = 0;
auto etable = buildEodAnchoredMatcher(*this, fragments, &esize);
auto etable = buildEodAnchoredMatcher(*this, fragments);
if (etable) {
proto.ematcherOffset = bc.engine_blob.add(etable.get(), esize, 64);
proto.ematcherOffset = bc.engine_blob.add(etable);
}
// Build small-block HWLM matcher.
size_t sbsize = 0;
auto sbtable = buildSmallBlockMatcher(*this, fragments, &sbsize);
auto sbtable = buildSmallBlockMatcher(*this, fragments);
if (sbtable) {
proto.sbmatcherOffset = bc.engine_blob.add(sbtable.get(), sbsize, 64);
proto.sbmatcherOffset = bc.engine_blob.add(sbtable);
}
proto.activeArrayCount = proto.leftfixBeginQueue;

View File

@@ -805,12 +805,11 @@ void buildAccel(const RoseBuildImpl &build, const MatcherProto &mp,
buildForwardAccel(&hwlm, mp.accel_lits, build.getInitialGroups());
}
aligned_unique_ptr<HWLM>
buildFloatingMatcher(const RoseBuildImpl &build,
const vector<LitFragment> &fragments,
size_t longLitLengthThreshold, rose_group *fgroups,
size_t *fsize, size_t *historyRequired) {
*fsize = 0;
bytecode_ptr<HWLM> buildFloatingMatcher(const RoseBuildImpl &build,
const vector<LitFragment> &fragments,
size_t longLitLengthThreshold,
rose_group *fgroups,
size_t *historyRequired) {
*fgroups = 0;
auto mp = makeMatcherProto(build, fragments, ROSE_FLOATING, false,
@@ -838,18 +837,14 @@ buildFloatingMatcher(const RoseBuildImpl &build,
*historyRequired = max(*historyRequired, mp.history_required);
}
*fsize = hwlmSize(hwlm.get());
assert(*fsize);
DEBUG_PRINTF("built floating literal table size %zu bytes\n", *fsize);
DEBUG_PRINTF("built floating literal table size %zu bytes\n", hwlm.size());
return hwlm;
}
aligned_unique_ptr<HWLM> buildDelayRebuildMatcher(const RoseBuildImpl &build,
const vector<LitFragment> &fragments,
size_t longLitLengthThreshold,
size_t *drsize) {
*drsize = 0;
bytecode_ptr<HWLM>
buildDelayRebuildMatcher(const RoseBuildImpl &build,
const vector<LitFragment> &fragments,
size_t longLitLengthThreshold) {
if (!build.cc.streaming) {
DEBUG_PRINTF("not streaming\n");
return nullptr;
@@ -870,17 +865,13 @@ aligned_unique_ptr<HWLM> buildDelayRebuildMatcher(const RoseBuildImpl &build,
buildAccel(build, mp, *hwlm);
*drsize = hwlmSize(hwlm.get());
assert(*drsize);
DEBUG_PRINTF("built delay rebuild table size %zu bytes\n", *drsize);
DEBUG_PRINTF("built delay rebuild table size %zu bytes\n", hwlm.size());
return hwlm;
}
aligned_unique_ptr<HWLM>
bytecode_ptr<HWLM>
buildSmallBlockMatcher(const RoseBuildImpl &build,
const vector<LitFragment> &fragments, size_t *sbsize) {
*sbsize = 0;
const vector<LitFragment> &fragments) {
if (build.cc.streaming) {
DEBUG_PRINTF("streaming mode\n");
return nullptr;
@@ -932,17 +923,14 @@ buildSmallBlockMatcher(const RoseBuildImpl &build,
buildAccel(build, mp, *hwlm);
*sbsize = hwlmSize(hwlm.get());
assert(*sbsize);
DEBUG_PRINTF("built small block literal table size %zu bytes\n", *sbsize);
DEBUG_PRINTF("built small block literal table size %zu bytes\n",
hwlm.size());
return hwlm;
}
aligned_unique_ptr<HWLM>
bytecode_ptr<HWLM>
buildEodAnchoredMatcher(const RoseBuildImpl &build,
const vector<LitFragment> &fragments, size_t *esize) {
*esize = 0;
const vector<LitFragment> &fragments) {
auto mp = makeMatcherProto(build, fragments, ROSE_EOD_ANCHORED, false,
build.ematcher_region_size);
@@ -962,9 +950,8 @@ buildEodAnchoredMatcher(const RoseBuildImpl &build,
buildAccel(build, mp, *hwlm);
*esize = hwlmSize(hwlm.get());
assert(*esize);
DEBUG_PRINTF("built eod-anchored literal table size %zu bytes\n", *esize);
DEBUG_PRINTF("built eod-anchored literal table size %zu bytes\n",
hwlm.size());
return hwlm;
}

View File

@@ -35,6 +35,7 @@
#define ROSE_BUILD_MATCHERS_H
#include "rose_build_impl.h"
#include "util/bytecode_ptr.h"
#include <vector>
@@ -57,25 +58,24 @@ struct LitFragment {
u32 delay_program_offset = ROSE_INVALID_PROG_OFFSET;
};
aligned_unique_ptr<HWLM> buildFloatingMatcher(const RoseBuildImpl &build,
const std::vector<LitFragment> &fragments,
size_t longLitLengthThreshold,
rose_group *fgroups,
size_t *fsize,
size_t *historyRequired);
bytecode_ptr<HWLM>
buildFloatingMatcher(const RoseBuildImpl &build,
const std::vector<LitFragment> &fragments,
size_t longLitLengthThreshold, rose_group *fgroups,
size_t *historyRequired);
aligned_unique_ptr<HWLM> buildDelayRebuildMatcher(const RoseBuildImpl &build,
const std::vector<LitFragment> &fragments,
size_t longLitLengthThreshold,
size_t *drsize);
bytecode_ptr<HWLM>
buildDelayRebuildMatcher(const RoseBuildImpl &build,
const std::vector<LitFragment> &fragments,
size_t longLitLengthThreshold);
aligned_unique_ptr<HWLM> buildSmallBlockMatcher(const RoseBuildImpl &build,
const std::vector<LitFragment> &fragments,
size_t *sbsize);
bytecode_ptr<HWLM>
buildSmallBlockMatcher(const RoseBuildImpl &build,
const std::vector<LitFragment> &fragments);
aligned_unique_ptr<HWLM> buildEodAnchoredMatcher(const RoseBuildImpl &build,
const std::vector<LitFragment> &fragments,
size_t *esize);
bytecode_ptr<HWLM>
buildEodAnchoredMatcher(const RoseBuildImpl &build,
const std::vector<LitFragment> &fragments);
void findMoreLiteralMasks(RoseBuildImpl &build);