Debugging LLVM如何处理continue关键字和右大括号的调试位置信息?

Debugging LLVM如何处理continue关键字和右大括号的调试位置信息?,debugging,clang,llvm,Debugging,Clang,Llvm,让我向您展示以下简单的C代码: int main() { int i; for (i = 0; i < 256; i++) { i++; } } intmain() { int i; 对于(i=0;i

让我向您展示以下简单的C代码:

int main()
{
  int i;

  for (i = 0; i < 256; i++)
  {
      i++;
  }
}
intmain()
{
int i;
对于(i=0;i<256;i++)
{
i++;
}
}
在这个简单的C代码中,如果我们使用Clang编译并调试它: 我们将得到如下结果:

(gdb) b main
Breakpoint 1 at 0x100000f7b: file a.c, line 5.
(gdb) r
Starting program: a.out 
[New Thread 0x1403 of process 23435]
warning: unhandled dyld version (15)

Thread 2 hit Breakpoint 1, main () at a.c:5
5     for (i = 0; i < 256; i++)
(gdb) n
7         i++;
(gdb) 
5     for (i = 0; i < 256; i++)
(gdb) 
7         i++;
(gdb)b main
断点1位于0x10000F7B:文件a.c,第5行。
(gdb)r
启动程序:a
[进程23435的新线程0x1403]
警告:未处理的dyld版本(15)
线程2在a.c:5处命中断点1,main()
5表示(i=0;i<256;i++)
(gdb)n
7i++;
(gdb)
5表示(i=0;i<256;i++)
(gdb)
7i++;
也就是说,位置LLVM的右括号不发出。但是,如果我们有continue关键字:

int main()
{
  int i;

  for (i = 0; i < 256; i++)
  {
    continue;
    i++;
  }
}
intmain()
{
int i;
对于(i=0;i<256;i++)
{
继续;
i++;
}
}
然后我们编译并调试它:

Thread 2 hit Breakpoint 1, main () at a.c:5
5     for (i = 0; i < 256; i++)
(gdb) n
7       continue;
(gdb) 
5     for (i = 0; i < 256; i++)
(gdb) 
7       continue;
(gdb) 
5     for (i = 0; i < 256; i++)
(gdb) 
7       continue;
线程2在a.c:5处命中断点1,main()
5表示(i=0;i<256;i++)
(gdb)n
7继续;
(gdb)
5表示(i=0;i<256;i++)
(gdb)
7继续;
(gdb)
5表示(i=0;i<256;i++)
(gdb)
7继续;
我们将停止生产线继续生产。但如果我们比较它们之间的LLVM IR:

右大括号和continue关键字都在br指令和下面!dbg!23除了行号!dbg!23不一样

:6: ; preds=%3 br标签%7!dbg!二十三


问题是LLVM如何知道是否生成调试位置(为continue关键字行生成,但不为循环的右大括号生成)?因为它们是相同的指令,而其他指令是相同的。

大括号只是一个语法作用域,编译器在以下方面没有区别:

for (i = 0; i < 256; i++)
{
  i++;
}
(i=0;i<256;i++)的

{
i++;
}

(i=0;i<256;i++)的

i++;
解析器正在使用您创建的作用域将语句组合在一起,但这不会出现在LLVM IR中。LLVM IR表示程序需要执行的更多指令

在调试器中使用
n
时,要求继续执行程序,直到到达与不同源代码行对应的指令。大括号不对应于可执行文件中的任何指令

for (i = 0; i < 256; i++)
  i++;