aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.dwarf2/dw2-inline-many-frames.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/testsuite/gdb.dwarf2/dw2-inline-many-frames.c')
-rw-r--r--gdb/testsuite/gdb.dwarf2/dw2-inline-many-frames.c158
1 files changed, 158 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-inline-many-frames.c b/gdb/testsuite/gdb.dwarf2/dw2-inline-many-frames.c
new file mode 100644
index 0000000..37905c1
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dw2-inline-many-frames.c
@@ -0,0 +1,158 @@
+/* Copyright 2019-2020 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 */