Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 321d03c8 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull misc kbuild changes from Michal Marek:
 "Here is the non-critical part of kbuild:
   - One bogus coccinelle check removed, one check fixed not to suggest
     the obsolete PTR_RET macro
   - scripts/tags.sh does not index the generated *.mod.c files
   - new objdiff tool to list differences between two versions of an
     object file
   - A fix for scripts/bootgraph.pl"

* 'misc' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild:
  scripts/coccinelle: Use PTR_ERR_OR_ZERO
  scripts/bootgraph.pl: Add graphic header
  scripts: objdiff: detect object code changes between two commits
  Coccicheck: Remove memcpy to struct assignment test
  scripts/tags.sh: Ignore *.mod.c
parents fd1232b2 f23a9fa7
Loading
Loading
Loading
Loading
+4 −3
Original line number Original line Diff line number Diff line
@@ -428,8 +428,9 @@ export MODVERDIR := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/).tmp_ve


# Files to ignore in find ... statements
# Files to ignore in find ... statements


RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o -name CVS \
export RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o    \
		   -o -name .pc -o -name .hg -o -name .git \) -prune -o
			  -name CVS -o -name .pc -o -name .hg -o -name .git \) \
			  -prune -o
export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn \
export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn \
			 --exclude CVS --exclude .pc --exclude .hg --exclude .git
			 --exclude CVS --exclude .pc --exclude .hg --exclude .git


@@ -1103,7 +1104,7 @@ CLEAN_DIRS += $(MODVERDIR)


# Directories & files removed with 'make mrproper'
# Directories & files removed with 'make mrproper'
MRPROPER_DIRS  += include/config usr/include include/generated          \
MRPROPER_DIRS  += include/config usr/include include/generated          \
                  arch/*/include/generated
                  arch/*/include/generated .tmp_objdiff
MRPROPER_FILES += .config .config.old .version .old_version $(version_h) \
MRPROPER_FILES += .config .config.old .version .old_version $(version_h) \
		  Module.symvers tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS \
		  Module.symvers tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS \
		  signing_key.priv signing_key.x509 x509.genkey		\
		  signing_key.priv signing_key.x509 x509.genkey		\
+40 −2
Original line number Original line Diff line number Diff line
@@ -38,6 +38,31 @@
#
#


use strict;
use strict;
use Getopt::Long;
my $header = 0;

sub help {
	my $text = << "EOM";
Usage:
1) dmesg | perl scripts/bootgraph.pl [OPTION] > output.svg
2) perl scripts/bootgraph.pl -h

Options:
	-header	Insert kernel version and date
EOM
	my $std=shift;
	if ($std == 1) {
		print STDERR $text;
	} else {
		print $text;
	}
	exit;
}

GetOptions(
	'h|help'	=>\&help,
	'header'	=>\$header
);


my %start;
my %start;
my %end;
my %end;
@@ -49,6 +74,11 @@ my $count = 0;
my %pids;
my %pids;
my %pidctr;
my %pidctr;


my $headerstep = 20;
my $xheader = 15;
my $yheader = 25;
my $cyheader = 0;

