mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
4a94e36819
This commit brings all the changes made by running gdb/copyright.py as per GDB's Start of New Year Procedure. For the avoidance of doubt, all changes in this commits were performed by the script.
159 lines
4.4 KiB
C
159 lines
4.4 KiB
C
/* 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 */
|