1#   Copyright 1997, 1998, 1999, 2000, 2004, 2007
2#   Free Software Foundation, Inc.
3
4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by
6# the Free Software Foundation; either version 3 of the License, or
7# (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17# Please email any bugs, comments, and/or additions to this file to:
18# bug-gdb@prep.ai.mit.edu
19
20# file to test calls into shared libraries
21# the source files for this test are:
22#
23# shmain.c
24# shr1.c (shared lib)
25# shr2.c (shared lib)
26# ss.h (header for shr2.c)
27#
28# file written by Elena Zannoni: elz@ch.apollo.com
29#
30
31#debug shmain
32#prop lib shr1.sl
33#prop lib shr2.sl
34
35if $tracelevel then {
36        strace $tracelevel
37}
38
39set prms_id 0
40set bug_id 0
41
42if {[skip_shlib_tests]} {
43    return 0
44}
45
46set testfile "shmain"
47set libfile1 "shr1"
48set libfile2 "shr2"
49set srcfile  ${srcdir}/${subdir}/${testfile}.c
50set lib1src  ${srcdir}/${subdir}/${libfile1}.c
51set lib2src  ${srcdir}/${subdir}/${libfile2}.c
52set lib1     ${objdir}/${subdir}/${libfile1}.sl
53set lib2     ${objdir}/${subdir}/${libfile2}.sl
54set binfile  ${objdir}/${subdir}/${testfile}
55
56set lib_opts "debug"
57set exec_opts [list debug shlib=${lib1} shlib=${lib2}]
58
59if [get_compiler_info ${binfile}] {
60    return -1
61}
62
63if { [gdb_compile_shlib ${lib1src} ${lib1} $lib_opts] != ""
64     || [gdb_compile_shlib ${lib2src} ${lib2} $lib_opts] != ""
65     || [gdb_compile ${srcfile} ${binfile} executable $exec_opts] != ""} {
66    untested "Could not compile $lib1, $lib2, or $srcfile."
67    return -1
68}
69
70# Start with a fresh gdb.
71
72gdb_exit
73gdb_start
74gdb_reinitialize_dir $srcdir/$subdir
75gdb_load ${binfile}
76gdb_load_shlibs $lib1 $lib2
77
78send_gdb "set print sevenbit-strings\n" ; gdb_expect -re "$gdb_prompt $"
79send_gdb "set print address off\n" ; gdb_expect -re "$gdb_prompt $"
80send_gdb "set width 0\n" ; gdb_expect -re "$gdb_prompt $"
81
82
83if ![runto_main] then {
84        perror "C function calling tests suppressed"
85}
86
87
88#step -over
89
90    send_gdb "next\n"
91    gdb_expect {
92        -re ".*g = shr1\\(g\\).*$gdb_prompt $" {pass "next to shr1"}
93        -re ".*$gdb_prompt $" { fail "next to shr1" }
94        timeout { fail "next to shr1 (timeout)" }
95    }
96
97
98
99#print g
100
101send_gdb "print g\n"
102gdb_expect {
103    -re ".*\[0-9\]* = 1.*$gdb_prompt $" {
104        pass "print g"
105      }
106    -re ".*$gdb_prompt $" { fail "print  g" }
107    timeout           { fail "(timeout) print g" }
108  }
109
110
111#step -over
112  if ![gdb_skip_stdio_test "next over shr1"] {
113      send_gdb "next\n"
114      gdb_expect {
115	  -re ".*address of sgs is $hex.*g = shr2\\(g\\).*$gdb_prompt $" {
116	      pass "next over shr1"
117	  }
118	  -re ".*$gdb_prompt $" { fail "next over shr1" }
119	  timeout { fail "next over shr1 (timeout)" }
120      }
121  } else {
122      gdb_test "next" "" ""
123  }
124
125
126#print g
127send_gdb "print g\n"
128gdb_expect {
129    -re ".*\[0-9\]* = 2.*$gdb_prompt $" {
130        pass "print g" }
131    -re ".*$gdb_prompt $" { fail "print  g" }
132    timeout           { fail "(timeout) print g" }
133  }
134
135#print shr1(1)
136  if ![gdb_skip_stdio_test "print shr1(1)"] {
137      send_gdb "print shr1(1)\n"
138      gdb_expect {
139	  -re ".*address of sgs is $hex.*\[0-9\]* = 2.*$gdb_prompt $" {
140	      pass "print shr1(1)"
141	  }
142	  -re ".*$gdb_prompt $" { fail "print shr1(1)" }
143	  timeout               { fail "(timeout) print shr1(1)" }
144      }
145  }
146
147#print shr1(g)
148  if ![gdb_skip_stdio_test "print shr1(g)"] {
149      send_gdb "print shr1(g)\n"
150      gdb_expect {
151	  -re ".*address of sgs is $hex.*\[0-9\]* = 4.*$gdb_prompt $" {
152	      pass "print shr1(g)"
153	  }
154	  -re ".*$gdb_prompt $" { fail "print shr1(g)" }
155	  timeout               { fail "(timeout) print shr1(g)" }
156      }
157  }
158
159#break shr2
160#go
161gdb_test "break shr2" \
162    "Breakpoint.*file.*shr2.c, line.*" \
163    "breakpoint function shr2"
164
165gdb_test "continue" \
166	"Continuing\\..*Breakpoint \[0-9\]+, shr2 \\(.*\\) at.*shr2\\.c:7.*7.*return 2.x;" \
167	"run until breakpoint set at a function"
168
169
170#print shr1(1)
171if ![gdb_skip_stdio_test "print shr1(1) 2nd time"] {
172    send_gdb "print shr1(1)\n"
173    gdb_expect {
174	-re ".*address of sgs is $hex.*\[0-9\]* = 2.*$gdb_prompt $" {
175	    pass "print shr1(1) 2nd time"
176	}
177	-re ".*$gdb_prompt $" { fail "print shr1(1) 2nd time" }
178	timeout               { fail "(timeout) print shr1(1) 2nd time" }
179    }
180}
181
182#print mainshr1(1)
183send_gdb "print mainshr1(1)\n"
184gdb_expect {
185    -re ".*\[0-9\]* = 2.*$gdb_prompt $" {
186        pass "print mainshr1(1) from shlib func"
187      }
188    -re ".*$gdb_prompt $" { fail "print  mainshr1(1) from shlib func" }
189    timeout           { fail "(timeout) print mainshr1(1) from shlib func" }
190  }
191
192#step -return
193    send_gdb "step\n"
194    # A step at this point will either take us entirely out of
195    # the function or into the function's epilogue.  The exact
196    # behavior will differ depending upon upon whether or not
197    # the compiler emits line number information for the epilogue.
198    gdb_expect {
199        -re "main \\(\\) at.*g = mainshr1\\(g\\);.*$gdb_prompt $" {
200	    pass "step out of shr2 to main"
201	}
202        -re ".*\\\}.*$gdb_prompt $" {
203	    pass "step out of shr2 to main (stopped in shr2 epilogue)"
204	    send_gdb "step\n"
205	    gdb_expect {
206		-re "main \\(\\) at.*g = mainshr1\\(g\\);.*$gdb_prompt $" { pass "step out of shr2 epilogue to main"}
207		-re ".*$gdb_prompt $" { fail "step out of shr2 epilogue to main" }
208		timeout { fail "step out of shr2 epilogue to main (timeout)" }
209	    }
210	}
211        -re ".*$gdb_prompt $" { fail "step out of shr2" }
212        timeout { fail "step out of shr2 to main (timeout)" }
213    }
214
215
216#print mainshr1(1)
217send_gdb "print mainshr1(1)\n"
218gdb_expect {
219    -re ".*\[0-9\]* = 2.*$gdb_prompt $" {
220        pass "print mainshr1(1)"
221      }
222    -re ".*$gdb_prompt $" { fail "print  mainshr1(1) from main" }
223    timeout           { fail "(timeout) print mainshr1(1) from main" }
224  }
225
226#step
227    send_gdb "step\n"
228    gdb_expect {
229        -re ".*mainshr1 \\(g=4\\) at.*return 2.g;.*$gdb_prompt $" { pass "step into mainshr1"}
230        -re ".*$gdb_prompt $" { fail "step into mainshr1" }
231        timeout { fail "step into mainshr1 (timeout)" }
232    }
233
234# Start with a fresh gdb.
235
236gdb_exit
237gdb_start
238gdb_reinitialize_dir $srcdir/$subdir
239gdb_load ${binfile}
240send_gdb "set print sevenbit-strings\n" ; gdb_expect -re "$gdb_prompt $"
241send_gdb "set print address off\n" ; gdb_expect -re "$gdb_prompt $"
242send_gdb "set width 0\n" ; gdb_expect -re "$gdb_prompt $"
243
244# PR's 16495, 18213
245# test that we can re-set breakpoints in shared libraries
246gdb_breakpoint "shr1" "allow-pending"
247
248# FIXME: should not send "run" explicitly.  Non-portable.
249
250if ![is_remote target] {
251  gdb_test "run" "Starting program:.*Breakpoint .,.*" \
252	"run to bp in shared library"
253
254  gdb_test "cont" ".*Program exited normally..*"
255
256  gdb_test "run" "Starting program:.*Breakpoint .,.*" \
257	"re-run to bp in shared library (PR's 16495, 18213)"
258
259  gdb_test "cont" ".*Program exited normally..*"
260}
261
262return 0
263