方舟编译器_10

2021SC@SDUSC
对GlobalTables做一个简单的分析。

1、GlobalTables定义和实现在src/maple_ir/include/global_tables.h和src/maple_ir/src/global_tables.cpp之中。

2、GlobalTables的成员函数主要是从GlobalTables::globalTables获取自己需要的数据,具体代码如下:

static StringTable<std::string, GStrIdx> &GetStrTable() {
return globalTables.gStringTable;
}

static StringTable<std::string, UStrIdx> &GetUStrTable() {
return globalTables.uStrTable;
}

static StringTable<std::u16string, U16StrIdx> &GetU16StrTable() {
return globalTables.u16StringTable;
}

static TypeTable &GetTypeTable() {
return globalTables.typeTable;
}

static FPConstTable &GetFpConstTable() {
return *(globalTables.fpConstTablePtr);
}

static STypeNameTable &GetTypeNameTable() {
return globalTables.typeNameTable;
}

static FunctionTable &GetFunctionTable() {
return globalTables.functionTable;
}

static GSymbolTable &GetGsymTable() {
return globalTables.gSymbolTable;
}

static ConstPool &GetConstPool() {
return globalTables.constPool;
}
3、globalTables是GlobalTables的一个静态成员变量,其定义如下:

static GlobalTables globalTables;

所以,才会出现

void KlassHierarchy::AddKlasses() {
for (MIRType *type : GlobalTables::GetTypeTable().GetTypeTable()) {
这样的引用。直接通过GlobalTables::GetTypeTable()获取globalTables.typeTable:

static TypeTable &GetTypeTable() {
return globalTables.typeTable;
}
而globalTables.typeTable是 TypeTable类型的。TypeTable和GlobalTables定义在同个文件,其GetTypeTable的实现如下:

std::vector<MIRType*> &GetTypeTable() {
return typeTable;
}
所以, GlobalTables::GetTypeTable().GetTypeTable()最终返回了std::vector<MIRType*>,这也就解释了AddKlasses中的使用方式。

4、GlobalTables的成员变量主要有以下这些:

TypeTable typeTable;
STypeNameTable typeNameTable;
FunctionTable functionTable;
GSymbolTable gSymbolTable;
ConstPool constPool;
std::unique_ptr fpConstTablePtr;
StringTable<std::string, GStrIdx> gStringTable;
StringTable<std::string, UStrIdx> uStrTable;
StringTable<std::u16string, U16StrIdx> u16StringTable;
static GlobalTables globalTables;
这里涉及到的TypeTable、STypeNameTable、FunctionTable、GSymbolTable 和ConstPool 类,都是在GlobalTables的同个文件中定义的。

5、TypeTable 类中比较重要的是它的成员变量:

std::vector<MIRType*> typeTable;
它内部的成员函数,也多是围绕该成员变量的操作。

6、STypeNameTable类主要是用来存储类和接口类型。其重要的成员变量是:

std::unordered_map<GStrIdx, TyIdx, GStrIdxHash> gStrIdxToTyIdxMap;
7、FunctionTable是一个用来存储MIRFunction的类。其重要的成员变量是:

std::vector<MIRFunction*> funcTable; // index is PUIdx
8、GSymbolTable 是一个用来存储MIRSymbol的类。其重要的成员变量是:

// hash table mapping string index to st index
std::unordered_map<GStrIdx, StIdx, GStrIdxHash> strIdxToStIdxMap;
std::vector<MIRSymbol*> symbolTable; // map symbol idx to symbol node
9、ConstPool类主要是用来存储MIRConst的类。其重要的成员变量是:

protected:
std::unordered_map<GStrIdx, MIRConst*, GStrIdxHash> constMap;
std::set importedLiteralNames;

private:
std::unordered_map<std::u16string, MIRSymbol*> constU16StringPool;
参考自:小乖他爹

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值