如何获取类型表单TBAA元数据节点(MDNode)[llvm 7.0]

时间:2018-03-19 03:09:21

标签: llvm

现在,我想使用LLVM传递,它属于LLVM 3.3。在源代码中,他们从MDNode获取类型如下:

Type *ElTy = UTBAATag->getOperand(i)->getType();

但是,我收到以下错误:

'class llvm :: Metadata'没有名为'getType'的成员          输入* ElTy = UTBAATag-> getOperand(i) - > getType()

对于llvm 3.3,UTBAATag-> getOperand(i)返回一个Value。然而, 对于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”类型?

1 个答案:

答案 0 :(得分:0)

最后,我发现函数MetadataAsValue :: get是有意义的。以下是一个例子:

NamedMDNode *UTBAA = M.getNamedMetadata("clang.tbaa.unions");
for (size_t i = 0, e = UTBAA->getNumOperands(); i != e; ++i) {
  MDNode *MD = UTBAA->getOperand(i);
  MDNode *TBAATag = dyn_cast_or_null<MDNode>(MD->getOperand(1));
  Value *ValType = dyn_cast<Value>(MetadataAsValue::get(MD->getContext(), MD->getOperand(0))); 
  UnionsTBAA[cast<StructType>(ValType->getType())] = TBAATag;
}