compiler-construction - 如何使用 LLVM api/LLVM fs绑定添加元数据节点

  显示原文与译文双语对照的内容
0 0

我试图向程序中添加元数据节点,要么是在指令上,要么是全局元数据。 如何使用 LLVM C API实现这个功能? 它现在提供一个函数 LLVMAddNamedMetadataOperand ( 从发现这个问题。),但我看不出如何使用它。 这在 llvm-fs的绑定中绑定到了 addNamedMetadataOperand 。 我试过这个:

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

希望它能生成一个叫做 foobar的元数据节点,但它不工作- complains关于cast错误的抱怨。 我想也许你应该在指令上使用 addNamedMetadataOperand,所以我尝试了:

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

但它也不喜欢这样。

时间:原作者:6个回答

0 0

我添加了两个新的"。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而不是一个预定义的I 类型,因为当使用 0u 时,我没有输出元数据。 我还没有深入了解为什么,但是从查看 http://llvm.org/docs/LangRef.html#metadata 似乎预定义元数据类型有一些限制,说明它应用到的是不符合规范的规范。 无论如何,如果你看到更多的问题,让我知道。 这不是我现在使用的API的一部分,但是我希望它能够尽可以能地工作。

原作者:
...