到底什么是LLVM C++;美国石油学会 我发现很难理解LLVM C++ API。 LLVM C++接口与LLVM IR有什么关系?此外,如何使用LLVM C++ API?P> >(大大)简化,LLVM是编写编译器的C++库。它的C++ API是库的用户用来实现编译器的外部接口。 PL > LLVM IR与LLVM C++ API的一部分之间的对称性,即用于构建IR的部分。这是一个很好的了解这种对称性的资源。例如,您可以编译以下C代码: int factorial(int X) { if (X == 0) return 1; return X*factorial(X-1); }

到底什么是LLVM C++;美国石油学会 我发现很难理解LLVM C++ API。 LLVM C++接口与LLVM IR有什么关系?此外,如何使用LLVM C++ API?P> >(大大)简化,LLVM是编写编译器的C++库。它的C++ API是库的用户用来实现编译器的外部接口。 PL > LLVM IR与LLVM C++ API的一部分之间的对称性,即用于构建IR的部分。这是一个很好的了解这种对称性的资源。例如,您可以编译以下C代码: int factorial(int X) { if (X == 0) return 1; return X*factorial(X-1); },llvm,llvm-c++-api,Llvm,Llvm C++ Api,进入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 i

进入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(我不在这里粘贴,因为输出很长,但是你可以自己试试)。执行此操作时,您将看到,例如,上面IR代码中的

icmp
指令如下所示:

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

<代码> ICMPISTT//COD>是一个类,用于创建<代码> ICMP < /C>指令的C++ API的一部分。C++ API的一个很好的参考是.< /p> ,可以使用CPP后端(<代码> LLC-Malth.CPP < /Cuff>)找出从给定的IR到C++ API的映射。


更新:CPP后端不再可用。

谢谢重播。但你能告诉我何时和如何使用LLVM C++ API吗?@ USER 1406331:我希望你意识到你的问题过于泛泛。为什么要使用LLVM?为了什么?你打算在上面建什么?如果你对这些问题有确切的答案,我认为在花了一些时间阅读LLVM教程和文档后,你会意识到LLVM C++ API可以帮助你,如果你只想生成IR(并且可能运行一些通过它),你最好使用LLVM C绑定,它们很好,干净且简约。至少对于
llc
版本
6.0.0
(通过运行
llc--version
获得),
-march
标志不再使用
cpp
@Matthew yes,遗憾的是,它早就被删除了,因为没有人想维护后端。