CFG::CFG(func_t *func)
{
eavec_t eavec;
eavec.push_back(func->startEA);
while(!eavec.empty())
{
ea_t *front = eavec.front();
ea_t working_ea = *front;
eavec.erase(front);
if(!Split(ea))
{
BasicBlock block;
block.boundary.ea1 = block.boundary.ea2 = ea;
bool bContinue = 1;
do
{
flags_t flags = get_flags(ea);
if(!isFlow(flags) && block.boundary.ea1 == ea)
break;
if(!isCode(flags))
break;
if(Split(ea))
{
Edge edge;
edge.ea = ea;
edge.type = 3;
block.inedges.push_back(edge);
break;
}
if(GetIncoming(ea, &eavec, &block))
bContinue = 0;
ea = get_item_end(ea);
} while(!bContinue);
} // end if(!Split(ea))
m_Vector.push_back(block);
} // end while(!eavec.empty())
m_NumBlocks = m_Vector.size();
for(int i = 0; i < m_NumBlocks; ++i)
{
for(int j = 0; j <= m_Vector[i].inedges.size(); ++j)
{
Edge e;
e.ea = m_Vector[i].boundary.ea1;
e.type = m_Vector[i].inedges[j].type;
int idx = -1;
for(int k = 0; k < m_NumBlocks; ++k)
{
if(m_Vector[k].boundary.ea1 == m_Vector[i].inedges[j].ea)
{
idx = k;
break;
}
}
// bug here, if idx = -1
m_Vector[idx].outedges.push_back(e);
}
}
}