From bd3bab1eed665fb2d8053a8d3043824959cb599f Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Fri, 9 Aug 1996 16:38:19 +0000 Subject: [PATCH] * gdb.base/structs.exp: New tests for passing and returning structures. * gdb.base/structs.c: C source for test. Sanitized away until we've got a valid copyright assignment from Michael Snyder. Only tested on the PA. I assume other ports will needs some xfails and other possible testsuite tweakage. --- gdb/testsuite/gdb.base/.Sanitize | 2 + gdb/testsuite/gdb.base/structs.c | 207 +++++++++++++++++++++++++++++ gdb/testsuite/gdb.base/structs.exp | 153 +++++++++++++++++++++ 3 files changed, 362 insertions(+) create mode 100644 gdb/testsuite/gdb.base/structs.c create mode 100644 gdb/testsuite/gdb.base/structs.exp diff --git a/gdb/testsuite/gdb.base/.Sanitize b/gdb/testsuite/gdb.base/.Sanitize index ba0503cf24..0cb57ecf8f 100644 --- a/gdb/testsuite/gdb.base/.Sanitize +++ b/gdb/testsuite/gdb.base/.Sanitize @@ -104,6 +104,8 @@ whatis.c whatis.exp Things-to-lose: +structs.c +structs.exp # The lines between the "Do-last:" line and the end of the file # are executed as a /bin/sh shell script after everything else is diff --git a/gdb/testsuite/gdb.base/structs.c b/gdb/testsuite/gdb.base/structs.c new file mode 100644 index 0000000000..fcb9d7232d --- /dev/null +++ b/gdb/testsuite/gdb.base/structs.c @@ -0,0 +1,207 @@ +/* Copyright (C) 1996 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. + + Please email any bugs, comments, and/or additions to this file to: + bug-gdb@prep.ai.mit.edu */ + +struct struct1 { char a;}; +struct struct2 { char a, b;}; +struct struct3 { char a, b, c; }; +struct struct4 { char a, b, c, d; }; +struct struct5 { char a, b, c, d, e; }; +struct struct6 { char a, b, c, d, e, f; }; +struct struct7 { char a, b, c, d, e, f, g; }; +struct struct8 { char a, b, c, d, e, f, g, h; }; +struct struct9 { char a, b, c, d, e, f, g, h, i; }; +struct struct10 { char a, b, c, d, e, f, g, h, i, j; }; +struct struct11 { char a, b, c, d, e, f, g, h, i, j, k; }; +struct struct12 { char a, b, c, d, e, f, g, h, i, j, k, l; }; +struct struct16 { char a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p; }; + +struct struct1 foo1 = {'1'}, L1; +struct struct2 foo2 = { 'a', 'b'}, L2; +struct struct3 foo3 = { 'A', 'B', 'C'}, L3; +struct struct4 foo4 = {'1', '2', '3', '4'}, L4; +struct struct5 foo5 = {'a', 'b', 'c', 'd', 'e'}, L5; +struct struct6 foo6 = {'A', 'B', 'C', 'D', 'E', 'F'}, L6; +struct struct7 foo7 = {'1', '2', '3', '4', '5', '6', '7'}, L7; +struct struct8 foo8 = {'1', '2', '3', '4', '5', '6', '7', '8'}, L8; +struct struct9 foo9 = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'}, L9; +struct struct10 foo10 = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'}, L10; +struct struct11 foo11 = { + '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B'}, L11; +struct struct12 foo12 = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L'}, L12; +struct struct16 foo16 = { + 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p'}, L16; + +struct struct1 fun1() +{ + return foo1; +} +struct struct2 fun2() +{ + return foo2; +} +struct struct3 fun3() +{ + return foo3; +} +struct struct4 fun4() +{ + return foo4; +} +struct struct5 fun5() +{ + return foo5; +} +struct struct6 fun6() +{ + return foo6; +} +struct struct7 fun7() +{ + return foo7; +} +struct struct8 fun8() +{ + return foo8; +} +struct struct9 fun9() +{ + return foo9; +} +struct struct10 fun10() +{ + return foo10; +} +struct struct11 fun11() +{ + return foo11; +} +struct struct12 fun12() +{ + return foo12; +} +struct struct16 fun16() +{ + return foo16; +} + +void Fun1(foo1) + struct struct1 foo1; +{ + L1 = foo1; +} +void Fun2(foo2) + struct struct2 foo2; +{ + L2 = foo2; +} +void Fun3(foo3) + struct struct3 foo3; +{ + L3 = foo3; +} +void Fun4(foo4) + struct struct4 foo4; +{ + L4 = foo4; +} +void Fun5(foo5) + struct struct5 foo5; +{ + L5 = foo5; +} +void Fun6(foo6) + struct struct6 foo6; +{ + L6 = foo6; +} +void Fun7(foo7) + struct struct7 foo7; +{ + L7 = foo7; +} +void Fun8(foo8) + struct struct8 foo8; +{ + L8 = foo8; +} +void Fun9(foo9) + struct struct9 foo9; +{ + L9 = foo9; +} +void Fun10(foo10) + struct struct10 foo10; +{ + L10 = foo10; +} +void Fun11(foo11) + struct struct11 foo11; +{ + L11 = foo11; +} +void Fun12(foo12) + struct struct12 foo12; +{ + L12 = foo12; +} +void Fun16(foo16) + struct struct16 foo16; +{ + L16 = foo16; +} + +int main() +{ + + /* TEST C FUNCTIONS */ + L1 = fun1(); + L2 = fun2(); + L3 = fun3(); + L4 = fun4(); + L5 = fun5(); + L6 = fun6(); + L7 = fun7(); + L8 = fun8(); + L9 = fun9(); + L10 = fun10(); + L11 = fun11(); + L12 = fun12(); + L16 = fun16(); + + foo1.a = foo2.a = foo3.a = foo4.a = foo5.a = foo6.a = foo7.a = foo8.a = + foo9.a = foo10.a = foo11.a = foo12.a = foo16.a = '$'; + + Fun1(foo1); + Fun2(foo2); + Fun3(foo3); + Fun4(foo4); + Fun5(foo5); + Fun6(foo6); + Fun7(foo7); + Fun8(foo8); + Fun9(foo9); + Fun10(foo10); + Fun11(foo11); + Fun12(foo12); + Fun16(foo16); + + return 0; +} diff --git a/gdb/testsuite/gdb.base/structs.exp b/gdb/testsuite/gdb.base/structs.exp new file mode 100644 index 0000000000..a3397fb656 --- /dev/null +++ b/gdb/testsuite/gdb.base/structs.exp @@ -0,0 +1,153 @@ +# Copyright (C) 1996 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. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Jeff Law. (law@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set prototypes 0 +set testfile "structs" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +# build the first test case +execute_anywhere "rm -f ${binfile}.ci" +execute_anywhere "echo set prototypes 1 > ${binfile}.ci" +if { [compile "-g ${srcdir}/${subdir}/${srcfile} -o ${binfile} "] != "" } { + execute_anywhere "rm -f ${binfile}.ci" + # built the second test case since we can't use prototypes + warning "Prototypes not supported, rebuilding with -DNO_PROTOTYPES" + execute_anywhere "echo set prototypes 0 > ${binfile}.ci" + if { [compile "-g -DNO_PROTOTYPES ${srcdir}/${subdir}/${srcfile} -o ${binfile} "] != "" } { + perror "Couldn't compile ${testfile}.c" + return -1 + } +} + +# Create and source the file that provides information about the compiler +# used to compile the test case. +if { [compile "-E ${srcdir}/${subdir}/compiler.c >> ${binfile}.ci"] != "" } { + perror "Couldn't make ${binfile}.ci" + return -1 +} +source ${binfile}.ci + +# The a29k can't call functions, so don't even bother with this test. +if [istarget "a29k-*-udi"] then { + setup_xfail "a29k-*-udi" 2416 + fail "a29k-*-udi can not call functions" + continue +} + +# The h8300 simulator can't call functions, so don't even bother with this test. +if [istarget "h8300*-*-*"] then { + setup_xfail "h8300*-*-*" + fail "h8300*-*-* simulator can not call functions" + continue +} + +# FIXME: Before calling this proc, we should probably verify that +# we can call inferior functions and get a valid integral value +# returned. +# Note that it is OK to check for 0 or 1 as the returned values, because C +# specifies that the numeric value of a relational or logical expression +# (computed in the inferior) is 1 for true and 0 for false. + +proc do_function_calls {} { + global prototypes + global gcc_compiled + global prompt + + # First, call the "fun" functions and examine the value they return. + gdb_test "p fun1()" " = {a = 49 '1'}" + gdb_test "p fun2()" " = {a = 97 'a', b = 98 'b'}" + gdb_test "p fun3()" " = {a = 65 'A', b = 66 'B', c = 67 'C'}" + gdb_test "p fun4()" " = {a = 49 '1', b = 50 '2', c = 51 '3', d = 52 '4'}" + gdb_test "p fun5()" " = {a = 97 'a', b = 98 'b', c = 99 'c', d = 100 'd', e = 101 'e'}" + gdb_test "p fun6()" " = {a = 65 'A', b = 66 'B', c = 67 'C', d = 68 'D', e = 69 'E', f = 70 'F'}" + gdb_test "p fun7()" " = {a = 49 '1', b = 50 '2', c = 51 '3', d = 52 '4', e = 53 '5', f = 54 '6', g = 55 '7'}" + gdb_test "p fun8()" " = {a = 49 '1', b = 50 '2', c = 51 '3', d = 52 '4', e = 53 '5', f = 54 '6', g = 55 '7', h = 56 '8'}" + gdb_test "p fun9()" " = {a = 97 'a', b = 98 'b', c = 99 'c', d = 100 'd', e = 101 'e', f = 102 'f', g = 103 'g', h = 104 'h', i = 105 'i'}" + gdb_test "p fun10()" " = {a = 65 'A', b = 66 'B', c = 67 'C', d = 68 'D', e = 69 'E', f = 70 'F', g = 71 'G', h = 72 'H', i = 73 'I', j = 74 'J'}" + gdb_test "p fun11()" " = {a = 49 '1', b = 50 '2', c = 51 '3', d = 52 '4', e = 53 '5', f = 54 '6', g = 55 '7', h = 56 '8', i = 57 '9', j = 65 'A', k = 66 'B'}" + gdb_test "p fun12()" " = {a = 65 'A', b = 66 'B', c = 67 'C', d = 68 'D', e = 69 'E', f = 70 'F', g = 71 'G', h = 72 'H', i = 73 'I', j = 74 'J', k = 75 'K', l = 76 'L'}" + gdb_test "p fun16()" " = {a = 97 'a', b = 98 'b', c = 99 'c', d = 100 'd', e = 101 'e', f = 102 'f', g = 103 'g', h = 104 'h', i = 105 'i', j = 106 'j', k = 107 'k', l = 108 'l', m = 109 'm', n = 110 'n', o = 111 'o', p = 112 'p'}" + + # Now call the Fun functions to set the L* variables. This + # tests that gdb properly passes structures to functions. + gdb_test "p Fun1(foo1)" " = (void|0)" + gdb_test "p Fun2(foo2)" " = (void|0)" + gdb_test "p Fun3(foo3)" " = (void|0)" + gdb_test "p Fun4(foo4)" " = (void|0)" + gdb_test "p Fun5(foo5)" " = (void|0)" + gdb_test "p Fun6(foo6)" " = (void|0)" + gdb_test "p Fun7(foo7)" " = (void|0)" + gdb_test "p Fun8(foo8)" " = (void|0)" + gdb_test "p Fun9(foo9)" " = (void|0)" + gdb_test "p Fun10(foo10)" " = (void|0)" + gdb_test "p Fun11(foo11)" " = (void|0)" + gdb_test "p Fun12(foo12)" " = (void|0)" + gdb_test "p Fun16(foo16)" " = (void|0)" + + # Now print the L* variables and examine their values. + gdb_test "p L1" " = {a = 49 '1'}" + gdb_test "p L2" " = {a = 97 'a', b = 98 'b'}" + gdb_test "p L3" " = {a = 65 'A', b = 66 'B', c = 67 'C'}" + gdb_test "p L4" " = {a = 49 '1', b = 50 '2', c = 51 '3', d = 52 '4'}" + if {$gcc_compiled} then { + setup_xfail "hppa*-*-*" + } + gdb_test "p L5" " = {a = 97 'a', b = 98 'b', c = 99 'c', d = 100 'd', e = 101 'e'}" + if {$gcc_compiled} then { + setup_xfail "hppa*-*-*" + } + gdb_test "p L6" " = {a = 65 'A', b = 66 'B', c = 67 'C', d = 68 'D', e = 69 'E', f = 70 'F'}" + if {$gcc_compiled} then { + setup_xfail "hppa*-*-*" + } + gdb_test "p L7" " = {a = 49 '1', b = 50 '2', c = 51 '3', d = 52 '4', e = 53 '5', f = 54 '6', g = 55 '7'}" + gdb_test "p L8" " = {a = 49 '1', b = 50 '2', c = 51 '3', d = 52 '4', e = 53 '5', f = 54 '6', g = 55 '7', h = 56 '8'}" + gdb_test "p L9" " = {a = 97 'a', b = 98 'b', c = 99 'c', d = 100 'd', e = 101 'e', f = 102 'f', g = 103 'g', h = 104 'h', i = 105 'i'}" + gdb_test "p L10" " = {a = 65 'A', b = 66 'B', c = 67 'C', d = 68 'D', e = 69 'E', f = 70 'F', g = 71 'G', h = 72 'H', i = 73 'I', j = 74 'J'}" + gdb_test "p L11" " = {a = 49 '1', b = 50 '2', c = 51 '3', d = 52 '4', e = 53 '5', f = 54 '6', g = 55 '7', h = 56 '8', i = 57 '9', j = 65 'A', k = 66 'B'}" + gdb_test "p L12" " = {a = 65 'A', b = 66 'B', c = 67 'C', d = 68 'D', e = 69 'E', f = 70 'F', g = 71 'G', h = 72 'H', i = 73 'I', j = 74 'J', k = 75 'K', l = 76 'L'}" + gdb_test "p L16" " = {a = 97 'a', b = 98 'b', c = 99 'c', d = 100 'd', e = 101 'e', f = 102 'f', g = 103 'g', h = 104 'h', i = 105 'i', j = 106 'j', k = 107 'k', l = 108 'l', m = 109 'm', n = 110 'n', o = 111 'o', p = 112 'p'}" +} +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +send "set print sevenbit-strings\n" ; expect -re "$prompt $" +send "set print address off\n" ; expect -re "$prompt $" +send "set width 0\n" ; expect -re "$prompt $" + +if [runto_main] then { + do_function_calls +} else { + fail "C function calling tests suppressed" +} +return 0