1
讓我告訴你下面簡單的C代碼:LLVM如何處理continue關鍵字和右大括號的調試位置信息?
int main()
{
int i;
for (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++;
也就是說,位置LLVM的右大括號不會發出。但是,如果我們有繼續關鍵字:
int main()
{
int i;
for (i = 0; i < 256; i++)
{
continue;
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;
我們將停止繼續的線。但是,如果我們比較它們之間的LLVM IR:
右括號和繼續關鍵字都是以下br指令和!dbg!23。除了!dbg!23的行號不一樣。
; :6:; preds =%3 BR標籤%7,!DBG!23
問題是LLVM如何知道是否生成調試位置(產生了繼續關鍵字行,而不是循環的右大括號)?因爲他們是相同的指令而其他人是相同的。