#!/bin/bash
# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Script to generate minidump symbols in the format required by
# minidump_stackwalk to dump stack information.
#
# NOTE: This script must be run from the chromeos build chroot environment.
#

SCRIPT_ROOT=$(dirname $(readlink -f "$0"))
. "${SCRIPT_ROOT}/common.sh" || exit 1

# Script must be run inside the chroot
restart_in_chroot_if_needed "$@"

# Flags
DEFINE_string board "$DEFAULT_BOARD" "The board to build packages for."
DEFINE_string minidump_symbol_root "" \
  "Symbol root (defaults to /usr/lib/debug/breakpad for board)"
DEFINE_boolean verbose ${FLAGS_FALSE} "Be verbose."

DUMP_SYMS="dump_syms"
DUMP_SYMS32="dump_syms.32"

ERROR_COUNT=0

debug() {
  if [ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]; then
    info "$@"
  fi
}

# Each job sets this on their own; we declare it
# globally so the exit trap can always see the last
# setting of it w/in a job worker.
SYM_FILE=
JOB_FILE=
NOTIFIED=

# The master process sets these up, which each worker
# than uses for communicating once they've finished.
CONTROL_PIPE=
CONTROL_PIPE_FD=

_worker_finished() {
  if [ -z "${NOTIFIED}" ]; then
    debug "Sending notification of $BASHPID ${1-1}"
    echo "$BASHPID ${1-1}" > /dev/fd/${CONTROL_PIPE_FD}
    NOTIFIED=1
  fi
}

_cleanup_worker() {
  rm -f "${SYM_FILE}" "${ERR_FILE}"
  _worker_finished 1
}

