如何使用LLVM C API / LLVM-FS绑定添加元数据节点(How to add metad

2019-09-29 11:44发布

我试图将元数据节点添加到程序,无论是到指令或全球的元数据。 如何做到这一点与LLVM C API? 现在提供了一个功能LLVMAddNamedMetadataOperand (从发现这个问题 ),但我似乎无法看到如何使用它。 这势必addNamedMetadataOperand在LLVM-FS绑定。 我尝试这样做:

addNamedMetadataOperand myModule "foobar" (mDString "cat" 3u)

期待它做一些元数据节点叫做foobar ,但它不工作-抱怨施放的错误。 我想也许你应该使用addNamedMetadataOperand上的指令,所以我尝试:

let ret = buildRet bldr (constInt i32 0UL)
addNamedMetadataOperand myModule "foobar" ret

但它并没有喜欢这样。

Answer 1:

我添加了两个新的“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的一部分,但我不希望它工作以及可能的。



文章来源: How to add metadata nodes using the LLVM C Api/llvm-fs bindings