xref: /linux/tools/objtool/tests/generic/test-thinlto-local.sh (revision 7fd24723f1601340ee09bca93989bd1fb4515783)
1*7fd24723SPuranjay Mohan#!/bin/bash
2*7fd24723SPuranjay Mohan# SPDX-License-Identifier: GPL-2.0
3*7fd24723SPuranjay Mohan#
4*7fd24723SPuranjay Mohan# Correlating ThinLTO-promoted locals requires demangling the .llvm.<hash>
5*7fd24723SPuranjay Mohan# suffix, and the resulting klp relocation must name the original symbol: that
6*7fd24723SPuranjay Mohan# is the one in the running kernel's kallsyms.
7*7fd24723SPuranjay Mohan
8*7fd24723SPuranjay Mohan. "$(dirname "$0")/../lib.sh"
9*7fd24723SPuranjay Mohan
10*7fd24723SPuranjay Mohansetup
11*7fd24723SPuranjay Mohanclang_only "ThinLTO requires clang"
12*7fd24723SPuranjay Mohan
13*7fd24723SPuranjay Mohanfind_thinlto_toolchain ||
14*7fd24723SPuranjay Mohan	probe_skip "no matching clang/lld pair for a ThinLTO link; set THIN_LD to one"
15*7fd24723SPuranjay Mohan
16*7fd24723SPuranjay Mohanbuild_thinlto()		# $1 output object, $2 extra flags
17*7fd24723SPuranjay Mohan{
18*7fd24723SPuranjay Mohan	$THIN_CC -flto=thin -O2 -ffunction-sections -fdata-sections $2 \
19*7fd24723SPuranjay Mohan		-c "$FIXTURES_DIR/thinlto_local.c" -o "$workdir/tu_a.o" 2>/dev/null || return 1
20*7fd24723SPuranjay Mohan	$THIN_CC -flto=thin -O2 -ffunction-sections -fdata-sections $2 -DTU_B \
21*7fd24723SPuranjay Mohan		-c "$FIXTURES_DIR/thinlto_local.c" -o "$workdir/tu_b.o" 2>/dev/null || return 1
22*7fd24723SPuranjay Mohan	"$THIN_LD" -r "$workdir/tu_a.o" "$workdir/tu_b.o" -o "$1" 2>/dev/null || return 1
23*7fd24723SPuranjay Mohan}
24*7fd24723SPuranjay Mohan
25*7fd24723SPuranjay Mohanbuild_thinlto "$workdir/orig.o" "" ||
26*7fd24723SPuranjay Mohan	probe_skip "ThinLTO build failed ($THIN_CC, $THIN_LD)"
27*7fd24723SPuranjay Mohanbuild_thinlto "$workdir/patched.o" -DPATCHED ||
28*7fd24723SPuranjay Mohan	probe_skip "ThinLTO build failed ($THIN_CC, $THIN_LD)"
29*7fd24723SPuranjay Mohan
30*7fd24723SPuranjay Mohanorig_sym="$(in_symbols orig.o    | grep -o 'counter\.llvm\.[0-9]*' | head -1)"
31*7fd24723SPuranjay Mohannew_sym="$( in_symbols patched.o | grep -o 'counter\.llvm\.[0-9]*' | head -1)"
32*7fd24723SPuranjay Mohan
33*7fd24723SPuranjay Mohan[ -n "$orig_sym" ] && [ -n "$new_sym" ] ||
34*7fd24723SPuranjay Mohan	probe_skip "$THIN_CC did not promote the local symbol"
35*7fd24723SPuranjay Mohan
36*7fd24723SPuranjay Mohan# Equal hashes would make plain name matching work, testing nothing.
37*7fd24723SPuranjay Mohan[ "$orig_sym" != "$new_sym" ] ||
38*7fd24723SPuranjay Mohan	probe_skip "$THIN_CC gave the same ThinLTO hash for both builds"
39*7fd24723SPuranjay Mohan
40*7fd24723SPuranjay Mohanrun_diff
41*7fd24723SPuranjay Mohanassert_patched target
42*7fd24723SPuranjay Mohan
43*7fd24723SPuranjay Mohanout_symbols | grep -q "\.klp\.sym\.vmlinux\.$orig_sym," ||
44*7fd24723SPuranjay Mohan	fail "expected a klp relocation naming $orig_sym"
45*7fd24723SPuranjay Mohanout_symbols | grep -q "\.klp\.sym\.vmlinux\.$new_sym," &&
46*7fd24723SPuranjay Mohan	fail "klp relocation names $new_sym, which the running kernel does not have"
47*7fd24723SPuranjay Mohan
48*7fd24723SPuranjay Mohanpass "ThinLTO-mangled local correlated across differing hashes ($THIN_CC, $THIN_LD)"
49