gprof: Copy a simple test from glibc

Message ID CAMe9rOpN0akB_-1Bj=TAAkygDY8rvc9fP+5EgT+Fy0SXBYZFgQ@mail.gmail.com
State New
Headers
Series gprof: Copy a simple test from glibc |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_binutils_build--master-aarch64 fail Patch failed to apply
linaro-tcwg-bot/tcwg_binutils_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_binutils_check--master-arm fail Patch failed to apply

Commit Message

H.J. Lu March 6, 2025, 11 p.m. UTC
  Copy a simple gprof test from glibc to test the basic gprof functionality.

PR gprof/32764
* Makefile.am (SUBDIRS): Add testsuite
* configure.ac (AC_CONFIG_FILES): Removed.
(AC_OUTPUT): Add Makefile testsuite/Makefile
po/Makefile.in:po/Make-in.
(AM_CONDITIONAL): Add NATIVE.
* Makefile.in: Regenerated.
* configure: Likewise.
* testsuite/Makefile.am: New file.
* testsuite/tst-gmon-gprof.sh: Likewise.
* testsuite/tst-gmon.c: Likewise.
* testsuite/Makefile.in: Generated.
  

Comments

Alan Modra March 6, 2025, 11:57 p.m. UTC | #1
On Fri, Mar 07, 2025 at 07:00:41AM +0800, H.J. Lu wrote:
> Copy a simple gprof test from glibc to test the basic gprof functionality.

Good idea.  OK if you have tested this natively and for a cross target
with and without cross-compiler installed.
  
Sam James March 7, 2025, 12:51 a.m. UTC | #2
"H.J. Lu" <hjl.tools@gmail.com> writes:

> Copy a simple gprof test from glibc to test the basic gprof functionality.
>
> PR gprof/32764
> * Makefile.am (SUBDIRS): Add testsuite
> * configure.ac (AC_CONFIG_FILES): Removed.
> (AC_OUTPUT): Add Makefile testsuite/Makefile
> po/Makefile.in:po/Make-in.
> (AM_CONDITIONAL): Add NATIVE.
> * Makefile.in: Regenerated.
> * configure: Likewise.
> * testsuite/Makefile.am: New file.
> * testsuite/tst-gmon-gprof.sh: Likewise.
> * testsuite/tst-gmon.c: Likewise.
> * testsuite/Makefile.in: Generated.

Thanks and LGTM. I was considering sending the same but wasn't sure
about checking for if -pg worked was too much hassle. But it ends up
being simple in the end.
  
Jan Beulich March 28, 2025, 8:46 a.m. UTC | #3
On 07.03.2025 00:00, H.J. Lu wrote:
> Copy a simple gprof test from glibc to test the basic gprof functionality.
> 
> PR gprof/32764
> * Makefile.am (SUBDIRS): Add testsuite
> * configure.ac (AC_CONFIG_FILES): Removed.
> (AC_OUTPUT): Add Makefile testsuite/Makefile
> po/Makefile.in:po/Make-in.
> (AM_CONDITIONAL): Add NATIVE.
> * Makefile.in: Regenerated.
> * configure: Likewise.
> * testsuite/Makefile.am: New file.
> * testsuite/tst-gmon-gprof.sh: Likewise.
> * testsuite/tst-gmon.c: Likewise.
> * testsuite/Makefile.in: Generated.

This and the other new test fail for me on both x86-64 systems I tried - the
f3 line isn't present in gprof output. I fear I don't have the time to
investigate from grounds up. IOW either I need pointers that make
investigation reasonably easy, or I'll propose to disable the tests again
until this is sorted. The one thing I did check is that the object file has
all the supposed calls to mcount(). If it matters, one system is using gcc5,
the other gcc7.

Jan
  
H.J. Lu March 28, 2025, 3:23 p.m. UTC | #4
On Fri, Mar 28, 2025 at 1:46 AM Jan Beulich <jbeulich@suse.com> wrote:
>
> On 07.03.2025 00:00, H.J. Lu wrote:
> > Copy a simple gprof test from glibc to test the basic gprof functionality.
> >
> > PR gprof/32764
> > * Makefile.am (SUBDIRS): Add testsuite
> > * configure.ac (AC_CONFIG_FILES): Removed.
> > (AC_OUTPUT): Add Makefile testsuite/Makefile
> > po/Makefile.in:po/Make-in.
> > (AM_CONDITIONAL): Add NATIVE.
> > * Makefile.in: Regenerated.
> > * configure: Likewise.
> > * testsuite/Makefile.am: New file.
> > * testsuite/tst-gmon-gprof.sh: Likewise.
> > * testsuite/tst-gmon.c: Likewise.
> > * testsuite/Makefile.in: Generated.
>
> This and the other new test fail for me on both x86-64 systems I tried - the
> f3 line isn't present in gprof output. I fear I don't have the time to
> investigate from grounds up. IOW either I need pointers that make
> investigation reasonably easy, or I'll propose to disable the tests again
> until this is sorted. The one thing I did check is that the object file has
> all the supposed calls to mcount(). If it matters, one system is using gcc5,
> the other gcc7.
>
> Jan

These tests work for me with gcc 5.4.1 and 7.4.1.  Please try

https://sourceware.org/pipermail/binutils/2025-March/140257.html
  
Jan Beulich March 31, 2025, 7:56 a.m. UTC | #5
On 28.03.2025 16:23, H.J. Lu wrote:
> On Fri, Mar 28, 2025 at 1:46 AM Jan Beulich <jbeulich@suse.com> wrote:
>>
>> On 07.03.2025 00:00, H.J. Lu wrote:
>>> Copy a simple gprof test from glibc to test the basic gprof functionality.
>>>
>>> PR gprof/32764
>>> * Makefile.am (SUBDIRS): Add testsuite
>>> * configure.ac (AC_CONFIG_FILES): Removed.
>>> (AC_OUTPUT): Add Makefile testsuite/Makefile
>>> po/Makefile.in:po/Make-in.
>>> (AM_CONDITIONAL): Add NATIVE.
>>> * Makefile.in: Regenerated.
>>> * configure: Likewise.
>>> * testsuite/Makefile.am: New file.
>>> * testsuite/tst-gmon-gprof.sh: Likewise.
>>> * testsuite/tst-gmon.c: Likewise.
>>> * testsuite/Makefile.in: Generated.
>>
>> This and the other new test fail for me on both x86-64 systems I tried - the
>> f3 line isn't present in gprof output. I fear I don't have the time to
>> investigate from grounds up. IOW either I need pointers that make
>> investigation reasonably easy, or I'll propose to disable the tests again
>> until this is sorted. The one thing I did check is that the object file has
>> all the supposed calls to mcount(). If it matters, one system is using gcc5,
>> the other gcc7.
> 
> These tests work for me with gcc 5.4.1 and 7.4.1.  Please try
> 
> https://sourceware.org/pipermail/binutils/2025-March/140257.html

Well, tst-gmon.o clearly had debug info (incl .debug_line) already. So no
difference there. Ftaod tst-gmon similarly has debug info (incl .debug_line).
Must be something else, possibly in gprof itself.

Jan
  
