
This commit is the result of the following actions: - Running gdb/copyright.py to update all of the copyright headers to include 2024, - Manually updating a few files the copyright.py script told me to update, these files had copyright headers embedded within the file, - Regenerating gdbsupport/Makefile.in to refresh it's copyright date, - Using grep to find other files that still mentioned 2023. If these files were updated last year from 2022 to 2023 then I've updated them this year to 2024. I'm sure I've probably missed some dates. Feel free to fix them up as you spot them.
158 lines
4.4 KiB
C
158 lines
4.4 KiB
C
/* Copyright 2019-2024 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 */
|