Commit 64e6c1e1 authored by Andreas Gruenbacher's avatar Andreas Gruenbacher Committed by Sam Ravnborg

genksyms: track symbol checksum changes

Sometimes it is preferable to avoid changes of exported symbol checksums
(to avoid breaking externally provided modules).  When a checksum change
occurs, it can be hard to figure out what caused this change: underlying
types may have changed, or additional type information may simply have
become available at the point where a symbol is exported.

Add a new --reference option to genksyms which allows it to report why
checksums change, based on the type information dumps it creates with the
--dump-types flag.  Genksyms will read in such a dump from a previous run,
and report which symbols have changed (and why).

The behavior can be controlled for an entire build as follows: If
KBUILD_SYMTYPES is set, genksyms uses --dump-types to produce *.symtypes
dump files.  If any *.symref files exist, those will be used as the
reference to check against.  If KBUILD_PRESERVE is set, checksum changes
will fail the build.
Signed-off-by: default avatarAndreas Gruenbacher <agruen@suse.de>
Cc: Randy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarSam Ravnborg <sam@ravnborg.org>
parent a680eedc
...@@ -153,12 +153,18 @@ $(obj)/%.i: $(src)/%.c FORCE ...@@ -153,12 +153,18 @@ $(obj)/%.i: $(src)/%.c FORCE
quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@ quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@
cmd_cc_symtypes_c = \ cmd_cc_symtypes_c = \
set -e; \
$(CPP) -D__GENKSYMS__ $(c_flags) $< \ $(CPP) -D__GENKSYMS__ $(c_flags) $< \
| $(GENKSYMS) -T $@ >/dev/null; \ | $(GENKSYMS) -T $@ \
-r $(firstword $(wildcard \
$(@:.symtypes=.symref) /dev/null)) \
$(if $(KBUILD_PRESERVE),-p) \
-a $(ARCH) \
>/dev/null; \
test -s $@ || rm -f $@ test -s $@ || rm -f $@
$(obj)/%.symtypes : $(src)/%.c FORCE $(obj)/%.symtypes : $(src)/%.c FORCE
$(call if_changed_dep,cc_symtypes_c) $(call cmd,cc_symtypes_c)
# C (.c) files # C (.c) files
# The C file is compiled and updated dependency information is generated. # The C file is compiled and updated dependency information is generated.
...@@ -187,7 +193,11 @@ cmd_modversions = \ ...@@ -187,7 +193,11 @@ cmd_modversions = \
if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \ if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \
$(CPP) -D__GENKSYMS__ $(c_flags) $< \ $(CPP) -D__GENKSYMS__ $(c_flags) $< \
| $(GENKSYMS) $(if $(KBUILD_SYMTYPES), \ | $(GENKSYMS) $(if $(KBUILD_SYMTYPES), \
-T $(@D)/$(@F:.o=.symtypes)) -a $(ARCH) \ -T $(@:.o=.symtypes)) \
-r $(firstword $(wildcard \
$(@:.o=.symref) /dev/null)) \
$(if $(KBUILD_PRESERVE),-p) \
-a $(ARCH) \
> $(@D)/.tmp_$(@F:.o=.ver); \ > $(@D)/.tmp_$(@F:.o=.ver); \
\ \
$(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \ $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \
......
This diff is collapsed.
...@@ -29,6 +29,10 @@ enum symbol_type { ...@@ -29,6 +29,10 @@ enum symbol_type {
SYM_NORMAL, SYM_TYPEDEF, SYM_ENUM, SYM_STRUCT, SYM_UNION SYM_NORMAL, SYM_TYPEDEF, SYM_ENUM, SYM_STRUCT, SYM_UNION
}; };
enum symbol_status {
STATUS_UNCHANGED, STATUS_DEFINED, STATUS_MODIFIED
};
struct string_list { struct string_list {
struct string_list *next; struct string_list *next;
enum symbol_type tag; enum symbol_type tag;
...@@ -43,6 +47,8 @@ struct symbol { ...@@ -43,6 +47,8 @@ struct symbol {
struct symbol *expansion_trail; struct symbol *expansion_trail;
struct symbol *visited; struct symbol *visited;
int is_extern; int is_extern;
int is_declared;
enum symbol_status status;
}; };
typedef struct string_list **yystype; typedef struct string_list **yystype;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment