new rm_struct pass’s StructTypeDAG

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。同时,lengthalignment也set成功。ps:当getStructTypeVertex子元素是一个DAG中不存在的StructType,则立即将该StructType创建对应vertex加入到DAG中。
(4)module的identified类型的StructType对应vertex创建成功。再处理IR中的literal类型的StructType。处理完毕,则将IR中所有的StructType全部加入到DAG中。
(5)为DAG中的vertex排序,设置level_indexstruct_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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值