예제 #1
0
void
IdentifierInfo::DoRegLookup(const Arch& arch,
                            SourceLocation source,
                            DiagnosticsEngine& diags)
{
    if (m_flags & DID_REG_LOOKUP)
        return;
    ++num_reg_lookup;
    m_flags &= ~(IS_REGISTER | IS_REGGROUP | IS_SEGREG | IS_TARGETMOD);
    Arch::RegTmod regtmod = arch.ParseCheckRegTmod(getName(), source, diags);
    switch (regtmod.getType())
    {
        case Arch::RegTmod::REG:
            ++num_reg_lookup_reg;
            m_reg = const_cast<Register*>(regtmod.getReg());
            m_flags |= IS_REGISTER;
            break;
        case Arch::RegTmod::REGGROUP:
            ++num_reg_lookup_reggroup;
            m_reg = const_cast<RegisterGroup*>(regtmod.getRegGroup());
            m_flags |= IS_REGGROUP;
            break;
        case Arch::RegTmod::SEGREG:
            ++num_reg_lookup_segreg;
            m_reg = const_cast<SegmentRegister*>(regtmod.getSegReg());
            m_flags |= IS_SEGREG;
            break;
        case Arch::RegTmod::TARGETMOD:
            ++num_reg_lookup_targetmod;
            m_reg = const_cast<TargetModifier*>(regtmod.getTargetMod());
            m_flags |= IS_TARGETMOD;
            break;
        default:
            ++num_reg_lookup_none;
            break;
    }
    m_flags |= DID_REG_LOOKUP;
}