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

基于LLVM的编译优化方法、装置、设备及介质与流程

2022-11-23 16:06:24 来源:中国专利 TAG:

基于llvm的编译优化方法、装置、设备及介质
技术领域
1.本发明涉及llvm的技术领域,尤其涉及一种基于llvm的编译优化方法、基于llvm的编译优化装置、基于llvm的编译优化设备及计算机存储介质。


背景技术:

2.目前,在llvm(low level virtual machine,底层虚拟机)的编译优化过程中,由于部分目标平台不是标准内存对齐方式,从而需要修改llvm的源码去进行适配。具体的,在表达式运算过程中,需要将低精度数据提升到高精度数据类型,但是部分32位llvm的api(application programming interface,应用程序编程接口)对64/128位等目标平台的高精度数据类型运算编译速度较慢,影响编译效率,从而需要对llvm底层生成汇编代码的机制进行更改。而llvm开源库代码庞大,模块复杂,文档少且全英文,不易理解,维护工作量非常巨大,修改底层代码的影响不确定,极易带来不稳定的因素和后果。


技术实现要素:

3.本发明的主要目的在于提供一种基于llvm的编译优化方法、基于llvm的编译优化装置、基于llvm的编译优化设备及计算机存储介质,旨在解决现有技术中llvm在对目标平台非标准对齐方式数据进行编译优化时,编译速度慢,编译效率低的技术问题。
4.为实现上述目的,本发明提供一种基于llvm的编译优化方法,所述基于llvm的编译优化方法,包括以下步骤:
5.确定抽象语法树对应的第一变量内存地址信息,其中,所述抽象语法树为llvm前端对目标平台的源代码进行转化得到;
6.将所述第一变量内存地址信息中的第一类型地址调整为第二类型地址,得到第二变量内存地址信息,所述第一类型地址为非标准对齐方式的内存地址,所述第二类型地址为标准对齐方式的内存地址;
7.确定所述抽象语法树对应的编译组件集合,将所述编译组件集合中的目标编译接口替换为对应的编译函数,得到目标编译组件集合,其中,所述目标编译接口为表达式运算过程对应的编译接口;
8.调用所述目标编译组件集合并参照所述第二变量内存地址信息进行编译,生成所述源代码对应的llvm中间代码。
9.进一步地,所述将所述第一变量内存地址信息中的第一类型地址调整为第二类型地址,得到第二变量内存地址信息的步骤之前,还包括:
10.构建预设局部变量池,所述预设局部变量池中包括临时变量,所述临时变量与所述第一类型地址数据类型的标准对齐方式对应;
11.所述将所述第一变量内存地址信息中的第一类型地址调整为第二类型地址,得到第二变量内存地址信息的步骤,包括:
12.通过所述临时变量将所述第一变量内存地址信息中的第一类型地址调整为第二
类型地址,得到第二变量内存地址信息。
13.进一步地,所述通过所述临时变量将所述第一变量内存地址信息中的第一类型地址调整为第二类型地址的步骤,包括:
14.确定所述预设局部变量池中是否存在目标临时变量,其中,所述目标临时变量的数据类型与所述第一类型地址的对应的变量相同;
15.若存在,则将所述第一类型地址的变量替换为所述目标临时变量;
16.若不存在,则将所述第一类型地址的变量替换为数组类型的所述临时变量。
17.进一步地,所述将所述第一类型地址的变量替换为数组类型的所述临时变量的步骤,包括:
18.确定所述第一类型地址的变量的第一存储空间位数;
19.确定预设局部变量池中数组类型的所述临时变量的第二存储空间位数;
20.基于所述第一存储空间位数和所述第二存储空间位数,将所述第一类型地址的变量替换为数组类型的所述临时变量;
21.其中,所述临时变量的数组大小为所述第一存储空间位数相较于所述第二存储空间位数的倍数。
22.进一步地,所述将所述编译组件集合中的目标编译接口替换为对应的编译函数的步骤之前,还包括:
23.确定所述目标编译接口对应的编译指令;
24.将所述编译指令编译为所述目标平台的可执行文件;
25.将所述可执行文件封装为所述编译函数。
26.进一步地,所述将所述可执行文件封装为所述编译函数的步骤之后,还包括:
27.生成所述目标编译接口和所述编译函数之间的对应关系;
28.所述将所述编译组件集合中的目标编译接口替换为对应的编译函数的步骤之前,还包括:
29.基于表达式运算过程对应的标识信息在所述编译组件集合中确定目标编译接口;
30.所述将所述编译组件集合中的目标编译接口替换为对应的编译函数的步骤,包括:
31.基于所述对应关系确定所述目标编译接口对应的目标编译函数,将所述目标编译接口替换为所述目标编译函数。
32.进一步地,所述调用所述目标编译组件集合并参照所述第二变量内存地址信息进行编译的步骤,包括:
33.调用所述目标编译组件集合中的编译接口对非表达式运算过程参照所述第二变量内存地址信息进行编译;
34.调用所述目标编译组件集合中的编译函数对表达式运算过程参照所述第二变量内存地址信息进行编译。
35.此外,为实现上述目的,本发明还提供一种基于llvm的编译优化装置,所述装置包括:
36.确定模块,用于确定抽象语法树对应的第一变量内存地址信息,其中,所述抽象语法树为llvm前端对目标平台的源代码进行转化得到;
37.调整模块,用于将所述第一变量内存地址信息中的第一类型地址调整为第二类型地址,得到第二变量内存地址信息,所述第一类型地址为非标准对齐方式的内存地址,所述第二类型地址为标准对齐方式的内存地址;
38.替换模块,用于确定所述抽象语法树对应的编译组件集合,将所述编译组件集合中的目标编译接口替换为对应的编译函数,得到目标编译组件集合,其中,所述目标编译接口为表达式运算过程对应的编译接口;
39.生成模块,用于调用所述目标编译组件集合并参照所述第二变量内存地址信息进行编译,生成所述源代码对应的llvm中间代码。
40.此外,为实现上述目的,本发明还提供一种基于llvm的编译优化设备,所述基于llvm的编译优化包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序配置为实现如上任一项所述的基于llvm的编译优化方法的步骤。
41.此外,为实现上述目的,本发明还提供一种计算机存储介质,所述计算机存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如上任一项所述的基于llvm的编译优化方法的步骤。
42.本发明提出的基于llvm的编译优化方法、基于llvm的编译优化装置、基于llvm的编译优化设备及计算机存储介质,所述方法包括:确定抽象语法树对应的第一变量内存地址信息,其中,所述抽象语法树为llvm前端对目标平台的源代码进行转化得到;将所述第一变量内存地址信息中的第一类型地址调整为第二类型地址,得到第二变量内存地址信息,所述第一类型地址为非标准对齐方式的内存地址,所述第二类型地址为标准对齐方式的内存地址;确定所述抽象语法树对应的编译组件集合,将所述编译组件集合中的目标编译接口替换为对应的编译函数,得到目标编译组件集合,其中,所述目标编译接口为表达式运算过程对应的编译接口;调用所述目标编译组件集合并参照所述第二变量内存地址信息进行编译,生成所述源代码对应的llvm中间代码。在本技术中,在不修改llvm开源库源码的基础上,通过将非标准对齐方式的内存地址替换成标准对齐方式的目标内存地址的方式,适配目标平台非标准内存对齐的变量。并且通过将编译耗时的编译接口替换为编译函数,再调用编译函数参照目标内存地址进行编译的方式,将部分llvm的编译效率慢、编译效率低下的api指令进行函数封装与对应的接口替换。从而解决llvm在对目标平台非标准对齐方式数据进行编译优化时,编译速度慢,编译效率低的技术问题,提升llvm的实时编译速度和效率。
附图说明
43.图1是本发明实施例方案涉及终端设备的硬件运行的结构示意图;
44.图2是本发明一种基于llvm的编译优化方法一实施例的流程示意图;
45.图3是传统编译器架构示意图;
46.图4是llvm架构示意图;
47.图5是本发明一种基于llvm的编译优化方法另一实施例的局部变量池示意图;
48.图6是本发明一种基于llvm的编译优化方法另一实施例的内存对齐构建示意图;
49.图7是本发明一种基于llvm的编译优化方法另一实施例的编译过程示意图。
50.本发明目的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
51.应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
52.如图1所示,图1是本发明实施例方案涉及终端设备的硬件运行环境的结构示意图。
53.需要说明的是,图1即可为终端设备的硬件运行环境的结构示意图。本发明实施例终端设备可以是针对基于nand flash为存储介质的存储设备。如图1所示,执行本发明提供的基于llvm的编译优化方法的终端设备可以包括:处理器1001,例如cpu,网络接口1004,用户接口1003,存储设备1005,通信总线1002。其中,通信总线1002用于实现这些组件之间的连接通信。用户接口1003可以包括显示屏(display)、输入单元比如键盘(keyboard),可选用户接口1003还可以包括标准的有线接口、无线接口。网络接口1004可选的可以包括标准的有线接口、无线接口(如wi-fi接口)。存储设备1005可以是非易失性存储设备(如,flash存储设备)、高速ram存储设备,也可以是稳定的存储设备(non-volatile memory),例如磁盘存储设备。存储设备1005可选的还可以是独立于前述处理器1001的存储装置。
54.本领域技术人员可以理解,图1中示出的终端设备结构并不构成对终端设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
55.如图1所示,作为一种计算机存储介质的存储设备1005中可以包括操作系统、网络通信模块、用户接口模块以及计算机程序。其中,操作系统是管理和控制样本终端设备硬件和软件资源的程序,支持计算机程序以及其它软件或程序的运行。
56.在图1所示的终端设备中,用户接口1003主要用于与各个终端进行数据通信;网络接口1004主要用于连接后台服务器,与后台服务器进行数据通信;而处理器1001可以用于调用存储设备1005中存储的计算机程序,并执行以下操作:
57.确定抽象语法树对应的第一变量内存地址信息,其中,所述抽象语法树为llvm前端对目标平台的源代码进行转化得到;
58.将所述第一变量内存地址信息中的第一类型地址调整为第二类型地址,得到第二变量内存地址信息,所述第一类型地址为非标准对齐方式的内存地址,所述第二类型地址为标准对齐方式的内存地址;
59.确定所述抽象语法树对应的编译组件集合,将所述编译组件集合中的目标编译接口替换为对应的编译函数,得到目标编译组件集合,其中,所述目标编译接口为表达式运算过程对应的编译接口;
60.调用所述目标编译组件集合并参照所述第二变量内存地址信息进行编译,生成所述源代码对应的llvm中间代码。
61.进一步地,处理器1001可以调用存储设备1005中存储的计算机程序,还执行以下操作:
62.所述将所述第一变量内存地址信息中的第一类型地址调整为第二类型地址,得到第二变量内存地址信息的步骤之前,还包括:
63.构建预设局部变量池,所述预设局部变量池中包括临时变量,所述临时变量与所述第一类型地址数据类型的标准对齐方式对应;
64.所述将所述第一变量内存地址信息中的第一类型地址调整为第二类型地址,得到第二变量内存地址信息的步骤,包括:
65.通过所述临时变量将所述第一变量内存地址信息中的第一类型地址调整为第二类型地址,得到第二变量内存地址信息。
66.进一步地,处理器1001可以调用存储设备1005中存储的计算机程序,还执行以下操作:
67.所述通过所述临时变量将所述第一变量内存地址信息中的第一类型地址调整为第二类型地址的步骤,包括:
68.确定预设局部变量池中是否存在目标临时变量,其中,所述目标临时变量的数据类型与所述第一类型地址的对应的变量相同;
69.若存在,则将所述第一类型地址的变量替换为所述目标临时变量;
70.若不存在,则将所述第一类型地址的变量替换为数组类型的所述临时变量。
71.进一步地,处理器1001可以调用存储设备1005中存储的计算机程序,还执行以下操作:
72.所述将所述第一类型地址的变量替换为数组类型的所述临时变量的步骤,包括:
73.确定所述第一类型地址的变量的第一存储空间位数;
74.确定预设局部变量池中数组类型的所述临时变量的第二存储空间位数;
75.基于所述第一存储空间位数和所述第二存储空间位数,将所述第一类型地址的变量替换为数组类型的所述临时变量;
76.其中,所述临时变量的数组大小为所述第一存储空间位数相较于所述第二存储空间位数的倍数。
77.进一步地,处理器1001可以调用存储设备1005中存储的计算机程序,还执行以下操作:
78.所述将所述编译组件集合中的目标编译接口替换为对应的编译函数的步骤之前,还包括:
79.确定所述目标编译接口对应的编译指令;
80.将所述编译指令编译为所述目标平台的可执行文件;
81.将所述可执行文件封装为所述编译函数。
82.进一步地,处理器1001可以调用存储设备1005中存储的计算机程序,还执行以下操作:
83.所述将所述可执行文件封装为所述编译函数的步骤之后,还包括:
84.生成所述目标编译接口和所述编译函数之间的对应关系;
85.所述将所述编译组件集合中的目标编译接口替换为对应的编译函数的步骤之前,还包括:
86.基于表达式运算过程对应的标识信息在所述编译组件集合中确定目标编译接口;
87.所述将所述编译组件集合中的目标编译接口替换为对应的编译函数的步骤,包括:
88.基于所述对应关系确定所述目标编译接口对应的目标编译函数,将所述目标编译接口替换为所述目标编译函数。
89.进一步地,所述调用所述目标编译组件集合并参照所述第二变量内存地址信息进行编译的步骤,包括:
90.调用所述目标编译组件集合中的编译接口对非表达式运算过程参照所述第二变量内存地址信息进行编译;
91.调用所述目标编译组件集合中的编译函数对表达式运算过程参照所述第二变量内存地址信息进行编译。
92.参照图3,在传统编译器架构中,frontend为前端,实现词法分析、语法分析、语义分析、生成中间代码;optimizer为优化器,实现中间代码优化;backend为后端,生成机器码。参照图4,llvm代替了c语言在现代语言编译器实现中的地位,可以将源代码编译成llvm中间代码(llvm ir),然后由llvm后端对中间代码进行优化,并且编译到相应的目标平台的二进制程序。
93.具体的,以c语言编译器clang为例,说明使用llvm后端的编译器整体架构:首先,clang的前端编译器会将这个c语言的代码进行预处理、语法分析、语义分析,将「源代码」这一字符串转化为内存中有意义的数据,即生成抽象语法树;其次,就是根据内存中的抽象语法树生成llvm ir中间代码;然后,llvm后端在读取了ir之后,就会对这个ir进行优化。这在llvm后端中的对应组件会根据输入的llvm ir和相应的优化等级,进行相应的优化,并输出对应的llvm ir。最后,llvm后端中的对应组件将llvm ir生成汇编代码,并调用操作系统自带的汇编器、链接器,最终生成可执行程序。
94.请参照图2,图2为本发明基于llvm的编译优化方法一实施例的流程示意图。
95.本实施例中,所述基于llvm的编译优化方法,包括:
96.步骤s10,确定抽象语法树对应的第一变量内存地址信息,其中,所述抽象语法树为llvm前端对目标平台的源代码进行转化得到。
97.步骤s20,将所述第一变量内存地址信息中的第一类型地址调整为第二类型地址,得到第二变量内存地址信息,所述第一类型地址为非标准对齐方式的内存地址,所述第二类型地址为标准对齐方式的内存地址。
98.由于在表达式运算过程中,需要将低精度数据提升到高精度数据类型,但是部分32位llvm的api对64/128位等高精度数据类型运算编译速度较慢,影响编译效率。所以,有别于将抽象语法树的节点对应的源代码的第一变量内存地址信息的变量内存地址直接进行编译以生成源代码对应的llvm中间代码的传统方式,在本实施例中,将非标准对齐方式的第一类型地址替换成标准对齐方式的第二类型地址得到第二变量内存地址信息,再进行后续参照第二变量内存地址信息的llvm中间代码的编译和生成。
99.进一步地,步骤s10之前还包括:确定标准对齐方式,可选地,可以是以默认的四字节内存对齐方式,可以是设置的其它字节大小的内存对齐方式;进一步地,确定标准对齐方式的步骤,包括:确定当前源代码中的变量内存地址,以所述变量内存地址中最多的内存地址对齐方式作为标准对齐方式,以适应当前源代码的变量内存地址,从而进一步提升编译效率。
100.进一步地,步骤s10还包括:解析抽象语法树,得到所述第一变量内存地址信息;在所述第一变量内存地址信息中确定第一类型地址和第二类型地址。
101.步骤s30,确定所述抽象语法树对应的编译组件集合,将所述编译组件集合中的目
标编译接口替换为对应的编译函数,得到目标编译组件集合,其中,所述目标编译接口为表达式运算过程对应的编译接口。
102.同样的,在api的编译效率低、编译速度慢时,有别于直接对llvm底层生成汇编代码的机制进行更改的传统方式,在本实施例中,将根据抽象语法树生成llvm中间代码的编译接口对应的编译指令提前编译并封装为编译函数,并替换掉该编译接口。
103.进一步地,所述确定所述抽象语法树对应的编译组件集合,包括:确定所述抽象语法树的节点;确定所述节点所需的编译接口,将所有所述节点对应的编译接口组成所述编译组件集合。抽象语法树是源代码语法结构的一种抽象表示,以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。而每个节点又对应了不同的编译接口,将所有节点的编译接口组合为当前源代码对应的编译组件集合。
104.进一步地,所述将所述编译组件集合中的目标编译接口替换为对应的编译函数,包括:通过表达式运算过程对应的标识信息在所述编译组件集合中的编译接口中确定目标编译接口;基于所述目标编译接口和所述编译函数之间的对应关系,确定所述目标编译接口对应的目标编译函数,将所述目标编译接口替换为所述目标编译函数。在编译组件集合中均为各个节点对应的编译接口,在编译源代码得到llvm中间代码时,将表达式运算过程所需要用到的目标编译接口替换为目标编译函数,从而得到目标编译组件集合,在目标编译组件集合中包括表达式运算过程所调用的目标编译函数和非表达式运算过程所调用的编译接口。
105.步骤s40,调用所述目标编译组件集合并参照所述第二变量内存地址信息进行编译,生成所述源代码对应的llvm中间代码。
106.进一步地,所述调用所述目标编译组件集合并参照所述第二变量内存地址信息进行编译,包括:调用所述目标编译组件集合中的目标编译函数对表达式运算过程进行编译,调用所述目标编译组件集合中的编译接口对非表达式运算过程进行编译。
107.进一步地,所述调用所述目标编译组件集合并参照所述第二变量内存地址信息进行编译的步骤,包括:
108.步骤s401,调用所述目标编译组件集合中的编译接口对非表达式运算过程参照所述第二变量内存地址信息进行编译;
109.步骤s402,调用所述目标编译组件集合中的编译函数对表达式运算过程参照所述第二变量内存地址信息进行编译。
110.在进行非表达式运算过程的编译时,调用目标编译组件集合中的编译接口并参照非表达式运算过程对应的第二变量内存地址信息中的第二类型地址进行编译;在进行表达式运算过程的编译时,调用目标编译组件集合中的编译函数并参照表达式运算过程对应的第二变量内存地址信息中的第二类型地址进行编译。
111.从而,参照图7,有别于调用编译接口以编译指令对非标准对齐方式的变量内存地址进行编译的传统方式,在本实施例中,调用替换后的编译函数并参照替换后的第二变量内存地址信息的第二类型地址进行编译,生成源代码对应的llvm中间代码。最后,llvm后端中的对应组件将llvm ir生成汇编代码,并调用操作系统自带的汇编器、链接器,最终生成可执行程序。
112.在本实施例中,在不修改llvm开源库源码的基础上,通过将非标准对齐方式的内
存地址替换成标准对齐方式的目标内存地址的方式,适配目标平台非标准内存对齐的变量。并且通过将编译耗时的编译接口替换为编译函数,再调用编译函数参照目标内存地址进行编译的方式,将部分llvm的编译效率慢、编译效率低下的api指令进行函数封装与对应的接口替换。从而解决llvm在对目标平台非标准对齐方式数据进行编译优化时,编译速度慢,编译效率低的技术问题,提升llvm的实时编译速度和效率10倍以上。
113.参照图5,图5是本发明一种基于llvm的编译优化方法另一实施例的局部变量池示意图。
114.在本实施例中,所述将所述第一变量内存地址信息中的第一类型地址调整为第二类型地址,得到第二变量内存地址信息的步骤之前,还包括:
115.步骤a,构建预设局部变量池,所述预设局部变量池中包括临时变量,所述临时变量与所述第一类型地址数据类型的标准对齐方式对应;
116.所述将所述第一变量内存地址信息中的第一类型地址调整为第二类型地址,得到第二变量内存地址信息的步骤,包括:
117.步骤b,通过所述临时变量将所述第一变量内存地址信息中的第一类型地址调整为第二类型地址,得到第二变量内存地址信息。
118.进一步地,预设局部变量池中的临时变量包括在当前编译过程之前的编译过程中出现的历史变量;所述构建预设局部变量池,包括:根据所述历史变量构建得到预设局部变量池。通过每次编译过程使用不同数据类型的历史变量自动填充扩大预设局部变量池,从而提高预设局部变量池的适应性,增加预设局部变量池的灵活性。
119.在本实施例中,通过如图5所示的提前构建的预设局部变量池将非标准对齐方式的变量内存地址替换成标准对齐方式的目标内存地址,因此,在将非标准对齐方式的第一类型地址替换成标准对齐方式的第二类型地址的步骤之前,提前构建如图5所示的预设局部变量池。在预设局部变量池中,包括但不限于32位浮点型变量,64位双精度浮点型变量,64位整型变量以及其它与非标准对齐方式的变量内存地址对应的标准对齐方式的临时变量。
120.可选地,参照图6,所述通过所述临时变量将所述第一变量内存地址信息中的第一类型地址调整为第二类型地址的步骤,包括:
121.步骤b1,确定预设局部变量池中是否存在目标临时变量,其中,所述目标临时变量的数据类型与所述第一类型地址的对应的变量相同;
122.步骤b2,若存在,则将所述第一类型地址的变量替换为所述目标临时变量;
123.步骤b3,若不存在,则将所述第一类型地址的变量替换为数组类型的所述临时变量。
124.进一步地,所述确定预设局部变量池中是否存在与所述第一变量内存地址信息中的第一类型地址的变量相同数据类型的目标临时变量的步骤,包括:确定预设局部变量池中的所述临时变量的数据类型;确定所述第一变量内存地址信息中的第一类型地址的变量的数据类型;基于所述临时变量的数据类型和第一类型地址的变量的数据类型,确定预设局部变量池中是否存在所述目标临时变量。
125.在通过预设局部变量池将非标准对齐方式的第一类型地址替换成标准对齐方式的第二类型地址时,先将第一类型地址的变量替换为预设局部变量池中与第一类型地址的
变量相同数据类型的临时变量,再将预设局部变量池中不存在与第一类型地址的变量相同数据类型的临时变量的第一类型地址,以数组类型的临时变量进行替换。在一种可实施的方式中,将目标平台的非四字节对齐内存,一方面通过同类型的局部变量替换,另一方面通过新建数组适配变量替换,保证变量内存大小布局一致。再用替换后的内存运算完后,执行内存拷贝完成数据同步。
126.可选地,所述标准对齐方式为四字节对齐,预设局部变量池中包括对应于所述标准对齐方式的32位浮点型的标准临时变量。在一示例中,标准对齐方式为四字节对齐,因此预设局部变量池中的32位浮点型的标准临时变量为标准对齐方式的临时变量,其余均为非标准对齐方式的临时变量。其中,局部变量池提供可重复用的各种类型变量,目的是减少目标平台瞬时内存的占用,防止目标平台内存溢出;另外,提供标准的四字节对齐的变量供替换原始变量。
127.进一步地,所述将所述第一类型地址的变量替换为数组类型的所述临时变量的步骤,包括:
128.步骤b31,确定所述第一类型地址的变量的第一存储空间位数;
129.步骤b32,确定预设局部变量池中数组类型的所述临时变量的第二存储空间位数;
130.步骤b33,基于所述第一存储空间位数和所述第二存储空间位数,将所述第一类型地址的变量替换为数组类型的所述临时变量;
131.其中,所述临时变量的数组大小为所述第一存储空间位数相较于所述第二存储空间位数的倍数。
132.进一步地,基于所述第一存储空间位数和所述第二存储空间位数,将所述第一类型地址的变量替换为数组类型的所述临时变量的步骤,包括:在数组类型的不同所述临时变量中确定所述第二存储空间位数为所述第一存储空间位数整数倍的数组临时变量;在整数倍存储空间位数对应的数组临时变量中,确定对所述第一类型地址的变量进行替换的数组临时变量。其中,对如何在整数倍存储空间位数对应的数组临时变量中,确定对所述第一类型地址的变量进行替换的数组临时变量的方式不做限定。
133.在一种可实施的方式中,将非标准对齐方式的所述第一类型地址替换为数组类型的所述32位浮点型的所述标准临时变量;其中,所述标准临时变量的数组大小为所述第一类型地址的内存地址位数相较于所述标准临时变量的内存地址位数的倍数。在该示例中,在将预设局部变量池中不存在与第一类型地址相同数据类型的临时变量的第一类型地址,以数组类型的临时变量进行替换时,将非标准对齐方式的变量内存地址替换为数组类型的32位浮点型的标准临时变量,其中,标准临时变量的数组大小为第一类型地址相较于标准临时变量的倍数。比如,四字节的整型变量,就可以用两个一字节为16位的数组进行替换。浮点型运算器输入内存地址要求四字节对齐,而目标平台变量地址分配是非四字节内存,这样在用llvm的api生成中间语言时,需要先将非四字节地址的值赋值给内部局部变量池里的四字节变量,然后用它替换非四字节内存地址变量。
134.在本发明一种基于llvm的编译优化方法另一实施例中,所述将所述编译组件集合中的目标编译接口替换为对应的编译函数的步骤之前,包括:
135.步骤p1,确定所述目标编译接口对应的编译指令;
136.步骤p2,将所述编译指令编译为所述目标平台的可执行文件;
137.步骤p3,将所述可执行文件封装为所述编译函数。
138.进一步地,所述确定所述目标编译接口对应的编译指令的步骤,包括:获取所述目标编译接口的接口标识,调用所述接口标识对应的编译指令。进一步地,所述将所述编译指令编译为所述目标平台的可执行文件的步骤,包括:将所述编译指令基于所述目标平台的编译器或者llvm架构中的编译器编译为所述目标平台的可执行文件。
139.在本实施例中,llvm编译效率的提升本质上是将编译耗时的llvm的api提前编译成目标平台的实体函数,然后在生成中间程序时,用调用函数的方法去替换编译耗时的api指令,实现实时编译效率的提升。所以,在本实施例中,首先确定目标编译接口api对应的编译指令,再将其提前编译成目标平台的可执行文件,并将该可执行文件封装为编译函数,以此在llvm编译时替换直接调用api指令的方式,而通过调用函数的方式直接进行高效的实时编译。
140.所述将所述可执行文件封装为所述编译函数的步骤之后,还包括:
141.步骤p4,生成所述目标编译接口和所述编译函数之间的对应关系;
142.进一步地,所述对应关系为目标编译接口与编译函数各自标识的对应关系。其中,可以是根据目标编译接口的标识在预设编译函数库中根据所述对应关系查询或者匹配得到所述编译函数。
143.所述将所述编译组件集合中的目标编译接口替换为对应的编译函数的步骤之前,还包括:
144.步骤t,基于表达式运算过程对应的标识信息在所述编译组件集合中确定目标编译接口;
145.进一步地,步骤t包括:确定所述表达式运算过程的类型标识,通过所述类型标识在所述编译组件集合中确定所述目标编译接口;或者,确定所述表达式运算过程所需的编译接口;基于所述编译接口的标识在所述编译组件集合中确定目标编译接口。
146.所述将所述编译组件集合中的目标编译接口替换为对应的编译函数的步骤,包括:
147.步骤s301,基于所述对应关系确定所述目标编译接口对应的目标编译函数,将所述目标编译接口替换为所述目标编译函数。
148.通过表达式运算过程对应的标识信息在编译组件集合中的编译接口中确定目标编译接口;基于目标编译接口和编译函数之间的对应关系,确定目标编译接口对应的目标编译函数,进而将目标编译接口替换为目标编译函数。
149.此外,本发明实施例还提出一种基于llvm的编译优化装置,所述装置包括:
150.确定模块,用于确定抽象语法树对应的第一变量内存地址信息,其中,所述抽象语法树为llvm前端对目标平台的源代码进行转化得到;
151.调整模块,用于将所述第一变量内存地址信息中的第一类型地址调整为第二类型地址,得到第二变量内存地址信息,所述第一类型地址为非标准对齐方式的内存地址,所述第二类型地址为标准对齐方式的内存地址;
152.替换模块,用于确定所述抽象语法树对应的编译组件集合,将所述编译组件集合中的目标编译接口替换为对应的编译函数,得到目标编译组件集合,其中,所述目标编译接口为表达式运算过程对应的编译接口;
153.生成模块,用于调用所述目标编译组件集合并参照所述第二变量内存地址信息进行编译,生成所述源代码对应的llvm中间代码。
154.可选地,所述装置还包括:
155.构建模块,用于所述将所述第一变量内存地址信息中的第一类型地址调整为第二类型地址,得到第二变量内存地址信息的步骤之前:
156.构建预设局部变量池,所述预设局部变量池中包括临时变量,所述临时变量与所述第一类型地址数据类型的标准对齐方式对应;
157.调整模块,还用于:
158.通过所述临时变量将所述第一变量内存地址信息中的第一类型地址调整为第二类型地址,得到第二变量内存地址信息。
159.可选地,调整模块,还用于:
160.确定所述预设局部变量池中是否存在目标临时变量,其中,所述目标临时变量的数据类型与所述第一类型地址的对应的变量相同;
161.若存在,则将所述第一类型地址的变量替换为所述目标临时变量;
162.若不存在,则将所述第一类型地址的变量替换为数组类型的所述临时变量。
163.可选地,调整模块还用于:
164.确定所述第一类型地址的变量的第一存储空间位数;
165.确定预设局部变量池中数组类型的所述临时变量的第二存储空间位数;
166.基于所述第一存储空间位数和所述第二存储空间位数,将所述第一类型地址的变量替换为数组类型的所述临时变量;
167.其中,所述临时变量的数组大小为所述第一存储空间位数相较于所述第二存储空间位数的倍数
168.可选地,所述装置还包括:
169.封装模块,用于所述将所述编译组件集合中的目标编译接口替换为对应的编译函数的步骤之前:
170.确定所述目标编译接口对应的编译指令;
171.将所述编译指令编译为所述目标平台的可执行文件;
172.将所述可执行文件封装为所述编译函数。
173.可选地,封装模块,还用于所述将所述可执行文件封装为所述编译函数的步骤之后:
174.生成所述目标编译接口和所述编译函数之间的对应关系;
175.可选地,替换模块,还用于所述将所述编译组件集合中的目标编译接口替换为对应的编译函数的步骤之前:
176.基于表达式运算过程对应的标识信息在所述编译组件集合中确定目标编译接口;
177.可选地,替换模块,还用于基于所述对应关系确定所述目标编译接口对应的目标编译函数,将所述目标编译接口替换为所述目标编译函数。
178.可选地,生成模块,还用于调用所述目标编译组件集合中的编译接口对非表达式运算过程参照所述第二变量内存地址信息进行编译;
179.调用所述目标编译组件集合中的编译函数对表达式运算过程参照所述第二变量
内存地址信息进行编译。
180.本发明提供的基于llvm的编译优化装置,采用上述实施例中的基于llvm的编译优化方法,解决现有技术中llvm在对目标平台非标准对齐方式数据进行编译优化时,编译速度慢,编译效率低的技术问题。与现有技术相比,本发明实施例提供的基于llvm的编译优化装置的有益效果与上述实施例提供的基于llvm的编译优化方法的有益效果相同,且该基于llvm的编译优化装置中的其他技术特征与上述实施例方法公开的特征相同,在此不做赘述。
181.此外,本发明实施例还提出一种基于llvm的编译优化设备,所述基于llvm的编译优化包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序配置为实现如上任一项所述的基于llvm的编译优化方法的步骤。
182.此外,本发明实施例还提出一种计算机存储介质,所述计算机存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如上任一项所述的基于llvm的编译优化方法的步骤。
183.其中,在所述处理器上运行的计算机程序被执行时所实现的步骤可参照本发明基于llvm的编译优化方法的各个实施例,此处不再赘述。
184.需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。
185.上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
186.通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个计算机存储介质(如f l ash存储设备、rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)中,用于控制该存储介质进行数据读写操作的控制器执行本发明各个实施例所述的方法。
187.以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
再多了解一些

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

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

相关文献