summaryrefslogtreecommitdiff
path: root/tools/objtool/tests/generic/test-checksum-debug.sh
blob: 78856b1916362a0fa8f4661fb08640c9e87cd6d5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# "klp checksum --debug-checksum" prints a per-instruction checksum stream,
# and klp-build -f (--show-first-changed) parses it to report where a function
# first differs between the original and patched builds.
#
# It is a debugging aid, so nothing fails when it breaks: klp-build greps the
# stream, and an unmatched grep just yields no output, which reads as "no
# instruction changed".  That is exactly how the format drifted out from under
# it once already.  Pin the shape klp-build depends on:
#
#   DEBUG: <object>: checksum: <func>(): <sym>+0x<offset> <16 hex digits>
#
# and that --dry-run leaves the object alone, since klp-build runs this against
# objects it is going to checksum again for real.

. "$(dirname "$0")/../lib.sh"

setup
build_pair basic.c

before="$(md5sum < "$workdir/orig.o")"

"$OBJTOOL" klp checksum --dry-run --debug-checksum=changed \
	"$workdir/orig.o" > "$workdir/debug.log" 2>&1 ||
	fail "klp checksum --debug-checksum failed"

# --dry-run has to mean it: klp-build checksums these objects again afterwards,
# and "already has .discard.sym_checksum, skipping" would lose the real run.
[ "$(md5sum < "$workdir/orig.o")" = "$before" ] ||
	fail "--dry-run modified the object"
has_input_section orig.o .discard.sym_checksum &&
	fail "--dry-run created .discard.sym_checksum"

grep -qE '^DEBUG: .*: checksum: changed\(\): [^ ]+\+0x[0-9a-f]+ [0-9a-f]{16}$' \
	"$workdir/debug.log" ||
	fail "unexpected --debug-checksum format: $(head -1 "$workdir/debug.log")"

# This is the pattern klp-build greps with.  Keep it working verbatim.
grep -qE "^DEBUG: .*checksum: changed\(\): " "$workdir/debug.log" ||
	fail "klp-build's --show-first-changed pattern no longer matches"

# Only the requested function, or klp-build attributes instructions to the
# wrong one.
grep -qE 'checksum: untouched\(\)' "$workdir/debug.log" &&
	fail "--debug-checksum=changed also dumped untouched()"

pass "--debug-checksum format is the one klp-build -f parses"