Blame build/macosx/llvm-dsymutil

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