# Copyright 2003, 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.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# This file was written by Jason Molenda (jmolenda@apple.com)

if $tracelevel then {
        strace $tracelevel
}

set prms_id 0
set bug_id 0

set testfile "a.out"
set binfile ${objdir}/${subdir}/${testfile}

set timeout 30

set arch "i386"
if [target_info exists darwin64] {
  set arch "x86_64"
}
if [istarget "powerpc-apple-darwin*"] {
  set arch "ppc"
}

remote_exec build "sh ${srcdir}/${subdir}/../set-up-objdir.sh ${srcdir}/${subdir} ${objdir}/${subdir}"

remote_exec build "make ARCH=${arch} -C ${objdir}/${subdir} stage1"

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

if ![runto_main] then { 
  fail "small c fix and continue tests suppressed"
  return -1
}

gdb_test "next" ".*I am in main.*" "first step"
gdb_test "next" ".*I am in bar in b.c version 1.*I am in fred.*"  "step over bar() version 1"

send_gdb "p foo\n"
gdb_expect {
  -re ".*$decimal = \{int \\((void|)\\)\} ($hex) <foo>\[\r\n\]+$gdb_prompt $" {
    set stage1_foo_addr $expect_out(2,string)
    pass "get addr of foo() at stage1"
  }
  -re ".*$gdb_prompt $" {
    fail "get addr of foo() at stage1"
  }
  timeout {
    fail "get addr of foo() at stage1 (timeout)"
  }
}

# Build a new b.c

gdb_test "shell make ARCH=${arch} -C $objdir/$subdir stage2" ".*gcc.*b2.o.*b-bundlized.o.*b2.o" "make version 2 of b.c"
gdb_test "fix $objdir/$subdir/b-bundlized.o2 $objdir/$subdir/b.c" ".*Fix succeeded." "Bring in fixed b.c version 2"
gdb_test "next" ".*I am in bar in b.c version 2.*I am in fred.*"  "step over bar() version 2"

send_gdb "p foo\n"
gdb_expect {
  -re ".*$decimal = \{int \\((void|)\\)\} ($hex) <foo>\[\r\n\]+$gdb_prompt $" {
    set stage2_foo_addr $expect_out(2,string)
    pass "get addr of foo() at stage2"
  }
  -re ".*$gdb_prompt $" {
    fail "get addr of foo() at stage2"
  }
  timeout {
    fail "get addr of foo() at stage2 (timeout)"
  }
}

if { $stage1_foo_addr != $stage2_foo_addr } then {
  pass "stage1 foo() and stage2 foo() are different."
} else {
  fail "stage1 foo() and stage2 foo() are different."
}

# Build a newer b.c

gdb_test "shell make ARCH=${arch} -C $objdir/$subdir stage3" ".*gcc.*b3.o" "make version 3 of b.c"
gdb_test "fix $objdir/$subdir/b-bundlized.o3 $objdir/$subdir/b.c" ".*Fix succeeded." "Bring in fixed b.c version 3"
gdb_test "next" ".*I am in bar in b.c version 3.*I am in fred.*"  "step over bar() version 3"

send_gdb "p foo\n"
gdb_expect {
  -re ".*$decimal = \{int \\((void|)\\)\} ($hex) <foo>\[\r\n\]+$gdb_prompt $" {
    set stage3_foo_addr $expect_out(2,string)
    pass "get addr of foo() at stage3"
  }
  -re ".*$gdb_prompt $" {
    fail "get addr of foo() at stage3"
  }
  timeout {
    fail "get addr of foo() at stage3 (timeout)"
  }
}

if { $stage2_foo_addr != $stage3_foo_addr } then {
  pass "stage2 foo() and stage3 foo() are different."
} else {
  fail "stage2 foo() and stage3 foo() are different."
}

# Build a newest b.c

