1*b725ae77Skettenis# Copyright 1992, 1997, 1999, 2001, 2002, 2003, 2004 2*b725ae77Skettenis# Free Software Foundation, Inc. 3*b725ae77Skettenis 4*b725ae77Skettenis# This program is free software; you can redistribute it and/or modify 5*b725ae77Skettenis# it under the terms of the GNU General Public License as published by 6*b725ae77Skettenis# the Free Software Foundation; either version 2 of the License, or 7*b725ae77Skettenis# (at your option) any later version. 8*b725ae77Skettenis# 9*b725ae77Skettenis# This program is distributed in the hope that it will be useful, 10*b725ae77Skettenis# but WITHOUT ANY WARRANTY; without even the implied warranty of 11*b725ae77Skettenis# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12*b725ae77Skettenis# GNU General Public License for more details. 13*b725ae77Skettenis# 14*b725ae77Skettenis# You should have received a copy of the GNU General Public License 15*b725ae77Skettenis# along with this program; if not, write to the Free Software 16*b725ae77Skettenis# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17*b725ae77Skettenis 18*b725ae77Skettenis# This file was written by Fred Fish. (fnf@cygnus.com) 19*b725ae77Skettenis# Adapted for g++ 3.0 ABI by Michael Chastain. (chastain@redhat.com) 20*b725ae77Skettenis 21*b725ae77Skettenisif $tracelevel then { 22*b725ae77Skettenis strace $tracelevel 23*b725ae77Skettenis} 24*b725ae77Skettenis 25*b725ae77Skettenisif { [skip_cplus_tests] } { continue } 26*b725ae77Skettenis 27*b725ae77Skettenisset testfile "cplusfuncs" 28*b725ae77Skettenisset srcfile ${testfile}.cc 29*b725ae77Skettenisset binfile ${objdir}/${subdir}/${testfile} 30*b725ae77Skettenis 31*b725ae77Skettenisif { [get_compiler_info $binfile "c++"] } { 32*b725ae77Skettenis return -1 33*b725ae77Skettenis} 34*b725ae77Skettenis 35*b725ae77Skettenisif { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { 36*b725ae77Skettenis gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." 37*b725ae77Skettenis} 38*b725ae77Skettenis 39*b725ae77Skettenis# 40*b725ae77Skettenis# g++ changed its ABI between 2.95 and 3.0. gdb has two demanglers 41*b725ae77Skettenis# for the two different styles. The two demanglers have some subtle 42*b725ae77Skettenis# discrepancies in their output. 43*b725ae77Skettenis# 44*b725ae77Skettenis# old demangler new demangler 45*b725ae77Skettenis# --- --------- --- --------- 46*b725ae77Skettenis# "operator, " "operator," 47*b725ae77Skettenis# "char *" "char*" 48*b725ae77Skettenis# "int *" "int*" 49*b725ae77Skettenis# "long *" "long*" 50*b725ae77Skettenis# "void *" "void*" 51*b725ae77Skettenis# "foo &" "foo&" 52*b725ae77Skettenis# "unsigned int" "unsigned" 53*b725ae77Skettenis# "void" "" 54*b725ae77Skettenis# 55*b725ae77Skettenis# I probe for the forms in use. 56*b725ae77Skettenis# The defaults are for the v3 demangler (as of 2001-02-13). 57*b725ae77Skettenis# 58*b725ae77Skettenis 59*b725ae77Skettenisset dm_operator_comma "," 60*b725ae77Skettenisset dm_type_char_star "char*" 61*b725ae77Skettenisset dm_type_char_star_quoted "char\\*" 62*b725ae77Skettenisset dm_type_foo_ref "foo&" 63*b725ae77Skettenisset dm_type_int_star "int*" 64*b725ae77Skettenisset dm_type_long_star "long*" 65*b725ae77Skettenisset dm_type_unsigned_int "unsigned" 66*b725ae77Skettenisset dm_type_void "" 67*b725ae77Skettenisset dm_type_void_star "void*" 68*b725ae77Skettenis 69*b725ae77Skettenisproc probe_demangler { } { 70*b725ae77Skettenis global gdb_prompt 71*b725ae77Skettenis global dm_operator_comma 72*b725ae77Skettenis global dm_type_char_star 73*b725ae77Skettenis global dm_type_char_star_quoted 74*b725ae77Skettenis global dm_type_foo_ref 75*b725ae77Skettenis global dm_type_int_star 76*b725ae77Skettenis global dm_type_long_star 77*b725ae77Skettenis global dm_type_unsigned_int 78*b725ae77Skettenis global dm_type_void 79*b725ae77Skettenis global dm_type_void_star 80*b725ae77Skettenis 81*b725ae77Skettenis send_gdb "print &'foo::operator,(foo&)'\n" 82*b725ae77Skettenis gdb_expect { 83*b725ae77Skettenis -re ".*foo::operator, \\(.*foo.*&.*\\).*\r\n$gdb_prompt $" { 84*b725ae77Skettenis # v2 demangler 85*b725ae77Skettenis set dm_operator_comma ", " 86*b725ae77Skettenis pass "detect dm_operator_comma" 87*b725ae77Skettenis } 88*b725ae77Skettenis -re ".*foo::operator,\\(.*foo.*&.*\\).*\r\n$gdb_prompt $" { 89*b725ae77Skettenis # v3 demangler 90*b725ae77Skettenis pass "detect dm_operator_comma" 91*b725ae77Skettenis } 92*b725ae77Skettenis -re ".*$gdb_prompt $" { 93*b725ae77Skettenis fail "detect dm_operator_comma" 94*b725ae77Skettenis } 95*b725ae77Skettenis timeout { 96*b725ae77Skettenis fail "detect dm_operator_comma" 97*b725ae77Skettenis } 98*b725ae77Skettenis } 99*b725ae77Skettenis 100*b725ae77Skettenis send_gdb "print &'dm_type_char_star'\n" 101*b725ae77Skettenis gdb_expect { 102*b725ae77Skettenis -re ".*dm_type_char_star\\(char \\*\\).*\r\n$gdb_prompt $" { 103*b725ae77Skettenis # v2 demangler 104*b725ae77Skettenis set dm_type_char_star "char *" 105*b725ae77Skettenis set dm_type_char_star_quoted "char \\*" 106*b725ae77Skettenis pass "detect dm_type_char_star" 107*b725ae77Skettenis } 108*b725ae77Skettenis -re ".*dm_type_char_star\\(char\\*\\).*\r\n$gdb_prompt $" { 109*b725ae77Skettenis # v3 demangler 110*b725ae77Skettenis pass "detect dm_type_char_star" 111*b725ae77Skettenis } 112*b725ae77Skettenis -re ".*$gdb_prompt $" { 113*b725ae77Skettenis fail "detect dm_type_char_star" 114*b725ae77Skettenis } 115*b725ae77Skettenis timeout { 116*b725ae77Skettenis fail "detect dm_type_char_star (timeout)" 117*b725ae77Skettenis } 118*b725ae77Skettenis } 119*b725ae77Skettenis 120*b725ae77Skettenis send_gdb "print &'dm_type_foo_ref'\n" 121*b725ae77Skettenis gdb_expect { 122*b725ae77Skettenis -re ".*dm_type_foo_ref\\(foo &\\).*\r\n$gdb_prompt $" { 123*b725ae77Skettenis # v2 demangler 124*b725ae77Skettenis set dm_type_foo_ref "foo &" 125*b725ae77Skettenis pass "detect dm_type_foo_ref" 126*b725ae77Skettenis } 127*b725ae77Skettenis -re ".*dm_type_foo_ref\\(foo&\\).*\r\n$gdb_prompt $" { 128*b725ae77Skettenis # v3 demangler 129*b725ae77Skettenis pass "detect dm_type_foo_ref" 130*b725ae77Skettenis } 131*b725ae77Skettenis -re ".*$gdb_prompt $" { 132*b725ae77Skettenis fail "detect dm_type_foo_ref" 133*b725ae77Skettenis } 134*b725ae77Skettenis timeout { 135*b725ae77Skettenis fail "detect dm_type_foo_ref (timeout)" 136*b725ae77Skettenis } 137*b725ae77Skettenis } 138*b725ae77Skettenis 139*b725ae77Skettenis send_gdb "print &'dm_type_int_star'\n" 140*b725ae77Skettenis gdb_expect { 141*b725ae77Skettenis -re ".*dm_type_int_star\\(int \\*\\).*\r\n$gdb_prompt $" { 142*b725ae77Skettenis # v2 demangler 143*b725ae77Skettenis set dm_type_int_star "int *" 144*b725ae77Skettenis pass "detect dm_type_int_star" 145*b725ae77Skettenis } 146*b725ae77Skettenis -re ".*dm_type_int_star\\(int\\*\\).*\r\n$gdb_prompt $" { 147*b725ae77Skettenis # v3 demangler 148*b725ae77Skettenis pass "detect dm_type_int_star" 149*b725ae77Skettenis } 150*b725ae77Skettenis -re ".*$gdb_prompt $" { 151*b725ae77Skettenis fail "detect dm_type_int_star" 152*b725ae77Skettenis } 153*b725ae77Skettenis timeout { 154*b725ae77Skettenis fail "detect dm_type_int_star (timeout)" 155*b725ae77Skettenis } 156*b725ae77Skettenis } 157*b725ae77Skettenis 158*b725ae77Skettenis send_gdb "print &'dm_type_long_star'\n" 159*b725ae77Skettenis gdb_expect { 160*b725ae77Skettenis -re ".*dm_type_long_star\\(long \\*\\).*\r\n$gdb_prompt $" { 161*b725ae77Skettenis # v2 demangler 162*b725ae77Skettenis set dm_type_long_star "long *" 163*b725ae77Skettenis pass "detect dm_type_long_star" 164*b725ae77Skettenis } 165*b725ae77Skettenis -re ".*dm_type_long_star\\(long\\*\\).*\r\n$gdb_prompt $" { 166*b725ae77Skettenis # v3 demangler 167*b725ae77Skettenis pass "detect dm_type_long_star" 168*b725ae77Skettenis } 169*b725ae77Skettenis -re ".*$gdb_prompt $" { 170*b725ae77Skettenis fail "detect dm_type_long_star" 171*b725ae77Skettenis } 172*b725ae77Skettenis timeout { 173*b725ae77Skettenis fail "detect dm_type_long_star (timeout)" 174*b725ae77Skettenis } 175*b725ae77Skettenis } 176*b725ae77Skettenis 177*b725ae77Skettenis send_gdb "print &'dm_type_unsigned_int'\n" 178*b725ae77Skettenis gdb_expect { 179*b725ae77Skettenis -re ".*dm_type_unsigned_int\\(unsigned int\\).*\r\n$gdb_prompt $" { 180*b725ae77Skettenis # v2 demangler 181*b725ae77Skettenis set dm_type_unsigned_int "unsigned int" 182*b725ae77Skettenis pass "detect dm_type_unsigned_int" 183*b725ae77Skettenis } 184*b725ae77Skettenis -re ".*dm_type_unsigned_int\\(unsigned\\).*\r\n$gdb_prompt $" { 185*b725ae77Skettenis # v3 demangler 186*b725ae77Skettenis pass "detect dm_type_unsigned_int" 187*b725ae77Skettenis } 188*b725ae77Skettenis -re ".*$gdb_prompt $" { 189*b725ae77Skettenis fail "detect dm_type_unsigned_int" 190*b725ae77Skettenis } 191*b725ae77Skettenis timeout { 192*b725ae77Skettenis fail "detect dm_unsigned int (timeout)" 193*b725ae77Skettenis } 194*b725ae77Skettenis } 195*b725ae77Skettenis 196*b725ae77Skettenis send_gdb "print &'dm_type_void'\n" 197*b725ae77Skettenis gdb_expect { 198*b725ae77Skettenis -re ".*dm_type_void\\(void\\).*\r\n$gdb_prompt $" { 199*b725ae77Skettenis # v2 demangler 200*b725ae77Skettenis set dm_type_void "void" 201*b725ae77Skettenis pass "detect dm_type_void" 202*b725ae77Skettenis } 203*b725ae77Skettenis -re ".*dm_type_void\\(\\).*\r\n$gdb_prompt $" { 204*b725ae77Skettenis # v3 demangler 205*b725ae77Skettenis pass "detect dm_type_void" 206*b725ae77Skettenis } 207*b725ae77Skettenis -re ".*$gdb_prompt $" { 208*b725ae77Skettenis fail "detect dm_type_void" 209*b725ae77Skettenis } 210*b725ae77Skettenis timeout { 211*b725ae77Skettenis fail "detect dm_type_void (timeout)" 212*b725ae77Skettenis } 213*b725ae77Skettenis } 214*b725ae77Skettenis 215*b725ae77Skettenis send_gdb "print &'dm_type_void_star'\n" 216*b725ae77Skettenis gdb_expect { 217*b725ae77Skettenis -re ".*dm_type_void_star\\(void \\*\\).*\r\n$gdb_prompt $" { 218*b725ae77Skettenis # v2 demangler 219*b725ae77Skettenis set dm_type_void_star "void *" 220*b725ae77Skettenis pass "detect dm_type_void_star" 221*b725ae77Skettenis } 222*b725ae77Skettenis -re ".*dm_type_void_star\\(void\\*\\).*\r\n$gdb_prompt $" { 223*b725ae77Skettenis # v3 demangler 224*b725ae77Skettenis pass "detect dm_type_void_star" 225*b725ae77Skettenis } 226*b725ae77Skettenis -re ".*$gdb_prompt $" { 227*b725ae77Skettenis fail "detect dm_type_void_star" 228*b725ae77Skettenis } 229*b725ae77Skettenis timeout { 230*b725ae77Skettenis fail "detect dm_type_void_star (timeout)" 231*b725ae77Skettenis } 232*b725ae77Skettenis } 233*b725ae77Skettenis} 234*b725ae77Skettenis 235*b725ae77Skettenis# 236*b725ae77Skettenis# Lookup a specific C++ function and print the demangled type. 237*b725ae77Skettenis# This form accepts the demangled type as a regexp. 238*b725ae77Skettenis# 239*b725ae77Skettenis 240*b725ae77Skettenisproc info_func_regexp { name demangled } { 241*b725ae77Skettenis global gdb_prompt 242*b725ae77Skettenis 243*b725ae77Skettenis send_gdb "info function $name\n" 244*b725ae77Skettenis gdb_expect { 245*b725ae77Skettenis -re ".*File .*:\r\n(class |)$demangled\r\n.*$gdb_prompt $" { 246*b725ae77Skettenis pass "info function for \"$name\"" 247*b725ae77Skettenis } 248*b725ae77Skettenis -re ".*$gdb_prompt $" { 249*b725ae77Skettenis fail "info function for \"$name\"" 250*b725ae77Skettenis } 251*b725ae77Skettenis timeout { 252*b725ae77Skettenis fail "info function for \"$name\" (timeout)" 253*b725ae77Skettenis } 254*b725ae77Skettenis } 255*b725ae77Skettenis} 256*b725ae77Skettenis 257*b725ae77Skettenis# 258*b725ae77Skettenis# Lookup a specific C++ function and print the demangled type. 259*b725ae77Skettenis# This form accepts the demangled type as a literal string. 260*b725ae77Skettenis# 261*b725ae77Skettenis 262*b725ae77Skettenisproc info_func { name demangled } { 263*b725ae77Skettenis info_func_regexp "$name" [string_to_regexp "$demangled"] 264*b725ae77Skettenis} 265*b725ae77Skettenis 266*b725ae77Skettenis# 267*b725ae77Skettenis# Print the address of a function. 268*b725ae77Skettenis# This checks that I can lookup a fully qualified C++ function. 269*b725ae77Skettenis# This also checks the argument types on the return string. 270*b725ae77Skettenis 271*b725ae77Skettenis# Note: carlton/2003-01-16: If you modify this, make a corresponding 272*b725ae77Skettenis# modification to print_addr_2_kfail. 273*b725ae77Skettenis 274*b725ae77Skettenisproc print_addr_2 { name good } { 275*b725ae77Skettenis global gdb_prompt 276*b725ae77Skettenis global hex 277*b725ae77Skettenis 278*b725ae77Skettenis set good_pattern [string_to_regexp $good] 279*b725ae77Skettenis 280*b725ae77Skettenis send_gdb "print &'$name'\n" 281*b725ae77Skettenis gdb_expect { 282*b725ae77Skettenis -re ".* = .* $hex <$good_pattern>\r\n$gdb_prompt $" { 283*b725ae77Skettenis pass "print &'$name'" 284*b725ae77Skettenis } 285*b725ae77Skettenis -re ".*$gdb_prompt $" { 286*b725ae77Skettenis fail "print &'$name'" 287*b725ae77Skettenis } 288*b725ae77Skettenis timeout { 289*b725ae77Skettenis fail "print &'$name' (timeout)" 290*b725ae77Skettenis } 291*b725ae77Skettenis } 292*b725ae77Skettenis} 293*b725ae77Skettenis 294*b725ae77Skettenis# NOTE: carlton/2003-01-16: hairyfunc5-6 fail on GCC 3.x (for at least 295*b725ae77Skettenis# x=1 and x=2.1). So I'm modifying print_addr_2 to accept a failure 296*b725ae77Skettenis# condition. FIXME: It would be nice if the failure condition were 297*b725ae77Skettenis# conditional on the compiler version, but I'm not sufficiently 298*b725ae77Skettenis# motivated. I did hardwire in the versions of char * and int *, 299*b725ae77Skettenis# which will give some compiler-specificity to the failure. 300*b725ae77Skettenis 301*b725ae77Skettenisproc print_addr_2_kfail { name good bad bugid } { 302*b725ae77Skettenis global gdb_prompt 303*b725ae77Skettenis global hex 304*b725ae77Skettenis 305*b725ae77Skettenis set good_pattern [string_to_regexp $good] 306*b725ae77Skettenis set bad_pattern [string_to_regexp $bad] 307*b725ae77Skettenis 308*b725ae77Skettenis send_gdb "print &'$name'\n" 309*b725ae77Skettenis gdb_expect { 310*b725ae77Skettenis -re ".* = .* $hex <$good_pattern>\r\n$gdb_prompt $" { 311*b725ae77Skettenis pass "print &'$name'" 312*b725ae77Skettenis } 313*b725ae77Skettenis -re ".* = .* $hex <$bad_pattern>\r\n$gdb_prompt $" { 314*b725ae77Skettenis kfail $bugid "print &'$name'" 315*b725ae77Skettenis } 316*b725ae77Skettenis -re ".*$gdb_prompt $" { 317*b725ae77Skettenis fail "print &'$name'" 318*b725ae77Skettenis } 319*b725ae77Skettenis timeout { 320*b725ae77Skettenis fail "print &'$name' (timeout)" 321*b725ae77Skettenis } 322*b725ae77Skettenis } 323*b725ae77Skettenis} 324*b725ae77Skettenis 325*b725ae77Skettenis# 326*b725ae77Skettenis# Simple interfaces to print_addr_2. 327*b725ae77Skettenis# 328*b725ae77Skettenis 329*b725ae77Skettenisproc print_addr { name } { 330*b725ae77Skettenis print_addr_2 "$name" "$name" 331*b725ae77Skettenis} 332*b725ae77Skettenis 333*b725ae77Skettenis# 334*b725ae77Skettenis# Test name demangling for operators. 335*b725ae77Skettenis# 336*b725ae77Skettenis# The '(' at the end of each regex input pattern is so that we match only 337*b725ae77Skettenis# the one we are looking for. I.E. "operator&" would match both 338*b725ae77Skettenis# "operator&(foo &)" and "operator&&(foo &)". 339*b725ae77Skettenis# 340*b725ae77Skettenis# gdb-gnats bug gdb/18: 341*b725ae77Skettenis# "gdb can't parse "info func operator*" or "info func operator\*". 342*b725ae77Skettenis# The star in "operator*" is interpreted as a regexp, but the "\*" 343*b725ae77Skettenis# in "operator\*" is not a legal operator. 344*b725ae77Skettenis# 345*b725ae77Skettenis 346*b725ae77Skettenisproc test_lookup_operator_functions {} { 347*b725ae77Skettenis global dm_operator_comma 348*b725ae77Skettenis global dm_type_char_star 349*b725ae77Skettenis global dm_type_char_star_quoted 350*b725ae77Skettenis global dm_type_foo_ref 351*b725ae77Skettenis global dm_type_void 352*b725ae77Skettenis global dm_type_void_star 353*b725ae77Skettenis 354*b725ae77Skettenis # operator* requires quoting so that GDB does not treat it as a regexp. 355*b725ae77Skettenis info_func "operator\\*(" "void foo::operator*($dm_type_foo_ref);" 356*b725ae77Skettenis info_func "operator%(" "void foo::operator%($dm_type_foo_ref);" 357*b725ae77Skettenis info_func "operator-(" "void foo::operator-($dm_type_foo_ref);" 358*b725ae77Skettenis info_func "operator>>(" "void foo::operator>>($dm_type_foo_ref);" 359*b725ae77Skettenis info_func "operator!=(" "void foo::operator!=($dm_type_foo_ref);" 360*b725ae77Skettenis info_func "operator>(" "void foo::operator>($dm_type_foo_ref);" 361*b725ae77Skettenis info_func "operator>=(" "void foo::operator>=($dm_type_foo_ref);" 362*b725ae77Skettenis info_func "operator|(" "void foo::operator|($dm_type_foo_ref);" 363*b725ae77Skettenis info_func "operator&&(" "void foo::operator&&($dm_type_foo_ref);" 364*b725ae77Skettenis info_func "operator!(" "void foo::operator!($dm_type_void);" 365*b725ae77Skettenis info_func "operator++(" "void foo::operator++(int);" 366*b725ae77Skettenis info_func "operator=(" "void foo::operator=($dm_type_foo_ref);" 367*b725ae77Skettenis info_func "operator+=(" "void foo::operator+=($dm_type_foo_ref);" 368*b725ae77Skettenis # operator*= requires quoting so that GDB does not treat it as a regexp. 369*b725ae77Skettenis info_func "operator\\*=(" "void foo::operator*=($dm_type_foo_ref);" 370*b725ae77Skettenis info_func "operator%=(" "void foo::operator%=($dm_type_foo_ref);" 371*b725ae77Skettenis info_func "operator>>=(" "void foo::operator>>=($dm_type_foo_ref);" 372*b725ae77Skettenis info_func "operator|=(" "void foo::operator|=($dm_type_foo_ref);" 373*b725ae77Skettenis info_func "operator$dm_operator_comma\(" \ 374*b725ae77Skettenis "void foo::operator$dm_operator_comma\($dm_type_foo_ref);" 375*b725ae77Skettenis info_func "operator/(" "void foo::operator/($dm_type_foo_ref);" 376*b725ae77Skettenis info_func "operator+(" "void foo::operator+($dm_type_foo_ref);" 377*b725ae77Skettenis info_func "operator<<(" "void foo::operator<<($dm_type_foo_ref);" 378*b725ae77Skettenis info_func "operator==(" "void foo::operator==($dm_type_foo_ref);" 379*b725ae77Skettenis info_func "operator<(" "void foo::operator<($dm_type_foo_ref);" 380*b725ae77Skettenis info_func "operator<=(" "void foo::operator<=($dm_type_foo_ref);" 381*b725ae77Skettenis info_func "operator&(" "void foo::operator&($dm_type_foo_ref);" 382*b725ae77Skettenis info_func "operator^(" "void foo::operator^($dm_type_foo_ref);" 383*b725ae77Skettenis info_func "operator||(" "void foo::operator||($dm_type_foo_ref);" 384*b725ae77Skettenis info_func "operator~(" "void foo::operator~($dm_type_void);" 385*b725ae77Skettenis info_func "operator--(" "void foo::operator--(int);" 386*b725ae77Skettenis info_func "operator->(" "foo *foo::operator->($dm_type_void);" 387*b725ae77Skettenis info_func "operator-=(" "void foo::operator-=($dm_type_foo_ref);" 388*b725ae77Skettenis info_func "operator/=(" "void foo::operator/=($dm_type_foo_ref);" 389*b725ae77Skettenis info_func "operator<<=(" "void foo::operator<<=($dm_type_foo_ref);" 390*b725ae77Skettenis info_func "operator&=(" "void foo::operator&=($dm_type_foo_ref);" 391*b725ae77Skettenis info_func "operator^=(" "void foo::operator^=($dm_type_foo_ref);" 392*b725ae77Skettenis # operator->* requires quoting so that GDB does not treat it as a regexp. 393*b725ae77Skettenis info_func "operator->\\*(" "void foo::operator->*($dm_type_foo_ref);" 394*b725ae77Skettenis 395*b725ae77Skettenis # operator[] needs double backslashes, so that a single backslash 396*b725ae77Skettenis # will be sent to GDB, preventing the square brackets from being 397*b725ae77Skettenis # evaluated as a regular expression. 398*b725ae77Skettenis info_func "operator\\\[\\\](" "void foo::operator\[\]($dm_type_foo_ref);" 399*b725ae77Skettenis 400*b725ae77Skettenis # These are gnarly because they might end with 'static'. 401*b725ae77Skettenis set dm_type_void_star_regexp [string_to_regexp $dm_type_void_star] 402*b725ae77Skettenis info_func_regexp "operator new(" "void \\*foo::operator new\\(.*\\)(| static);" 403*b725ae77Skettenis info_func_regexp "operator delete(" "void foo::operator delete\\($dm_type_void_star_regexp\\)(| static);" 404*b725ae77Skettenis 405*b725ae77Skettenis info_func "operator int(" "int foo::operator int($dm_type_void);" 406*b725ae77Skettenis info_func "operator()(" "void foo::operator()($dm_type_foo_ref);" 407*b725ae77Skettenis info_func "operator $dm_type_char_star_quoted\(" \ 408*b725ae77Skettenis "char *foo::operator $dm_type_char_star\($dm_type_void);" 409*b725ae77Skettenis 410*b725ae77Skettenis} 411*b725ae77Skettenis 412*b725ae77Skettenis 413*b725ae77Skettenisproc test_paddr_operator_functions {} { 414*b725ae77Skettenis global hex 415*b725ae77Skettenis global hp_aCC_compiler 416*b725ae77Skettenis global dm_operator_comma 417*b725ae77Skettenis global dm_type_char_star 418*b725ae77Skettenis global dm_type_foo_ref 419*b725ae77Skettenis global dm_type_long_star 420*b725ae77Skettenis global dm_type_unsigned_int 421*b725ae77Skettenis global dm_type_void 422*b725ae77Skettenis global dm_type_void_star 423*b725ae77Skettenis 424*b725ae77Skettenis print_addr "foo::operator*($dm_type_foo_ref)" 425*b725ae77Skettenis print_addr "foo::operator%($dm_type_foo_ref)" 426*b725ae77Skettenis print_addr "foo::operator-($dm_type_foo_ref)" 427*b725ae77Skettenis print_addr "foo::operator>>($dm_type_foo_ref)" 428*b725ae77Skettenis print_addr "foo::operator!=($dm_type_foo_ref)" 429*b725ae77Skettenis print_addr "foo::operator>($dm_type_foo_ref)" 430*b725ae77Skettenis print_addr "foo::operator>=($dm_type_foo_ref)" 431*b725ae77Skettenis print_addr "foo::operator|($dm_type_foo_ref)" 432*b725ae77Skettenis print_addr "foo::operator&&($dm_type_foo_ref)" 433*b725ae77Skettenis print_addr "foo::operator!($dm_type_void)" 434*b725ae77Skettenis print_addr "foo::operator++(int)" 435*b725ae77Skettenis print_addr "foo::operator=($dm_type_foo_ref)" 436*b725ae77Skettenis print_addr "foo::operator+=($dm_type_foo_ref)" 437*b725ae77Skettenis print_addr "foo::operator*=($dm_type_foo_ref)" 438*b725ae77Skettenis print_addr "foo::operator%=($dm_type_foo_ref)" 439*b725ae77Skettenis print_addr "foo::operator>>=($dm_type_foo_ref)" 440*b725ae77Skettenis print_addr "foo::operator|=($dm_type_foo_ref)" 441*b725ae77Skettenis print_addr "foo::operator$dm_operator_comma\($dm_type_foo_ref)" 442*b725ae77Skettenis print_addr "foo::operator/($dm_type_foo_ref)" 443*b725ae77Skettenis print_addr "foo::operator+($dm_type_foo_ref)" 444*b725ae77Skettenis print_addr "foo::operator<<($dm_type_foo_ref)" 445*b725ae77Skettenis print_addr "foo::operator==($dm_type_foo_ref)" 446*b725ae77Skettenis print_addr "foo::operator<($dm_type_foo_ref)" 447*b725ae77Skettenis print_addr "foo::operator<=($dm_type_foo_ref)" 448*b725ae77Skettenis print_addr "foo::operator&($dm_type_foo_ref)" 449*b725ae77Skettenis print_addr "foo::operator^($dm_type_foo_ref)" 450*b725ae77Skettenis print_addr "foo::operator||($dm_type_foo_ref)" 451*b725ae77Skettenis print_addr "foo::operator~($dm_type_void)" 452*b725ae77Skettenis print_addr "foo::operator--(int)" 453*b725ae77Skettenis print_addr "foo::operator->($dm_type_void)" 454*b725ae77Skettenis print_addr "foo::operator-=($dm_type_foo_ref)" 455*b725ae77Skettenis print_addr "foo::operator/=($dm_type_foo_ref)" 456*b725ae77Skettenis print_addr "foo::operator<<=($dm_type_foo_ref)" 457*b725ae77Skettenis print_addr "foo::operator&=($dm_type_foo_ref)" 458*b725ae77Skettenis print_addr "foo::operator^=($dm_type_foo_ref)" 459*b725ae77Skettenis print_addr "foo::operator->*($dm_type_foo_ref)" 460*b725ae77Skettenis print_addr "foo::operator\[\]($dm_type_foo_ref)" 461*b725ae77Skettenis print_addr "foo::operator()($dm_type_foo_ref)" 462*b725ae77Skettenis 463*b725ae77Skettenis gdb_test "print &'foo::operator new'" \ 464*b725ae77Skettenis " = .* $hex <foo::operator new\\(.*\\)(| static)>" 465*b725ae77Skettenis if { !$hp_aCC_compiler } { 466*b725ae77Skettenis print_addr "foo::operator delete($dm_type_void_star)" 467*b725ae77Skettenis } else { 468*b725ae77Skettenis gdb_test "print &'foo::operator delete($dm_type_void_star) static'" \ 469*b725ae77Skettenis " = .*(0x\[0-9a-f\]+|) <foo::operator delete.*>" 470*b725ae77Skettenis } 471*b725ae77Skettenis 472*b725ae77Skettenis print_addr "foo::operator int($dm_type_void)" 473*b725ae77Skettenis print_addr "foo::operator $dm_type_char_star\($dm_type_void)" 474*b725ae77Skettenis} 475*b725ae77Skettenis 476*b725ae77Skettenis# 477*b725ae77Skettenis# Test overloaded functions (1 arg). 478*b725ae77Skettenis# 479*b725ae77Skettenis 480*b725ae77Skettenisproc test_paddr_overloaded_functions {} { 481*b725ae77Skettenis global dm_type_unsigned_int 482*b725ae77Skettenis global dm_type_void 483*b725ae77Skettenis 484*b725ae77Skettenis print_addr "overload1arg($dm_type_void)" 485*b725ae77Skettenis print_addr "overload1arg(char)" 486*b725ae77Skettenis print_addr "overload1arg(signed char)" 487*b725ae77Skettenis print_addr "overload1arg(unsigned char)" 488*b725ae77Skettenis print_addr "overload1arg(short)" 489*b725ae77Skettenis print_addr "overload1arg(unsigned short)" 490*b725ae77Skettenis print_addr "overload1arg(int)" 491*b725ae77Skettenis print_addr "overload1arg($dm_type_unsigned_int)" 492*b725ae77Skettenis print_addr "overload1arg(long)" 493*b725ae77Skettenis print_addr "overload1arg(unsigned long)" 494*b725ae77Skettenis print_addr "overload1arg(float)" 495*b725ae77Skettenis print_addr "overload1arg(double)" 496*b725ae77Skettenis 497*b725ae77Skettenis print_addr "overloadargs(int)" 498*b725ae77Skettenis print_addr "overloadargs(int, int)" 499*b725ae77Skettenis print_addr "overloadargs(int, int, int)" 500*b725ae77Skettenis print_addr "overloadargs(int, int, int, int)" 501*b725ae77Skettenis print_addr "overloadargs(int, int, int, int, int)" 502*b725ae77Skettenis print_addr "overloadargs(int, int, int, int, int, int)" 503*b725ae77Skettenis print_addr "overloadargs(int, int, int, int, int, int, int)" 504*b725ae77Skettenis print_addr "overloadargs(int, int, int, int, int, int, int, int)" 505*b725ae77Skettenis print_addr "overloadargs(int, int, int, int, int, int, int, int, int)" 506*b725ae77Skettenis print_addr "overloadargs(int, int, int, int, int, int, int, int, int, int)" 507*b725ae77Skettenis print_addr "overloadargs(int, int, int, int, int, int, int, int, int, int, int)" 508*b725ae77Skettenis} 509*b725ae77Skettenis 510*b725ae77Skettenisproc test_paddr_hairy_functions {} { 511*b725ae77Skettenis global gdb_prompt 512*b725ae77Skettenis global hex 513*b725ae77Skettenis global dm_type_char_star 514*b725ae77Skettenis global dm_type_int_star 515*b725ae77Skettenis global dm_type_long_star 516*b725ae77Skettenis 517*b725ae77Skettenis print_addr_2 "hairyfunc1" "hairyfunc1(int)" 518*b725ae77Skettenis print_addr_2 "hairyfunc2" "hairyfunc2(int (*)($dm_type_char_star))" 519*b725ae77Skettenis print_addr_2 "hairyfunc3" "hairyfunc3(int (*)(short (*)($dm_type_long_star)))" 520*b725ae77Skettenis print_addr_2 "hairyfunc4" "hairyfunc4(int (*)(short (*)($dm_type_char_star)))" 521*b725ae77Skettenis 522*b725ae77Skettenis # gdb-gnats bug gdb/19: 523*b725ae77Skettenis # "gdb v3 demangler fails on hairyfunc5 hairyfunc6 hairyfunc7" 524*b725ae77Skettenis print_addr_2_kfail "hairyfunc5" "hairyfunc5(int (*(*)($dm_type_char_star))(long))" "hairyfunc5(int (*)(long) (*)(char*))" "gdb/19" 525*b725ae77Skettenis print_addr_2_kfail "hairyfunc6" "hairyfunc6(int (*(*)($dm_type_int_star))(long))" "hairyfunc6(int (*)(long) (*)(int*))" "gdb/19" 526*b725ae77Skettenis print_addr_2_kfail "hairyfunc7" "hairyfunc7(int (*(*)(int (*)($dm_type_char_star)))(long))" "hairyfunc7(int (*)(long) (*)(int (*)(char*)))" "gdb/19" 527*b725ae77Skettenis} 528*b725ae77Skettenis 529*b725ae77Skettenisproc do_tests {} { 530*b725ae77Skettenis global prms_id 531*b725ae77Skettenis global bug_id 532*b725ae77Skettenis global subdir 533*b725ae77Skettenis global objdir 534*b725ae77Skettenis global srcdir 535*b725ae77Skettenis global binfile 536*b725ae77Skettenis global gdb_prompt 537*b725ae77Skettenis 538*b725ae77Skettenis set prms_id 0 539*b725ae77Skettenis set bug_id 0 540*b725ae77Skettenis 541*b725ae77Skettenis # Start with a fresh gdb. 542*b725ae77Skettenis 543*b725ae77Skettenis gdb_exit 544*b725ae77Skettenis gdb_start 545*b725ae77Skettenis gdb_reinitialize_dir $srcdir/$subdir 546*b725ae77Skettenis gdb_load $binfile 547*b725ae77Skettenis 548*b725ae77Skettenis send_gdb "set language c++\n" 549*b725ae77Skettenis gdb_expect -re "$gdb_prompt $" 550*b725ae77Skettenis send_gdb "set width 0\n" 551*b725ae77Skettenis gdb_expect -re "$gdb_prompt $" 552*b725ae77Skettenis 553*b725ae77Skettenis runto_main 554*b725ae77Skettenis 555*b725ae77Skettenis probe_demangler 556*b725ae77Skettenis test_paddr_overloaded_functions 557*b725ae77Skettenis test_paddr_operator_functions 558*b725ae77Skettenis test_paddr_hairy_functions 559*b725ae77Skettenis test_lookup_operator_functions 560*b725ae77Skettenis} 561*b725ae77Skettenis 562*b725ae77Skettenisdo_tests 563