Reviewed and approved by Jim Blandy
[deliverable/binutils-gdb.git] / gdb / testsuite / gdb.base / shlib-call.exp
index 0381657ea3a2fd608e9c671c486ae8019f63ff2f..49a6144199268e2109be7ecbd9a3c2137062b313 100644 (file)
@@ -1,4 +1,4 @@
-#   Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+#   Copyright 1997, 1998, 1999, 2000, 2004 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -45,60 +45,29 @@ if ![isnative] then {
 }
 
 set testfile "shmain"
-set libfile "shr"
-set srcfile ${testfile}.c
-set binfile ${objdir}/${subdir}/${testfile}
+set libfile1 "shr1"
+set libfile2 "shr2"
+set srcfile  ${srcdir}/${subdir}/${testfile}.c
+set lib1src  ${srcdir}/${subdir}/${libfile1}.c
+set lib2src  ${srcdir}/${subdir}/${libfile2}.c
+set lib1     ${objdir}/${subdir}/${libfile1}.sl
+set lib2     ${objdir}/${subdir}/${libfile2}.sl
+set binfile  ${objdir}/${subdir}/${testfile}
+
+set lib_opts "debug"
+set exec_opts [list debug shlib=${lib1} shlib=${lib2}]
 
-# build the first test case
 if [get_compiler_info ${binfile}] {
     return -1
 }
 
