| 
									
										
										
										
											2020-12-09 11:50:17 +00:00
										 |  |  | #!/usr/bin/env python3 | 
					
						
							| 
									
										
										
										
											2006-01-08 09:05:19 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # Copyright 2004 Matt Mackall <mpm@selenic.com> | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # inspired by perl Bloat-O-Meter (c) 1997 by Andi Kleen | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This software may be used and distributed according to the terms | 
					
						
							|  |  |  | # of the GNU General Public License, incorporated herein by reference. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import sys, os, re | 
					
						
							| 
									
										
										
										
											2016-11-10 18:46:13 +00:00
										 |  |  | from signal import signal, SIGPIPE, SIG_DFL | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | signal(SIGPIPE, SIG_DFL) | 
					
						
							| 
									
										
										
										
											2006-01-08 09:05:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 01:31:14 +00:00
										 |  |  | if len(sys.argv) < 3: | 
					
						
							|  |  |  |     sys.stderr.write("usage: %s [option] file1 file2\n" % sys.argv[0]) | 
					
						
							|  |  |  |     sys.stderr.write("The options are:\n") | 
					
						
							| 
									
										
										
										
											2018-02-14 17:47:18 +00:00
										 |  |  |     sys.stderr.write("-c	categorize output based on symbol type\n") | 
					
						
							| 
									
										
										
										
											2017-11-16 01:31:14 +00:00
										 |  |  |     sys.stderr.write("-d	Show delta of Data Section\n") | 
					
						
							|  |  |  |     sys.stderr.write("-t	Show delta of text Section\n") | 
					
						
							| 
									
										
										
										
											2006-01-08 09:05:19 +00:00
										 |  |  |     sys.exit(-1) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-13 00:40:48 +00:00
										 |  |  | re_NUMBER = re.compile(r'\.[0-9]+') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 01:31:14 +00:00
										 |  |  | def getsizes(file, format): | 
					
						
							| 
									
										
										
										
											2006-01-08 09:05:19 +00:00
										 |  |  |     sym = {} | 
					
						
							| 
									
										
										
										
											2016-12-13 00:40:45 +00:00
										 |  |  |     with os.popen("nm --size-sort " + file) as f: | 
					
						
							|  |  |  |         for line in f: | 
					
						
							| 
									
										
										
										
											2020-08-07 06:17:32 +00:00
										 |  |  |             if line.startswith("\n") or ":" in line: | 
					
						
							|  |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2016-12-13 00:40:45 +00:00
										 |  |  |             size, type, name = line.split() | 
					
						
							| 
									
										
										
										
											2017-11-16 01:31:14 +00:00
										 |  |  |             if type in format: | 
					
						
							| 
									
										
										
										
											2016-12-13 00:40:45 +00:00
										 |  |  |                 # strip generated symbols | 
					
						
							|  |  |  |                 if name.startswith("__mod_"): continue | 
					
						
							| 
									
										
										
										
											2018-04-09 10:51:42 +00:00
										 |  |  |                 if name.startswith("__se_sys"): continue | 
					
						
							| 
									
										
											  
											
												syscalls/core, syscalls/x86: Clean up compat syscall stub naming convention
Tidy the naming convention for compat syscall subs. Hints which describe
the purpose of the stub go in front and receive a double underscore to
denote that they are generated on-the-fly by the COMPAT_SYSCALL_DEFINEx()
macro.
For the generic case, this means:
t            kernel_waitid	# common C function (see kernel/exit.c)
    __do_compat_sys_waitid	# inlined helper doing the actual work
				# (takes original parameters as declared)
T   __se_compat_sys_waitid	# sign-extending C function calling inlined
				# helper (takes parameters of type long,
				# casts them to unsigned long and then to
				# the declared type)
T        compat_sys_waitid      # alias to __se_compat_sys_waitid()
				# (taking parameters as declared), to
				# be included in syscall table
For x86, the naming is as follows:
t            kernel_waitid	# common C function (see kernel/exit.c)
    __do_compat_sys_waitid	# inlined helper doing the actual work
				# (takes original parameters as declared)
t   __se_compat_sys_waitid      # sign-extending C function calling inlined
				# helper (takes parameters of type long,
				# casts them to unsigned long and then to
				# the declared type)
T __ia32_compat_sys_waitid	# IA32_EMULATION 32-bit-ptregs -> C stub,
				# calls __se_compat_sys_waitid(); to be
				# included in syscall table
T  __x32_compat_sys_waitid	# x32 64-bit-ptregs -> C stub, calls
				# __se_compat_sys_waitid(); to be included
				# in syscall table
