diff options
author | Maxim Kuvyrkov <maxim.kuvyrkov@linaro.org> | 2022-09-15 18:59:37 +0000 |
---|---|---|
committer | Maxim Kuvyrkov <maxim.kuvyrkov@linaro.org> | 2022-09-16 15:35:22 +0000 |
commit | 8fa80f547a3390e64d956c492a0e73042caf0639 (patch) | |
tree | 997ba37352f39cf5e3d84a1d7d586cee0626e596 | |
parent | ce01b29551fd88399b659794a786db9f0e314172 (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-x | wrappers/count-wrapper-install.sh | 20 | ||||
-rwxr-xr-x | wrappers/count-wrapper.sh | 16 | ||||
-rwxr-xr-x | wrappers/shadow-cc.sh | 286 |
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 |