#!/bin/bash 
# Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved.
# For licensing, see https://github.com/mudita/MuditaOS/blob/master/LICENSE.md

# A script to find duplicated initialization code of global data

rootdir="$(realpath $(dirname $(realpath $0))/..)"
objfile="${1:-$(realpath ${rootdir}/build-rt1051-Debug/PurePhone.elf)}"

if [ ! -f ${objfile} ]; then
    echo "No such file: ${objfile}"
    exit 1
fi

type=$( file ${objfile} | grep "ARM" )

if [[ -z "${type}" ]]; then
    echo "x86"
    OBJDUMP="objdump"
    NM="nm"
else
    echo "ARM"
    OBJDUMP="arm-none-eabi-objdump"
    NM="arm-none-eabi-nm"
fi

STATIC_SYMBOL="_Z41__static_initialization_and_destruction_0ii"

staticList=($(${NM} --print-size ${objfile} | grep "${STATIC_SYMBOL}"|cut -f1,2 -d" "|tr " " ":" ))

echo "${#staticList[@]}"

I=0
statcListSize=${#staticList[@]}

searchRegexp='(.*\.hpp:[0-9]+)'
while [[ $I -lt $statcListSize ]]
do
    
    symbol=${staticList[${I}]}
    symbolStart="0x${staticList[${I}]%:*}"
    symbolSize="0x${staticList[${I}]#*:}"
    printf -v symbolEnd "0x%x" $(( ${symbolStart} + ${symbolSize} ))
    echo "${I}/${statcListSize}: ${symbolStart} - ${symbolEnd}"

    items=( $(${OBJDUMP} --start-address=${symbolStart} --stop-address=${symbolEnd} -d -l ${objfile} ) )
    J=0
    while [[ ${J} -lt ${#items[@]} ]]
    do
        item=$( echo ${items[$J]} | cut -f1 -d" ")
        if [[ ${item} =~ ${searchRegexp} ]]; then
            paths="$paths\n${BASH_REMATCH[1]}"
        fi
        J=$(( $J + 1 ))
    done
    I=$(( $I + 1 ))
done

if [[ -n ${paths} ]]; then
    echo -e ${paths} | sort | uniq -c | sort -n
fi

