Symbol AddressOf(Symbol p) { if (p->kind == SK_Temp && AsVar(p)->def->op == DEREF) { return AsVar(p)->def->src1; } p->addressed = 1; if (p->kind == SK_Variable) { TrackValueChange(p); } return TryAddValue(T(POINTER), ADDR, p, NULL); }
/* 生成赋值指令 */ void GenerateMove (Type ty, Symbol dst, Symbol src) { IRInst inst; ALLOC(inst); dst->ref++; src->ref++; inst->ty = ty; inst->opcode = MOV; inst->opds[0] = dst; inst->opds[1] = src; inst->opds[2] = NULL; AppendInst (inst); if (dst->kind == SK_Variable) { TrackValueChange (dst); } else if (dst->kind == SK_Temp) { DefineTemp (dst, MOV, (Symbol)inst, NULL); } }