#!/bin/sh

nm --size-sort vmlinux \
| grep ' [^tT] ' \
| sed 's/^00000000//' \
| sed 's/ r CSWTCH.[0-9][0-9]*$/ r CSWTCH.NN/g' \
| sed 's/ r __func__.[0-9][0-9]*$/ r __func__.NN/g' \
| sed 's/ __compound_literal.[0-9][0-9]*$/ __compound_literal.NN/g' \
\
| sed 's/ __key.[0-9][0-9]*$/ __key.NN/g' \
| sed 's/ __warned.[0-9][0-9]*$/ __warned.NN/g' \
| sed 's/ __print_once.[0-9][0-9]*$/ __print_once.NN/g' \
| sed 's/ descriptor.[0-9][0-9]*$/ descriptor.NN/g' \
| sort -r \
| uniq -c \
| tee find_big_data_all.log \
| grep -vF '00000008 r __kcrctab_' \
| grep -vF '00000004 r __kcrctab_' \
| grep -v  '000000.. r __kstrtab_' \
| tee find_big_data.log \
| sort -rn \
> find_big_data_sort_by_rep.log

{
size -A vmlinux | grep -F '.data..percpu'
objdump -x vmlinux \
| grep -F 'O .data..percpu' \
| sed 's/^.*O .data..percpu[ \t]*//' \
| sed 's/^00000000//' \
| sort -r \
| uniq -c \
;} > find_big_data_percpu.log

# CSWTCH.NN are generated by gcc for some switch() statements

# __compound_literal.NN is generated for: int *ptr = (int[]) {1,2,3};
# (not excluding it since it can be huge, useful to look for that)

# 00000008 b __key.NNNNN comes from here:
# #ifdef CONFIG_DEBUG_SPINLOCK
#   extern void __raw_spin_lock_init(raw_spinlock_t *lock, const char *name,
#                                    struct lock_class_key *key);
# # define raw_spin_lock_init(lock)                               \
# do {                                                            \
#         static struct lock_class_key __key;                     \
#                                                                 \
#         __raw_spin_lock_init((lock), #lock, &__key);            \
# } while (0)

# __kcrctab_FOO comes from here:
# #ifdef CONFIG_MODVERSIONS
# /* Mark the CRC weak since genksyms apparently decides not to
#  * generate a checksums for some symbols */
# #define __CRC_SYMBOL(sym, sec)                                  \
#         extern __visible void *__crc_##sym __attribute__((weak));               \
#         static const unsigned long __kcrctab_##sym              \
#         __used                                                  \
#         __attribute__((section("___kcrctab" sec "+" #sym), unused))     \
#         = (unsigned long) &__crc_##sym;
# #else
# #define __CRC_SYMBOL(sym, sec)
# #endif

# __kstrtab_FOO comes from EXPORT_SYMBOL

# descriptor.NNN comes from this:
# #if defined(CONFIG_DYNAMIC_DEBUG)
# ...
# #define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt)                \
#         static struct _ddebug  __aligned(8)                     \
#         __attribute__((section("__verbose"))) name = {          \
#                 .modname = KBUILD_MODNAME,                      \
#                 .function = __func__,                           \
#                 .filename = __FILE__,                           \
#                 .format = (fmt),                                \
#                 .lineno = __LINE__,                             \
#                 .flags =  _DPRINTK_FLAGS_DEFAULT,               \
#         }
# #define dynamic_pr_debug(fmt, ...)                              \
# do {                                                            \
#         DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);         \
#         if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT))  \
#                 __dynamic_pr_debug(&descriptor, pr_fmt(fmt),    \
#                                    ##__VA_ARGS__);              \
# } while (0)
