mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2024-12-13 15:05:46 +00:00
* 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.
This commit is contained in:
parent
46b6fdbd11
commit
bd3bab1eed
@ -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
|
||||
|
207
gdb/testsuite/gdb.base/structs.c
Normal file
207
gdb/testsuite/gdb.base/structs.c
Normal file
@ -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;
|
||||
}
|
153
gdb/testsuite/gdb.base/structs.exp
Normal file
153
gdb/testsuite/gdb.base/structs.exp
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user