一种针对申威架构TLSGD重定位的编译链接方法、装置及存储介质制造方法及图纸

技术编号:39331276 阅读:13 留言:0更新日期:2023-11-12 16:07
本发明专利技术公开了一种针对申威架构TLSGD重定位的编译链接方法、装置及存储介质,编译链接方法包括:判断重定位变量的数量是否超出预设阈值;将线程局部变量的代码转换成TLSGD指令或复合指令;将转换得到的TLSGD指令或复合指令汇编至重定位表;对重定位表中的指令条目进行位置调整;根据完成判断后的重定位表中的TLSGD指令条目,计算TLSGD指令对应的线程局部变量地址在GOT中相对GP的偏移量disp;根据偏移量disp是否在16位二进制表示范围内,确定TLSGD指令或复合指令的偏移量,并回填,得到重定位后的指令。本发明专利技术提升了线程私有变量的寻址范围,满足多线程应用程序在申威平台的适配需求,确保应用程序可以正确链接生成可执行文件或库文件。件或库文件。件或库文件。

【技术实现步骤摘要】
一种针对申威架构TLSGD重定位的编译链接方法、装置及存储介质


[0001]本专利技术属于编译器
,涉及一种针对申威架构TLSGD重定位的编译链接方法、装置及存储介质。

技术介绍

[0002]针对源程序中的线程私有变量,编译器根据目标机器的不同生成相对应的重定位类型,在后续处理过程中将其放入可执行和可链接(Executable and Linking Format,ELF)格式的对应段中,如X86处理器平台生成R_X86_64_TLSGD重定位;RISCV处理器平台生成R_RISCV_TLS_GD_HI20和R_RISCV_PCREL_LO12_I重定位;而申威处理器平台提供的是TLSGD重定位,使用精简存储指令进行寻址。
[0003]多线程应用程序在提高系统资源利用率的同时也会导致数据竞争问题,为了避免多线程资源竞争问题,需要保证一个线程独享一份数据,其他线程无法访问,可以使用__thread关键字定义线程局部存储(ThreadLocal Storage,TLS)变量。随着线程并行应用程序功能的不断增加以及性能的不断改善,线程局部存储变量的定义也越来越多,导致编译生成的共享库或目标文件的重定位数量也在增加,现有的编译链接技术已不能满足更大范围的重定位寻址。申威继续使用精简存储指令进行TLSGD重定位寻址也已不能满足多线程编程的需求,甚至导致相关应用程序不能正确链接生成可执行文件或库文件。

技术实现思路

[0004]本专利技术的目的在于克服现有技术中的不足,提供一种针对申威架构TLSGD重定位的编译链接方法、装置及存储介质,极大提升了线程私有变量的寻址范围,满足多线程应用程序在申威平台的适配需求,确保应用程序可以正确链接生成可执行文件或库文件。
[0005]为达到上述目的,本专利技术是采用下述技术方案实现的:
[0006]本专利技术提供一种针对申威架构TLSGD重定位的编译链接方法,包括以下步骤:
[0007]对需要重定位的变量进行分析统计,得到重定位变量;
[0008]判断重定位变量的数量是否超出预设阈值;
[0009]若重定位变量的数量未超出预设阈值,将线程局部变量的代码转换成TLSGD指令,将GP基地址和偏移量disp的结果存入RA寄存器;若重定位变量的数量超出预设阈值,将线程局部变量的代码转换成复合指令,复合指令依次包括TLSGOT指令和TLSGD指令,将GP基地址和偏移量highdisp左移十六位的结果存入RA寄存器,以及将偏移量lowdisp和RA寄存器中的地址存入RA寄存器;
[0010]将转换得到的TLSGD指令或复合指令汇编至用于收集和记录重定位变量的重定位信息的重定位表;
[0011]对所述重定位表中的指令条目进行位置调整,使得其中各TLSGOT指令的下一个指令条目为最接近的在后TLSGD指令,且最后一个TLSGD指令的在后指令条目均为TLSGOT指令
或者无其他指令条目,最后一个TLSGOT指令的在后指令条目均为TLSGD指令或者无其他指令条目;
[0012]根据完成判断后的重定位表中的TLSGD指令条目,计算TLSGD指令对应的线程局部变量地址在GOT中相对GP的偏移量disp;
[0013]根据所述偏移量disp是否在16位二进制表示范围内,确定TLSGD指令或复合指令的偏移量,并回填,得到重定位后的指令。
[0014]可选的,所述对所述重定位表中的指令条目进行位置调整,包括:
[0015]判断重定位表中每个指令条目是否为TLSGOT指令;
[0016]若指令条目为TLSGOT指令,则查看该指令条目的下一个指令条目是否为TLSGD指令,若下一个指令条目为TLSGD指令,则继续对未完成判断的指令条目进行判断,若下一个指令条目不是TLSGD指令,则向下寻找TLSGD指令的指令条目,将遇到的第一个TLSGD指令条目插入到该TLSGOT指令条目的下方,继续对未完成判断的指令条目进行判断;
[0017]若指令条目不是TLSGOT指令,则继续对未完成判断的指令条目进行判断。
[0018]可选的,所述根据偏移量disp是否在16位二进制表示范围内,确定TLSGD指令或复合指令的偏移量,包括:
[0019]判断所述偏移量disp是否在16位二进制表示范围之内;
[0020]若disp在16位二进制表示范围内,则判断该TLSGD指令条目的上一个指令条目是否为TLSGOT指令条目,若该TLSGD指令条目的上一个指令条目不是TLSGOT指令条目,则回填TLSGD指令中的偏移量disp,若该TLSGD指令条目的上一个指令条目是TLSGOT指令条目,则使用空指令替换TLSGOT指令,并回填TLSGD指令中的偏移量disp;
[0021]若disp不在16位二进制表示范围内,则判断该TLSGD指令条目的上一个指令条目是否为TLSGOT指令条目,若该TLSGD指令条目的上一个指令条目不是TLSGOT指令条目,则在该TLSGD指令条目前插入一条TLSGOT指令条目,形成复合指令,计算和回填TLSGOT+TLSGD复合指令中的偏移量highdisp和lowdisp,若该TLSGD指令条目的上一个指令条目是TLSGOT指令条目,计算和回填复合指令中的偏移量highdisp和lowdisp,得到重定位后的指令。
[0022]可选的,计算TLSGD指令对应的线程局部变量地址在GOT中相对GP的偏移量disp,公式为:
[0023]disp=gotdisp

