In some arch, _mcount() would be called recursively when built with COPTS=-O0.

Normally, functions called from mcount.c are expected to be expanded inline,
so _mcount() will never be called recursively. But when build with COPTS=-O0,
`static inline' functions aren't inlined, and _mcount() will be called
recursively.

Even if _mcount() has `__attribute__((__no_ instrument_function__))',
it has no effect on the calling external (no-inlined) function.

To avoid this, PROF.<fn> is added can be set the profiling flag of any file.
"PROF.mcount.c" is set to blank by default, mcount.c itself is compiled
without -pg.
This commit is contained in:
ryo 2021-10-25 07:54:44 +00:00
parent ea678cb005
commit 843ce00650
4 changed files with 17 additions and 8 deletions

View File

@ -1,4 +1,4 @@
# $NetBSD: bsd.README,v 1.419 2021/10/14 11:45:46 nia Exp $
# $NetBSD: bsd.README,v 1.420 2021/10/25 07:54:44 ryo Exp $
# @(#)bsd.README 8.2 (Berkeley) 4/2/94
This is the README file for the make "include" files for the NetBSD
@ -1630,6 +1630,10 @@ OBJCOPTS.<fn> Additional flags to the compiler when creating the
ObjC objects for <fn>.
For <fn>.[ly], "<fn>.c" must be used.
PROF.<fn> Alternative flag instead of "-pg" to pass to the compiler
when profiling <fn>. For <fn>.[ly], "<fn>.c" must be used.
Usually used to exclude a particular file from profiling.
SYMLINKS See <bsd.links.mk>
MAN Manual pages (should end in .1 - .9). If no MAN variable is

View File

@ -1,4 +1,4 @@
# $NetBSD: bsd.lib.mk,v 1.385 2021/08/21 11:55:24 andvar Exp $
# $NetBSD: bsd.lib.mk,v 1.386 2021/10/25 07:54:44 ryo Exp $
# @(#)bsd.lib.mk 8.3 (Berkeley) 4/22/94
.include <bsd.init.mk>
@ -51,7 +51,8 @@ CFLAGS+= ${PIE_CFLAGS}
AFLAGS+= ${PIE_AFLAGS}
.endif
PGFLAGS+= -pg
PROF?= -pg
PGFLAGS+= ${PROF.${.IMPSRC:T}:U${PROF}}
.if ${MKPIC} != "no"
PGFLAGS+= -fPIC
.endif

View File

@ -1,4 +1,4 @@
# $NetBSD: Makefile.kern.inc,v 1.282 2021/09/11 20:28:05 andvar Exp $
# $NetBSD: Makefile.kern.inc,v 1.283 2021/10/25 07:54:44 ryo Exp $
#
# This file contains common `MI' targets and definitions and it is included
# at the bottom of each `MD' ${MACHINE}/conf/Makefile.${MACHINE}.
@ -150,8 +150,8 @@ KLINK.o= ${LD} -r ${LINKFORMAT} -Map=${.TARGET}.map -o ${.TARGET} ${.ALLSRC}
# compile rules: rules are named ${TYPE}_${SUFFIX} where TYPE is NORMAL or
# NOPROF and SUFFIX is the file suffix, capitalized (e.g. C for a .c file).
NORMAL_C?= @${_MKSHMSG} "compile ${.CURDIR:T}/${.TARGET}" && \
${_MKSHECHO} ${KCOMPILE.c} ${PROF} && \
${KCOMPILE.c} ${PROF} && \
${_MKSHECHO} ${KCOMPILE.c} ${PROF.${.IMPSRC:T}:U${PROF}} && \
${KCOMPILE.c} ${PROF.${.IMPSRC:T}:U${PROF}} && \
${COMPILE_CTFCONVERT}
NOPROF_C?= @${_MKSHMSG} "compile ${.CURDIR:T}/${.TARGET}" && \
${_MKSHECHO} ${KCOMPILE.c} && \

View File

@ -1,4 +1,4 @@
# $NetBSD: Makefile.libkern,v 1.51 2021/05/17 08:50:36 mrg Exp $
# $NetBSD: Makefile.libkern,v 1.52 2021/10/25 07:54:44 ryo Exp $
#
# Variable definitions for libkern.
@ -55,7 +55,7 @@ SRCS+= cpuset.c inet_addr.c intoa.c
SRCS+= bswap64.c
.endif
SRCS+= md4c.c md5c.c rmd160.c sha1.c sha2.c sha3.c keccak.c murmurhash.c
SRCS+= pmatch.c mcount.c crc32.c
SRCS+= pmatch.c crc32.c
SRCS+= strlist.c
SRCS+= ppath_kmem_alloc.c
@ -102,6 +102,10 @@ SRCS+= entpool.c
SRCS+= dkcksum.c
SRCS+= disklabel_swap.c
# for profiling
SRCS+= mcount.c
PROF.mcount.c= # mcount.c itself is never a profiling target
.PATH: ${NETBSDSRCDIR}/common/lib/libc/cdb
SRCS+= cdbr.c
SRCS+= mi_vector_hash.c