13

LLVM C++APIを理解するのは難しいと思いました。
LLVM C ++APIとLLVMIRの間に関係はありますか?また、LLVM C ++ APIをどのように使用できますか?

4

2 に答える 2

15

(大幅に) 簡単にするために、LLVM はコンパイラを作成するための C++ ライブラリです。その C++ API は、ライブラリのユーザーがコンパイラを実装するために使用する外部インターフェイスです。

LLVM IR と LLVM C++ API の一部 (IR の構築に使用される部分) の間にはある程度の対称性があります。この対称性を理解するための非常に優れたリソースはhttp://llvm.org/demo/です。たとえば、次の C コードをコンパイルできます。

int factorial(int X) {
  if (X == 0) return 1;
  return X*factorial(X-1);
}

LLVM IR に:

define i32 @factorial(i32 %X) nounwind uwtable readnone {
  %1 = icmp eq i32 %X, 0
  br i1 %1, label %tailrecurse._crit_edge, label %tailrecurse

tailrecurse:                                      ; preds = %tailrecurse, %0
  %X.tr2 = phi i32 [ %2, %tailrecurse ], [ %X, %0 ]
  %accumulator.tr1 = phi i32 [ %3, %tailrecurse ], [ 1, %0 ]
  %2 = add nsw i32 %X.tr2, -1
  %3 = mul nsw i32 %X.tr2, %accumulator.tr1
  %4 = icmp eq i32 %2, 0
  br i1 %4, label %tailrecurse._crit_edge, label %tailrecurse

tailrecurse._crit_edge:                           ; preds = %tailrecurse, %0
  %accumulator.tr.lcssa = phi i32 [ 1, %0 ], [ %3, %tailrecurse ]
  ret i32 %accumulator.tr.lcssa
}

C++ API 呼び出しも同様です (出力が長いためここには貼り付けませんが、自分で試すことができます)。icmpこれを行うと、たとえば、上記の IR コードの命令が次のように実行されることがわかります。

ICmpInst* int1_5 = new ICmpInst(*label_4, ICmpInst::ICMP_EQ, int32_X, const_int32_1, "");

ICmpInsticmp命令の作成に使用される C++ API の一部であるクラスです。C++ API の適切なリファレンスはProgrammer's manualです。

于 2012-05-21T06:39:40.360 に答える
3

CPP バックエンド ( llc -march=cpp) を使用して、特定の IR から C++ API へのマッピングを見つけることができます。

更新: cpp バックエンドは利用できなくなりました。

于 2012-05-24T09:37:07.903 に答える