Using IFR with user-defined WPP macros

Wade Dawson 121 Reputation points
2021-10-21T16:38:26.68+00:00

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!

Windows for business Windows Client for IT Pros Devices and deployment Other
0 comments No comments
{count} votes

1 answer

Sort by: Most helpful
  1. Wade Dawson 121 Reputation points
    2021-10-21T18:40:07.227+00:00

    The answer was to #define the missing macros:

    #define WPP_RECORDER_LEVEL_FLAGS_EXP_LABEL_RET_ARGS(lvl, flags,exp,label,ret) WPP_CONTROL(WPP_BIT_ ## flags).AutoLogContext, lvl, WPP_BIT_ ## flags
    #define WPP_RECORDER_LEVEL_FLAGS_EXP_LABEL_RET_FILTER(lvl, flags,exp,label,ret) (lvl < TRACE_LEVEL_VERBOSE || WPP_CONTROL(WPP_BIT_ ## flags).AutoLogVerboseEnabled)
    
    0 comments No comments

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.