4

这些可能是非常基本的问题..

1) 什么是 LLVM 元数据以及如何在我的程序中使用它?我已经阅读了所有文档,但我不明白如何使用它。

2) 如何在文件中添加我的个人元数据?

提前致谢!

4

2 回答 2

7

最好的信息来源是 2010 年的博客文章,该文章将元数据引入 LLVM IR - LLVM IR中的可扩展元数据。第一段提到动机:

此元数据可用于影响特定于语言的优化传递(例如,C 中基于类型的别名分析)、自定义代码生成器的标记信息,或传递信息以进行链接时间优化。

但实际上,请阅读所有 if 以了解历史细节。

LLVM 中元数据的主要“客户端”当前是debug info。前端(例如 Clang)使用它来标记它生成的带有调试信息的 LLVM IR,这些调试信息将 IR 与它来自的源代码相关联。这个相同的元数据稍后会被代码发射器转换为平台特定的调试信息,例如 DWARF。

于 2013-11-02T16:08:59.693 回答
3

这是一个简单的例子:

  llvm::LLVMContext &Ctx = LLMod.getContext();
  llvm::IntegerType *Int32Ty = llvm::Type::getInt32Ty(Ctx);

  llvm::Metadata *MapleVerElts[] = {
    llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(Int32Ty, 0)),
    llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(Int32Ty, 1)),
  };

  llvm::NamedMDNode *MapleVerMD
      = LLMod.getOrInsertNamedMetadata("maple-as.version");
  MapleVerMD->addOperand(llvm::MDNode::get(Ctx, MapleVerElts));

  const MPLModule::FunctionListType &FuncList = Mod.getFunctionList();

  LLMod.dump();

您可能会得到以下输出:

!maple-as.version = !{!0}

!0 = !{i32 0, i32 1}

也许它会给你一个使用元数据的简单提示^^

于 2019-08-09T09:28:13.743 回答