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

时间:2016-08-02 16:20:27

标签: c++ llvm rtti llvm-ir

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

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

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

这是哪个Value的子类?而且,我将来如何回答这些问题呢?我试过了:

  • 使用lldb进行调试。这只能告诉我顶级课程。
  • 访问rtti信息。 LLVM似乎有自己的RTTI系统,它与typeid()不兼容,并且与typeid()不相同。
  • 编译为C ++ API代码,这将告诉我如何创建此值,我可以从中看到类型。但是,llc -march = cpp失败并出现一个模糊的错误(无效的基本类型),而clang -march = cpp表示它不知道这种架构。我确认clang --version和llc --version给出了相同的版本号。
  • 我确认它不是BitCastInst,因为dyn_cast不起作用。

1 个答案:

答案 0 :(得分:1)

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

这是Value的哪个子类?

这是一个constant expression,特别是一个bitcast常量表达式,由ConstantExpr类表示。您可以使用ConstantExpr::getOpcode或使用ConstantExpr::getOpcodeName的字符串表示来获取操作码。

  

bitcast(CST to TYPE)

     

将常量CST转换为另一个TYPE。操作数的约束与bitcast指令的约束相同。

通常,当你看到一些操作码应用于常量操作数时(例如bitcast (void ()* %1 to void(...)*);而glovals vars是常量),你应该首先考虑常量表达式。当constexpr对应物存在时,我真的不认为有一种简单的方法可以使用常量操作数构建真正的IR指令。

  

而且,我将来如何回答这些问题?

您可以像使用llvm::isallvm::dynamic_cast一样使用llc -march=cppfloat。在调试过程中,我发现Value::getValueID非常有用。

  

row失败并出现模糊错误

附注:CPPBackend暂时没有更新,最近已removed。我并不感到惊讶它不起作用。