Michal Marek 8ed77e
From: Andreas Gruenbacher <agruen@suse.de>
Michal Marek 8ed77e
Subject: genksyms: add --override flag
Michal Kubecek 515f42
Patch-mainline: Not yet, <jeffm: asked msuchanek to submit, Oct 4, 2017>
Michal Kubecek b493de
References: none
Michal Marek 8ed77e
Michal Marek 8ed77e
Add --override flag to genksyms to allow overriding types with old
Michal Marek 8ed77e
definitions using the 'override' keyword. This is similar to -p --preserve,
Michal Marek 8ed77e
but it doesn't abort the build if a symtype cannot be preserved
Michal Marek 8ed77e
Michal Marek 8ed77e
[mmarek: added KBUILD_OVERRIDE env var to set this globally for the entire
Michal Marek 8ed77e
 build]
Michal Marek 8ed77e
---
Michal Kubecek 549a5b
 scripts/Makefile.build      |  1 +
Michal Kubecek 549a5b
 scripts/genksyms/genksyms.c | 21 +++++++++++++++------
Jeff Mahoney 455827
 2 files changed, 16 insertions(+), 6 deletions(-)
Michal Marek 8ed77e
Jeff Mahoney 455827
--- a/scripts/Makefile.build
Jeff Mahoney 455827
+++ b/scripts/Makefile.build
Michal Kubecek 515f42
@@ -129,6 +129,7 @@ $(obj)/%.i: $(src)/%.c FORCE
Michal Kubecek 515f42
 genksyms = scripts/genksyms/genksyms		\
Michal Kubecek 515f42
 	$(if $(1), -T $(2))			\
Michal Kubecek 515f42
 	$(if $(KBUILD_PRESERVE), -p)		\
Michal Kubecek 515f42
+	$(if $(KBUILD_OVERRIDE),-o)		\
Michal Kubecek 515f42
 	-r $(or $(wildcard $(2:.symtypes=.symref)), /dev/null)
Jeff Mahoney 455827
 
Michal Kubecek 515f42
 # These mirror gensymtypes_S and co below, keep them in synch.
Michal Marek 8ed77e
--- a/scripts/genksyms/genksyms.c
Michal Marek 8ed77e
+++ b/scripts/genksyms/genksyms.c
Michal Kubecek 515f42
@@ -33,7 +33,7 @@ char *cur_filename;
Jeff Mahoney 6318d5
 int in_source_file;
Michal Marek 8ed77e
 
Michal Marek 8ed77e
 static int flag_debug, flag_dump_defs, flag_reference, flag_dump_types,
Michal Kubecek 515f42
-	   flag_preserve, flag_warnings;
Michal Kubecek 515f42
+	   flag_override, flag_preserve, flag_warnings;
Michal Marek 8ed77e
 
Jeff Mahoney 0ead2a
 static int errors;
Michal Kubecek 549a5b
 static int nsyms;
