簡體   English   中英

如何使用LLVM C Api / llvm-fs綁定添加元數據節點

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM