# 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}"] != "" } {
    gdb_suppress_entire_file "WARNING: +objdebug option is not supported in this compiler version, test ignored."
}

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}"
}
