void CodeEmitter::prepareEmission(Program *prog) { for (ArrayList::Iterator fi = prog->allFuncs.iterator(); !fi.end(); fi.next()) { Function *func = reinterpret_cast<Function *>(fi.get()); func->binPos = prog->binSize; prepareEmission(func); // adjust sizes & positions for schedulding info: if (prog->getTarget()->hasSWSched) { uint32_t adjPos = func->binPos; BasicBlock *bb = NULL; for (int i = 0; i < func->bbCount; ++i) { bb = func->bbArray[i]; int32_t adjSize = bb->binSize; if (adjPos % 64) { adjSize -= 64 - adjPos % 64; if (adjSize < 0) adjSize = 0; } adjSize = bb->binSize + sizeToBundlesNVE4(adjSize) * 8; bb->binPos = adjPos; bb->binSize = adjSize; adjPos += adjSize; } if (bb) func->binSize = adjPos - func->binPos; } prog->binSize += func->binSize; } }
void CodeEmitter::prepareEmission(Function *func) { func->bbCount = 0; func->bbArray = new BasicBlock * [func->cfg.getSize()]; BasicBlock::get(func->cfg.getRoot())->binPos = func->binPos; for (IteratorRef it = func->cfg.iteratorCFG(); !it->end(); it->next()) prepareEmission(BasicBlock::get(*it)); }
void CodeEmitter::prepareEmission(Program *prog) { for (ArrayList::Iterator fi = prog->allFuncs.iterator(); !fi.end(); fi.next()) { Function *func = reinterpret_cast<Function *>(fi.get()); func->binPos = prog->binSize; prepareEmission(func); prog->binSize += func->binSize; } }
void CodeEmitter::prepareEmission(Function *func) { func->bbCount = 0; func->bbArray = new BasicBlock * [func->cfg.getSize()]; BasicBlock::get(func->cfg.getRoot())->binPos = func->binPos; Graph::GraphIterator *iter; for (iter = func->cfg.iteratorCFG(); !iter->end(); iter->next()) prepareEmission(BasicBlock::get(*iter)); func->cfg.putIterator(iter); }