# Test reading debug information from in object files.

if { [skip_hp_tests] } { continue }

if { ![istarget "hppa*-*-hpux*"] } {
    verbose "HPUX test ignored for non-hppa targets."
    return 0
}

set testfile "test"
set srcsubdir ${srcdir}/${subdir}/objdbg02
set objdbgdir ${objdir}/${subdir}/objdbg02
set binfile ${objdbgdir}/${testfile}
set toolssubdir ${srcdir}/${subdir}/tools

# Create and source the file that provides information about the compiler
# used to compile the test case.
if [get_compiler_info] {
    return -1
}

if {!$hp_aCC_compiler && !$hp_cc_compiler} {
  return 0
}

if { [gdb_compile "${toolssubdir}/test-objdbg.cc" "${objdbgdir}/test-objdbg.o" object "debug c++ {additional_flags=-I${toolssubdir} +objdebug}"] != "" } {
    untested objdbg02.exp
    return -1
}

if { [gdb_compile "${srcsubdir}/x1.cc" "${objdbgdir}/x1.o" object "debug c++ {additional_flags=-I${srcsubdir} +objdebug}"] != "" } {
    perror "Couldn't compile x1.cc"
    return -1
}

if { [gdb_compile "${srcsubdir}/x2.cc" "${objdbgdir}/x2.o" object "debug c++ {additional_flags=-I${srcsubdir} +objdebug}"] != "" } {
    perror "Couldn't compile x2.cc"
    return -1
}

if { [gdb_compile "${srcsubdir}/x3.cc" "${objdbgdir}/x3.o" object "debug c++ {additional_flags=-I${srcsubdir} +objdebug}"] != "" } {
    perror "Couldn't compile x3.cc"
    return -1
}

remote_exec build "rm -f ${objdbgdir}/test.a"
set status [remote_exec build "ar cr ${objdbgdir}/test.a ${objdbgdir}/x2.o ${objdbgdir}/x3.o"]
if { [lindex $status 0] != 0 } {
    perror "Couldn't compile test.a"
    return -1
}
remote_exec build "rm -f ${objdbgdir}/x2.o ${objdbgdir}/x3.o"

if { [gdb_compile "${objdbgdir}/x1.o ${objdbgdir}/test.a" "$binfile" executable "debug c++ {additional_flags=-I${srcsubdir} +objdebug}"] != "" } {
    perror "Couldn't compile ${binfile}"
    return -1
}

# Test loading debug information from an archive file

gdb_exit
gdb_start
gdb_reinitialize_dir ${srcsubdir}
gdb_load ${binfile}

gdb_test "b main" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file ..*/x1.cc, line 12."
gdb_test "run" "Starting program:.*Breakpoint \[0-9\]+, main .*/x1.cc:12.*"
gdb_test "s 1" ".*13.*"
gdb_test "s 1" "foo1 .*/x2.cc:15.*"
gdb_test "s 1" ".*16.*"
gdb_test "s 1" "foo2 .*/x2.cc:10.*"
gdb_test "s 1" ".*11.*"
gdb_test "s 1" "foo1 .*/x2.cc:17.*"
gdb_test "s 1" "main .*/x1.cc:14.*"
gdb_test "s 1" "foo3 .*/x3.cc:5.*"
gdb_test "s 1" ".*6.*"
gdb_test "s 1" "main .*/x1.cc:15.*"
gdb_test "s 1" ".*16.*"
if [istarget "hppa64-*-*"] {
    gdb_test "s 1" "0x\[0-9a-f\]+ in .*START.*"
    gdb_continue_to_end
} else {
    gdb_test "s 1" "0x\[0-9a-f\]+ in _start .*"
    gdb_continue_to_end "" "s 1"
}

