2017-06-02 29 views
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如何知道是否生成調試位置(產生了繼續關鍵字行,而不是循環的右大括號)?因爲他們是相同的指令而其他人是相同的。

回答

1

的梅開二度只是一個語法範圍,有沒有之間爲編譯器的區別:

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

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

解析器使用您創建的組聲明一起範圍,但是這將會在LLVM IR中出現而不是。 LLVM IR表示程序需要執行的指令。

當您在調試器中使用n時,您要求繼續執行該程序,直到達到與不同源代碼行對應的指令。大括號不對應於可執行文件中的任何指令。