bool InternalProfiler::passFilter()

in vm/jitrino/src/codegenerator/ia32/Ia32InternalProfiler.cpp [712:954]


bool InternalProfiler::passFilter(Inst * inst, Filter& filter) {
    if(!filter.isInitialized)
        return false;
    bool res = false;
    if(filter.mnemonic.isInitialized) {
        res = (filter.mnemonic.value == inst->getMnemonic()) || (filter.mnemonic.value == Mnemonic_Null);
        if(filter.mnemonic.isNegative)
            res = !res;

        if(filter.isOR && res)
            return true;
        if(!(filter.isOR || res))
            return false;
    }
    if(filter.operandNumber.isInitialized) {
        res = filter.operandNumber.value == (int)inst->getOpndCount();
        if(filter.operandNumber.isNegative)
            res = !res;

        if(filter.isOR && res)
            return true;
        if(!(filter.isOR || res))
            return false;
    }

    if(filter.operandFilters.size()) {
        for(StlMap<int, OpndFilter>::const_iterator it = filter.operandFilters.begin(); it !=filter.operandFilters.end(); it++) {
            OpndFilter opndFltr = it->second;
            if(!opndFltr.isInitialized)
                continue;
            if(opndFltr.opNum == -1) {
                for(U_32 i = 0; i < inst->getOpndCount(Inst::OpndRole_All) ; i++) {
                    Opnd * opnd = inst->getOpnd(i);
                    res = passOpndFilter(inst, opnd, filter, opndFltr);

                    if(filter.isOR && res)
                        return true;
                    if(!(filter.isOR || res))
                        return false;
                }
            } else if (opndFltr.opNum >= 0) {
                Opnd * opnd = opndFltr.opNum<(int)inst->getOpndCount(Inst::OpndRole_All) ? inst->getOpnd(opndFltr.opNum) : NULL;
                if(!opnd)
                    return false;
                res = passOpndFilter(inst, opnd, filter, opndFltr);

                if(filter.isOR && res)
                    return true;
                if(!(filter.isOR || res))
                    return false;
            } else {
                return false;
            }
        }
    }
    Opnd::RuntimeInfo * rt = NULL;
    if (inst->getMnemonic() == Mnemonic_CALL) {
        rt = inst->getOpnd(((ControlTransferInst*)inst)->getTargetOpndIndex())->getRuntimeInfo();
    }

    if(filter.rtKind.isInitialized) {
        if(!rt)
            return false;
        res = filter.rtKind.value == rt->getKind();
        if(filter.rtKind.isNegative)
            res = !res;

        if(filter.isOR && res)
            return true;
        if(!(filter.isOR || res))
            return false;
    }
    if(filter.rtHelperID.isInitialized) {
        if(!rt)
            return false;
        res = filter.rtHelperID.value == (VM_RT_SUPPORT)(POINTER_SIZE_INT)rt->getValue(0);
        if(filter.rtHelperID.isNegative)
            res = !res;

        if(filter.isOR && res)
            return true;
        if(!(filter.isOR || res))
            return false;
    }
    if(filter.rtIntHelperName.isInitialized) {
        if(!rt)
            return false;
        res = filter.rtIntHelperName.value == (char*)irManager->getInternalHelperInfo((const char*)rt->getValue(0))->pfn;
        if(filter.rtIntHelperName.isNegative)
            res = !res;

        if(filter.isOR && res)
            return true;
        if(!(filter.isOR || res))
            return false;
    }
    if(filter.isNative.isInitialized) {
        if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
            return false;
        res = filter.isNative.value == ((MethodDesc *)rt->getValue(0))->isNative();
        if(filter.isNative.isNegative)
            res = !res;

        if(filter.isOR && res)
            return true;
        if(!(filter.isOR || res))
            return false;
    }
    if(filter.isStatic.isInitialized) {
        if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
            return false;
        res = filter.isStatic.value == ((MethodDesc *)rt->getValue(0))->isStatic();
        if(filter.isStatic.isNegative)
            res = !res;

        if(filter.isOR && res)
            return true;
        if(!(filter.isOR || res))
            return false;
    }
    if(filter.isSynchronized.isInitialized) {
        if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
            return false;
        res = filter.isSynchronized.value == ((MethodDesc *)rt->getValue(0))->isSynchronized();
        if(filter.isSynchronized.isNegative)
            res = !res;

        if(filter.isOR && res)
            return true;
        if(!(filter.isOR || res))
            return false;
    }
    if(filter.isNoInlining.isInitialized) {
        if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
            return false;
        res = filter.isNoInlining.value == ((MethodDesc *)rt->getValue(0))->isNoInlining();
        if(filter.isNoInlining.isNegative)
            res = !res;

        if(filter.isOR && res)
            return true;
        if(!(filter.isOR || res))
            return false;
    }
    if(filter.isInstance.isInitialized) {
        if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
            return false;
        res = filter.isInstance.value == ((MethodDesc *)rt->getValue(0))->isInstance();
        if(filter.isInstance.isNegative)
            res = !res;

        if(filter.isOR && res)
            return true;
        if(!(filter.isOR || res))
            return false;
    }
    if(filter.isFinal.isInitialized) {
        if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
            return false;
        res = filter.isFinal.value == ((MethodDesc *)rt->getValue(0))->isFinal();
        if(filter.isFinal.isNegative)
            res = !res;

        if(filter.isOR && res)
            return true;
        if(!(filter.isOR || res))
            return false;
    }
    if(filter.isVirtual.isInitialized) {
        if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
            return false;
        res = filter.isVirtual.value == ((MethodDesc *)rt->getValue(0))->isVirtual();
        if(filter.isVirtual.isNegative)
            res = !res;

        if(filter.isOR && res)
            return true;
        if(!(filter.isOR || res))
            return false;
    }
    if(filter.isAbstract.isInitialized) {
        if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
            return false;
        res = filter.isAbstract.value == ((MethodDesc *)rt->getValue(0))->isAbstract();
        if(filter.isAbstract.isNegative)
            res = !res;

        if(filter.isOR && res)
            return true;
        if(!(filter.isOR || res))
            return false;
    }
    if(filter.isClassInitializer.isInitialized) {
        if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
            return false;
        res = filter.isClassInitializer.value == ((MethodDesc *)rt->getValue(0))->isClassInitializer();
        if(filter.isClassInitializer.isNegative)
            res = !res;

        if(filter.isOR && res)
            return true;
        if(!(filter.isOR || res))
            return false;
    }
    if(filter.isInstanceInitializer.isInitialized) {
        if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
            return false;
        res = filter.isInstanceInitializer.value == ((MethodDesc *)rt->getValue(0))->isInstanceInitializer();
        if(filter.isInstanceInitializer.isNegative)
            res = !res;

        if(filter.isOR && res)
            return true;
        if(!(filter.isOR || res))
            return false;
    }
    if(filter.isStrict.isInitialized) {
        if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
            return false;
        res = filter.isStrict.value == ((MethodDesc *)rt->getValue(0))->isStrict();
        if(filter.isStrict.isNegative)
            res = !res;

        if(filter.isOR && res)
            return true;
        if(!(filter.isOR || res))
            return false;
    }
    if(filter.isInitLocals.isInitialized) {
        if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
            return false;
        res = filter.isInitLocals.value == false;
        if(filter.isInitLocals.isNegative)
            res = !res;

        if(filter.isOR && res)
            return true;
        if(!(filter.isOR || res))
            return false;
    }

    return filter.isOR ? false : true;
}