现在,我想使用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”类型?
答案 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;
}