Re: [PATCH] lib/Kconfig.debug: introduce CONFIG_CC_STACK_USAGE

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Damn, I forget to add them to the .gitignore

On Sun, Jul 13, 2014 at 12:01 AM, Konstantin Khlebnikov
<koct9i@xxxxxxxxx> wrote:
> This patch adds option for collecting stack usage statistics
> via gcc option '-fstack-usage' (needs gcc 4.6 or newer).
> For each .o file gcc dumps stack-frame sizes into .su file.
>
> File format:
> <file>:<line>:<column>:<function>       <size>  <qualifiers>
>
> select.c:870:5:do_sys_poll      1040    static
> rtnetlink.c:1880:12:rtnl_newlink        552     dynamic
> random.c:1334:1:random_read     664     dynamic,bounded
>
> Quote from the gcc manpage about qualifiers:
>
>     The qualifier "static" means that the function
>     manipulates the stack statically: a fixed number of bytes
>     are allocated for the frame on function entry and
>     released on function exit; no stack adjustments are
>     otherwise made in the function.  The second field is this
>     fixed number of bytes.
>
>     The qualifier "dynamic" means that the function
>     manipulates the stack dynamically: in addition to the
>     static allocation described above, stack adjustments are
>     made in the body of the function, for example to push/pop
>     arguments around function calls.  If the qualifier
>     "bounded" is also present, the amount of these
>     adjustments is bounded at compile time and the second
>     field is an upper bound of the total amount of stack used
>     by the function.  If it is not present, the amount of
>     these adjustments is not bounded at compile time and the
>     second field only represents the bounded part.
>
> In comparison to the scripts/checkstack.pl this method is more accurate.
> It takes into account function arguments, push/pop pairs, frame
> pointers and saved return address. It gives information about all
> functions except purely assember (for example sha1_transform_avx2).
>
> Also this patch adds make target 'stack-usage' which combines all .su
> files into one sorted 'stack-usage'. Also prints top 100 and all unbounded
> dynamic stack frames.
>
> Signed-off-by: Konstantin Khlebnikov <koct9i@xxxxxxxxx>
> ---
>  Makefile          |   22 +++++++++++++++++++++-
>  lib/Kconfig.debug |    9 +++++++++
>  2 files changed, 30 insertions(+), 1 deletion(-)
>
> diff --git a/Makefile b/Makefile
> index 2167084..9ba61ee 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -635,6 +635,10 @@ ifneq ($(CONFIG_FRAME_WARN),0)
>  KBUILD_CFLAGS += $(call cc-option,-Wframe-larger-than=${CONFIG_FRAME_WARN})
>  endif
>
> +ifdef CONFIG_CC_STACK_USAGE
> +KBUILD_CFLAGS += $(call cc-option,-fstack-usage)
> +endif
> +
>  # Handle stack protector mode.
>  ifdef CONFIG_CC_STACKPROTECTOR_REGULAR
>    stackp-flag := -fstack-protector
> @@ -1228,6 +1232,7 @@ help:
>          echo  ''
>         @echo  'Static analysers'
>         @echo  '  checkstack      - Generate a list of stack hogs'
> +       @echo  '  stack-usage     - Alternative list of stack hogs'
>         @echo  '  namespacecheck  - Name space analysis on compiled kernel'
>         @echo  '  versioncheck    - Sanity check on version.h usage'
>         @echo  '  includecheck    - Check for duplicate included header files'
> @@ -1376,7 +1381,7 @@ clean: $(clean-dirs)
>         $(call cmd,rmfiles)
>         @find $(if $(KBUILD_EXTMOD), $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \
>                 \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
> -               -o -name '*.ko.*' \
> +               -o -name '*.ko.*' -o -name '*.su' \
>                 -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
>                 -o -name '*.symtypes' -o -name 'modules.order' \
>                 -o -name modules.builtin -o -name '.tmp_*.o.*' \
> @@ -1432,6 +1437,21 @@ checkstack:
>         $(OBJDUMP) -d vmlinux $$(find . -name '*.ko') | \
>         $(PERL) $(src)/scripts/checkstack.pl $(CHECKSTACK_ARCH)
>
> +quiet_cmd_cc_stack_usage = SORTING $@
> +cmd_cc_stack_usage = find -name '*.su' | xargs cat | sort -k 2 -n -r > $@
> +
> +stack-usage: FORCE
> +ifndef CONFIG_CC_STACK_USAGE
> +       $(Q)echo >&2 'Please rebuild with CONFIG_CC_STACK_USAGE=y' && false
> +endif
> +       $(call cmd,cc_stack_usage)
> +       $(Q)echo ''
> +       $(Q)echo 'Unbounded dynamic stack frames:'
> +       $(Q)grep '\bdynamic$$' $@
> +       $(Q)echo ''
> +       $(Q)echo 'Top 100 stack frames:'
> +       $(Q)head -100 < $@
> +
>  kernelrelease:
>         @echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"
>
> diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
> index 7a638aa..3b30853 100644
> --- a/lib/Kconfig.debug
> +++ b/lib/Kconfig.debug
> @@ -170,6 +170,15 @@ config FRAME_WARN
>           Setting it to 0 disables the warning.
>           Requires gcc 4.4
>
> +config CC_STACK_USAGE
> +       bool "Collect statistics about stack usage (needs gcc 4.6)"
> +       help
> +         This enables gcc option -fstack-usage which saves information
> +         about stack frames in per-function basis into '.su' files.
> +
> +         Run 'make stack-usage' after building kernel and modules to
> +         combine all information in one file.
> +
>  config STRIP_ASM_SYMS
>         bool "Strip assembler-generated symbols during link"
>         default n
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux&nblp;USB Development]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite Secrets]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux