LLVM for Grad Students 大学院生のためのLLVM を訳す8

Linking With a Runtime Library

ランタイムライブラリへのリンク

あなたが明確でないなにかをする命令コードを必要とするとき, IRBuilderをつかってLLVM命令を使うことができる.

その代わり, 実行時のC言語動作とプログラムをリンクする必要がある.
この章では, どのように静的変換の代わりに2項演算子の結果ログの実行時ライブラリへ書くのかについて言及します.

つぎにLLVMのPassコードを示す. これはllvm-pass-skeletonレポジトリのrtlibブランチに存在します.

// Get the function to call from our runtime library.
LLVMContext& Ctx = F.getContext();
Constant* logFunc = F.getParent()->getOrInsertFunction(
  "logop", Type::getVoidTy(Ctx), Type::getInt32Ty(Ctx), NULL
);
for (auto& B : F) {
  for (auto& I : B) {
    if (auto* op = dyn_cast<BinaryOperator>(&I)) {
      // Insert *after* `op`.
      IRBuilder<> builder(op);
      builder.SetInsertPoint(&B, ++builder.GetInsertPoint());
      // Insert a call to our function.
      Value* args[] = {op};
      builder.CreateCall(logFunc, args);
      return true;
    }
  }
}

ツールはあなたにModule::hetOrInsertFunctionとIRBuilder::CreateCallを必要とする. 前者はあなたの実行時の関数logop宣言を追加し, それはvoid logop(int i);と関数のプロトタイプ宣言と似ています.
logop関数の定義が書かれた実行時ライブラリの命令コードを以下に示す.

#include <stdio.h>
void logop(int i) {
  printf("computed: %i\n", i);
}

命令プログラムを実行するには、ランタイムライブラリにリンクする:

$ cc -c rtlib.c
$ clang -Xclang -load -Xclang build/skeleton/libSkeletonPass.so -c example.c
$ cc example.o rtlib.o
$ ./a.out
12
computed: 14
14

もしあなたが好むのであるならば, 機械コードにコンパイルする前に実行時ライブラリと合わせることも可能です.
The llvm-linkユーティリテにおいてあなたはIdと同じような大雑把なIR-level考えることができる. 使い方はhelpをみてください.

Annotations 注釈

ほとんどプロジェクトはプログラマと対話することとなる. あなたは注釈が必要となる.LLVM Passにプログラムから追加情報を与えるいくつかの方法がある.
いくつかのアノテーションシステムを構築する方法がある.

・ 実用的で開発的な方法としてfunctionを利用することです いくつかの固有の空のfunctionで宣言し, ヘッダーファイル内で固有名を宣言する ソースのファイルをインクルードし, 何もしない関数を呼び出す.
あなたのPassで魔法を使うこととあなたの関数を呼ぶと, CallInst命令を探す.
例えば, あなたが__enable_instrumentation()とdisable_instrumentation()を呼び出したい時,プログラムがあなたの特定の領域にコードいじるを閉じ込めるようにする.


注釈は日本語めちゃくちゃになりそうだし, 違うこともやりたくなったので, ここで訳は終了.

小話ですが, ブログ毎日やろうとして書いてたら, 0時超えてて途切れてしまった.
あと, 困っていたLLVM Passを動作することできたので, 再現性を確認できたら書いていきたいと思う.