H.J. Lu March 31, 2025, 3:02 p.m. UTC | #6
On Mon, Mar 31, 2025 at 12:56 AM Jan Beulich <jbeulich@suse.com> wrote:
>
> On 28.03.2025 16:23, H.J. Lu wrote:
> > On Fri, Mar 28, 2025 at 1:46 AM Jan Beulich <jbeulich@suse.com> wrote:
> >>
> >> On 07.03.2025 00:00, H.J. Lu wrote:
> >>> Copy a simple gprof test from glibc to test the basic gprof functionality.
> >>>
> >>> PR gprof/32764
> >>> * Makefile.am (SUBDIRS): Add testsuite
> >>> * configure.ac (AC_CONFIG_FILES): Removed.
> >>> (AC_OUTPUT): Add Makefile testsuite/Makefile
> >>> po/Makefile.in:po/Make-in.
> >>> (AM_CONDITIONAL): Add NATIVE.
> >>> * Makefile.in: Regenerated.
> >>> * configure: Likewise.
> >>> * testsuite/Makefile.am: New file.
> >>> * testsuite/tst-gmon-gprof.sh: Likewise.
> >>> * testsuite/tst-gmon.c: Likewise.
> >>> * testsuite/Makefile.in: Generated.
> >>
> >> This and the other new test fail for me on both x86-64 systems I tried - the
> >> f3 line isn't present in gprof output. I fear I don't have the time to
> >> investigate from grounds up. IOW either I need pointers that make
> >> investigation reasonably easy, or I'll propose to disable the tests again
> >> until this is sorted. The one thing I did check is that the object file has
> >> all the supposed calls to mcount(). If it matters, one system is using gcc5,
> >> the other gcc7.
> >
> > These tests work for me with gcc 5.4.1 and 7.4.1.  Please try
> >
> > https://sourceware.org/pipermail/binutils/2025-March/140257.html
>
> Well, tst-gmon.o clearly had debug info (incl .debug_line) already. So no
> difference there. Ftaod tst-gmon similarly has debug info (incl .debug_line).
> Must be something else, possibly in gprof itself.
>
> Jan

Can you send me your gprof build directory, including tests?
  
Jan Beulich March 31, 2025, 4 p.m. UTC | #7
On 31.03.2025 17:02, H.J. Lu wrote:
> On Mon, Mar 31, 2025 at 12:56 AM Jan Beulich <jbeulich@suse.com> wrote:
>>
>> On 28.03.2025 16:23, H.J. Lu wrote:
>>> On Fri, Mar 28, 2025 at 1:46 AM Jan Beulich <jbeulich@suse.com> wrote:
>>>>
>>>> On 07.03.2025 00:00, H.J. Lu wrote:
>>>>> Copy a simple gprof test from glibc to test the basic gprof functionality.
>>>>>
>>>>> PR gprof/32764
>>>>> * Makefile.am (SUBDIRS): Add testsuite
>>>>> * configure.ac (AC_CONFIG_FILES): Removed.
>>>>> (AC_OUTPUT): Add Makefile testsuite/Makefile
>>>>> po/Makefile.in:po/Make-in.
>>>>> (AM_CONDITIONAL): Add NATIVE.
>>>>> * Makefile.in: Regenerated.
>>>>> * configure: Likewise.
>>>>> * testsuite/Makefile.am: New file.
>>>>> * testsuite/tst-gmon-gprof.sh: Likewise.
>>>>> * testsuite/tst-gmon.c: Likewise.
>>>>> * testsuite/Makefile.in: Generated.
>>>>
>>>> This and the other new test fail for me on both x86-64 systems I tried - the
>>>> f3 line isn't present in gprof output. I fear I don't have the time to
>>>> investigate from grounds up. IOW either I need pointers that make
>>>> investigation reasonably easy, or I'll propose to disable the tests again
>>>> until this is sorted. The one thing I did check is that the object file has
>>>> all the supposed calls to mcount(). If it matters, one system is using gcc5,
>>>> the other gcc7.
>>>
>>> These tests work for me with gcc 5.4.1 and 7.4.1.  Please try
>>>
>>> https://sourceware.org/pipermail/binutils/2025-March/140257.html
>>
>> Well, tst-gmon.o clearly had debug info (incl .debug_line) already. So no
>> difference there. Ftaod tst-gmon similarly has debug info (incl .debug_line).
>> Must be something else, possibly in gprof itself.
> 
> Can you send me your gprof build directory, including tests?

This is the state of the directory after the failure (plus the disassembly of
the object file that I used to do the minimal checking that I mentioned). If
by "including tests" you mean yet something else, please be specific.

Jan
  
H.J. Lu March 31, 2025, 4:18 p.m. UTC | #8
On Mon, Mar 31, 2025 at 9:00 AM Jan Beulich <jbeulich@suse.com> wrote:
>
> On 31.03.2025 17:02, H.J. Lu wrote:
> > On Mon, Mar 31, 2025 at 12:56 AM Jan Beulich <jbeulich@suse.com> wrote:
> >>
> >> On 28.03.2025 16:23, H.J. Lu wrote:
> >>> On Fri, Mar 28, 2025 at 1:46 AM Jan Beulich <jbeulich@suse.com> wrote:
> >>>>
> >>>> On 07.03.2025 00:00, H.J. Lu wrote:
> >>>>> Copy a simple gprof test from glibc to test the basic gprof functionality.
> >>>>>
> >>>>> PR gprof/32764
> >>>>> * Makefile.am (SUBDIRS): Add testsuite
> >>>>> * configure.ac (AC_CONFIG_FILES): Removed.
> >>>>> (AC_OUTPUT): Add Makefile testsuite/Makefile
> >>>>> po/Makefile.in:po/Make-in.
> >>>>> (AM_CONDITIONAL): Add NATIVE.
> >>>>> * Makefile.in: Regenerated.
> >>>>> * configure: Likewise.
> >>>>> * testsuite/Makefile.am: New file.
> >>>>> * testsuite/tst-gmon-gprof.sh: Likewise.
> >>>>> * testsuite/tst-gmon.c: Likewise.
> >>>>> * testsuite/Makefile.in: Generated.
> >>>>
> >>>> This and the other new test fail for me on both x86-64 systems I tried - the
> >>>> f3 line isn't present in gprof output. I fear I don't have the time to
> >>>> investigate from grounds up. IOW either I need pointers that make
> >>>> investigation reasonably easy, or I'll propose to disable the tests again
> >>>> until this is sorted. The one thing I did check is that the object file has
> >>>> all the supposed calls to mcount(). If it matters, one system is using gcc5,
> >>>> the other gcc7.
> >>>
> >>> These tests work for me with gcc 5.4.1 and 7.4.1.  Please try
> >>>
> >>> https://sourceware.org/pipermail/binutils/2025-March/140257.html
> >>
> >> Well, tst-gmon.o clearly had debug info (incl .debug_line) already. So no
> >> difference there. Ftaod tst-gmon similarly has debug info (incl .debug_line).
> >> Must be something else, possibly in gprof itself.
> >
> > Can you send me your gprof build directory, including tests?
>
> This is the state of the directory after the failure (plus the disassembly of
> the object file that I used to do the minimal checking that I mentioned). If
> by "including tests" you mean yet something else, please be specific.
>

Please send me the whole gprof build directory,  like

aarch64.o       cg_print.o     fsf_callg_bl.c  hertz.o        source.o
alpha.o         config.cache   fsf_callg_bl.o  hist.o         sparc.o
basic_blocks.o  config.log     gconfig.h       i386.o         stamp-h1
bsd_callg_bl.c  config.status  gmon_io.o       libtool        sym_ids.o
bsd_callg_bl.o  config.texi    gprof           Makefile       symtab.o
call_graph.o    corefile.o     gprof.1         mips.o         testsuite
cg_arcs.o       flat_bl.c      gprof.info      po             utils.o
cg_dfn.o        flat_bl.o      gprof.o         search_list.o  vax.o
  
