2013-05-07 91 views
3

我正在開發一個基於F#語言的功能語言的llvm前端。那麼,功能語言與價值的概念相匹配,而不是變量。 F#也通過所謂的「可變值」支持變量,我可以將它建模爲%llvm.dbg.declare()來跟蹤該值。但我不知道如何跟蹤價值。一個值不是由alloca創建的,它只是一個值,不會改變。並且這些例子都告訴了C這樣的命令式語言的實現,它沒有這個不變的價值概念。任何人都對功能風格語言的調試信息有一些建議或暗示?如何在llvm源代碼級調試信息中表示函數式語言調試信息?

+1

我不知道,但也許使用'llvm-gcc -g -O0'用'const'編譯C++並查看它產生了什麼? – 2013-05-07 12:31:05

+0

@EliBendersky F#是一種靜態類型語言。 「值」是指F#中的不可變變量。 – Asik 2013-05-08 01:08:10

回答

0

對於SSA值,您使用@llvm.dbg.value()而不是@llvm.dbg.declare。首先,您必須爲@llvm.dbg.declare定義本地值的元數據,下面我假設它定義爲!4。該LLVM IR看起來像

%x = ... 
call void @llvm.dbg.value(metadata !{ i32 %x }, i64 0, metadata !4) 

我從http://nondot.org/sabre/LLVMNotes/DebugInfoVariableInfo.txt描述mem2reg是如何將調試信息得到了這個信息。這可能與當前的LLVM實踐有關,因此您可以使用alloca s和@llvm.dbg.declare編寫一些IR,然後運行mem2reg傳遞以查看轉換爲SSA時調試信息的更改方式。