Michal Kubecek 515f42
@@ -243,7 +243,7 @@ static struct symbol *__add_symbol(const char *name, enum symbol_type type,
Michal Marek 8ed77e
 				sym->is_declared = 1;
Michal Marek 8ed77e
 				return sym;
Michal Marek 8ed77e
 			} else if (!sym->is_declared) {
Michal Marek 8ed77e
-				if (sym->is_override && flag_preserve) {
Michal Marek 8ed77e
+				if (sym->is_override && flag_override) {
Michal Marek 8ed77e
 					print_location();
Michal Marek 8ed77e
 					fprintf(stderr, "ignoring ");
Michal Marek 8ed77e
 					print_type_name(type, name);
Michal Kubecek 515f42
@@ -656,11 +656,13 @@ void export_symbol(const char *name)
Michal Marek 8ed77e
 			struct symbol *n = sym->expansion_trail;
Michal Marek 8ed77e
 
Michal Marek 8ed77e
 			if (sym->status != STATUS_UNCHANGED) {
Michal Marek 8ed77e
+				int fail = sym->is_override && flag_preserve;
Michal Marek 8ed77e
+
Michal Marek 8ed77e
 				if (!has_changed) {
Michal Marek 8ed77e
 					print_location();
Michal Marek 8ed77e
 					fprintf(stderr, "%s: %s: modversion "
Michal Marek 8ed77e
 						"changed because of changes "
Michal Marek 8ed77e
-						"in ", flag_preserve ? "error" :
Michal Marek 8ed77e
+						"in ", fail ? "error" :
Michal Marek 8ed77e
 						       "warning", name);
Michal Marek 8ed77e
 				} else
Michal Marek 8ed77e
 					fprintf(stderr, ", ");
Michal Kubecek 515f42
@@ -668,7 +670,7 @@ void export_symbol(const char *name)
Michal Marek 8ed77e
 				if (sym->status == STATUS_DEFINED)
Michal Marek 8ed77e
 					fprintf(stderr, " (became defined)");
Michal Marek 8ed77e
 				has_changed = 1;
Michal Marek 8ed77e
-				if (flag_preserve)
Michal Marek 8ed77e
+				if (fail)
Michal Marek 8ed77e
 					errors++;
Michal Marek 8ed77e
 			}
Michal Marek 8ed77e
 			sym->expansion_trail = 0;
Michal Kubecek 515f42
@@ -724,6 +726,7 @@ static void genksyms_usage(void)
Michal Marek 8ed77e
 	      "  -D, --dump            Dump expanded symbol defs (for debugging only)\n"
Michal Marek 8ed77e
 	      "  -r, --reference file  Read reference symbols from a file\n"
Michal Marek 8ed77e
 	      "  -T, --dump-types file Dump expanded types into file\n"
Michal Marek 8ed77e
+	      "  -o, --override        Allow to override reference modversions\n"
Michal Marek 8ed77e
 	      "  -p, --preserve        Preserve reference modversions or fail\n"
Michal Marek 8ed77e
 	      "  -w, --warnings        Enable warnings\n"
Michal Marek 8ed77e
 	      "  -q, --quiet           Disable warnings (default)\n"
Michal Kubecek 515f42
@@ -735,6 +738,7 @@ static void genksyms_usage(void)
Michal Marek 8ed77e
 	      "  -D                    Dump expanded symbol defs (for debugging only)\n"
Michal Marek 8ed77e
 	      "  -r file               Read reference symbols from a file\n"
Michal Marek 8ed77e
 	      "  -T file               Dump expanded types into file\n"
Michal Marek 8ed77e
+	      "  -o                    Allow to override reference modversions\n"
Michal Marek 8ed77e
 	      "  -p                    Preserve reference modversions or fail\n"
Michal Marek 8ed77e
 	      "  -w                    Enable warnings\n"
Michal Marek 8ed77e
 	      "  -q                    Disable warnings (default)\n"
Michal Kubecek 515f42
@@ -758,15 +762,16 @@ int main(int argc, char **argv)
Michal Marek 8ed77e
 		{"reference", 1, 0, 'r'},
Michal Marek 8ed77e
 		{"dump-types", 1, 0, 'T'},
Michal Marek 8ed77e
 		{"preserve", 0, 0, 'p'},
Michal Marek 8ed77e
+		{"override", 0, 0, 'o'},
Michal Marek 8ed77e
 		{"version", 0, 0, 'V'},
Michal Marek 8ed77e
 		{"help", 0, 0, 'h'},
Michal Marek 8ed77e
 		{0, 0, 0, 0}
Michal Marek 8ed77e
 	};
Michal Marek 8ed77e
 
Michal Kubecek 515f42
-	while ((o = getopt_long(argc, argv, "s:dwqVDr:T:ph",
Michal Kubecek 515f42
+	while ((o = getopt_long(argc, argv, "s:dwqVDr:T:oph",
Michal Marek 8ed77e
 				&long_opts[0], NULL)) != EOF)
Michal Marek 8ed77e
 #else				/* __GNU_LIBRARY__ */
Michal Kubecek 515f42
-	while ((o = getopt(argc, argv, "s:dwqVDr:T:ph")) != EOF)
Michal Kubecek 515f42
+	while ((o = getopt(argc, argv, "s:dwqVDr:T:oph")) != EOF)
Michal Marek 8ed77e
 #endif				/* __GNU_LIBRARY__ */
Michal Marek 8ed77e
 		switch (o) {
Michal Kubecek 549a5b
 		case 'd':
Michal Kubecek 515f42
@@ -800,7 +805,11 @@ int main(int argc, char **argv)
Michal Marek 8ed77e
 				return 1;
Michal Marek 8ed77e
 			}
Michal Marek 8ed77e
 			break;
Michal Marek 8ed77e
+		case 'o':
Michal Marek 8ed77e
+			flag_override = 1;
Michal Marek 8ed77e
+			break;
Michal Marek 8ed77e
 		case 'p':
Michal Marek 8ed77e
+			flag_override = 1;
Michal Marek 8ed77e
 			flag_preserve = 1;
Michal Marek 8ed77e
 			break;
Michal Marek 8ed77e
 		case 'h':