随着大家LLVM IR的学习,不难发现LLVM代码程序的最顶层结构就是Module类。对于一个LLVM模块可能是原始程序的翻译单元,也可能是由链接器合并的几个翻译单元。Module类可以跟踪一系列函数/全局变量和一个符号表,以及描述目标特征可变数据。下面简单学习Module类的代码定义吧。
Module类具体实现细节
-
如何创建Module类呢?
Module类的构造函数相对简单,传入一个Module名字的字符串以及一个llvmcontext。主要对变量ModuleID和SourceFileName完成初始化,把创建好的Module添加到Context中。
Module::Module(StringRef MID, LLVMContext &C)
: Context(C), ValSymTab(std::make_unique<ValueSymbolTable>(-1)),
ModuleID(std::string(MID)), SourceFileName(std::string(MID)), DL("") {
Context.addModule(this);
}
-
跟踪系列函数的部分
定义Function的迭代器,便于快速访问Module类中一系列函数。
/// @}
/// @name Function Iteration
/// @{
iterator begin() { return FunctionList.begin(); }
const_iterator begin() const { return FunctionList.begin(); }
iterator end () { return FunctionList.end(); }
const_iterator end () const { return FunctionList.end(); }
reverse_iterator rbegin() { return FunctionList.rbegin(); }
const_reverse_iterator rbegin() const{ return FunctionList.rbegin(); }
reverse_iterator rend() { return FunctionList.rend(); }
const_reverse_iterator rend() const { return FunctionList.rend(); }
size_t