blob: c8447263e4bd319bfb80030f5d88e66dd507e5b1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 CEA LIST.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Created on: 11 oct. 2010
*
* Contributors:
* Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
* - Initial API and implementation
******************************************************************************/
#include "ExecutionInformation.h"
#include <fam/api/AbstractProcessorUnit.h>
#include <fam/coverage/FormulaCoverageFilter.h>
#include <fam/hitorjump/AvmHitOrJumpProcessor.h>
#include <fam/testing/OfflineTestProcessor.h>
#include <fml/trace/TracePoint.h>
namespace sep
{
/**
* GETTER - SETTER
* mProcessorRegisterTool
*/
bool GenericInfoData::isInfo(const AbstractProcessorUnit & aProcessor) const
{
return( isInfo(aProcessor.REGISTER_TOOL()) || /*TODO &&*/
isID(aProcessor.getParameterWObject()) );
}
bool GenericInfoData::isInfo(
const AbstractProcessorUnit & aProcessor, const BF & anID) const
{
return( isInfo(aProcessor.REGISTER_TOOL()) && isID(anID) );
}
/**
* Serialization
*/
std::string GenericInfoData::strUID() const
{
return( mID.valid()
? ( mID.isBuiltinString() ? mID.toBuiltinString() : mID.str() )
: "" );
}
void GenericInfoData::toStream(OutStream & out) const
{
out << TAB << "info ";
if ( hasID() )
{
out << "\"" << getID().str() << "\" {" << EOL;
}
if ( hasData() )
{
if( getData().is< ExecutionContextHeader >() )
{
ExecutionContextHeader * ech =
getData().to_ptr< ExecutionContextHeader >();
out << TAB2 << "EC< "
<< "Id:" << ech->getIdNumber() << " , "
<< "Ev:" << ech->getEvalNumber() << " , "
<< "H:" << ech->getHeight() << " , "
<< "W:" << ech->getWidth() << " >;" << EOL;
}
else if( getData().isBuiltinString() )
{
out << TAB2 << getData().toBuiltinString() << EOL;
}
else
{
out << TAB2 << getData().str() << EOL;
}
}
out << TAB << "}" << EOL_FLUSH;
}
void GenericInfoData::toFscn(OutStream & out) const
{
out << TAB << "<ID:";
if ( hasID() )
{
out << "\"";
if( getID().is< AbstractProcessorUnit >() )
{
AbstractProcessorUnit * anAPU =
getID().to_ptr< AbstractProcessorUnit >();
out << anAPU->getParameterWObject()->getFullyQualifiedNameID();
}
else
{
out << getID().str();
}
out << "\"";
}
else
{
out << "\"NULL\"";
}
if ( hasData() )
{
out << ",";
if( getData().is< ExecutionContextHeader >() )
{
ExecutionContextHeader * ech =
getData().to_ptr< ExecutionContextHeader >();
out << "Id=\"" << ech->getIdNumber() << "\", "
<< "Ev=\"" << ech->getEvalNumber() << "\", "
<< "H=\"" << ech->getHeight() << "\", "
<< "W=\"" << ech->getWidth() << "\"";
}
else if( getData().is< String >() )
{
out << "kind=\"" << getData().to_ptr< String >()->getValue()
<< "\"";
}
else if( getData().is< AvmCode >() )
{
out << "avmcode= \"" << getData().str() << "\"";
}
else if( getData().isInteger() )
{
out << "value=\"" << getData().toInteger() << "\"";
}
else if( getData().is< TracePoint >() )
{
out << "hoj=\"" << getData().to_ptr< TracePoint >()->str() << "\"";
}
else
{
out << "kind=\"" << getData()._str() << "\"";
}
}
out << ">" << EOL_FLUSH;
}
/**
* DESTRUCTOR
*/
ExecutionInformation::~ExecutionInformation()
{
sep::destroyElement( mFormulaCoverageFilterInfo );
sep::destroyElement( mHitOrJumpObjectiveInfo );
sep::destroyElement( mOfflineTestProcessorInfo );
}
////////////////////////////////////////////////////////////////////////////////
// GenericInfoData
////////////////////////////////////////////////////////////////////////////////
/**
* APPEND
* mGenericInfos
*/
void ExecutionInformation::addInfo(const AbstractProcessorUnit & aProcessor,
const BF & anID, const BF & aData)
{
mGenericInfos.append( BF( new GenericInfoData(
aProcessor.REGISTER_TOOL(), anID, aData) ) );
}
void ExecutionInformation::addInfo(
const AbstractProcessorUnit & aProcessor, const BF & aData)
{
mGenericInfos.append( BF( new GenericInfoData(aProcessor.REGISTER_TOOL(),
WObjectManager::toBF(aProcessor.getParameterWObject()), aData) ) );
}
/**
* GETTER
* mGenericInfos
*/
GenericInfoData * ExecutionInformation::getInfo(
const IProcessorUnitRegistration & aRegisterTool) const
{
BFList::const_raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::const_raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; ++itInfo )
{
if( itInfo->isInfo(aRegisterTool) )
{
return( itInfo );
}
}
return( NULL );
}
GenericInfoData * ExecutionInformation::getInfo(
const AbstractProcessorUnit & aProcessor) const
{
BFList::const_raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::const_raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; ++itInfo )
{
if( itInfo->isInfo(aProcessor) )
{
return( itInfo );
}
}
return( NULL );
}
GenericInfoData * ExecutionInformation::getInfo(
const AbstractProcessorUnit & aProcessor, const BF & anID) const
{
BFList::const_raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::const_raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; ++itInfo )
{
if( itInfo->isInfo(aProcessor, anID) )
{
return( itInfo );
}
}
return( NULL );
}
GenericInfoData * ExecutionInformation::getInfoWithData(
const AbstractProcessorUnit & aProcessor, const BF & aData) const
{
BFList::const_raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::const_raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; ++itInfo )
{
if( itInfo->isInfo(aProcessor) && itInfo->isData(aData) )
{
return( itInfo );
}
}
return( NULL );
}
GenericInfoData * ExecutionInformation::getInfo(const BF & anID) const
{
BFList::const_raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::const_raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; ++itInfo )
{
if( itInfo->isID(anID) )
{
return( itInfo );
}
}
return( NULL );
}
GenericInfoData * ExecutionInformation::getInfo(Element * anID) const
{
BFList::const_raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::const_raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; ++itInfo )
{
if( itInfo->isID(anID) )
{
return( itInfo );
}
}
return( NULL );
}
GenericInfoData * ExecutionInformation::getInfo(
Element * anID, const BF & aData) const
{
BFList::const_raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::const_raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; ++itInfo )
{
if( itInfo->isID(anID) && itInfo->isData(aData) )
{
return( itInfo );
}
}
return( NULL );
}
GenericInfoData * ExecutionInformation::getInfo(
const std::string & anID, AVM_OPCODE aPredicate) const
{
BFList::const_raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::const_raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; ++itInfo )
{
if( itInfo->isID(anID, aPredicate) )
{
return( itInfo );
}
}
return( NULL );
}
GenericInfoData * ExecutionInformation::getInfoByData(const BF & aData) const
{
BFList::const_raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::const_raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; ++itInfo )
{
if( itInfo->isData(aData) )
{
return( itInfo );
}
}
return( NULL );
}
GenericInfoData * ExecutionInformation::getInfoByData(
const std::string & aData, AVM_OPCODE aPredicate) const
{
BFList::const_raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::const_raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; ++itInfo )
{
if( itInfo->isData(aData, aPredicate) )
{
return( itInfo );
}
}
return( NULL );
}
/**
* REMOVE
* mGenericInfos
*/
void ExecutionInformation::removeInfo(
const IProcessorUnitRegistration & aRegisterTool)
{
BFList::raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; )
{
if( itInfo->isInfo(aRegisterTool) )
{
itInfo = mGenericInfos.erase( itInfo );
}
else
{
++itInfo;
}
}
}
void ExecutionInformation::removeInfo(const AbstractProcessorUnit & aProcessor)
{
BFList::raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; )
{
if( itInfo->isInfo(aProcessor) )
{
itInfo = mGenericInfos.erase( itInfo );
}
else
{
++itInfo;
}
}
}
void ExecutionInformation::removeInfo(const BF & anID)
{
BFList::raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; )
{
if( itInfo->isID(anID) )
{
itInfo = mGenericInfos.erase( itInfo );
}
else
{
++itInfo;
}
}
}
void ExecutionInformation::removeInfo(Element * anID)
{
BFList::raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; )
{
if( itInfo->isID(anID) )
{
itInfo = mGenericInfos.erase( itInfo );
}
else
{
++itInfo;
}
}
}
void ExecutionInformation::removeInfo(
const std::string & anID, AVM_OPCODE aPredicate)
{
BFList::raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; )
{
if( itInfo->isID(anID, aPredicate) )
{
itInfo = mGenericInfos.erase( itInfo );
}
else
{
++itInfo;
}
}
}
void ExecutionInformation::removeInfoByData(const BF & aData)
{
BFList::raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; )
{
if( itInfo->isData(aData) )
{
itInfo = mGenericInfos.erase( itInfo );
}
else
{
++itInfo;
}
}
}
void ExecutionInformation::removeInfoByData(
const std::string & aData, AVM_OPCODE aPredicate)
{
BFList::raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; )
{
if( itInfo->isData(aData, aPredicate) )
{
itInfo = mGenericInfos.erase( itInfo );
}
else
{
++itInfo;
}
}
}
/**
* GETTER
* Info Data
*/
const BF & ExecutionInformation::getInfoData(
const IProcessorUnitRegistration & aRegisterTool) const
{
BFList::const_raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::const_raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; ++itInfo )
{
if( itInfo->isInfo(aRegisterTool) )
{
return( itInfo->getData() );
}
}
return( BF::REF_NULL );
}
const BF & ExecutionInformation::getInfoData(
const AbstractProcessorUnit & aProcessor) const
{
BFList::const_raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::const_raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; ++itInfo )
{
if( itInfo->isInfo(aProcessor) )
{
return( itInfo->getData() );
}
}
return( BF::REF_NULL );
}
const BF & ExecutionInformation::getInfoData(
const AbstractProcessorUnit & aProcessor, const BF & anID) const
{
BFList::const_raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::const_raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; ++itInfo )
{
if( itInfo->isInfo(aProcessor, anID) )
{
return( itInfo->getData() );
}
}
return( BF::REF_NULL );
}
const BF & ExecutionInformation::getInfoData(const BF & anID) const
{
BFList::const_raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::const_raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; ++itInfo )
{
if( itInfo->isID(anID) )
{
return( itInfo->getData() );
}
}
return( BF::REF_NULL );
}
const BF & ExecutionInformation::getInfoData(Element * anID) const
{
BFList::const_raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::const_raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; ++itInfo )
{
if( itInfo->isID(anID) )
{
return( itInfo->getData() );
}
}
return( BF::REF_NULL );
}
/**
* Serialization
*/
void ExecutionInformation::toStreamInfo(OutStream & out) const
{
BFList::const_raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::const_raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; ++itInfo )
{
itInfo->toStream(out);
}
}
void ExecutionInformation::toFscnInfo(OutStream & out) const
{
BFList::const_raw_iterator< GenericInfoData > itInfo = mGenericInfos.begin();
BFList::const_raw_iterator< GenericInfoData > endInfo = mGenericInfos.end();
for( ; itInfo != endInfo ; ++itInfo )
{
itInfo->toFscn(out);
}
}
////////////////////////////////////////////////////////////////////////////////
// FormulaCoverageFilter Information
////////////////////////////////////////////////////////////////////////////////
FormulaCoverageFilterInfo *
ExecutionInformation::getUniqFormulaCoverageFilterInfo()
{
if( mFormulaCoverageFilterInfo == NULL )
{
mFormulaCoverageFilterInfo = new FormulaCoverageFilterInfo();
}
return( mFormulaCoverageFilterInfo );
}
////////////////////////////////////////////////////////////////////////////////
// AvmHitOrJumpObjective Information
////////////////////////////////////////////////////////////////////////////////
HitOrJumpObjectiveInfo * ExecutionInformation::getUniqHitOrJumpObjectiveInfo()
{
if( mHitOrJumpObjectiveInfo == NULL )
{
mHitOrJumpObjectiveInfo = new HitOrJumpObjectiveInfo();
}
return( mHitOrJumpObjectiveInfo );
}
////////////////////////////////////////////////////////////////////////////////
// OfflineTestProcessor Information
////////////////////////////////////////////////////////////////////////////////
OfflineTestProcessorInfo *
ExecutionInformation::getUniqOfflineTestProcessorInfo()
{
if( mOfflineTestProcessorInfo == NULL )
{
mOfflineTestProcessorInfo = new OfflineTestProcessorInfo();
}
return( mOfflineTestProcessorInfo );
}
/**
* Serialization
*/
void ExecutionInformation::toStream(OutStream & out) const
{
toStreamInfo(out);
if( mFormulaCoverageFilterInfo != NULL )
{
mFormulaCoverageFilterInfo->toStream(out);
}
}
void ExecutionInformation::toFscn(OutStream & out) const
{
if( mFormulaCoverageFilterInfo != NULL )
{
mFormulaCoverageFilterInfo->toFscn(out);
}
}
}