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