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

标签 metadata llvm

我想使用全局元数据为模块中的基本 block 分配唯一的 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->getName())

最佳答案

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

  1. 常量,包括全局值的地址。
  2. MDNode
  3. MDStrings。

如果您想使用函数本地的东西 - 例如指令、参数或(在您的情况下)基本 block ,您需要使用本地元数据。使用 true 作为最后一个参数来创建一个。

关于metadata - llvm 全局元数据的操作数无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26158055/

相关文章:

python - 如何让networkx shortest_path() 支持自定义权重函数?

postgresql - 如何查找 EnterpriseDB 中加载了哪些语言?

c++ - 为 iOS 成功构建后没有 libclang.a?

llvm - 找不到 lffi - 与 llvm 库链接时出错

c++ - LLVM 异常;捕获处理程序未处理,未调用清理

javascript - 使用JavaScript(Electron/node.js)检查文件中是否已经存在一行

javascript - 如何获取 javascript、css、图像等网页资源的大小

metadata - Schema.org 开放时间(多次关闭)和关闭日期

c - 为什么 LLVM 不使用 Xcode 编译 pch 文件中类型定义的 C block ?

objective-c - -forwardInvocation 适用于 Clang - LLVM 但不适用于 GCC