软件工程作业-方舟学习笔记10-Symbol类

今天继续深入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 ";
  }

这是具体的实现之一

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值