File: run-souper.sh

package info (click to toggle)
rust-wasmtime 28.0.1%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 54,116 kB
  • sloc: ansic: 4,071; sh: 567; javascript: 548; cpp: 280; asm: 175; ml: 96; makefile: 55
file content (109 lines) | stat: -rwxr-xr-x 2,605 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/usr/bin/env bash

# Runs Souper on the LHSes that were harvested by `clif-util
# souper-harvest`.
#
# This script takes two inputs:
#
# 1. The `souper-check` binary, and
# 2. The  directory of harvested  left-hand sides  (aka the `-o  $directory` you
#    specified to `clif-util souper-harvest`).
#
# For a left-hand side file `foo` that Souper successfully synthesized a
# right-hand side for, this script will write the whole optimization to a
# sibling file named `foo.result`.
#
# The left-hand sides are processed in smallest-to-largest order. This helps
# give you initial results more quickly, but does mean that progress will slow
# down as we encounter larger and larger left-hand sides.
#
# Usage:
#
#     run-souper.sh path/to/souper-check path/to/left-hand-sides

set -e

# Knobs for configuring how large of right-hand sides Souper should try to
# generate and how much time we give it to synthesize a result. Feel free to
# play with these!
MAX_INSTS=3
TIMEOUT=5s

# Run Souper on one left-hand side.
function run_one {
    local souper=$1
    local lhs=$2
    local rhs="$lhs".result

    if [[ -f "$rhs" ]]; then
        return
    fi

    local temp=$(mktemp)
    local cmd="taskset --cpu-list 0-3 $souper --infer-rhs -souper-enumerative-synthesis-max-instructions=$MAX_INSTS $lhs > $temp"

    set +e
    $(which timeout) --foreground --kill-after=1s $TIMEOUT bash -c "$cmd"
    local exit_code="$?"
    set -e

    case "$exit_code" in
        "0")
            # Success! Copy the RHS to its final destination.
            cp $lhs $rhs
            cat "$temp" >> "$rhs"
            ;;

        # SIGINT. Exit this whole script.
        "130")
            exit 1
            ;;

        # Timeout (regular).
        "124")
            return
            ;;

        # Timeout (with SIGKILL).
        "137")
            return
            ;;

        # Something else.
        *)
            exit 1
    esac

}

# Run Souper on all the left-hand sides.
function main {
    local souper=$1
    local lhs_dir=$2
    local lhs_count=$(ls -1 $lhs_dir | grep -v result | wc -l)

    echo "Processing $lhs_count left-hand sides."

    cd "$lhs_dir"

    local i=0;
    for lhs in $(ls -1S $lhs_dir); do
        # Ignore '.result' files.
        if $(echo "$lhs" | grep -q result); then
            continue;
        fi

        i=$(( $i + 1 ))
        if (( $i % 5 == 0 )); then
            local percent=$(( $i * 100 / $lhs_count ))
            echo "$i / $lhs_count ($percent%)"
        fi

        run_one "$souper" "$lhs"
    done

    echo "Done!"
}

# Kick everything off!
main $1 $2