while (<>) {
while (<>) {
	my $line = $_;
	my $line = $_;
	if ($line =~ /([0-9\.]+)\] calling  ([a-zA-Z0-9\_\.]+)\+/) {
	if ($line =~ /([0-9\.]+)\] calling  ([a-zA-Z0-9\_\.]+)\+/) {
@@ -112,15 +142,23 @@ if ($count == 0) {
    print STDERR <<END;
    print STDERR <<END;
No data found in the dmesg. Make sure that 'printk.time=1' and
No data found in the dmesg. Make sure that 'printk.time=1' and
'initcall_debug' are passed on the kernel command line.
'initcall_debug' are passed on the kernel command line.
Usage:
      dmesg | perl scripts/bootgraph.pl > output.svg
END
END
	help(1);
    exit 1;
    exit 1;
}
}


print "<?xml version=\"1.0\" standalone=\"no\"?> \n";
print "<?xml version=\"1.0\" standalone=\"no\"?> \n";
print "<svg width=\"2000\" height=\"100%\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n";
print "<svg width=\"2000\" height=\"100%\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n";



if ($header) {
	my $version = `uname -a`;
	my $date = `date`;
	print "<text transform=\"translate($xheader,$yheader)\">Kernel version: $version</text>\n";
	$cyheader = $yheader+$headerstep;
	print "<text transform=\"translate($xheader,$cyheader)\">Date: $date</text>\n";
}

my @styles;
my @styles;


$styles[0] = "fill:rgb(0,0,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)";
$styles[0] = "fill:rgb(0,0,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)";
+7 −7
Original line number Original line Diff line number Diff line
@@ -7,7 +7,7 @@
// URL: http://coccinelle.lip6.fr/
// URL: http://coccinelle.lip6.fr/
// Options: --no-includes --include-headers
// Options: --no-includes --include-headers
//
//
// Keywords: ERR_PTR, PTR_ERR, PTR_RET, PTR_ERR_OR_ZERO
// Keywords: ERR_PTR, PTR_ERR, PTR_ERR_OR_ZERO
// Version min: 2.6.39
// Version min: 2.6.39
//
//


@@ -62,35 +62,35 @@ position p3;
p << r1.p1;
p << r1.p1;
@@
@@


coccilib.org.print_todo(p[0], "WARNING: PTR_RET can be used")
coccilib.org.print_todo(p[0], "WARNING: PTR_ERR_OR_ZERO can be used")




@script:python depends on org@
@script:python depends on org@
p << r2.p2;
p << r2.p2;
@@
@@


coccilib.org.print_todo(p[0], "WARNING: PTR_RET can be used")
coccilib.org.print_todo(p[0], "WARNING: PTR_ERR_OR_ZERO can be used")


@script:python depends on org@
@script:python depends on org@
p << r3.p3;
p << r3.p3;
@@
@@


coccilib.org.print_todo(p[0], "WARNING: PTR_RET can be used")
coccilib.org.print_todo(p[0], "WARNING: PTR_ERR_OR_ZERO can be used")


@script:python depends on report@
@script:python depends on report@
p << r1.p1;
p << r1.p1;
@@
@@


coccilib.report.print_report(p[0], "WARNING: PTR_RET can be used")
coccilib.report.print_report(p[0], "WARNING: PTR_ERR_OR_ZERO can be used")


@script:python depends on report@
@script:python depends on report@
p << r2.p2;
p << r2.p2;
@@
@@


coccilib.report.print_report(p[0], "WARNING: PTR_RET can be used")
coccilib.report.print_report(p[0], "WARNING: PTR_ERR_OR_ZERO can be used")


@script:python depends on report@
@script:python depends on report@
p << r3.p3;
p << r3.p3;
@@
@@


coccilib.report.print_report(p[0], "WARNING: PTR_RET can be used")
coccilib.report.print_report(p[0], "WARNING: PTR_ERR_OR_ZERO can be used")
+0 −103
Original line number Original line Diff line number Diff line
//
// Replace memcpy with struct assignment.
//
// Confidence: High
// Copyright: (C) 2012 Peter Senna Tschudin, INRIA/LIP6.  GPLv2.
// URL: http://coccinelle.lip6.fr/
// Comments:
// Options: --no-includes --include-headers

virtual patch
virtual report
virtual context
virtual org

@r1 depends on !patch@
identifier struct_name;
struct struct_name to;
struct struct_name from;
struct struct_name *top;
struct struct_name *fromp;
position p;
@@
memcpy@p(\(&(to)\|top\), \(&(from)\|fromp\), \(sizeof(to)\|sizeof(from)\|sizeof(struct struct_name)\|sizeof(*top)\|sizeof(*fromp)\))

@script:python depends on report@
p << r1.p;
@@
coccilib.report.print_report(p[0],"Replace memcpy with struct assignment")

@depends on context@
position r1.p;
@@
*memcpy@p(...);

@script:python depends on org@
p << r1.p;
@@
cocci.print_main("Replace memcpy with struct assignment",p)

@depends on patch@
identifier struct_name;
struct struct_name to;
struct struct_name from;
@@
(
-memcpy(&(to), &(from), sizeof(to));
+to = from;
|
-memcpy(&(to), &(from), sizeof(from));
+to = from;
|
-memcpy(&(to), &(from), sizeof(struct struct_name));
+to = from;
)

@depends on patch@
identifier struct_name;
struct struct_name to;
struct struct_name *from;
@@
(
-memcpy(&(to), from, sizeof(to));
+to = *from;
|
-memcpy(&(to), from, sizeof(*from));
+to = *from;
|
-memcpy(&(to), from, sizeof(struct struct_name));
+to = *from;
)

@depends on patch@
identifier struct_name;
struct struct_name *to;
struct struct_name from;
@@
(
-memcpy(to, &(from), sizeof(*to));
+ *to = from;
|
-memcpy(to, &(from), sizeof(from));
+ *to = from;
|
-memcpy(to, &(from), sizeof(struct struct_name));
+ *to = from;
)

@depends on patch@
identifier struct_name;
struct struct_name *to;
struct struct_name *from;
@@
(
-memcpy(to, from, sizeof(*to));
+ *to = *from;
|
-memcpy(to, from, sizeof(*from));
+ *to = *from;
|
-memcpy(to, from, sizeof(struct struct_name));
+ *to = *from;
)

scripts/objdiff

0 → 100755
+141 −0
Original line number Original line Diff line number Diff line
#!/bin/bash

# objdiff - a small script for validating that a commit or series of commits
# didn't change object code.
#
# Copyright 2014, Jason Cooper <jason@lakedaemon.net>
#
# Licensed under the terms of the GNU GPL version 2

# usage example:
#
# $ git checkout COMMIT_A
# $ <your fancy build command here>
# $ ./scripts/objdiff record path/to/*.o
#
# $ git checkout COMMIT_B
# $ <your fancy build command here>
# $ ./scripts/objdiff record path/to/*.o
#
# $ ./scripts/objdiff diff COMMIT_A COMMIT_B
# $

# And to clean up (everything is in .tmp_objdiff/*)
# $ ./scripts/objdiff clean all
#
# Note: 'make mrproper' will also remove .tmp_objdiff

GIT_DIR="`git rev-parse --git-dir`"

if [ -d "$GIT_DIR" ]; then
	TMPD="${GIT_DIR%git}tmp_objdiff"

	[ -d "$TMPD" ] || mkdir "$TMPD"
else
	echo "ERROR: git directory not found."
	exit 1
fi

usage() {
	echo "Usage: $0 <command> <args>"
	echo "  record    <list of object files>"
	echo "  diff      <commitA> <commitB>"
	echo "  clean     all | <commit>"
	exit 1
}

dorecord() {
	[ $# -eq 0 ] && usage

	FILES="$*"

	CMT="`git rev-parse --short HEAD`"

	OBJDUMP="${CROSS_COMPILE}objdump"
	OBJDIFFD="$TMPD/$CMT"

	[ ! -d "$OBJDIFFD" ] && mkdir -p "$OBJDIFFD"

	for f in $FILES; do
		dn="${f%/*}"
		bn="${f##*/}"

		[ ! -d "$OBJDIFFD/$dn" ] && mkdir -p "$OBJDIFFD/$dn"

		# remove addresses for a more clear diff
		# http://dummdida.tumblr.com/post/60924060451/binary-diff-between-libc-from-scientificlinux-and
		$OBJDUMP -D "$f" | sed "s/^[[:space:]]\+[0-9a-f]\+//" \
			>"$OBJDIFFD/$dn/$bn"
	done
}

dodiff() {
	[ $# -ne 2 ] && [ $# -ne 0 ] && usage

	if [ $# -eq 0 ]; then
		SRC="`git rev-parse --short HEAD^`"
		DST="`git rev-parse --short HEAD`"
	else
		SRC="`git rev-parse --short $1`"
		DST="`git rev-parse --short $2`"
	fi

	DIFF="`which colordiff`"

	if [ ${#DIFF} -eq 0 ] || [ ! -x "$DIFF" ]; then
		DIFF="`which diff`"
	fi

	SRCD="$TMPD/$SRC"
	DSTD="$TMPD/$DST"

	if [ ! -d "$SRCD" ]; then
		echo "ERROR: $SRCD doesn't exist"
		exit 1
	fi

	if [ ! -d "$DSTD" ]; then
		echo "ERROR: $DSTD doesn't exist"
		exit 1
	fi

	$DIFF -Nurd $SRCD $DSTD
}

doclean() {
	[ $# -eq 0 ] && usage
	[ $# -gt 1 ] && usage

	if [ "x$1" = "xall" ]; then
		rm -rf $TMPD/*
	else
		CMT="`git rev-parse --short $1`"

		if [ -d "$TMPD/$CMT" ]; then
			rm -rf $TMPD/$CMT
		else
			echo "$CMT not found"
		fi
	fi
}

[ $# -eq 0 ] &&	usage

case "$1" in
	record)
		shift
		dorecord $*
		;;
	diff)
		shift
		dodiff $*
		;;
	clean)
		shift
		doclean $*
		;;
	*)
		echo "Unrecognized command '$1'"
		exit 1
		;;
esac
Loading