diff options
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/Makefile.fwinst | 68 | ||||
-rw-r--r-- | scripts/Makefile.headersinst | 230 | ||||
-rw-r--r-- | scripts/Makefile.lib | 3 | ||||
-rw-r--r-- | scripts/Makefile.modpost | 1 | ||||
-rwxr-xr-x | scripts/checkpatch.pl | 310 | ||||
-rwxr-xr-x | scripts/checkstack.pl | 27 | ||||
-rwxr-xr-x | scripts/diffconfig | 129 | ||||
-rw-r--r-- | scripts/genksyms/genksyms.c | 3 | ||||
-rwxr-xr-x | scripts/hdrcheck.sh | 10 | ||||
-rwxr-xr-x | scripts/headers.sh | 41 | ||||
-rw-r--r-- | scripts/headers_check.pl | 56 | ||||
-rw-r--r-- | scripts/headers_install.pl | 45 | ||||
-rw-r--r-- | scripts/kconfig/conf.c | 161 | ||||
-rw-r--r-- | scripts/kconfig/confdata.c | 70 | ||||
-rw-r--r-- | scripts/kconfig/lkc.h | 9 | ||||
-rwxr-xr-x | scripts/kernel-doc | 1 | ||||
-rw-r--r-- | scripts/mod/file2alias.c | 38 | ||||
-rw-r--r-- | scripts/mod/mk_elfconfig.c | 2 | ||||
-rw-r--r-- | scripts/mod/modpost.c | 3 | ||||
-rwxr-xr-x | scripts/setlocalversion | 4 |
20 files changed, 853 insertions, 358 deletions
diff --git a/scripts/Makefile.fwinst b/scripts/Makefile.fwinst new file mode 100644 index 000000000000..f63a663de158 --- /dev/null +++ b/scripts/Makefile.fwinst | |||
@@ -0,0 +1,68 @@ | |||
1 | # ========================================================================== | ||
2 | # Installing firmware | ||
3 | # | ||
4 | # We don't include the .config, so all firmware files are in $(fw-shipped-) | ||
5 | # rather than in $(fw-shipped-y) or $(fw-shipped-n). | ||
6 | # ========================================================================== | ||
7 | |||
8 | INSTALL := install | ||
9 | src := $(obj) | ||
10 | |||
11 | # For modules_install installing firmware, we want to see .config | ||
12 | # But for firmware_install, we don't care, but don't want to require it. | ||
13 | -include $(objtree)/.config | ||
14 | |||
15 | include scripts/Kbuild.include | ||
16 | include $(srctree)/$(obj)/Makefile | ||
17 | |||
18 | include scripts/Makefile.host | ||
19 | |||
20 | mod-fw := $(fw-shipped-m) | ||
21 | # If CONFIG_FIRMWARE_IN_KERNEL isn't set, then install the | ||
22 | # firmware for in-kernel drivers too. | ||
23 | ifndef CONFIG_FIRMWARE_IN_KERNEL | ||
24 | mod-fw += $(fw-shipped-y) | ||
25 | endif | ||
26 | |||
27 | installed-mod-fw := $(addprefix $(INSTALL_FW_PATH)/,$(mod-fw)) | ||
28 | |||
29 | installed-fw := $(addprefix $(INSTALL_FW_PATH)/,$(fw-shipped-all)) | ||
30 | installed-fw-dirs := $(sort $(dir $(installed-fw))) $(INSTALL_FW_PATH)/. | ||
31 | |||
32 | # Workaround for make < 3.81, where .SECONDEXPANSION doesn't work. | ||
33 | PHONY += $(INSTALL_FW_PATH)/$$(%) install-all-dirs | ||
34 | $(INSTALL_FW_PATH)/$$(%): install-all-dirs | ||
35 | @true | ||
36 | install-all-dirs: $(installed-fw-dirs) | ||
37 | @true | ||
38 | |||
39 | quiet_cmd_install = INSTALL $(subst $(srctree)/,,$@) | ||
40 | cmd_install = $(INSTALL) -m0644 $< $@ | ||
41 | |||
42 | $(installed-fw-dirs): | ||
43 | $(call cmd,mkdir) | ||
44 | |||
45 | $(installed-fw): $(INSTALL_FW_PATH)/%: $(obj)/% | $(INSTALL_FW_PATH)/$$(dir %) | ||
46 | $(call cmd,install) | ||
47 | |||
48 | PHONY += __fw_install __fw_modinst FORCE | ||
49 | |||
50 | .PHONY: $(PHONY) | ||
51 | |||
52 | __fw_install: $(installed-fw) | ||
53 | __fw_modinst: $(installed-mod-fw) | ||
54 | __fw_modbuild: $(addprefix $(obj)/,$(mod-fw)) | ||
55 | |||
56 | FORCE: | ||
57 | |||
58 | # Read all saved command lines and dependencies for the $(targets) we | ||
59 | # may be building using $(if_changed{,_dep}). As an optimization, we | ||
60 | # don't need to read them if the target does not exist; we will rebuild | ||
61 | # anyway in that case. | ||
62 | |||
63 | targets := $(wildcard $(sort $(targets))) | ||
64 | cmd_files := $(wildcard $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd)) | ||
65 | |||
66 | ifneq ($(cmd_files),) | ||
67 | include $(cmd_files) | ||
68 | endif | ||
diff --git a/scripts/Makefile.headersinst b/scripts/Makefile.headersinst index 53dae3eb3d1f..612dc13ddd85 100644 --- a/scripts/Makefile.headersinst +++ b/scripts/Makefile.headersinst | |||
@@ -1,194 +1,98 @@ | |||
1 | # ========================================================================== | 1 | # ========================================================================== |
2 | # Installing headers | 2 | # Installing headers |
3 | # | 3 | # |
4 | # header-y files will be installed verbatim | 4 | # header-y - list files to be installed. They are preprocessed |
5 | # unifdef-y are the files where unifdef will be run before installing files | 5 | # to remove __KERNEL__ section of the file |
6 | # objhdr-y are generated files that will be installed verbatim | 6 | # unifdef-y - Same as header-y. Obsolete |
7 | # objhdr-y - Same as header-y but for generated files | ||
7 | # | 8 | # |
8 | # ========================================================================== | 9 | # ========================================================================== |
9 | 10 | ||
10 | UNIFDEF := scripts/unifdef -U__KERNEL__ | 11 | # called may set destination dir (when installing to asm/) |
11 | |||
12 | # Eliminate the contents of (and inclusions of) compiler.h | ||
13 | HDRSED := sed -e "s/ inline / __inline__ /g" \ | ||
14 | -e "s/[[:space:]]__user[[:space:]]\{1,\}/ /g" \ | ||
15 | -e "s/(__user[[:space:]]\{1,\}/ (/g" \ | ||
16 | -e "s/[[:space:]]__force[[:space:]]\{1,\}/ /g" \ | ||
17 | -e "s/(__force[[:space:]]\{1,\}/ (/g" \ | ||
18 | -e "s/[[:space:]]__iomem[[:space:]]\{1,\}/ /g" \ | ||
19 | -e "s/(__iomem[[:space:]]\{1,\}/ (/g" \ | ||
20 | -e "s/[[:space:]]__attribute_const__[[:space:]]\{1,\}/\ /g" \ | ||
21 | -e "s/[[:space:]]__attribute_const__$$//" \ | ||
22 | -e "/^\#include <linux\/compiler.h>/d" | ||
23 | |||
24 | _dst := $(if $(dst),$(dst),$(obj)) | 12 | _dst := $(if $(dst),$(dst),$(obj)) |
25 | 13 | ||
26 | ifeq (,$(patsubst include/asm/%,,$(obj)/)) | 14 | kbuild-file := $(srctree)/$(obj)/Kbuild |
27 | # For producing the generated stuff in include/asm for biarch builds, include | 15 | include $(kbuild-file) |
28 | # both sets of Kbuild files; we'll generate anything which is mentioned in | ||
29 | # _either_ arch, and recurse into subdirectories which are mentioned in either | ||
30 | # arch. Since some directories may exist in one but not the other, we must | ||
31 | # use $(wildcard...). | ||
32 | GENASM := 1 | ||
33 | archasm := $(subst include/asm,asm-$(ARCH),$(obj)) | ||
34 | altarchasm := $(subst include/asm,asm-$(ALTARCH),$(obj)) | ||
35 | KBUILDFILES := $(wildcard $(srctree)/include/$(archasm)/Kbuild $(srctree)/include/$(altarchasm)/Kbuild) | ||
36 | else | ||
37 | KBUILDFILES := $(srctree)/$(obj)/Kbuild | ||
38 | endif | ||
39 | 16 | ||
40 | include $(KBUILDFILES) | 17 | include scripts/Kbuild.include |
41 | 18 | ||
42 | include scripts/Kbuild.include | 19 | install := $(INSTALL_HDR_PATH)/$(_dst) |
43 | 20 | ||
44 | # If this is include/asm-$(ARCH) and there's no $(ALTARCH), then | 21 | header-y := $(sort $(header-y) $(unifdef-y)) |
45 | # override $(_dst) so that we install to include/asm directly. | 22 | subdirs := $(patsubst %/,%,$(filter %/, $(header-y))) |
46 | # Unless $(BIASMDIR) is set, in which case we're probably doing | 23 | header-y := $(filter-out %/, $(header-y)) |
47 | # a 'headers_install_all' build and we should keep the -$(ARCH) | ||
48 | # in the directory name. | ||
49 | ifeq ($(obj)$(ALTARCH),include/asm-$(ARCH)$(BIASMDIR)) | ||
50 | _dst := include/asm | ||
51 | endif | ||
52 | 24 | ||
53 | header-y := $(sort $(header-y)) | 25 | # files used to track state of install/check |
54 | unifdef-y := $(sort $(unifdef-y)) | 26 | install-file := $(install)/.install |
55 | subdir-y := $(patsubst %/,%,$(filter %/, $(header-y))) | 27 | check-file := $(install)/.check |
56 | header-y := $(filter-out %/, $(header-y)) | ||
57 | header-y := $(filter-out $(unifdef-y),$(header-y)) | ||
58 | 28 | ||
59 | # stamp files for header checks | 29 | # all headers files for this dir |
60 | check-y := $(patsubst %,.check.%,$(header-y) $(unifdef-y) $(objhdr-y)) | 30 | all-files := $(header-y) $(objhdr-y) |
31 | input-files := $(addprefix $(srctree)/$(obj)/,$(header-y)) \ | ||
32 | $(addprefix $(objtree)/$(obj)/,$(objhdr-y)) | ||
33 | output-files := $(addprefix $(install)/, $(all-files)) | ||
61 | 34 | ||
62 | # Work out what needs to be removed | 35 | # Work out what needs to be removed |
63 | oldheaders := $(patsubst $(INSTALL_HDR_PATH)/$(_dst)/%,%,$(wildcard $(INSTALL_HDR_PATH)/$(_dst)/*.h)) | 36 | oldheaders := $(patsubst $(install)/%,%,$(wildcard $(install)/*.h)) |
64 | unwanted := $(filter-out $(header-y) $(unifdef-y) $(objhdr-y),$(oldheaders)) | 37 | unwanted := $(filter-out $(all-files),$(oldheaders)) |
65 | 38 | ||
66 | oldcheckstamps := $(patsubst $(INSTALL_HDR_PATH)/$(_dst)/%,%,$(wildcard $(INSTALL_HDR_PATH)/$(_dst)/.check.*.h)) | 39 | # Prefix unwanted with full paths to $(INSTALL_HDR_PATH) |
67 | unwanted += $(filter-out $(check-y),$(oldcheckstamps)) | 40 | unwanted-file := $(addprefix $(install)/, $(unwanted)) |
68 | 41 | ||
69 | # Prefix them all with full paths to $(INSTALL_HDR_PATH) | 42 | printdir = $(patsubst $(INSTALL_HDR_PATH)/%/,%,$(dir $@)) |
70 | header-y := $(patsubst %,$(INSTALL_HDR_PATH)/$(_dst)/%,$(header-y)) | ||
71 | unifdef-y := $(patsubst %,$(INSTALL_HDR_PATH)/$(_dst)/%,$(unifdef-y)) | ||
72 | objhdr-y := $(patsubst %,$(INSTALL_HDR_PATH)/$(_dst)/%,$(objhdr-y)) | ||
73 | check-y := $(patsubst %,$(INSTALL_HDR_PATH)/$(_dst)/%,$(check-y)) | ||
74 | 43 | ||
44 | quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\ | ||
45 | file$(if $(word 2, $(all-files)),s)) | ||
46 | cmd_install = \ | ||
47 | $(PERL) $< $(srctree)/$(obj) $(install) $(SRCARCH) $(header-y); \ | ||
48 | $(PERL) $< $(objtree)/$(obj) $(install) $(SRCARCH) $(objhdr-y); \ | ||
49 | touch $@ | ||
75 | 50 | ||
76 | ifdef ALTARCH | 51 | quiet_cmd_remove = REMOVE $(unwanted) |
77 | ifeq ($(obj),include/asm-$(ARCH)) | 52 | cmd_remove = rm -f $(unwanted-file) |
78 | altarch-y := altarch-dir | ||
79 | endif | ||
80 | endif | ||
81 | 53 | ||
82 | # Make the definitions visible for recursive make invocations | 54 | quiet_cmd_check = CHECK $(printdir) ($(words $(all-files)) files) |
83 | export ALTARCH | 55 | cmd_check = $(PERL) $< $(INSTALL_HDR_PATH)/include $(SRCARCH) \ |
84 | export ARCHDEF | 56 | $(addprefix $(install)/, $(all-files)); \ |
85 | export ALTARCHDEF | 57 | touch $@ |
86 | |||
87 | quiet_cmd_o_hdr_install = INSTALL $(patsubst $(INSTALL_HDR_PATH)/%,%,$@) | ||
88 | cmd_o_hdr_install = cp $(patsubst $(INSTALL_HDR_PATH)/$(_dst)/%,$(objtree)/$(obj)/%,$@) \ | ||
89 | $(INSTALL_HDR_PATH)/$(_dst) | ||
90 | |||
91 | quiet_cmd_headers_install = INSTALL $(patsubst $(INSTALL_HDR_PATH)/%,%,$@) | ||
92 | cmd_headers_install = $(HDRSED) $(patsubst $(INSTALL_HDR_PATH)/$(_dst)/%,$(srctree)/$(obj)/%,$@) \ | ||
93 | > $@ | ||
94 | |||
95 | quiet_cmd_unifdef = UNIFDEF $(patsubst $(INSTALL_HDR_PATH)/%,%,$@) | ||
96 | cmd_unifdef = $(UNIFDEF) $(patsubst $(INSTALL_HDR_PATH)/$(_dst)/%,$(srctree)/$(obj)/%,$@) \ | ||
97 | | $(HDRSED) > $@ || : | ||
98 | |||
99 | quiet_cmd_check = CHECK $(patsubst $(INSTALL_HDR_PATH)/$(_dst)/.check.%,$(_dst)/%,$@) | ||
100 | cmd_check = $(CONFIG_SHELL) $(srctree)/scripts/hdrcheck.sh \ | ||
101 | $(INSTALL_HDR_PATH)/include $(subst /.check.,/,$@) $@ | ||
102 | |||
103 | quiet_cmd_remove = REMOVE $(_dst)/$@ | ||
104 | cmd_remove = rm -f $(INSTALL_HDR_PATH)/$(_dst)/$@ | ||
105 | |||
106 | quiet_cmd_mkdir = MKDIR $(patsubst $(INSTALL_HDR_PATH)/%,%,$@) | ||
107 | cmd_mkdir = mkdir -p $@ | ||
108 | |||
109 | quiet_cmd_gen = GEN $(patsubst $(INSTALL_HDR_PATH)/%,%,$@) | ||
110 | cmd_gen = \ | ||
111 | FNAME=$(patsubst $(INSTALL_HDR_PATH)/$(_dst)/%,%,$@); \ | ||
112 | STUBDEF=__ASM_STUB_`echo $$FNAME | tr a-z.- A-Z__`; \ | ||
113 | (echo "/* File autogenerated by 'make headers_install' */" ; \ | ||
114 | echo "\#ifndef $$STUBDEF" ; \ | ||
115 | echo "\#define $$STUBDEF" ; \ | ||
116 | echo "\# if $(ARCHDEF)" ; \ | ||
117 | if [ -r $(subst /$(_dst)/,/include/$(archasm)/,$@) ]; then \ | ||
118 | echo "\# include <$(archasm)/$$FNAME>" ; \ | ||
119 | else \ | ||
120 | echo "\# error $(archasm)/$$FNAME does not exist in" \ | ||
121 | "the $(ARCH) architecture" ; \ | ||
122 | fi ; \ | ||
123 | echo "\# elif $(ALTARCHDEF)" ; \ | ||
124 | if [ -r $(subst /$(_dst)/,/include/$(altarchasm)/,$@) ]; then \ | ||
125 | echo "\# include <$(altarchasm)/$$FNAME>" ; \ | ||
126 | else \ | ||
127 | echo "\# error $(altarchasm)/$$FNAME does not exist in" \ | ||
128 | "the $(ALTARCH) architecture" ; \ | ||
129 | fi ; \ | ||
130 | echo "\# else" ; \ | ||
131 | echo "\# warning This machine appears to be" \ | ||
132 | "neither $(ARCH) nor $(ALTARCH)." ; \ | ||
133 | echo "\# endif" ; \ | ||
134 | echo "\#endif /* $$STUBDEF */" ; \ | ||
135 | ) > $@ | ||
136 | |||
137 | .PHONY: __headersinst __headerscheck | ||
138 | |||
139 | ifdef HDRCHECK | ||
140 | __headerscheck: $(subdir-y) $(check-y) | ||
141 | @true | ||
142 | |||
143 | $(check-y) : $(INSTALL_HDR_PATH)/$(_dst)/.check.%.h : $(INSTALL_HDR_PATH)/$(_dst)/%.h | ||
144 | $(call cmd,check) | ||
145 | |||
146 | # Other dependencies for $(check-y) | ||
147 | include /dev/null $(wildcard $(check-y)) | ||
148 | |||
149 | # ... but leave $(check-y) as .PHONY for now until those deps are actually correct. | ||
150 | .PHONY: $(check-y) | ||
151 | 58 | ||
152 | else | 59 | PHONY += __headersinst __headerscheck |
153 | # Rules for installing headers | ||
154 | __headersinst: $(subdir-y) $(header-y) $(unifdef-y) $(altarch-y) $(objhdr-y) | ||
155 | @true | ||
156 | 60 | ||
157 | $(objhdr-y) $(subdir-y) $(header-y) $(unifdef-y): | $(INSTALL_HDR_PATH)/$(_dst) $(unwanted) | 61 | ifndef HDRCHECK |
158 | 62 | # Rules for installing headers | |
159 | $(INSTALL_HDR_PATH)/$(_dst): | 63 | __headersinst: $(subdirs) $(install-file) |
160 | $(call cmd,mkdir) | 64 | @: |
161 | |||
162 | .PHONY: $(unwanted) | ||
163 | $(unwanted): | ||
164 | $(call cmd,remove) | ||
165 | 65 | ||
166 | ifdef GENASM | 66 | targets += $(install-file) |
167 | $(objhdr-y) $(header-y) $(unifdef-y): $(KBUILDFILES) | 67 | $(install-file): scripts/headers_install.pl $(input-files) FORCE |
168 | $(call cmd,gen) | 68 | $(if $(unwanted),$(call cmd,remove),) |
69 | $(if $(wildcard $(dir $@)),,$(shell mkdir -p $(dir $@))) | ||
70 | $(call if_changed,install) | ||
169 | 71 | ||
170 | else | 72 | else |
171 | $(objhdr-y) : $(INSTALL_HDR_PATH)/$(_dst)/%.h: $(objtree)/$(obj)/%.h $(KBUILDFILES) | 73 | __headerscheck: $(subdirs) $(check-file) |
172 | $(call cmd,o_hdr_install) | 74 | @: |
173 | 75 | ||
174 | $(header-y) : $(INSTALL_HDR_PATH)/$(_dst)/%.h: $(srctree)/$(obj)/%.h $(KBUILDFILES) | 76 | targets += $(check-file) |
175 | $(call cmd,headers_install) | 77 | $(check-file): scripts/headers_check.pl $(output-files) FORCE |
78 | $(call if_changed,check) | ||
176 | 79 | ||
177 | $(unifdef-y) : $(INSTALL_HDR_PATH)/$(_dst)/%.h: $(srctree)/$(obj)/%.h $(KBUILDFILES) | ||
178 | $(call cmd,unifdef) | ||
179 | endif | ||
180 | endif | 80 | endif |
181 | 81 | ||
182 | hdrinst := -rR -f $(srctree)/scripts/Makefile.headersinst obj | 82 | # Recursion |
83 | hdr-inst := -rR -f $(srctree)/scripts/Makefile.headersinst obj | ||
84 | .PHONY: $(subdirs) | ||
85 | $(subdirs): | ||
86 | $(Q)$(MAKE) $(hdr-inst)=$(obj)/$@ dst=$(_dst)/$@ | ||
183 | 87 | ||
184 | .PHONY: altarch-dir | 88 | targets := $(wildcard $(sort $(targets))) |
185 | # All the files in the normal arch dir must be created first, since we test | 89 | cmd_files := $(wildcard \ |
186 | # for their existence. | 90 | $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd)) |
187 | altarch-dir: $(subdir-y) $(header-y) $(unifdef-y) $(objhdr-y) | ||
188 | $(Q)$(MAKE) $(hdrinst)=include/asm-$(ALTARCH) dst=include/asm-$(ALTARCH) | ||
189 | $(Q)$(MAKE) $(hdrinst)=include/asm dst=include/asm$(BIASMDIR) | ||
190 | 91 | ||
191 | # Recursion | 92 | ifneq ($(cmd_files),) |
192 | .PHONY: $(subdir-y) | 93 | include $(cmd_files) |
193 | $(subdir-y): | 94 | endif |
194 | $(Q)$(MAKE) $(hdrinst)=$(obj)/$@ dst=$(_dst)/$@ rel=../$(rel) | 95 | |
96 | .PHONY: $(PHONY) | ||
97 | PHONY += FORCE | ||
98 | FORCE: ; | ||
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 8e440233c27d..ea48b82a3707 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib | |||
@@ -96,7 +96,8 @@ basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(basetarget)))" | |||
96 | modname_flags = $(if $(filter 1,$(words $(modname))),\ | 96 | modname_flags = $(if $(filter 1,$(words $(modname))),\ |
97 | -D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))") | 97 | -D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))") |
98 | 98 | ||
99 | _c_flags = $(KBUILD_CFLAGS) $(ccflags-y) $(CFLAGS_$(basetarget).o) | 99 | orig_c_flags = $(KBUILD_CFLAGS) $(ccflags-y) $(CFLAGS_$(basetarget).o) |
100 | _c_flags = $(filter-out $(CFLAGS_REMOVE_$(basetarget).o), $(orig_c_flags)) | ||
100 | _a_flags = $(KBUILD_AFLAGS) $(asflags-y) $(AFLAGS_$(basetarget).o) | 101 | _a_flags = $(KBUILD_AFLAGS) $(asflags-y) $(AFLAGS_$(basetarget).o) |
101 | _cpp_flags = $(KBUILD_CPPFLAGS) $(cppflags-y) $(CPPFLAGS_$(@F)) | 102 | _cpp_flags = $(KBUILD_CPPFLAGS) $(cppflags-y) $(CPPFLAGS_$(@F)) |
102 | 103 | ||
diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost index 17092d6c7db3..9ee9783aea57 100644 --- a/scripts/Makefile.modpost +++ b/scripts/Makefile.modpost | |||
@@ -101,6 +101,7 @@ quiet_cmd_kernel-mod = MODPOST $@ | |||
101 | cmd_kernel-mod = $(modpost) $@ | 101 | cmd_kernel-mod = $(modpost) $@ |
102 | 102 | ||
103 | vmlinux.o: FORCE | 103 | vmlinux.o: FORCE |
104 | @rm -fr $(kernelmarkersfile) | ||
104 | $(call cmd,kernel-mod) | 105 | $(call cmd,kernel-mod) |
105 | 106 | ||
106 | # Declare generated files as targets for modpost | 107 | # Declare generated files as targets for modpost |
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 6971bf078d13..bc6779398229 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl | |||
@@ -9,7 +9,7 @@ use strict; | |||
9 | my $P = $0; | 9 | my $P = $0; |
10 | $P =~ s@.*/@@g; | 10 | $P =~ s@.*/@@g; |
11 | 11 | ||
12 | my $V = '0.19'; | 12 | my $V = '0.21'; |
13 | 13 | ||
14 | use Getopt::Long qw(:config no_auto_abbrev); | 14 | use Getopt::Long qw(:config no_auto_abbrev); |
15 | 15 | ||
@@ -17,7 +17,6 @@ my $quiet = 0; | |||
17 | my $tree = 1; | 17 | my $tree = 1; |
18 | my $chk_signoff = 1; | 18 | my $chk_signoff = 1; |
19 | my $chk_patch = 1; | 19 | my $chk_patch = 1; |
20 | my $tst_type = 0; | ||
21 | my $tst_only; | 20 | my $tst_only; |
22 | my $emacs = 0; | 21 | my $emacs = 0; |
23 | my $terse = 0; | 22 | my $terse = 0; |
@@ -44,7 +43,6 @@ GetOptions( | |||
44 | 'summary-file!' => \$summary_file, | 43 | 'summary-file!' => \$summary_file, |
45 | 44 | ||
46 | 'debug=s' => \%debug, | 45 | 'debug=s' => \%debug, |
47 | 'test-type!' => \$tst_type, | ||
48 | 'test-only=s' => \$tst_only, | 46 | 'test-only=s' => \$tst_only, |
49 | ) or exit; | 47 | ) or exit; |
50 | 48 | ||
@@ -67,6 +65,7 @@ if ($#ARGV < 0) { | |||
67 | 65 | ||
68 | my $dbg_values = 0; | 66 | my $dbg_values = 0; |
69 | my $dbg_possible = 0; | 67 | my $dbg_possible = 0; |
68 | my $dbg_type = 0; | ||
70 | for my $key (keys %debug) { | 69 | for my $key (keys %debug) { |
71 | eval "\${dbg_$key} = '$debug{$key}';" | 70 | eval "\${dbg_$key} = '$debug{$key}';" |
72 | } | 71 | } |
@@ -169,24 +168,23 @@ our @modifierList = ( | |||
169 | ); | 168 | ); |
170 | 169 | ||
171 | sub build_types { | 170 | sub build_types { |
172 | my $mods = "(?: \n" . join("|\n ", @modifierList) . "\n)"; | 171 | my $mods = "(?x: \n" . join("|\n ", @modifierList) . "\n)"; |
173 | my $all = "(?: \n" . join("|\n ", @typeList) . "\n)"; | 172 | my $all = "(?x: \n" . join("|\n ", @typeList) . "\n)"; |
173 | $Modifier = qr{(?:$Attribute|$Sparse|$mods)}; | ||
174 | $NonptrType = qr{ | 174 | $NonptrType = qr{ |
175 | (?:const\s+)? | 175 | (?:$Modifier\s+|const\s+)* |
176 | (?:$mods\s+)? | ||
177 | (?: | 176 | (?: |
178 | (?:typeof|__typeof__)\s*\(\s*\**\s*$Ident\s*\)| | 177 | (?:typeof|__typeof__)\s*\(\s*\**\s*$Ident\s*\)| |
179 | (?:${all}\b) | 178 | (?:${all}\b) |
180 | ) | 179 | ) |
181 | (?:\s+$Sparse|\s+const)* | 180 | (?:\s+$Modifier|\s+const)* |
182 | }x; | 181 | }x; |
183 | $Type = qr{ | 182 | $Type = qr{ |
184 | $NonptrType | 183 | $NonptrType |
185 | (?:\s*\*+\s*const|\s*\*+|(?:\s*\[\s*\])+)? | 184 | (?:\s*\*+\s*const|\s*\*+|(?:\s*\[\s*\])+)? |
186 | (?:\s+$Inline|\s+$Sparse|\s+$Attribute|\s+$mods)* | 185 | (?:\s+$Inline|\s+$Modifier)* |
187 | }x; | 186 | }x; |
188 | $Declare = qr{(?:$Storage\s+)?$Type}; | 187 | $Declare = qr{(?:$Storage\s+)?$Type}; |
189 | $Modifier = qr{(?:$Attribute|$Sparse|$mods)}; | ||
190 | } | 188 | } |
191 | build_types(); | 189 | build_types(); |
192 | 190 | ||
@@ -470,7 +468,9 @@ sub ctx_statement_block { | |||
470 | } | 468 | } |
471 | $off++; | 469 | $off++; |
472 | } | 470 | } |
471 | # We are truly at the end, so shuffle to the next line. | ||
473 | if ($off == $len) { | 472 | if ($off == $len) { |
473 | $loff = $len + 1; | ||
474 | $line++; | 474 | $line++; |
475 | $remain--; | 475 | $remain--; |
476 | } | 476 | } |
@@ -631,7 +631,7 @@ sub ctx_locate_comment { | |||
631 | my ($first_line, $end_line) = @_; | 631 | my ($first_line, $end_line) = @_; |
632 | 632 | ||
633 | # Catch a comment on the end of the line itself. | 633 | # Catch a comment on the end of the line itself. |
634 | my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*$@); | 634 | my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@); |
635 | return $current_comment if (defined $current_comment); | 635 | return $current_comment if (defined $current_comment); |
636 | 636 | ||
637 | # Look through the context and try and figure out if there is a | 637 | # Look through the context and try and figure out if there is a |
@@ -689,17 +689,20 @@ sub cat_vet { | |||
689 | my $av_preprocessor = 0; | 689 | my $av_preprocessor = 0; |
690 | my $av_pending; | 690 | my $av_pending; |
691 | my @av_paren_type; | 691 | my @av_paren_type; |
692 | my $av_pend_colon; | ||
692 | 693 | ||
693 | sub annotate_reset { | 694 | sub annotate_reset { |
694 | $av_preprocessor = 0; | 695 | $av_preprocessor = 0; |
695 | $av_pending = '_'; | 696 | $av_pending = '_'; |
696 | @av_paren_type = ('E'); | 697 | @av_paren_type = ('E'); |
698 | $av_pend_colon = 'O'; | ||
697 | } | 699 | } |
698 | 700 | ||
699 | sub annotate_values { | 701 | sub annotate_values { |
700 | my ($stream, $type) = @_; | 702 | my ($stream, $type) = @_; |
701 | 703 | ||
702 | my $res; | 704 | my $res; |
705 | my $var = '_' x length($stream); | ||
703 | my $cur = $stream; | 706 | my $cur = $stream; |
704 | 707 | ||
705 | print "$stream\n" if ($dbg_values > 1); | 708 | print "$stream\n" if ($dbg_values > 1); |
@@ -715,10 +718,14 @@ sub annotate_values { | |||
715 | $av_preprocessor = 0; | 718 | $av_preprocessor = 0; |
716 | } | 719 | } |
717 | 720 | ||
718 | } elsif ($cur =~ /^($Type)/) { | 721 | } elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\()/) { |
719 | print "DECLARE($1)\n" if ($dbg_values > 1); | 722 | print "DECLARE($1)\n" if ($dbg_values > 1); |
720 | $type = 'T'; | 723 | $type = 'T'; |
721 | 724 | ||
725 | } elsif ($cur =~ /^($Modifier)\s*/) { | ||
726 | print "MODIFIER($1)\n" if ($dbg_values > 1); | ||
727 | $type = 'T'; | ||
728 | |||
722 | } elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) { | 729 | } elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) { |
723 | print "DEFINE($1,$2)\n" if ($dbg_values > 1); | 730 | print "DEFINE($1,$2)\n" if ($dbg_values > 1); |
724 | $av_preprocessor = 1; | 731 | $av_preprocessor = 1; |
@@ -780,7 +787,12 @@ sub annotate_values { | |||
780 | $av_pending = 'N'; | 787 | $av_pending = 'N'; |
781 | $type = 'N'; | 788 | $type = 'N'; |
782 | 789 | ||
783 | } elsif ($cur =~/^(return|case|else)/o) { | 790 | } elsif ($cur =~/^(case)/o) { |
791 | print "CASE($1)\n" if ($dbg_values > 1); | ||
792 | $av_pend_colon = 'C'; | ||
793 | $type = 'N'; | ||
794 | |||
795 | } elsif ($cur =~/^(return|else|goto)/o) { | ||
784 | print "KEYWORD($1)\n" if ($dbg_values > 1); | 796 | print "KEYWORD($1)\n" if ($dbg_values > 1); |
785 | $type = 'N'; | 797 | $type = 'N'; |
786 | 798 | ||
@@ -800,10 +812,20 @@ sub annotate_values { | |||
800 | print "PAREN('$1')\n" if ($dbg_values > 1); | 812 | print "PAREN('$1')\n" if ($dbg_values > 1); |
801 | } | 813 | } |
802 | 814 | ||
803 | } elsif ($cur =~ /^($Ident)\(/o) { | 815 | } elsif ($cur =~ /^($Ident)\s*\(/o) { |
804 | print "FUNC($1)\n" if ($dbg_values > 1); | 816 | print "FUNC($1)\n" if ($dbg_values > 1); |
817 | $type = 'V'; | ||
805 | $av_pending = 'V'; | 818 | $av_pending = 'V'; |
806 | 819 | ||
820 | } elsif ($cur =~ /^($Ident\s*):/) { | ||
821 | if ($type eq 'E') { | ||
822 | $av_pend_colon = 'L'; | ||
823 | } elsif ($type eq 'T') { | ||
824 | $av_pend_colon = 'B'; | ||
825 | } | ||
826 | print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1); | ||
827 | $type = 'V'; | ||
828 | |||
807 | } elsif ($cur =~ /^($Ident|$Constant)/o) { | 829 | } elsif ($cur =~ /^($Ident|$Constant)/o) { |
808 | print "IDENT($1)\n" if ($dbg_values > 1); | 830 | print "IDENT($1)\n" if ($dbg_values > 1); |
809 | $type = 'V'; | 831 | $type = 'V'; |
@@ -815,11 +837,40 @@ sub annotate_values { | |||
815 | } elsif ($cur =~/^(;|{|})/) { | 837 | } elsif ($cur =~/^(;|{|})/) { |
816 | print "END($1)\n" if ($dbg_values > 1); | 838 | print "END($1)\n" if ($dbg_values > 1); |
817 | $type = 'E'; | 839 | $type = 'E'; |
840 | $av_pend_colon = 'O'; | ||
841 | |||
842 | } elsif ($cur =~ /^(\?)/o) { | ||
843 | print "QUESTION($1)\n" if ($dbg_values > 1); | ||
844 | $type = 'N'; | ||
818 | 845 | ||
819 | } elsif ($cur =~ /^(;|\?|:|\[)/o) { | 846 | } elsif ($cur =~ /^(:)/o) { |
847 | print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1); | ||
848 | |||
849 | substr($var, length($res), 1, $av_pend_colon); | ||
850 | if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') { | ||
851 | $type = 'E'; | ||
852 | } else { | ||
853 | $type = 'N'; | ||
854 | } | ||
855 | $av_pend_colon = 'O'; | ||
856 | |||
857 | } elsif ($cur =~ /^(;|\[)/o) { | ||
820 | print "CLOSE($1)\n" if ($dbg_values > 1); | 858 | print "CLOSE($1)\n" if ($dbg_values > 1); |
821 | $type = 'N'; | 859 | $type = 'N'; |
822 | 860 | ||
861 | } elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&(?!\&))/o) { | ||
862 | my $variant; | ||
863 | |||
864 | print "OPV($1)\n" if ($dbg_values > 1); | ||
865 | if ($type eq 'V') { | ||
866 | $variant = 'B'; | ||
867 | } else { | ||
868 | $variant = 'U'; | ||
869 | } | ||
870 | |||
871 | substr($var, length($res), 1, $variant); | ||
872 | $type = 'N'; | ||
873 | |||
823 | } elsif ($cur =~ /^($Operators)/o) { | 874 | } elsif ($cur =~ /^($Operators)/o) { |
824 | print "OP($1)\n" if ($dbg_values > 1); | 875 | print "OP($1)\n" if ($dbg_values > 1); |
825 | if ($1 ne '++' && $1 ne '--') { | 876 | if ($1 ne '++' && $1 ne '--') { |
@@ -835,17 +886,17 @@ sub annotate_values { | |||
835 | } | 886 | } |
836 | } | 887 | } |
837 | 888 | ||
838 | return $res; | 889 | return ($res, $var); |
839 | } | 890 | } |
840 | 891 | ||
841 | sub possible { | 892 | sub possible { |
842 | my ($possible, $line) = @_; | 893 | my ($possible, $line) = @_; |
843 | 894 | ||
844 | print "CHECK<$possible> ($line)\n" if ($dbg_possible > 1); | 895 | print "CHECK<$possible> ($line)\n" if ($dbg_possible > 1); |
845 | if ($possible !~ /^(?:$Storage|$Type|DEFINE_\S+)$/ && | 896 | if ($possible !~ /^(?:$Modifier|$Storage|$Type|DEFINE_\S+)$/ && |
846 | $possible ne 'goto' && $possible ne 'return' && | 897 | $possible ne 'goto' && $possible ne 'return' && |
847 | $possible ne 'case' && $possible ne 'else' && | 898 | $possible ne 'case' && $possible ne 'else' && |
848 | $possible ne 'asm' && | 899 | $possible ne 'asm' && $possible ne '__asm__' && |
849 | $possible !~ /^(typedef|struct|enum)\b/) { | 900 | $possible !~ /^(typedef|struct|enum)\b/) { |
850 | # Check for modifiers. | 901 | # Check for modifiers. |
851 | $possible =~ s/\s*$Storage\s*//g; | 902 | $possible =~ s/\s*$Storage\s*//g; |
@@ -854,8 +905,10 @@ sub possible { | |||
854 | 905 | ||
855 | } elsif ($possible =~ /\s/) { | 906 | } elsif ($possible =~ /\s/) { |
856 | $possible =~ s/\s*$Type\s*//g; | 907 | $possible =~ s/\s*$Type\s*//g; |
857 | warn "MODIFIER: $possible ($line)\n" if ($dbg_possible); | 908 | for my $modifier (split(' ', $possible)) { |
858 | push(@modifierList, $possible); | 909 | warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible); |
910 | push(@modifierList, $modifier); | ||
911 | } | ||
859 | 912 | ||
860 | } else { | 913 | } else { |
861 | warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible); | 914 | warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible); |
@@ -1135,7 +1188,9 @@ sub process { | |||
1135 | } | 1188 | } |
1136 | #80 column limit | 1189 | #80 column limit |
1137 | if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ && | 1190 | if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ && |
1138 | $rawline !~ /^.\s*\*\s*\@$Ident\s/ && $length > 80) | 1191 | $rawline !~ /^.\s*\*\s*\@$Ident\s/ && |
1192 | $line !~ /^\+\s*printk\s*\(\s*(?:KERN_\S+\s*)?"[X\t]*"\s*(?:,|\)\s*;)\s*$/ && | ||
1193 | $length > 80) | ||
1139 | { | 1194 | { |
1140 | WARN("line over 80 characters\n" . $herecurr); | 1195 | WARN("line over 80 characters\n" . $herecurr); |
1141 | } | 1196 | } |
@@ -1162,10 +1217,10 @@ sub process { | |||
1162 | } | 1217 | } |
1163 | 1218 | ||
1164 | # Check for potential 'bare' types | 1219 | # Check for potential 'bare' types |
1165 | my ($stat, $cond); | 1220 | my ($stat, $cond, $line_nr_next, $remain_next); |
1166 | if ($realcnt && $line =~ /.\s*\S/) { | 1221 | if ($realcnt && $line =~ /.\s*\S/) { |
1167 | ($stat, $cond) = ctx_statement_block($linenr, | 1222 | ($stat, $cond, $line_nr_next, $remain_next) = |
1168 | $realcnt, 0); | 1223 | ctx_statement_block($linenr, $realcnt, 0); |
1169 | $stat =~ s/\n./\n /g; | 1224 | $stat =~ s/\n./\n /g; |
1170 | $cond =~ s/\n./\n /g; | 1225 | $cond =~ s/\n./\n /g; |
1171 | 1226 | ||
@@ -1179,7 +1234,7 @@ sub process { | |||
1179 | } elsif ($s =~ /^.\s*$Ident\s*\(/s) { | 1234 | } elsif ($s =~ /^.\s*$Ident\s*\(/s) { |
1180 | 1235 | ||
1181 | # declarations always start with types | 1236 | # declarations always start with types |
1182 | } elsif ($prev_values eq 'E' && $s =~ /^.\s*(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?((?:\s*$Ident)+)\b(?:\s+$Sparse)?\s*\**\s*(?:$Ident|\(\*[^\)]*\))\s*(?:;|=|,|\()/s) { | 1237 | } elsif ($prev_values eq 'E' && $s =~ /^.\s*(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?((?:\s*$Ident)+?)\b(?:\s+$Sparse)?\s*\**\s*(?:$Ident|\(\*[^\)]*\))(?:\s*$Modifier)?\s*(?:;|=|,|\()/s) { |
1183 | my $type = $1; | 1238 | my $type = $1; |
1184 | $type =~ s/\s+/ /g; | 1239 | $type =~ s/\s+/ /g; |
1185 | possible($type, "A:" . $s); | 1240 | possible($type, "A:" . $s); |
@@ -1239,6 +1294,10 @@ sub process { | |||
1239 | ERROR("switch and case should be at the same indent\n$hereline$err"); | 1294 | ERROR("switch and case should be at the same indent\n$hereline$err"); |
1240 | } | 1295 | } |
1241 | } | 1296 | } |
1297 | if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g && | ||
1298 | $line !~ /\G(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$/g) { | ||
1299 | ERROR("trailing statements should be on next line\n" . $herecurr); | ||
1300 | } | ||
1242 | 1301 | ||
1243 | # if/while/etc brace do not go on next line, unless defining a do while loop, | 1302 | # if/while/etc brace do not go on next line, unless defining a do while loop, |
1244 | # or if that brace on the next line is for something else | 1303 | # or if that brace on the next line is for something else |
@@ -1246,17 +1305,22 @@ sub process { | |||
1246 | my $pre_ctx = "$1$2"; | 1305 | my $pre_ctx = "$1$2"; |
1247 | 1306 | ||
1248 | my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0); | 1307 | my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0); |
1249 | my $ctx_ln = $linenr + $#ctx + 1; | ||
1250 | my $ctx_cnt = $realcnt - $#ctx - 1; | 1308 | my $ctx_cnt = $realcnt - $#ctx - 1; |
1251 | my $ctx = join("\n", @ctx); | 1309 | my $ctx = join("\n", @ctx); |
1252 | 1310 | ||
1253 | ##warn "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n"; | 1311 | my $ctx_ln = $linenr; |
1312 | my $ctx_skip = $realcnt; | ||
1254 | 1313 | ||
1255 | # Skip over any removed lines in the context following statement. | 1314 | while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt && |
1256 | while (defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^-/) { | 1315 | defined $lines[$ctx_ln - 1] && |
1316 | $lines[$ctx_ln - 1] =~ /^-/)) { | ||
1317 | ##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n"; | ||
1318 | $ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/); | ||
1257 | $ctx_ln++; | 1319 | $ctx_ln++; |
1258 | } | 1320 | } |
1259 | ##warn "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n"; | 1321 | |
1322 | #print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n"; | ||
1323 | #print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n"; | ||
1260 | 1324 | ||
1261 | if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln -1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) { | 1325 | if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln -1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) { |
1262 | ERROR("that open brace { should be on the previous line\n" . | 1326 | ERROR("that open brace { should be on the previous line\n" . |
@@ -1276,12 +1340,14 @@ sub process { | |||
1276 | 1340 | ||
1277 | # Track the 'values' across context and added lines. | 1341 | # Track the 'values' across context and added lines. |
1278 | my $opline = $line; $opline =~ s/^./ /; | 1342 | my $opline = $line; $opline =~ s/^./ /; |
1279 | my $curr_values = annotate_values($opline . "\n", $prev_values); | 1343 | my ($curr_values, $curr_vars) = |
1344 | annotate_values($opline . "\n", $prev_values); | ||
1280 | $curr_values = $prev_values . $curr_values; | 1345 | $curr_values = $prev_values . $curr_values; |
1281 | if ($dbg_values) { | 1346 | if ($dbg_values) { |
1282 | my $outline = $opline; $outline =~ s/\t/ /g; | 1347 | my $outline = $opline; $outline =~ s/\t/ /g; |
1283 | print "$linenr > .$outline\n"; | 1348 | print "$linenr > .$outline\n"; |
1284 | print "$linenr > $curr_values\n"; | 1349 | print "$linenr > $curr_values\n"; |
1350 | print "$linenr > $curr_vars\n"; | ||
1285 | } | 1351 | } |
1286 | $prev_values = substr($curr_values, -1); | 1352 | $prev_values = substr($curr_values, -1); |
1287 | 1353 | ||
@@ -1289,8 +1355,12 @@ sub process { | |||
1289 | if ($line=~/^[^\+]/) {next;} | 1355 | if ($line=~/^[^\+]/) {next;} |
1290 | 1356 | ||
1291 | # TEST: allow direct testing of the type matcher. | 1357 | # TEST: allow direct testing of the type matcher. |
1292 | if ($tst_type && $line =~ /^.$Declare$/) { | 1358 | if ($dbg_type) { |
1293 | ERROR("TEST: is type $Declare\n" . $herecurr); | 1359 | if ($line =~ /^.\s*$Declare\s*$/) { |
1360 | ERROR("TEST: is type\n" . $herecurr); | ||
1361 | } elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) { | ||
1362 | ERROR("TEST: is not type ($1 is)\n". $herecurr); | ||
1363 | } | ||
1294 | next; | 1364 | next; |
1295 | } | 1365 | } |
1296 | 1366 | ||
@@ -1365,11 +1435,11 @@ sub process { | |||
1365 | ERROR("\"(foo $1 )\" should be \"(foo $1)\"\n" . | 1435 | ERROR("\"(foo $1 )\" should be \"(foo $1)\"\n" . |
1366 | $herecurr); | 1436 | $herecurr); |
1367 | 1437 | ||
1368 | } elsif ($line =~ m{$NonptrType(\*+)(?:\s+(?:$Attribute|$Sparse))?\s+[A-Za-z\d_]+}) { | 1438 | } elsif ($line =~ m{\b$NonptrType(\*+)(?:\s+(?:$Attribute|$Sparse))?\s+[A-Za-z\d_]+}) { |
1369 | ERROR("\"foo$1 bar\" should be \"foo $1bar\"\n" . | 1439 | ERROR("\"foo$1 bar\" should be \"foo $1bar\"\n" . |
1370 | $herecurr); | 1440 | $herecurr); |
1371 | 1441 | ||
1372 | } elsif ($line =~ m{$NonptrType\s+(\*+)(?!\s+(?:$Attribute|$Sparse))\s+[A-Za-z\d_]+}) { | 1442 | } elsif ($line =~ m{\b$NonptrType\s+(\*+)(?!\s+(?:$Attribute|$Sparse))\s+[A-Za-z\d_]+}) { |
1373 | ERROR("\"foo $1 bar\" should be \"foo $1bar\"\n" . | 1443 | ERROR("\"foo $1 bar\" should be \"foo $1bar\"\n" . |
1374 | $herecurr); | 1444 | $herecurr); |
1375 | } | 1445 | } |
@@ -1421,6 +1491,17 @@ sub process { | |||
1421 | ERROR("open brace '{' following $1 go on the same line\n" . $hereprev); | 1491 | ERROR("open brace '{' following $1 go on the same line\n" . $hereprev); |
1422 | } | 1492 | } |
1423 | 1493 | ||
1494 | # check for spacing round square brackets; allowed: | ||
1495 | # 1. with a type on the left -- int [] a; | ||
1496 | # 2. at the beginning of a line for slice initialisers -- [0..10] = 5, | ||
1497 | while ($line =~ /(.*?\s)\[/g) { | ||
1498 | my ($where, $prefix) = ($-[1], $1); | ||
1499 | if ($prefix !~ /$Type\s+$/ && | ||
1500 | ($where != 0 || $prefix !~ /^.\s+$/)) { | ||
1501 | ERROR("space prohibited before open square bracket '['\n" . $herecurr); | ||
1502 | } | ||
1503 | } | ||
1504 | |||
1424 | # check for spaces between functions and their parentheses. | 1505 | # check for spaces between functions and their parentheses. |
1425 | while ($line =~ /($Ident)\s+\(/g) { | 1506 | while ($line =~ /($Ident)\s+\(/g) { |
1426 | my $name = $1; | 1507 | my $name = $1; |
@@ -1457,7 +1538,8 @@ sub process { | |||
1457 | <<=|>>=|<=|>=|==|!=| | 1538 | <<=|>>=|<=|>=|==|!=| |
1458 | \+=|-=|\*=|\/=|%=|\^=|\|=|&=| | 1539 | \+=|-=|\*=|\/=|%=|\^=|\|=|&=| |
1459 | =>|->|<<|>>|<|>|=|!|~| | 1540 | =>|->|<<|>>|<|>|=|!|~| |
1460 | &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|% | 1541 | &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%| |
1542 | \?|: | ||
1461 | }x; | 1543 | }x; |
1462 | my @elements = split(/($ops|;)/, $opline); | 1544 | my @elements = split(/($ops|;)/, $opline); |
1463 | my $off = 0; | 1545 | my $off = 0; |
@@ -1504,22 +1586,11 @@ sub process { | |||
1504 | my $ptr = substr($blank, 0, $off) . "^"; | 1586 | my $ptr = substr($blank, 0, $off) . "^"; |
1505 | my $hereptr = "$hereline$ptr\n"; | 1587 | my $hereptr = "$hereline$ptr\n"; |
1506 | 1588 | ||
1507 | # Classify operators into binary, unary, or | 1589 | # Pull out the value of this operator. |
1508 | # definitions (* only) where they have more | ||
1509 | # than one mode. | ||
1510 | my $op_type = substr($curr_values, $off + 1, 1); | 1590 | my $op_type = substr($curr_values, $off + 1, 1); |
1511 | my $op_left = substr($curr_values, $off, 1); | 1591 | |
1512 | my $is_unary; | 1592 | # Get the full operator variant. |
1513 | if ($op_type eq 'T') { | 1593 | my $opv = $op . substr($curr_vars, $off, 1); |
1514 | $is_unary = 2; | ||
1515 | } elsif ($op_left eq 'V') { | ||
1516 | $is_unary = 0; | ||
1517 | } else { | ||
1518 | $is_unary = 1; | ||
1519 | } | ||
1520 | #if ($op eq '-' || $op eq '&' || $op eq '*') { | ||
1521 | # print "UNARY: <$op_left$op_type $is_unary $a:$op:$c> <$ca:$op:$cc> <$unary_ctx>\n"; | ||
1522 | #} | ||
1523 | 1594 | ||
1524 | # Ignore operators passed as parameters. | 1595 | # Ignore operators passed as parameters. |
1525 | if ($op_type ne 'V' && | 1596 | if ($op_type ne 'V' && |
@@ -1538,8 +1609,10 @@ sub process { | |||
1538 | # // is a comment | 1609 | # // is a comment |
1539 | } elsif ($op eq '//') { | 1610 | } elsif ($op eq '//') { |
1540 | 1611 | ||
1541 | # -> should have no spaces | 1612 | # No spaces for: |
1542 | } elsif ($op eq '->') { | 1613 | # -> |
1614 | # : when part of a bitfield | ||
1615 | } elsif ($op eq '->' || $opv eq ':B') { | ||
1543 | if ($ctx =~ /Wx.|.xW/) { | 1616 | if ($ctx =~ /Wx.|.xW/) { |
1544 | ERROR("spaces prohibited around that '$op' $at\n" . $hereptr); | 1617 | ERROR("spaces prohibited around that '$op' $at\n" . $hereptr); |
1545 | } | 1618 | } |
@@ -1551,18 +1624,19 @@ sub process { | |||
1551 | } | 1624 | } |
1552 | 1625 | ||
1553 | # '*' as part of a type definition -- reported already. | 1626 | # '*' as part of a type definition -- reported already. |
1554 | } elsif ($op eq '*' && $is_unary == 2) { | 1627 | } elsif ($opv eq '*_') { |
1555 | #warn "'*' is part of type\n"; | 1628 | #warn "'*' is part of type\n"; |
1556 | 1629 | ||
1557 | # unary operators should have a space before and | 1630 | # unary operators should have a space before and |
1558 | # none after. May be left adjacent to another | 1631 | # none after. May be left adjacent to another |
1559 | # unary operator, or a cast | 1632 | # unary operator, or a cast |
1560 | } elsif ($op eq '!' || $op eq '~' || | 1633 | } elsif ($op eq '!' || $op eq '~' || |
1561 | ($is_unary && ($op eq '*' || $op eq '-' || $op eq '&'))) { | 1634 | $opv eq '*U' || $opv eq '-U' || |
1635 | $opv eq '&U') { | ||
1562 | if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) { | 1636 | if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) { |
1563 | ERROR("space required before that '$op' $at\n" . $hereptr); | 1637 | ERROR("space required before that '$op' $at\n" . $hereptr); |
1564 | } | 1638 | } |
1565 | if ($op eq '*' && $cc =~/\s*const\b/) { | 1639 | if ($op eq '*' && $cc =~/\s*const\b/) { |
1566 | # A unary '*' may be const | 1640 | # A unary '*' may be const |
1567 | 1641 | ||
1568 | } elsif ($ctx =~ /.xW/) { | 1642 | } elsif ($ctx =~ /.xW/) { |
@@ -1595,11 +1669,33 @@ sub process { | |||
1595 | $hereptr); | 1669 | $hereptr); |
1596 | } | 1670 | } |
1597 | 1671 | ||
1672 | # A colon needs no spaces before when it is | ||
1673 | # terminating a case value or a label. | ||
1674 | } elsif ($opv eq ':C' || $opv eq ':L') { | ||
1675 | if ($ctx =~ /Wx./) { | ||
1676 | ERROR("space prohibited before that '$op' $at\n" . $hereptr); | ||
1677 | } | ||
1678 | |||
1598 | # All the others need spaces both sides. | 1679 | # All the others need spaces both sides. |
1599 | } elsif ($ctx !~ /[EWC]x[CWE]/) { | 1680 | } elsif ($ctx !~ /[EWC]x[CWE]/) { |
1681 | my $ok = 0; | ||
1682 | |||
1600 | # Ignore email addresses <foo@bar> | 1683 | # Ignore email addresses <foo@bar> |
1601 | if (!($op eq '<' && $cb =~ /$;\S+\@\S+>/) && | 1684 | if (($op eq '<' && |
1602 | !($op eq '>' && $cb =~ /<\S+\@\S+$;/)) { | 1685 | $cc =~ /^\S+\@\S+>/) || |
1686 | ($op eq '>' && | ||
1687 | $ca =~ /<\S+\@\S+$/)) | ||
1688 | { | ||
1689 | $ok = 1; | ||
1690 | } | ||
1691 | |||
1692 | # Ignore ?: | ||
1693 | if (($opv eq ':O' && $ca =~ /\?$/) || | ||
1694 | ($op eq '?' && $cc =~ /^:/)) { | ||
1695 | $ok = 1; | ||
1696 | } | ||
1697 | |||
1698 | if ($ok == 0) { | ||
1603 | ERROR("spaces required around that '$op' $at\n" . $hereptr); | 1699 | ERROR("spaces required around that '$op' $at\n" . $hereptr); |
1604 | } | 1700 | } |
1605 | } | 1701 | } |
@@ -1670,6 +1766,7 @@ sub process { | |||
1670 | my $value = $2; | 1766 | my $value = $2; |
1671 | 1767 | ||
1672 | # Flatten any parentheses and braces | 1768 | # Flatten any parentheses and braces |
1769 | $value =~ s/\)\(/\) \(/g; | ||
1673 | while ($value =~ s/\([^\(\)]*\)/1/) { | 1770 | while ($value =~ s/\([^\(\)]*\)/1/) { |
1674 | } | 1771 | } |
1675 | 1772 | ||
@@ -1686,8 +1783,9 @@ sub process { | |||
1686 | ERROR("space required before the open parenthesis '('\n" . $herecurr); | 1783 | ERROR("space required before the open parenthesis '('\n" . $herecurr); |
1687 | } | 1784 | } |
1688 | 1785 | ||
1689 | # Check for illegal assignment in if conditional. | 1786 | # Check for illegal assignment in if conditional -- and check for trailing |
1690 | if ($line =~ /\bif\s*\(/) { | 1787 | # statements after the conditional. |
1788 | if ($line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) { | ||
1691 | my ($s, $c) = ($stat, $cond); | 1789 | my ($s, $c) = ($stat, $cond); |
1692 | 1790 | ||
1693 | if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/) { | 1791 | if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/) { |
@@ -1699,13 +1797,63 @@ sub process { | |||
1699 | substr($s, 0, length($c), ''); | 1797 | substr($s, 0, length($c), ''); |
1700 | $s =~ s/\n.*//g; | 1798 | $s =~ s/\n.*//g; |
1701 | $s =~ s/$;//g; # Remove any comments | 1799 | $s =~ s/$;//g; # Remove any comments |
1702 | if (length($c) && $s !~ /^\s*({|;|)\s*\\*\s*$/ && | 1800 | if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ && |
1703 | $c !~ /^.\s*\#\s*if/) | 1801 | $c !~ /}\s*while\s*/) |
1704 | { | 1802 | { |
1705 | ERROR("trailing statements should be on next line\n" . $herecurr); | 1803 | ERROR("trailing statements should be on next line\n" . $herecurr); |
1706 | } | 1804 | } |
1707 | } | 1805 | } |
1708 | 1806 | ||
1807 | # Check relative indent for conditionals and blocks. | ||
1808 | if ($line =~ /\b(?:(?:if|while|for)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) { | ||
1809 | my ($s, $c) = ($stat, $cond); | ||
1810 | |||
1811 | substr($s, 0, length($c), ''); | ||
1812 | |||
1813 | # Make sure we remove the line prefixes as we have | ||
1814 | # none on the first line, and are going to readd them | ||
1815 | # where necessary. | ||
1816 | $s =~ s/\n./\n/gs; | ||
1817 | |||
1818 | # We want to check the first line inside the block | ||
1819 | # starting at the end of the conditional, so remove: | ||
1820 | # 1) any blank line termination | ||
1821 | # 2) any opening brace { on end of the line | ||
1822 | # 3) any do (...) { | ||
1823 | my $continuation = 0; | ||
1824 | my $check = 0; | ||
1825 | $s =~ s/^.*\bdo\b//; | ||
1826 | $s =~ s/^\s*{//; | ||
1827 | if ($s =~ s/^\s*\\//) { | ||
1828 | $continuation = 1; | ||
1829 | } | ||
1830 | if ($s =~ s/^\s*\n//) { | ||
1831 | $check = 1; | ||
1832 | } | ||
1833 | |||
1834 | # Also ignore a loop construct at the end of a | ||
1835 | # preprocessor statement. | ||
1836 | if (($prevline =~ /^.\s*#\s*define\s/ || | ||
1837 | $prevline =~ /\\\s*$/) && $continuation == 0) { | ||
1838 | $check = 0; | ||
1839 | } | ||
1840 | |||
1841 | # Ignore the current line if its is a preprocessor | ||
1842 | # line. | ||
1843 | if ($s =~ /^\s*#\s*/) { | ||
1844 | $check = 0; | ||
1845 | } | ||
1846 | |||
1847 | my (undef, $sindent) = line_stats("+" . $s); | ||
1848 | |||
1849 | ##print "line<$line> prevline<$prevline> indent<$indent> sindent<$sindent> check<$check> continuation<$continuation> s<$s>\n"; | ||
1850 | |||
1851 | if ($check && (($sindent % 8) != 0 || | ||
1852 | ($sindent <= $indent && $s ne ''))) { | ||
1853 | WARN("suspect code indent for conditional statements\n" . $herecurr); | ||
1854 | } | ||
1855 | } | ||
1856 | |||
1709 | # Check for bitwise tests written as boolean | 1857 | # Check for bitwise tests written as boolean |
1710 | if ($line =~ / | 1858 | if ($line =~ / |
1711 | (?: | 1859 | (?: |
@@ -1777,7 +1925,8 @@ sub process { | |||
1777 | # multi-statement macros should be enclosed in a do while loop, grab the | 1925 | # multi-statement macros should be enclosed in a do while loop, grab the |
1778 | # first statement and ensure its the whole macro if its not enclosed | 1926 | # first statement and ensure its the whole macro if its not enclosed |
1779 | # in a known good container | 1927 | # in a known good container |
1780 | if ($line =~ /^.\s*\#\s*define\s*$Ident(\()?/) { | 1928 | if ($realfile !~ m@/vmlinux.lds.h$@ && |
1929 | $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) { | ||
1781 | my $ln = $linenr; | 1930 | my $ln = $linenr; |
1782 | my $cnt = $realcnt; | 1931 | my $cnt = $realcnt; |
1783 | my ($off, $dstat, $dcond, $rest); | 1932 | my ($off, $dstat, $dcond, $rest); |
@@ -1791,30 +1940,26 @@ sub process { | |||
1791 | $lines[$ln - 1] =~ /^(?:-|..*\\$)/) | 1940 | $lines[$ln - 1] =~ /^(?:-|..*\\$)/) |
1792 | { | 1941 | { |
1793 | $ctx .= $rawlines[$ln - 1] . "\n"; | 1942 | $ctx .= $rawlines[$ln - 1] . "\n"; |
1943 | $cnt-- if ($lines[$ln - 1] !~ /^-/); | ||
1794 | $ln++; | 1944 | $ln++; |
1795 | $cnt--; | ||
1796 | } | 1945 | } |
1797 | $ctx .= $rawlines[$ln - 1]; | 1946 | $ctx .= $rawlines[$ln - 1]; |
1798 | 1947 | ||
1799 | ($dstat, $dcond, $ln, $cnt, $off) = | 1948 | ($dstat, $dcond, $ln, $cnt, $off) = |
1800 | ctx_statement_block($linenr, $ln - $linenr + 1, 0); | 1949 | ctx_statement_block($linenr, $ln - $linenr + 1, 0); |
1801 | #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n"; | 1950 | #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n"; |
1802 | #print "LINE<$lines[$ln]> len<" . length($lines[$ln]) . "\n"; | 1951 | #print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n"; |
1803 | 1952 | ||
1804 | # Extract the remainder of the define (if any) and | 1953 | # Extract the remainder of the define (if any) and |
1805 | # rip off surrounding spaces, and trailing \'s. | 1954 | # rip off surrounding spaces, and trailing \'s. |
1806 | $rest = ''; | 1955 | $rest = ''; |
1807 | if (defined $lines[$ln - 1] && | 1956 | while ($off != 0 || ($cnt > 0 && $rest =~ /(?:^|\\)\s*$/)) { |
1808 | $off > length($lines[$ln - 1])) | 1957 | #print "ADDING $off <" . substr($lines[$ln - 1], $off) . ">\n"; |
1809 | { | 1958 | if ($off != 0 || $lines[$ln - 1] !~ /^-/) { |
1810 | $ln++; | 1959 | $rest .= substr($lines[$ln - 1], $off) . "\n"; |
1811 | $cnt--; | 1960 | $cnt--; |
1812 | $off = 0; | 1961 | } |
1813 | } | ||
1814 | while ($cnt > 0) { | ||
1815 | $rest .= substr($lines[$ln - 1], $off) . "\n"; | ||
1816 | $ln++; | 1962 | $ln++; |
1817 | $cnt--; | ||
1818 | $off = 0; | 1963 | $off = 0; |
1819 | } | 1964 | } |
1820 | $rest =~ s/\\\n.//g; | 1965 | $rest =~ s/\\\n.//g; |
@@ -1827,6 +1972,7 @@ sub process { | |||
1827 | } else { | 1972 | } else { |
1828 | $dstat =~ s/^.\s*\#\s*define\s+$Ident\s*//; | 1973 | $dstat =~ s/^.\s*\#\s*define\s+$Ident\s*//; |
1829 | } | 1974 | } |
1975 | $dstat =~ s/$;//g; | ||
1830 | $dstat =~ s/\\\n.//g; | 1976 | $dstat =~ s/\\\n.//g; |
1831 | $dstat =~ s/^\s*//s; | 1977 | $dstat =~ s/^\s*//s; |
1832 | $dstat =~ s/\s*$//s; | 1978 | $dstat =~ s/\s*$//s; |
@@ -1845,6 +1991,7 @@ sub process { | |||
1845 | DEFINE_PER_CPU| | 1991 | DEFINE_PER_CPU| |
1846 | __typeof__\( | 1992 | __typeof__\( |
1847 | }x; | 1993 | }x; |
1994 | #print "REST<$rest>\n"; | ||
1848 | if ($rest ne '') { | 1995 | if ($rest ne '') { |
1849 | if ($rest !~ /while\s*\(/ && | 1996 | if ($rest !~ /while\s*\(/ && |
1850 | $dstat !~ /$exceptions/) | 1997 | $dstat !~ /$exceptions/) |
@@ -2001,7 +2148,14 @@ sub process { | |||
2001 | if ($prevline =~ /\bif\s*\(([^\)]*)\)/) { | 2148 | if ($prevline =~ /\bif\s*\(([^\)]*)\)/) { |
2002 | my $expr = $1; | 2149 | my $expr = $1; |
2003 | if ($line =~ /\bkfree\(\Q$expr\E\);/) { | 2150 | if ($line =~ /\bkfree\(\Q$expr\E\);/) { |
2004 | WARN("kfree(NULL) is safe this check is probabally not required\n" . $hereprev); | 2151 | WARN("kfree(NULL) is safe this check is probably not required\n" . $hereprev); |
2152 | } | ||
2153 | } | ||
2154 | # check for needless usb_free_urb() checks | ||
2155 | if ($prevline =~ /\bif\s*\(([^\)]*)\)/) { | ||
2156 | my $expr = $1; | ||
2157 | if ($line =~ /\busb_free_urb\(\Q$expr\E\);/) { | ||
2158 | WARN("usb_free_urb(NULL) is safe this check is probably not required\n" . $hereprev); | ||
2005 | } | 2159 | } |
2006 | } | 2160 | } |
2007 | 2161 | ||
@@ -2106,6 +2260,10 @@ sub process { | |||
2106 | if ($line =~ /\bsimple_(strto.*?)\s*\(/) { | 2260 | if ($line =~ /\bsimple_(strto.*?)\s*\(/) { |
2107 | WARN("consider using strict_$1 in preference to simple_$1\n" . $herecurr); | 2261 | WARN("consider using strict_$1 in preference to simple_$1\n" . $herecurr); |
2108 | } | 2262 | } |
2263 | # check for __initcall(), use device_initcall() explicitly please | ||
2264 | if ($line =~ /^.\s*__initcall\s*\(/) { | ||
2265 | WARN("please use device_initcall() instead of __initcall()\n" . $herecurr); | ||
2266 | } | ||
2109 | 2267 | ||
2110 | # use of NR_CPUS is usually wrong | 2268 | # use of NR_CPUS is usually wrong |
2111 | # ignore definitions of NR_CPUS and usage to define arrays as likely right | 2269 | # ignore definitions of NR_CPUS and usage to define arrays as likely right |
diff --git a/scripts/checkstack.pl b/scripts/checkstack.pl index 340ad6920511..3eca62566d6b 100755 --- a/scripts/checkstack.pl +++ b/scripts/checkstack.pl | |||
@@ -26,12 +26,17 @@ | |||
26 | # $& (whole re) matches the complete objdump line with the stack growth | 26 | # $& (whole re) matches the complete objdump line with the stack growth |
27 | # $1 (first bracket) matches the size of the stack growth | 27 | # $1 (first bracket) matches the size of the stack growth |
28 | # | 28 | # |
29 | # $dre is similar, but for dynamic stack redutions: | ||
30 | # $& (whole re) matches the complete objdump line with the stack growth | ||
31 | # $1 (first bracket) matches the dynamic amount of the stack growth | ||
32 | # | ||
29 | # use anything else and feel the pain ;) | 33 | # use anything else and feel the pain ;) |
30 | my (@stack, $re, $x, $xs); | 34 | my (@stack, $re, $dre, $x, $xs); |
31 | { | 35 | { |
32 | my $arch = shift; | 36 | my $arch = shift; |
33 | if ($arch eq "") { | 37 | if ($arch eq "") { |
34 | $arch = `uname -m`; | 38 | $arch = `uname -m`; |
39 | chomp($arch); | ||
35 | } | 40 | } |
36 | 41 | ||
37 | $x = "[0-9a-f]"; # hex character | 42 | $x = "[0-9a-f]"; # hex character |
@@ -46,9 +51,11 @@ my (@stack, $re, $x, $xs); | |||
46 | } elsif ($arch =~ /^i[3456]86$/) { | 51 | } elsif ($arch =~ /^i[3456]86$/) { |
47 | #c0105234: 81 ec ac 05 00 00 sub $0x5ac,%esp | 52 | #c0105234: 81 ec ac 05 00 00 sub $0x5ac,%esp |
48 | $re = qr/^.*[as][du][db] \$(0x$x{1,8}),\%esp$/o; | 53 | $re = qr/^.*[as][du][db] \$(0x$x{1,8}),\%esp$/o; |
54 | $dre = qr/^.*[as][du][db] (%.*),\%esp$/o; | ||
49 | } elsif ($arch eq 'x86_64') { | 55 | } elsif ($arch eq 'x86_64') { |
50 | # 2f60: 48 81 ec e8 05 00 00 sub $0x5e8,%rsp | 56 | # 2f60: 48 81 ec e8 05 00 00 sub $0x5e8,%rsp |
51 | $re = qr/^.*[as][du][db] \$(0x$x{1,8}),\%rsp$/o; | 57 | $re = qr/^.*[as][du][db] \$(0x$x{1,8}),\%rsp$/o; |
58 | $dre = qr/^.*[as][du][db] (\%.*),\%rsp$/o; | ||
52 | } elsif ($arch eq 'ia64') { | 59 | } elsif ($arch eq 'ia64') { |
53 | #e0000000044011fc: 01 0f fc 8c adds r12=-384,r12 | 60 | #e0000000044011fc: 01 0f fc 8c adds r12=-384,r12 |
54 | $re = qr/.*adds.*r12=-(([0-9]{2}|[3-9])[0-9]{2}),r12/o; | 61 | $re = qr/.*adds.*r12=-(([0-9]{2}|[3-9])[0-9]{2}),r12/o; |
@@ -85,7 +92,7 @@ my (@stack, $re, $x, $xs); | |||
85 | # 0: 00 e8 38 01 LINK 0x4e0; | 92 | # 0: 00 e8 38 01 LINK 0x4e0; |
86 | $re = qr/.*[[:space:]]LINK[[:space:]]*(0x$x{1,8})/o; | 93 | $re = qr/.*[[:space:]]LINK[[:space:]]*(0x$x{1,8})/o; |
87 | } else { | 94 | } else { |
88 | print("wrong or unknown architecture\n"); | 95 | print("wrong or unknown architecture \"$arch\"\n"); |
89 | exit | 96 | exit |
90 | } | 97 | } |
91 | } | 98 | } |
@@ -141,6 +148,22 @@ while (my $line = <STDIN>) { | |||
141 | next if ($size < 100); | 148 | next if ($size < 100); |
142 | push @stack, "$intro$size\n"; | 149 | push @stack, "$intro$size\n"; |
143 | } | 150 | } |
151 | elsif (defined $dre && $line =~ m/$dre/) { | ||
152 | my $size = "Dynamic ($1)"; | ||
153 | |||
154 | next if $line !~ m/^($xs*)/; | ||
155 | my $addr = $1; | ||
156 | $addr =~ s/ /0/g; | ||
157 | $addr = "0x$addr"; | ||
158 | |||
159 | my $intro = "$addr $func [$file]:"; | ||
160 | my $padlen = 56 - length($intro); | ||
161 | while ($padlen > 0) { | ||
162 | $intro .= ' '; | ||
163 | $padlen -= 8; | ||
164 | } | ||
165 | push @stack, "$intro$size\n"; | ||
166 | } | ||
144 | } | 167 | } |
145 | 168 | ||
146 | print sort bysize @stack; | 169 | print sort bysize @stack; |
diff --git a/scripts/diffconfig b/scripts/diffconfig new file mode 100755 index 000000000000..b91f3e34d44d --- /dev/null +++ b/scripts/diffconfig | |||
@@ -0,0 +1,129 @@ | |||
1 | #!/usr/bin/python | ||
2 | # | ||
3 | # diffconfig - a tool to compare .config files. | ||
4 | # | ||
5 | # originally written in 2006 by Matt Mackall | ||
6 | # (at least, this was in his bloatwatch source code) | ||
7 | # last worked on 2008 by Tim Bird | ||
8 | # | ||
9 | |||
10 | import sys, os | ||
11 | |||
12 | def usage(): | ||
13 | print """Usage: diffconfig [-h] [-m] [<config1> <config2>] | ||
14 | |||
15 | Diffconfig is a simple utility for comparing two .config files. | ||
16 | Using standard diff to compare .config files often includes extraneous and | ||
17 | distracting information. This utility produces sorted output with only the | ||
18 | changes in configuration values between the two files. | ||
19 | |||
20 | Added and removed items are shown with a leading plus or minus, respectively. | ||
21 | Changed items show the old and new values on a single line. | ||
22 | |||
23 | If -m is specified, then output will be in "merge" style, which has the | ||
24 | changed and new values in kernel config option format. | ||
25 | |||
26 | If no config files are specified, .config and .config.old are used. | ||
27 | |||
28 | Example usage: | ||
29 | $ diffconfig .config config-with-some-changes | ||
30 | -EXT2_FS_XATTR n | ||
31 | -EXT2_FS_XIP n | ||
32 | CRAMFS n -> y | ||
33 | EXT2_FS y -> n | ||
34 | LOG_BUF_SHIFT 14 -> 16 | ||
35 | PRINTK_TIME n -> y | ||
36 | """ | ||
37 | sys.exit(0) | ||
38 | |||
39 | # returns a dictionary of name/value pairs for config items in the file | ||
40 | def readconfig(config_file): | ||
41 | d = {} | ||
42 | for line in config_file: | ||
43 | line = line[:-1] | ||
44 | if line[:7] == "CONFIG_": | ||
45 | name, val = line[7:].split("=", 1) | ||
46 | d[name] = val | ||
47 | if line[-11:] == " is not set": | ||
48 | d[line[9:-11]] = "n" | ||
49 | return d | ||
50 | |||
51 | def print_config(op, config, value, new_value): | ||
52 | global merge_style | ||
53 | |||
54 | if merge_style: | ||
55 | if new_value: | ||
56 | if new_value=="n": | ||
57 | print "# CONFIG_%s is not set" % config | ||
58 | else: | ||
59 | print "CONFIG_%s=%s" % (config, new_value) | ||
60 | else: | ||
61 | if op=="-": | ||
62 | print "-%s %s" % (config, value) | ||
63 | elif op=="+": | ||
64 | print "+%s %s" % (config, new_value) | ||
65 | else: | ||
66 | print " %s %s -> %s" % (config, value, new_value) | ||
67 | |||
68 | def main(): | ||
69 | global merge_style | ||
70 | |||
71 | # parse command line args | ||
72 | if ("-h" in sys.argv or "--help" in sys.argv): | ||
73 | usage() | ||
74 | |||
75 | merge_style = 0 | ||
76 | if "-m" in sys.argv: | ||
77 | merge_style = 1 | ||
78 | sys.argv.remove("-m") | ||
79 | |||
80 | argc = len(sys.argv) | ||
81 | if not (argc==1 or argc == 3): | ||
82 | print "Error: incorrect number of arguments or unrecognized option" | ||
83 | usage() | ||
84 | |||
85 | if argc == 1: | ||
86 | # if no filenames given, assume .config and .config.old | ||
87 | build_dir="" | ||
88 | if os.environ.has_key("KBUILD_OUTPUT"): | ||
89 | build_dir = os.environ["KBUILD_OUTPUT"]+"/" | ||
90 | |||
91 | configa_filename = build_dir + ".config.old" | ||
92 | configb_filename = build_dir + ".config" | ||
93 | else: | ||
94 | configa_filename = sys.argv[1] | ||
95 | configb_filename = sys.argv[2] | ||
96 | |||
97 | a = readconfig(file(configa_filename)) | ||
98 | b = readconfig(file(configb_filename)) | ||
99 | |||
100 | # print items in a but not b (accumulate, sort and print) | ||
101 | old = [] | ||
102 | for config in a: | ||
103 | if config not in b: | ||
104 | old.append(config) | ||
105 | old.sort() | ||
106 | for config in old: | ||
107 | print_config("-", config, a[config], None) | ||
108 | del a[config] | ||
109 | |||
110 | # print items that changed (accumulate, sort, and print) | ||
111 | changed = [] | ||
112 | for config in a: | ||
113 | if a[config] != b[config]: | ||
114 | changed.append(config) | ||
115 | else: | ||
116 | del b[config] | ||
117 | changed.sort() | ||
118 | for config in changed: | ||
119 | print_config("->", config, a[config], b[config]) | ||
120 | del b[config] | ||
121 | |||
122 | # now print items in b but not in a | ||
123 | # (items from b that were in a were removed above) | ||
124 | new = b.keys() | ||
125 | new.sort() | ||
126 | for config in new: | ||
127 | print_config("+", config, None, b[config]) | ||
128 | |||
129 | main() | ||
diff --git a/scripts/genksyms/genksyms.c b/scripts/genksyms/genksyms.c index dca5e0dd09bf..4f8a3007e457 100644 --- a/scripts/genksyms/genksyms.c +++ b/scripts/genksyms/genksyms.c | |||
@@ -520,8 +520,7 @@ int main(int argc, char **argv) | |||
520 | genksyms_usage(); | 520 | genksyms_usage(); |
521 | return 1; | 521 | return 1; |
522 | } | 522 | } |
523 | if ((strcmp(arch, "v850") == 0) || (strcmp(arch, "h8300") == 0) | 523 | if ((strcmp(arch, "h8300") == 0) || (strcmp(arch, "blackfin") == 0)) |
524 | || (strcmp(arch, "blackfin") == 0)) | ||
525 | mod_prefix = "_"; | 524 | mod_prefix = "_"; |
526 | { | 525 | { |
527 | extern int yydebug; | 526 | extern int yydebug; |
diff --git a/scripts/hdrcheck.sh b/scripts/hdrcheck.sh deleted file mode 100755 index 31598584f871..000000000000 --- a/scripts/hdrcheck.sh +++ /dev/null | |||
@@ -1,10 +0,0 @@ | |||
1 | #!/bin/sh | ||
2 | |||
3 | for FILE in `grep '^[ \t]*#[ \t]*include[ \t]*<' $2 | cut -f2 -d\< | cut -f1 -d\> | egrep ^linux\|^asm` ; do | ||
4 | if [ ! -r $1/$FILE ]; then | ||
5 | echo $2 requires $FILE, which does not exist in exported headers | ||
6 | exit 1 | ||
7 | fi | ||
8 | done | ||
9 | # FIXME: List dependencies into $3 | ||
10 | touch $3 | ||
diff --git a/scripts/headers.sh b/scripts/headers.sh new file mode 100755 index 000000000000..d33426f866db --- /dev/null +++ b/scripts/headers.sh | |||
@@ -0,0 +1,41 @@ | |||
1 | #!/bin/sh | ||
2 | # Run headers_$1 command for all suitable architectures | ||
3 | |||
4 | # Stop on error | ||
5 | set -e | ||
6 | |||
7 | do_command() | ||
8 | { | ||
9 | if [ -f ${srctree}/arch/$2/include/asm/Kbuild ]; then | ||
10 | make ARCH=$2 KBUILD_HEADERS=$1 headers_$1 | ||
11 | elif [ -f ${srctree}/include/asm-$2/Kbuild ]; then | ||
12 | make ARCH=$2 KBUILD_HEADERS=$1 headers_$1 | ||
13 | else | ||
14 | printf "Ignoring arch: %s\n" ${arch} | ||
15 | fi | ||
16 | } | ||
17 | |||
18 | # Do not try this architecture | ||
19 | drop="generic um ppc sparc64 cris" | ||
20 | |||
21 | archs=$(ls ${srctree}/arch) | ||
22 | |||
23 | for arch in ${archs}; do | ||
24 | case ${arch} in | ||
25 | um) # no userspace export | ||
26 | ;; | ||
27 | ppc) # headers exported by powerpc | ||
28 | ;; | ||
29 | sparc64) # headers exported by sparc | ||
30 | ;; | ||
31 | cris) # headers export are known broken | ||
32 | ;; | ||
33 | *) | ||
34 | if [ -d ${srctree}/arch/${arch} ]; then | ||
35 | do_command $1 ${arch} | ||
36 | fi | ||
37 | ;; | ||
38 | esac | ||
39 | done | ||
40 | |||
41 | |||
diff --git a/scripts/headers_check.pl b/scripts/headers_check.pl new file mode 100644 index 000000000000..15d53a6b1a1f --- /dev/null +++ b/scripts/headers_check.pl | |||
@@ -0,0 +1,56 @@ | |||
1 | #!/usr/bin/perl | ||
2 | # | ||
3 | # headers_check.pl execute a number of trivial consistency checks | ||
4 | # | ||
5 | # Usage: headers_check.pl dir [files...] | ||
6 | # dir: dir to look for included files | ||
7 | # arch: architecture | ||
8 | # files: list of files to check | ||
9 | # | ||
10 | # The script reads the supplied files line by line and: | ||
11 | # | ||
12 | # 1) for each include statement it checks if the | ||
13 | # included file actually exists. | ||
14 | # Only include files located in asm* and linux* are checked. | ||
15 | # The rest are assumed to be system include files. | ||
16 | # | ||
17 | # 2) TODO: check for leaked CONFIG_ symbols | ||
18 | |||
19 | use strict; | ||
20 | use warnings; | ||
21 | |||
22 | my ($dir, $arch, @files) = @ARGV; | ||
23 | |||
24 | my $ret = 0; | ||
25 | my $line; | ||
26 | my $lineno = 0; | ||
27 | my $filename; | ||
28 | |||
29 | foreach my $file (@files) { | ||
30 | $filename = $file; | ||
31 | open(my $fh, '<', "$filename") or die "$filename: $!\n"; | ||
32 | $lineno = 0; | ||
33 | while ($line = <$fh>) { | ||
34 | $lineno++; | ||
35 | check_include(); | ||
36 | } | ||
37 | close $fh; | ||
38 | } | ||
39 | exit $ret; | ||
40 | |||
41 | sub check_include | ||
42 | { | ||
43 | if ($line =~ m/^\s*#\s*include\s+<((asm|linux).*)>/) { | ||
44 | my $inc = $1; | ||
45 | my $found; | ||
46 | $found = stat($dir . "/" . $inc); | ||
47 | if (!$found) { | ||
48 | $inc =~ s#asm/#asm-$arch/#; | ||
49 | $found = stat($dir . "/" . $inc); | ||
50 | } | ||
51 | if (!$found) { | ||
52 | printf STDERR "$filename:$lineno: included file '$inc' is not exported\n"; | ||
53 | $ret = 1; | ||
54 | } | ||
55 | } | ||
56 | } | ||
diff --git a/scripts/headers_install.pl b/scripts/headers_install.pl new file mode 100644 index 000000000000..68591cd08731 --- /dev/null +++ b/scripts/headers_install.pl | |||
@@ -0,0 +1,45 @@ | |||
1 | #!/usr/bin/perl | ||
2 | # | ||
3 | # headers_install prepare the listed header files for use in | ||
4 | # user space and copy the files to their destination. | ||
5 | # | ||
6 | # Usage: headers_install.pl readdir installdir arch [files...] | ||
7 | # readdir: dir to open files | ||
8 | # installdir: dir to install the files | ||
9 | # arch: current architecture | ||
10 | # arch is used to force a reinstallation when the arch | ||
11 | # changes because kbuild then detect a command line change. | ||
12 | # files: list of files to check | ||
13 | # | ||
14 | # Step in preparation for users space: | ||
15 | # 1) Drop all use of compiler.h definitions | ||
16 | # 2) Drop include of compiler.h | ||
17 | # 3) Drop all sections defined out by __KERNEL__ (using unifdef) | ||
18 | |||
19 | use strict; | ||
20 | use warnings; | ||
21 | |||
22 | my ($readdir, $installdir, $arch, @files) = @ARGV; | ||
23 | |||
24 | my $unifdef = "scripts/unifdef -U__KERNEL__"; | ||
25 | |||
26 | foreach my $file (@files) { | ||
27 | my $tmpfile = "$installdir/$file.tmp"; | ||
28 | open(my $infile, '<', "$readdir/$file") | ||
29 | or die "$readdir/$file: $!\n"; | ||
30 | open(my $outfile, '>', "$tmpfile") or die "$tmpfile: $!\n"; | ||
31 | while (my $line = <$infile>) { | ||
32 | $line =~ s/([\s(])__user\s/$1/g; | ||
33 | $line =~ s/([\s(])__force\s/$1/g; | ||
34 | $line =~ s/([\s(])__iomem\s/$1/g; | ||
35 | $line =~ s/\s__attribute_const__\s/ /g; | ||
36 | $line =~ s/\s__attribute_const__$//g; | ||
37 | $line =~ s/^#include <linux\/compiler.h>//; | ||
38 | printf $outfile "%s", $line; | ||
39 | } | ||
40 | close $outfile; | ||
41 | close $infile; | ||
42 | system $unifdef . " $tmpfile > $installdir/$file"; | ||
43 | unlink $tmpfile; | ||
44 | } | ||
45 | exit 0; | ||
diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c index fda63136ae68..9fba838c7069 100644 --- a/scripts/kconfig/conf.c +++ b/scripts/kconfig/conf.c | |||
@@ -76,7 +76,6 @@ static void check_stdin(void) | |||
76 | static int conf_askvalue(struct symbol *sym, const char *def) | 76 | static int conf_askvalue(struct symbol *sym, const char *def) |
77 | { | 77 | { |
78 | enum symbol_type type = sym_get_type(sym); | 78 | enum symbol_type type = sym_get_type(sym); |
79 | tristate val; | ||
80 | 79 | ||
81 | if (!sym_has_value(sym)) | 80 | if (!sym_has_value(sym)) |
82 | printf(_("(NEW) ")); | 81 | printf(_("(NEW) ")); |
@@ -92,15 +91,6 @@ static int conf_askvalue(struct symbol *sym, const char *def) | |||
92 | } | 91 | } |
93 | 92 | ||
94 | switch (input_mode) { | 93 | switch (input_mode) { |
95 | case set_no: | ||
96 | case set_mod: | ||
97 | case set_yes: | ||
98 | case set_random: | ||
99 | if (sym_has_value(sym)) { | ||
100 | printf("%s\n", def); | ||
101 | return 0; | ||
102 | } | ||
103 | break; | ||
104 | case ask_new: | 94 | case ask_new: |
105 | case ask_silent: | 95 | case ask_silent: |
106 | if (sym_has_value(sym)) { | 96 | if (sym_has_value(sym)) { |
@@ -112,9 +102,6 @@ static int conf_askvalue(struct symbol *sym, const char *def) | |||
112 | fflush(stdout); | 102 | fflush(stdout); |
113 | fgets(line, 128, stdin); | 103 | fgets(line, 128, stdin); |
114 | return 1; | 104 | return 1; |
115 | case set_default: | ||
116 | printf("%s\n", def); | ||
117 | return 1; | ||
118 | default: | 105 | default: |
119 | break; | 106 | break; |
120 | } | 107 | } |
@@ -128,52 +115,6 @@ static int conf_askvalue(struct symbol *sym, const char *def) | |||
128 | default: | 115 | default: |
129 | ; | 116 | ; |
130 | } | 117 | } |
131 | switch (input_mode) { | ||
132 | case set_yes: | ||
133 | if (sym_tristate_within_range(sym, yes)) { | ||
134 | line[0] = 'y'; | ||
135 | line[1] = '\n'; | ||
136 | line[2] = 0; | ||
137 | break; | ||
138 | } | ||
139 | case set_mod: | ||
140 | if (type == S_TRISTATE) { | ||
141 | if (sym_tristate_within_range(sym, mod)) { | ||
142 | line[0] = 'm'; | ||
143 | line[1] = '\n'; | ||
144 | line[2] = 0; | ||
145 | break; | ||
146 | } | ||
147 | } else { | ||
148 | if (sym_tristate_within_range(sym, yes)) { | ||
149 | line[0] = 'y'; | ||
150 | line[1] = '\n'; | ||
151 | line[2] = 0; | ||
152 | break; | ||
153 | } | ||
154 | } | ||
155 | case set_no: | ||
156 | if (sym_tristate_within_range(sym, no)) { | ||
157 | line[0] = 'n'; | ||
158 | line[1] = '\n'; | ||
159 | line[2] = 0; | ||
160 | break; | ||
161 | } | ||
162 | case set_random: | ||
163 | do { | ||
164 | val = (tristate)(rand() % 3); | ||
165 | } while (!sym_tristate_within_range(sym, val)); | ||
166 | switch (val) { | ||
167 | case no: line[0] = 'n'; break; | ||
168 | case mod: line[0] = 'm'; break; | ||
169 | case yes: line[0] = 'y'; break; | ||
170 | } | ||
171 | line[1] = '\n'; | ||
172 | line[2] = 0; | ||
173 | break; | ||
174 | default: | ||
175 | break; | ||
176 | } | ||
177 | printf("%s", line); | 118 | printf("%s", line); |
178 | return 1; | 119 | return 1; |
179 | } | 120 | } |
@@ -374,15 +315,7 @@ static int conf_choice(struct menu *menu) | |||
374 | else | 315 | else |
375 | continue; | 316 | continue; |
376 | break; | 317 | break; |
377 | case set_random: | 318 | default: |
378 | if (is_new) | ||
379 | def = (rand() % cnt) + 1; | ||
380 | case set_default: | ||
381 | case set_yes: | ||
382 | case set_mod: | ||
383 | case set_no: | ||
384 | cnt = def; | ||
385 | printf("%d\n", cnt); | ||
386 | break; | 319 | break; |
387 | } | 320 | } |
388 | 321 | ||
@@ -494,6 +427,43 @@ static void check_conf(struct menu *menu) | |||
494 | check_conf(child); | 427 | check_conf(child); |
495 | } | 428 | } |
496 | 429 | ||
430 | static void conf_do_update(void) | ||
431 | { | ||
432 | /* Update until a loop caused no more changes */ | ||
433 | do { | ||
434 | conf_cnt = 0; | ||
435 | check_conf(&rootmenu); | ||
436 | } while (conf_cnt); | ||
437 | } | ||
438 | |||
439 | static int conf_silent_update(void) | ||
440 | { | ||
441 | const char *name; | ||
442 | |||
443 | if (conf_get_changed()) { | ||
444 | name = getenv("KCONFIG_NOSILENTUPDATE"); | ||
445 | if (name && *name) { | ||
446 | fprintf(stderr, | ||
447 | _("\n*** Kernel configuration requires explicit update.\n\n")); | ||
448 | return 1; | ||
449 | } | ||
450 | conf_do_update(); | ||
451 | } | ||
452 | return 0; | ||
453 | } | ||
454 | |||
455 | static int conf_update(void) | ||
456 | { | ||
457 | rootEntry = &rootmenu; | ||
458 | conf(&rootmenu); | ||
459 | if (input_mode == ask_all) { | ||
460 | input_mode = ask_silent; | ||
461 | valid_stdin = 1; | ||
462 | } | ||
463 | conf_do_update(); | ||
464 | return 0; | ||
465 | } | ||
466 | |||
497 | int main(int ac, char **av) | 467 | int main(int ac, char **av) |
498 | { | 468 | { |
499 | int opt; | 469 | int opt; |
@@ -599,36 +569,43 @@ int main(int ac, char **av) | |||
599 | default: | 569 | default: |
600 | break; | 570 | break; |
601 | } | 571 | } |
572 | switch (input_mode) { | ||
573 | case set_no: | ||
574 | conf_set_all_new_symbols(def_no); | ||
575 | break; | ||
576 | case set_yes: | ||
577 | conf_set_all_new_symbols(def_yes); | ||
578 | break; | ||
579 | case set_mod: | ||
580 | conf_set_all_new_symbols(def_mod); | ||
581 | break; | ||
582 | case set_random: | ||
583 | conf_set_all_new_symbols(def_random); | ||
584 | break; | ||
585 | case set_default: | ||
586 | conf_set_all_new_symbols(def_default); | ||
587 | break; | ||
588 | case ask_silent: | ||
589 | case ask_new: | ||
590 | if (conf_silent_update()) | ||
591 | exit(1); | ||
592 | break; | ||
593 | case ask_all: | ||
594 | if (conf_update()) | ||
595 | exit(1); | ||
596 | break; | ||
597 | } | ||
602 | 598 | ||
603 | if (input_mode != ask_silent) { | 599 | if (conf_get_changed() && conf_write(NULL)) { |
604 | rootEntry = &rootmenu; | ||
605 | conf(&rootmenu); | ||
606 | if (input_mode == ask_all) { | ||
607 | input_mode = ask_silent; | ||
608 | valid_stdin = 1; | ||
609 | } | ||
610 | } else if (conf_get_changed()) { | ||
611 | name = getenv("KCONFIG_NOSILENTUPDATE"); | ||
612 | if (name && *name) { | ||
613 | fprintf(stderr, _("\n*** Kernel configuration requires explicit update.\n\n")); | ||
614 | return 1; | ||
615 | } | ||
616 | } else | ||
617 | goto skip_check; | ||
618 | |||
619 | do { | ||
620 | conf_cnt = 0; | ||
621 | check_conf(&rootmenu); | ||
622 | } while (conf_cnt); | ||
623 | if (conf_write(NULL)) { | ||
624 | fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n")); | 600 | fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n")); |
625 | return 1; | 601 | exit(1); |
626 | } | 602 | } |
627 | skip_check: | 603 | /* ask_silent is used during the build so we shall update autoconf. |
604 | * All other commands are only used to generate a config. | ||
605 | */ | ||
628 | if (input_mode == ask_silent && conf_write_autoconf()) { | 606 | if (input_mode == ask_silent && conf_write_autoconf()) { |
629 | fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n")); | 607 | fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n")); |
630 | return 1; | 608 | return 1; |
631 | } | 609 | } |
632 | |||
633 | return 0; | 610 | return 0; |
634 | } | 611 | } |
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index ee5fe943d58d..07597611cc50 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c | |||
@@ -812,3 +812,73 @@ void conf_set_changed_callback(void (*fn)(void)) | |||
812 | { | 812 | { |
813 | conf_changed_callback = fn; | 813 | conf_changed_callback = fn; |
814 | } | 814 | } |
815 | |||
816 | |||
817 | void conf_set_all_new_symbols(enum conf_def_mode mode) | ||
818 | { | ||
819 | struct symbol *sym, *csym; | ||
820 | struct property *prop; | ||
821 | struct expr *e; | ||
822 | int i, cnt, def; | ||
823 | |||
824 | for_all_symbols(i, sym) { | ||
825 | if (sym_has_value(sym)) | ||
826 | continue; | ||
827 | switch (sym_get_type(sym)) { | ||
828 | case S_BOOLEAN: | ||
829 | case S_TRISTATE: | ||
830 | switch (mode) { | ||
831 | case def_yes: | ||
832 | sym->def[S_DEF_USER].tri = yes; | ||
833 | break; | ||
834 | case def_mod: | ||
835 | sym->def[S_DEF_USER].tri = mod; | ||
836 | break; | ||
837 | case def_no: | ||
838 | sym->def[S_DEF_USER].tri = no; | ||
839 | break; | ||
840 | case def_random: | ||
841 | sym->def[S_DEF_USER].tri = (tristate)(rand() % 3); | ||
842 | break; | ||
843 | default: | ||
844 | continue; | ||
845 | } | ||
846 | if (!sym_is_choice(sym) || mode != def_random) | ||
847 | sym->flags |= SYMBOL_DEF_USER; | ||
848 | break; | ||
849 | default: | ||
850 | break; | ||
851 | } | ||
852 | |||
853 | } | ||
854 | |||
855 | if (modules_sym) | ||
856 | sym_calc_value(modules_sym); | ||
857 | |||
858 | if (mode != def_random) | ||
859 | return; | ||
860 | |||
861 | for_all_symbols(i, csym) { | ||
862 | if (sym_has_value(csym) || !sym_is_choice(csym)) | ||
863 | continue; | ||
864 | |||
865 | sym_calc_value(csym); | ||
866 | prop = sym_get_choice_prop(csym); | ||
867 | def = -1; | ||
868 | while (1) { | ||
869 | cnt = 0; | ||
870 | expr_list_for_each_sym(prop->expr, e, sym) { | ||
871 | if (sym->visible == no) | ||
872 | continue; | ||
873 | if (def == cnt++) { | ||
874 | csym->def[S_DEF_USER].val = sym; | ||
875 | break; | ||
876 | } | ||
877 | } | ||
878 | if (def >= 0 || cnt < 2) | ||
879 | break; | ||
880 | def = (rand() % cnt) + 1; | ||
881 | } | ||
882 | csym->flags |= SYMBOL_DEF_USER; | ||
883 | } | ||
884 | } | ||
diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h index 96521cb087ec..4a9af6f7886b 100644 --- a/scripts/kconfig/lkc.h +++ b/scripts/kconfig/lkc.h | |||
@@ -42,6 +42,14 @@ extern "C" { | |||
42 | #define TF_PARAM 0x0002 | 42 | #define TF_PARAM 0x0002 |
43 | #define TF_OPTION 0x0004 | 43 | #define TF_OPTION 0x0004 |
44 | 44 | ||
45 | enum conf_def_mode { | ||
46 | def_default, | ||
47 | def_yes, | ||
48 | def_mod, | ||
49 | def_no, | ||
50 | def_random | ||
51 | }; | ||
52 | |||
45 | #define T_OPT_MODULES 1 | 53 | #define T_OPT_MODULES 1 |
46 | #define T_OPT_DEFCONFIG_LIST 2 | 54 | #define T_OPT_DEFCONFIG_LIST 2 |
47 | #define T_OPT_ENV 3 | 55 | #define T_OPT_ENV 3 |
@@ -69,6 +77,7 @@ const char *conf_get_configname(void); | |||
69 | char *conf_get_default_confname(void); | 77 | char *conf_get_default_confname(void); |
70 | void sym_set_change_count(int count); | 78 | void sym_set_change_count(int count); |
71 | void sym_add_change_count(int count); | 79 | void sym_add_change_count(int count); |
80 | void conf_set_all_new_symbols(enum conf_def_mode mode); | ||
72 | 81 | ||
73 | /* kconfig_load.c */ | 82 | /* kconfig_load.c */ |
74 | void kconfig_load(void); | 83 | void kconfig_load(void); |
diff --git a/scripts/kernel-doc b/scripts/kernel-doc index 88e3934a8b8c..d8f77e26081c 100755 --- a/scripts/kernel-doc +++ b/scripts/kernel-doc | |||
@@ -1643,6 +1643,7 @@ sub dump_function($$) { | |||
1643 | $prototype =~ s/^__always_inline +//; | 1643 | $prototype =~ s/^__always_inline +//; |
1644 | $prototype =~ s/^noinline +//; | 1644 | $prototype =~ s/^noinline +//; |
1645 | $prototype =~ s/__devinit +//; | 1645 | $prototype =~ s/__devinit +//; |
1646 | $prototype =~ s/__init +//; | ||
1646 | $prototype =~ s/^#define\s+//; #ak added | 1647 | $prototype =~ s/^#define\s+//; #ak added |
1647 | $prototype =~ s/__attribute__\s*\(\([a-z,]*\)\)//; | 1648 | $prototype =~ s/__attribute__\s*\(\([a-z,]*\)\)//; |
1648 | 1649 | ||
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index cea4a790e1e9..4fa1f3ad2513 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c | |||
@@ -304,6 +304,14 @@ static int do_ap_entry(const char *filename, | |||
304 | return 1; | 304 | return 1; |
305 | } | 305 | } |
306 | 306 | ||
307 | /* looks like: "css:tN" */ | ||
308 | static int do_css_entry(const char *filename, | ||
309 | struct css_device_id *id, char *alias) | ||
310 | { | ||
311 | sprintf(alias, "css:t%01X", id->type); | ||
312 | return 1; | ||
313 | } | ||
314 | |||
307 | /* Looks like: "serio:tyNprNidNexN" */ | 315 | /* Looks like: "serio:tyNprNidNexN" */ |
308 | static int do_serio_entry(const char *filename, | 316 | static int do_serio_entry(const char *filename, |
309 | struct serio_device_id *id, char *alias) | 317 | struct serio_device_id *id, char *alias) |
@@ -332,11 +340,18 @@ static int do_acpi_entry(const char *filename, | |||
332 | } | 340 | } |
333 | 341 | ||
334 | /* looks like: "pnp:dD" */ | 342 | /* looks like: "pnp:dD" */ |
335 | static int do_pnp_entry(const char *filename, | 343 | static void do_pnp_device_entry(void *symval, unsigned long size, |
336 | struct pnp_device_id *id, char *alias) | 344 | struct module *mod) |
337 | { | 345 | { |
338 | sprintf(alias, "pnp:d%s*", id->id); | 346 | const unsigned long id_size = sizeof(struct pnp_device_id); |
339 | return 1; | 347 | const struct pnp_device_id *id = symval; |
348 | |||
349 | device_id_check(mod->name, "pnp", size, id_size, symval); | ||
350 | |||
351 | buf_printf(&mod->dev_table_buf, | ||
352 | "MODULE_ALIAS(\"pnp:d%s*\");\n", id->id); | ||
353 | buf_printf(&mod->dev_table_buf, | ||
354 | "MODULE_ALIAS(\"acpi*:%s:*\");\n", id->id); | ||
340 | } | 355 | } |
341 | 356 | ||
342 | /* looks like: "pnp:dD" for every device of the card */ | 357 | /* looks like: "pnp:dD" for every device of the card */ |
@@ -380,9 +395,12 @@ static void do_pnp_card_entries(void *symval, unsigned long size, | |||
380 | } | 395 | } |
381 | 396 | ||
382 | /* add an individual alias for every device entry */ | 397 | /* add an individual alias for every device entry */ |
383 | if (!dup) | 398 | if (!dup) { |
384 | buf_printf(&mod->dev_table_buf, | 399 | buf_printf(&mod->dev_table_buf, |
385 | "MODULE_ALIAS(\"pnp:d%s*\");\n", id); | 400 | "MODULE_ALIAS(\"pnp:d%s*\");\n", id); |
401 | buf_printf(&mod->dev_table_buf, | ||
402 | "MODULE_ALIAS(\"acpi*:%s:*\");\n", id); | ||
403 | } | ||
386 | } | 404 | } |
387 | } | 405 | } |
388 | } | 406 | } |
@@ -605,7 +623,7 @@ static int do_i2c_entry(const char *filename, struct i2c_device_id *id, | |||
605 | return 1; | 623 | return 1; |
606 | } | 624 | } |
607 | 625 | ||
608 | /* Ignore any prefix, eg. v850 prepends _ */ | 626 | /* Ignore any prefix, eg. some architectures prepend _ */ |
609 | static inline int sym_is(const char *symbol, const char *name) | 627 | static inline int sym_is(const char *symbol, const char *name) |
610 | { | 628 | { |
611 | const char *match; | 629 | const char *match; |
@@ -680,6 +698,10 @@ void handle_moddevtable(struct module *mod, struct elf_info *info, | |||
680 | do_table(symval, sym->st_size, | 698 | do_table(symval, sym->st_size, |
681 | sizeof(struct ap_device_id), "ap", | 699 | sizeof(struct ap_device_id), "ap", |
682 | do_ap_entry, mod); | 700 | do_ap_entry, mod); |
701 | else if (sym_is(symname, "__mod_css_device_table")) | ||
702 | do_table(symval, sym->st_size, | ||
703 | sizeof(struct css_device_id), "css", | ||
704 | do_css_entry, mod); | ||
683 | else if (sym_is(symname, "__mod_serio_device_table")) | 705 | else if (sym_is(symname, "__mod_serio_device_table")) |
684 | do_table(symval, sym->st_size, | 706 | do_table(symval, sym->st_size, |
685 | sizeof(struct serio_device_id), "serio", | 707 | sizeof(struct serio_device_id), "serio", |
@@ -689,9 +711,7 @@ void handle_moddevtable(struct module *mod, struct elf_info *info, | |||
689 | sizeof(struct acpi_device_id), "acpi", | 711 | sizeof(struct acpi_device_id), "acpi", |
690 | do_acpi_entry, mod); | 712 | do_acpi_entry, mod); |
691 | else if (sym_is(symname, "__mod_pnp_device_table")) | 713 | else if (sym_is(symname, "__mod_pnp_device_table")) |
692 | do_table(symval, sym->st_size, | 714 | do_pnp_device_entry(symval, sym->st_size, mod); |
693 | sizeof(struct pnp_device_id), "pnp", | ||
694 | do_pnp_entry, mod); | ||
695 | else if (sym_is(symname, "__mod_pnp_card_device_table")) | 715 | else if (sym_is(symname, "__mod_pnp_card_device_table")) |
696 | do_pnp_card_entries(symval, sym->st_size, mod); | 716 | do_pnp_card_entries(symval, sym->st_size, mod); |
697 | else if (sym_is(symname, "__mod_pcmcia_device_table")) | 717 | else if (sym_is(symname, "__mod_pcmcia_device_table")) |
diff --git a/scripts/mod/mk_elfconfig.c b/scripts/mod/mk_elfconfig.c index db3881f14c2d..6a96d47bd1e6 100644 --- a/scripts/mod/mk_elfconfig.c +++ b/scripts/mod/mk_elfconfig.c | |||
@@ -55,7 +55,7 @@ main(int argc, char **argv) | |||
55 | else | 55 | else |
56 | exit(1); | 56 | exit(1); |
57 | 57 | ||
58 | if ((strcmp(argv[1], "v850") == 0) || (strcmp(argv[1], "h8300") == 0) | 58 | if ((strcmp(argv[1], "h8300") == 0) |
59 | || (strcmp(argv[1], "blackfin") == 0)) | 59 | || (strcmp(argv[1], "blackfin") == 0)) |
60 | printf("#define MODULE_SYMBOL_PREFIX \"_\"\n"); | 60 | printf("#define MODULE_SYMBOL_PREFIX \"_\"\n"); |
61 | else | 61 | else |
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index a07f91aac920..8f038e6d5f98 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
@@ -1992,7 +1992,8 @@ static void read_markers(const char *fname) | |||
1992 | mod->skip = 1; | 1992 | mod->skip = 1; |
1993 | } | 1993 | } |
1994 | 1994 | ||
1995 | add_marker(mod, marker, fmt); | 1995 | if (!mod->skip) |
1996 | add_marker(mod, marker, fmt); | ||
1996 | } | 1997 | } |
1997 | return; | 1998 | return; |
1998 | fail: | 1999 | fail: |
diff --git a/scripts/setlocalversion b/scripts/setlocalversion index 1c1bdaf7348a..83b75126c9f7 100755 --- a/scripts/setlocalversion +++ b/scripts/setlocalversion | |||
@@ -12,7 +12,9 @@ cd "${1:-.}" || usage | |||
12 | if head=`git rev-parse --verify HEAD 2>/dev/null`; then | 12 | if head=`git rev-parse --verify HEAD 2>/dev/null`; then |
13 | # Do we have an untagged version? | 13 | # Do we have an untagged version? |
14 | if git name-rev --tags HEAD | grep -E '^HEAD[[:space:]]+(.*~[0-9]*|undefined)$' > /dev/null; then | 14 | if git name-rev --tags HEAD | grep -E '^HEAD[[:space:]]+(.*~[0-9]*|undefined)$' > /dev/null; then |
15 | git describe | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}' | 15 | if tag=`git describe 2>/dev/null`; then |
16 | echo $tag | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}' | ||
17 | fi | ||
16 | fi | 18 | fi |
17 | 19 | ||
18 | # Are there uncommitted changes? | 20 | # Are there uncommitted changes? |