| /* This testcase is part of GDB, the GNU debugger. |
| |
| Copyright 2018-2021 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 3 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, see <http://www.gnu.org/licenses/>. */ |
| |
| /* This file is used for testing GDBs ability to pass structures to, and |
| return structures from, functions. All of the structures in this test |
| are special in that they are small structures containing from 1 up to 5 |
| scalar fields, the fields can be inside nested structures, and there can |
| be empty structures around too. |
| |
| When compiled for C++ this file also tests structures containing static |
| members (which live in global memory). In addition, empty structures in C++ |
| have a size of 1 (compared to 0 in GNU C), which can effect structure |
| padding. |
| |
| This test is specifically written for RiscV and Aarch64, which both have |
| special ABI rules for structures like these, however, there should be no harm |
| in running these tests on other targets, though in many cases the |
| structures will treated no differently to the structures already covered |
| in the structs.exp test script. */ |
| |
| #include <string.h> |
| #include "../lib/attributes.h" |
| |
| /* Useful abreviations. */ |
| typedef char tc; |
| typedef short ts; |
| typedef int ti; |
| typedef long tl; |
| typedef long long tll; |
| typedef float tf; |
| typedef double td; |
| typedef long double tld; |
| |
| #ifdef TEST_COMPLEX |
| typedef float _Complex tfc; |
| typedef double _Complex tdc; |
| typedef long double _Complex tldc; |
| #endif /* TEST_COMPLEX */ |
| |
| #define MAKE_CHECK_FUNCS(TYPE) \ |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE \ |
| check_arg_ ## TYPE (struct TYPE arg) \ |
| { \ |
| return cmp_ ## TYPE (arg, ref_val_ ## TYPE); \ |
| } \ |
| \ |
| struct TYPE __attribute__((noinline)) ATTRIBUTE_NOCLONE \ |
| rtn_str_ ## TYPE (void) \ |
| { \ |
| return (ref_val_ ## TYPE); \ |
| } |
| |
| #define REF_VAL(NAME) struct NAME ref_val_ ## NAME |
| #define ES(NAME) struct { } NAME |
| |
| /* Test is either for a single type or two differing types. */ |
| #if defined tA && ! defined tB |
| #define tB tA |
| #endif |
| #if ! defined tB |
| #error "Incorrect configuration of tA and tB defines" |
| #endif |
| |
| /* Structures with a single field nested to various depths, along with |
| some empty structures. */ |
| struct struct_01_01 { ES(es1); struct { struct { tA a; } s1; } s2; }; |
| struct struct_01_02 { tA a; struct { struct { ES(es1); } s1; } s2; }; |
| struct struct_01_03 { struct { struct { ES(es1); } s1; } s2; ES(es1); struct { struct { tA a; } s3; } s4;}; |
| struct struct_01_04 { ES(es1); ES(es2); tA a; ES(es3); }; |
| |
| /* Structures with two fields nested to various depths, along with |
| some empty structures. */ |
| struct struct_02_01 { ES(es1); struct { struct { tA a; tB b; } s1; } s2; }; |
| struct struct_02_02 { tA a; struct { struct { ES(es1); } s1; } s2; tB b; }; |
| struct struct_02_03 { struct { struct { ES(es1); } s1; } s2; ES(es1); struct { struct { tA a; } s3; } s4; struct { struct { tB b; } s5; } s6;}; |
| struct struct_02_04 { ES(es1); ES(es2); tA a; ES(es3); tB b; }; |
| |
| /* Structures with four fields nested to various depths, along with |
| some empty structures. */ |
| struct struct_04_01 { ES(es1); struct { struct { tA a; tB b; tA c; tB d; } s1; } s2; }; |
| struct struct_04_02 { tA a; struct { struct { ES(es1); } s1; } s2; tB b; struct { struct { ES(es1); } s2; } s3; tA c; struct { struct { ES(es2); } s4; } s5; tB d;}; |
| struct struct_04_03 { struct { struct { ES(es1); } s1; } s2; ES(es1); struct { struct { tA a; } s3; } s4; struct { struct { tB b; } s5; } s6; struct { struct { tA c; } s7; } s8; struct { struct { tB d; } s9; } s10;}; |
| struct struct_04_04 { ES(es1); ES(es2); tA a; ES(es3); tB b; ES(es4); tA c; ES(es5); tB d; }; |
| |
| /* Structures with five fields nested to various depths, along with |
| some empty structures. */ |
| struct struct_05_01 { ES(es1); struct { struct { tA a; tB b; tA c; tB d; tA e; } s1; } s2; }; |
| struct struct_05_02 { tA a; struct { struct { ES(es1); } s1; } s2; tB b; struct { struct { ES(es1); } s2; } s3; tA c; struct { struct { ES(es2); } s4; } s5; tB d; struct { struct { ES(es2); } s6; } s7; tB e;}; |
| struct struct_05_03 { struct { struct { ES(es1); } s1; } s2; ES(es1); struct { struct { tA a; } s3; } s4; struct { struct { tB b; } s5; } s6; struct { struct { tA c; } s7; } s8; struct { struct { tB d; } s9; } s10; struct { struct { tA e; } s11; } s12;}; |
| struct struct_05_04 { ES(es1); ES(es2); tA a; ES(es3); tB b; ES(es4); tA c; ES(es5); tB d; ES(es6); tA e; }; |
| |
| /* Only C++ allows structures to have static members. */ |
| #ifdef __cplusplus |
| |
| /* Structures with two fields nested to various depths, one of which is static. |
| Some include empty structures. */ |
| struct struct_static_02_01 { struct sa { struct sb { tA a; static tB b; } s1; } s2; }; |
| struct struct_static_02_02 { static tA a; struct { struct { ES(es1); } s1; } s2; tB b; }; |
| struct struct_static_02_03 { struct { struct { ES(es1); } s1; } s2; ES(es1); struct { struct { tA a; } s3; } s4; struct sa { struct sb { static tB b; } s5; } s6;}; |
| struct struct_static_02_04 { static tA a; tB b; }; |
| |
| /* Structures with four fields nested to various depths, some of which are |
| static. Some include empty structures. */ |
| struct struct_static_04_01 { struct sa { struct sb { static tA a; tB b; tA c; tB d; } s1; } s2; }; |
| struct struct_static_04_02 { tA a; struct { struct { ES(es1); } s1; } s2; tB b; struct { struct { ES(es1); } s2; } s3; static tA c; struct { struct { ES(es2); } s4; } s5; static tB d;}; |
| struct struct_static_04_03 { struct sa { struct sb { static tA a; } s3; } s4; struct sc { struct sd { static tB b; } s5; } s6; struct se { struct sf { static tA c; } s7; } s8; struct sg { struct sh { static tB d; } s9; } s10;}; |
| struct struct_static_04_04 { ES(es1); ES(es2); tA a; ES(es3); tB b; ES(es4); tA c; ES(es5); static tB d; }; |
| |
| /* Structures with six fields nested to various depths, some of which are |
| static. Some include empty structures. */ |
| struct struct_static_06_01 { struct sa { struct sb { tA a; static tB b; tA c; tB d; tA e; } s1; } s2; tB f; }; |
| struct struct_static_06_02 { tA a; static tB b; static tA c; tB d; tB e; tA f;}; |
| struct struct_static_06_03 { struct { struct { ES(es1); } s1; } s2; ES(es1); struct sa { struct sb { static tA a; } s3; } s4; struct sc { struct sd { tB b; } s5; } s6; struct se { struct sf { static tA c; } s7; } s8; struct sg { struct sh { static tB d; } s9; } s10; struct { struct { tA e; tB f; } s11; } s12;}; |
| struct struct_static_06_04 { ES(es1); ES(es2); static tA a; ES(es3); static tB b; ES(es4); static tA c; ES(es5); static tB d; ES(es6); static tA e; ES(es7); tB f; }; |
| |
| #endif |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_01_01 (struct struct_01_01 a, struct struct_01_01 b) |
| { return a.s2.s1.a == b.s2.s1.a; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_01_02 (struct struct_01_02 a, struct struct_01_02 b) |
| { return a.a == b.a; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_01_03 (struct struct_01_03 a, struct struct_01_03 b) |
| { return a.s4.s3.a == b.s4.s3.a; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_01_04 (struct struct_01_04 a, struct struct_01_04 b) |
| { return a.a == b.a; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_02_01 (struct struct_02_01 a, struct struct_02_01 b) |
| { return a.s2.s1.a == b.s2.s1.a && a.s2.s1.b == b.s2.s1.b; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_02_02 (struct struct_02_02 a, struct struct_02_02 b) |
| { return a.a == b.a && a.b == b.b; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_02_03 (struct struct_02_03 a, struct struct_02_03 b) |
| { return a.s4.s3.a == b.s4.s3.a && a.s6.s5.b == b.s6.s5.b; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_02_04 (struct struct_02_04 a, struct struct_02_04 b) |
| { return a.a == b.a && a.b == b.b; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_04_01 (struct struct_04_01 a, struct struct_04_01 b) |
| { return a.s2.s1.a == b.s2.s1.a && a.s2.s1.b == b.s2.s1.b |
| && a.s2.s1.c == b.s2.s1.c && a.s2.s1.d == b.s2.s1.d; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_04_02 (struct struct_04_02 a, struct struct_04_02 b) |
| { return a.a == b.a && a.b == b.b && a.c == b.c && a.d == b.d; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_04_03 (struct struct_04_03 a, struct struct_04_03 b) |
| { return a.s4.s3.a == b.s4.s3.a && a.s6.s5.b == b.s6.s5.b |
| && a.s8.s7.c == b.s8.s7.c && a.s10.s9.d == b.s10.s9.d; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_04_04 (struct struct_04_04 a, struct struct_04_04 b) |
| { return a.a == b.a && a.b == b.b && a.c == b.c && a.d == b.d; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_05_01 (struct struct_05_01 a, struct struct_05_01 b) |
| { return a.s2.s1.a == b.s2.s1.a && a.s2.s1.b == b.s2.s1.b |
| && a.s2.s1.c == b.s2.s1.c && a.s2.s1.d == b.s2.s1.d |
| && a.s2.s1.e == b.s2.s1.e; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_05_02 (struct struct_05_02 a, struct struct_05_02 b) |
| { return a.a == b.a && a.b == b.b && a.c == b.c && a.d == b.d && a.e == b.e; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_05_03 (struct struct_05_03 a, struct struct_05_03 b) |
| { return a.s4.s3.a == b.s4.s3.a && a.s6.s5.b == b.s6.s5.b |
| && a.s8.s7.c == b.s8.s7.c && a.s10.s9.d == b.s10.s9.d |
| && a.s12.s11.e == b.s12.s11.e; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_05_04 (struct struct_05_04 a, struct struct_05_04 b) |
| { return a.a == b.a && a.b == b.b && a.c == b.c && a.d == b.d && a.e == b.e; } |
| |
| #ifdef __cplusplus |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_static_02_01 (struct struct_static_02_01 a, |
| struct struct_static_02_01 b) |
| { return a.s2.s1.a == b.s2.s1.a && a.s2.s1.b == b.s2.s1.b; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_static_02_02 (struct struct_static_02_02 a, |
| struct struct_static_02_02 b) |
| { return a.a == b.a && a.b == b.b; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_static_02_03 (struct struct_static_02_03 a, |
| struct struct_static_02_03 b) |
| { return a.s4.s3.a == b.s4.s3.a && a.s6.s5.b == b.s6.s5.b; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_static_02_04 (struct struct_static_02_04 a, |
| struct struct_static_02_04 b) |
| { return a.a == b.a && a.b == b.b; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_static_04_01 (struct struct_static_04_01 a, |
| struct struct_static_04_01 b) |
| { return a.s2.s1.a == b.s2.s1.a && a.s2.s1.b == b.s2.s1.b |
| && a.s2.s1.c == b.s2.s1.c && a.s2.s1.d == b.s2.s1.d; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_static_04_02 (struct struct_static_04_02 a, |
| struct struct_static_04_02 b) |
| { return a.a == b.a && a.b == b.b && a.c == b.c && a.d == b.d; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_static_04_03 (struct struct_static_04_03 a, |
| struct struct_static_04_03 b) |
| { return a.s4.s3.a == b.s4.s3.a && a.s6.s5.b == b.s6.s5.b |
| && a.s8.s7.c == b.s8.s7.c && a.s10.s9.d == b.s10.s9.d; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_static_04_04 (struct struct_static_04_04 a, |
| struct struct_static_04_04 b) |
| { return a.a == b.a && a.b == b.b && a.c == b.c && a.d == b.d; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_static_06_01 (struct struct_static_06_01 a, |
| struct struct_static_06_01 b) |
| { return a.s2.s1.a == b.s2.s1.a && a.s2.s1.b == b.s2.s1.b |
| && a.s2.s1.c == b.s2.s1.c && a.s2.s1.d == b.s2.s1.d |
| && a.s2.s1.e == b.s2.s1.e && a.f == b.f; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_static_06_02 (struct struct_static_06_02 a, |
| struct struct_static_06_02 b) |
| { return a.a == b.a && a.b == b.b && a.c == b.c && a.d == b.d && a.e == b.e |
| && a.f == b.f; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_static_06_03 (struct struct_static_06_03 a, |
| struct struct_static_06_03 b) |
| { return a.s4.s3.a == b.s4.s3.a && a.s6.s5.b == b.s6.s5.b |
| && a.s8.s7.c == b.s8.s7.c && a.s10.s9.d == b.s10.s9.d |
| && a.s12.s11.e == b.s12.s11.e && a.s12.s11.f == b.s12.s11.f; } |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| cmp_struct_static_06_04 (struct struct_static_06_04 a, |
| struct struct_static_06_04 b) |
| { return a.a == b.a && a.b == b.b && a.c == b.c && a.d == b.d && a.e == b.e |
| && a.f == b.f; } |
| |
| #endif |
| |
| REF_VAL(struct_01_01) = { {}, { { 'a' } } }; |
| REF_VAL(struct_01_02) = { 'a', { { {} } } }; |
| REF_VAL(struct_01_03) = { { { {} } }, {}, { { 'a' } } }; |
| REF_VAL(struct_01_04) = { {}, {}, 'a', {} }; |
| |
| REF_VAL(struct_02_01) = { {}, { { 'a', 'b' } } }; |
| REF_VAL(struct_02_02) = { 'a', { { {} } }, 'b' }; |
| REF_VAL(struct_02_03) = { { { {} } }, {}, { { 'a' } }, { { 'b' } } }; |
| REF_VAL(struct_02_04) = { {}, {}, 'a', {}, 'b' }; |
| |
| REF_VAL(struct_04_01) = { {}, { { 'a', 'b', 'c', 'd' } } }; |
| REF_VAL(struct_04_02) = { 'a', { { {} } }, 'b', { { {} } }, 'c', { { {} } }, 'd' }; |
| REF_VAL(struct_04_03) = { { { {} } }, {}, { { 'a' } }, { { 'b' } }, { { 'c' } }, { { 'd' } } }; |
| REF_VAL(struct_04_04) = { {}, {}, 'a', {}, 'b', {}, 'c', {}, 'd' }; |
| |
| REF_VAL(struct_05_01) = { {}, { { 'a', 'b', 'c', 'd', 'e' } } }; |
| REF_VAL(struct_05_02) = { 'a', { { {} } }, 'b', { { {} } }, 'c', { { {} } }, 'd', { { {} } }, 'e' }; |
| REF_VAL(struct_05_03) = { { { {} } }, {}, { { 'a' } }, { { 'b' } }, { { 'c' } }, { { 'd' } }, { { 'e' } } }; |
| REF_VAL(struct_05_04) = { {}, {}, 'a', {}, 'b', {}, 'c', {}, 'd', {}, 'e' }; |
| |
| #ifdef __cplusplus |
| |
| /* Initialise static members. */ |
| tB struct_static_02_01::sa::sb::b = '1'; |
| tA struct_static_02_02::a = '2'; |
| tB struct_static_02_03::sa::sb::b = '3'; |
| tA struct_static_02_04::a = '4'; |
| tA struct_static_04_01::sa::sb::a = '5'; |
| tA struct_static_04_02::c = '6'; |
| tB struct_static_04_02::d = '7'; |
| tA struct_static_04_03::sa::sb::a = '8'; |
| tB struct_static_04_03::sc::sd::b = '9'; |
| tA struct_static_04_03::se::sf::c = '0'; |
| tB struct_static_04_03::sg::sh::d = 'A'; |
| tB struct_static_04_04::d = 'B'; |
| tB struct_static_06_01::sa::sb::b = 'C'; |
| tB struct_static_06_02::b = 'D'; |
| tA struct_static_06_02::c = 'E'; |
| tA struct_static_06_03::sa::sb::a = 'F'; |
| tA struct_static_06_03::se::sf::c = 'G'; |
| tB struct_static_06_03::sg::sh::d = 'H'; |
| tA struct_static_06_04::a = 'I'; |
| tB struct_static_06_04::b = 'J'; |
| tA struct_static_06_04::c = 'K'; |
| tB struct_static_06_04::d = 'L'; |
| tA struct_static_06_04::e = 'M'; |
| |
| REF_VAL(struct_static_02_01) = { { { 'a' } } }; |
| REF_VAL(struct_static_02_02) = { { { {} } }, 'b' }; |
| REF_VAL(struct_static_02_03) = { { { {} } }, {}, { { 'a' } }, { { } } }; |
| REF_VAL(struct_static_02_04) = { 'b' }; |
| REF_VAL(struct_static_04_01) = { { { 'b', 'c', 'd' } } }; |
| REF_VAL(struct_static_04_02) = { 'a', { { {} } }, 'b', { { {} } }, { { {} } } }; |
| REF_VAL(struct_static_04_03) = {}; |
| REF_VAL(struct_static_04_04) = { {}, {}, 'a', {}, 'b', {}, 'c', {} }; |
| REF_VAL(struct_static_06_01) = { { { 'a', 'c', 'd', 'e' } }, 'f' }; |
| REF_VAL(struct_static_06_02) = { 'a', 'd', 'e', 'f' }; |
| REF_VAL(struct_static_06_03) = { { { {} } }, {}, {}, { { 'b' } }, {}, /*{ { 'e', 'f' } }*/ }; |
| REF_VAL(struct_static_06_04) = { {}, {}, {}, {}, {}, {}, {}, 'f' }; |
| |
| #endif |
| |
| /* Create all of the functions GDB will call to check functionality. */ |
| MAKE_CHECK_FUNCS(struct_01_01) |
| MAKE_CHECK_FUNCS(struct_01_02) |
| MAKE_CHECK_FUNCS(struct_01_03) |
| MAKE_CHECK_FUNCS(struct_01_04) |
| MAKE_CHECK_FUNCS(struct_02_01) |
| MAKE_CHECK_FUNCS(struct_02_02) |
| MAKE_CHECK_FUNCS(struct_02_03) |
| MAKE_CHECK_FUNCS(struct_02_04) |
| MAKE_CHECK_FUNCS(struct_04_01) |
| MAKE_CHECK_FUNCS(struct_04_02) |
| MAKE_CHECK_FUNCS(struct_04_03) |
| MAKE_CHECK_FUNCS(struct_04_04) |
| MAKE_CHECK_FUNCS(struct_05_01) |
| MAKE_CHECK_FUNCS(struct_05_02) |
| MAKE_CHECK_FUNCS(struct_05_03) |
| MAKE_CHECK_FUNCS(struct_05_04) |
| #ifdef __cplusplus |
| MAKE_CHECK_FUNCS(struct_static_02_01) |
| MAKE_CHECK_FUNCS(struct_static_02_02) |
| MAKE_CHECK_FUNCS(struct_static_02_03) |
| MAKE_CHECK_FUNCS(struct_static_02_04) |
| MAKE_CHECK_FUNCS(struct_static_04_01) |
| MAKE_CHECK_FUNCS(struct_static_04_02) |
| MAKE_CHECK_FUNCS(struct_static_04_03) |
| MAKE_CHECK_FUNCS(struct_static_04_04) |
| MAKE_CHECK_FUNCS(struct_static_06_01) |
| MAKE_CHECK_FUNCS(struct_static_06_02) |
| MAKE_CHECK_FUNCS(struct_static_06_03) |
| MAKE_CHECK_FUNCS(struct_static_06_04) |
| #endif |
| |
| #define CALL_LINE(NAME) val += check_arg_ ## NAME (rtn_str_ ## NAME ()) |
| |
| int __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| call_all () |
| { |
| int val = 0; |
| |
| CALL_LINE(struct_01_01); |
| CALL_LINE(struct_01_02); |
| CALL_LINE(struct_01_03); |
| CALL_LINE(struct_01_04); |
| CALL_LINE(struct_02_01); |
| CALL_LINE(struct_02_02); |
| CALL_LINE(struct_02_03); |
| CALL_LINE(struct_02_04); |
| CALL_LINE(struct_04_01); |
| CALL_LINE(struct_04_02); |
| CALL_LINE(struct_04_03); |
| CALL_LINE(struct_04_04); |
| CALL_LINE(struct_05_01); |
| CALL_LINE(struct_05_02); |
| CALL_LINE(struct_05_03); |
| CALL_LINE(struct_05_04); |
| #ifdef __cplusplus |
| CALL_LINE(struct_static_02_01); |
| CALL_LINE(struct_static_02_02); |
| CALL_LINE(struct_static_02_03); |
| CALL_LINE(struct_static_02_04); |
| CALL_LINE(struct_static_04_01); |
| CALL_LINE(struct_static_04_02); |
| CALL_LINE(struct_static_04_03); |
| CALL_LINE(struct_static_04_04); |
| CALL_LINE(struct_static_06_01); |
| CALL_LINE(struct_static_06_02); |
| CALL_LINE(struct_static_06_03); |
| CALL_LINE(struct_static_06_04); |
| #endif |
| |
| return val; |
| } |
| |
| int volatile v = 1; |
| |
| void __attribute__((noinline)) ATTRIBUTE_NOCLONE |
| breakpt (void) |
| { |
| v++; |
| } |
| |
| int |
| main () |
| { |
| int res; |
| |
| res = call_all (); |
| breakpt (); /* Break Here. */ |
| return res; |
| } |