这些可能是非常基本的问题..
1) 什么是 LLVM 元数据以及如何在我的程序中使用它?我已经阅读了所有文档,但我不明白如何使用它。
2) 如何在文件中添加我的个人元数据?
提前致谢!
这些可能是非常基本的问题..
1) 什么是 LLVM 元数据以及如何在我的程序中使用它?我已经阅读了所有文档,但我不明白如何使用它。
2) 如何在文件中添加我的个人元数据?
提前致谢!
最好的信息来源是 2010 年的博客文章,该文章将元数据引入 LLVM IR - LLVM IR中的可扩展元数据。第一段提到动机:
此元数据可用于影响特定于语言的优化传递(例如,C 中基于类型的别名分析)、自定义代码生成器的标记信息,或传递信息以进行链接时间优化。
但实际上,请阅读所有 if 以了解历史细节。
LLVM 中元数据的主要“客户端”当前是debug info。前端(例如 Clang)使用它来标记它生成的带有调试信息的 LLVM IR,这些调试信息将 IR 与它来自的源代码相关联。这个相同的元数据稍后会被代码发射器转换为平台特定的调试信息,例如 DWARF。
这是一个简单的例子:
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}
也许它会给你一个使用元数据的简单提示^^