1

命令上またはグローバルメタデータとして、メタデータノードをプログラムに追加しようとしています。LLVM C APIでこれを行うにはどうすればよいですか?LLVMAddNamedMetadataOperandこの質問からわかるように)関数を提供するようになりましたが、使用方法がわかりません。これはllvm-fsaddNamedMetadataOperandバインディングでバインドされます。私はこれを試しました:

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

メタデータノードが呼び出されることを期待していますfoobarが、機能しません-キャストエラーについて文句を言います。多分あなたがaddNamedMetadataOperand命令で使うことになっていると思ったので、私は試しました:

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

でもこれも気に入らなかった。

4

1 に答える 1

1

このコミットに、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の一部ではありませんが、可能な限り機能させたいと考えています。

于 2012-11-01T01:10:00.540 に答える