blob: 2deb78f4b69428801ef55652be3d02ebe4781ce4 (
plain)
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
|
#!/bin/sh
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
"$REAL_DSYMUTIL" "$@"
ret=$?
if [ $ret -ne 139 ]; then
exit $ret
fi
echo "$REAL_DSYMUTIL crashed. Trying to get a reduced testcase." >&2
tmpdir=$(mktemp -d)
trap "rm -rf $tmpdir" EXIT
# Get the library file name from the command line arguments. We assume
# it's the last argument that doesn't start with a dash.
for arg in "$@"; do
case "$arg" in
-*)
;;
*)
lib="$arg"
;;
esac
done
last_obj=$("$REAL_DSYMUTIL" --verbose "$@" 2> /dev/null | sed -n "/trying to open/s/trying to open '\(.*\)'/\1/p" | tail -1)
case "$last_obj" in
"")
echo "Could not produce a reduced testcase. Aborting." >&2
# Ideally, we'd produce an archive with every .o and .a involved, but so
# far, this case has never happened, so, meh.
exit 139
;;
*.a\(*.o\))
# The crash likely happened while reading one particular object in a library.
# Create a new library with just that one object.
archive=$(readlink -f "${last_obj%(*}")
obj="${last_obj#*.a(}"
obj="${obj%)}"
(cd "$tmpdir"; ar x "$archive" "$obj")
mkdir -p $tmpdir/crasher/$(dirname "$archive")
(cd "$tmpdir"; ar cr "$tmpdir/crasher/$archive" "$obj")
rm "$tmpdir/$obj"
;;
*)
# The crash likely happened while reading one particular object.
obj=$(readlink -f "$last_obj")
mkdir -p "$tmpdir/crasher/$(dirname "$obj")"
cp "$obj" "$tmpdir/crasher/$obj"
;;
esac
cp "$lib" "$tmpdir/crasher"
cat > "$tmpdir/crasher/run-me.sh" <<EOF
#!/bin/sh
DSYMUTIL="\${DSYMUTIL:-llvm-dsymutil}"
dir="\$(dirname \$0)"
\$DSYMUTIL -oso-prepend-path="\$dir" "\$dir/$(basename "$lib")"
exit \$?
EOF
chmod +x "$tmpdir/crasher/run-me.sh"
(cd "$tmpdir"/crasher; DSYMUTIL=/builds/worker/workspace/build/src/llvm-dsymutil/bin/llvm-dsymutil ./run-me.sh > /dev/null 2>&1)
if [ $? -eq 139 ]; then
echo "Could reproduce with a reduced testcase. Creating an artifact." >&2
mkdir -p "$HOME/artifacts"
artifact=dsymutil-crasher.tar.xz
tar -Jcf "$HOME/artifacts/$artifact" -C "$tmpdir" crasher/
echo "Check the $artifact artifact." >&2
else
echo "Could not reproduce with a reduced testcase. Sorry." >&2
fi
exit 139
|