2013-05-01 49 views
10

我想編譯使用autotools構建系統到LLVM位代碼的軟件;也就是說,我希望最終獲得的可執行文件是LLVM位碼,而不是實際的機器碼。構建自動化軟件到LLVM位代碼

(我們的目標是能夠在整個程序運行LLVM位碼分析工具。)

我已經試過指定CC="clang -emit-llvm -use-gold-plugins"和變體的configure腳本,但無濟於事。總會出現一些問題(例如,該軟件包會生成.a靜態庫,它們會被鏈接器拒絕)。

在我看來,正確的方法是LLVM位碼應該是一個交叉編譯目標。設置爲--host=,但沒有這樣的標準目標(即使Knuth的MMIX有目標)。

到目前爲止,我已經使用了kludges,例如編譯CC="clang -emit-llvm -use-gold-plugins"並手動運行鏈接線(使用llvm-ldllvm-link)。這適用於簡單的包,例如grep

我想要一個強大的方法,可以用於大多數(如果不是全部的話)配置腳本,包括中間文件或中間目標文件。

+0

llvm-ld似乎暗示它接受.a文件http://llvm.org/releases/2.7/docs/CommandGuide/html/llvm-ld.html – 2013-05-09 20:29:58

+0

llvm-ld在以後的LLVM版本中不再存在。 – 2013-05-12 12:00:33

+0

你看過「鏈接」使用lld嗎? http://lld.llvm.org/ – 2013-09-29 05:56:08

回答

2

有一些方法,如this。但對於不使用中間靜態庫的簡單構建,則可以更簡單些。你需要的東西列表是

  1. llvm,配置黃金插件的支持。請參閱this
  2. dragonegg,如果你需要前端的FORTRAN,走等

的關鍵是使「-flto」對於任何一個鐺或dragonegg(前端) ,無論是在編譯時間還是鏈接時間。這是簡單的鏗鏘:

CC = clang 
CLINKER = clang 
CFLAGS = -flto -c 
CLINKFLAGS = -flto -Wl,-plugin-opt=also-emit-llvm 

如果需要的話,增加額外的「-plugin,選擇」選項來指定特定LLVM-代碼生成選項:

-Wl,-plugin-opt=also-emit-llvm,-plugin-opt=-disable-fp-elim 

轉儲的整個問題的字節碼將隨坐你的最終可執

使用dragonegg時需要兩個額外的東西。

首先,dragonegg不知道LLVM黃金插件的位置,它需要在連接器選項中指定這樣-Wl,-plugin=/path/to/LLVMgold.so,-plugin-opt=...

其次,dragonegg只能夠傾倒IR,而不是字節碼。你需要一個包裝腳本來達到這個目的。我創建了一個here。對我來說工作得很好。