| Index: build/gdb-add-index
|
| diff --git a/build/gdb-add-index b/build/gdb-add-index
|
| deleted file mode 100755
|
| index 992ac16159794685cdf2f233aad43e5883a107e2..0000000000000000000000000000000000000000
|
| --- a/build/gdb-add-index
|
| +++ /dev/null
|
| @@ -1,162 +0,0 @@
|
| -#!/bin/bash
|
| -# Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -#
|
| -# Saves the gdb index for a given binary and its shared library dependencies.
|
| -#
|
| -# This will run gdb index in parallel on a number of binaries using SIGUSR1
|
| -# as the communication mechanism to simulate a semaphore. Because of the
|
| -# nature of this technique, using "set -e" is very difficult. The SIGUSR1
|
| -# terminates a "wait" with an error which we need to interpret.
|
| -#
|
| -# When modifying this code, most of the real logic is in the index_one_file
|
| -# function. The rest is cleanup + sempahore plumbing.
|
| -
|
| -# Cleanup temp directory and ensure all child jobs are dead-dead.
|
| -function on_exit {
|
| - trap "" EXIT USR1 # Avoid reentrancy.
|
| -
|
| - local jobs=$(jobs -p)
|
| - if [ -n "$jobs" ]; then
|
| - echo -n "Killing outstanding index jobs..."
|
| - kill -KILL $(jobs -p)
|
| - wait
|
| - echo "done"
|
| - fi
|
| -
|
| - if [ -f "$DIRECTORY" ]; then
|
| - echo -n "Removing temp directory $DIRECTORY..."
|
| - rm -rf $DIRECTORY
|
| - echo done
|
| - fi
|
| -}
|
| -
|
| -# Add index to one binary.
|
| -function index_one_file {
|
| - local file=$1
|
| - local basename=$(basename "$file")
|
| - local should_index="${SHOULD_INDEX}"
|
| -
|
| - local readelf_out=$(${TOOLCHAIN_PREFIX}readelf -S "$file")
|
| - if [[ $readelf_out =~ "gdb_index" ]]; then
|
| - if [ "${REMOVE_INDEX}" = 1 ]; then
|
| - ${TOOLCHAIN_PREFIX}objcopy --remove-section .gdb_index "$file"
|
| - echo "Removed index from $basename."
|
| - else
|
| - echo "Skipped $basename -- already contains index."
|
| - should_index=0
|
| - fi
|
| - fi
|
| -
|
| - if [ "${should_index}" = 1 ]; then
|
| - local start=$(date +"%s%N")
|
| - echo "Adding index to $basename..."
|
| -
|
| - ${TOOLCHAIN_PREFIX}gdb -batch "$file" -ex "save gdb-index $DIRECTORY" \
|
| - -ex "quit"
|
| - local index_file="$DIRECTORY/$basename.gdb-index"
|
| - if [ -f "$index_file" ]; then
|
| - ${TOOLCHAIN_PREFIX}objcopy --add-section .gdb_index="$index_file" \
|
| - --set-section-flags .gdb_index=readonly "$file" "$file"
|
| - local finish=$(date +"%s%N")
|
| - local elapsed=$(((finish - start)/1000000))
|
| - echo " ...$basename indexed. [${elapsed}ms]"
|
| - else
|
| - echo " ...$basename unindexable."
|
| - fi
|
| - fi
|
| -}
|
| -
|
| -# Functions that when combined, concurrently index all files in FILES_TO_INDEX
|
| -# array. The global FILES_TO_INDEX is declared in the main body of the script.
|
| -function async_index {
|
| - # Start a background subshell to run the index command.
|
| - {
|
| - index_one_file $1
|
| - kill -SIGUSR1 $$ # $$ resolves to the parent script.
|
| - exit 129 # See comment above wait loop at bottom.
|
| - } &
|
| -}
|
| -
|
| -CUR_FILE_NUM=0
|
| -function index_next {
|
| - if (( CUR_FILE_NUM >= ${#FILES_TO_INDEX[@]} )); then
|
| - return
|
| - fi
|
| -
|
| - async_index "${FILES_TO_INDEX[CUR_FILE_NUM]}"
|
| - ((CUR_FILE_NUM += 1)) || true
|
| -}
|
| -
|
| -
|
| -########
|
| -### Main body of the script.
|
| -
|
| -REMOVE_INDEX=0
|
| -SHOULD_INDEX=1
|
| -while getopts ":f:r" opt; do
|
| - case $opt in
|
| - f)
|
| - REMOVE_INDEX=1
|
| - shift
|
| - ;;
|
| - r)
|
| - REMOVE_INDEX=1
|
| - SHOULD_INDEX=0
|
| - shift
|
| - ;;
|
| - *)
|
| - echo "Invalid option: -$OPTARG" >&2
|
| - ;;
|
| - esac
|
| -done
|
| -
|
| -if [[ ! $# == 1 ]]; then
|
| - echo "Usage: $0 [-f] [-r] path-to-binary"
|
| - echo " -f forces replacement of an existing index."
|
| - echo " -r removes the index section."
|
| - exit 1
|
| -fi
|
| -
|
| -FILENAME="$1"
|
| -if [[ ! -f "$FILENAME" ]]; then
|
| - echo "Path $FILENAME does not exist."
|
| - exit 1
|
| -fi
|
| -
|
| -# Ensure we cleanup on on exit.
|
| -trap on_exit EXIT
|
| -
|
| -# We're good to go! Create temp directory for index files.
|
| -DIRECTORY=$(mktemp -d)
|
| -echo "Made temp directory $DIRECTORY."
|
| -
|
| -# Create array with the filename and all shared libraries that
|
| -# have the same dirname. The dirname is a signal that these
|
| -# shared libraries were part of the same build as the binary.
|
| -declare -a FILES_TO_INDEX=($FILENAME
|
| - $(ldd "$FILENAME" 2>/dev/null \
|
| - | grep $(dirname "$FILENAME") \
|
| - | sed "s/.*[ \t]\(.*\) (.*/\1/")
|
| -)
|
| -
|
| -# Start concurrent indexing.
|
| -trap index_next USR1
|
| -
|
| -# 4 is an arbitrary default. When changing, remember we are likely IO bound
|
| -# so basing this off the number of cores is not sensible.
|
| -INDEX_TASKS=${INDEX_TASKS:-4}
|
| -for ((i=0;i<${INDEX_TASKS};i++)); do
|
| - index_next
|
| -done
|
| -
|
| -# Do a wait loop. Bash waits that terminate due a trap have an exit
|
| -# code > 128. We also ensure that our subshell's "normal" exit occurs with
|
| -# an exit code > 128. This allows us to do consider a > 128 exit code as
|
| -# an indication that the loop should continue. Unfortunately, it also means
|
| -# we cannot use set -e since technically the "wait" is failing.
|
| -wait
|
| -while (( $? > 128 )); do
|
| - wait
|
| -done
|
|
|