# Copyright 2002-2013 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/>.  */

# relocate.exp -- Expect script to test loading symbols from unrelocated
#		  object files.

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

remote_exec build "rm -f ${binfile}"
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" object {debug}] != "" } {
     untested relocate.exp
     return -1
}

proc get_var_address { var } {
    global gdb_prompt hex

    # Match output like:
    # $1 = (int *) 0x0
    # $5 = (int (*)()) 0
    # $6 = (int (*)()) 0x24 <function_bar>

    gdb_test_multiple "print &${var}" "get address of ${var}" {
	-re "\\\$\[0-9\]+ = \\(.*\\) (0|$hex)( <${var}>)?\[\r\n\]+${gdb_prompt} $" {
	    pass "get address of ${var}"
	    if { $expect_out(1,string) == "0" } {
		return "0x0"
	    } else {
		return $expect_out(1,string)
	    }
	}
    }
    return ""
}



gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

# Load the object file.
gdb_test "add-symbol-file ${binfile} 0" \
	"Reading symbols from .*${testfile}\\.o\\.\\.\\.done\\.(|\r\nUsing host libthread_db library .*libthread_db.so.*\\.)" \
	"add-symbol-file ${testfile}.o 0" \
	"add symbol table from file \".*${testfile}\\.o\" at\[ \t\r\n\]+\.text_addr = 0x0\[\r\n\]+\\(y or n\\) " \
	"y"

# Print the addresses of static variables.
set static_foo_addr [get_var_address static_foo]
set static_bar_addr [get_var_address static_bar]

# Make sure they have different addresses.
if { "${static_foo_addr}" == "${static_bar_addr}" } {
  fail "static variables have different addresses"
} else {
  pass "static variables have different addresses"
}

# Print the addresses of global variables.
set global_foo_addr [get_var_address global_foo]
set global_bar_addr [get_var_address global_bar]

# Make sure they have different addresses.
if { "${global_foo_addr}" == "${global_bar_addr}" } {
  fail "global variables have different addresses"
} else {
  pass "global variables have different addresses"
}

# Print the addresses of functions.
set function_foo_addr [get_var_address function_foo]
set function_bar_addr [get_var_address function_bar]

# Make sure they have different addresses.
if { "${function_foo_addr}" == "${function_bar_addr}" } {
  fail "functions have different addresses"
} else {
  pass "functions have different addresses"
}

# Now use a variable as an offset to add-symbol-file, and check that
# the functions' addresses change.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

gdb_test_no_output "set \$offset = 0x10000"

# Load the object file.
gdb_test "add-symbol-file ${binfile} \$offset" \
	"Reading symbols from .*${testfile}\\.o\\.\\.\\.done\\.(|\r\nUsing host libthread_db library .*libthread_db.so.*\\.)" \
	"add-symbol-file ${testfile}.o \$offset" \
	"add symbol table from file \".*${testfile}\\.o\" at\[ \t\r\n\]+\.text_addr = 0x10000\[\r\n\]+\\(y or n\\) " \
	"y"

# Print the addresses of functions.
set new_function_foo_addr [get_var_address function_foo]

# Make sure they have different addresses.
if { "${function_foo_addr}" == "${new_function_foo_addr}" } {
  fail "function foo has a different address"
} else {
  pass "function foo has a different address"
}

# Now try loading the object as an exec-file; we should be able to print
# the values of variables after we do this.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_file_cmd ${binfile}

# Check the values of the variables.
gdb_test "print static_foo" "\\\$$decimal = 1"
gdb_test "print static_bar" "\\\$$decimal = 2"
gdb_test "print global_foo" "\\\$$decimal = 3"
gdb_test "print global_bar" "\\\$$decimal = 4"
