究竟什么是LLVM C++ API

use*_*531 11 llvm llvm-c++-api

我发现很难理解LLVM C++ API.我想问你一下吗?LLVM C++ API和LLVM IR之间有什么关系吗?另外,我想知道如何使用LLVM C++ API?

Eli*_*sky 14

为了(大大)简化,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);
}
Run Code Online (Sandbox Code Playgroud)

进入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
}
Run Code Online (Sandbox Code Playgroud)

以及C++ API调用(我不会在此处粘贴它,因为输出很长,但您可以自己尝试).这样做,您将看到,例如icmp上述IR代码中的指令完成为:

ICmpInst* int1_5 = new ICmpInst(*label_4, ICmpInst::ICMP_EQ, int32_X, const_int32_1, "");
Run Code Online (Sandbox Code Playgroud)

ICmpInst是一个类,它是用于创建icmp指令的C++ API的一部分.程序员手册是C++ API的一个很好的参考.

  • @ user1406531:我希望你意识到你的问题过于笼统.你为什么一直使用LLVM?到底是什么?您打算在此基础上构建什么?如果您对这些问题有确切的答案,我认为在花了一些时间阅读LLVM教程和文档后,您将了解LLVM C++ API如何帮助您 (2认同)