# Copyright (C) 1998, 2007-2012 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
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.


# This file is part of the gdb testsuite


# pxdb.exp   Test that gdb calls pxdb on an application
#            built without it.
#

if { [skip_hp_tests] } then { continue }

set testfile pxdb
set srcfile ${testfile}.c
set objfile ${objdir}/${subdir}/${testfile}.o
set binfile ${objdir}/${subdir}/${testfile}

if [get_compiler_info "c++"] {
    return -1;
}

if { $gcc_compiled } then { continue }

# To build a non-pxdb-ed file, use
#
#     <compile to .o file>
#     export LD_PXDB /dev/null
#     ld -o hello_no_pxdb hello.o /opt/langtools/lib/end.o /usr/ccs/lib/crt0.o -lc
#

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${objfile}" object {debug}] != "" } {
    untested pxdb.exp
    return -1
}

#
# use this to debug:
#log_user 1


# Following should get the error message:
#
#      ld: (Warning) Can't exec pxdb using path: /dev/null
#
#execute_anywhere "ksh -c \"export LD_PXDB=/dev/null\""

if [istarget "hppa64-*-*"] {
set cmdline  "ksh -c \"LD_PXDB=/dev/null ld -o ${binfile} ${objfile} /opt/langtools/lib/pa20_64/crt0.o /opt/langtools/lib/pa20_64/end.o -lc\""
} else {
set cmdline  "ksh -c \"LD_PXDB=/dev/null ld -o ${binfile} ${objfile} /usr/ccs/lib/crt0.o /opt/langtools/lib/end.o -lc\""
}

remote_exec build "rm ${binfile}"
remote_exec build $cmdline

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

# We expect to see this:
#
#  "warning: File not processed by pxdb--about to process now.
#  "
#  ".
#  "Procedures: 7
#  "Files: 2
#  "Reading symbols from ~/c_code.dir/hello_no_pxdb...done.
#  "(gdb)
#
send_gdb "file ${binfile}\n"
gdb_expect {

    -re ".*warning: File not processed by pxdb.*Procedures: \[0-9\]+.*$gdb_prompt $"\
                            { pass "PXDB call"        }

    -re "$gdb_prompt $" {
      if [istarget hppa*-*-hpux*] {
        pass "Didn't call pxdb"
      } else { 
        fail "Didn't call pxdb"
      }
    }

    -re ".*$gdb_prompt $"       { fail "Some other message" }

    timeout                 { fail "call pxdb (timeout)" }
}

# Make sure the new data makes sense
#
if { ![runto callee] } then { return }

send_gdb "print x\n"
gdb_expect {
   -re ".*= 1.*$gdb_prompt $"    { pass "Good data after pxdb call" }
   -re ".*$gdb_prompt $"         { fail "No data after pxdb call" }
   timeout { fail "(timeout)" }
}

gdb_exit
return 0