H.J. Lu March 31, 2025, 4:21 p.m. UTC | #9
On Mon, Mar 31, 2025 at 9:18 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Mon, Mar 31, 2025 at 9:00 AM Jan Beulich <jbeulich@suse.com> wrote:
> >
> > On 31.03.2025 17:02, H.J. Lu wrote:
> > > On Mon, Mar 31, 2025 at 12:56 AM Jan Beulich <jbeulich@suse.com> wrote:
> > >>
> > >> On 28.03.2025 16:23, H.J. Lu wrote:
> > >>> On Fri, Mar 28, 2025 at 1:46 AM Jan Beulich <jbeulich@suse.com> wrote:
> > >>>>
> > >>>> On 07.03.2025 00:00, H.J. Lu wrote:
> > >>>>> Copy a simple gprof test from glibc to test the basic gprof functionality.
> > >>>>>
> > >>>>> PR gprof/32764
> > >>>>> * Makefile.am (SUBDIRS): Add testsuite
> > >>>>> * configure.ac (AC_CONFIG_FILES): Removed.
> > >>>>> (AC_OUTPUT): Add Makefile testsuite/Makefile
> > >>>>> po/Makefile.in:po/Make-in.
> > >>>>> (AM_CONDITIONAL): Add NATIVE.
> > >>>>> * Makefile.in: Regenerated.
> > >>>>> * configure: Likewise.
> > >>>>> * testsuite/Makefile.am: New file.
> > >>>>> * testsuite/tst-gmon-gprof.sh: Likewise.
> > >>>>> * testsuite/tst-gmon.c: Likewise.
> > >>>>> * testsuite/Makefile.in: Generated.
> > >>>>
> > >>>> This and the other new test fail for me on both x86-64 systems I tried - the
> > >>>> f3 line isn't present in gprof output. I fear I don't have the time to
> > >>>> investigate from grounds up. IOW either I need pointers that make
> > >>>> investigation reasonably easy, or I'll propose to disable the tests again
> > >>>> until this is sorted. The one thing I did check is that the object file has
> > >>>> all the supposed calls to mcount(). If it matters, one system is using gcc5,
> > >>>> the other gcc7.
> > >>>
> > >>> These tests work for me with gcc 5.4.1 and 7.4.1.  Please try
> > >>>
> > >>> https://sourceware.org/pipermail/binutils/2025-March/140257.html
> > >>
> > >> Well, tst-gmon.o clearly had debug info (incl .debug_line) already. So no
> > >> difference there. Ftaod tst-gmon similarly has debug info (incl .debug_line).
> > >> Must be something else, possibly in gprof itself.
> > >
> > > Can you send me your gprof build directory, including tests?
> >
> > This is the state of the directory after the failure (plus the disassembly of
> > the object file that I used to do the minimal checking that I mentioned). If
> > by "including tests" you mean yet something else, please be specific.
> >
>
> Please send me the whole gprof build directory,  like
>
> aarch64.o       cg_print.o     fsf_callg_bl.c  hertz.o        source.o
> alpha.o         config.cache   fsf_callg_bl.o  hist.o         sparc.o
> basic_blocks.o  config.log     gconfig.h       i386.o         stamp-h1
> bsd_callg_bl.c  config.status  gmon_io.o       libtool        sym_ids.o
> bsd_callg_bl.o  config.texi    gprof           Makefile       symtab.o
> call_graph.o    corefile.o     gprof.1         mips.o         testsuite
> cg_arcs.o       flat_bl.c      gprof.info      po             utils.o
> cg_dfn.o        flat_bl.o      gprof.o         search_list.o  vax.o
>

You used GCC: (SUSE Linux) 4.8.5, not gcc5 nor gcc7 as
you said earlier.
  
H.J. Lu March 31, 2025, 4:30 p.m. UTC | #10
On Mon, Mar 31, 2025 at 9:21 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Mon, Mar 31, 2025 at 9:18 AM H.J. Lu <hjl.tools@gmail.com> wrote:
> >
> > On Mon, Mar 31, 2025 at 9:00 AM Jan Beulich <jbeulich@suse.com> wrote:
> > >
> > > On 31.03.2025 17:02, H.J. Lu wrote:
> > > > On Mon, Mar 31, 2025 at 12:56 AM Jan Beulich <jbeulich@suse.com> wrote:
> > > >>
> > > >> On 28.03.2025 16:23, H.J. Lu wrote:
> > > >>> On Fri, Mar 28, 2025 at 1:46 AM Jan Beulich <jbeulich@suse.com> wrote:
> > > >>>>
> > > >>>> On 07.03.2025 00:00, H.J. Lu wrote:
> > > >>>>> Copy a simple gprof test from glibc to test the basic gprof functionality.
> > > >>>>>
> > > >>>>> PR gprof/32764
> > > >>>>> * Makefile.am (SUBDIRS): Add testsuite
> > > >>>>> * configure.ac (AC_CONFIG_FILES): Removed.
> > > >>>>> (AC_OUTPUT): Add Makefile testsuite/Makefile
> > > >>>>> po/Makefile.in:po/Make-in.
> > > >>>>> (AM_CONDITIONAL): Add NATIVE.
> > > >>>>> * Makefile.in: Regenerated.
> > > >>>>> * configure: Likewise.
> > > >>>>> * testsuite/Makefile.am: New file.
> > > >>>>> * testsuite/tst-gmon-gprof.sh: Likewise.
> > > >>>>> * testsuite/tst-gmon.c: Likewise.
> > > >>>>> * testsuite/Makefile.in: Generated.
> > > >>>>
> > > >>>> This and the other new test fail for me on both x86-64 systems I tried - the
> > > >>>> f3 line isn't present in gprof output. I fear I don't have the time to
> > > >>>> investigate from grounds up. IOW either I need pointers that make
> > > >>>> investigation reasonably easy, or I'll propose to disable the tests again
> > > >>>> until this is sorted. The one thing I did check is that the object file has
> > > >>>> all the supposed calls to mcount(). If it matters, one system is using gcc5,
> > > >>>> the other gcc7.
> > > >>>
> > > >>> These tests work for me with gcc 5.4.1 and 7.4.1.  Please try
> > > >>>
> > > >>> https://sourceware.org/pipermail/binutils/2025-March/140257.html
> > > >>
> > > >> Well, tst-gmon.o clearly had debug info (incl .debug_line) already. So no
> > > >> difference there. Ftaod tst-gmon similarly has debug info (incl .debug_line).
> > > >> Must be something else, possibly in gprof itself.
> > > >
> > > > Can you send me your gprof build directory, including tests?
> > >
> > > This is the state of the directory after the failure (plus the disassembly of
> > > the object file that I used to do the minimal checking that I mentioned). If
> > > by "including tests" you mean yet something else, please be specific.
> > >
> >
> > Please send me the whole gprof build directory,  like
> >
> > aarch64.o       cg_print.o     fsf_callg_bl.c  hertz.o        source.o
> > alpha.o         config.cache   fsf_callg_bl.o  hist.o         sparc.o
> > basic_blocks.o  config.log     gconfig.h       i386.o         stamp-h1
> > bsd_callg_bl.c  config.status  gmon_io.o       libtool        sym_ids.o
> > bsd_callg_bl.o  config.texi    gprof           Makefile       symtab.o
> > call_graph.o    corefile.o     gprof.1         mips.o         testsuite
> > cg_arcs.o       flat_bl.c      gprof.info      po             utils.o
> > cg_dfn.o        flat_bl.o      gprof.o         search_list.o  vax.o
> >
>
> You used GCC: (SUSE Linux) 4.8.5, not gcc5 nor gcc7 as
> you said earlier.
>

