]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
mpv: native report remapping
authorJustin Viiret <justin.viiret@intel.com>
Tue, 19 Apr 2016 05:22:20 +0000 (15:22 +1000)
committerMatthew Barr <matthew.barr@intel.com>
Wed, 18 May 2016 06:22:01 +0000 (16:22 +1000)
src/nfa/mpvcompile.cpp
src/nfa/mpvcompile.h
src/rose/rose_build_bytecode.cpp

index 7521afef8cc50d7ad5f69771aa99663a0e7db399..b024b530222c95f96bbe234fd47eb1cda5250d46 100644 (file)
@@ -36,6 +36,7 @@
 #include "util/alloc.h"
 #include "util/multibit_internal.h"
 #include "util/order_check.h"
+#include "util/report_manager.h"
 #include "util/verify_types.h"
 
 #include <algorithm>
@@ -82,13 +83,21 @@ struct ClusterKey {
 } // namespace
 
 static
-void writePuffette(mpv_puffette *out, const raw_puff &rp) {
+void writePuffette(mpv_puffette *out, const raw_puff &rp,
+                   const ReportManager &rm) {
     DEBUG_PRINTF("outputting %u %d %u to %p\n", rp.repeats, (int)rp.unbounded,
                  rp.report, out);
     out->repeats = rp.repeats;
     out->unbounded = rp.unbounded;
     out->simple_exhaust = rp.simple_exhaust;
-    out->report = rp.report;
+    out->report = rm.getProgramOffset(rp.report);
+}
+
+static
+void writeSentinel(mpv_puffette *out) {
+    DEBUG_PRINTF("outputting sentinel to %p\n", out);
+    memset(out, 0, sizeof(*out));
+    out->report = INVALID_REPORT;
 }
 
 static
@@ -147,8 +156,8 @@ void populateClusters(const vector<raw_puff> &puffs_in,
 
 static
 void writeKiloPuff(const map<ClusterKey, vector<raw_puff>>::const_iterator &it,
-                   u32 counter_offset, mpv *m, mpv_kilopuff *kp,
-                   mpv_puffette **pa) {
+                   const ReportManager &rm, u32 counter_offset, mpv *m,
+                   mpv_kilopuff *kp, mpv_puffette **pa) {
     const CharReach &reach = it->first.reach;
     const vector<raw_puff> &puffs = it->second;
 
@@ -181,11 +190,11 @@ void writeKiloPuff(const map<ClusterKey, vector<raw_puff>>::const_iterator &it,
     kp->puffette_offset = verify_u32((char *)*pa - (char *)m);
     for (size_t i = 0; i < puffs.size(); i++) {
         assert(!it->first.auto_restart || puffs[i].unbounded);
-        writePuffette(*pa + i, puffs[i]);
+        writePuffette(*pa + i, puffs[i], rm);
     }
 
     *pa += puffs.size();
-    writePuffette(*pa, raw_puff(0U, false, INVALID_REPORT, CharReach()));
+    writeSentinel(*pa);
     ++*pa;
 
     writeDeadPoint(kp, puffs);
@@ -300,7 +309,8 @@ const mpv_counter_info &findCounter(const vector<mpv_counter_info> &counters,
 }
 
 aligned_unique_ptr<NFA> mpvCompile(const vector<raw_puff> &puffs_in,
-                                   const vector<raw_puff> &triggered_puffs) {
+                                   const vector<raw_puff> &triggered_puffs,
+                                   const ReportManager &rm) {
     assert(!puffs_in.empty() || !triggered_puffs.empty());
     u32 puffette_count = puffs_in.size() + triggered_puffs.size();
 
@@ -340,7 +350,7 @@ aligned_unique_ptr<NFA> mpvCompile(const vector<raw_puff> &puffs_in,
          + sizeof(mpv_counter_info) * counters.size());
     mpv_puffette *pa = pa_base;
 
-    writePuffette(pa, raw_puff(0U, false, INVALID_REPORT, CharReach()));
+    writeSentinel(pa);
 
     ++pa; /* skip init sentinel */
 
@@ -366,8 +376,9 @@ aligned_unique_ptr<NFA> mpvCompile(const vector<raw_puff> &puffs_in,
     mpv_kilopuff *kp_begin = (mpv_kilopuff *)(m + 1);
     mpv_kilopuff *kp = kp_begin;
     for (auto it = puff_clusters.begin(); it != puff_clusters.end(); ++it) {
-        writeKiloPuff(it, findCounter(counters, kp - kp_begin).counter_offset,
-                      m, kp, &pa);
+        writeKiloPuff(it, rm,
+                      findCounter(counters, kp - kp_begin).counter_offset, m,
+                      kp, &pa);
         ++kp;
     }
     assert((char *)pa == (char *)nfa.get() + len);
index ff4906ee74319e0990139bc8c5c728e14ae1aadf..fb91ac64ede703576eb254984d2c8dbee0f14f61 100644 (file)
@@ -40,6 +40,8 @@ struct NFA;
 
 namespace ue2 {
 
+class ReportManager;
+
 struct raw_puff {
     raw_puff(u32 repeats_in, bool unbounded_in, ReportID report_in,
              const CharReach &reach_in, bool auto_restart_in = false,
@@ -59,9 +61,9 @@ struct raw_puff {
  * puffs in the triggered_puffs vector are enabled when an TOP_N event is
  * delivered corresponding to their index in the vector
  */
-aligned_unique_ptr<NFA>
-mpvCompile(const std::vector<raw_puff> &puffs,
-           const std::vector<raw_puff> &triggered_puffs);
+aligned_unique_ptr<NFA> mpvCompile(const std::vector<raw_puff> &puffs,
+                                   const std::vector<raw_puff> &triggered_puffs,
+                                   const ReportManager &rm);
 
 } // namespace ue2
 
index bcf91feaae8b400211cd964d97aecc7a67a1ed78..30db15ffb6f524c76237fc9a9648bc4a73a131d6 100644 (file)
@@ -1333,16 +1333,6 @@ aligned_unique_ptr<NFA> buildOutfix(RoseBuildImpl &build, OutfixInfo &outfix) {
     return n;
 }
 
-static
-void remapReportsToPrograms(MpvProto &mpv, const ReportManager &rm) {
-    for (auto &puff : mpv.puffettes) {
-        puff.report = rm.getProgramOffset(puff.report);
-    }
-    for (auto &puff : mpv.triggered_puffettes) {
-        puff.report = rm.getProgramOffset(puff.report);
-    }
-}
-
 static
 void prepMpv(RoseBuildImpl &tbi, build_context &bc, size_t *historyRequired,
              bool *mpv_as_outfix) {
@@ -1365,9 +1355,7 @@ void prepMpv(RoseBuildImpl &tbi, build_context &bc, size_t *historyRequired,
     }
 
     auto *mpv = mpv_outfix->mpv();
-    auto tmp = *mpv; // copy
-    remapReportsToPrograms(tmp, tbi.rm);
-    auto nfa = mpvCompile(tmp.puffettes, tmp.triggered_puffettes);
+    auto nfa = mpvCompile(mpv->puffettes, mpv->triggered_puffettes, tbi.rm);
     assert(nfa);
     if (!nfa) {
         throw CompileError("Unable to generate bytecode.");