【问题标题】:LLVM: How to find out which type is used?LLVM:如何找出使用的是哪种类型?
【发布时间】:2016-08-02 16:20:26
【问题描述】:

我有一个 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 不起作用。

【问题讨论】:

    标签: c++ llvm rtti llvm-ir


    【解决方案1】:
    void (...)* bitcast (void ()* @test_impl to void (...)*)
    

    这是 Value 的哪个子类?

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

    比特广播(CST 到 TYPE)

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

    通常,当您看到某些操作码应用于像这种情况下的常量操作数时(与bitcast (void ()* %1 to void(...)*) 相反;手套变量是常量),您应该首先考虑常量表达式。当存在 constexpr 对应项时,我真的不认为有一种简单的方法可以构建具有常量操作数的真正 IR 指令。

    而且,我以后如何回答这些问题?

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

    llc -march=cpp 失败并出现一个模糊的错误

    旁注:CPPBackend 有一段时间没有更新,最近一直是removed。我并不惊讶它没有工作。

    【讨论】:

      猜你喜欢
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多