Add a test for profiling static executable
The function, main, is added to profiling output of static executable which must link against gcrt1.o. * Makeconfig (+link-static-before-libc): Use the first of $(CRT-$(@F)) and $(csu-objpfx)$(static-start-installed-name). * gmon/Makefile (tests): Add tst-gmon-static. (tests-static): Likewise. (CFLAGS-tst-gmon-static.c): New. (CRT-tst-gmon-static): Likewise. (DEFAULT-LDFLAGS-tst-gmon-static): Likewise. (tst-gmon-static-ENV): Likewise. (tests-special): Likewise. ($(objpfx)tst-gmon-static.out): Likewise. (clean-tst-gmon-static-data): Likewise. ($(objpfx)tst-gmon-static-gprof.out): Likewise. * gmon/tst-gmon-static-gprof.sh: New file. * gmon/tst-gmon-static.c: Likewise.
This commit is contained in:
parent
bc3821bb3b
commit
a4777c46af
17
ChangeLog
17
ChangeLog
|
@ -1,3 +1,20 @@
|
||||||
|
2017-10-14 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
* Makeconfig (+link-static-before-libc): Use the first of
|
||||||
|
$(CRT-$(@F)) and $(csu-objpfx)$(static-start-installed-name).
|
||||||
|
* gmon/Makefile (tests): Add tst-gmon-static.
|
||||||
|
(tests-static): Likewise.
|
||||||
|
(CFLAGS-tst-gmon-static.c): New.
|
||||||
|
(CRT-tst-gmon-static): Likewise.
|
||||||
|
(DEFAULT-LDFLAGS-tst-gmon-static): Likewise.
|
||||||
|
(tst-gmon-static-ENV): Likewise.
|
||||||
|
(tests-special): Likewise.
|
||||||
|
($(objpfx)tst-gmon-static.out): Likewise.
|
||||||
|
(clean-tst-gmon-static-data): Likewise.
|
||||||
|
($(objpfx)tst-gmon-static-gprof.out): Likewise.
|
||||||
|
* gmon/tst-gmon-static-gprof.sh: New file.
|
||||||
|
* gmon/tst-gmon-static.c: Likewise.
|
||||||
|
|
||||||
2017-10-13 Carlos O'Donell <carlos@redhat.com>
|
2017-10-13 Carlos O'Donell <carlos@redhat.com>
|
||||||
|
|
||||||
[BZ #22295]
|
[BZ #22295]
|
||||||
|
|
|
@ -422,7 +422,7 @@ ifndef +link-static
|
||||||
+link-static-before-libc = $(CC) -nostdlib -nostartfiles -static -o $@ \
|
+link-static-before-libc = $(CC) -nostdlib -nostartfiles -static -o $@ \
|
||||||
$(DEFAULT-LDFLAGS-$(@F)) \
|
$(DEFAULT-LDFLAGS-$(@F)) \
|
||||||
$(sysdep-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \
|
$(sysdep-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \
|
||||||
$(addprefix $(csu-objpfx),$(static-start-installed-name)) \
|
$(firstword $(CRT-$(@F)) $(csu-objpfx)$(static-start-installed-name)) \
|
||||||
$(+preinit) $(+prectorT) \
|
$(+preinit) $(+prectorT) \
|
||||||
$(filter-out $(addprefix $(csu-objpfx),start.o \
|
$(filter-out $(addprefix $(csu-objpfx),start.o \
|
||||||
$(start-installed-name))\
|
$(start-installed-name))\
|
||||||
|
|
|
@ -33,6 +33,9 @@ tests-static += tst-profile-static
|
||||||
LDFLAGS-tst-profile-static = -profile
|
LDFLAGS-tst-profile-static = -profile
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
tests += tst-gmon-static
|
||||||
|
tests-static += tst-gmon-static
|
||||||
|
|
||||||
ifeq (yesyes,$(have-fpie)$(build-shared))
|
ifeq (yesyes,$(have-fpie)$(build-shared))
|
||||||
tests += tst-gmon-pie
|
tests += tst-gmon-pie
|
||||||
tests-pie += tst-gmon-pie
|
tests-pie += tst-gmon-pie
|
||||||
|
@ -49,6 +52,14 @@ ifeq ($(run-built-tests),yes)
|
||||||
tests-special += $(objpfx)tst-gmon-gprof.out
|
tests-special += $(objpfx)tst-gmon-gprof.out
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
CFLAGS-tst-gmon-static.c := $(PIE-ccflag) -fno-omit-frame-pointer -pg
|
||||||
|
CRT-tst-gmon-static := $(csu-objpfx)gcrt1.o
|
||||||
|
DEFAULT-LDFLAGS-tst-gmon-static = $(no-pie-ldflag)
|
||||||
|
tst-gmon-static-ENV := GMON_OUT_PREFIX=$(objpfx)tst-gmon-static.data
|
||||||
|
ifeq ($(run-built-tests),yes)
|
||||||
|
tests-special += $(objpfx)tst-gmon-static-gprof.out
|
||||||
|
endif
|
||||||
|
|
||||||
CFLAGS-tst-gmon-pie.c := $(PIE-ccflag) -fno-omit-frame-pointer -pg
|
CFLAGS-tst-gmon-pie.c := $(PIE-ccflag) -fno-omit-frame-pointer -pg
|
||||||
CRT-tst-gmon-pie := $(csu-objpfx)gcrt1.o
|
CRT-tst-gmon-pie := $(csu-objpfx)gcrt1.o
|
||||||
tst-gmon-pie-ENV := GMON_OUT_PREFIX=$(objpfx)tst-gmon-pie.data
|
tst-gmon-pie-ENV := GMON_OUT_PREFIX=$(objpfx)tst-gmon-pie.data
|
||||||
|
@ -83,6 +94,16 @@ $(objpfx)tst-gmon-gprof.out: tst-gmon-gprof.sh $(objpfx)tst-gmon.out
|
||||||
$(SHELL) $< $(GPROF) $(objpfx)tst-gmon $(objpfx)tst-gmon.data.* > $@; \
|
$(SHELL) $< $(GPROF) $(objpfx)tst-gmon $(objpfx)tst-gmon.data.* > $@; \
|
||||||
$(evaluate-test)
|
$(evaluate-test)
|
||||||
|
|
||||||
|
$(objpfx)tst-gmon-static.out: clean-tst-gmon-static-data
|
||||||
|
clean-tst-gmon-static-data:
|
||||||
|
rm -f $(objpfx)tst-gmon-static.data.*
|
||||||
|
|
||||||
|
$(objpfx)tst-gmon-static-gprof.out: tst-gmon-static-gprof.sh \
|
||||||
|
$(objpfx)tst-gmon-static.out
|
||||||
|
$(SHELL) $< $(GPROF) $(objpfx)tst-gmon-static \
|
||||||
|
$(objpfx)tst-gmon-static.data.* > $@; \
|
||||||
|
$(evaluate-test)
|
||||||
|
|
||||||
$(objpfx)tst-gmon-pie.out: clean-tst-gmon-pie-data
|
$(objpfx)tst-gmon-pie.out: clean-tst-gmon-pie-data
|
||||||
clean-tst-gmon-pie-data:
|
clean-tst-gmon-pie-data:
|
||||||
rm -f $(objpfx)tst-gmon-pie.data.*
|
rm -f $(objpfx)tst-gmon-pie.data.*
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# Check the output of gprof against a carfully crafted static 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
|
||||||
|
main 1
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Special version for powerpc with function descriptors.
|
||||||
|
cat > "$expected_dot" <<EOF
|
||||||
|
.f1 2000
|
||||||
|
.f2 1000
|
||||||
|
.main 1
|
||||||
|
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
|
|
@ -0,0 +1 @@
|
||||||
|
#include "tst-gmon.c"
|
Loading…
Reference in New Issue