如何从 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] 中获取类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在反应节点 js 项目中从客户端创建动态元标记?

HDFS|从mkdirs操作分析NameNode如何管理元数据——内存篇

如何从根源上解决 HDFS 小文件问题

Namenode对所有文件块的元数据存储

在 Kendo 中为 Angular TreeView 获取节点元数据

Namenode的元数据存储