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

Commit 2ce079f0 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'kbuild-misc-v4.15' of...

Merge tag 'kbuild-misc-v4.15' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild

Pull Kbuild misc updates from Masahiro Yamada:

 - Clean up and fix RPM package build

 - Fix a warning in DEB package build

 - Improve coccicheck script

 - Improve some semantic patches

* tag 'kbuild-misc-v4.15' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild:
  docs: dev-tools: coccinelle: delete out of date wiki reference
  coccinelle: orplus: reorganize to improve performance
  coccinelle: use exists to improve efficiency
  builddeb: Pass the kernel:debarch substvar to dpkg-genchanges
  Coccinelle: use false positive annotation
  coccinelle: fix verbose message about .cocci file being run
  coccinelle: grep Options and Requires fields more precisely
  Coccinelle: make DEBUG_FILE option more useful
  coccinelle: api: detect identical chip data arrays
  coccinelle: Improve setup_timer.cocci matching
  Coccinelle: setup_timer: improve messages from setup_timer
  kbuild: rpm-pkg: do not force -jN in submake
  kbuild: rpm-pkg: keep spec file until make mrproper
  kbuild: rpm-pkg: fix jobserver unavailable warning
  kbuild: rpm-pkg: replace $RPM_BUILD_ROOT with %{buildroot}
  kbuild: rpm-pkg: fix build error when CONFIG_MODULES is disabled
  kbuild: rpm-pkg: refactor mkspec with here doc
  kbuild: rpm-pkg: clean up mkspec
  kbuild: rpm-pkg: install vmlinux.bz2 unconditionally
  kbuild: rpm-pkg: remove ppc64 specific image handling
parents 09bd7c75 e9e716ff
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -55,6 +55,11 @@ modules.builtin
/System.map
/Module.markers

