# This file is part of ltrace.
# Copyright (C) 2012 Petr Machata, Red Hat 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., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301 USA

set testfile "ppc-lwarx"
set srcfile ${testfile}.c
set binfile ${testfile}

if [get_compiler_info $binfile] {
  return -1
}

if { [istarget powerpc*-*] } then {
    verbose "compiling source file now....."
    if { [ltrace_compile $srcdir/$subdir/$srcfile $objdir/$subdir/$binfile executable {debug} ] != "" } {
	 send_user "Testcase compile failed, so all tests in this file will automatically fail\n."
    }

    # set options for ltrace.
    ltrace_options "-x" "atomic_add" "-e" "!atoi"

    # Run PUT for ltarce.
    set exec_output [ltrace_runtest $objdir/$subdir $objdir/$subdir/$binfile]

    # Check the output of this program.
    verbose "ltrace runtest output: $exec_output\n"
    if [regexp {ELF from incompatible architecture} $exec_output] {
	    fail "32-bit ltrace can not perform on 64-bit PUTs and rebuild ltrace in 64 bit mode!"
	    return 
    } elseif [ regexp {Couldn't get .hash data} $exec_output ] {
	    fail "Couldn't get .hash data!"
	    return
    }

    set pattern "atomic_add(.*, 5,.*)"
    ltrace_verify_output ${objdir}/${subdir}/${testfile}.ltrace $pattern 1
    set pattern "atomic_add(.*, 10,.*)"
    ltrace_verify_output ${objdir}/${subdir}/${testfile}.ltrace $pattern 1
    set pattern "atomic_add(.*, 15,.*)"
    ltrace_verify_output ${objdir}/${subdir}/${testfile}.ltrace $pattern 1
}
