【发布时间】:2018-03-19 03:09:21
【问题描述】:
现在,我想使用属于 LLVM 3.3 的 LLVM 通行证。在源代码中,他们从 MDNode 获取类型如下:
Type *ElTy = UTBAATag->getOperand(i)->getType();
但是,我收到以下错误:
‘class llvm::Metadata’没有名为‘getType’的成员 输入 *ElTy = UTBAATag->getOperand(i)->getType()
对于 llvm 3.3,UTBAATag->getOperand(i) 返回一个值。然而, 对于 llvm 7.0,UTBAATag->getOperand(i) 返回一个 MDOperand,它可以转换为 MDString。我从 LLVM 语言参考手册中找到以下词语:
"TBAA 类型层次结构的根节点是一个具有 0 个操作数或只有一个 MDString 操作数的 MDNode。 标量类型描述符表示为具有两个操作数的 MDNode 。第一个操作数是表示结构类型名称的 MDString。 LLVM 不会为这个操作数的值赋予意义,它只关心它是一个 MDString。第二个操作数是一个MDNode,它指向所述标量类型描述符的父节点,它要么是另一个标量类型描述符要么是TBAA根。标量类型描述符可以有一个可选的第三个参数,但它必须是常量整数零。”
我们可以像这样得到“结构类型”形式的 MDString:
MDString *NodeName = dyn_cast<MDString>(MD->getOperand(0))
StringRef T = NodeName->getString()
不幸的是,我们得到了“StringRef”类型。 我们如何获得“Tpye”类型?
【问题讨论】:
标签: llvm