llvm全局元数据的操作数无效

时间:2014-10-02 09:32:53

标签: metadata llvm

我想使用全局元数据为模块中的基本块分配唯一ID。但是我收到了一个错误:" 全局元数据的操作数无效!"。以下代码段中的任何问题?

以下是我添加命名元数据节点的操作数的代码的一部分:

bool runOnModule(Module &M) {
    ...
    NamedMDNode *NMD = M.getOrInsertNamedMetadata(mdKindName);
    for (Module::iterator FI = M.begin(), FE = M.end(); FI != FE; ++FI) {
        for (Function::iterator BI = FI->begin(), BE = FI->end(); BI != BE; ++BI) {
            errs() << "Basic Block number: " << counter << "\n";
            NMD->addOperand(assignID(BI, ++counter));
            errs() << "Basic Block name: " << BI->getName() << "\n";
        }
    }
    ...
}

// Assign unique IDs to Basic Blocks as Metadata Nodes
MDNode* assignID (BasicBlock* BB, unsigned id) {
    // Fetch the context in which the enclosing module was defined
    LLVMContext &Context = BB->getParent()->getParent()->getContext();

    // Create a metadata node that contains ID as a constant:
    Value* ID[2];
    ID[0] = BB;
    ID[1] = ConstantInt::get(Type::getInt32Ty(Context), id);
    return MDNode::getWhenValsUnresolved(Context, ArrayRef<Value*>(ID, 2), false);
}

llvm的版本是3.6.0。 我正在将visual studio 2013用于我的项目。

谢谢, 亨利

解决方案:ID [0]应该存储MDString :: get(Context,BB-&gt; getName())

1 个答案:

答案 0 :(得分:2)

通过传递false作为getWhenValsUnresolved的最后一个参数,您已创建了一个全局元数据节点。全局元数据可能只包含:

  1. 常量,包括全局值的地址。
  2. MDNode秒。
  3. MDString秒。
  4. 如果你想使用功能本地的东西 - 比如指令,参数或(在你的情况下)基本块,你需要使用本地元数据。使用true作为最后一个参数创建一个。