_cleanup_master() {
  set +eu
  rm -f "${CONTROL_PIPE}"
  if [ ${#JOBS_ARRAY[@]} != 0 ]; then
    kill -s SIGINT "${!JOBS_ARRAY[@]}" &> /dev/null
    wait
    # Clear the array.
    JOBS_ARRAY=( )
  fi
}

declare -A JOBS_ARRAY

finish_job() {
  local finished result
  read -r -u ${CONTROL_PIPE_FD} finished result
  # Bash doesn't allow for zombies, but tell it to clean up its intenral
  # bookkeeping.  Note bash can be buggy here- if a new process has slipped
  # into that pid, bash doesn't use its internal accounting first, and
  # can throw an error; doesn't matter, thus this form.
  ! wait ${finished} &> /dev/null
  if [ "${result-1}" -ne "0" ]; then
    : $(( ++ERROR_COUNT ))
  fi
  # Bit of a hack, but it works well enough.
  debug "finished ${finished} with result ${result-1}"
  unset JOBS_ARRAY[${finished}]
}

run_job() {
  local debug_file=${1} text_file=${2} newpid

  if [ ${#JOBS_ARRAY[@]} -ge ${NUM_JOBS} ]; then
    # Reclaim a spot.
    finish_job
  fi

  dump_file "${debug_file}" "${text_file}" &
  newpid=$!
  debug "Started ${debug_file} ${text_file} at ${newpid}"
  JOBS_ARRAY[$newpid]=1
}

# Given path to a debug file, return its text file
get_text_for_debug() {
  local debug_file=$1
  local text_dir=$(dirname "${debug_file#$DEBUG_ROOT}")
  local text_path=${SYSROOT}${text_dir}/$(basename "${debug_file}" .debug)
  echo ${text_path}
}

# Given path to a text file, return its debug file
get_debug_for_text() {
  local text_file=$1
  local text_path=${text_file#${SYSROOT}}
  local debug_path=${DEBUG_ROOT}${text_path}.debug
  echo ${debug_path}
}

# Returns true if the file given is a 32-bit ELF file.
is_32b_elf() {
  local elf="$1"
  sudo file "${elf}" | grep -q "ELF 32-bit"
}

# Dump given debug and text file.  Returns 1 if any errors, even
# if they can be ignored, but only sets ERROR_COUNT if the error should not
# be ignored (and we should not proceed to upload).
dump_file() {
  trap '_cleanup_worker; exit 1' INT TERM
  trap _cleanup_worker EXIT
  local debug_file="$1"
  local text_file="$2"
  local debug_directory="$(dirname "${debug_file}")"
  local dump_syms_prog="${DUMP_SYMS}"
  # 32-bit dump_syms must be used to dump a 32-bit ELF file
  if is_32b_elf "${text_file}"; then
    dump_syms_prog="${DUMP_SYMS32}"
    debug "Using ${dump_syms_prog} for 32-bit file ${text_file}"
  fi
  SYM_FILE=$(mktemp -t "breakpad.sym.XXXXXX")
  # Dump symbols as root in order to read all files.
  if ! sudo "${dump_syms_prog}" "${text_file}" "${debug_directory}" \
       > "${SYM_FILE}" 2> /dev/null; then
    # Try dumping w/out extended cfi.  Some versions of dump_syms like to
    # crash.  At least we can get the symbols.  http://crbug.com/266064
    debug "Normal dumping failed; retrying with -c -r"
    if ! sudo "${dump_syms_prog}" -c -r "${text_file}" "${debug_directory}" \
         > "${SYM_FILE}" 2> /dev/null; then
      # Try dumping just the main file to get public-only symbols.
      debug "Normal dumping still failed; retrying w/out debug symbols"
      ERR_FILE=$(mktemp -t "breakpad.err.XXXXXX")
      if ! sudo "${dump_syms_prog}" "${text_file}" > "${SYM_FILE}" \
           2> "${ERR_FILE}"; then
        # A lot of files (like kernel files) contain no debug information, do
        # not consider such occurrences as errors.
        if grep -q "file contains no debugging information" "${ERR_FILE}"; then
          warn "No symbols found for ${text_file}"
          _worker_finished 0
          exit 0
        fi
        error "Unable to dump symbols for ${text_file}:"
        error "$(<"${ERR_FILE}")"
        exit 1
      else
        warn "File ${text_file} did not have debug info, using linkage symbols"
      fi
    else
      warn "Dumping ${text_file} w/CFI failed; generated syms w/out it"
    fi
  fi
  local file_id=$(head -1 ${SYM_FILE} | cut -d' ' -f4)
  local module_name=$(head -1 ${SYM_FILE} | cut -d' ' -f5)
  # Show file upload success and symbol info for easier lookup
  debug "Dumped symbols from ${text_file} for ${module_name}|${file_id}."
  # Sanity check: if we've created the same named file in the /usr/lib/debug
  # directory during the src_compile stage of an ebuild, verify our sym file
  # is the same.
  local installed_sym="${DEBUG_ROOT}"/$(basename "${text_file}").sym
  if [ -e "${installed_sym}" ]; then
    if ! cmp --quiet "${installed_sym}" "${SYM_FILE}"; then
      error "${installed_sym} differ from current sym file:"
      error "$(diff "${installed_sym}" "${SYM_FILE}")"
      : $(( ++ERROR_COUNT ))
      exit 1
    fi
  fi

  local container_dir="${FLAGS_minidump_symbol_root}/${module_name}/${file_id}"
  sudo mkdir -p "${container_dir}"
  sudo mv "${SYM_FILE}" "${container_dir}/${module_name}.sym"
  _worker_finished 0
  exit 0
}

# Convert the given debug file.  No return value.
process_file() {
  local debug_file="$1"
  local text_file="$(get_text_for_debug ${debug_file})"
  if [ -h "${debug_file}" ]; then
    # Don't follow symbolic links.  In particular, we don't want to bother
    # with the *.debug links in the "debug/.build-id/" directory.
    debug "Skipping symbolic link: ${debug_file}"
    return 0
  fi
  if [ "${text_file##*.}" == "ko" ]; then
    # Skip kernel objects.  We can't use their symbols and they sometimes
    # have objects with empty text sections which trigger errors in dump_sym.
    debug "Skipping kernel object: ${text_file}"
    return 0
  fi
  if [ ! -f "${text_file}" ]; then
    # Allow files to not exist, for instance if they are in the INSTALL_MASK.
    warn "Binary does not exist: ${text_file}"
    return 0
  fi

  run_job "${debug_file}" "${text_file}"
}

main() {

  # Parse command line
  FLAGS_HELP="usage: $0 [flags] [<files...>]"
  FLAGS "$@" || exit 1
  eval set -- "${FLAGS_ARGV}"

  switch_to_strict_mode

  [ -n "$FLAGS_board" ] || die_notrace "--board is required."

  SYSROOT="/build/${FLAGS_board}"

  if [[ -z "${FLAGS_minidump_symbol_root}" ]]; then
    FLAGS_minidump_symbol_root="${SYSROOT}/usr/lib/debug/breakpad"
  fi

  info "Writing minidump symbols to ${FLAGS_minidump_symbol_root}"

  DEBUG_ROOT="${SYSROOT}/usr/lib/debug"
  sudo rm -rf "${FLAGS_minidump_symbol_root}"

  # Open our control pipe.
  trap '_cleanup_master; exit 1' INT TERM
  trap _cleanup_master EXIT
  CONTROL_PIPE=$(mktemp -t "breakpad.fifo.XXXXXX")
  rm "${CONTROL_PIPE}"
  mkfifo "${CONTROL_PIPE}"
  exec {CONTROL_PIPE_FD}<>${CONTROL_PIPE}

  # We require our stderr (which error/info/warn go through) to be a
  # pipe for atomic write reasons; thus if it isn't, abuse cat to make it
  # so.
  if [ ! -p /dev/stderr ]; then
    debug "Replacing stderr with a cat process for pipe requirements..."
    exec 2> >(cat 1>&2)
  fi

  if [ -z "${FLAGS_ARGV}" ]; then
    # Sort on size; we want to start the largest first since it's likely going
    # to be the chrome binary (which can take 98% of the runtime when we're
    # running with parallelization for 6 or higher).
    for debug_file in $(find "${DEBUG_ROOT}" -name \*.debug \
         -type f -exec stat -c '%s %n' {} + | sort -gr | cut -d' ' -f2-); do
      process_file "${debug_file}"
    done
  else
    for either_file in ${FLAGS_ARGV}; do
      either_file=${either_file#\'}
      either_file=${either_file%\'}
      if [ ! -h "${either_file}" -a ! -f "${either_file}" ]; then
        error "Specified file ${either_file} does not exist"
        : $(( ++ERROR_COUNT ))
        continue
      fi
      if [ "${either_file##*.}" == "debug" ]; then
        debug_file="${either_file}"
      else
        debug_file="$(get_debug_for_text ${either_file})"
      fi
      process_file "${debug_file}"
    done
  fi

  while [[ ${#JOBS_ARRAY[@]} != 0 ]]; do
    finish_job
  done

  local size=$(sudo find "${FLAGS_minidump_symbol_root}" \
      -type f -name '*.sym' -exec du -b {} + | \
      awk '{t += $1} END {print t}')
  info "Generated ${size:-0}B of unique debug information"

  if [[ ${ERROR_COUNT} == 0 ]]; then
    return 0
  fi
  die_notrace "Encountered ${ERROR_COUNT} problems"
}

main "$@"
