xref: /netbsd-src/tests/usr.bin/xlint/lint1/t_integration.sh (revision ecb2cf6da722715f61ec55105a651b69a965f0e4)
1*ecb2cf6dSrillig# $NetBSD: t_integration.sh,v 1.85 2025/01/03 02:14:52 rillig Exp $
228604916Sjruoho#
328604916Sjruoho# Copyright (c) 2008, 2010 The NetBSD Foundation, Inc.
428604916Sjruoho# All rights reserved.
528604916Sjruoho#
628604916Sjruoho# Redistribution and use in source and binary forms, with or without
728604916Sjruoho# modification, are permitted provided that the following conditions
828604916Sjruoho# are met:
928604916Sjruoho# 1. Redistributions of source code must retain the above copyright
1028604916Sjruoho#    notice, this list of conditions and the following disclaimer.
1128604916Sjruoho# 2. Redistributions in binary form must reproduce the above copyright
1228604916Sjruoho#    notice, this list of conditions and the following disclaimer in the
1328604916Sjruoho#    documentation and/or other materials provided with the distribution.
1428604916Sjruoho#
1528604916Sjruoho# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
1628604916Sjruoho# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
1728604916Sjruoho# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1828604916Sjruoho# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
1928604916Sjruoho# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2028604916Sjruoho# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2128604916Sjruoho# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2228604916Sjruoho# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2328604916Sjruoho# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2428604916Sjruoho# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2528604916Sjruoho# POSSIBILITY OF SUCH DAMAGE.
2628604916Sjruoho#
2728604916Sjruoho
28a127f918Srillig: "${lint1:=/usr/libexec/lint1}"
2962aa1078Srillig: "${archsubdir:=archsubdir_must_be_set}"
3010626f16Srillig
31*ecb2cf6dSrilligsrcdir="$(atf_get_srcdir)"
3228604916Sjruoho
3323e91a74Srilligconfigure_test_case()
34465f1176Srillig{
3523e91a74Srillig	local awk
36465f1176Srillig
37465f1176Srillig	# shellcheck disable=SC2016
3823e91a74Srillig	awk='
39b468abcaSrillig		BEGIN {
4015a1e938Srillig			# see ./gen-platforms.sh
411603ef65Srillig			platform["aarch64"]	= "uchar lp64  long ldbl128"
421603ef65Srillig			platform["alpha"]	= "schar lp64  long ldbl64"
431603ef65Srillig			platform["arm"]		= "uchar ilp32 long ldbl64"
441603ef65Srillig			platform["coldfire"]	= "schar ilp32 int  ldbl64"
451603ef65Srillig			platform["hppa"]	= "schar ilp32 long ldbl64"
461603ef65Srillig			platform["i386"]	= "schar ilp32 int  ldbl96"
471603ef65Srillig			platform["ia64"]	= "schar lp64  long ldbl128"
481603ef65Srillig			platform["m68000"]	= "schar ilp32 int  ldbl64"
491603ef65Srillig			platform["m68k"]	= "schar ilp32 int  ldbl96"
501603ef65Srillig			platform["mips"]	= "schar ilp32 ???? ldbl64"
511603ef65Srillig			platform["mips64"]	= "schar ilp32 long ldbl128"
521603ef65Srillig			platform["mipsn64"]	= "schar lp64  long ldbl128"
531603ef65Srillig			platform["or1k"]	= "schar ilp32 int  ldbl64"
541603ef65Srillig			platform["powerpc"]	= "uchar ilp32 int  ldbl64"
551603ef65Srillig			platform["powerpc64"]	= "uchar lp64  long ldbl64"
561603ef65Srillig			platform["riscv32"]	= "schar ilp32 int  ldbl64"
571603ef65Srillig			platform["riscv64"]	= "schar lp64  long ldbl64"
581603ef65Srillig			platform["sh3"]		= "schar ilp32 int  ldbl64"
591603ef65Srillig			platform["sparc"]	= "schar ilp32 long ldbl64"
601603ef65Srillig			platform["sparc64"]	= "schar lp64  long ldbl128"
611603ef65Srillig			platform["vax"]		= "schar ilp32 long ldbl64"
621603ef65Srillig			platform["x86_64"]	= "schar lp64  long ldbl128"
633df3cc9cSrillig		}
643df3cc9cSrillig
65b468abcaSrillig		function platform_has(prop) {
661603ef65Srillig			if (!match(prop, /^(schar|uchar|ilp32|lp64|int|long|ldbl64|ldbl96|ldbl128)$/)) {
678f4c7446Srillig				printf("bad property '\''%s'\''\n", prop) > "/dev/stderr"
688f4c7446Srillig				exit(1)
69b468abcaSrillig			}
7062aa1078Srillig			if (platform[archsubdir] == "") {
7162aa1078Srillig				printf("bad archsubdir '\''%s'\''\n", archsubdir) > "/dev/stderr"
728f4c7446Srillig				exit(1)
73b468abcaSrillig			}
7462aa1078Srillig			return match(" " platform[archsubdir] " ", " " prop " ")
753df3cc9cSrillig		}
763df3cc9cSrillig
77465f1176Srillig		BEGIN {
7862aa1078Srillig			archsubdir = "'"$archsubdir"'"
79465f1176Srillig			flags = "-g -S -w"
808f4c7446Srillig			skip = "no"
81465f1176Srillig		}
823df3cc9cSrillig		$1 == "/*" && $2 ~ /^lint1-/ && $NF == "*/" {
833df3cc9cSrillig			if ($2 == "lint1-flags:" || $2 == "lint1-extra-flags:") {
84465f1176Srillig				if ($2 == "lint1-flags:")
85465f1176Srillig					flags = ""
86465f1176Srillig				for (i = 3; i < NF; i++)
87465f1176Srillig					flags = flags " " $i
88dadd5dc3Srillig			} else if ($2 == "lint1-only-if:") {
89b6d6b0c5Srillig				for (i = 3; i < NF; i++)
90b6d6b0c5Srillig					if (!platform_has($i))
91dadd5dc3Srillig						skip = "yes"
92dadd5dc3Srillig			} else {
93dadd5dc3Srillig				printf("bad lint1 comment '\''%s'\''\n", $2) > "/dev/stderr"
94dadd5dc3Srillig				exit(1)
95465f1176Srillig			}
9623e91a74Srillig		}
973df3cc9cSrillig
98465f1176Srillig		END {
9923e91a74Srillig			printf("flags='\''%s'\''\n", flags)
1008f4c7446Srillig			printf("skip=%s\n", skip)
101465f1176Srillig		}
102465f1176Srillig	'
103465f1176Srillig
1048f4c7446Srillig	local config
1058f4c7446Srillig	config="$(awk "$awk" "$1")" || exit 1
1068f4c7446Srillig	eval "$config"
1073454588eSrillig
1083454588eSrillig	case "_${1%.c}_" in
1093454588eSrillig	*_utf8_*)
1103454588eSrillig		LC_ALL=en_US.UTF-8;;
1113454588eSrillig	*)
1123454588eSrillig		LC_ALL=C;;
1133454588eSrillig	esac
1143454588eSrillig	export LC_ALL
115465f1176Srillig}
116465f1176Srillig
117*ecb2cf6dSrilligtests_done=''
11828f87c2dSrilligcheck_lint1()
11928604916Sjruoho{
120*ecb2cf6dSrillig	local src="$1"
121*ecb2cf6dSrillig	local base="${src##*/}"
122*ecb2cf6dSrillig	local exp="${base%.c}.exp"
1232a55fba3Srillig	local exp_ln="${src%.c}.exp-ln"
124*ecb2cf6dSrillig	local wrk_ln="${base%.c}.ln"
12523e91a74Srillig	local flags=""
12623e91a74Srillig	local skip=""
12705e93501Srillig
1289e914536Srillig	if [ ! -f "$exp_ln" ]; then
1299e914536Srillig		exp_ln='/dev/null'
13010626f16Srillig		wrk_ln='/dev/null'
1313f5e7494Srillig	fi
1323f5e7494Srillig
1338f4c7446Srillig	configure_test_case "$src"	# sets 'skip' and 'flags'
13423e91a74Srillig
13523e91a74Srillig	if [ "$skip" = "yes" ]; then
136*ecb2cf6dSrillig		return
13723e91a74Srillig	fi
138*ecb2cf6dSrillig	tests_done="$tests_done $src"
13923e91a74Srillig
140465f1176Srillig	# shellcheck disable=SC2086
141456342a5Srillig	atf_check -s 'exit' -o "save:$exp" \
14210626f16Srillig	    "$lint1" $flags "$src" "$wrk_ln"
1433f5e7494Srillig
14423e91a74Srillig	if [ "$exp_ln" != '/dev/null' ]; then
14527a3cefcSrillig		# Remove comments and whitespace from the .exp-ln file.
14627a3cefcSrillig		sed \
14727a3cefcSrillig		    -e '/^#/d' \
14827a3cefcSrillig		    -e '/^$/d' \
14927a3cefcSrillig		    -e 's,^#.*,,' \
15027a3cefcSrillig		    -e 's,\([^%]\)[[:space:]],\1,g' \
15127a3cefcSrillig		    < "$exp_ln" > "./${exp_ln##*/}"
15227a3cefcSrillig
15327a3cefcSrillig		atf_check -o "file:${exp_ln##*/}" cat "$wrk_ln"
15428f87c2dSrillig	fi
15528604916Sjruoho}
15628604916Sjruoho
157*ecb2cf6dSrilligatf_test_case lint1
158*ecb2cf6dSrilliglint1_head() {
159*ecb2cf6dSrillig	atf_set 'require.progs' "$lint1"
160*ecb2cf6dSrillig}
161*ecb2cf6dSrilliglint1_body() {
162*ecb2cf6dSrillig	local src
163*ecb2cf6dSrillig
164*ecb2cf6dSrillig	for src in "$srcdir"/*.c; do
165*ecb2cf6dSrillig		check_lint1 "$src"
166*ecb2cf6dSrillig	done
167*ecb2cf6dSrillig
168*ecb2cf6dSrillig	# shellcheck disable=SC2086
169*ecb2cf6dSrillig	atf_check lua "$srcdir/check-expect.lua" $tests_done
170*ecb2cf6dSrillig}
171*ecb2cf6dSrillig
172e3ff15fbSrilligatf_init_test_cases()
17328604916Sjruoho{
174*ecb2cf6dSrillig	atf_add_test_case lint1
17528604916Sjruoho}
176