On Fri, Jan 23, 2015 at 08:40:17AM -0800, Christopher Li wrote: > On Thu, Jan 22, 2015 at 12:31 PM, Christian Borntraeger > <borntraeger@xxxxxxxxxx> wrote: > > Linus, Christopher, > > > > Commit 0f25c6a78e08fdc15af5e599d836fa24349c042f ("Add warning about duplicate initializers") has a false positive on arch/s390/kvm/kvm-s390.c > > > > CHECK arch/s390/kvm/kvm-s390.c > > arch/s390/kvm/kvm-s390.c:1823:1: error: symbol '__UNIQUE_ID_alias__COUNTER__' has multiple initializers (originally initialized at arch/s390/kvm/kvm-s390.c:1822) > > Search the "__COUNTER__" macro shows that: > https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html > > __COUNTER__This macro expands to sequential integral values starting > from 0. In conjunction with the ## operator, this provides a > convenient means to generate unique identifiers. Care must be taken to > ensure that __COUNTER__ is not expanded prior to inclusion of > precompiled headers which use it. Otherwise, the precompiled headers > will not be used. > > I think sparse haven't implement the __COUNTER__ macro. That is why it emit the > error on duplicate entry. > > Chris > -- The following patch should fix that. Luc Subject: [PATCH] Teach sparse about the __COUNTER__ predefined macro. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> --- ident-list.h | 1 + pre-process.c | 4 ++++ validation/preprocessor/__COUNTER__.c | 12 ++++++++++++ 3 files changed, 17 insertions(+) create mode 100644 validation/preprocessor/__COUNTER__.c diff --git a/ident-list.h b/ident-list.h index d5a145f8..b65b667d 100644 --- a/ident-list.h +++ b/ident-list.h @@ -108,6 +108,7 @@ __IDENT(__TIME___ident, "__TIME__", 0); __IDENT(__func___ident, "__func__", 0); __IDENT(__FUNCTION___ident, "__FUNCTION__", 0); __IDENT(__PRETTY_FUNCTION___ident, "__PRETTY_FUNCTION__", 0); +__IDENT(__COUNTER___ident, "__COUNTER__", 0); /* Sparse commands */ IDENT_RESERVED(__context__); diff --git a/pre-process.c b/pre-process.c index 1aa3d2c4..316247ac 100644 --- a/pre-process.c +++ b/pre-process.c @@ -181,6 +181,10 @@ static int expand_one_symbol(struct token **list) time(&t); strftime(buffer, 9, "%T", localtime(&t)); replace_with_string(token, buffer); + } else if (token->ident == &__COUNTER___ident) { + static int counter; + + replace_with_integer(token, counter++); } return 1; } diff --git a/validation/preprocessor/__COUNTER__.c b/validation/preprocessor/__COUNTER__.c new file mode 100644 index 00000000..98187ee6 --- /dev/null +++ b/validation/preprocessor/__COUNTER__.c @@ -0,0 +1,12 @@ +__COUNTER__ +__COUNTER__ +/* + * check-name: __COUNTER__ #1 + * check-command: sparse -E $file + * + * check-output-start + +0 +1 + * check-output-end + */ -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html