# Copyright 2008, 2009 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 "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
}
