# 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.  

# A structure inside another structure results in a uniquely weird symbol
# name in stabs, e.g. 
#   00000000 - 00 0003  LSYM outer::inner:Tt(0,6)=s4i:(0,4),0,32;;

# which requires an apple local patch to handle correctly.  
# cf <rdar://problem/4223302> 

if $tracelevel then {
    strace $tracelevel
}

#
# test running programs
#

set prms_id 0
set bug_id 0

set testfile "malloc-history"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}


if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug} ] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

# Start with a fresh gdb
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_file_cmd "${binfile}"

send_gdb "set width 0\n"
gdb_expect -re "$gdb_prompt $"

gdb_test "info malloc-history" "Argument required \\(expression to compute\\)\\." "malloc-history with no arguments"
gdb_test "info malloc-history 0x4444" "Can't get malloc history\\: target is not running" "malloc-history with no inferior"

gdb_test "set env MallocStackLoggingNoCompact" ".*" "Set MallocStackLoggingNoCompact"

gdb_test "break [gdb_get_line_number {good stopping point after call_get_a_string}]" "Breakpoint 1 at $hex: file.*, line.*\\." "Set breakpoint on line  'good stopping point in after call_get_a_string'"

gdb_test "run" "Starting program: $binfile *\r\n\.*Reading symbols for shared libraries \(\[.+\]\)+ done.*Breakpoint 1, main.*" "run to first breakpoint in main()"

set header "Stack - pthread\\: $hex number of frames\\: $decimal"
set dont_care "\(\r\n.*$decimal\\: $hex in .*)*"
set match_malloc "\r\n.*$hex in malloc\r\n.*$hex in get_a_string at .*malloc-history.c:$decimal\r\n.*$hex in call_get_a_string at .*malloc-history.c:$decimal\r\n.*$hex in main at .*malloc-history.c:$decimal"

gdb_test "info malloc-history foo" $header$dont_care$match_malloc$dont_care "Get malloc history for call_get_a_string"

gdb_test "break [gdb_get_line_number {good stopping point after free}]" "Breakpoint 2 at $hex: file.*, line.*\\." "Set breakpoint on line  'good stopping point after free'"
gdb_test "continue" "Continuing\\.\[\r\n\]+Breakpoint 2, main.*" "continue to second breakpoint in main()"

set match_free "\r\n.*$hex in free\r\n.*$hex in main at .*malloc-history.c:$decimal"
gdb_test "info malloc-history foo" $header$dont_care$match_malloc$dont_care$header$dont_care$match_free$dont_care "Get malloc history after free"

gdb_exit
return 0
