diff options
author | Yao Qi <yao@codesourcery.com> | 2013-10-25 16:12:20 +0800 |
---|---|---|
committer | Yao Qi <yao@codesourcery.com> | 2013-11-25 09:12:38 +0800 |
commit | 23e9d3b9cecfffc529b5d8bb2ddec7f3e312cd6d (patch) | |
tree | 5ea150bef938e9e06a0058b3f8b359052590b1ce /gdb/testsuite/gdb.perf | |
parent | 5a75f60bc2dfb9b9bf607438448ab67325526848 (diff) | |
download | fsf-binutils-gdb-23e9d3b9cecfffc529b5d8bb2ddec7f3e312cd6d.zip fsf-binutils-gdb-23e9d3b9cecfffc529b5d8bb2ddec7f3e312cd6d.tar.gz fsf-binutils-gdb-23e9d3b9cecfffc529b5d8bb2ddec7f3e312cd6d.tar.bz2 |
GDB perf test on backtrace
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.
Diffstat (limited to 'gdb/testsuite/gdb.perf')
-rw-r--r-- | gdb/testsuite/gdb.perf/backtrace.c | 54 | ||||
-rw-r--r-- | gdb/testsuite/gdb.perf/backtrace.exp | 66 | ||||
-rw-r--r-- | gdb/testsuite/gdb.perf/backtrace.py | 50 |
3 files changed, 170 insertions, 0 deletions
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..447ab54 --- /dev/null +++ b/gdb/testsuite/gdb.perf/backtrace.py @@ -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 |