checkpatch: special case extern struct in .c
[linux-2.6-block.git] / scripts / checkpatch.pl
index 880fde13d9b8c6712759cec97be1186689de043d..6aabcc1f66c1b6a713665d78000a26abb5cff9fe 100755 (executable)
@@ -74,6 +74,8 @@ my $git_command ='export LANGUAGE=en_US.UTF-8; git';
 my $tabsize = 8;
 my ${CONFIG_} = "CONFIG_";
 
+my %maybe_linker_symbol; # for externs in c exceptions, when seen in *vmlinux.lds.h
+
 sub help {
        my ($exitcode) = @_;
 
@@ -6051,6 +6053,9 @@ sub process {
 
 # check for line continuations outside of #defines, preprocessor #, and asm
 
+               } elsif ($realfile =~ m@/vmlinux.lds.h$@) {
+                   $line =~ s/(\w+)/$maybe_linker_symbol{$1}++/ge;
+                   #print "REAL: $realfile\nln: $line\nkeys:", sort keys %maybe_linker_symbol;
                } else {
                        if ($prevline !~ /^..*\\$/ &&
                            $line !~ /^\+\s*\#.*\\$/ &&         # preprocessor
@@ -7119,6 +7124,21 @@ sub process {
                                     "arguments for function declarations should follow identifier\n" . $herecurr);
                        }
 
+               } elsif ($realfile =~ /\.c$/ && defined $stat &&
+                   $stat =~ /^\+extern struct\s+(\w+)\s+(\w+)\[\];/)
+               {
+                       my ($st_type, $st_name) = ($1, $2);
+
+                       for my $s (keys %maybe_linker_symbol) {
+                           #print "Linker symbol? $st_name : $s\n";
+                           goto LIKELY_LINKER_SYMBOL
+                               if $st_name =~ /$s/;
+                       }
+                       WARN("AVOID_EXTERNS",
+                            "found a file-scoped extern type:$st_type name:$st_name in .c file\n"
+                            . "is this a linker symbol ?\n" . $herecurr);
+                 LIKELY_LINKER_SYMBOL:
+
                } elsif ($realfile =~ /\.c$/ && defined $stat &&
                    $stat =~ /^.\s*extern\s+/)
                {