This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 3/3] Test on backtrace


gdb/testsuite/

	* gdb.perf/backtrace.c: New.
	* gdb.perf/backtrace.exp: New.
	* gdb.perf/backtrace.py: New.
---
 gdb/testsuite/gdb.perf/backtrace.c   |   54 +++++++++++++++++++++++++++
 gdb/testsuite/gdb.perf/backtrace.exp |   66 ++++++++++++++++++++++++++++++++++
 gdb/testsuite/gdb.perf/backtrace.py  |   51 ++++++++++++++++++++++++++
 3 files changed, 171 insertions(+), 0 deletions(-)
 create mode 100644 gdb/testsuite/gdb.perf/backtrace.c
 create mode 100644 gdb/testsuite/gdb.perf/backtrace.exp
 create mode 100644 gdb/testsuite/gdb.perf/backtrace.py

diff --git a/gdb/testsuite/gdb.perf/backtrace.c b/gdb/testsuite/gdb.perf/backtrace.c
new file mode 100644
index 0000000..958a23f
--- /dev/null
+++ b/gdb/testsuite/gdb.perf/backtrace.c
@@ -0,0 +1,54 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright (C) 2013 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/>.  */
+
+struct s
+{
+  int a[256];
+  char c[256];
+};
+
+static void
+fun2 (void)
+{
+
+}
+
+static void
+fun1 (int i, int j, long k, struct s ss)
+{
+  /* Allocate local variables on stack.  */
+  struct s s1;
+
+  if (i < BACKTRACE_DEPTH)
+    fun1 (i + 1, j + 2, k - 1, ss);
+  else
+    {
+      int ii;
+
+      for (ii = 0; ii < 10; ii++)
+	fun2 ();
+    }
+}
+
+int
+main (void)
+{
+  struct s ss;
+
+  fun1 (0, 0, 200, ss);
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.perf/backtrace.exp b/gdb/testsuite/gdb.perf/backtrace.exp
new file mode 100644
index 0000000..53b06dd
--- /dev/null
+++ b/gdb/testsuite/gdb.perf/backtrace.exp
@@ -0,0 +1,66 @@
+# Copyright (C) 2013 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 case is to test the performance of GDB doing stack
+# backtrace.
+# There is one parameter in this test:
+#  - BACKTRACE_DEPTH is the number of innermost frames that command
+#    'bt' prints.
+
+load_lib perftest.exp
+
+if [skip_perf_tests] {
+    return 0
+}
+
+standard_testfile .c
+set executable $testfile
+set expfile $testfile.exp
+
+# make check-perf RUNTESTFLAGS='backtrace.exp BACKTRACE_DEPTH=1024'
+if ![info exists BACKTRACE_DEPTH] {
+    set BACKTRACE_DEPTH 64
+}
+
+PerfTest::assemble {
+    global BACKTRACE_DEPTH
+    global srcdir subdir srcfile
+
+    set compile_flags {debug}
+    lappend compile_flags "additional_flags=-DBACKTRACE_DEPTH=${BACKTRACE_DEPTH}"
+
+    if { [gdb_compile "$srcdir/$subdir/$srcfile" ${binfile} executable $compile_flags] != ""} {
+	return -1
+    }
+
+    return 0
+} {
+    global binfile
+
+    clean_restart $binfile
+
+    if ![runto_main] {
+	fail "Can't run to main"
+	return -1
+    }
+
+    gdb_breakpoint "fun2"
+    gdb_continue_to_breakpoint "fun2"
+} {
+    global BACKTRACE_DEPTH
+
+    gdb_test "python BackTrace\($BACKTRACE_DEPTH\).run()"
+
+}
diff --git a/gdb/testsuite/gdb.perf/backtrace.py b/gdb/testsuite/gdb.perf/backtrace.py
new file mode 100644
index 0000000..6cfd8c3
--- /dev/null
+++ b/gdb/testsuite/gdb.perf/backtrace.py
@@ -0,0 +1,51 @@
+# Copyright (C) 2013 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/>.
+
+from perftest import perftest
+from perftest import measure
+
+class BackTrace (perftest.TestCaseWithBasicMeasurements):
+    def __init__(self, depth):
+        super (BackTrace, self).__init__ ("backtrace")
+        self.depth = depth
+
+    def warm_up(self):
+        # Warm up.
+        gdb.execute ("bt", False, True)
+        gdb.execute ("bt", False, True)
+
+    def _do_test(self):
+        """Do backtrace multiple times."""
+        for j in range(1, 15):
+            do_test_command = "bt %d" % self.depth
+            gdb.execute (do_test_command, False, True)
+
+    def execute_test(self):
+
+        line_size = 2
+        for i in range(1, 12):
+            # Keep the total size of dcache unchanged, and increase the
+            # line-size in the loop.
+            line_size_command = "set dcache line-size %d" % (line_size)
+            size_command = "set dcache size %d" % (4096 * 64 / line_size)
+            # Cache is cleared by changing line-size or size.
+            gdb.execute (line_size_command)
+            gdb.execute (size_command)
+
+            func = lambda: self._do_test()
+
+            self.measure.measure(func, line_size)
+
+            line_size *= 2
-- 
1.7.7.6


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]