[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CA+55aFyXFSuyxJrLqixsZ-SBXSOrSJ6Q_oOF04Fd4pzMRbPCEA@mail.gmail.com>
Date: Wed, 21 Mar 2018 12:44:50 -0700
From: Linus Torvalds <torvalds@...ux-foundation.org>
To: Alexei Starovoitov <ast@...com>
Cc: David Miller <davem@...emloft.net>,
Daniel Borkmann <daniel@...earbox.net>,
Peter Zijlstra <peterz@...radead.org>,
Steven Rostedt <rostedt@...dmis.org>,
Network Development <netdev@...r.kernel.org>,
kernel-team <kernel-team@...com>,
Linux API <linux-api@...r.kernel.org>
Subject: Re: [PATCH v2 bpf-next 4/8] tracepoint: compute num_args at build time
On Wed, Mar 21, 2018 at 11:54 AM, Alexei Starovoitov <ast@...com> wrote:
>
> add fancy macro to compute number of arguments passed into tracepoint
> at compile time and store it as part of 'struct tracepoint'.
We should probably do this __COUNT() thing in some generic header, we
just talked last week about another use case entirely.
And wouldn't it be nice to just have some generic infrastructure like this:
/*
* This counts to ten.
*
* Any more than that, and we'd need to take off our shoes
*/
#define __GET_COUNT(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_n,...) _n
#define __COUNT(...) \
__GET_COUNT(__VA_ARGS__,10,9,8,7,6,5,4,3,2,1,0)
#define COUNT(...) __COUNT(dummy,##__VA_ARGS__)
#define __CONCAT(a,b) a##b
#define __CONCATENATE(a,b) __CONCAT(a,b)
and then you can do things like:
#define fn(...) __CONCATENATE(fn,COUNT(__VA_ARGS__))(__VA_ARGS__)
which turns "fn(x,y,z..)" into "fn<N>(x,y,z)".
That can be useful for things like "max(a,b,c,d)" expanding to
"max4()", and then you can just have the trivial
#define max3(a,b,c) max2(a,max2(b.c))
etc (with proper parentheses, of course).
And I'd rather not have that function name concatenation be part of
the counting logic, because we actually may have different ways of
counting, so the concatenation is separate.
In particular, the other situation this came up for, the counting was
in arguments _pairs_, so you'd use a "COUNT_PAIR()" instead of
"COUNT()".
NOTE NOTE NOTE! The above was slightly tested and then cut-and-pasted.
I might have screwed up at any point. Think of it as pseudo-code.
Linus
Powered by blists - more mailing lists