Coccinelle: Add contextual message
[linux-2.6.git] / scripts / namespace.pl
index fb4e245..fd2d946 100755 (executable)
@@ -84,6 +84,84 @@ my %ksymtab = ();    # names that appear in __ksymtab_
 my %ref = ();          # $ref{$name} exists if there is a true external reference to $name
 my %export = ();       # $export{$name} exists if there is an EXPORT_... of $name
 
+my %nmexception = (
+    'fs/ext3/bitmap'                   => 1,
+    'fs/ext4/bitmap'                   => 1,
+    'arch/x86/lib/thunk_32'            => 1,
+    'arch/x86/lib/cmpxchg'             => 1,
+    'arch/x86/vdso/vdso32/note'                => 1,
+    'lib/irq_regs'                     => 1,
+    'usr/initramfs_data'               => 1,
+    'drivers/scsi/aic94xx/aic94xx_dump'        => 1,
+    'drivers/scsi/libsas/sas_dump'     => 1,
+    'lib/dec_and_lock'                 => 1,
+    'drivers/ide/ide-probe-mini'       => 1,
+    'usr/initramfs_data'               => 1,
+    'drivers/acpi/acpia/exdump'                => 1,
+    'drivers/acpi/acpia/rsdump'                => 1,
+    'drivers/acpi/acpia/nsdumpdv'      => 1,
+    'drivers/acpi/acpia/nsdump'                => 1,
+    'arch/ia64/sn/kernel/sn2/io'       => 1,
+    'arch/ia64/kernel/gate-data'       => 1,
+    'security/capability'              => 1,
+    'fs/ntfs/sysctl'                   => 1,
+    'fs/jfs/jfs_debug'                 => 1,
+);
+
+my %nameexception = (
+    'mod_use_count_'    => 1,
+    '__initramfs_end'  => 1,
+    '__initramfs_start'        => 1,
+    '_einittext'       => 1,
+    '_sinittext'       => 1,
+    'kallsyms_names'   => 1,
+    'kallsyms_num_syms'        => 1,
+    'kallsyms_addresses'=> 1,
+    '__this_module'    => 1,
+    '_etext'           => 1,
+    '_edata'           => 1,
+    '_end'             => 1,
+    '__bss_start'      => 1,
+    '_text'            => 1,
+    '_stext'           => 1,
+    '__gp'             => 1,
+    'ia64_unw_start'   => 1,
+    'ia64_unw_end'     => 1,
+    '__init_begin'     => 1,
+    '__init_end'       => 1,
+    '__bss_stop'       => 1,
+    '__nosave_begin'   => 1,
+    '__nosave_end'     => 1,
+    'pg0'              => 1,
+    'vdso_enabled'     => 1,
+    '__stack_chk_fail'  => 1,
+    'VDSO32_PRELINK'   => 1,
+    'VDSO32_vsyscall'  => 1,
+    'VDSO32_rt_sigreturn'=>1,
+    'VDSO32_sigreturn' => 1,
+);
+
+# Files with exceptions to source file location
+my %sourceloc = (
+    'net/dccp/dccp_probe.o'    => 'probe',
+    'net/dccp/dccp_ipv4.o'     => 'ipv4',
+    'net/dccp/dccp_ipv6.o'     => 'ipv6',
+    'net/dccp/dccp_diag.o'     => 'diag',
+    'drivers/char/hw_random/rng-core.o'        => 'core',
+    'fs/fat/msdos.o'           => 'namei_msdos',
+    'fs/fat/vfat.o'            => 'namei_vfat',
+    'fs/nfs_common/nfs_acl.o'  => 'nfsacl',
+    'sound/soundcore.o'                => 'sound_core',
+    'drivers/md/dm-mirror.o'   => 'dm-raid1',
+    'drivers/message/i2o/i2o_bus.o' => 'bus-osm',
+    'arch/x86/kvm/kvm-amd.o'   => 'svm',
+    'arch/x86/kvm/kvm-intel.o' => 'vmx',
+    'arch/x86/crypto/twofish-x86_64.o' => 'twofish-x86_64-asm_64',
+    'arch/x86/crypto/aes-x86_64.o' => 'aes-x86_64-asm_64',
+    'arch/x86/crypto/aesni-intel.o' => 'aesni-intel_asm',
+    'arch/x86/crypto/salsa20-x86_64.o' => 'salsa20-x86_64-asm_64',
+);
+
 &find(\&linux_objects, '.');   # find the objects and do_nm on them
 &list_multiply_defined();
 &resolve_external_references();
