/******************************************************************************* | |
* 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() ); | |
} | |
} | |
} |