# 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}/objdbg03
set objdbgdir ${objdir}/${subdir}/objdbg03
set binfile ${objdbgdir}/${testfile}
set toolssubdir ${srcdir}/${subdir}/tools
if [istarget "hppa64-*-*"] {
  set symaddrfile ${toolssubdir}/symaddr.pa64
} else {
  set symaddrfile ${toolssubdir}/symaddr
}

# Create and source the file that provides information about the compiler
# used to compile the test case.
if [get_compiler_info ${binfile}] {
    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 objdbg03.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
}

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

#
# Test some normal commons
#

# Print the types

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

gdb_test "ptype common1" "type = int"
gdb_test "ptype common2" "type = int"
gdb_test "ptype common3" "type = int"
gdb_test "ptype data1" "type = int"
gdb_test "ptype data2" "type = int"
gdb_test "ptype data3" "type = int"
gdb_test "ptype common11" "type = int"
gdb_test "ptype common10" "type = int"
gdb_test "ptype data10" "type = int"
gdb_test "ptype data11" "type = int"

# Print the values

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 11."
gdb_test "run" "Starting program:.*Breakpoint \[0-9\]+, main .*/x1.cc:11.*"
gdb_test "p data1" "..* = 1"
gdb_test "p data2" "..* = 2"
gdb_test "p data3" "..* = 3"
gdb_test "p data10" "..* = 10"
gdb_test "p data11" "..* = 11"
gdb_test "n" ".*12.*"
gdb_test "p common11" "..* = 11"

gdb_test "s 1" "foo .*/x3.cc:15.*"
gdb_test "s 4" ".*20.*"
gdb_test "p data4" "..* = 4"
gdb_test "p common4" "..* = 4"
gdb_test "n" ".*21.*"

gdb_test "n" "main .*/x1.cc:14.*"
gdb_test "p common1" "..* = 1"
gdb_test "p common2" "..* = 2"
gdb_test "p common3" "..* = 3"

# Verify that addresses match those in the executable

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

set exec_output_data1 [lindex [remote_exec build "${symaddrfile} ${binfile} data1"] 1]
regsub -all "\[\r\n\]" ${exec_output_data1} "" exec_output_data1

set exec_output_data2 [lindex [remote_exec build "${symaddrfile} ${binfile} data2"] 1]
regsub -all "\[\r\n\]" ${exec_output_data2} "" exec_output_data2

set exec_output_data3 [lindex [remote_exec build "${symaddrfile} ${binfile} data3"] 1]
regsub -all "\[\r\n\]" ${exec_output_data3} "" exec_output_data3

set exec_output_data10 [lindex [remote_exec build "${symaddrfile} ${binfile} data10"] 1]
regsub -all "\[\r\n\]" ${exec_output_data10} "" exec_output_data10

set exec_output_data11 [lindex [remote_exec build "${symaddrfile} ${binfile} data11"] 1]
regsub -all "\[\r\n\]" ${exec_output_data11} "" exec_output_data11

set exec_output_common1 [lindex [remote_exec build "${symaddrfile} ${binfile} common1"] 1]
regsub -all "\[\r\n\]" ${exec_output_common1} "" exec_output_common1

set exec_output_common2 [lindex [remote_exec build "${symaddrfile} ${binfile} common2"] 1]
regsub -all "\[\r\n\]" ${exec_output_common2} "" exec_output_common2

set exec_output_common3 [lindex [remote_exec build "${symaddrfile} ${binfile} common3"] 1]
regsub -all "\[\r\n\]" ${exec_output_common3} "" exec_output_common3

set exec_output_common10 [lindex [remote_exec build "${symaddrfile} ${binfile} common10"] 1]
regsub -all "\[\r\n\]" ${exec_output_common10} "" exec_output_common10

set exec_output_common11 [lindex [remote_exec build "${symaddrfile} ${binfile} common11"] 1]
regsub -all "\[\r\n\]" ${exec_output_common11} "" exec_output_common11

if [istarget "hppa64-*-*"] {
    gdb_test "p &data1" "..* = \\(int \[*\]\\) ${exec_output_data1}"
    gdb_test "p &data2" "..* = \\(int \[*\]\\) ${exec_output_data2}"
    gdb_test "p &data3" "..* = \\(int \[*\]\\) ${exec_output_data3}"
    gdb_test "p &data10" "..* = \\(int \[*\]\\) ${exec_output_data10}"
    gdb_test "p &data11" "..* = \\(int \[*\]\\) ${exec_output_data11}"
    gdb_test "p &common1" "..* = \\(int \[*\]\\) ${exec_output_common1}"
    gdb_test "p &common2" "..* = \\(int \[*\]\\) ${exec_output_common2}"
    gdb_test "p &common3" "..* = \\(int \[*\]\\) ${exec_output_common3}"
    gdb_test "p &common10" "..* = \\(int \[*\]\\) ${exec_output_common10}"
    gdb_test "p &common11" "..* = \\(int \[*\]\\) ${exec_output_common11}"
} else {
    gdb_test "p &data1" "..* = \\(int \[*\]\\) 0x${exec_output_data1}"
    gdb_test "p &data2" "..* = \\(int \[*\]\\) 0x${exec_output_data2}"
    gdb_test "p &data3" "..* = \\(int \[*\]\\) 0x${exec_output_data3}"
    gdb_test "p &data10" "..* = \\(int \[*\]\\) 0x${exec_output_data10}"
    gdb_test "p &data11" "..* = \\(int \[*\]\\) 0x${exec_output_data11}"
    gdb_test "p &common1" "..* = \\(int \[*\]\\) 0x${exec_output_common1}"
    gdb_test "p &common2" "..* = \\(int \[*\]\\) 0x${exec_output_common2}"
    gdb_test "p &common3" "..* = \\(int \[*\]\\) 0x${exec_output_common3}"
    gdb_test "p &common10" "..* = \\(int \[*\]\\) 0x${exec_output_common10}"
    gdb_test "p &common11" "..* = \\(int \[*\]\\) 0x${exec_output_common11}"
}
