func_list的构建流程:
只处理main相关的调用函数。
setVertexLevelIndex():
目标:给每个vertex添加level_index
1、先从StructType_map_得到set<Vertex *> unindex_vertex;
这些是需要加index的vertex。
2、为vertexs添加level_index。unindex_vertex用来遍历每个vertex的children_vertexs,需要一个和unindex_vertex相等的delete_vertex,如果children_vertexs在delete_vertex中,将其从delete_vertex删除。得到最终的delete_vertex就是level_index的vertexs。
StructTypeDAG的构建流程:
外部:hasStructType、addStructTypeToDAG、setVertexLevelIndex、printStructType、getMaxLevelIndex、getIndexLevelStructType
内部:CreateVertex、CreateVertexTypeTable、getStructTypeVertex、
struct Vertex{
StructType *struct_Type_;
//build edge to parents vertex
//std::unordered_set<Vertex *> vertex_parents_;
//build edge to children vertex
std::set<Vertex *> vertex_children_;
//StructType Table
vector<table_element> type_table_;
//StructType alignment
int alignment;
//StructType length
int length;
int level_index;
};
(1)TraverseIdentifiedStructTypes();添加的是module_->getIdentifiedStructTypes()
。
(2)拿到一个StructType *st_temp,判断struct_type_DAG_->hasStructType(st_temp)
,在则struct_type_DAG_->addStructTypeToDAG(st_temp);
,
(3)addStructTypeToDAG:CreateVertexTypeTable(new_vertex)
,创建新vertex,new每个table_element补齐StructType Table(vector<table_element> type_table_;
),ConnectVertex(ver_temp, new_vertex);
建立vertex与vertex_children之间的edge。同时,length和alignment也set成功。ps:当getStructTypeVertex子元素是一个DAG中不存在的StructType,则立即将该StructType创建对应vertex加入到DAG中。
(4)module的identified类型的StructType对应vertex创建成功。再处理IR中的literal类型的StructType。处理完毕,则将IR中所有的StructType全部加入到DAG中。
(5)为DAG中的vertex排序,设置level_index,struct_type_DAG_->setVertexLevelIndex();
此时DAG已经完全建好。最后打印一下DAG,查看信息struct_type_DAG_->printStructType();
(6)最后DAG使用,目的是不断处理值为level_index的vertex对应StructType,int index = struct_type_DAG_->getMaxLevelIndex();
遍历index,提取index对应的StructType,struct_type_DAG_->getIndexLevelStructType(index, uset);