diff options
author | Florian Weimer <fweimer@redhat.com> | 2017-08-15 15:49:40 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2017-08-15 15:49:45 +0200 |
commit | 6014c65de2ac75ac4ef147754d80c7992f07ece8 (patch) | |
tree | fb1c32b9acf4a86ce341a0ce8eb5923de389d30f /gmon | |
parent | ee72219a497b6317c49dc0a9a02308fe408c8c5e (diff) | |
download | glibc-6014c65de2ac75ac4ef147754d80c7992f07ece8.tar glibc-6014c65de2ac75ac4ef147754d80c7992f07ece8.tar.gz glibc-6014c65de2ac75ac4ef147754d80c7992f07ece8.tar.bz2 glibc-6014c65de2ac75ac4ef147754d80c7992f07ece8.zip |
gmon: Add test for basic mcount/gprof functionality
Diffstat (limited to 'gmon')
-rw-r--r-- | gmon/Makefile | 18 | ||||
-rw-r--r-- | gmon/tst-gmon-gprof.sh | 60 | ||||
-rw-r--r-- | gmon/tst-gmon.c | 50 |
3 files changed, 127 insertions, 1 deletions
diff --git a/gmon/Makefile b/gmon/Makefile index 6ff4cb0dfb..947e6b5905 100644 --- a/gmon/Makefile +++ b/gmon/Makefile @@ -27,7 +27,7 @@ routines := gmon mcount profil sprofil bb_init_func bb_exit_func prof-freq elide-routines.os = bb_init_func bb_exit_func -tests = tst-sprofil +tests = tst-sprofil tst-gmon ifeq ($(build-profile),yes) tests += tst-profile-static tests-static += tst-profile-static @@ -38,6 +38,12 @@ endif # The mcount code won't work without a frame pointer. CFLAGS-mcount.c := -fno-omit-frame-pointer +CFLAGS-tst-gmon.c := -pg +LDFLAGS-tst-gmon := $(no-pie-ldflag) +CRT-tst-gmon := $(csu-objpfx)gcrt1.o +tst-gmon-ENV := GMON_OUT_PREFIX=$(objpfx)tst-gmon.data +tests-special += $(objpfx)tst-gmon-gprof.out + include ../Rules # We cannot compile mcount.c with -pg because that would @@ -53,3 +59,13 @@ endif $(noprof:%=$(objpfx)%.op): %.op: %.o rm -f $@ ln $< $@ + +# GMON_OUTPUT_PREFIX only sets the output prefix. The actual file +# name contains the PID as well. +$(objpfx)tst-gmon.out: clean-tst-gmon-data +clean-tst-gmon-data: + rm -f $(objpfx)tst-gmon.data.* + +$(objpfx)tst-gmon-gprof.out: tst-gmon-gprof.sh $(objpfx)tst-gmon.out + $(SHELL) $< $(GPROF) $(objpfx)tst-gmon $(objpfx)tst-gmon.data.* > $@; \ + $(evaluate-test) diff --git a/gmon/tst-gmon-gprof.sh b/gmon/tst-gmon-gprof.sh new file mode 100644 index 0000000000..07887255c0 --- /dev/null +++ b/gmon/tst-gmon-gprof.sh @@ -0,0 +1,60 @@ +#!/bin/sh +# Check the output of gprof against a carfully crafted binary. +# Copyright (C) 2017 Free Software Foundation, Inc. +# This file is part of the GNU C Library. + +# The GNU C Library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. + +# The GNU C Library 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 +# Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public +# License along with the GNU C Library; if not, see +# <http://www.gnu.org/licenses/>. + +LC_ALL=C +export LC_ALL +set -e +exec 2>&1 + +GPROF="$1" +program="$2" +data="$3" + +actual=$(mktemp) +expected=$(mktemp) +expected_dot=$(mktemp) +cleanup () { + rm -f "$actual" + rm -f "$expected" + rm -f "$expected_dot" +} +trap cleanup 0 + +cat > "$expected" <<EOF +f1 2000 +f2 1000 +EOF + +# Special version for powerpc with function descriptors. +cat > "$expected_dot" <<EOF +.f1 2000 +.f2 1000 +EOF + +"$GPROF" -C "$program" "$data" \ + | awk -F '[(): ]' '/executions/{print $5, $8}' \ + | sort > "$actual" + +if cmp -s "$actual" "$expected_dot" \ + || diff -u --label expected "$expected" --label actual "$actual" ; then + echo "PASS" +else + echo "FAIL" + exit 1 +fi diff --git a/gmon/tst-gmon.c b/gmon/tst-gmon.c new file mode 100644 index 0000000000..ce81aa41b8 --- /dev/null +++ b/gmon/tst-gmon.c @@ -0,0 +1,50 @@ +/* Test program for profiling information collection (_mcount/gprof). + Copyright (C) 2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* This program does not use the test harness because we want tight + control over the call graph. */ + +__attribute__ ((noinline, noclone, weak)) void +f1 (void) +{ +} + +__attribute__ ((noinline, noclone, weak)) void +f2 (void) +{ + f1 (); + /* Prevent tail call. */ + asm volatile (""); +} + +__attribute__ ((noinline, noclone, weak)) void +f3 (int count) +{ + for (int i = 0; i < count; ++i) + { + f1 (); + f2 (); + } +} + +int +main (void) +{ + f3 (1000); + return 0; +} |