gdb_test "shell make ARCH=${arch} -C $objdir/$subdir stage4" ".*gcc.*b4.o" "make version 4 of b.c"
gdb_test "fix $objdir/$subdir/b-bundlized.o4 $objdir/$subdir/b.c" ".*Fix succeeded." "Bring in fixed b.c version 4"
gdb_test "next" ".*I am in bar in b.c version 4.*I am in fred.*"  "step over bar() version 4"

send_gdb "p foo\n"
gdb_expect {
  -re ".*$decimal = \{int \\((void|)\\)\} ($hex) <foo>\[\r\n\]+$gdb_prompt $" {
    set stage4_foo_addr $expect_out(2,string)
    pass "get addr of foo() at stage4"
  }
  -re ".*$gdb_prompt $" {
    fail "get addr of foo() at stage4"
  }
  timeout {
    fail "get addr of foo() at stage4 (timeout)"
  }
}

if { $stage3_foo_addr != $stage4_foo_addr } then {
  pass "stage3 foo() and stage4 foo() are different."
} else {
  fail "stage3 foo() and stage4 foo() are different."
}

# Build invalid b.c #1

gdb_test "shell make ARCH=${arch} -C $objdir/$subdir stage5" ".*-o b-bundlized.o5 b5.o" "make version 5 of b.c"
send_gdb "fix $objdir/$subdir/b-bundlized.o5 $objdir/$subdir/b.c\n"
gdb_expect {
  -re "Changing the type of global variable 'bss_int' from 'int' to 'float' is not supported.\[\r\n\]+$gdb_prompt $" {
    pass "Reject change of global variable's type."
  }
  -re ".*$gdb_prompt $" {
    fail "Reject change of global variable's type."
  }
  timeout {
    fail "Reject change of global variable's type. (timeout)"
  }
}

# Build invalid b.c #2

gdb_test "shell make ARCH=${arch} -C $objdir/$subdir stage6" ".*-o b-bundlized.o6 b6.o" "make version 6 of b.c"
send_gdb "fix $objdir/$subdir/b-bundlized.o6 $objdir/$subdir/b.c\n"
gdb_expect {
  -re "Changing function 'foo' to a variable is not supported.\[\r\n\]+$gdb_prompt $" {
    pass "Reject change of function to variable."
  }
  -re ".*$gdb_prompt $" {
    fail "Reject change of function to variable."
  }
  timeout {
    fail "Reject change of function to variable. (timeout)"
  }
}

# Build invalid b.c #3

gdb_test "shell make ARCH=${arch} -C $objdir/$subdir stage7" ".*-o b-bundlized.o7 b7.o" "make version 7 of b.c"
send_gdb "fix $objdir/$subdir/b-bundlized.o7 $objdir/$subdir/b.c\n"
gdb_expect {
  -re "Changing variable 'global_var' to a function is not supported.\[\r\n\]+$gdb_prompt $" {
    pass "Reject change of variable to function."
  }
  -re ".*$gdb_prompt $" {
    fail "Reject change of variable to function."
  }
  timeout {
    fail "Reject change of variable to function. (timeout)"
  }
}

# Build valid b.c #1

gdb_test "shell make ARCH=${arch} -C $objdir/$subdir stage9" ".*-o b-bundlized.o9 b9.o" "make version 9 of b.c"
gdb_test "fix $objdir/$subdir/b-bundlized.o9 $objdir/$subdir/b.c" ".*Fix succeeded." "fix in b-bundlized version 9"
gdb_test "next" ".*I am in bar in b.c version 9.*I am in fred.*"  "step over bar() version 9"
send_gdb "p foo\n"
gdb_expect {
  -re ".*$decimal = \{int \\((void|)\\)\} ($hex) <foo>\[\r\n\]+$gdb_prompt $" {
    set stage9_foo_addr $expect_out(2,string)
    pass "get addr of foo() at stage9"
  }
  -re ".*$gdb_prompt $" {
    fail "get addr of foo() at stage9"
  }
  timeout {
    fail "get addr of foo() at stage9 (timeout)"
  }
}
if { $stage4_foo_addr != $stage9_foo_addr } then {
  pass "stage4 foo() and stage9 foo() are different."
} else {
  fail "stage4 foo() and stage9 foo() are different."
}