GCC 4.8.5 works for me.  My tst-gmon.o has R_X86_64_PLT32 and
yours has R_X86_64_PC32.  I don't think it matters here.  Which glibc
do you have?  It may be a glibc bug.
  
H.J. Lu March 31, 2025, 4:35 p.m. UTC | #11
On Mon, Mar 31, 2025 at 9:30 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Mon, Mar 31, 2025 at 9:21 AM H.J. Lu <hjl.tools@gmail.com> wrote:
> >
> > On Mon, Mar 31, 2025 at 9:18 AM H.J. Lu <hjl.tools@gmail.com> wrote:
> > >
> > > On Mon, Mar 31, 2025 at 9:00 AM Jan Beulich <jbeulich@suse.com> wrote:
> > > >
> > > > On 31.03.2025 17:02, H.J. Lu wrote:
> > > > > On Mon, Mar 31, 2025 at 12:56 AM Jan Beulich <jbeulich@suse.com> wrote:
> > > > >>
> > > > >> On 28.03.2025 16:23, H.J. Lu wrote:
> > > > >>> On Fri, Mar 28, 2025 at 1:46 AM Jan Beulich <jbeulich@suse.com> wrote:
> > > > >>>>
> > > > >>>> On 07.03.2025 00:00, H.J. Lu wrote:
> > > > >>>>> Copy a simple gprof test from glibc to test the basic gprof functionality.
> > > > >>>>>
> > > > >>>>> PR gprof/32764
> > > > >>>>> * Makefile.am (SUBDIRS): Add testsuite
> > > > >>>>> * configure.ac (AC_CONFIG_FILES): Removed.
> > > > >>>>> (AC_OUTPUT): Add Makefile testsuite/Makefile
> > > > >>>>> po/Makefile.in:po/Make-in.
> > > > >>>>> (AM_CONDITIONAL): Add NATIVE.
> > > > >>>>> * Makefile.in: Regenerated.
> > > > >>>>> * configure: Likewise.
> > > > >>>>> * testsuite/Makefile.am: New file.
> > > > >>>>> * testsuite/tst-gmon-gprof.sh: Likewise.
> > > > >>>>> * testsuite/tst-gmon.c: Likewise.
> > > > >>>>> * testsuite/Makefile.in: Generated.
> > > > >>>>
> > > > >>>> This and the other new test fail for me on both x86-64 systems I tried - the
> > > > >>>> f3 line isn't present in gprof output. I fear I don't have the time to
> > > > >>>> investigate from grounds up. IOW either I need pointers that make
> > > > >>>> investigation reasonably easy, or I'll propose to disable the tests again
> > > > >>>> until this is sorted. The one thing I did check is that the object file has
> > > > >>>> all the supposed calls to mcount(). If it matters, one system is using gcc5,
> > > > >>>> the other gcc7.
> > > > >>>
> > > > >>> These tests work for me with gcc 5.4.1 and 7.4.1.  Please try
> > > > >>>
> > > > >>> https://sourceware.org/pipermail/binutils/2025-March/140257.html
> > > > >>
> > > > >> Well, tst-gmon.o clearly had debug info (incl .debug_line) already. So no
> > > > >> difference there. Ftaod tst-gmon similarly has debug info (incl .debug_line).
> > > > >> Must be something else, possibly in gprof itself.
> > > > >
> > > > > Can you send me your gprof build directory, including tests?
> > > >
> > > > This is the state of the directory after the failure (plus the disassembly of
> > > > the object file that I used to do the minimal checking that I mentioned). If
> > > > by "including tests" you mean yet something else, please be specific.
> > > >
> > >
> > > Please send me the whole gprof build directory,  like
> > >
> > > aarch64.o       cg_print.o     fsf_callg_bl.c  hertz.o        source.o
> > > alpha.o         config.cache   fsf_callg_bl.o  hist.o         sparc.o
> > > basic_blocks.o  config.log     gconfig.h       i386.o         stamp-h1
> > > bsd_callg_bl.c  config.status  gmon_io.o       libtool        sym_ids.o
> > > bsd_callg_bl.o  config.texi    gprof           Makefile       symtab.o
> > > call_graph.o    corefile.o     gprof.1         mips.o         testsuite
> > > cg_arcs.o       flat_bl.c      gprof.info      po             utils.o
> > > cg_dfn.o        flat_bl.o      gprof.o         search_list.o  vax.o
> > >
> >
> > You used GCC: (SUSE Linux) 4.8.5, not gcc5 nor gcc7 as
> > you said earlier.
> >
>
> GCC 4.8.5 works for me.  My tst-gmon.o has R_X86_64_PLT32 and
> yours has R_X86_64_PC32.  I don't think it matters here.  Which glibc
> do you have?  It may be a glibc bug.
>

No need for the whole gprof directory.  I used your tst-gmon.o with
GCC 4.8.5.  It works correctly.  It looks like your glibc is buggy.
  
H.J. Lu March 31, 2025, 4:37 p.m. UTC | #12
On Mon, Mar 31, 2025 at 9:35 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Mon, Mar 31, 2025 at 9:30 AM H.J. Lu <hjl.tools@gmail.com> wrote:
> >
> > On Mon, Mar 31, 2025 at 9:21 AM H.J. Lu <hjl.tools@gmail.com> wrote:
> > >
> > > On Mon, Mar 31, 2025 at 9:18 AM H.J. Lu <hjl.tools@gmail.com> wrote:
> > > >
> > > > On Mon, Mar 31, 2025 at 9:00 AM Jan Beulich <jbeulich@suse.com> wrote:
> > > > >
> > > > > On 31.03.2025 17:02, H.J. Lu wrote:
> > > > > > On Mon, Mar 31, 2025 at 12:56 AM Jan Beulich <jbeulich@suse.com> wrote:
> > > > > >>
> > > > > >> On 28.03.2025 16:23, H.J. Lu wrote:
> > > > > >>> On Fri, Mar 28, 2025 at 1:46 AM Jan Beulich <jbeulich@suse.com> wrote:
> > > > > >>>>
> > > > > >>>> On 07.03.2025 00:00, H.J. Lu wrote:
> > > > > >>>>> Copy a simple gprof test from glibc to test the basic gprof functionality.
> > > > > >>>>>
> > > > > >>>>> PR gprof/32764
> > > > > >>>>> * Makefile.am (SUBDIRS): Add testsuite
> > > > > >>>>> * configure.ac (AC_CONFIG_FILES): Removed.
> > > > > >>>>> (AC_OUTPUT): Add Makefile testsuite/Makefile
> > > > > >>>>> po/Makefile.in:po/Make-in.
> > > > > >>>>> (AM_CONDITIONAL): Add NATIVE.
> > > > > >>>>> * Makefile.in: Regenerated.
> > > > > >>>>> * configure: Likewise.
> > > > > >>>>> * testsuite/Makefile.am: New file.
> > > > > >>>>> * testsuite/tst-gmon-gprof.sh: Likewise.
> > > > > >>>>> * testsuite/tst-gmon.c: Likewise.
> > > > > >>>>> * testsuite/Makefile.in: Generated.
> > > > > >>>>
> > > > > >>>> This and the other new test fail for me on both x86-64 systems I tried - the
> > > > > >>>> f3 line isn't present in gprof output. I fear I don't have the time to
> > > > > >>>> investigate from grounds up. IOW either I need pointers that make
> > > > > >>>> investigation reasonably easy, or I'll propose to disable the tests again
> > > > > >>>> until this is sorted. The one thing I did check is that the object file has
> > > > > >>>> all the supposed calls to mcount(). If it matters, one system is using gcc5,
> > > > > >>>> the other gcc7.
> > > > > >>>
> > > > > >>> These tests work for me with gcc 5.4.1 and 7.4.1.  Please try
> > > > > >>>
> > > > > >>> https://sourceware.org/pipermail/binutils/2025-March/140257.html
> > > > > >>
> > > > > >> Well, tst-gmon.o clearly had debug info (incl .debug_line) already. So no
> > > > > >> difference there. Ftaod tst-gmon similarly has debug info (incl .debug_line).
> > > > > >> Must be something else, possibly in gprof itself.
> > > > > >
> > > > > > Can you send me your gprof build directory, including tests?
> > > > >
> > > > > This is the state of the directory after the failure (plus the disassembly of
> > > > > the object file that I used to do the minimal checking that I mentioned). If
> > > > > by "including tests" you mean yet something else, please be specific.
> > > > >
> > > >
> > > > Please send me the whole gprof build directory,  like
> > > >
> > > > aarch64.o       cg_print.o     fsf_callg_bl.c  hertz.o        source.o
> > > > alpha.o         config.cache   fsf_callg_bl.o  hist.o         sparc.o
> > > > basic_blocks.o  config.log     gconfig.h       i386.o         stamp-h1
> > > > bsd_callg_bl.c  config.status  gmon_io.o       libtool        sym_ids.o
> > > > bsd_callg_bl.o  config.texi    gprof           Makefile       symtab.o
> > > > call_graph.o    corefile.o     gprof.1         mips.o         testsuite
> > > > cg_arcs.o       flat_bl.c      gprof.info      po             utils.o
> > > > cg_dfn.o        flat_bl.o      gprof.o         search_list.o  vax.o
> > > >
> > >
> > > You used GCC: (SUSE Linux) 4.8.5, not gcc5 nor gcc7 as
> > > you said earlier.
> > >
> >
> > GCC 4.8.5 works for me.  My tst-gmon.o has R_X86_64_PLT32 and
> > yours has R_X86_64_PC32.  I don't think it matters here.  Which glibc
> > do you have?  It may be a glibc bug.
> >
>
> No need for the whole gprof directory.  I used your tst-gmon.o with
> GCC 4.8.5.  It works correctly.  It looks like your glibc is buggy.
>
> --
> H.J.

