1#!/usr/bin/env bash
2set -u
3set -e
4
5function first()
6{
7  echo $1
8}
9
10function next()
11{
12  shift
13  echo $*
14}
15
16pushd ../../src/Infrastructure/src/Emulator/Cores/ > /dev/null
17
18WEAKS=weaks.tmp
19IMPLEMENTATIONS=implementations.tmp
20CALLBACKS_BIN=callbacks.tmp
21PATHS_TO_BIN="renode/renode_callbacks.c renode/renode_memory.c"
22
23ARCHS="arm ppc sparc"
24PATHS_WEAK="tlib/callbacks.c tlib/arch/arm/arch_callbacks.c tlib/arch/ppc/arch_callbacks.c tlib/arch/sparc/arch_callbacks.c"
25PATHS_IMPLEMENTATION="$CALLBACKS_BIN renode/arch/arm/renode_arm_callbacks.c renode/arch/ppc/renode_ppc_callbacks.c renode/arch/sparc/renode_sparc_callbacks.c"
26
27RESULT=0
28
29for PATH_TO_BIN in $PATHS_TO_BIN
30do
31    cat $PATH_TO_BIN >> $CALLBACKS_BIN
32done
33
34for PATH_WEAK in $PATHS_WEAK
35do
36  PATH_IMPLEMENTATION=`first $PATHS_IMPLEMENTATION`
37  PATHS_IMPLEMENTATION=`next $PATHS_IMPLEMENTATION`
38  # We search for tlib_... instead of tlib... because the latter would match
39  # the word "tlib" itself (as in "../tlib/unwind.h") which makes BSD/macOS grep
40  # report that all lines match.
41  ${CC:-gcc} -I tlib/include -E $PATH_WEAK | grep weak | grep -o tlib_[_A-Za-z]* | sort | uniq > $WEAKS
42  # Sort in reverse order to avoid a bug with partial matches in FreeBSD grep <2.6.0
43  cat $PATH_IMPLEMENTATION | grep -o tlib_[_A-Za-z]* | sort -r | uniq > $IMPLEMENTATIONS
44  if grep -vwF -f $IMPLEMENTATIONS $WEAKS
45  then
46    echo $PATH_WEAK
47    echo "-----------------------"
48    RESULT=1
49  fi
50done
51
52rm $WEAKS
53rm $IMPLEMENTATIONS
54rm $CALLBACKS_BIN
55
56popd > /dev/null
57
58exit $RESULT
59