[发明专利]一种多线程应用场景下的访存指令插桩优化方法有效
申请号: | 201910483083.7 | 申请日: | 2019-06-04 |
公开(公告)号: | CN110187884B | 公开(公告)日: | 2020-10-27 |
发明(设计)人: | 顾乃杰;刘倩玉;苏俊杰 | 申请(专利权)人: | 中国科学技术大学 |
主分类号: | G06F8/41 | 分类号: | G06F8/41 |
代理公司: | 安徽省合肥新安专利代理有限责任公司 34101 | 代理人: | 陆丽莉;何梅生 |
地址: | 230026 安*** | 国省代码: | 安徽;34 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 多线程 应用 场景 指令 优化 方法 | ||
1.一种多线程应用场景下的访存指令插桩优化方法,其特征在于是按如下步骤进行:
步骤1:编译源程序,获取中间代码;
步骤2:遍历所述中间代码所包含的模块,从所有模块中获取所有函数,再从所有函数中获取所有基本块,并对所有基本块中所包含的指令逐一均执行步骤3和步骤4;
步骤3:获取当前指令的相关信息,包括:指令类型、指令的操作数以及操作数类型;
步骤4:根据所述指令类型,利用相应的指令更新规则更新冗余/非冗余插桩的区分信息,并进行选择性插桩操作;
其中,所述冗余/非冗余插桩的区分信息具体为“指向关系”与“指向状态”;
所述“指向关系”定义为:
若源程序中存在将对象b的地址保存在对象a中的声明语句,即形式为“a=b”的声明语句,其中,“”表示取地址符号,则表示对象a和对象b间存在指向关系,包括:
若对象b为非指针对象,则表示对象a为一级指针,并将对象a和对象b间的指向关系定义为“NP←P”关系,其中“←”表示指向符号;
若对象b为指针对象,则表示对象a为多级指针,并将对象a和对象b间的指向关系定义为“P←P”关系;
所述“指向状态”定义为:
若源程序中存在将对象b的地址保存在对象a中的声明语句,即形式为“a=b”的声明语句,且对象a和对象b间存在的指向关系为“NP←P”关系,则按如下方式定义对象b的指向状态:
若对象b指向栈对象,则定义对象b的指向状态为false,否则定义对象b的指向状态为true;
指令更新规则为:
定义非感兴趣的对象集合为StackValue,记录NP←P关系及指向状态的映射集合为PointerValue,记录P←P关系的映射集合为PointerChain;
ALLOC类型指令遵循更新规则1,GEP类型指令遵循更新规则2,LOAD类型指令遵循更新规则3,STORE类型指令遵循更新规则4;
若当前指令的指令类型为ALLOC类型,则执行更新规则1;
所述更新规则1为:
若当前ALLOC指令分配的是一个指针对象,则将相应的指针对象加入映射集合PointerValue中,并将相应指针对象的指向状态初始化为true,否则将当前ALLOC指令分配的非指针对象加入指令集合StackValue中;其中,所述映射集合PointerValue是指“NP←P”关系及指向状态的映射集合;所述指令集合StackValue是指非感兴趣的指令集合;
若当前指令的指令类型为GEP类型,则执行更新规则2;
所述更新规则2包括:
步骤2a:若当前GEP指令从栈上的一维数组中加载一个非指针对象,则将所加载的非指针对象加入指令集合StackValue中;否则,执行步骤2b;
步骤2b:若当前GEP指令从多维数组中加载一个指针对象,则执行步骤2c;否则,不执行任何操作;
步骤2c:判断加载地址是否属于映射集合PointerValue;若属于,则将加载的指针对象加入指令集合StackValue中,并令所加载的指针对象的指向状态与加载地址的指向状态保持一致;否则,将加载地址加入映射集合PointerValue中,并将加载地址的指向状态初始化为true;
若当前指令的指令类型为LOAD类型,则执行更新规则3;
所述更新规则3包括:
步骤3a:若当前LOAD指令加载的对象与加载地址间存在“NP←P”关系,则将加载的对象加入指令集合StackValue后,执行步骤3b,否则,执行步骤3c;
步骤3b:判断加载地址是否属于指令集合StackValue,若属于,则不执行插桩操作,否则返回加载地址,用于执行当前指令的插桩操作;
步骤3c:判断加载的指针对象与其指向的对象间的指向关系,若指向关系为“NP←P”关系,则执行步骤3d,否则,执行步骤3e;
步骤3d:判断加载地址是否属于指令集合PointerValue或加载地址的指向状态是否为true,若是,则不做任何更新操作,否则,将加载对象加入指令集StackValue中;
步骤3e:判断加载地址是否存在于映射集合PointerChain中,若是,则执行步骤3f,否则,执行步骤3i;
步骤3f:获取加载地址原有指向的指针对象,若原有指向的指针对象存在于映射集合PointerChain中,则执行步骤3g,否则,执行步骤3h;其中,所述映射集合PointerChain是指“P←P”关系的映射集合;
步骤3g:使当前LOAD指令加载的对象的指向关系与加载地址原有指向的对象的指向关系、指向状态均保持一致;
步骤3h:若加载地址原有指向的对象存在于映射集合PointerValue中,则使当前LOAD指令加载的对象的指向关系与加载地址原有指向的对象的指向关系保持一致;否则将当前LOAD指令加载的对象的指向状态置为true;
步骤3i:将当前LOAD指令加载的对象的指向状态置为true;
若当前指令的指令类型为STORE类型,则执行更新规则4;
所述更新规则4包括:
步骤4a:若存储对象与存储地址间存在“NP←P”关系,则执行步骤4b,否则,执行步骤4c;
步骤4b:判断存储地址是否属于指令集合StackValue,若是,则不执行插桩操作,否则,返回存储地址,用于执行当前指令的插桩操作;
步骤4c:判断存储的指针对象与其指向的对象间的指向关系,若指向关系为“NP←P”关系,则执行步骤4d,否则,执行步骤4f;
步骤4d:若存储对象属于指令集合StackValue,将存储地址的指向状态置为false,否则,执行步骤4e;
步骤4e:判断存储对象是否存在于映射集合PointerValue中,若是,则使存储地址的指向状态与存储对象的指向状态保持一致,否则,将存储地址的指向状态置为true;
步骤4f:判断存储对象是否存在于映射集合PointerValue中,若是,则执行步骤4g,否则,将存储对象的指向状态置为true后,再执行步骤4g;
步骤4g:在映射集合PointerChain中记录存储地址与存储对象的映射关系,并且使存储地址的指向关系与存储对象的指向关系保持一致。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中国科学技术大学,未经中国科学技术大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201910483083.7/1.html,转载请声明来源钻瓜专利网。