[英]How to add metadata nodes using the LLVM C Api/llvm-fs bindings
我試圖將元數據節點添加到程序中,要么添加到指令中,要么添加為全局元數據。 如何使用LLVM C API做到這一點? 現在它提供了一個函數LLVMAddNamedMetadataOperand
(從這個問題中找到),但是我似乎看不到如何使用它。 這綁定到llvm-fs綁定中的addNamedMetadataOperand
。 我嘗試了這個:
addNamedMetadataOperand myModule "foobar" (mDString "cat" 3u)
期望它生成一些稱為foobar
元數據節點,但它不起作用-抱怨轉換錯誤。 我認為也許您應該在一條指令上使用addNamedMetadataOperand
,所以我嘗試了:
let ret = buildRet bldr (constInt i32 0UL)
addNamedMetadataOperand myModule "foobar" ret
但它也不喜歡這樣。
我在此commit中添加了兩個新的“ F#友好函數”:mdNode和mdNodeInContext。 通過該提交,我可以將示例代碼修改為:
open LLVM.Core
open LLVM.Generated.Core
open LLVM.Generated.BitWriter
let i32 = int32Type ()
let i32zero = constInt i32 0UL false
[<EntryPoint>]
let main argv =
// Set up the module/function
let module_ = moduleCreateWithName "foobar"
//let context = getModuleContext module_
let funcTy = functionType i32 [||]
let func = addFunction module_ "main" funcTy
let bldr = createBuilder ()
let entry = appendBasicBlock func "entry"
positionBuilderAtEnd bldr entry
// Make a Metadata node and try and attach it to a ret
//let mdnode = mDStringInContext context "bazquux" 7u
let mdstring = mDString "bazquux" 7u
let ret = buildRet bldr i32zero
// From http://llvm.org/docs/doxygen/html/classllvm_1_1LLVMContext.html
// MD_dbg = 0, MD_tbaa = 1, MD_prof = 2, MD_fpmath = 3, MD_range = 4, MD_tbaa_struct = 5
// Fails here
//setMetadata ret 0u mdnode
let myMDName = "my_MD_kind"
setMetadata ret (getMDKindID myMDName (uint32 myMDName.Length)) (mdNode [|mdstring|])
// Save bitcode to file
writeBitcodeToFile module_ "metadatatest.bc"
給出位代碼:
; ModuleID = 'metadatatest.bc'
define i32 @main() {
entry:
ret i32 0, !my_MD_kind !0
}
!0 = metadata !{metadata !"bazquux"}
我使用getMDKindID而不是使用預定義的MD類型之一,因為當我使用0u時,沒有任何元數據輸出。 我沒有深入探討為什么,但是從查看http://llvm.org/docs/LangRef.html#metadata來看,預定義的元數據類型似乎受到一些限制,即所應用的指令無法滿足要求。 無論如何,請告訴我您是否還有其他問題。 目前,它不是我正在使用的API的一部分,但我確實希望它盡可能地正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.