genksyms: Track changes to enum constants
authorMichal Marek <mmarek@suse.cz>
Thu, 3 Feb 2011 22:57:09 +0000 (23:57 +0100)
committerMichal Marek <mmarek@suse.cz>
Thu, 17 Mar 2011 14:13:56 +0000 (15:13 +0100)
commite37ddb82500393cb417c3ab0fe0726d9a8652372
tree6ecc94992cb5affad4fe438d9b586a61b803f928
parent01762c4ec5f6f62c550304b9c70e824293cefdd0
genksyms: Track changes to enum constants

Enum constants can be used as array sizes; if the enum itself does not
appear in the symbol expansion, a change in the enum constant will go
unnoticed. Example patch that changes the ABI but does not change the
checksum with current genksyms:

| enum e {
| E1,
| E2,
|+ E3,
| E_MAX
| };
|
| struct s {
| int a[E_MAX];
| }
|
| int f(struct s *s) { ... }
| EXPORT_SYMBOL(f)

Therefore, remember the value of each enum constant and
expand each occurence to <constant> <value>. The value is not actually
computed, but instead an expression in the form
(last explicitly assigned value) + N
is used. This avoids having to parse and semantically understand whole
of C.

Note: The changes won't take effect until the lexer and parser are
rebuilt by the next patch.

Signed-off-by: Michal Marek <mmarek@suse.cz>
Acked-by: Sam Ravnborg <sam@ravnborg.org>
scripts/genksyms/genksyms.c
scripts/genksyms/genksyms.h
scripts/genksyms/lex.l
scripts/genksyms/parse.y