#
# RPM spec file (make rpm-pkg)
#
/*.spec

#
# Debian directory (make deb-pkg)
#
+0 −3
Original line number Diff line number Diff line
@@ -33,9 +33,6 @@ of many distributions, e.g. :
You can get the latest version released from the Coccinelle homepage at
http://coccinelle.lip6.fr/

Information and tips about Coccinelle are also provided on the wiki
pages at http://cocci.ekstranet.diku.dk/wiki/doku.php

Once you have it, run the following command::

     	./configure
+14 −12
Original line number Diff line number Diff line
@@ -123,15 +123,8 @@ run_cmd_parmap() {
	if [ $VERBOSE -ne 0 ] ; then
		echo "Running ($NPROC in parallel): $@"
	fi
	if [ "$DEBUG_FILE" != "/dev/null" -a "$DEBUG_FILE" != "" ]; then
		if [ -f $DEBUG_FILE ]; then
			echo "Debug file $DEBUG_FILE exists, bailing"
			exit
		fi
	else
		DEBUG_FILE="/dev/null"
	fi
	$@ 2>$DEBUG_FILE
	echo $@ >>$DEBUG_FILE
	$@ 2>>$DEBUG_FILE
	if [[ $? -ne 0 ]]; then
		echo "coccicheck failed"
		exit $?
@@ -176,8 +169,8 @@ OPTIONS="$OPTIONS $SPFLAGS"
coccinelle () {
    COCCI="$1"

    OPT=`grep "Option" $COCCI | cut -d':' -f2`
    REQ=`grep "Requires" $COCCI | cut -d':' -f2 | sed "s| ||"`
    OPT=`grep "Options:" $COCCI | cut -d':' -f2`
    REQ=`grep "Requires:" $COCCI | cut -d':' -f2 | sed "s| ||"`
    REQ_NUM=$(echo $REQ | ${DIR}/scripts/ld-version.sh)
    if [ "$REQ_NUM" != "0" ] ; then
	    if [ "$SPATCH_VERSION_NUM" -lt "$REQ_NUM" ] ; then
@@ -194,7 +187,7 @@ coccinelle () {

    if [ $VERBOSE -ne 0 -a $ONLINE -eq 0 ] ; then

	FILE=`echo $COCCI | sed "s|$srctree/||"`
	FILE=${COCCI#$srctree/}

	echo "Processing `basename $COCCI`"
	echo "with option(s) \"$OPT\""
@@ -247,6 +240,15 @@ coccinelle () {

}

if [ "$DEBUG_FILE" != "/dev/null" -a "$DEBUG_FILE" != "" ]; then
	if [ -f $DEBUG_FILE ]; then
		echo "Debug file $DEBUG_FILE exists, bailing"
		exit
	fi
else
	DEBUG_FILE="/dev/null"
fi

if [ "$COCCI" = "" ] ; then
    for f in `find $srctree/scripts/coccinelle/ -name '*.cocci' -type f | sort`; do
	coccinelle $f
+161 −0
Original line number Diff line number Diff line
/// Detect BQ27XXX_DATA structures with identical registers, dm registers or
/// properties.
//# Doesn't unfold macros used in register or property fields.
//# Requires OCaml scripting
///
// Confidence: High
// Copyright: (C) 2017 Julia Lawall, Inria/LIP6, GPLv2.
// URL: http://coccinelle.lip6.fr/
// Requires: 1.0.7
// Keywords: BQ27XXX_DATA

virtual report

@initialize:ocaml@
@@

let print_report p msg =
  let p = List.hd p in
  Printf.printf "%s:%d:%d-%d: %s" p.file p.line p.col p.col_end msg

@str depends on report@
type t;
identifier i,i1,i2;
expression e1,e2;
@@

t i[] = {
  ...,
  [e1] = BQ27XXX_DATA(i1,...),
  ...,
  [e2] = BQ27XXX_DATA(i2,...),
  ...,
};

@script:ocaml tocheck@
i1 << str.i1;
i2 << str.i2;
i1regs; i2regs;
i1dmregs; i2dmregs;
i1props; i2props;
@@

if not(i1 = i2)
then
  begin
    i1regs := make_ident (i1 ^ "_regs");
    i2regs := make_ident (i2 ^ "_regs");
    i1dmregs := make_ident (i1 ^ "_dm_regs");
    i2dmregs := make_ident (i2 ^ "_dm_regs");
    i1props := make_ident (i1 ^ "_props");
    i2props := make_ident (i2 ^ "_props")
  end

(* ---------------------------------------------------------------- *)

@getregs1@
typedef u8;
identifier tocheck.i1regs;
initializer list i1regs_vals;
position p1;
@@

u8 i1regs@p1[...] = { i1regs_vals, };

@getregs2@
identifier tocheck.i2regs;
initializer list i2regs_vals;
position p2;
@@

u8 i2regs@p2[...] = { i2regs_vals, };

@script:ocaml@
(_,i1regs_vals) << getregs1.i1regs_vals;
(_,i2regs_vals) << getregs2.i2regs_vals;
i1regs << tocheck.i1regs;
i2regs << tocheck.i2regs;
p1 << getregs1.p1;
p2 << getregs2.p2;
@@

if i1regs < i2regs &&
   List.sort compare i1regs_vals = List.sort compare i2regs_vals
then
  let msg =
    Printf.sprintf
      "WARNING %s and %s (line %d) are identical\n"
      i1regs i2regs (List.hd p2).line in
  print_report p1 msg

(* ---------------------------------------------------------------- *)

@getdmregs1@
identifier tocheck.i1dmregs;
initializer list i1dmregs_vals;
position p1;
@@

struct bq27xxx_dm_reg i1dmregs@p1[] = { i1dmregs_vals, };

@getdmregs2@
identifier tocheck.i2dmregs;
initializer list i2dmregs_vals;
position p2;
@@

struct bq27xxx_dm_reg i2dmregs@p2[] = { i2dmregs_vals, };

@script:ocaml@
(_,i1dmregs_vals) << getdmregs1.i1dmregs_vals;
(_,i2dmregs_vals) << getdmregs2.i2dmregs_vals;
i1dmregs << tocheck.i1dmregs;
i2dmregs << tocheck.i2dmregs;
p1 << getdmregs1.p1;
p2 << getdmregs2.p2;
@@

if i1dmregs < i2dmregs &&
   List.sort compare i1dmregs_vals = List.sort compare i2dmregs_vals
then
  let msg =
    Printf.sprintf
      "WARNING %s and %s (line %d) are identical\n"
      i1dmregs i2dmregs (List.hd p2).line in
  print_report p1 msg

(* ---------------------------------------------------------------- *)

@getprops1@
identifier tocheck.i1props;
initializer list[n1] i1props_vals;
position p1;
@@

enum power_supply_property i1props@p1[] = { i1props_vals, };

@getprops2@
identifier tocheck.i2props;
initializer list[n2] i2props_vals;
position p2;
@@

enum power_supply_property i2props@p2[] = { i2props_vals, };

@script:ocaml@
(_,i1props_vals) << getprops1.i1props_vals;
(_,i2props_vals) << getprops2.i2props_vals;
i1props << tocheck.i1props;
i2props << tocheck.i2props;
p1 << getprops1.p1;
p2 << getprops2.p2;
@@

if i1props < i2props &&
   List.sort compare i1props_vals = List.sort compare i2props_vals
then
  let msg =
    Printf.sprintf
      "WARNING %s and %s (line %d) are identical\n"
      i1props i2props (List.hd p2).line in
  print_report p1 msg
+111 −33
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@
/// and data fields
// Confidence: High
// Copyright: (C) 2016 Vaishali Thakkar, Oracle. GPLv2
// Copyright: (C) 2017 Kees Cook, Google. GPLv2
// Options: --no-includes --include-headers
// Keywords: init_timer, setup_timer

@@ -10,60 +11,123 @@ virtual context
virtual org
virtual report

// Match the common cases first to avoid Coccinelle parsing loops with
// "... when" clauses.

@match_immediate_function_data_after_init_timer
depends on patch && !context && !org && !report@
expression e, func, da;
@@

-init_timer (&e);
+setup_timer (&e, func, da);
-init_timer
+setup_timer
 ( \(&e\|e\)
+, func, da
 );
(
-\(e.function\|e->function\) = func;
-\(e.data\|e->data\) = da;
|
-\(e.data\|e->data\) = da;
-\(e.function\|e->function\) = func;
)

@match_immediate_function_data_before_init_timer
depends on patch && !context && !org && !report@
expression e, func, da;
@@

(
-\(e.function\|e->function\) = func;
-\(e.data\|e->data\) = da;
|
-\(e.data\|e->data\) = da;
-\(e.function\|e->function\) = func;
)
-init_timer
+setup_timer
 ( \(&e\|e\)
+, func, da
 );

@match_function_and_data_after_init_timer
depends on patch && !context && !org && !report@
expression e, e2, e3, e4, e5, func, da;
@@

-init_timer
+setup_timer
 ( \(&e\|e\)
+, func, da
 );
 ... when != func = e2
     when != da = e3
(
-e.function = func;
... when != da = e4
-e.data = da;
|
-e->function = func;
... when != da = e4
-e->data = da;
|
-e.data = da;
... when != func = e5
-e.function = func;
|
-e->data = da;
... when != func = e5
-e->function = func;
)

@match_function_and_data_after_init_timer
@match_function_and_data_before_init_timer
depends on patch && !context && !org && !report@
expression e1, e2, e3, e4, e5, a, b;
expression e, e2, e3, e4, e5, func, da;
@@

-init_timer (&e1);
+setup_timer (&e1, a, b);

... when != a = e2
    when != b = e3
(
-e1.function = a;
... when != b = e4
-e1.data = b;
-e.function = func;
... when != da = e4
-e.data = da;
|
-e1.data = b;
... when != a = e5
-e1.function = a;
-e->function = func;
... when != da = e4
-e->data = da;
|
-e.data = da;
... when != func = e5
-e.function = func;
|
-e->data = da;
... when != func = e5
-e->function = func;
)
... when != func = e2
    when != da = e3
-init_timer
+setup_timer
 ( \(&e\|e\)
+, func, da
 );

@r1 exists@
expression t;
identifier f;
position p;
@@

f(...) { ... when any
  init_timer@p(...)
  init_timer@p(\(&t\|t\))
  ... when any
}

@r2 exists@
expression r1.t;
identifier g != r1.f;
struct timer_list t;
expression e8;
@@

g(...) { ... when any
  t.data = e8
  \(t.data\|t->data\) = e8
  ... when any
}

@@ -77,14 +141,31 @@ p << r1.p;
cocci.include_match(False)

@r3 depends on patch && !context && !org && !report@
expression e6, e7, c;
expression r1.t, func, e7;
position r1.p;
@@

-init_timer@p (&e6);
+setup_timer (&e6, c, 0UL);
... when != c = e7
-e6.function = c;
(
-init_timer@p(&t);
+setup_timer(&t, func, 0UL);
... when != func = e7
-t.function = func;
|
-t.function = func;
... when != func = e7
-init_timer@p(&t);
+setup_timer(&t, func, 0UL);
|
-init_timer@p(t);
+setup_timer(t, func, 0UL);
... when != func = e7
-t->function = func;
|
-t->function = func;
... when != func = e7
-init_timer@p(t);
+setup_timer(t, func, 0UL);
)

// ----------------------------------------------------------------------------

@@ -104,11 +185,9 @@ position j0, j1, j2;
)

@match_function_and_data_after_init_timer_context
depends on !patch &&
!match_immediate_function_data_after_init_timer_context &&
 (context || org || report)@
depends on !patch && (context || org || report)@
expression a, b, e1, e2, e3, e4, e5;
position j0, j1, j2;
position j0 != match_immediate_function_data_after_init_timer_context.j0,j1,j2;
@@

* init_timer@j0 (&e1);
@@ -124,13 +203,12 @@ position j0, j1, j2;
* e1@j2.function = a;
)

@r3_context depends on !patch &&
!match_immediate_function_data_after_init_timer_context &&
!match_function_and_data_after_init_timer_context &&
 (context || org || report)@
@r3_context depends on !patch && (context || org || report)@
expression c, e6, e7;
position r1.p;
position j0, j1;
position j0 !=
  {match_immediate_function_data_after_init_timer_context.j0,
   match_function_and_data_after_init_timer_context.j0}, j1;
@@

* init_timer@j0@p (&e6);
Loading