# Copyright 2008-2012 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/>.

set testfile randomize
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested "Couldn't compile test program"
    return -1
}

# Get things started.

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

proc address_get { testname } {
    global gdb_prompt

    if {![runto_main]} {
	return -1
    }

    # Do not rely on printf; some test configurations don't work with stdio.

    gdb_breakpoint [gdb_get_line_number "print p"]
    gdb_continue_to_breakpoint "$testname - address set"

    gdb_test_multiple "print/x p" $testname {
	-re "\\$\[0-9\]+ = (0x\[0-9a-f\]*)\r?\n$gdb_prompt $" {
	    pass $testname
	    return $expect_out(1,string)
	}
    }
}

set test "set disable-randomization off"
gdb_test_multiple "${test}" "${test}" {
    -re "Disabling randomization .* unsupported .*$gdb_prompt $" {
	untested "Disabling randomization is not supported on this Linux GDB"
	return -1
    }
    -re "No symbol .* in current context.*$gdb_prompt $" {
	untested "Disabling randomization is not supported on this GDB platform"
	return -1
    }
    -re "$gdb_prompt $" {
	pass $test
    }
}
gdb_test "show disable-randomization"	      \
         "Disabling randomization .* is off." \
         "show disable-randomization off"

set addr1 [address_get "randomized first address"]
set addr2 [address_get "randomized second address"]
set test "randomized addresses should not match"
if [string equal $addr1 $addr2] {
    untested "No randomization detected on this system"
    return -1
} else {
    pass $test
}

gdb_test_no_output "set disable-randomization on"
gdb_test "show disable-randomization"	      \
         "Disabling randomization .* is on." \
         "show disable-randomization on"

set addr1 [address_get "fixed first address"]
set addr2 [address_get "fixed second address"]
set test "fixed addresses should match"
if [string equal $addr1 $addr2] {
    pass $test
} else {
    fail $test
}
