# Copyright 2007, 2008, 2009, 2010 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/>.  */

# Test loading symbols from unrelocated C++ object files.

set testfile cp-relocate
set srcfile ${testfile}.cc
set binfile ${objdir}/${subdir}/${testfile}.o

if { [skip_cplus_tests] } { continue }

if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" object {c++ debug}] != "" } {
     untested cp-relocate.exp
     return -1
}

proc get_func_address { func } {
    global gdb_prompt hex

    set rfunc [string_to_regexp $func]
    gdb_test_multiple "print ${func}" "get address of ${func}" {
	-re "\\\$\[0-9\]+ = \\{.*\\} (0|($hex) <${rfunc}>)\[\r\n\]+${gdb_prompt} $" {
	    # $1 = {int ()} 0x24 <function_bar>
	    # But if the function is at zero, the name may be omitted.
	    pass "get address of ${func}"
	    if { $expect_out(1,string) == "0" } {
		return "0x0"
	    } else {
		return $expect_out(2,string)
	    }
	}
    }
  return ""
}

# Load the file as an executable; GDB should assign non-overlapping
# section offsets.
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_file_cmd ${binfile}

# Find the interesting functions.  We go to a little effort to find
# the right function names here, to work around PR c++/40.
set func1_name ""
set func2_name ""
gdb_test_multiple "info functions func<.>" "info functions" {
    -re "\r\nint (\[^\r\]*func<1>\[^\r]*);" {
	set func1_name $expect_out(1,string)
	exp_continue
    }
    -re "\r\nint (\[^\r\]*func<2>\[^\r]*);" {
	set func2_name $expect_out(1,string)
	exp_continue
    }
    -re "$gdb_prompt $" {
	if { ${func1_name} != "" && ${func2_name} != "" } {
	    pass "info functions"
	} else {
	    fail "info functions"
	    return -1
	}
    }
}

# Check that all the functions have different addresses.
set func1_addr [get_func_address "$func1_name"]
set func2_addr [get_func_address "$func2_name"]
set caller_addr [get_func_address "caller"]

if { "${func1_addr}" == "${func2_addr}"
     || "${func1_addr}" == "${func2_addr}"
     || "${func2_addr}" == "${caller_addr}" } {
  fail "C++ functions have different addresses"
} else {
  pass "C++ functions have different addresses"
}

# Figure out the names of the sections containing the template
# functions.
set func1_sec ""
set func2_sec ""
gdb_test_multiple "info file" "info file" {
    -re "($hex) - ($hex) is (\[^\r\]*)\r" {
	if { $expect_out(1,string) <= $func1_addr
	     && $expect_out(2,string) > $func1_addr } {
	    set func1_sec $expect_out(3,string)
	} elseif { $expect_out(1,string) <= $func2_addr
	    && $expect_out(2,string) > $func2_addr } {
	    set func2_sec $expect_out(3,string)
	}
	exp_continue
    }
    -re "$gdb_prompt $" {
	if { ${func1_sec} != "" && ${func2_sec} != "" } {
	    pass "info file"
	} else {
	    fail "info file"
	    return -1
	}
    }
}

if { $func1_sec == $func2_sec } {
    untested "cp-relocate.exp - template functions in same sections"
    return -1
}

# Now start a clean GDB, for add-symbol-file tests.
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

gdb_test "add-symbol-file ${binfile} 0 -s ${func1_sec} 0x10000 -s ${func2_sec} 0x20000" \
	"Reading symbols from .*${testfile}\\.o\\.\\.\\.done\\.(|\r\nUsing host libthread_db library .*libthread_db.so.*\\.)" \
	"add-symbol-file ${testfile}.o" \
	"add symbol table from file \".*${testfile}\\.o\" at.*\\(y or n\\) " \
	"y"

# Make sure the function addresses were updated.
gdb_test "break *$func1_name" \
    "Breakpoint $decimal at 0x1....: file .*"
gdb_test "break *$func2_name" \
    "Breakpoint $decimal at 0x2....: file .*"
