123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- /* Copyright 2019-2022 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 test sets up a call stack that looks like this:
- #11 #10 #9 #8 #7 #6 #5 #4 #3 #2 #1 #0
- main -> aaa -> bbb -> ccc -> ddd -> eee -> fff -> ggg -> hhh -> iii -> jjj -> kkk
- \_______________________/ \________/ \______________________/ \________/
- Inline sequence #1 Normal Inline sequence #2 Normal
- We use the 'start' command to move into main, after that we 'step'
- through each function until we are in kkk. We then use the 'up' command
- to look back at each from to main.
- The test checks that we can handle and step through sequences of more
- than one inline frame (so 'main .... ccc', and 'fff .... iii'), and also
- that we can move around in a stack that contains more than one disjoint
- sequence of inline frames.
- The order of the functions in this file is deliberately mixed up so that
- the line numbers are not "all ascending" or "all descending" in the line
- table. */
- #define INLINE_FUNCTION __attribute__ ((always_inline)) static inline
- #define NON_INLINE_FUNCTION __attribute__ ((noinline))
- volatile int global_var = 0;
- INLINE_FUNCTION int aaa ();
- INLINE_FUNCTION int bbb ();
- INLINE_FUNCTION int ccc ();
- NON_INLINE_FUNCTION int ddd ();
- NON_INLINE_FUNCTION int eee ();
- NON_INLINE_FUNCTION int fff ();
- INLINE_FUNCTION int ggg ();
- INLINE_FUNCTION int hhh ();
- INLINE_FUNCTION int iii ();
- NON_INLINE_FUNCTION int jjj ();
- NON_INLINE_FUNCTION int kkk ();
- INLINE_FUNCTION int
- aaa ()
- { /* aaa prologue */
- asm ("aaa_label: .globl aaa_label");
- return bbb () + 1; /* aaa return */
- } /* aaa end */
- NON_INLINE_FUNCTION int
- jjj ()
- { /* jjj prologue */
- int ans;
- asm ("jjj_label: .globl jjj_label");
- ans = kkk () + 1; /* jjj return */
- asm ("jjj_label2: .globl jjj_label2");
- return ans;
- } /* jjj end */
- INLINE_FUNCTION int
- ggg ()
- { /* ggg prologue */
- asm ("ggg_label: .globl ggg_label");
- return hhh () + 1; /* ggg return */
- } /* ggg end */
- INLINE_FUNCTION int
- ccc ()
- { /* ccc prologue */
- asm ("ccc_label: .globl ccc_label");
- return ddd () + 1; /* ccc return */
- } /* ccc end */
- NON_INLINE_FUNCTION int
- fff ()
- { /* fff prologue */
- int ans;
- asm ("fff_label: .globl fff_label");
- ans = ggg () + 1; /* fff return */
- asm ("fff_label2: .globl fff_label2");
- return ans;
- } /* fff end */
- NON_INLINE_FUNCTION int
- kkk ()
- { /* kkk prologue */
- asm ("kkk_label: .globl kkk_label");
- return global_var; /* kkk return */
- } /* kkk end */
- INLINE_FUNCTION int
- bbb ()
- { /* bbb prologue */
- asm ("bbb_label: .globl bbb_label");
- return ccc () + 1; /* bbb return */
- } /* bbb end */
- INLINE_FUNCTION int
- hhh ()
- { /* hhh prologue */
- asm ("hh_label: .globl hhh_label");
- return iii () + 1; /* hhh return */
- } /* hhh end */
- int
- main ()
- { /* main prologue */
- int ans;
- asm ("main_label: .globl main_label");
- global_var = 0; /* main set global_var */
- asm ("main_label2: .globl main_label2");
- ans = aaa () + 1; /* main call aaa */
- asm ("main_label3: .globl main_label3");
- return ans;
- } /* main end */
- NON_INLINE_FUNCTION int
- ddd ()
- { /* ddd prologue */
- int ans;
- asm ("ddd_label: .globl ddd_label");
- ans = eee () + 1; /* ddd return */
- asm ("ddd_label2: .globl ddd_label2");
- return ans;
- } /* ddd end */
- INLINE_FUNCTION int
- iii ()
- { /* iii prologue */
- int ans;
- asm ("iii_label: .globl iii_label");
- ans = jjj () + 1; /* iii return */
- asm ("iii_label2: .globl iii_label2");
- return ans;
- } /* iii end */
- NON_INLINE_FUNCTION int
- eee ()
- { /* eee prologue */
- int ans;
- asm ("eee_label: .globl eee_label");
- ans = fff () + 1; /* eee return */
- asm ("eee_label2: .globl eee_label2");
- return ans;
- } /* eee end */
|