blob: d874b4828c49f1c1b908db71f829f3d14d41e3fe [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 févr. 2009
*
* Contributors:
* Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
* - Initial API and implementation
******************************************************************************/
#include "avm_debug.h"
#include <util/avm_string.h>
namespace sep {
/**
***************************************************************************
* AVM DEBUG LEVEL
***************************************************************************
*/
unsigned short _AVM_DEBUG_LEVEL_ = AVM_DEBUG_ZERO_LEVEL;
/**
***************************************************************************
* AVM DEBUG KIND
***************************************************************************
*/
std::size_t _AVM_DEBUG_FLAG_ = AVM_DEBUG_NOTHING_FLAG;
/**
* avm_setDebugLevel
* avm_unsetDebugLevel
*/
void avm_setDebugLevel(std::string strDebugLevel)
{
#define SET_DEBUG_LEVEL( level ) \
else if( strDebugLevel == #level ) AVM_DEBUG_SET_LEVEL( level )
StringTools::toupper(strDebugLevel);
if( strDebugLevel.empty() ) AVM_DEBUG_SET_LEVEL( ZERO )
SET_DEBUG_LEVEL( ZERO )
SET_DEBUG_LEVEL( LOW )
SET_DEBUG_LEVEL( MEDIUM )
SET_DEBUG_LEVEL( HIGH )
SET_DEBUG_LEVEL( ULTRA )
SET_DEBUG_LEVEL( GOD_MODE )
else AVM_DEBUG_SET_LEVEL( ZERO )
}
void avm_unsetDebugLevel(std::string strDebugLevel)
{
#define UNSET_DEBUG_EXCEPT_LEVEL( level ) \
else if( strDebugLevel == #level ) AVM_DEBUG_SET_LEVEL( ZERO )
#define UNSET_DEBUG_LEVEL( level ) \
else if( strDebugLevel == #level ) AVM_DEBUG_UNSET_LEVEL( level )
StringTools::toupper(strDebugLevel);
if( strDebugLevel.empty() ) AVM_DEBUG_SET_LEVEL( ZERO )
UNSET_DEBUG_LEVEL( LOW )
UNSET_DEBUG_LEVEL( MEDIUM )
UNSET_DEBUG_LEVEL( HIGH )
UNSET_DEBUG_LEVEL( ULTRA )
UNSET_DEBUG_EXCEPT_LEVEL( ZERO )
UNSET_DEBUG_EXCEPT_LEVEL( GOD_MODE )
else AVM_DEBUG_SET_LEVEL( ZERO )
}
std::string avm_strDebugLevel()
{
#define PRINT_DEBUG_LEVEL( level ) \
case AVM_DEBUG_##level##_LEVEL : return( #level );
switch( _AVM_DEBUG_LEVEL_ )
{
PRINT_DEBUG_LEVEL( ZERO )
PRINT_DEBUG_LEVEL( LOW )
PRINT_DEBUG_LEVEL( MEDIUM )
PRINT_DEBUG_LEVEL( HIGH )
PRINT_DEBUG_LEVEL( ULTRA )
PRINT_DEBUG_LEVEL( GOD_MODE )
default: return( "DEBUG#LEVEL< UNKNOWN >" );
}
}
/**
* avm_setDebugFlag
* avm_unsetDebugFlag
*/
void avm_setDebugFlag(std::string strDebugFlag)
{
#define SET_DEBUG_FLAG( flag ) \
else if( strDebugFlag == #flag ) AVM_DEBUG_ENABLE_FLAG( flag )
if( _AVM_DEBUG_FLAG_ == AVM_DEBUG_ALL_FLAG )
{
return;
}
else if( strDebugFlag.empty() || strDebugFlag == "NOTHING" ) {
_AVM_DEBUG_FLAG_ = AVM_DEBUG_NOTHING_FLAG;
}
// General Context
SET_DEBUG_FLAG( PARSING )
SET_DEBUG_FLAG( CONFIGURING )
SET_DEBUG_FLAG( COMPILING )
SET_DEBUG_FLAG( LOADING )
SET_DEBUG_FLAG( COMPUTING )
SET_DEBUG_FLAG( REPORTING )
SET_DEBUG_FLAG( SOLVING )
SET_DEBUG_FLAG( SAT_SOLVING )
SET_DEBUG_FLAG( SMT_SOLVING )
SET_DEBUG_FLAG( PROFILING )
// Process Stage: Processing, Filtering, ...
SET_DEBUG_FLAG( ALL_PROCESS_STAGE )
SET_DEBUG_FLAG( PROCESSOR )
SET_DEBUG_FLAG( PROCESSING )
SET_DEBUG_FLAG( PRE_PROCESSING )
SET_DEBUG_FLAG( POST_PROCESSING )
SET_DEBUG_FLAG( FILTERING )
SET_DEBUG_FLAG( PRE_FILTERING )
SET_DEBUG_FLAG( POST_FILTERING )
SET_DEBUG_FLAG( QUEUE )
SET_DEBUG_FLAG( QUEUING )
// Statement Evaluation
SET_DEBUG_FLAG( PROGRAM )
SET_DEBUG_FLAG( STATEMENT )
SET_DEBUG_FLAG( ASSIGNMENT )
SET_DEBUG_FLAG( STATEMENT_ASSIGNMENT )
SET_DEBUG_FLAG( COMMUNICATION )
SET_DEBUG_FLAG( STATEMENT_COMMUNICATION )
SET_DEBUG_FLAG( STATEMENT_CONTROL )
SET_DEBUG_FLAG( STATEMENT_SCHEDULING )
SET_DEBUG_FLAG( TEST_DECISION )
SET_DEBUG_FLAG( STATEMENT_TEST_DECISION )
SET_DEBUG_FLAG( BYTECODE )
SET_DEBUG_FLAG( DATA )
SET_DEBUG_FLAG( TRACE )
// Element: Property, Signal...
SET_DEBUG_FLAG( VARIABLE )
SET_DEBUG_FLAG( BUFFER )
SET_DEBUG_FLAG( PORT )
SET_DEBUG_FLAG( SIGNAL )
SET_DEBUG_FLAG( CONNEXION )
SET_DEBUG_FLAG( TIME )
// Executable Component...
SET_DEBUG_FLAG( EXECUTABLE )
SET_DEBUG_FLAG( PRIMITIVE )
SET_DEBUG_FLAG( ACTIVITY )
SET_DEBUG_FLAG( ROUTINE )
SET_DEBUG_FLAG( TRANSITION )
SET_DEBUG_FLAG( MACHINE )
SET_DEBUG_FLAG( STATEMACHINE )
// Others: [Qualified]NameID, RefCount, ...
SET_DEBUG_FLAG( NAME_ID )
SET_DEBUG_FLAG( QUALIFIED_NAME_ID )
SET_DEBUG_FLAG( FULLY_QUALIFIED_NAME_ID )
SET_DEBUG_FLAG( CAS )
SET_DEBUG_FLAG( REDUNDANCE )
SET_DEBUG_FLAG( REFERENCE_COUNTING )
// God Mode
SET_DEBUG_FLAG( ALL )
SET_DEBUG_FLAG( GOD_MODE )
}
void avm_unsetDebugFlag(std::string strDebugFlag)
{
#define UNSET_DEBUG_FLAG( flag ) \
else if( strDebugFlag == #flag ) AVM_DEBUG_DISABLE_FLAG( flag )
if( _AVM_DEBUG_FLAG_ == AVM_DEBUG_NOTHING_FLAG )
{
return;
}
else if( strDebugFlag.empty()
|| strDebugFlag == "NOTHING" ) {
_AVM_DEBUG_FLAG_ = AVM_DEBUG_NOTHING_FLAG;
return;
}
// General Context
UNSET_DEBUG_FLAG( PARSING )
UNSET_DEBUG_FLAG( CONFIGURING )
UNSET_DEBUG_FLAG( COMPILING )
UNSET_DEBUG_FLAG( LOADING )
UNSET_DEBUG_FLAG( COMPUTING )
UNSET_DEBUG_FLAG( REPORTING )
UNSET_DEBUG_FLAG( SOLVING )
UNSET_DEBUG_FLAG( SAT_SOLVING )
UNSET_DEBUG_FLAG( SMT_SOLVING )
UNSET_DEBUG_FLAG( PROFILING )
// Process Stage: Processing, Filtering, ...
UNSET_DEBUG_FLAG( ALL_PROCESS_STAGE )
UNSET_DEBUG_FLAG( PROCESSOR )
UNSET_DEBUG_FLAG( PROCESSING )
UNSET_DEBUG_FLAG( PRE_PROCESSING )
UNSET_DEBUG_FLAG( POST_PROCESSING )
UNSET_DEBUG_FLAG( FILTERING )
UNSET_DEBUG_FLAG( PRE_FILTERING )
UNSET_DEBUG_FLAG( POST_FILTERING )
UNSET_DEBUG_FLAG( QUEUE )
UNSET_DEBUG_FLAG( QUEUING )
// Statement Evaluation
UNSET_DEBUG_FLAG( PROGRAM )
UNSET_DEBUG_FLAG( STATEMENT )
UNSET_DEBUG_FLAG( ASSIGNMENT )
UNSET_DEBUG_FLAG( STATEMENT_ASSIGNMENT )
UNSET_DEBUG_FLAG( COMMUNICATION )
UNSET_DEBUG_FLAG( STATEMENT_COMMUNICATION )
UNSET_DEBUG_FLAG( STATEMENT_CONTROL )
UNSET_DEBUG_FLAG( STATEMENT_SCHEDULING )
UNSET_DEBUG_FLAG( TEST_DECISION )
UNSET_DEBUG_FLAG( STATEMENT_TEST_DECISION )
UNSET_DEBUG_FLAG( BYTECODE )
UNSET_DEBUG_FLAG( DATA )
UNSET_DEBUG_FLAG( TRACE )
// Element: Property, Signal...
UNSET_DEBUG_FLAG( VARIABLE )
UNSET_DEBUG_FLAG( BUFFER )
UNSET_DEBUG_FLAG( PORT )
UNSET_DEBUG_FLAG( SIGNAL )
UNSET_DEBUG_FLAG( CONNEXION )
UNSET_DEBUG_FLAG( TIME )
// Executable Component...
UNSET_DEBUG_FLAG( EXECUTABLE )
UNSET_DEBUG_FLAG( PRIMITIVE )
UNSET_DEBUG_FLAG( ACTIVITY )
UNSET_DEBUG_FLAG( ROUTINE )
UNSET_DEBUG_FLAG( TRANSITION )
UNSET_DEBUG_FLAG( MACHINE )
UNSET_DEBUG_FLAG( STATEMACHINE )
// Others: [Qualified]NameID, RefCount, ...
UNSET_DEBUG_FLAG( NAME_ID )
UNSET_DEBUG_FLAG( QUALIFIED_NAME_ID )
UNSET_DEBUG_FLAG( FULLY_QUALIFIED_NAME_ID )
UNSET_DEBUG_FLAG( CAS )
UNSET_DEBUG_FLAG( REDUNDANCE )
UNSET_DEBUG_FLAG( REFERENCE_COUNTING )
// God Mode
UNSET_DEBUG_FLAG( ALL )
UNSET_DEBUG_FLAG( GOD_MODE )
}
std::string avm_strDebugFlag(const std::string & sep)
{
if( _AVM_DEBUG_FLAG_ == AVM_DEBUG_NOTHING_FLAG )
{
return( "NOTHING" );
}
if( _AVM_DEBUG_FLAG_ == AVM_DEBUG_GOD_MODE_FLAG )
{
return( "GOD_MODE" );
}
if( _AVM_DEBUG_FLAG_ == AVM_DEBUG_ALL_FLAG )
{
return( "ALL" );
}
else
{
std::ostringstream oss;
bool needSep = false;
#define STR_DEBUG_FLAG( flag ) \
if( AVM_DEBUG_FLAG_ENABLED( flag ) ) \
{ oss << (needSep ? sep : "") << #flag; needSep = true; }
#define STR_DEBUG_GROUP( flag ) \
if( AVM_DEBUG_FLAG_GROUP_ENABLED( flag ) ) \
{ oss << (needSep ? sep : "") << #flag; needSep = true; }
// General Context
STR_DEBUG_FLAG( PARSING )
STR_DEBUG_FLAG( CONFIGURING )
STR_DEBUG_FLAG( COMPILING )
STR_DEBUG_FLAG( LOADING )
STR_DEBUG_FLAG( COMPUTING )
STR_DEBUG_FLAG( REPORTING )
STR_DEBUG_FLAG( SOLVING )
// STR_DEBUG_FLAG( SAT_SOLVING )
// STR_DEBUG_FLAG( SMT_SOLVING )
STR_DEBUG_FLAG( PROFILING )
// Process Stage: Processing, Filtering, ... ...
STR_DEBUG_FLAG( ALL_PROCESS_STAGE )
STR_DEBUG_FLAG( QUEUE )
STR_DEBUG_FLAG( QUEUING )
// Statement Evaluation
STR_DEBUG_FLAG( PROGRAM )
STR_DEBUG_FLAG( STATEMENT )
STR_DEBUG_FLAG( ASSIGNMENT )
// STR_DEBUG_FLAG( STATEMENT_ASSIGNMENT )
STR_DEBUG_FLAG( COMMUNICATION )
// STR_DEBUG_FLAG( STATEMENT_COMMUNICATION )
STR_DEBUG_FLAG( STATEMENT_CONTROL )
STR_DEBUG_FLAG( STATEMENT_SCHEDULING )
STR_DEBUG_FLAG( TEST_DECISION )
// STR_DEBUG_FLAG( STATEMENT_TEST_DECISION )
STR_DEBUG_FLAG( BYTECODE )
STR_DEBUG_FLAG( DATA )
STR_DEBUG_FLAG( TRACE )
// Element: Property, Signal...
STR_DEBUG_FLAG( VARIABLE )
STR_DEBUG_FLAG( BUFFER )
STR_DEBUG_FLAG( PORT )
STR_DEBUG_FLAG( SIGNAL )
STR_DEBUG_FLAG( CONNEXION )
STR_DEBUG_FLAG( TIME )
// Executable Component...
STR_DEBUG_FLAG( EXECUTABLE )
STR_DEBUG_FLAG( PRIMITIVE )
STR_DEBUG_FLAG( ACTIVITY )
STR_DEBUG_FLAG( ROUTINE )
STR_DEBUG_FLAG( TRANSITION )
STR_DEBUG_FLAG( MACHINE )
STR_DEBUG_FLAG( STATEMACHINE )
// Others: [Qualified]NameID, RefCount, ...
STR_DEBUG_FLAG( NAME_ID )
STR_DEBUG_FLAG( QUALIFIED_NAME_ID )
STR_DEBUG_FLAG( FULLY_QUALIFIED_NAME_ID )
STR_DEBUG_FLAG( CAS )
STR_DEBUG_FLAG( REDUNDANCE )
STR_DEBUG_FLAG( REFERENCE_COUNTING )
// ... Process Stage: Processing, Filtering, ...
else
{
STR_DEBUG_GROUP( PROCESSING )
else
{
STR_DEBUG_FLAG( PRE_PROCESSING )
STR_DEBUG_FLAG( POST_PROCESSING )
}
STR_DEBUG_GROUP( FILTERING )
else
{
STR_DEBUG_FLAG( PRE_FILTERING )
STR_DEBUG_FLAG( POST_FILTERING )
}
}
return( oss.str() );
}
}
}