如何从 TBAA 元数据节点 (MDNode) [llvm 7.0] 中获取类型
Posted
技术标签:
【中文标题】如何从 TBAA 元数据节点 (MDNode) [llvm 7.0] 中获取类型【英文标题】:How to get type form TBAA metadata node (MDNode) [llvm 7.0] 【发布时间】: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”类型?
【问题讨论】:
【参考方案1】:最后,我发现 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;
【讨论】:
以上是关于如何从 TBAA 元数据节点 (MDNode) [llvm 7.0] 中获取类型的主要内容,如果未能解决你的问题,请参考以下文章
HDFS|从mkdirs操作分析NameNode如何管理元数据——内存篇