Please verify if this glibc bug:

https://sourceware.org/bugzilla/show_bug.cgi?id=28153

is the cause.
  
Jan Beulich April 1, 2025, 7:37 a.m. UTC | #13
On 31.03.2025 18:37, H.J. Lu wrote:
> On Mon, Mar 31, 2025 at 9:35 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>>
>> On Mon, Mar 31, 2025 at 9:30 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>>>
>>> On Mon, Mar 31, 2025 at 9:21 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>>>>
>>>> On Mon, Mar 31, 2025 at 9:18 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>>>>>
>>>>> On Mon, Mar 31, 2025 at 9:00 AM Jan Beulich <jbeulich@suse.com> wrote:
>>>>>>
>>>>>> On 31.03.2025 17:02, H.J. Lu wrote:
>>>>>>> On Mon, Mar 31, 2025 at 12:56 AM Jan Beulich <jbeulich@suse.com> wrote:
>>>>>>>>
>>>>>>>> On 28.03.2025 16:23, H.J. Lu wrote:
>>>>>>>>> On Fri, Mar 28, 2025 at 1:46 AM Jan Beulich <jbeulich@suse.com> wrote:
>>>>>>>>>>
>>>>>>>>>> On 07.03.2025 00:00, H.J. Lu wrote:
>>>>>>>>>>> Copy a simple gprof test from glibc to test the basic gprof functionality.
>>>>>>>>>>>
>>>>>>>>>>> PR gprof/32764
>>>>>>>>>>> * Makefile.am (SUBDIRS): Add testsuite
>>>>>>>>>>> * configure.ac (AC_CONFIG_FILES): Removed.
>>>>>>>>>>> (AC_OUTPUT): Add Makefile testsuite/Makefile
>>>>>>>>>>> po/Makefile.in:po/Make-in.
>>>>>>>>>>> (AM_CONDITIONAL): Add NATIVE.
>>>>>>>>>>> * Makefile.in: Regenerated.
>>>>>>>>>>> * configure: Likewise.
>>>>>>>>>>> * testsuite/Makefile.am: New file.
>>>>>>>>>>> * testsuite/tst-gmon-gprof.sh: Likewise.
>>>>>>>>>>> * testsuite/tst-gmon.c: Likewise.
>>>>>>>>>>> * testsuite/Makefile.in: Generated.
>>>>>>>>>>
>>>>>>>>>> This and the other new test fail for me on both x86-64 systems I tried - the
>>>>>>>>>> f3 line isn't present in gprof output. I fear I don't have the time to
>>>>>>>>>> investigate from grounds up. IOW either I need pointers that make
>>>>>>>>>> investigation reasonably easy, or I'll propose to disable the tests again
>>>>>>>>>> until this is sorted. The one thing I did check is that the object file has
>>>>>>>>>> all the supposed calls to mcount(). If it matters, one system is using gcc5,
>>>>>>>>>> the other gcc7.
>>>>>>>>>
>>>>>>>>> These tests work for me with gcc 5.4.1 and 7.4.1.  Please try
>>>>>>>>>
>>>>>>>>> https://sourceware.org/pipermail/binutils/2025-March/140257.html
>>>>>>>>
>>>>>>>> Well, tst-gmon.o clearly had debug info (incl .debug_line) already. So no
>>>>>>>> difference there. Ftaod tst-gmon similarly has debug info (incl .debug_line).
>>>>>>>> Must be something else, possibly in gprof itself.
>>>>>>>
>>>>>>> Can you send me your gprof build directory, including tests?
>>>>>>
>>>>>> This is the state of the directory after the failure (plus the disassembly of
>>>>>> the object file that I used to do the minimal checking that I mentioned). If
>>>>>> by "including tests" you mean yet something else, please be specific.
>>>>>>
>>>>>
>>>>> Please send me the whole gprof build directory,  like
>>>>>
>>>>> aarch64.o       cg_print.o     fsf_callg_bl.c  hertz.o        source.o
>>>>> alpha.o         config.cache   fsf_callg_bl.o  hist.o         sparc.o
>>>>> basic_blocks.o  config.log     gconfig.h       i386.o         stamp-h1
>>>>> bsd_callg_bl.c  config.status  gmon_io.o       libtool        sym_ids.o
>>>>> bsd_callg_bl.o  config.texi    gprof           Makefile       symtab.o
>>>>> call_graph.o    corefile.o     gprof.1         mips.o         testsuite
>>>>> cg_arcs.o       flat_bl.c      gprof.info      po             utils.o
>>>>> cg_dfn.o        flat_bl.o      gprof.o         search_list.o  vax.o
>>>>>
>>>>
>>>> You used GCC: (SUSE Linux) 4.8.5, not gcc5 nor gcc7 as
>>>> you said earlier.

Oh, I'm sorry. I'm in need of forcing use of the secondary compiler there
for an increasing number of projects, so I keep forgetting that the main
compiler there is older. It is gcc7 on the other system. Yet from further
responses of yours I conclude this doesn't matter anymore.

