LLVM:如何找出使用的是哪种类型?

LLVM: How to find out which type is used?

我有一个llvm::Value。 Value::dump() 打印

void (...)* bitcast (void ()* @test_impl to void (...)*)

通常我会假设这是一个 BitCastOperator,但是,这个 class 似乎不存在于 llvm 3.4.2(我正在使用,因为我正在使用的工具之一没有尚未移植到较新的版本)。

这是 Value 的哪个子class?而且,以后我该如何回答这样的问题呢?我试过了:

void (...)* bitcast (void ()* @test_impl to void (...)*)

Which subclass of Value is this?

这是一个constant expression, specifically a bitcast constant expression, represented by ConstantExprclass。您可以使用 ConstantExpr::getOpcode 获取操作码,或者使用 ConstantExpr::getOpcodeName.

获取其字符串表示形式

bitcast (CST to TYPE)

Convert a constant, CST, to another TYPE. The constraints of the operands are the same as those for the bitcast instruction.

一般来说,当您看到某些操作码应用于常量操作数时(与 bitcast (void ()* %1 to void(...)*) 相反;全局变量是常量),您应该首先想到常量表达式。当存在 constexpr 对应物时,我真的不认为有一种简单的方法可以用常量操作数构建真正的 IR 指令。

And, how can I answer such questions in the future?

您可以像以前一样使用 llvm::isallvm::dynamic_cast。在调试过程中,我发现 Value::getValueID 也很有用。

llc -march=cpp fails with an obscure error

旁注:CPPBackend 有一段时间没有更新了,最近 removed。我一点也不奇怪它没有用。