我已經看到了如何做到這一點周圍的谷歌搜索結果的幾個相互矛盾的描述,一直沒能得到任何他們的工作得到機器代碼。打印x86彙編,而不是從ExecutionEngine
我的問題基本上是這樣的:我調用ExecutionEngine :: getPointerToFunction(帶一個llvm :: Function *),我想反而得到這個函數生成的漂亮的x86組件。
有人嗎?
[ETA:我使用LLVM 3.3。我發現的描述似乎適用於早期版本的LLVM。]
我已經看到了如何做到這一點周圍的谷歌搜索結果的幾個相互矛盾的描述,一直沒能得到任何他們的工作得到機器代碼。打印x86彙編,而不是從ExecutionEngine
我的問題基本上是這樣的:我調用ExecutionEngine :: getPointerToFunction(帶一個llvm :: Function *),我想反而得到這個函數生成的漂亮的x86組件。
有人嗎?
[ETA:我使用LLVM 3.3。我發現的描述似乎適用於早期版本的LLVM。]
事實證明,您可以使用ExecutionEngine :: RegisterJITEventListener將事件偵聽器添加到JIT ExecutionEngine。如果您提供該類的實例,則可以在爲您生成機器代碼時調用回調函數,併爲您指定機器代碼及其長度。有了這個,您可以調用llvm :: sys :: disassembleBuffer來獲取機器代碼緩衝區的描述。
然而,LLVM :: SYS :: disassembleBuffer功能只是推遲到UDIS庫,如果LLVM是與支持編譯。由於我的LLVM編譯的沒有這個標誌設置,我不能重建它,我就考慮直接使用UDIS庫:
這是有益的,看看你試過代碼以及該代碼如何失敗,無論是例外還是結果與您的期望不同。 –
Nicole,我編輯了我的評論,以清楚地表明我正在使用LLVM 3.3進行此操作。我在google上發現的評論似乎是針對早期版本的LLVM(因爲它們不能用3.3編譯)。 你真的做到了嗎? –