0x8000
[0024]其中,gotdisp为链接器已知的线程局部变量地址在GOT中的偏移。
[0025]可选的,确定复合指令对应的线程局部变量地址在GOT中相对GP的偏移量的高16位highdisp,公式为:
[0026]highdisp=((disp>>16)+((disp>>15)&1))&0xffff。
[0027]可选的,确定复合指令对应的线程局部变量地址在GOT中相对GP的偏移量的低16位lowdisp,公式为:
[0028]lowdisp=disp&0xffff。
[0029]一种针对申威架构TLSGD重定位的编译链接装置,包括:
[0030]获取模块:对需要重定位的变量进行分析统计,得到重定位变量;
[0031]阈值判断模块,用于判断重定位变量的数量是否超出预设阈值;若重定位变量的数量未超出预设阈值,将线程局部变量的代码转换成TLSGD指令,将GP基地址和偏移量disp
的结果存入RA寄存器;若重定位变量的数量超出预设阈值,将线程局部变量的代码转换成复合指令,复合指令依次包括TLSGOT指令和TLSGD指令,将GP基地址和偏移量highdisp左移十六位的结果存入RA寄存器,以及将偏移量lowdisp和RA寄存器中的地址存入RA寄本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种针对申威架构TLSGD重定位的编译链接方法,其特征在于,包括以下步骤:对需要重定位的变量进行分析统计,得到重定位变量;判断重定位变量的数量是否超出预设阈值;若重定位变量的数量未超出预设阈值,将线程局部变量的代码转换成TLSGD指令,将GP基地址和偏移量disp的结果存入RA寄存器;若重定位变量的数量超出预设阈值,将线程局部变量的代码转换成复合指令,复合指令依次包括TLSGOT指令和TLSGD指令,将GP基地址和偏移量highdisp左移十六位的结果存入RA寄存器,以及将偏移量lowdisp和RA寄存器中的地址存入RA寄存器;将转换得到的TLSGD指令或复合指令汇编至用于收集和记录重定位变量的重定位信息的重定位表;对所述重定位表中的指令条目进行位置调整,使得其中各TLSGOT指令的下一个指令条目为最接近的在后TLSGD指令,且最后一个TLSGD指令的在后指令条目均为TLSGOT指令或者无其他指令条目,最后一个TLSGOT指令的在后指令条目均为TLSGD指令或者无其他指令条目;根据完成判断后的重定位表中的TLSGD指令条目,计算TLSGD指令对应的线程局部变量地址在GOT中相对GP的偏移量disp;根据所述偏移量disp是否在16位二进制表示范围内,确定TLSGD指令或复合指令的偏移量,并回填,得到重定位后的指令。2.根据权利要求1所述的针对申威架构TLSGD重定位的编译链接方法,其特征在于:所述对所述重定位表中的指令条目进行位置调整,包括:判断重定位表中每个指令条目是否为TLSGOT指令;若指令条目为TLSGOT指令,则查看该指令条目的下一个指令条目是否为TLSGD指令,若下一个指令条目为TLSGD指令,则继续对未完成判断的指令条目进行判断,若下一个指令条目不是TLSGD指令,则向下寻找TLSGD指令的指令条目,将遇到的第一个TLSGD指令条目插入到该TLSGOT指令条目的下方,继续对未完成判断的指令条目进行判断;若指令条目不是TLSGOT指令,则继续对未完成判断的指令条目进行判断。3.根据权利要求1所述的针对申威架构TLSGD重定位的编译链接方法,其特征在于:所述根据偏移量disp是否在16位二进制表示范围内,确定TLSGD指令或复合指令的偏移量,包括:判断所述偏移量disp是否在16位二进制表示范围之内;若disp在16位二进制表示范围内,则判断该TLSGD指令条目的上一个指令条目是否为TLSGOT指令条目,若该TLSGD指令条目的上一个指令条目不是TLSGOT指令条目,则回填TLSGD指令中的偏移量disp,若该TLSGD指令条目的上一个指令条目是TLSGOT指令条目,则使用空指令替换TLSGOT指令,并回填TLSGD指令中的偏移量disp;若disp不在16位二进制表示范围内,则判断该TLSGD指令条目的上一个指令条目是否为TLSGOT指令条目,若该TLSGD指令条目的上一个指令条目不是TLSGOT指令条目,则在该TLSGD指令条目前插入一条TLSGOT指令条目,形成复合指令,计算...

【专利技术属性】
技术研发人员:赵爱南翟彦河钱明楼张海军毕乾祥
申请(专利权)人:无锡先进技术研究院
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1