• Steven Rostedt (Red Hat)'s avatar
    tracing: Use TRACE_FLAGS macro to keep enums and strings matched · a3418a36
    Steven Rostedt (Red Hat) authored
    Use a cute little macro trick to keep the names of the trace flags file
    guaranteed to match the corresponding masks.
    
    The macro TRACE_FLAGS is defined as a serious of enum names followed by
    the string name of the file that matches it. For example:
    
     #define TRACE_FLAGS						\
    		C(PRINT_PARENT,		"print-parent"),	\
    		C(SYM_OFFSET,		"sym-offset"),		\
    		C(SYM_ADDR,		"sym-addr"),		\
    		C(VERBOSE,		"verbose"),
    
    Now we can define the following:
    
     #undef C
     #define C(a, b) TRACE_ITER_##a##_BIT
     enum trace_iterator_bits { TRACE_FLAGS };
    
    The above creates:
    
     enum trace_iterator_bits {
    	TRACE_ITER_PRINT_PARENT_BIT,
    	TRACE_ITER_SYM_OFFSET_BIT,
    	TRACE_ITER_SYM_ADDR_BIT,
    	TRACE_ITER_VERBOSE_BIT,
     };
    
    Then we can redefine C as:
    
     #undef C
     #define C(a, b) TRACE_ITER_##a = (1 << TRACE_ITER_##a##_BIT)
     enum trace_iterator_flags { TRACE_FLAGS };
    
    Which creates:
    
     enum trace_iterator_flags {
    	TRACE_ITER_PRINT_PARENT	= (1 << TRACE_ITER_PRINT_PARENT_BIT),
    	TRACE_ITER_SYM_OFFSET	= (1 << TRACE_ITER_SYM_OFFSET_BIT),
    	TRACE_ITER_SYM_ADDR	= (1 << TRACE_ITER_SYM_ADDR_BIT),
    	TRACE_ITER_VERBOSE	= (1 << TRACE_ITER_VERBOSE_BIT),
     };
    
    Then finally we can create the list of file names:
    
     #undef C
     #define C(a, b) b
     static const char *trace_options[] = {
    	TRACE_FLAGS
    	NULL
     };
    
    Which creates:
     static const char *trace_options[] = {
    	"print-parent",
    	"sym-offset",
    	"sym-addr",
    	"verbose",
    	NULL
     };
    
    The importance of this is that the strings match the bit index.
    
    	trace_options[TRACE_ITER_SYM_ADDR_BIT] == "sym-addr"
    Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
    a3418a36
trace.c 170 KB