gcc为formal parm生成dwarf调试信息

本文探讨了GCC编译器在生成DWARF调试信息时,针对寄存器参数传递和堆栈参数传递的处理差异。当寄存器用完后,参数开始使用堆栈传递,导致调试信息中location信息缺失。通过对GCC内部流程的分析,揭示了这个问题的原因在于ARG_POINTER_REGNUM的定义,以及在ira_build()和reload()函数中对pseudo register的处理。移除特定赋值语句后,GCC为所有参数生成location信息,因为此时需要描述所有参数。
摘要由CSDN通过智能技术生成

本次问题从一个bug入手,源文件非常简单,只包含一个函数:

int call2b(char c, float f1, short 2, double d1, int i, float f2, long l, double d2)

{

  c='a';f1=0.0;s=5;d1=0.0;

  i=6;

  f2 = 0.1;l=7;d2=0.2

return i;

}

该函数使用gcc编译(参数‘-g -O0’)之后会产生dwarf调试信息,其中每个formal parm都会有一个die。每个die描述的信息有:name、file、line、type以及location。但是问题来了:

(1)前面四个parm的调试信息都是完整的,但是从第五个参数int i开始,后面的parm的调试信息中都没有location信息。

(2)把i=6该语句注释掉,再重新编译,此时所有的parm的调试信息都是完整的。

这么两个问题让我百思不得其解,但是calm down。仔细分析一下,就会发现,调试信息是从int i开始不正常的,而使用的gcc的体系结构后端的abi中规定,传参的寄存器有5个,当传参寄存器用完之后那么就使用堆栈传参。那么我们可以知道,前面四个参数刚好把5个传参寄存器用完了(double d1使用两个)。也就是说堆栈传参导致的问题。

那么接下来进行debug。

首先需要找到dwarf调试信息是在哪个pass中生成的。我们找到一个名为“final”的pass,该pass负责将rtl转化为assembly,并且输出dwarf调试信息。具体流程如图所示。


可见,前面部分负责输出assembly insns,而dwarf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值