198d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam# This file was written by Yao Qi <qiyao@cn.ibm.com>.
298d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam
398d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliamset testfile "demangle"
498d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliamset srcfile ${testfile}.cpp
598d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliamset binfile ${testfile}
698d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliamset libfile "demangle-lib"
798d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliamset libsrc $srcdir/$subdir/$libfile.cpp
84627fc493db8459e6ef0597a4155a06b7d120d20Zachary T Welchset lib_sl $objdir/$subdir/lib$testfile.so
998d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam
1098d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliamverbose "compiling source file now....."
1198d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliamif [get_compiler_info $binfile "c++"] {
1298d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam  return -1
1398d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam}
1498d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam
1598d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliamverbose "compiling source file now....."
1698d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliamif { [ltrace_compile_shlib $libsrc $lib_sl [list debug c++]] != ""
174627fc493db8459e6ef0597a4155a06b7d120d20Zachary T Welch  || [ltrace_compile $srcdir/$subdir/$srcfile $objdir/$subdir/$binfile executable [list debug shlib=$lib_sl c++] ] != ""} {
1898d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam  send_user "Testcase compile failed, so all tests in this file will automatically fail.\n"
1998d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam}
2098d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam
2198d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam# set options for ltrace.
2298d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliamltrace_options "-C"
2398d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam
24aee093126654f722523b47848a0c5449e39cf4bbJuan Cespedes# Run PUT for ltrace.
254627fc493db8459e6ef0597a4155a06b7d120d20Zachary T Welchset exec_output [ltrace_runtest $objdir/$subdir $objdir/$subdir/$binfile]
2698d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam
2798d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam# Check the output of this program.
2898d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliamverbose "ltrace runtest output: $exec_output\n"
2998d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliamif [regexp {ELF from incompatible architecture} $exec_output] {
3098d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam	fail "32-bit ltrace can not perform on 64-bit PUTs and rebuild ltrace in 64 bit mode!"
3198d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam	return
3298d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam} elseif [ regexp {Couldn't get .hash data} $exec_output ] {
3398d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam	fail "Couldn't get .hash data!"
3498d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam	return
35bf7909260bb6911abb4e42a650586938956dc904Petr Machata} elseif [ regexp {invalid option} $exec_output ] {
36bf7909260bb6911abb4e42a650586938956dc904Petr Machata	unsupported "Demangle support not compiled in."
37bf7909260bb6911abb4e42a650586938956dc904Petr Machata	return
3898d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam}
3998d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam
4098d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam# read function declarations from demangle.cpp and verify them in demangle.ltrace.
4198d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliamset fd [ open $srcdir/$subdir/$srcfile r]
4298d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliamwhile { [gets $fd line] >= 0 } {
4398d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam    if [regexp {extern (double|float|void|char|int|short|long|void \*|void \*\*) ([^ ])\(} $line match type fun] {
444627fc493db8459e6ef0597a4155a06b7d120d20Zachary T Welch	ltrace_verify_output ${objdir}/${subdir}/${testfile}.ltrace $fun
4598d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam    }
4698d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam}
4798d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliamclose $fd
4898d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam
4998d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam#read member fucntions of classs from demangle-lib.cpp and verify them in demagle.ltrace.
5098d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliamset fd [ open $srcdir/$subdir/$testfile-lib.cpp r]
5198d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliamwhile { [gets $fd line] >= 0 } {
5298d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam    if [ regexp {((myclass|nested)::[^\(]*)\(} $line match fun] {
5398d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam	# For Debug purpose.
5498d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam        verbose "fun = $fun"
5598d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam	# Extract new/delete for remove extra SPACE in $fun, for example,
5698d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam	# $fun = "myclass::operator delete" will confuse ltrace_verify_output if it
5798d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam	# was an argument to it.
5898d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam	if [regexp {(new|delete)} $fun match sub_fun] {
594627fc493db8459e6ef0597a4155a06b7d120d20Zachary T Welch	    ltrace_verify_output ${objdir}/${subdir}/${testfile}.ltrace $sub_fun
6098d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam	} else {
6198d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam	    # Verify class member functions without SPACE.
624627fc493db8459e6ef0597a4155a06b7d120d20Zachary T Welch	    ltrace_verify_output ${objdir}/${subdir}/${testfile}.ltrace $fun
6398d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam	}
6498d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam    }
6598d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliam}
6698d884bfd78ea7a37f46515c6e9e3635a95d8cbcPaul Gilliamclose $fd
67