1# Expect script for run_dump_test based ld-m68k GOT tests.
2#   Copyright (C) 2008-2021 Free Software Foundation, Inc.
3#
4# This file is part of the GNU Binutils.
5#
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation; either version 3 of the License, or
9# (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program; if not, write to the Free Software
18# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19# MA 02110-1301, USA.
20#
21
22if { ![is_elf_format] || ![istarget m68k-*-*] } {
23    return
24}
25
26# 1 - 1
27# 2 - 8189
28# 3 - 8190
29# 4 - 16382
30# 5 - 16385
31
32proc gen_got_test { testname } {
33    global srcdir
34    global subdir
35
36    if [catch { set ofd [open "tmpdir/$testname.s" w] } msg] {
37	perror "$msg"
38	unresolved $testname
39	return
40    }
41
42    switch --  $testname {
43	"got-12" {
44	    set start 1
45	    set count 8189
46	    set xgot 0
47	}
48	"got-13" {
49	    set start 1
50	    set count 8190
51	    set xgot 0
52	}
53	"got-14" {
54	    set start 1
55	    set count 16382
56	    set xgot 0
57	}
58	"got-15" {
59	    set start 1
60	    set count 16385
61	    set xgot 0
62	}
63	"got-34" {
64	    set start 8190
65	    set count 16382
66	    set xgot 0
67	}
68	"got-35" {
69	    set start 8190
70	    set count 16385
71	    set xgot 0
72	}
73	"xgot-15" {
74	    set start 1
75	    set count 16385
76	    set xgot 1
77	}
78    }
79
80    set func [format "sum_%05d_%05d" $start $count]
81    puts $ofd "\t.text"
82    puts $ofd "\t.align	2"
83    puts $ofd "\t.globl $func"
84    puts $ofd "\t.type $func,@function"
85    puts $ofd "$func:"
86    puts $ofd "\tlink.w %fp,#0"
87    puts $ofd "\tmove.l %a5,-(%sp)"
88    puts $ofd "\tmove.l #_GLOBAL_OFFSET_TABLE_@GOTPC, %a5"
89    puts $ofd "\tlea (-6, %pc, %a5), %a5"
90
91    if { $xgot == 1 } {
92	set symbol [format "a%05d" $start]
93	incr start
94	puts $ofd "\tlea $symbol@GOT,%a0"
95	puts $ofd "\tadd.l %a5,%a0"
96	puts $ofd "\tmove.l (%a0),%a0"
97	puts $ofd "\tmove.l (%a0),%d1"
98	for { set i $start } { $i < $count } { incr i } {
99	    set symbol [format "a%05d" $i]
100	    puts $ofd "\tlea $symbol@GOT,%a0"
101	    puts $ofd "\tadd.l %a5,%a0"
102	    puts $ofd "\tmove.l (%a0),%a0"
103	    puts $ofd "\tmove.l (%a0),%d0"
104	    puts $ofd "\tadd.l %d0,%d1"
105	}
106	set symbol [format "a%05d" $count]
107	puts $ofd "\tlea $symbol@GOT,%a0"
108	puts $ofd "\tadd.l %a5,%a0"
109	puts $ofd "\tmove.l (%a0),%a0"
110	puts $ofd "\tmove.l (%a0),%d0"
111	puts $ofd "\tadd.l %d1,%d0"
112    } else {
113	set symbol [format "a%05d" $start]
114	incr start
115	puts $ofd "\tmove.l $symbol@GOT(%a5),%d0"
116	puts $ofd "\tmove.l %d0,%a0"
117	puts $ofd "\tmove.l (%a0),%d1"
118	for { set i $start } { $i < $count } { incr i } {
119	    set symbol [format "a%05d" $i]
120	    puts $ofd "\tmove.l $symbol@GOT(%a5),%d0"
121	    puts $ofd "\tmove.l %d0,%a0"
122	    puts $ofd "\tmove.l (%a0),%d0"
123	    puts $ofd "\tadd.l %d0,%d1"
124	}
125	set symbol [format "a%05d" $count]
126	puts $ofd "\tmove.l $symbol@GOT(%a5),%d0"
127	puts $ofd "\tmove.l %d0,%a0"
128	puts $ofd "\tmove.l (%a0),%d0"
129	puts $ofd "\tadd.l %d1,%d0"
130    }
131
132    puts $ofd "\tmove.l (%sp)+,%a5"
133    puts $ofd "\tunlk %fp"
134    puts $ofd "\trts"
135    puts $ofd "\t.size	$func, .-$func"
136
137    close $ofd
138}
139
140proc got_test { testname } {
141    global srcdir
142    global subdir
143    global objdir
144
145    if [catch { set ifd [open "$srcdir/$subdir/$testname.d" r] } msg] {
146	perror "$msg"
147	unresolved $testname
148	return
149    }
150    if [catch { set ofd [open "tmpdir/$testname.d" w] } msg] {
151	perror "$msg"
152	unresolved $testname
153	return
154    }
155
156    switch --  $testname {
157	"got-single-12-ok" {
158	    puts $ofd "#source: ./tmpdir/got-12.s"
159	    set count 8189
160	}
161	"got-single-13-er" {
162	    puts $ofd "#source: ./tmpdir/got-13.s"
163	    set count 0
164	}
165	"got-negative-14-ok" {
166	    puts $ofd "#source: ./tmpdir/got-14.s"
167	    set count 16382
168	}
169	"got-negative-15-er" {
170	    puts $ofd "#source: ./tmpdir/got-15.s"
171	    set count 0
172	}
173	"got-negative-12-13-14-34-ok" {
174	    puts $ofd "#source: ./tmpdir/got-12.s"
175	    puts $ofd "#source: ./tmpdir/got-13.s"
176	    puts $ofd "#source: ./tmpdir/got-14.s"
177	    puts $ofd "#source: ./tmpdir/got-34.s"
178	    set count 16382
179	}
180	"got-negative-12-13-14-35-er" {
181	    puts $ofd "#source: ./tmpdir/got-12.s"
182	    puts $ofd "#source: ./tmpdir/got-13.s"
183	    puts $ofd "#source: ./tmpdir/got-14.s"
184	    puts $ofd "#source: ./tmpdir/got-35.s"
185	    set count 0
186	}
187	"got-multigot-14-ok" {
188	    puts $ofd "#source: ./tmpdir/got-14.s"
189	    set count 16382
190	}
191	"got-multigot-15-er" {
192	    puts $ofd "#source: ./tmpdir/got-15.s"
193	    set count 0
194	}
195	"got-multigot-12-13-14-34-35-ok" {
196	    puts $ofd "#source: ./tmpdir/got-12.s"
197	    puts $ofd "#source: ./tmpdir/got-13.s"
198	    puts $ofd "#source: ./tmpdir/got-14.s"
199	    puts $ofd "#source: ./tmpdir/got-34.s"
200	    puts $ofd "#source: ./tmpdir/got-35.s"
201	    set count 24578
202	}
203	"got-xgot-15-ok" {
204	    puts $ofd "#source: ./tmpdir/xgot-15.s"
205	    set count 16385
206	}
207	"got-xgot-12-13-14-15-34-35-ok" {
208	    puts $ofd "#source: ./tmpdir/got-12.s"
209	    puts $ofd "#source: ./tmpdir/got-13.s"
210	    puts $ofd "#source: ./tmpdir/got-14.s"
211	    puts $ofd "#source: ./tmpdir/xgot-15.s"
212	    puts $ofd "#source: ./tmpdir/got-34.s"
213	    puts $ofd "#source: ./tmpdir/got-35.s"
214	    set count 24581
215	}
216    }
217
218    while { [gets $ifd line] != -1 } {
219	puts $ofd $line
220    }
221
222    for { set i 0 } { $i < $count } { incr i } {
223	puts $ofd "^\[0-9a-f\]+  \[0-9a-f\]+ R_68K_GLOB_DAT    00000000   a\[0-9\]+ \\\+ 0"
224    }
225
226    close $ifd
227    close $ofd
228    run_dump_test "tmpdir/$testname"
229}
230
231gen_got_test got-12
232gen_got_test got-13
233gen_got_test got-14
234gen_got_test got-15
235gen_got_test got-34
236gen_got_test got-35
237gen_got_test xgot-15
238
239run_dump_test "got-1"
240got_test "got-single-12-ok"
241got_test "got-single-13-er"
242got_test "got-negative-14-ok"
243got_test "got-negative-15-er"
244got_test "got-negative-12-13-14-34-ok"
245got_test "got-negative-12-13-14-35-er"
246got_test "got-multigot-14-ok"
247got_test "got-multigot-15-er"
248got_test "got-multigot-12-13-14-34-35-ok"
249got_test "got-xgot-15-ok"
250got_test "got-xgot-12-13-14-15-34-35-ok"
251