RAP-optimizations/src/size_overflow_plugin/generate_size_overflow_hash.sh
2018-08-20 04:10:13 +08:00

104 lines
2.1 KiB
Bash

#!/bin/bash
# This script generates the hash table (size_overflow_hash.h) for the size_overflow gcc plugin (size_overflow_plugin.c).
header1="size_overflow_hash.h"
database="size_overflow_hash.data"
n=65536
hashtable_name="size_overflow_hash"
usage() {
cat <<EOF
usage: $0 options
OPTIONS:
-h|--help help
-o header file
-d database file
-n hash array size
-s name of the hash table
EOF
return 0
}
while true
do
case "$1" in
-h|--help) usage && exit 0;;
-n) n=$2; shift 2;;
-o) header1="$2"; shift 2;;
-d) database="$2"; shift 2;;
-s) hashtable_name="$2"; shift 2;;
--) shift 1; break ;;
*) break ;;
esac
done
create_defines() {
for i in `seq 0 31`
do
echo -e "#define PARAM"$i" (1U << "$i")" >> "$header1"
done
echo >> "$header1"
}
create_structs() {
rm -f "$header1"
create_defines
cat "$database" | while read data
do
data_array=($data)
struct_hash_name="${data_array[0]}"
funcn="${data_array[1]}"
context="${data_array[2]}"
params="${data_array[3]}"
next="${data_array[5]}"
echo "const struct size_overflow_hash $struct_hash_name = {" >> "$header1"
echo -e "\t.next\t= $next,\n\t.name\t= \"$funcn\",\n\t.context\t= \"$context\"," >> "$header1"
echo -en "\t.param\t= " >> "$header1"
line=
for param_num in ${params//-/ };
do
line="${line}PARAM"$param_num"|"
done
echo -e "${line%?},\n};\n" >> "$header1"
done
}
create_headers() {
echo "const struct size_overflow_hash * const $hashtable_name[$n] = {" >> "$header1"
}
create_array_elements() {
index=0
grep -v "nohasharray" $database | sort -n -k 5 | while read data
do
data_array=($data)
i="${data_array[4]}"
hash="${data_array[0]}"
while [[ $index -lt $i ]]
do
echo -e "\t["$index"]\t= NULL," >> "$header1"
index=$(($index + 1))
done
index=$(($index + 1))
echo -e "\t["$i"]\t= &"$hash"," >> "$header1"
done
echo '};' >> $header1
}
size_overflow_plugin_dir=`dirname $header1`
if [ "$size_overflow_plugin_dir" != '.' ]; then
mkdir -p "$size_overflow_plugin_dir" 2> /dev/null
fi
create_structs
create_headers
create_array_elements
exit 0