1#! /usr/bin/sh
2#
3# This file and its contents are supplied under the terms of the
4# Common Development and Distribution License ("CDDL"), version 1.0.
5# You may only use this file in accordance with the terms of version
6# 1.0 of the CDDL.
7#
8# A full copy of the text of the CDDL should have accompanied this
9# source.  A copy of the CDDL is also available via the Internet at
10# http://www.illumos.org/license/CDDL.
11#
12
13# Copyright 2012, Richard Lowe.
14
15TESTDIR=$(dirname $0)
16
17tmpdir=/tmp/test.$$
18mkdir $tmpdir
19cd $tmpdir
20
21cleanup() {
22	cd /
23	rm -fr $tmpdir
24}
25
26trap 'cleanup' EXIT
27
28if [[ $PWD != $tmpdir ]]; then
29	print -u2 "Failed to create temporary directory: $tmpdir"
30	exit 1;
31fi
32
33if [[ -n $PROTO ]]; then
34	export LD_ALTEXEC=$PROTO/bin/ld
35fi
36
37ret=0
38
39function should_succeed {
40	mapfile=$1
41	msg=$2
42
43	if gcc -m32 -shared -Wl,-M,${TESTDIR}/$mapfile ${TESTDIR}/object.c \
44	    -o object.so; then
45		echo "pass (32): $msg"
46	else
47		echo "FAIL (32): $msg"
48		ret=1
49	fi
50
51	if gcc -m64 -shared -Wl,-M,${TESTDIR}/$mapfile ${TESTDIR}/object.c \
52	    -o object.so; then
53		echo "pass (64): $msg"
54	else
55		echo "FAIL (64): $msg"
56		ret=1
57	fi
58}
59
60function should_fail {
61	mapfile=$1
62	msg=$2
63	error=$3
64
65	if gcc -m32 -shared -Wl,-M,${TESTDIR}/$mapfile ${TESTDIR}/object.c \
66	    -o object.so 2>&1 | /usr/bin/grep -Eq "$error"; then
67		echo "pass (32): $msg"
68	else
69		echo "FAIL (32): $msg"
70		ret=1
71	fi
72
73	if gcc -m64 -shared -Wl,-M,${TESTDIR}/$mapfile ${TESTDIR}/object.c \
74	    -o object.so 2>&1 | /usr/bin/grep -Eq "$error"; then
75		echo "pass (64): $msg"
76	else
77		echo "FAIL (64): $msg"
78		ret=1
79	fi
80}
81
82should_succeed mapfile.sizemult.good "link with integer multiplier syntax"
83
84should_fail mapfile.sizemult.wrong "link with integer multiplier syntax with wrong result" \
85    "assertion failed: size of symbol common should be: [0-9]+ is: [0-9]+"
86should_fail mapfile.sizemult.noterm "link with integer multiplier syntax with no terminating ]" \
87    "expected '.' to terminate multiplier of: 2"
88
89should_fail mapfile.sizemult.twobegin "link with integer multiplier with two [s" \
90    "expected integer value following '.': 2..4"
91
92should_fail mapfile.sizemult.overflow "link with integer multiplier that overflows" \
93    "multiplication overflow"
94
95should_succeed mapfile.addrsize.good "link with addrsized symbol"
96
97should_succeed mapfile.addrsize.mult "link with addrsized symbol with multiplier"
98
99should_fail mapfile.addrsize.wrong "link with addrsized symbol with wrong value" \
100    "assertion failed: size of symbol"
101
102should_fail mapfile.addrsize.substring "link with addrsized symbol with substring of valid name" \
103    "expected integer value following SIZE: addrs"
104
105should_fail mapfile.addrsize.superstring "link with addrsized symbol with superstring of valid name" \
106    "expected integer value following SIZE: addrsizes"
107
108exit $ret
109