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?而且,以后我该如何回答这样的问题呢?我试过了:
- 正在使用 lldb 进行调试。这只能告诉我顶层class.
- 正在访问 rtti 信息。 LLVM 似乎有自己的 RTTI 系统,它与 typeid() 不兼容,没有与 typeid() 的等价物。
- 编译成 C++ API 代码,这会告诉我如何创建这个值,我可以从中看到类型。然而, llc -march=cpp 失败并出现一个模糊的错误(无效的原始类型)并且 clang -march=cpp 说它不知道这个架构。我确认 clang --version 和 llc --version 给出了相同的版本号。
- 我确认它不是 BitCastInst,因为 dyn_cast 不起作用。
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::isa
和 llvm::dynamic_cast
。在调试过程中,我发现 Value::getValueID 也很有用。
llc -march=cpp
fails with an obscure error
旁注:CPPBackend 有一段时间没有更新了,最近 removed。我一点也不奇怪它没有用。
我有一个llvm::Value。 Value::dump() 打印
void (...)* bitcast (void ()* @test_impl to void (...)*)
通常我会假设这是一个 BitCastOperator,但是,这个 class 似乎不存在于 llvm 3.4.2(我正在使用,因为我正在使用的工具之一没有尚未移植到较新的版本)。
这是 Value 的哪个子class?而且,以后我该如何回答这样的问题呢?我试过了:
- 正在使用 lldb 进行调试。这只能告诉我顶层class.
- 正在访问 rtti 信息。 LLVM 似乎有自己的 RTTI 系统,它与 typeid() 不兼容,没有与 typeid() 的等价物。
- 编译成 C++ API 代码,这会告诉我如何创建这个值,我可以从中看到类型。然而, llc -march=cpp 失败并出现一个模糊的错误(无效的原始类型)并且 clang -march=cpp 说它不知道这个架构。我确认 clang --version 和 llc --version 给出了相同的版本号。
- 我确认它不是 BitCastInst,因为 dyn_cast 不起作用。
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::isa
和 llvm::dynamic_cast
。在调试过程中,我发现 Value::getValueID 也很有用。
llc -march=cpp
fails with an obscure error
旁注:CPPBackend 有一段时间没有更新了,最近 removed。我一点也不奇怪它没有用。