GDB perf test on backtrace
authorYao Qi <yao@codesourcery.com>
Fri, 25 Oct 2013 08:12:20 +0000 (16:12 +0800)
committerYao Qi <yao@codesourcery.com>
Mon, 25 Nov 2013 01:12:38 +0000 (09:12 +0800)
gdb/testsuite/

2013-11-25  Yao Qi  <yao@codesourcery.com>

* gdb.perf/backtrace.c: New.
* gdb.perf/backtrace.exp: New.
* gdb.perf/backtrace.py: New.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.perf/backtrace.c [new file with mode: 0644]
gdb/testsuite/gdb.perf/backtrace.exp [new file with mode: 0644]
gdb/testsuite/gdb.perf/backtrace.py [new file with mode: 0644]

index 1c67062458c0d32c7dcffe28a44d7d9743e2b464..af7127aac6ad7c9ab9e64e80366165a6854a9200 100644 (file)
@@ -1,3 +1,9 @@
+2013-11-25  Yao Qi  <yao@codesourcery.com>
+
+       * gdb.perf/backtrace.c: New.
+       * gdb.perf/backtrace.exp: New.
+       * gdb.perf/backtrace.py: New.
+
 2013-11-24  Yao Qi  <yao@codesourcery.com>
 
        * gdb.perf/single-step.c: New.
diff --git a/gdb/testsuite/gdb.perf/backtrace.c b/gdb/testsuite/gdb.perf/backtrace.c
new file mode 100644 (file)
index 0000000..958a23f
--- /dev/null
@@ -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 (file)
index 0000000..53b06dd
--- /dev/null
@@ -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 (file)
index 0000000..447ab54
--- /dev/null
@@ -0,0 +1,50 @@
+# 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
+
+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."""
+        do_test_command = "bt %d" % self.depth
+        for _ in range(1, 15):
+            gdb.execute (do_test_command, False, True)
+
+    def execute_test(self):
+
+        line_size = 2
+        for _ 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