summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxim Kuvyrkov <maxim.kuvyrkov@linaro.org>2022-09-15 18:59:37 +0000
committerMaxim Kuvyrkov <maxim.kuvyrkov@linaro.org>2022-09-16 15:35:22 +0000
commit8fa80f547a3390e64d956c492a0e73042caf0639 (patch)
tree997ba37352f39cf5e3d84a1d7d586cee0626e596
parentce01b29551fd88399b659794a786db9f0e314172 (diff)
wrappers/: New scripts to wrap build tools
... used in AOSP build so that we can gather statistics (count-wrapper.sh) and do on-the-side "shadow" compilation (shadow-cc.sh) without disturbing AOSP build system. Change-Id: I2eb48d6da4bfe9828fe16aaaf17afb8fe87e436f
-rwxr-xr-xwrappers/count-wrapper-install.sh20
-rwxr-xr-xwrappers/count-wrapper.sh16
-rwxr-xr-xwrappers/shadow-cc.sh286
3 files changed, 322 insertions, 0 deletions
diff --git a/wrappers/count-wrapper-install.sh b/wrappers/count-wrapper-install.sh
new file mode 100755
index 00000000..2b7a04ca
--- /dev/null
+++ b/wrappers/count-wrapper-install.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+set -eu -o pipefail
+
+cd "$1"
+
+bin=$(basename "$(pwd)")
+
+mkdir "../$bin.orig"
+
+for exe in *; do
+ if ! [ -x "$exe" ]; then
+ continue
+ fi
+
+ mv "$exe" "../$bin.orig/"
+ ln -s "$2" "$exe"
+done
+
+mkdir -p /home/maxim.kuvyrkov/tcwg_aosp/v4-counts
diff --git a/wrappers/count-wrapper.sh b/wrappers/count-wrapper.sh
new file mode 100755
index 00000000..8ae4d2ba
--- /dev/null
+++ b/wrappers/count-wrapper.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+set -euf -o pipefail
+
+orig_top=/home/maxim.kuvyrkov/tcwg_aosp/aosp/prebuilts/clang/host/linux-x86/clang-r450784d/bin.orig
+log_dir=/home/maxim.kuvyrkov/tcwg_aosp/v4-counts
+
+bin=$(basename "$0")
+
+(
+ $HOME/bin/myflock -e 9
+
+ echo "$0 $*" >>"$log_dir/$bin"
+) 9>>"$log_dir/$bin"
+
+exec "$orig_top/$bin" "$@"
diff --git a/wrappers/shadow-cc.sh b/wrappers/shadow-cc.sh
new file mode 100755
index 00000000..aa7b20df
--- /dev/null
+++ b/wrappers/shadow-cc.sh
@@ -0,0 +1,286 @@
+#!/bin/bash
+
+set -euf -o pipefail
+
+top=/home/maxim.kuvyrkov/tcwg_aosp/aosp #"#TOP#"
+shadow_top=/home/maxim.kuvyrkov/tcwg_aosp/v4 #"#SHADOW_TOP#"
+
+case "$0" in
+ *"++")
+ orig_cc=/home/maxim.kuvyrkov/tcwg_aosp/aosp/prebuilts/clang/host/linux-x86/clang-r450784d/bin.orig/clang++ #"#ORIG_CXX#"
+ shadow_cc=/home/maxim.kuvyrkov/tcwg_aosp/llvm-install/bin/clang++ #"#SHADOW_CXX#"
+ ;;
+ *)
+ orig_cc=/home/maxim.kuvyrkov/tcwg_aosp/aosp/prebuilts/clang/host/linux-x86/clang-r450784d/bin.orig/clang #"#ORIG_CC#"
+ shadow_cc=/home/maxim.kuvyrkov/tcwg_aosp/llvm-install/bin/clang #"#SHADOW_CC#"
+ ;;
+esac
+
+errors=()
+warnings=()
+skips=()
+
+mode=()
+target=()
+opt_level=()
+lang=()
+stdin_input=()
+
+orig_out=()
+shadow_out=()
+orig_input=()
+shadow_input=()
+orig_opts=()
+shadow_opts=()
+
+dump_log ()
+{
+ (
+ set +u
+ IFS=";"
+ cat <<EOF
+errors=(${errors[@]})
+warnings=(${warnings[@]})
+skips=(${skips[@]})
+mode=(${mode[@]})
+target=(${target[@]})
+opt_level=(${opt_level[@]})
+lang=(${lang[@]})
+stdin_input=(${stdin_input[@]})
+orig_out=(${orig_out[@]})
+shadow_out=(${shadow_out[@]})
+orig_input=(${orig_input[@]})
+shadow_input=(${shadow_input[@]})
+orig_opts=($0 ${orig_opts[@]})
+shadow_opts=(${shadow_opts[@]})
+
+EOF
+ )
+}
+
+report_errors () {
+ res=$?
+ if [ $res != 0 ]; then
+ errors+=("wrapper failed with $res")
+ fi
+ if [ ${#errors[@]} != 0 ] \
+ || [ ${#warnings[@]} != 0 ] \
+ || [ ${#skips[@]} != 0 ]; then
+ (
+ $HOME/bin/myflock -e 9
+
+ if [ ${#errors[@]} != 0 ]; then
+ log=$shadow_top.errors
+ elif [ ${#warnings[@]} != 0 ]; then
+ log=$shadow_top.warnings
+ else
+ log=$shadow_top.skips
+ fi
+ dump_log >>$log
+ ) 9>>$shadow_top.lock
+ fi
+}
+
+trap report_errors EXIT
+
+while [ "$#" -gt 0 ]; do
+ opt="$1"
+ shift
+
+ orig_opts+=("$opt")
+
+ case "$opt" in
+ "-c"|"-S"|"-E") mode+=("$opt") ;;
+ "-o")
+ if [ "$#" -gt 0 ]; then
+ orig_out=("$1" "${orig_out[@]}")
+ orig_opts+=("$1")
+ shift
+ else
+ errors+=("$opt with no argument")
+ fi
+ ;;
+ "-O"*)
+ opt_level+=("$opt")
+ ;;
+ "-target")
+ if [ "$#" -gt 0 ]; then
+ target=("$1" "${target[@]}")
+ orig_opts+=("$1")
+ shift
+ else
+ errors+=("$opt with no argument")
+ fi
+ ;;
+ "-x")
+ if [ "$#" -gt 0 ]; then
+ lang+=("$1")
+ orig_opts+=("$1")
+ shift
+ else
+ errors+=("$opt with no argument")
+ fi
+ ;;
+ "-isystem"|"--sysroot"|"-MF"|"-MQ"|"-I"|"-include"|"-z")
+ if [ "$#" -gt 0 ]; then
+ orig_opts+=("$1")
+ shift
+ else
+ errors+=("$opt with no argument")
+ fi
+ ;;
+ "-")
+ orig_input+=("$opt")
+ stdin_input+=("$opt")
+ ;;
+ "-"*)
+ ;;
+ *)
+ orig_input+=("$opt")
+ ;;
+ esac
+done
+
+if [ ${#mode[@]} = 0 ]; then
+ # Link mode
+ mode=("-L")
+elif [ ${#mode[@]} != 1 ]; then
+ warnings+=("Several modes: ${mode[*]}")
+fi
+
+if [ ${#stdin_input[@]} = 1 ]; then
+ skips+=("Stdin input")
+ if [ x"${orig_input[*]}" != x"${stdin_input[*]}" ]; then
+ errors+=("Extra inputs in presence of stdin: ${orig_input[*]}")
+ fi
+ if [ x"${mode[*]}" != x"-E" ]; then
+ warnings+=("Stdin input with mode: ${mode[*]}")
+ fi
+elif [ ${#stdin_input[@]} -gt 1 ]; then
+ errors+=("Several stdin inputs")
+fi
+
+if [ ${#lang[@]} -gt 1 ]; then
+ warnings+=("Several -x LANG options: ${lang[*]}")
+fi
+
+if [ ${#opt_level[@]} -gt 1 ]; then
+ warnings+=("Several opt_levels: ${opt_level[*]}")
+fi
+
+if [ x"${mode[*]}" != x"-L" ]; then
+ if [ ${#orig_input[@]} != 1 ]; then
+ errors+=("Several inputs with mode ${mode[*]}: ${orig_input[*]}")
+ fi
+fi
+
+if [ ${#orig_out[@]} = 0 ]; then
+ skips+=("No orig_out")
+elif [ ${#orig_out[@]} != 1 ]; then
+ errors+=("Several orig_outs: ${orig_out[*]}")
+fi
+
+if [ "${#target[@]}" -gt 1 ]; then
+ errors+=("Several targets: ${target[*]}")
+fi
+
+if ! echo "${target[*]}" | grep -q -e "^aarch64"; then
+ skips+=("Skipping target: ${target[*]}")
+fi
+
+print_shadow_path ()
+{
+ local path="$1"
+ local prefix="${2-}"
+
+ case "$path" in
+ "/dev/null") echo "$path"; return ;;
+ "/"*) errors+=("Absolute path: $path") ;;
+ esac
+
+ # Check that we are under $top
+ case "$(pwd -P | sed -e "s#^$top##")" in
+ "/"*) errors+=("Running outside of $top") ;;
+ esac
+
+ echo "$(pwd -P)/$path" | sed -e "s#$top#$shadow_top${prefix}#"
+}
+
+make_shadow_opts ()
+{
+ local opt
+ local shadow_file
+
+ while [ "$#" -gt 0 ]; do
+ opt="$1"
+ shift
+
+ case "$opt" in
+ "-o")
+ shadow_opts+=("$opt")
+ opt=$(print_shadow_path "$1")
+ shadow_out+=("$opt")
+ shift
+ ;;
+ "-target"|"-x"|"-isystem"|"--sysroot"|"-MF"|"-MQ"|"-I"|"-include"|"-z")
+ shadow_opts+=("$opt")
+ opt="$1"
+ shift
+ ;;
+ "-Werror"*) continue ;;
+ "-")
+ errors+=("Stdin input should have been skipped")
+ ;;
+ "-"*) ;;
+ "@"*)
+ opt="${opt#@}"
+ # shellcheck disable=SC2046
+ make_shadow_opts $(cat "$opt")
+ continue
+ ;;
+ *)
+ shadow_file=$(print_shadow_path "$opt")
+ if [ -e "$shadow_file" ]; then
+ opt="$shadow_file"
+ shadow_input+=("$shadow_file")
+ fi
+ esac
+ shadow_opts+=("$opt")
+ done
+}
+
+if [ ${#errors[@]} = 0 ] && [ ${#skips[@]} = 0 ]; then
+ make_shadow_opts "${orig_opts[@]}"
+fi
+
+if [ ${#errors[@]} = 0 ] && [ ${#skips[@]} = 0 ]; then
+ shadow_log=$(print_shadow_path "${orig_out[*]}" "-logs")
+
+ mkdir -p "$(dirname "${shadow_out[*]}")"
+ mkdir -p "$(dirname "$shadow_log")"
+
+ dump_log > "$shadow_log"
+ echo "$shadow_cc" "${shadow_opts[@]}" >> "$shadow_log"
+ $HOME/bin/myccache "$shadow_cc" "${shadow_opts[@]}" >> "$shadow_log" 2>&1 &
+ shadow_res=0 && wait $! || shadow_res=$?
+
+ if [ $shadow_res != 0 ]; then
+ errors+=("shadow_cc failed with $shadow_res")
+ elif ! [ -e "${shadow_out[*]}" ]; then
+ errors+=("shadow_cc failed to generate output")
+ elif [ x"${shadow_out[*]}" != x"/dev/null" ]; then
+ shadow_link=$(IFS=""; print_shadow_path "${orig_out[*]}" "-${target[*]-default}${mode[*]}")
+ mkdir -p "$(dirname "$shadow_link")"
+ ln -s -f "${shadow_out[*]}" "$shadow_link"
+ fi
+fi
+
+# TODO: ccache
+$HOME/bin/myccache "$orig_cc" "${orig_opts[@]}" &
+orig_res=0 && wait $! || orig_res=$?
+
+if [ $orig_res != 0 ]; then
+ errors+=("orig_cc failed with $orig_res")
+fi
+
+exit $orig_res