# Copyright 2005 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

# We added a "-arch" option to gdb to allow you to run the 32 bit side of a Universal
# binary on a machine which would ordinarily run the 32 bit version.
# This tests that.

set using_dsym 0
foreach x $board_variant_list {
    if {$x == ""} {
	continue
    }
    switch $x {
	dsym  {set using_dsym 1}
	default {}
    }
}

if {$using_dsym} {
    gdb_suppress_entire_file "This test doesn't work when forcing dsym testing"
    return 0
}

if {[istarget "powerpc-apple-darwin*"]} {
    set arch_name(32) "ppc"
} elseif {[istarget "i686-apple-darwin*"]} {
    set arch_name(32) "i386"
    set arch_name(64) "x86_64"
} else {
    puts "Unsupported architecture"
    return
}

set testfile arch-test
set srcfile $testfile.c
set binfile $objdir/$subdir/$testfile
set arches [list ppc i386 x86_64] 


# We need to take the -arch whatever flags out of the cflags, or we will
# be building each time for two architectures.
# Be sure to put it back when we are done.

if {[board_info target exists cflags]} {
    set old_board_flags [board_info target cflags]
    regsub -- {-arch *[^ ]*} $old_board_flags {} new_board_flags
    unset_currtarget_info cflags
    set_currtarget_info cflags $new_board_flags
    set put_cflags_back 1
} else {
    set pub_cflags_back 0
}

foreach arch $arches {
    set additional_flags "additional_flags=-arch\\ $arch"
    if  { [gdb_compile "$srcdir/$subdir/$testfile.c" "$binfile-$arch.o" object "debug $additional_flags"] != "" } {
        gdb_suppress_entire_file "Testcase compile failed for arch $arch in  $test_name, so all tests in this file will automatically fail."
    }
    if  { [gdb_compile "$binfile-$arch.o" "$binfile-$arch" executable "debug $additional_flags"] != "" } {
        gdb_suppress_entire_file "Testcase compile failed for arch $arch in  $test_name, so all tests in this file will automatically fail."
    }
}

if {$put_cflags_back == 1} {
  unset_currtarget_info cflags
  set_currtarget_info cflags $old_board_flags
}

set command "lipo -create -output \"$binfile\""
foreach arch $arches {
    set command "$command -arch $arch \"$binfile-$arch\""
}

set status [remote_exec  host $command]
if {[lindex $status 0] != 0} {
    puts [lindex $status 1]
    gdb_suppress_entire_file "lipo command failed for $test_name, so all tests in this file will automatically fail."
}

# Make sure we get an error if we try to set arch to 64 on a file that only has 32 bit.

gdb_exit


gdb_start "--arch $arch_name(32)"
gdb_reinitialize_dir $srcdir/$subdir
gdb_test "file $binfile-$arch_name(64)" \
    ".*Architecture of file.*does not match user selected architecture.*" \
    "Got an error passing the wrong architecture"

# This tests that we can run BITSIZE side of the Universal binary.
# Test both values of START_WITH_SHELL, since "0" uses posix_spawn and "1" uses "exec arch".
proc run_one_test {bitsize start_with_shell} {
    global GDBFLAGS
    global srcdir srcfile subdir binfile arch_name
    global gdb_prompt hex

    gdb_exit
    
    set this_test "$bitsize bit start-with-shell: $start_with_shell"
    gdb_start "--arch $arch_name($bitsize)"
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_file_cmd "$binfile"
    
    send_gdb "set width 0\n"
    gdb_expect -re "$gdb_prompt \$"
    
    gdb_test "set start-with-shell $start_with_shell" "" "$this_test: set start-with-shell"
    gdb_test "set env FROM_GDB passed" "" "$this_test: set FROM_GDB environment variable"
    gdb_test "set arg this that" "" "$this_test set args"
    
    gdb_test "break [gdb_get_line_number {Good place to put a breakpoint}]" \
	"Breakpoint 1 at $hex: file.*, line.*\\." \
	"$this_test: Set breakpoint on line 'Good place to put a breakpoint'"
    
    gdb_test "run" "Starting program: $binfile this that *\r\n\.*Reading symbols for shared libraries \(\[.+\]\)+ done.*I am $bitsize bit.*Breakpoint 1, main.*" \
	"$this_test: run to \"Good place to put a breakpoint\""
    
    gdb_test {print argc} {\$[0-9]+ = 3} "$this_test: Make sure both arguments got passed."
    gdb_test {print argv[1]} {\$[0-9]+ = .* "this"} "$this_test: argv\[1\] == this" 
    gdb_test {show env FROM_GDB} {FROM_GDB = passed} "$this_test: Make sure environ got passed."

}

run_one_test 32 0
run_one_test 32 1
run_one_test 64 0
run_one_test 64 1





    