>>> GCC 4.8.5 works for me.  My tst-gmon.o has R_X86_64_PLT32 and
>>> yours has R_X86_64_PC32.  I don't think it matters here.  Which glibc
>>> do you have?  It may be a glibc bug.
>>>
>>
>> No need for the whole gprof directory.  I used your tst-gmon.o with
>> GCC 4.8.5.  It works correctly.  It looks like your glibc is buggy.
> 
> Please verify if this glibc bug:
> 
> https://sourceware.org/bugzilla/show_bug.cgi?id=28153
> 
> is the cause.

Well, yes, main() is before _start() in the executables on both systems.
The older system has glibc 2.22, the newer glibc 2.26. And no, I do not
think I should be upgrading the distros there. As said on earlier
occasions, testcases ought to work independent of the underlying
platform, or be disabled if they can't be made work in older
environments.

I couldn't find a command line option to pass to gcc to avoid use of
.text.startup / .text.startup.main. Adding
__attribute__((section(".text.main"))) may help, but may not be portable
enough.

Jan
  
Jan Beulich April 1, 2025, 8:49 a.m. UTC | #14
On 01.04.2025 09:37, Jan Beulich wrote:
> On 31.03.2025 18:37, H.J. Lu wrote:
>> Please verify if this glibc bug:
>>
>> https://sourceware.org/bugzilla/show_bug.cgi?id=28153
>>
>> is the cause.
> 
> Well, yes, main() is before _start() in the executables on both systems.
> The older system has glibc 2.22, the newer glibc 2.26. And no, I do not
> think I should be upgrading the distros there. As said on earlier
> occasions, testcases ought to work independent of the underlying
> platform, or be disabled if they can't be made work in older
> environments.
> 
> I couldn't find a command line option to pass to gcc to avoid use of
> .text.startup / .text.startup.main. Adding
> __attribute__((section(".text.main"))) may help, but may not be portable
> enough.

This

--- a/gprof/testsuite/tst-gmon.c
+++ b/gprof/testsuite/tst-gmon.c
@@ -45,6 +45,7 @@ f3 (int count)
     }
 }
 
+__attribute__ ((section (".text.main"))) /* See glibc bug 28153.  */
 int
 main (void)
 {

indeed helps. Since there are __attribute__ ((weak)) already in the test,
this may even be acceptable.

However, further observations on these new tests: The test status summary
doesn't appear at all when any of these tests fail:

Making check in testsuite
--- expected
+++ actual
@@ -1,3 +1,2 @@
 f1 2000
 f2 1000
-f3 1
FAIL
make[5]: *** [Makefile:888: tst-gmon-gprof.out] Error 1
--- expected
+++ actual
@@ -1,3 +1,2 @@
 25 f1 2000
 31 f2 1000
-40 f3 1
FAIL
make[5]: *** [Makefile:890: tst-gmon-gprof-l.out] Error 1
make[4]: *** [Makefile:761: check-am] Error 2
make[4]: Target 'check' not remade because of errors.
make[3]: *** [Makefile:848: check-recursive] Error 1
make[2]: *** [Makefile:948: check] Error 2
make[1]: *** [Makefile:6910: check-gprof] Error 2

Then, when I had these tests temporarily disabled, the summary looked
like this:

Making check in testsuite
PASS: tst-gmon-gprof.sh
PASS: tst-gmon-gprof-l.sh
============================================================================
Testsuite summary for gprof 2.44.50
============================================================================
# TOTAL: 2
# PASS:  2
# SKIP:  0
# XFAIL: 0
# FAIL:  0
# XPASS: 0
# ERROR: 0
============================================================================

Now, with the tests re-enabled I get this:

Making check in testsuite
PASS
PASS
PASS: tst-gmon-gprof.sh
PASS: tst-gmon-gprof-l.sh
============================================================================
Testsuite summary for gprof 2.44.50
============================================================================
# TOTAL: 2
# PASS:  2
# SKIP:  0
# XFAIL: 0
# FAIL:  0
# XPASS: 0
# ERROR: 0
============================================================================

Note how the count of tests hasn't changed, and how the first two "PASS"
don't say what has passed.

Jan
  
H.J. Lu April 1, 2025, 3:15 p.m. UTC | #15
On Tue, Apr 1, 2025 at 1:49 AM Jan Beulich <jbeulich@suse.com> wrote:
>
> On 01.04.2025 09:37, Jan Beulich wrote:
> > On 31.03.2025 18:37, H.J. Lu wrote:
> >> Please verify if this glibc bug:
> >>
> >> https://sourceware.org/bugzilla/show_bug.cgi?id=28153
> >>
> >> is the cause.
> >
> > Well, yes, main() is before _start() in the executables on both systems.
> > The older system has glibc 2.22, the newer glibc 2.26. And no, I do not
> > think I should be upgrading the distros there. As said on earlier
> > occasions, testcases ought to work independent of the underlying
> > platform, or be disabled if they can't be made work in older
> > environments.
> >
> > I couldn't find a command line option to pass to gcc to avoid use of
> > .text.startup / .text.startup.main. Adding
> > __attribute__((section(".text.main"))) may help, but may not be portable
> > enough.
>
> This
>
> --- a/gprof/testsuite/tst-gmon.c
> +++ b/gprof/testsuite/tst-gmon.c
> @@ -45,6 +45,7 @@ f3 (int count)
>      }
>  }
>
> +__attribute__ ((section (".text.main"))) /* See glibc bug 28153.  */
>  int
>  main (void)
>  {
>
> indeed helps. Since there are __attribute__ ((weak)) already in the test,
> this may even be acceptable.
>
> However, further observations on these new tests: The test status summary
> doesn't appear at all when any of these tests fail:
>
> Making check in testsuite
> --- expected
> +++ actual
> @@ -1,3 +1,2 @@
>  f1 2000
>  f2 1000
> -f3 1
> FAIL
> make[5]: *** [Makefile:888: tst-gmon-gprof.out] Error 1
> --- expected
> +++ actual
> @@ -1,3 +1,2 @@
>  25 f1 2000
>  31 f2 1000
> -40 f3 1
> FAIL
> make[5]: *** [Makefile:890: tst-gmon-gprof-l.out] Error 1
> make[4]: *** [Makefile:761: check-am] Error 2
> make[4]: Target 'check' not remade because of errors.
> make[3]: *** [Makefile:848: check-recursive] Error 1
> make[2]: *** [Makefile:948: check] Error 2
> make[1]: *** [Makefile:6910: check-gprof] Error 2
>
> Then, when I had these tests temporarily disabled, the summary looked
> like this:
>
> Making check in testsuite
> PASS: tst-gmon-gprof.sh
> PASS: tst-gmon-gprof-l.sh
> ============================================================================
> Testsuite summary for gprof 2.44.50
> ============================================================================
> # TOTAL: 2
> # PASS:  2
> # SKIP:  0
> # XFAIL: 0
> # FAIL:  0
> # XPASS: 0
> # ERROR: 0
> ============================================================================
>
> Now, with the tests re-enabled I get this:
>
> Making check in testsuite
> PASS
> PASS
> PASS: tst-gmon-gprof.sh
> PASS: tst-gmon-gprof-l.sh
> ============================================================================
> Testsuite summary for gprof 2.44.50
> ============================================================================
> # TOTAL: 2
> # PASS:  2
> # SKIP:  0
> # XFAIL: 0
> # FAIL:  0
> # XPASS: 0
> # ERROR: 0
> ============================================================================
>
> Note how the count of tests hasn't changed, and how the first two "PASS"
> don't say what has passed.
>
> Jan

This is because automake tests don't take arguments for the test script.
  

Patch

From c68ebc613af6feaed2cb08ab064458261eaca11d Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Fri, 7 Mar 2025 06:42:18 +0800
Subject: [PATCH] gprof: Copy a simple test from glibc

Copy a simple gprof test from glibc to test the basic gprof functionality.

	PR gprof/32764
	* Makefile.am (SUBDIRS): Add testsuite
	* configure.ac (AC_CONFIG_FILES): Removed.
	(AC_OUTPUT): Add Makefile testsuite/Makefile
	po/Makefile.in:po/Make-in.
	(AM_CONDITIONAL): Add NATIVE.
	* Makefile.in: Regenerated.
	* configure: Likewise.
	* testsuite/Makefile.am: New file.
	* testsuite/tst-gmon-gprof.sh: Likewise.
	* testsuite/tst-gmon.c: Likewise.
	* testsuite/Makefile.in: Generated.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
---
 gprof/Makefile.am                 |   2 +-
 gprof/Makefile.in                 |   2 +-
 gprof/configure                   |  39 +-
 gprof/configure.ac                |  16 +-
 gprof/testsuite/Makefile.am       |  38 ++
 gprof/testsuite/Makefile.in       | 883 ++++++++++++++++++++++++++++++
 gprof/testsuite/tst-gmon-gprof.sh |  69 +++
 gprof/testsuite/tst-gmon.c        |  55 ++
 8 files changed, 1097 insertions(+), 7 deletions(-)
 create mode 100644 gprof/testsuite/Makefile.am
 create mode 100644 gprof/testsuite/Makefile.in
 create mode 100755 gprof/testsuite/tst-gmon-gprof.sh
 create mode 100644 gprof/testsuite/tst-gmon.c

diff --git a/gprof/Makefile.am b/gprof/Makefile.am
index dd71a518ba0..8662e625d84 100644
--- a/gprof/Makefile.am
+++ b/gprof/Makefile.am
@@ -23,7 +23,7 @@  TEXINFO_TEX = ../texinfo/texinfo.tex
 
 SUFFIXES = .c .m
 
-SUBDIRS = po
+SUBDIRS = po testsuite
 
 BASEDIR = $(srcdir)/..
 BFDDIR = $(BASEDIR)/bfd
diff --git a/gprof/Makefile.in b/gprof/Makefile.in
index 93fb378149a..719e1810bcd 100644
--- a/gprof/Makefile.in
+++ b/gprof/Makefile.in
@@ -453,7 +453,7 @@  AUTOMAKE_OPTIONS = foreign no-dist no-texinfo.tex info-in-builddir
 ACLOCAL_AMFLAGS = -I .. -I ../config -I ../bfd
 TEXINFO_TEX = ../texinfo/texinfo.tex
 SUFFIXES = .c .m
-SUBDIRS = po
+SUBDIRS = po testsuite
 BASEDIR = $(srcdir)/..
 BFDDIR = $(BASEDIR)/bfd
 INCDIR = $(BASEDIR)/include
diff --git a/gprof/configure b/gprof/configure
index ea369417c46..ad2033c802a 100755
--- a/gprof/configure
+++ b/gprof/configure
@@ -634,6 +634,8 @@  ac_subst_vars='am__EXEEXT_FALSE
 am__EXEEXT_TRUE
 LTLIBOBJS
 LIBOBJS
+NATIVE_FALSE
+NATIVE_TRUE
 WARN_WRITE_STRINGS
 NO_WERROR
 WARN_CFLAGS_FOR_BUILD
@@ -10653,7 +10655,7 @@  else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 10656 "configure"
+#line 10658 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -10759,7 +10761,7 @@  else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 10762 "configure"
+#line 10764 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -13963,7 +13965,33 @@  fi
 
 
 
-ac_config_files="$ac_config_files Makefile po/Makefile.in:po/Make-in"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gprof tests can run" >&5
+$as_echo_n "checking whether gprof tests can run... " >&6; }
+if ${gprof_cv_sys_native+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+    gprof_cv_sys_native=no
+  if test x"${host}" = x"${target}" \
+     && ${CC-cc} -O2 -pg -o tst-gmon $srcdir/testsuite/tst-gmon.c; then
+    ./tst-gmon
+    if test -s gmon.out; then
+      gprof_cv_sys_native=yes
+    fi
+    rm -f tst-gmon gmon.out
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gprof_cv_sys_native" >&5
+$as_echo "$gprof_cv_sys_native" >&6; }
+ if test "$gprof_cv_sys_native" = "yes"; then
+  NATIVE_TRUE=
+  NATIVE_FALSE='#'
+else
+  NATIVE_TRUE='#'
+  NATIVE_FALSE=
+fi
+
+
+ac_config_files="$ac_config_files Makefile testsuite/Makefile po/Makefile.in:po/Make-in"
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -14106,6 +14134,10 @@  if test -z "${GENINSRC_NEVER_TRUE}" && test -z "${GENINSRC_NEVER_FALSE}"; then
   as_fn_error $? "conditional \"GENINSRC_NEVER\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${NATIVE_TRUE}" && test -z "${NATIVE_FALSE}"; then
