Bench: analyze failures just after fallback
This commit is contained in:
parent
00c4a9af72
commit
2e449a9822
2 changed files with 81 additions and 0 deletions
|
@ -41,6 +41,16 @@ function count_fallbacks_failed {
|
||||||
cat $TMP_FILE | grep -c "step:.* dwarf_step also failed"
|
cat $TMP_FILE | grep -c "step:.* dwarf_step also failed"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function count_fail_after_fallback_to_dwarf {
|
||||||
|
cat $TMP_FILE \
|
||||||
|
| "$(dirname $0)/line_patterns.py" \
|
||||||
|
"fallback with" \
|
||||||
|
"step:.* unw_step called" \
|
||||||
|
~"step:.* unw_step called" \
|
||||||
|
"step:.* returning -" \
|
||||||
|
| grep Complete -c
|
||||||
|
}
|
||||||
|
|
||||||
function report {
|
function report {
|
||||||
flavour="$1"
|
flavour="$1"
|
||||||
|
|
||||||
|
@ -53,12 +63,14 @@ function report {
|
||||||
if [ "$flavour" = "eh_elf" ]; then
|
if [ "$flavour" = "eh_elf" ]; then
|
||||||
fallbacks=$(count_eh_fallbacks)
|
fallbacks=$(count_eh_fallbacks)
|
||||||
fallbacks_to_dwarf=$(count_fallbacks_to_dwarf)
|
fallbacks_to_dwarf=$(count_fallbacks_to_dwarf)
|
||||||
|
fallbacks_to_dwarf_failed_after=$(count_fail_after_fallback_to_dwarf)
|
||||||
fallbacks_failed=$(count_fallbacks_failed)
|
fallbacks_failed=$(count_fallbacks_failed)
|
||||||
fallbacks_to_heuristics="$(( $fallbacks \
|
fallbacks_to_heuristics="$(( $fallbacks \
|
||||||
- $fallbacks_to_dwarf \
|
- $fallbacks_to_dwarf \
|
||||||
- $fallbacks_failed))"
|
- $fallbacks_failed))"
|
||||||
echo -e "* success:\t\t\t\t$successes"
|
echo -e "* success:\t\t\t\t$successes"
|
||||||
echo -e "* fallback to DWARF:\t\t\t$fallbacks_to_dwarf"
|
echo -e "* fallback to DWARF:\t\t\t$fallbacks_to_dwarf"
|
||||||
|
echo -e "* …of which failed at next step:\t$fallbacks_to_dwarf_failed_after"
|
||||||
echo -e "* fallback to libunwind heuristics:\t$fallbacks_to_heuristics"
|
echo -e "* fallback to libunwind heuristics:\t$fallbacks_to_heuristics"
|
||||||
computed_sum=$(( $successes + $fallbacks - $fallbacks_failed + $failures ))
|
computed_sum=$(( $successes + $fallbacks - $fallbacks_failed + $failures ))
|
||||||
else
|
else
|
||||||
|
|
69
benching/tools/line_patterns.py
Executable file
69
benching/tools/line_patterns.py
Executable file
|
@ -0,0 +1,69 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
class Match:
|
||||||
|
def __init__(self, re_str, negate=False):
|
||||||
|
self.re = re.compile(re_str)
|
||||||
|
self.negate = negate
|
||||||
|
|
||||||
|
def matches(self, line):
|
||||||
|
return self.re.search(line) is not None
|
||||||
|
|
||||||
|
|
||||||
|
class Matcher:
|
||||||
|
def __init__(self, match_objs):
|
||||||
|
self.match_objs = match_objs
|
||||||
|
self.match_pos = 0
|
||||||
|
self.matches = 0
|
||||||
|
|
||||||
|
if not self.match_objs:
|
||||||
|
raise Exception("No match expressions provided")
|
||||||
|
if self.match_objs[-1].negate:
|
||||||
|
raise Exception("The last match object must be a positive expression")
|
||||||
|
|
||||||
|
def feed(self, line):
|
||||||
|
for cur_pos, exp in enumerate(self.match_objs[self.match_pos :]):
|
||||||
|
cur_pos = cur_pos + self.match_pos
|
||||||
|
if not exp.negate: # Stops the for here, whether matching or not
|
||||||
|
if exp.matches(line):
|
||||||
|
self.match_pos = cur_pos + 1
|
||||||
|
print(
|
||||||
|
"Passing positive {}, advance to {}".format(
|
||||||
|
cur_pos, self.match_pos
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if self.match_pos >= len(self.match_objs):
|
||||||
|
print("> Complete match, reset.")
|
||||||
|
self.matches += 1
|
||||||
|
self.match_pos = 0
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
if exp.matches(line):
|
||||||
|
print("Failing negative [{}] {}, reset".format(exp.negate, cur_pos))
|
||||||
|
old_match_pos = self.match_pos
|
||||||
|
self.match_pos = 0
|
||||||
|
if old_match_pos != 0:
|
||||||
|
print("> Refeed: ", end="")
|
||||||
|
self.feed(line)
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def get_args(args):
|
||||||
|
out_args = []
|
||||||
|
for arg in args:
|
||||||
|
negate = False
|
||||||
|
if arg[0] == "~":
|
||||||
|
negate = True
|
||||||
|
arg = arg[1:]
|
||||||
|
out_args.append(Match(arg, negate))
|
||||||
|
return out_args
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
matcher = Matcher(get_args(sys.argv[1:]))
|
||||||
|
for line in sys.stdin:
|
||||||
|
matcher.feed(line)
|
||||||
|
print(matcher.matches)
|
Loading…
Reference in a new issue