@@ -105,7 +183,8 @@ sub linux_objects
        if (/.*\.o$/ &&
                ! (
                m:/built-in.o$:
-               || m:arch/x86/kernel/vsyscall-syms.o$:
+               || m:arch/x86/vdso/:
+               || m:arch/x86/boot/:
                || m:arch/ia64/ia32/ia32.o$:
                || m:arch/ia64/kernel/gate-syms.o$:
                || m:arch/ia64/lib/__divdi3.o$:
@@ -148,6 +227,7 @@ sub linux_objects
                || m:^.*/\.tmp_:
                || m:^\.tmp_:
                || m:/vmlinux-obj.o$:
+               || m:^tools/:
                )
        ) {
                do_nm($basename, $_);
@@ -168,11 +248,15 @@ sub do_nm
                return;
        }
        ($source = $basename) =~ s/\.o$//;
+
+       $source = $sourceloc{$fullname} if ($sourceloc{$fullname});
+
        if (-e "$source.c" || -e "$source.S") {
                $source = "$objtree$File::Find::dir/$source";
        } else {
                $source = "$srctree$File::Find::dir/$source";
        }
+
        if (! -e "$source.c" && ! -e "$source.S") {
                # No obvious source, exclude the object if it is conglomerate
                open(my $objdumpdata, "$objdump $basename|")
@@ -214,6 +298,7 @@ sub do_nm
                # T global label/procedure
                # U external reference
                # W weak external reference to text that has been resolved
+               # V similar to W, but the value of the weak symbol becomes zero with no error.
                # a assembler equate
                # b static variable, uninitialised
                # d static variable, initialised
@@ -222,8 +307,9 @@ sub do_nm
                # s static variable, uninitialised, small bss
                # t static label/procedures
                # w weak external reference to text that has not been resolved
+               # v similar to w
                # ? undefined type, used a lot by modules
-               if ($type !~ /^[ABCDGRSTUWabdgrstw?]$/) {
+               if ($type !~ /^[ABCDGRSTUWVabdgrstwv?]$/) {
                        printf STDERR "nm output for $fullname contains unknown type '$_'\n";
                }
                elsif ($name =~ /\./) {
@@ -234,7 +320,7 @@ sub do_nm
                        # binutils keeps changing the type for exported symbols, force it to R
                        $type = 'R' if ($name =~ /^__ksymtab/ || $name =~ /^__kstrtab/);
                        $name =~ s/_R[a-f0-9]{8}$//;    # module versions adds this
-                       if ($type =~ /[ABCDGRSTW]/ &&
+                       if ($type =~ /[ABCDGRSTWV]/ &&
                                $name ne 'init_module' &&
                                $name ne 'cleanup_module' &&
                                $name ne 'Using_Versions' &&
@@ -270,27 +356,9 @@ sub do_nm
        close($nmdata);
 
        if ($#nmdata < 0) {
-               if (
-                       $fullname ne "lib/brlock.o"
-                       && $fullname ne "lib/dec_and_lock.o"
-                       && $fullname ne "fs/xfs/xfs_macros.o"
-                       && $fullname ne "drivers/ide/ide-probe-mini.o"
-                       && $fullname ne "usr/initramfs_data.o"
-                       && $fullname ne "drivers/acpi/executer/exdump.o"
-                       && $fullname ne "drivers/acpi/resources/rsdump.o"
-                       && $fullname ne "drivers/acpi/namespace/nsdumpdv.o"
-                       && $fullname ne "drivers/acpi/namespace/nsdump.o"
-                       && $fullname ne "arch/ia64/sn/kernel/sn2/io.o"
-                       && $fullname ne "arch/ia64/kernel/gate-data.o"
-                       && $fullname ne "drivers/ieee1394/oui.o"
-                       && $fullname ne "security/capability.o"
-                       && $fullname ne "sound/core/wrappers.o"
-                       && $fullname ne "fs/ntfs/sysctl.o"
-                       && $fullname ne "fs/jfs/jfs_debug.o"
-               ) {
-                       printf "No nm data for $fullname\n";
-               }
-               return;
+           printf "No nm data for $fullname\n"
+               unless $nmexception{$fullname};
+           return;
        }
        $nmdata{$fullname} = \@nmdata;
 }
@@ -319,18 +387,14 @@ sub list_multiply_defined
        foreach my $name (keys(%def)) {
                if ($#{$def{$name}} > 0) {
                        # Special case for cond_syscall
-                       if ($#{$def{$name}} == 1 && $name =~ /^sys_/ &&
-                           ($def{$name}[0] eq "kernel/sys.o" ||
-                            $def{$name}[1] eq "kernel/sys.o")) {
-                               &drop_def("kernel/sys.o", $name);
-                               next;
-                       }
-                       # Special case for i386 entry code
-                       if ($#{$def{$name}} == 1 && $name =~ /^__kernel_/ &&
-                           $def{$name}[0] eq "arch/x86/kernel/vsyscall-int80_32.o" &&
-                           $def{$name}[1] eq "arch/x86/kernel/vsyscall-sysenter_32.o") {
-                               &drop_def("arch/x86/kernel/vsyscall-sysenter_32.o", $name);
-                               next;
+                       if ($#{$def{$name}} == 1 &&
+                          ($name =~ /^sys_/ || $name =~ /^compat_sys_/ ||
+                           $name =~ /^sys32_/)) {
+                               if($def{$name}[0] eq "kernel/sys_ni.o" ||
+                                  $def{$name}[1] eq "kernel/sys_ni.o") {
+                                       &drop_def("kernel/sys_ni.o", $name);
+                                       next;
+                               }
                        }
 
                        printf "$name is multiply defined in :-\n";
@@ -372,31 +436,7 @@ sub resolve_external_references
                                                $ref{$name} = ""
                                        }
                                }
-                               elsif (    $name ne "mod_use_count_"
-                                       && $name ne "__initramfs_end"
-                                       && $name ne "__initramfs_start"
-                                       && $name ne "_einittext"
-                                       && $name ne "_sinittext"
-                                       && $name ne "kallsyms_names"
-                                       && $name ne "kallsyms_num_syms"
-                                       && $name ne "kallsyms_addresses"
-                                       && $name ne "__this_module"
-                                       && $name ne "_etext"
-                                       && $name ne "_edata"
-                                       && $name ne "_end"
-                                       && $name ne "__bss_start"
-                                       && $name ne "_text"
-                                       && $name ne "_stext"
-                                       && $name ne "__gp"
-                                       && $name ne "ia64_unw_start"
-                                       && $name ne "ia64_unw_end"
-                                       && $name ne "__init_begin"
-                                       && $name ne "__init_end"
-                                       && $name ne "__bss_stop"
-                                       && $name ne "__nosave_begin"
-                                       && $name ne "__nosave_end"
-                                       && $name ne "pg0"
-                                       && $name ne "__module_text_address"
+                               elsif ( ! $nameexception{$name}
                                        && $name !~ /^__sched_text_/
                                        && $name !~ /^__start_/
                                        && $name !~ /^__end_/
@@ -407,7 +447,6 @@ sub resolve_external_references
                                        && $name !~ /^__.*per_cpu_end/
                                        && $name !~ /^__alt_instructions/
                                        && $name !~ /^__setup_/
-                                       && $name !~ /^jiffies/
                                        && $name !~ /^__mod_timer/
                                        && $name !~ /^__mod_page_state/
                                        && $name !~ /^init_module/