From ee7f31ac392a50cb207c653ee3a93c2af7ddecc3 Mon Sep 17 00:00:00 2001 From: Justin Viiret Date: Tue, 19 Apr 2016 15:22:20 +1000 Subject: [PATCH] mpv: native report remapping --- src/nfa/mpvcompile.cpp | 31 +++++++++++++++++++++---------- src/nfa/mpvcompile.h | 8 +++++--- src/rose/rose_build_bytecode.cpp | 14 +------------- 3 files changed, 27 insertions(+), 26 deletions(-) diff --git a/src/nfa/mpvcompile.cpp b/src/nfa/mpvcompile.cpp index 7521afef..b024b530 100644 --- a/src/nfa/mpvcompile.cpp +++ b/src/nfa/mpvcompile.cpp @@ -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 @@ -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 &puffs_in, static void writeKiloPuff(const map>::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 &puffs = it->second; @@ -181,11 +190,11 @@ void writeKiloPuff(const map>::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 &counters, } aligned_unique_ptr mpvCompile(const vector &puffs_in, - const vector &triggered_puffs) { + const vector &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 mpvCompile(const vector &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 mpvCompile(const vector &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); diff --git a/src/nfa/mpvcompile.h b/src/nfa/mpvcompile.h index ff4906ee..fb91ac64 100644 --- a/src/nfa/mpvcompile.h +++ b/src/nfa/mpvcompile.h @@ -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 -mpvCompile(const std::vector &puffs, - const std::vector &triggered_puffs); +aligned_unique_ptr mpvCompile(const std::vector &puffs, + const std::vector &triggered_puffs, + const ReportManager &rm); } // namespace ue2 diff --git a/src/rose/rose_build_bytecode.cpp b/src/rose/rose_build_bytecode.cpp index bcf91fea..30db15ff 100644 --- a/src/rose/rose_build_bytecode.cpp +++ b/src/rose/rose_build_bytecode.cpp @@ -1333,16 +1333,6 @@ aligned_unique_ptr 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.");