-if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}.o" object {debug}] != "" } {
-     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
-}
-
-
-# Build the shared libraries this test case needs.
-#
-
-if {$gcc_compiled == 0} {
-    if [istarget "hppa*-hp-hpux*"] then {
-       set additional_flags "additional_flags=+z"
-    } else {
-       # don't know what the compiler is...
-       set additional_flags ""
-    }
-} else {
-    set additional_flags "additional_flags=-fpic"
-}
-
-if {[gdb_compile "${srcdir}/${subdir}/${libfile}1.c" "${objdir}/${subdir}/${libfile}1.o" object [list debug $additional_flags]] != ""} {
-     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
-}
-
-if {[gdb_compile "${srcdir}/${subdir}/${libfile}2.c" "${objdir}/${subdir}/${libfile}2.o" object [list debug $additional_flags]] != ""} {
-     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
-}
-
-if [istarget "hppa*-*-hpux*"] {
-    remote_exec build "ld -b ${objdir}/${subdir}/${libfile}1.o -o ${objdir}/${subdir}/${libfile}1.sl"
-    remote_exec build "ld -b ${objdir}/${subdir}/${libfile}2.o -o ${objdir}/${subdir}/${libfile}2.sl"
-} else {
-    set additional_flags "additional_flags=-shared"
-    if {[gdb_compile "${objdir}/${subdir}/${libfile}1.o" "${objdir}/${subdir}/${libfile}1.sl" executable [list debug $additional_flags]] != ""} {
-       gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
-    }
-    if {[gdb_compile "${objdir}/${subdir}/${libfile}2.o" "${objdir}/${subdir}/${libfile}2.sl" executable [list debug $additional_flags]] != ""} {
-       gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
-    }
-}
-if {[gdb_compile "${objdir}/${subdir}/${testfile}.o ${objdir}/${subdir}/${libfile}1.sl ${objdir}/${subdir}/${libfile}2.sl" "${binfile}" executable {debug}] != ""} {
-     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
+if { [gdb_compile_shlib ${lib1src} ${lib1} $lib_opts] != ""
+     || [gdb_compile_shlib ${lib2src} ${lib2} $lib_opts] != ""
+     || [gdb_compile ${srcfile} ${binfile} executable $exec_opts] != ""} {
+    untested "Could not compile $lib1, $lib2, or $srcfile."
+    return -1
 }
 
-
-
 # Start with a fresh gdb.
 
 gdb_exit
@@ -139,13 +108,19 @@ gdb_expect {
 
 
 #step -over
-    send_gdb "next\n"
-    gdb_expect {
-        -re ".*address of sgs is $hex.*g = shr2\\(g\\).*$gdb_prompt $" {
-             pass "next over shr1" }
-        -re ".*$gdb_prompt $" { fail "next over shr1" }
-        timeout { fail "next over shr1 (timeout)" }
-    }
+  if ![gdb_skip_stdio_test "next over shr1"] {
+      send_gdb "next\n"
+      gdb_expect {
+         -re ".*address of sgs is $hex.*g = shr2\\(g\\).*$gdb_prompt $" {
+             pass "next over shr1" 
+         }
+         -re ".*$gdb_prompt $" { fail "next over shr1" }
+         timeout { fail "next over shr1 (timeout)" }
+      }
+  } else {
+      gdb_test "next" "" ""
+  }
+
 
 #print g
 send_gdb "print g\n"
@@ -157,21 +132,27 @@ gdb_expect {
   }
 
 #print shr1(1)
-send_gdb "print shr1(1)\n"
-gdb_expect {
-    -re ".*address of sgs is $hex.*\[0-9\]* = 2.*$gdb_prompt $" {
-        pass "print shr1(1)" }
-    -re ".*$gdb_prompt $" { fail "print  shr1(1)" }
-    timeout           { fail "(timeout) print shr1(1)" }
+  if ![gdb_skip_stdio_test "print shr1(1)"] {
+      send_gdb "print shr1(1)\n"
+      gdb_expect {
+         -re ".*address of sgs is $hex.*\[0-9\]* = 2.*$gdb_prompt $" {
+             pass "print shr1(1)" 
+         }
+         -re ".*$gdb_prompt $" { fail "print shr1(1)" }
+         timeout               { fail "(timeout) print shr1(1)" }
+      }
   }
 
 #print shr1(g)
-send_gdb "print shr1(g)\n"
-gdb_expect {
-    -re ".*address of sgs is $hex.*\[0-9\]* = 4.*$gdb_prompt $" {
-        pass "print shr1(g)" }
-    -re ".*$gdb_prompt $" { fail "print  shr1(g)" }
-    timeout           { fail "(timeout) print shr1(g)" }
+  if ![gdb_skip_stdio_test "print shr1(g)"] {
+      send_gdb "print shr1(g)\n"
+      gdb_expect {
+         -re ".*address of sgs is $hex.*\[0-9\]* = 4.*$gdb_prompt $" {
+             pass "print shr1(g)" 
+         }
+         -re ".*$gdb_prompt $" { fail "print shr1(g)" }
+         timeout               { fail "(timeout) print shr1(g)" }
+      }
   }
 
 #break shr2
@@ -180,19 +161,22 @@ gdb_test "break shr2" \
     "Breakpoint.*file.*shr2.c, line.*" \
     "breakpoint function shr2"
 
-gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, shr2 \\(.*\\) at.*shr2\\.c:7.*7.*return 2.x;" \
-"run until breakpoint set at a function"
+gdb_test "continue" \
+       "Continuing\\..*Breakpoint \[0-9\]+, shr2 \\(.*\\) at.*shr2\\.c:7.*7.*return 2.x;" \
+       "run until breakpoint set at a function"
 
 
 #print shr1(1)
-send_gdb "print shr1(1)\n"
-gdb_expect {
-    -re ".*address of sgs is $hex.*\[0-9\]* = 2.*$gdb_prompt $" {
-        pass "print shr1(1)"
-      }
-    -re ".*$gdb_prompt $" { fail "print  shr1(1)" }
-    timeout           { fail "(timeout) print shr1(1)" }
-  }
+if ![gdb_skip_stdio_test "print shr1(1) 2nd time"] {
+    send_gdb "print shr1(1)\n"
+    gdb_expect {
+       -re ".*address of sgs is $hex.*\[0-9\]* = 2.*$gdb_prompt $" {
+           pass "print shr1(1) 2nd time"
+       }
+       -re ".*$gdb_prompt $" { fail "print shr1(1) 2nd time" }
+       timeout               { fail "(timeout) print shr1(1) 2nd time" }
+    }
+}
 
 #print mainshr1(1)
 send_gdb "print mainshr1(1)\n"
@@ -206,18 +190,27 @@ gdb_expect {
 
 #step -return
     send_gdb "step\n"
+    # A step at this point will either take us entirely out of
+    # the function or into the function's epilogue.  The exact
+    # behavior will differ depending upon upon whether or not
+    # the compiler emits line number information for the epilogue.
     gdb_expect {
-        -re ".*\\\}.*$gdb_prompt $" { pass "step inside shr2 (shlib func)"}
-        -re ".*$gdb_prompt $" { fail "step inside shr2 (shlib func)" }
-        timeout { fail "step inside shr2 (shlib func) (timeout)" }
-    }
-    
-    send_gdb "step\n"
-    gdb_expect {
-        -re "main \\(\\) at.*g = mainshr1\\(g\\);.*$gdb_prompt $" { pass "step out of shr2 to main"}
-        -re ".*$gdb_prompt $" { fail "step out of shr2 to main" }
+        -re "main \\(\\) at.*g = mainshr1\\(g\\);.*$gdb_prompt $" { 
+           pass "step out of shr2 to main"
+       }
+        -re ".*\\\}.*$gdb_prompt $" {
+           pass "step out of shr2 to main (stopped in shr2 epilogue)"
+           send_gdb "step\n"
+           gdb_expect {
+               -re "main \\(\\) at.*g = mainshr1\\(g\\);.*$gdb_prompt $" { pass "step out of shr2 epilogue to main"}
+               -re ".*$gdb_prompt $" { fail "step out of shr2 epilogue to main" }
+               timeout { fail "step out of shr2 epilogue to main (timeout)" }
+           }
+       }
+        -re ".*$gdb_prompt $" { fail "step out of shr2" }
         timeout { fail "step out of shr2 to main (timeout)" }
     }
+    
 
 #print mainshr1(1)
 send_gdb "print mainshr1(1)\n"
@@ -249,10 +242,20 @@ send_gdb "set width 0\n" ; gdb_expect -re "$gdb_prompt $"
 
 # PR's 16495, 18213
 # test that we can re-set breakpoints in shared libraries
-gdb_test "break shr1" "Breakpoint 1.*" "set bp in shared library"
-gdb_test "run" "Starting program:.*Breakpoint 1,.*" "run to bp in shared library"
-gdb_test "cont" ".*Program exited normally..*"
-gdb_test "run" "Starting program:.*Breakpoint 1,.*" "re-run to bp in shared library (PR's 16495, 18213)"
-gdb_test "cont" ".*Program exited normally..*"
+gdb_breakpoint "shr1" "allow-pending"
+
+# FIXME: should not send "run" explicitly.  Non-portable.
+
+if ![is_remote target] {
+  gdb_test "run" "Starting program:.*Breakpoint .,.*" \
+       "run to bp in shared library"
+
+  gdb_test "cont" ".*Program exited normally..*"
+
+  gdb_test "run" "Starting program:.*Breakpoint .,.*" \
+       "re-run to bp in shared library (PR's 16495, 18213)"
+
+  gdb_test "cont" ".*Program exited normally..*"
+}
 
 return 0
This page took 0.026458 seconds and 4 git commands to generate.