今天继续深入MapleIR来解析一下Symbol类。主要在src/maple_ir/include/mir_symbol.h和src/maple_ir/src/mir_symbol.cpp中。
class MIRSymbol {
public:
union SymbolType { // a symbol can either be a const or a function or a preg which currently used for formal
MIRConst *konst;
MIRFunction *mirFunc;
MIRPreg *preg; // the MIRSymKind must be kStPreg
};
MIRSymbol() = default;
MIRSymbol(uint32 idx, uint8 scp) : stIdx(scp, idx) {}
~MIRSymbol() = default;
void SetIsTmp(bool temp) {
isTmp = temp;
}
bool GetIsTmp() const {
return isTmp;
}
void SetNeedForwDecl() {
needForwDecl = true;
}
bool IsNeedForwDecl() const {
return needForwDecl;
}
以上面的代码块为例,方舟编译器为了实现插入简单符号,构建了MIRSymbol、MIRSymbolTable和MIRLabelTable等类。
在MIRSymbolTable类中,有以下成员变量
MapleAllocator *mAllocator;
// hash table mapping string index to st index
MapleMap<GStrIdx, StIdx> strIdxToStIdxMap;
// map symbol idx to symbol node
MapleVector<MIRSymbol*> symbolTable;
其中strIdxToStIdxMap,是一个由GStrIdx(字符串名字id)对应到StIdx(符号表id)的map;symbolTable则是一个由MIRSymbol*组成的Vector,就是一个由MIRSymbol构成的符号表。其成员函数主要的操作也是关于符号表的操作,创建符号、获取符号、添加符号、获取符号表大小等。
MIRLabelTable的成员变量主要有:
static constexpr uint32 kDummyLabel = 0;
MapleAllocator *mAllocator;
MapleMap<GStrIdx, LabelIdx> strIdxToLabIdxMap;
MapleVector<GStrIdx> labelTable;
它可以看过是一种特殊的符号表,只不过其内部放的是label相关的内容,而label可以视为一种特殊的符号。所以,其成员变量和成员函数和MIRSymbolTable都很类似,Vector里存储类型不同。
符号表的实现,其中还和之前介绍过的GlobalTables有关联。会用到:GlobalTables::GetStrTable().GetStringFromStrIdxGlobalTables::GetTypeTable().GetTypeFromTyIdxGlobalTables::GetStrTable().GetStringFromStrIdx,通过获取globalTables的gStringTable(StringTable<std::string, GStrIdx>类型),然后根据字符串名字去获取gStringTable中其对应的GStrIdx。GlobalTables::GetTypeTable().GetTypeFromTyIdx,通过获取globalTables的typeTable(TypeTable类型),然后根据tyidx(type的id)获取类型(MIRType*)。
const char *ids = isLocal ? "%" : "$";
PrintIndentation(indent);
if (sKind == kStJavaClass) {
LogInfo::MapleLogger() << "javaclass ";
} else if (sKind == kStJavaInterface) {
LogInfo::MapleLogger() << "javainterface ";
} else if (isTmp) {
LogInfo::MapleLogger() << "tempvar ";
} else {
LogInfo::MapleLogger() << "var ";
}
LogInfo::MapleLogger() << ids << GetName() << " ";
if (GetStorageClass() == kScFstatic) {
LogInfo::MapleLogger() << "fstatic ";
} else if (GetStorageClass() == kScPstatic) {
LogInfo::MapleLogger() << "pstatic ";
} else if (GetStorageClass() == kScExtern) {
LogInfo::MapleLogger() << "extern ";
}
这是具体的实现之一