simple offset accel for mcclellan start state

This commit is contained in:
Alex Coyte
2016-02-16 13:37:39 +11:00
committed by Matthew Barr
parent d125601152
commit f53c093baa
11 changed files with 698 additions and 316 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2015, Intel Corporation
* Copyright (c) 2015-2016, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -85,10 +85,11 @@ public:
vector<u32> &reports_eod /* out */,
u8 *isSingleReport /* out */,
ReportID *arbReport /* out */) const override;
void find_escape_strings(dstate_id_t this_idx,
escape_info *out) const override;
escape_info find_escape_strings(dstate_id_t this_idx) const override;
size_t accelSize(void) const override { return sizeof(gough_accel); }
void buildAccel(dstate_id_t this_idx, void *accel_out) override;
void buildAccel(dstate_id_t this_idx, const escape_info &info,
void *accel_out) override;
u32 max_allowed_offset_accel() const override { return 0; }
raw_som_dfa &rdfa;
const GoughGraph &gg;
@@ -1145,32 +1146,43 @@ aligned_unique_ptr<NFA> goughCompile(raw_som_dfa &raw, u8 somPrecision,
return gough_dfa;
}
void gough_build_strat::find_escape_strings(dstate_id_t this_idx,
escape_info *out) const {
escape_info gough_build_strat::find_escape_strings(dstate_id_t this_idx) const {
escape_info rv;
if (!contains(accel_gough_info, this_idx)) {
out->outs = CharReach::dot();
out->outs2_broken = true;
return;
rv.outs = CharReach::dot();
rv.outs2_broken = true;
return rv;
}
mcclellan_build_strat::find_escape_strings(this_idx, out);
rv = mcclellan_build_strat::find_escape_strings(this_idx);
assert(!rv.offset); /* should have been limited by strat */
if (rv.offset) {
rv.outs = CharReach::dot();
rv.outs2_broken = true;
return rv;
}
if (!accel_gough_info.at(this_idx).two_byte) {
out->outs2_broken = true;
rv.outs2_broken = true;
}
return rv;
}
void gough_build_strat::buildAccel(dstate_id_t this_idx, void *accel_out) {
void gough_build_strat::buildAccel(dstate_id_t this_idx, const escape_info &info,
void *accel_out) {
assert(mcclellan_build_strat::accelSize() == sizeof(AccelAux));
gough_accel *accel = (gough_accel *)accel_out;
/* build a plain accelaux so we can work out where we can get to */
mcclellan_build_strat::buildAccel(this_idx, &accel->accel);
mcclellan_build_strat::buildAccel(this_idx, info, &accel->accel);
DEBUG_PRINTF("state %hu is accel with type %hhu\n", this_idx,
accel->accel.accel_type);
if (accel->accel.accel_type == ACCEL_NONE) {
return;
}
assert(!accel->accel.generic.offset);
assert(contains(accel_gough_info, this_idx));
accel->margin_dist = verify_u8(accel_gough_info.at(this_idx).margin);
built_accel[accel] = this_idx;