このコミットに、mdNodeとmdNodeInContextという2つの新しい「F#フレンドリ関数」を追加しました。そのコミットで、サンプルコードを次のように変更できます。
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"}
0uを使用していたときにメタデータ出力が得られなかったため、事前定義されたMDの種類の1つではなくgetMDKindIDを使用しました。理由については詳しく調べていませんが、http://llvm.org/docs/LangRef.html#metadataを見ると、事前定義されたメタデータタイプには、適用された命令が満たされていないという制約があるようです。とにかく、これでさらに問題が発生した場合はお知らせください。現在使用しているAPIの一部ではありませんが、可能な限り機能させたいと考えています。