diff --git a/src/rose/rose_build_compile.cpp b/src/rose/rose_build_compile.cpp index dca7310c..b86058de 100644 --- a/src/rose/rose_build_compile.cpp +++ b/src/rose/rose_build_compile.cpp @@ -1661,7 +1661,7 @@ aligned_unique_ptr RoseBuildImpl::buildRose(u32 minWidth) { findMoreLiteralMasks(*this); assignGroupsToLiterals(); - assignGroupsToRoles(); + assignGroupsToRoles(*this); findGroupSquashers(*this); /* final prep work */ diff --git a/src/rose/rose_build_groups.cpp b/src/rose/rose_build_groups.cpp index 5467e1ab..fd96fbd6 100644 --- a/src/rose/rose_build_groups.cpp +++ b/src/rose/rose_build_groups.cpp @@ -363,20 +363,23 @@ rose_group RoseBuildImpl::getSuccGroups(RoseVertex start) const { * The groups that a role sets are determined by the union of its successor * literals. Requires the literals already have had groups assigned. */ -void RoseBuildImpl::assignGroupsToRoles() { +void assignGroupsToRoles(RoseBuildImpl &build) { + auto &g = build.g; + /* Note: if there is a succ literal in the sidematcher, its successors * literals must be added instead */ for (auto v : vertices_range(g)) { - if (isAnyStart(v)) { + if (build.isAnyStart(v)) { continue; } - const rose_group succ_groups = getSuccGroups(v); + const rose_group succ_groups = build.getSuccGroups(v); g[v].groups |= succ_groups; - if (ghost.find(v) != ghost.end()) { + auto ghost_it = build.ghost.find(v); + if (ghost_it != end(build.ghost)) { /* delayed roles need to supply their groups to the ghost role */ - g[ghost[v]].groups |= succ_groups; + g[ghost_it->second].groups |= succ_groups; } DEBUG_PRINTF("vertex %zu: groups=%llx\n", g[v].idx, g[v].groups); diff --git a/src/rose/rose_build_groups.h b/src/rose/rose_build_groups.h index f24a11c3..6719fbea 100644 --- a/src/rose/rose_build_groups.h +++ b/src/rose/rose_build_groups.h @@ -44,6 +44,8 @@ getVertexGroupMap(const RoseBuildImpl &build); rose_group getSquashableGroups(const RoseBuildImpl &build); +void assignGroupsToRoles(RoseBuildImpl &build); + void findGroupSquashers(RoseBuildImpl &build); } // namespace ue2 diff --git a/src/rose/rose_build_impl.h b/src/rose/rose_build_impl.h index d5f75a22..b1d7ac36 100644 --- a/src/rose/rose_build_impl.h +++ b/src/rose/rose_build_impl.h @@ -439,10 +439,6 @@ public: // Find the maximum bound on the edges to this vertex's successors. u32 calcSuccMaxBound(RoseVertex u) const; - // Assign roles to groups, writing the groups bitset into each role in the - // graph. - void assignGroupsToRoles(); - /* Returns the ID of the given literal in the literal map, adding it if * necessary. */ u32 getLiteralId(const ue2_literal &s, u32 delay, rose_literal_table table);