From patchwork Thu Oct 12 20:07:46 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 23511 Received: (qmail 128060 invoked by alias); 12 Oct 2017 20:07:59 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 127129 invoked by uid 89); 12 Oct 2017 20:07:59 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.3 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-qt0-f170.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:subject:message-id:mime-version :content-disposition:user-agent; bh=loQgAI8LIM1YJWA4cYX3x9fFt5iXmiSdG75E5YdsMvY=; b=E7BiQwIn3UiY7R+zQ+G5e+e3Q7ajg42jS3zTBcmOLCXuqyiwwZ/ElWmCsYdGWYiRSg qH4bPJccJzMQWQ0fooMU+EZT8ZS7g+thO3Yz0c39qcp46RzEi8xKvzFEXtCsuuImcFSI jDxRydoRUHoVlTZdmDPQGaHxE1+N8yLTLTZnYxqJ7pT4LGU8oVbfRkgc0pV3eFUKQMrb VO/gOc3SVmkxb3bhiz3Z9b6en1p/Yp7+/A1XT0YAkAPNI54whC4RImMKP5n1TF/GSM6/ 1rYYF6DAE2hMG23wOcz9Fxg/s48pz623k0B2tjN4rHUM+2OeK0rD2u6E68J/Gy0ZnR05 4R5g== X-Gm-Message-State: AMCzsaWB/ZmedgZZsfMq/CR1rICPbfVPOFqCo1Xu7wCX5rXv9t1z0lqD 8bmz1VJ3MjcES6zuAfJKGtjRZPbh X-Google-Smtp-Source: AOwi7QArqV//cYaPFp6STE4/7sOhMIWrXL0UdFOjuHY+2oWWSqTr18dLwL1/3k2Ztf6EcZ10gLGFkg== X-Received: by 10.13.208.6 with SMTP id s6mr2746061ywd.154.1507838875072; Thu, 12 Oct 2017 13:07:55 -0700 (PDT) Date: Thu, 12 Oct 2017 13:07:46 -0700 From: "H.J. Lu" To: GNU C Library Subject: [PATCH] Add a test for profiling static executable Message-ID: <20171012200746.GA4334@gmail.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.9.1 (2017-09-22) The function, main, is added to profiling output of static executable which must link against gcrt1.o. Tested on x86-64. OK for master? H.J. --- * 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. --- Makeconfig | 2 +- gmon/Makefile | 21 +++++++++++++++ gmon/tst-gmon-static-gprof.sh | 62 +++++++++++++++++++++++++++++++++++++++++++ gmon/tst-gmon-static.c | 1 + 4 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 gmon/tst-gmon-static-gprof.sh create mode 100644 gmon/tst-gmon-static.c diff --git a/Makeconfig b/Makeconfig index 5ff6f2e29a..1346109ac0 100644 --- a/Makeconfig +++ b/Makeconfig @@ -422,7 +422,7 @@ ifndef +link-static +link-static-before-libc = $(CC) -nostdlib -nostartfiles -static -o $@ \ $(DEFAULT-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) \ $(filter-out $(addprefix $(csu-objpfx),start.o \ $(start-installed-name))\ diff --git a/gmon/Makefile b/gmon/Makefile index 2cd077dece..89ab3fc7da 100644 --- a/gmon/Makefile +++ b/gmon/Makefile @@ -33,6 +33,9 @@ tests-static += tst-profile-static LDFLAGS-tst-profile-static = -profile endif +tests += tst-gmon-static +tests-static += tst-gmon-static + ifeq (yesyes,$(have-fpie)$(build-shared)) tests += tst-gmon-pie tests-pie += tst-gmon-pie @@ -49,6 +52,14 @@ ifeq ($(run-built-tests),yes) tests-special += $(objpfx)tst-gmon-gprof.out 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 CRT-tst-gmon-pie := $(csu-objpfx)gcrt1.o 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.* > $@; \ $(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 clean-tst-gmon-pie-data: rm -f $(objpfx)tst-gmon-pie.data.* diff --git a/gmon/tst-gmon-static-gprof.sh b/gmon/tst-gmon-static-gprof.sh new file mode 100644 index 0000000000..55ac8aa69f --- /dev/null +++ b/gmon/tst-gmon-static-gprof.sh @@ -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 +# . + +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" < "$expected_dot" < "$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-static.c b/gmon/tst-gmon-static.c new file mode 100644 index 0000000000..1eef2583b6 --- /dev/null +++ b/gmon/tst-gmon-static.c @@ -0,0 +1 @@ +#include "tst-gmon.c"