# Build invalid b.c #5

gdb_test "break bar" "Breakpoint 2 at.*" "Set a breakpoint in bar"
gdb_test "continue" "Continuing.*Breakpoint 2, bar.*" "Continue to bar"

gdb_test "shell make ARCH=${arch} -C $objdir/$subdir stage10" ".*-o b-bundlized.o10 b10.o" "make version 10 of b.c"
send_gdb "fix $objdir/$subdir/b-bundlized.o10 $objdir/$subdir/b.c\n"
gdb_expect {
  -re "Changing number of local variables from 0 to 1 for function 'bar' while active on the stack is not supported.\[\r\n\]+$gdb_prompt $" {
    pass "Reject adding local variable to function on the stack."
  }
  -re ".*$gdb_prompt $" {
    fail "Reject adding local variable to function on the stack."
  }
  timeout {
    fail "Reject adding local variable to function on the stack. (timeout)"
  }
}
gdb_test "finish" "Value returned is.*" "Finish back to main"

# Build invalid b.c #6

gdb_test "shell make ARCH=${arch} -C $objdir/$subdir stage11" ".*-o b-bundlized.o11 b11.o" "make version 11 of b.c"
send_gdb "fix $objdir/$subdir/b-bundlized.o11 $objdir/$subdir/b.c\n"
gdb_expect {
  -re "Changing number of arguments from 0 to 1 for function 'bar' is not supported.\[\r\n\]+$gdb_prompt $" {
    pass "Reject adding argument to function on the stack."
  }
  -re ".*$gdb_prompt $" {
    fail "Reject adding argument to function on the stack."
  }
  timeout {
    fail "Reject adding argument to function on the stack. (timeout)"
  }
}

# Build invalid b.c #7

gdb_test "shell make ARCH=${arch} -C $objdir/$subdir stage12" ".*-o b-bundlized.o12 b12.o" "make version 12 of b.c"
send_gdb "fix $objdir/$subdir/b-bundlized.o12 $objdir/$subdir/b.c\n"
gdb_expect {
  -re "In function 'slurry', argument 'a' changed from type 'char' to type 'int', which is not supported.\[\r\n\]+$gdb_prompt $" {
    pass "Reject changing funtion arg type (char to int)."
  }
  -re ".*$gdb_prompt $" {
    fail "Reject changing funtion arg type (char to int)."
  }
  timeout {
    fail "Reject changing funtion arg type (char to int). (timeout)"
  }
}

# Build invalid b.c #8

gdb_test "shell make ARCH=${arch} -C $objdir/$subdir stage13" ".*-o b-bundlized.o13 b13.o" "make version 13 of b.c"
send_gdb "fix $objdir/$subdir/b-bundlized.o13 $objdir/$subdir/b.c\n"
gdb_expect {
  -re "In function 'slurry', argument 'a' changed from type 'char' to type 'struct lkj \\*', which is not supported.\[\r\n\]+$gdb_prompt $" {
    pass "Reject changing funtion arg type (char to ptr to struct)."
  }
  -re ".*$gdb_prompt $" {
    fail "Reject changing funtion arg type (char to ptr to struct)."
  }
  timeout {
    fail "Reject changing funtion arg type (char to ptr to struct). (timeout)"
  }
}

# Build invalid b.c #9

gdb_test "shell make ARCH=${arch} -C $objdir/$subdir stage14" ".*-o b-bundlized.o14 b14.o" "make version 14 of b.c"
send_gdb "fix $objdir/$subdir/b-bundlized.o14 $objdir/$subdir/b.c\n"
gdb_expect {
  -re "Function 'slurry' was changed from returning 'int ' to 'struct lkj ', which is not supported.\[\r\n\]+$gdb_prompt $" {
    pass "Reject changing funtion return type (int to struct)."
  }
  -re ".*$gdb_prompt $" {
    fail "Reject changing funtion return type (int to struct)."
  }
  timeout {
    fail "Reject changing funtion return type (int to struct). (timeout)"
  }
}