+  as_fn_error $? "conditional \"NATIVE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 
 : "${CONFIG_STATUS=./config.status}"
 ac_write_fail=0
@@ -14978,6 +15010,7 @@  do
     "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
     "default-2") CONFIG_COMMANDS="$CONFIG_COMMANDS default-2" ;;
     "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "testsuite/Makefile") CONFIG_FILES="$CONFIG_FILES testsuite/Makefile" ;;
     "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in:po/Make-in" ;;
 
   *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
diff --git a/gprof/configure.ac b/gprof/configure.ac
index 61b0af5f8f4..37eff97b2c2 100644
--- a/gprof/configure.ac
+++ b/gprof/configure.ac
@@ -73,7 +73,19 @@  AC_SUBST(docdir)
 AC_SUBST(htmldir)
 AC_SUBST(pdfdir)
 
-AC_CONFIG_FILES([Makefile po/Makefile.in:po/Make-in])
-AC_OUTPUT
+AC_CACHE_CHECK([whether gprof tests can run],
+  [gprof_cv_sys_native], [dnl
+  gprof_cv_sys_native=no
+  if test x"${host}" = x"${target}" \
+     && ${CC-cc} -O2 -pg -o tst-gmon $srcdir/testsuite/tst-gmon.c; then
+    ./tst-gmon
+    if test -s gmon.out; then
+      gprof_cv_sys_native=yes
+    fi
+    rm -f tst-gmon gmon.out
+  fi])
+AM_CONDITIONAL(NATIVE, test "$gprof_cv_sys_native" = "yes")
+
+AC_OUTPUT(Makefile testsuite/Makefile po/Makefile.in:po/Make-in)
 
 GNU_MAKE_JOBSERVER
