From 23e9d3b9cecfffc529b5d8bb2ddec7f3e312cd6d Mon Sep 17 00:00:00 2001 From: Yao Qi Date: Fri, 25 Oct 2013 16:12:20 +0800 Subject: [PATCH] GDB perf test on backtrace gdb/testsuite/ 2013-11-25 Yao Qi * gdb.perf/backtrace.c: New. * gdb.perf/backtrace.exp: New. * gdb.perf/backtrace.py: New. --- gdb/testsuite/ChangeLog | 6 ++++ gdb/testsuite/gdb.perf/backtrace.c | 54 +++++++++++++++++++++++++++++ gdb/testsuite/gdb.perf/backtrace.exp | 66 ++++++++++++++++++++++++++++++++++++ gdb/testsuite/gdb.perf/backtrace.py | 50 +++++++++++++++++++++++++++ 4 files changed, 176 insertions(+) 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/ChangeLog b/gdb/testsuite/ChangeLog index 1c67062..af7127a 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-11-25 Yao Qi + + * gdb.perf/backtrace.c: New. + * gdb.perf/backtrace.exp: New. + * gdb.perf/backtrace.py: New. + 2013-11-24 Yao Qi * 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 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 . */ + +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 . + +# 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 . + +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 -- 2.7.4