If only one of IA32_EMULATION and x32 is enabled, __se_compat_sys_waitid()
may be inlined into the stub __{ia32,x32}_compat_sys_waitid().
Suggested-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/20180409105145.5364-3-linux@dominikbrodowski.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>
											
										 
											2018-04-09 10:51:43 +00:00
										 |  |  |                 if name.startswith("__se_compat_sys"): continue | 
					
						
							| 
									
										
										
										
											2018-12-28 08:31:18 +00:00
										 |  |  |                 if name.startswith("__addressable_"): continue | 
					
						
							| 
									
										
										
										
											2016-12-13 00:40:45 +00:00
										 |  |  |                 if name == "linux_banner": continue | 
					
						
							|  |  |  |                 # statics and some other optimizations adds random .NUMBER | 
					
						
							| 
									
										
										
										
											2016-12-13 00:40:48 +00:00
										 |  |  |                 name = re_NUMBER.sub('', name) | 
					
						
							| 
									
										
										
										
											2016-12-13 00:40:45 +00:00
										 |  |  |                 sym[name] = sym.get(name, 0) + int(size, 16) | 
					
						
							| 
									
										
										
										
											2006-01-08 09:05:19 +00:00
										 |  |  |     return sym | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 01:31:14 +00:00
										 |  |  | def calc(oldfile, newfile, format): | 
					
						
							|  |  |  |     old = getsizes(oldfile, format) | 
					
						
							|  |  |  |     new = getsizes(newfile, format) | 
					
						
							|  |  |  |     grow, shrink, add, remove, up, down = 0, 0, 0, 0, 0, 0 | 
					
						
							|  |  |  |     delta, common = [], {} | 
					
						
							|  |  |  |     otot, ntot = 0, 0 | 
					
						
							| 
									
										
										
										
											2006-01-08 09:05:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 01:31:14 +00:00
										 |  |  |     for a in old: | 
					
						
							|  |  |  |         if a in new: | 
					
						
							|  |  |  |             common[a] = 1 | 
					
						
							| 
									
										
										
										
											2006-01-08 09:05:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 01:31:14 +00:00
										 |  |  |     for name in old: | 
					
						
							|  |  |  |         otot += old[name] | 
					
						
							|  |  |  |         if name not in common: | 
					
						
							|  |  |  |             remove += 1 | 
					
						
							|  |  |  |             down += old[name] | 
					
						
							|  |  |  |             delta.append((-old[name], name)) | 
					
						
							| 
									
										
										
										
											2006-01-08 09:05:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 01:31:14 +00:00
										 |  |  |     for name in new: | 
					
						
							|  |  |  |         ntot += new[name] | 
					
						
							|  |  |  |         if name not in common: | 
					
						
							|  |  |  |             add += 1 | 
					
						
							|  |  |  |             up += new[name] | 
					
						
							|  |  |  |             delta.append((new[name], name)) | 
					
						
							| 
									
										
										
										
											2006-01-08 09:05:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 01:31:14 +00:00
										 |  |  |     for name in common: | 
					
						
							| 
									
										
										
										
											2006-01-08 09:05:19 +00:00
										 |  |  |         d = new.get(name, 0) - old.get(name, 0) | 
					
						
							|  |  |  |         if d>0: grow, up = grow+1, up+d | 
					
						
							|  |  |  |         if d<0: shrink, down = shrink+1, down-d | 
					
						
							|  |  |  |         delta.append((d, name)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 01:31:14 +00:00
										 |  |  |     delta.sort() | 
					
						
							|  |  |  |     delta.reverse() | 
					
						
							|  |  |  |     return grow, shrink, add, remove, up, down, delta, old, new, otot, ntot | 
					
						
							| 
									
										
										
										
											2006-01-08 09:05:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 01:31:14 +00:00
										 |  |  | def print_result(symboltype, symbolformat, argc): | 
					
						
							|  |  |  |     grow, shrink, add, remove, up, down, delta, old, new, otot, ntot = \ | 
					
						
							|  |  |  |     calc(sys.argv[argc - 1], sys.argv[argc], symbolformat) | 
					
						
							| 
									
										
										
										
											2016-05-20 00:09:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 01:31:14 +00:00
										 |  |  |     print("add/remove: %s/%s grow/shrink: %s/%s up/down: %s/%s (%s)" % \ | 
					
						
							|  |  |  |           (add, remove, grow, shrink, up, -down, up-down)) | 
					
						
							|  |  |  |     print("%-40s %7s %7s %+7s" % (symboltype, "old", "new", "delta")) | 
					
						
							|  |  |  |     for d, n in delta: | 
					
						
							|  |  |  |         if d: print("%-40s %7s %7s %+7d" % (n, old.get(n,"-"), new.get(n,"-"), d)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-30 00:11:05 +00:00
										 |  |  |     if otot: | 
					
						
							|  |  |  |         percent = (ntot - otot) * 100.0 / otot | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         percent = 0 | 
					
						
							|  |  |  |     print("Total: Before=%d, After=%d, chg %+.2f%%" % (otot, ntot, percent)) | 
					
						
							| 
									
										
										
										
											2017-11-16 01:31:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if sys.argv[1] == "-c": | 
					
						
							|  |  |  |     print_result("Function", "tT", 3) | 
					
						
							|  |  |  |     print_result("Data", "dDbB", 3) | 
					
						
							|  |  |  |     print_result("RO Data", "rR", 3) | 
					
						
							|  |  |  | elif sys.argv[1] == "-d": | 
					
						
							|  |  |  |     print_result("Data", "dDbBrR", 3) | 
					
						
							|  |  |  | elif sys.argv[1] == "-t": | 
					
						
							|  |  |  |     print_result("Function", "tT", 3) | 
					
						
							|  |  |  | else: | 
					
						
							|  |  |  |     print_result("Function", "tTdDbBrR", 2) |