info.queue = qif.get_queue();
exclusive_info.push_back(move(info));
}
- updateExclusiveInfixProperties(build, exclusive_info, bc.leftfix_info,
+ updateExclusiveInfixProperties(build, exclusive_info, bc.leftfix_info,
no_retrigger_queues);
buildInfixContainer(g, bc, exclusive_info);
}
return 0;
}
+ applyFinalSpecialisation(program);
+
auto it = bc.program_cache.find(program);
if (it != end(bc.program_cache)) {
DEBUG_PRINTF("reusing cached program at %u\n", it->second);
for (const auto &id : reports) {
makeReport(build, id, has_som, program);
}
- applyFinalSpecialisation(program);
return writeProgram(bc, move(program));
}
}
static
-RoseProgram buildLitInitialProgram(const RoseBuildImpl &build,
- build_context &bc, ProgramBuild &prog_build,
- u32 lit_id,
- const vector<RoseEdge> &lit_edges) {
+RoseProgram makeLitInitialProgram(const RoseBuildImpl &build,
+ build_context &bc, ProgramBuild &prog_build,
+ u32 lit_id,
+ const vector<RoseEdge> &lit_edges) {
RoseProgram program;
// Check long literal info.
}
static
-RoseProgram buildLiteralProgram(const RoseBuildImpl &build, build_context &bc,
- ProgramBuild &prog_build, u32 lit_id,
- const vector<RoseEdge> &lit_edges,
- bool is_anchored_program) {
+RoseProgram makeLiteralProgram(const RoseBuildImpl &build, build_context &bc,
+ ProgramBuild &prog_build, u32 lit_id,
+ const vector<RoseEdge> &lit_edges,
+ bool is_anchored_program) {
const auto &g = build.g;
DEBUG_PRINTF("lit id=%u, %zu lit edges\n", lit_id, lit_edges.size());
// Construct initial program up front, as its early checks must be able
// to jump to end and terminate processing for this literal.
- auto lit_program =
- buildLitInitialProgram(build, bc, prog_build, lit_id, lit_edges);
+ auto lit_program = makeLitInitialProgram(build, bc, prog_build, lit_id,
+ lit_edges);
lit_program.add_before_end(move(program));
return lit_program;
}
+static
+RoseProgram makeLiteralProgram(const RoseBuildImpl &build, build_context &bc,
+ ProgramBuild &prog_build, u32 lit_id,
+ const map<u32, vector<RoseEdge>> &lit_edge_map,
+ bool is_anchored_program) {
+ const vector<RoseEdge> no_edges;
+
+ DEBUG_PRINTF("lit_id=%u\n", lit_id);
+ const vector<RoseEdge> *edges_ptr;
+ if (contains(lit_edge_map, lit_id)) {
+ edges_ptr = &lit_edge_map.at(lit_id);
+ } else {
+ edges_ptr = &no_edges;
+ }
+
+ return makeLiteralProgram(build, bc, prog_build, lit_id, *edges_ptr,
+ is_anchored_program);
+}
+
/**
* \brief Consumes list of program blocks, checks them for duplicates and then
* concatenates them into one program.
}
static
-u32 writeLiteralProgram(const RoseBuildImpl &build, build_context &bc,
- ProgramBuild &prog_build, const vector<u32> &lit_ids,
- const map<u32, vector<RoseEdge>> &lit_edge_map,
- bool is_anchored_program) {
+RoseProgram makeFragmentProgram(const RoseBuildImpl &build, build_context &bc,
+ ProgramBuild &prog_build,
+ const vector<u32> &lit_ids,
+ const map<u32, vector<RoseEdge>> &lit_edge_map) {
assert(!lit_ids.empty());
// If we have multiple literals and any of them squash groups, we will have
vector<RoseProgram> blocks;
- const vector<RoseEdge> no_edges;
-
for (const auto &lit_id : lit_ids) {
- DEBUG_PRINTF("lit_id=%u\n", lit_id);
- const vector<RoseEdge> *edges_ptr;
- if (contains(lit_edge_map, lit_id)) {
- edges_ptr = &lit_edge_map.at(lit_id);
- } else {
- edges_ptr = &no_edges;
- }
- auto prog = buildLiteralProgram(build, bc, prog_build, lit_id,
- *edges_ptr, is_anchored_program);
+ auto prog = makeLiteralProgram(build, bc, prog_build, lit_id,
+ lit_edge_map, false);
if (needs_clear_work) {
RoseProgram clear_block;
clear_block.add_before_end(make_unique<RoseInstrClearWorkDone>());
blocks.push_back(move(prog));
}
- auto program = assembleProgramBlocks(move(blocks));
-
- if (program.empty()) {
- return 0;
- }
- applyFinalSpecialisation(program);
- return writeProgram(bc, move(program));
+ return assembleProgramBlocks(move(blocks));
}
static
auto program = assembleProgramBlocks(move(blocks));
- if (program.empty()) {
- return 0;
- }
- applyFinalSpecialisation(program);
return writeProgram(bc, move(program));
}
DEBUG_PRINTF("frag_id=%u, lit_ids=[%s]\n", frag.fragment_id,
as_string_list(frag.lit_ids).c_str());
- frag.lit_program_offset
- = writeLiteralProgram(build, bc, prog_build, frag.lit_ids,
- lit_edge_map, false);
+ auto lit_prog = makeFragmentProgram(build, bc, prog_build, frag.lit_ids,
+ lit_edge_map);
+ frag.lit_program_offset = writeProgram(bc, move(lit_prog));
+
frag.delay_program_offset
= writeDelayRebuildProgram(build, bc, prog_build, frag.lit_ids);
}
for (const auto &delayed_lit_id : info.delayed_ids) {
DEBUG_PRINTF("lit id %u delay id %u\n", lit_id, delayed_lit_id);
- u32 offset = writeLiteralProgram(build, bc, prog_build,
- {delayed_lit_id}, lit_edge_map,
- false);
+ auto prog = makeLiteralProgram(build, bc, prog_build,
+ delayed_lit_id, lit_edge_map,
+ false);
+ u32 offset = writeProgram(bc, move(prog));
u32 delay_id;
auto it = cache.find(offset);
continue;
}
- u32 offset = writeLiteralProgram(build, bc, prog_build, {lit_id},
- lit_edge_map, true);
+ auto prog = makeLiteralProgram(build, bc, prog_build, lit_id,
+ lit_edge_map, true);
+ u32 offset = writeProgram(bc, move(prog));
DEBUG_PRINTF("lit_id=%u -> anch prog at %u\n", lit_id, offset);
u32 anch_id;
const bool has_som = false;
makeCatchupMpv(build, bc.needs_mpv_catchup, id, program);
makeReport(build, id, has_som, program);
- applyFinalSpecialisation(program);
u32 offset = writeProgram(bc, move(program));
programs.push_back(offset);
build.rm.setProgramOffset(id, offset);
tie(g[source(b, g)].index, g[target(b, g)].index);
});
- program.add_block(buildLiteralProgram(
- build, bc, prog_build, build.eod_event_literal_id, edge_list, false));
+ auto block = makeLiteralProgram(build, bc, prog_build,
+ build.eod_event_literal_id, edge_list,
+ false);
+ program.add_block(move(block));
}
static
addEodAnchorProgram(build, bc, prog_build, true, program);
addSuffixesEodProgram(build, program);
- if (program.empty()) {
- return 0;
- }
-
- applyFinalSpecialisation(program);
return writeProgram(bc, move(program));
}