一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于GCC编译器间接预取地址越界检查的方法

2022-10-26 17:41:57 来源:中国专利 TAG:

一种基于gcc编译器间接预取地址越界检查的方法
技术领域
1.本发明涉及编译器技术领域,尤其涉及一种基于gcc编译器间接预取地址越界检查的方法。


背景技术:

2.对于严重制约程序执行性能的间接存储器访问,一种有效解决方案是采用软件数据预取技术。基于gcc编译器设计实现的间接预取技术可以有效识别程序中的间接访存模式,并为之插入合适预取指令。在计算间接预取地址时,若索引数组索引值超过其上界值,那么对索引内存引用的解引用操作将会产生非法的加载地址,与预取操作不同,加载指令作用在非法地址将导致程序崩溃。
3.而传统手动间接预取在进行边界地址检查时主要具有如下缺点:1、工作量大,程序员需要针对不同高级程序设计语言源代码手动添加条件判断语句;2、代价高昂,手动添加的条件判断语句将在编译器后端生成程序跳转指令;3、缺乏灵活,手动插入无法根据数组内存空间分配方式采用不同的地址越界检查方法,将增加不必要的判断指令开销。
4.因此,有必要提供一种新的基于gcc编译器间接预取地址越界检查的方法解决上述技术问题。


技术实现要素:

5.为解决上述技术问题,本发明提供一种可以有效减少程序员工作负担和工作难度,特别地,减少因指令跳转带来的巨大性能开销的基于gcc编译器间接预取地址越界检查的方法。
6.本发明提供的基于gcc编译器间接预取地址越界检查的方法包括:s1:在间接预取插入阶段,插入多条gimple语句以加载索引数组值,若加载指令作用在错误的索引数组地址,将产生内存异常错误,再进行索引越界检查;
7.s2:gcc编译根据源程序中数组内存分配方式的不同,在gimple中间表示阶段将转换为两种不同内存引用类型;
8.s3:针对不同内存引用类型采取不同越界检查方法获取归纳变量最大值,即索引数组最大索引值;
9.s4:根据索引数组内存引用类型选取不同地址越界避免方法;
10.s5:在上述地址越界检查和加载索引数组值之后,再将索引值转换为间接数组元素中的字节数,最后将其与间接数组的起始地址相加得出间接预取地址。
11.优选的,所述步骤s2中的gimple中间表示阶段可以转换为mem_ref和array_ref两种不同内存引用类型,静态分配数组内存引用类型为array_ref型,动态分配数组内存引用类型为mem_ref型。
12.优选的,对于静态分配数组,其数组元素步长、数组初始地址以一种类源程序的形式进行隐性表示,而动态分配数组则将上述信息显示化表示,可以直接从gimple中间表示
中观察到。
13.优选的,当获取归纳变量后判断索引数组内存引用类型为mem_ref型时,归纳变量转化相应字节数,然后归纳变量偏移字节与预取距离偏移字节数相加,再使用gimple三目运算语句检测当前归纳变量值是否越界,之后检索数组起始地址与当前归纳变量值相加,最后再插入mem_ref内存引用加载索引数组数值得出间接预取地址。
14.优选的,当获取归纳变量后判断索引数组内存引用类型为array_ref型时,归纳变量与预取前向距离相加,再插入array_ref内存引用加载索引数组数值得出间接预取地址。
15.与相关技术相比较,本发明提供的基于gcc编译器间接预取地址越界检查的方法具有如下有益效果:
16.本发明提供一种基于gcc编译器间接预取地址越界检查的方法,与现有手动插入预取的地址越界检查相比,本方案可以有效减少程序员工作负担和工作难度,特别地,减少因指令跳转带来的巨大性能开销。此外,针对gcc复杂的中间表示设计了更加灵活的越界检查方法,如array_ref类型内存引用可以利用索引数组原有检查指令,而无需在gimple阶段插入额外地址检查指令,避免了不必要的指令开销。
附图说明
17.图1为本发明提供的array_ref内存引用类型结构示意图;
18.图2为本发明提供的mem_ref内存引用类型结构示意图;
19.图3为本发明提供的越界检测方法结构示意图。
具体实施方式
20.为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
21.以下结合具体实施例对本发明的具体实现进行详细描述。
22.请参阅图1至图3,本发明实施例提供的一种基于gcc编译器间接预取地址越界检查的方法,所述基于gcc编译器间接预取地址越界检查的方法包括:
23.s1:在间接预取插入阶段,插入多条gimple语句以加载索引数组值,若加载指令作用在错误的索引数组地址,将产生内存异常错误,再进行索引越界检查;
24.s2:gcc编译根据源程序中数组内存分配方式的不同,在gimple中间表示阶段将转换为两种不同内存引用类型;
25.s3:针对不同内存引用类型采取不同越界检查方法获取归纳变量最大值,即索引数组最大索引值;
26.s4:根据索引数组内存引用类型选取不同地址越界避免方法;
27.s5:在上述地址越界检查和加载索引数组值之后,再将索引值转换为间接数组元素中的字节数,最后将其与间接数组的起始地址相加得出间接预取地址;
28.所述步骤s2中的gimple中间表示阶段可以转换为mem_ref和array_ref两种不同内存引用类型,静态分配数组内存引用类型为array_ref型,动态分配数组内存引用类型为mem_ref型;
29.对于静态分配数组,其数组元素步长、数组初始地址以一种类源程序的形式进行隐性表示,而动态分配数组则将上述信息显示化表示,可以直接从gimple中间表示中观察到;
30.当获取归纳变量后判断索引数组内存引用类型为mem_ref型时,归纳变量转化相应字节数,然后归纳变量偏移字节与预取距离偏移字节数相加,再使用gimple三目运算语句检测当前归纳变量值是否越界,之后检索数组起始地址与当前归纳变量值相加,最后再插入mem_ref内存引用加载索引数组数值得出间接预取地址;
31.当获取归纳变量后判断索引数组内存引用类型为array_ref型时,归纳变量与预取前向距离相加,再插入array_ref内存引用加载索引数组数值得出间接预取地址;
32.需要说明的是:在间接预取插入阶段,需要插入多条gimple语句以加载索引数组值,若加载指令作用在错误的索引数组地址,将产生内存异常错误,因此需要进行索引越界检查;gcc编译根据源程序中数组内存分配方式的不同,在gimple中间表示阶段将转换为mem_ref和array_ref两种不同内存引用类型,如附图1为c语言程序中不同内存分配模式下的gimple中间表示形式;对于静态分配数组,其数组元素步长、数组初始地址以一种类源程序的形式进行隐性表示,而动态分配数组则将上述信息显示化表示,可以直接从gimple中间表示中观察到;鉴于gcc编译器复杂的中间表示形式,当获取归纳变量后判断索引数组内存引用类型为mem_ref型时,归纳变量转化相应字节数,然后归纳变量偏移字节与预取距离偏移字节数相加,再使用gimple三目运算语句检测当前归纳变量值是否越界,之后检索数组起始地址与当前归纳变量值相加,最后再插入mem_ref内存引用加载索引数组数值得出间接预取地址,而若是获取归纳变量后判断索引数组内存引用类型为array_ref型时,归纳变量与预取前向距离相加,再插入array_ref内存引用加载索引数组数值得出间接预取地址。
33.本发明中涉及的电路以及控制均为现有技术,在此不进行过多赘述。
34.以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其它相关的技术领域,均同理包括在本发明的专利保护范围内。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献