【问题标题】:How to get type form TBAA metadata node (MDNode) [llvm 7.0]如何从 TBAA 元数据节点 (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”类型?

【问题讨论】:

    标签: llvm


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-24
      • 1970-01-01
      • 2012-10-13
      • 2020-09-28
      • 1970-01-01
      • 1970-01-01
      • 2016-02-26
      • 2020-01-01
      相关资源
      最近更新 更多