diff --git a/gprof/testsuite/Makefile.am b/gprof/testsuite/Makefile.am
new file mode 100644
index 00000000000..d626d587c4c
--- /dev/null
+++ b/gprof/testsuite/Makefile.am
@@ -0,0 +1,38 @@ 
+# Process this file with automake to generate Makefile.in
+
+AUTOMAKE_OPTIONS = foreign
+
+GPROF = ../gprof
+
+GPROF_FLAGS = -pg
+
+AM_CFLAGS = $(GPROF_FLAGS)
+
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LINK = $(CC) $(AM_CFLAGS) $(CFLAGS) $(OPT_NO_PLUGINS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+
+# We will add to these later, for each individual test.  Note
+# that we add each test under check_SCRIPTS;
+# the TESTS variable is automatically populated from these.
+check_SCRIPTS =
+check_DATA = 
+MOSTLYCLEANFILES =
+
+TESTS = $(check_SCRIPTS)
+
+if NATIVE
+
+check_SCRIPTS += tst-gmon-gprof.sh
+
+check_DATA += tst-gmon-gprof.out
+MOSTLYCLEANFILES += tst-gmon.o tst-gmon gmon.out
+tst-gmon.o: tst-gmon.c
+	$(COMPILE) -c -o $@ $<
+tst-gmon: tst-gmon.o
+	$(LINK) tst-gmon.o
+tst-gmon-gprof.out: tst-gmon
+	$(srcdir)/tst-gmon-gprof.sh $(GPROF) tst-gmon
+
+endif NATIVE
diff --git a/gprof/testsuite/Makefile.in b/gprof/testsuite/Makefile.in
new file mode 100644
index 00000000000..63b4f046853
--- /dev/null
+++ b/gprof/testsuite/Makefile.in
@@ -0,0 +1,883 @@ 
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Process this file with automake to generate Makefile.in
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+@NATIVE_TRUE@am__append_1 = tst-gmon-gprof.sh
+@NATIVE_TRUE@am__append_2 = tst-gmon-gprof.out
+@NATIVE_TRUE@am__append_3 = tst-gmon.o tst-gmon gmon.out
+subdir = testsuite
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/../bfd/warning.m4 \
+	$(top_srcdir)/../config/depstand.m4 \
+	$(top_srcdir)/../config/gettext-sister.m4 \
+	$(top_srcdir)/../config/gettext.m4 \
+	$(top_srcdir)/../config/iconv.m4 \
+	$(top_srcdir)/../config/intlmacosx.m4 \
+	$(top_srcdir)/../config/jobserver.m4 \
+	$(top_srcdir)/../config/largefile.m4 \
+	$(top_srcdir)/../config/lead-dot.m4 \
+	$(top_srcdir)/../config/lib-ld.m4 \
+	$(top_srcdir)/../config/lib-link.m4 \
+	$(top_srcdir)/../config/lib-prefix.m4 \
+	$(top_srcdir)/../config/nls.m4 \
+	$(top_srcdir)/../config/override.m4 \
+	$(top_srcdir)/../config/plugins.m4 \
+	$(top_srcdir)/../config/po.m4 \
+	$(top_srcdir)/../config/progtest.m4 \
+	$(top_srcdir)/../libtool.m4 $(top_srcdir)/../ltoptions.m4 \
+	$(top_srcdir)/../ltsugar.m4 $(top_srcdir)/../ltversion.m4 \
+	$(top_srcdir)/../lt~obsolete.m4 \
+	$(top_srcdir)/../bfd/version.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/gconfig.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/../test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/../test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+	$(TEST_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/../mkinstalldirs \
+	$(top_srcdir)/../test-driver
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GENCAT = @GENCAT@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+INCINTL = @INCINTL@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LARGEFILE_CPPFLAGS = @LARGEFILE_CPPFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBINTL_DEP = @LIBINTL_DEP@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+NO_WERROR = @NO_WERROR@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WARN_CFLAGS = @WARN_CFLAGS@
+WARN_CFLAGS_FOR_BUILD = @WARN_CFLAGS_FOR_BUILD@
+WARN_WRITE_STRINGS = @WARN_WRITE_STRINGS@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+GPROF = ../gprof
+GPROF_FLAGS = -pg
+AM_CFLAGS = $(GPROF_FLAGS)
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+
+LINK = $(CC) $(AM_CFLAGS) $(CFLAGS) $(OPT_NO_PLUGINS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+
+
+# We will add to these later, for each individual test.  Note
+# that we add each test under check_SCRIPTS;
+# the TESTS variable is automatically populated from these.
+check_SCRIPTS = $(am__append_1)
+check_DATA = $(am__append_2)
+MOSTLYCLEANFILES = $(am__append_3)
+TESTS = $(check_SCRIPTS)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .log .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign testsuite/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign testsuite/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	elif test -n "$$redo_logs"; then \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+
+check-TESTS:
+	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+	exit $$?;
+recheck: all $(check_SCRIPTS) $(check_DATA)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+tst-gmon-gprof.sh.log: tst-gmon-gprof.sh
+	@p='tst-gmon-gprof.sh'; \
+	b='tst-gmon-gprof.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@	@p='$<'; \
+@am__EXEEXT_TRUE@	$(am__set_b); \
+@am__EXEEXT_TRUE@	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_SCRIPTS) $(check_DATA)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: all all-am check check-TESTS check-am clean clean-generic \
+	clean-libtool cscopelist-am ctags-am distclean \
+	distclean-generic distclean-libtool distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \
+	uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+@NATIVE_TRUE@tst-gmon.o: tst-gmon.c
+@NATIVE_TRUE@	$(COMPILE) -c -o $@ $<
+@NATIVE_TRUE@tst-gmon: tst-gmon.o
+@NATIVE_TRUE@	$(LINK) tst-gmon.o
+@NATIVE_TRUE@tst-gmon-gprof.out: tst-gmon
+@NATIVE_TRUE@	$(srcdir)/tst-gmon-gprof.sh $(GPROF) tst-gmon
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gprof/testsuite/tst-gmon-gprof.sh b/gprof/testsuite/tst-gmon-gprof.sh
new file mode 100755
index 00000000000..fdc70dc5ea2
--- /dev/null
+++ b/gprof/testsuite/tst-gmon-gprof.sh
@@ -0,0 +1,69 @@ 
+#!/bin/sh
+# Check the output of gprof against a carfully crafted binary.
+# Copyright (C) 2017-2025 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
+# <https://www.gnu.org/licenses/>.
+
+GPROF="$1"
+if test -z "$GPROF"; then
+  # Exit 0 for automake test script run.
+  exit 0
+fi
+
+program="$2"
+# Generate gmon.out
+./$program
+data=gmon.out
+
+LC_ALL=C
+export LC_ALL
+set -e
+exec 2>&1
+
+actual=${program}.actual
+expected=${program}.expected
+expected_dot=${program}.expected_dot
+cleanup () {
+    rm -f "$actual"
+    rm -f "$expected"
+    rm -f "$expected_dot"
+}
+trap cleanup 0
+
+cat > "$expected" <<EOF
+f1 2000
+f2 1000
+f3 1
+EOF
+
+# Special version for powerpc with function descriptors.
+cat > "$expected_dot" <<EOF
+.f1 2000
+.f2 1000
+.f3 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
diff --git a/gprof/testsuite/tst-gmon.c b/gprof/testsuite/tst-gmon.c
new file mode 100644
index 00000000000..add2d9253c2
--- /dev/null
+++ b/gprof/testsuite/tst-gmon.c
@@ -0,0 +1,55 @@ 
+/* Test program for profiling information collection (_mcount/gprof).
+   Copyright (C) 2017-2025 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
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sys/cdefs.h>
+
+/* This program does not use the test harness because we want tight
+   control over the call graph.  */
+
+__attribute__ ((weak))
+void
+f1 (void)
+{
+}
+
+__attribute__ ((weak))
+void
+f2 (void)
+{
+  f1 ();
+  /* Prevent tail call.  */
+  asm volatile ("");
+}
+
+__attribute__ ((weak))
+void
+f3 (int count)
+{
+  for (int i = 0; i < count; ++i)
+    {
+      f1 ();
+      f2 ();
+    }
+}
+
+int
+main (void)
+{
+  f3 (1000);
+  return 0;
+}
-- 
2.48.1