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