We've been using WPP in our drivers for quite some time and have a defined some custom trace macros. These macros work fine as long as I don't enable IFR in the build.. Here is an example of one:
#define WPP_CONTROL_GUIDS \
WPP_DEFINE_CONTROL_GUID( \
MODULENAME, (MODULEGUID), \
\
WPP_DEFINE_BIT(TRACEFLG_ERROR) \
WPP_DEFINE_BIT(TRACEFLG_WARNING) \
WPP_DEFINE_BIT(TRACEFLG_INFORMATION) \
WPP_DEFINE_BIT(TRACEFLG_FUNCTRACE) \
WPP_DEFINE_BIT(TRACEFLG_POWER) \
WPP_DEFINE_BIT(TRACEFLG_RTWDM) \
WPP_DEFINE_BIT(TRACEFLG_WDM) \
WPP_DEFINE_BIT(TRACEFLG_ASIO) \
WPP_DEFINE_BIT(TRACEFLG_RTASIO) \
WPP_DEFINE_BIT(TRACEFLG_PCIEIRQ) \
WPP_DEFINE_BIT(TRACEFLG_PCIEDPC) \
WPP_DEFINE_BIT(TRACEFLG_USBURB) \
WPP_DEFINE_BIT(TRACEFLG_USBIRP) \
WPP_DEFINE_BIT(TRACEFLG_STREAMS) \
WPP_DEFINE_BIT(TRACEFLG_QUEUES) \
WPP_DEFINE_BIT(TRACEFLG_REQUESTS) \
WPP_DEFINE_BIT(TRACEFLG_IOCTL) \
WPP_DEFINE_BIT(TRACEFLG_INTERNALIOCTL) \
WPP_DEFINE_BIT(TRACEFLG_PERFORMANCE) \
WPP_DEFINE_BIT(TRACEFLG_AUDIOCLIENTS) \
WPP_DEFINE_BIT(TRACEFLG_AUDIOCALLBACKS) \
WPP_DEFINE_BIT(TRACEFLG_FCP) \
WPP_DEFINE_BIT(TRACEFLG_DEVNOTIFICATIONS) \
WPP_DEFINE_BIT(TRACEFLG_TDL) \
WPP_DEFINE_BIT(TRACEFLG_RTTDL) \
WPP_DEFINE_BIT(TRACEFLG_PAL) \
WPP_DEFINE_BIT(TRACEFLG_IHELPER) \
WPP_DEFINE_BIT(TRACEFLG_WORKITEMS) \
WPP_DEFINE_BIT(TRACEFLG_HSM) \
)
//begin_wpp config
//USEPREFIX (TraceAssert, "%!STDPREFIX!TRACEASSERT:");
//FUNC TraceAssert{LEVEL=TRACE_LEVEL_ERROR, FLAGS=TRACEFLG_ERROR}(EXP);
//USESUFFIX (TraceAssert, " - (%s) assertion failed",szExp);
//end_wpp
//begin_wpp config
//USEPREFIX (TraceExitIfCondition, "%!STDPREFIX!FAILEXIT:");
//FUNC TraceExitIfCondition{LEVEL=TRACE_LEVEL_ERROR, FLAGS=TRACEFLG_ERROR}(EXP,LABEL,RET);
//USESUFFIX (TraceExitIfCondition, "(%s) failed - exiting ",szExp);
//end_wpp
#define WPP_LEVEL_FLAGS_EXP_LABEL_RET_PRE(lvl,flags,exp,lbl,ret) if ( ( exp ) ) { PCHAR szExp = #exp;
#define WPP_LEVEL_FLAGS_EXP_LABEL_RET_POST(lvl,flags,exp,lbl,ret) ;status = ret; goto lbl;}
#define WPP_LEVEL_FLAGS_EXP_LABEL_RET_ENABLED(lvl,flags,exp,lbl,ret) \
(WPP_LEVEL_ENABLED(flags) && WPP_CONTROL(WPP_BIT_ ## flags).Level >= lvl)
#define WPP_LEVEL_FLAGS_EXP_LABEL_RET_LOGGER(lvl,flags,exp,lbl,ret) \
WPP_LEVEL_LOGGER(flags)
// and hopefully to make IFR happy:
#define WPP_RECORDER_LEVEL_FLAGS_EXP_LABEL_RET_PRE(lvl,flags,exp,lbl,ret) if ( ( exp ) ) { PCHAR szExp = #exp;
#define WPP_RECORDER_LEVEL_FLAGS_EXP_LABEL_RET_POST(lvl,flags,exp,lbl,ret) ;status = ret; goto lbl;}
#define WPP_RECORDER_LEVEL_FLAGS_EXP_LABEL_RET_ENABLED(lvl,flags,exp,lbl,ret) \
(WPP_RECORDER_LEVEL_ENABLED(flags) && WPP_CONTROL(WPP_BIT_ ## flags).Level >= lvl)
#define WPP_RECORDER_LEVEL_FLAGS_EXP_LABEL_RET_LOGGER(lvl,flags,exp,lbl,ret) \
WPP_RECORDER_LEVEL_LOGGER(flags)
It's then used like:
TraceExitIfCondition((0==mStreamConnection.vaOut || 0==mStreamConnection.vaIn), exit, STATUS_FAIL_CHECK);
Which works fine without IFR enable in the build.
However, when building with IFR=Yes, this is happening:
Severity Code Description Project File Line Suppression State
Error C2065 'TRACEFLG_ERROR': undeclared identifier swroot C:\dev\DN\source\driver\AudioFramework\AsioClient.cpp 163
Error C3861 'WPP_RECORDER_LEVEL_FLAGS_EXP_LABEL_RET_FILTER': identifier not found swroot ..\AudioFramework\AsioClient.cpp 163
Error C3861 'WPP_RECORDER_LEVEL_FLAGS_EXP_LABEL_RET_ARGS': identifier not found swroot ..\AudioFramework\AsioClient.cpp 163
Error C2065 'TRACEFLG_ERROR': undeclared identifier swroot ..\AudioFramework\AudioDevice.cpp 105
Error C3861 'WPP_RECORDER_LEVEL_FLAGS_EXP_FILTER': identifier not found swroot ..\AudioFramework\AudioDevice.cpp 105
Error C3861 'WPP_RECORDER_LEVEL_FLAGS_EXP_ARGS': identifier not found swroot ..\AudioFramework\AudioDevice.cpp 105
As I said, this works with no changes so long as IFR isn't enabled.
Any help is greatly appreciated!