# Build valid b.c #4

gdb_test "shell make ARCH=${arch} -C $objdir/$subdir stage18" ".*-o b-bundlized.o18 b18.o" "make version 18 of b.c"
gdb_test "fix $objdir/$subdir/b-bundlized.o18 $objdir/$subdir/b.c" ".*Fix succeeded." "fix in b-bundlized version 18"
gdb_test "next" ".*I am in bar in b.c version 18.*I am in fred.*"  "step over bar() version 18"
send_gdb "p foo\n"
gdb_expect {
  -re ".*$decimal = \{int \\((void|)\\)\} ($hex) <foo>\[\r\n\]+$gdb_prompt $" {
    set stage18_foo_addr $expect_out(2,string)
    pass "get addr of foo() at stage18"
  }
  -re ".*$gdb_prompt $" {
    fail "get addr of foo() at stage18"
  }
  timeout {
    fail "get addr of foo() at stage18 (timeout)"
  }
}
if { $stage4_foo_addr != $stage18_foo_addr } then {
  pass "stage4 foo() and stage18 foo() are different."
} else {
  fail "stage4 foo() and stage18 foo() are different."
}


# Build invalid b.c #10

gdb_test "shell make ARCH=${arch} -C $objdir/$subdir stage17" ".*-o b-bundlized.o17 b17.o" "make version 17 of b.c"
send_gdb "fix $objdir/$subdir/b-bundlized.o17 $objdir/$subdir/b.c\n"
gdb_expect {
  -re "Not able to load Fix bundle with error:.*Symbol not found: _mprintf.*\[\r\n\]+$gdb_prompt $" {
    pass "Reject reference to undefined external function."
  }
  -re ".*$gdb_prompt $" {
    fail "Reject reference to undefined external function."
  }
  timeout {
    fail "Reject reference to undefined external function. (timeout)"
  }
}


# Build valid b.c #5

gdb_test "shell make ARCH=${arch} -C $objdir/$subdir stage19" ".*-o b-bundlized.o19 b19.o" "make version 19 of b.c"
gdb_test "fix $objdir/$subdir/b-bundlized.o19 $objdir/$subdir/b.c" ".*Fix succeeded." "fix in b-bundlized version 19"
gdb_test "next" ".*I am in bar in b.c version 19.*I am in fred.*"  "step over bar() version 19"

gdb_test "print newly_added_integer" "\\$$decimal = 0" "check that new global is printable and zeroed"

send_gdb "set newly_added_integer = 15\n"
gdb_expect {
  -re "No symbol \"newly_added_integer\" in current context.*$gdb_prompt $" 
    {
      fail "Set newly_added_integer by hand"
    }
  -re "$gdb_prompt $" 
    { 
      pass "Set newly_added_integer by hand" 
    }
  -re ".*$gdb_prompt $"
    {
      fail "Set newly_added_integer by hand"
    }
  timeout {
      fail "Set newly_added_integer by hand (timeout)"
  }
}

gdb_test "print newly_added_integer" "\\$$decimal = 15" "setting of newly_added_integer took"

# Build valid b.c #6

gdb_test "shell make ARCH=${arch} -C $objdir/$subdir stage20" ".*-o b-bundlized.o20 b20.o" "make version 20 of b.c"
gdb_test "fix $objdir/$subdir/b-bundlized.o20 $objdir/$subdir/b.c" ".*Fix succeeded." "fix in b-bundlized version 20"
gdb_test "next" ".*I am in bar in b.c version 20.*I am in fred.*"  "step over bar() version 20"

gdb_test "print newly_added_integer" "\\$$decimal = 15" "setting of newly_added_integer persisted across another fix"


# FIXME: Check that we only have three copies of b-bundlized loaded, maybe
# do more.
gdb_test "info sharedlibrary" ".*b-bundlized.*" "get list of dylibs at end"


gdb_exit

return 0
