|  | #!/bin/bash | 
|  |  | 
|  | # Copyright 2020 The IREE Authors | 
|  | # | 
|  | # Licensed under the Apache License v2.0 with LLVM Exceptions. | 
|  | # See https://llvm.org/LICENSE.txt for license information. | 
|  | # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  |  | 
|  | # Reads text from stdin containing stack frames in the format | 
|  | # `#3 0x5b09835a14  (/data/local/tmp/iree-benchmark-module+0x18aa14)` | 
|  | # and symbolizes such lines and prints them to stdout. | 
|  | # | 
|  | # The approach is to pull the files out of the device and use the host | 
|  | # build of llvm-symbolizer provided in the NDK. | 
|  | # | 
|  | # Other lines are just echo'd to stdout. | 
|  | # This is meant to be used like this: | 
|  | # ANDROID_NDK=~/android-ndk-r21d ./build_tools/scripts/android_symbolize.sh < /tmp/asan.txt | 
|  | # Where one has previously stored e.g. some ASan report to a file, here /tmp/asan.txt. | 
|  | # | 
|  | # See docs/developing_iree/sanitizers.md. | 
|  | # | 
|  | # Discussion of alternatives: https://github.com/android/ndk/issues/753 | 
|  |  | 
|  | # Provide the location of your Android NDK in the ANDROID_NDK env var. | 
|  | : ${ANDROID_NDK:=""} | 
|  |  | 
|  | if [ -z "${ANDROID_NDK}" ] | 
|  | then | 
|  | echo "Please define ANDROID_NDK to point to your Android NDK." | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | tmpdir="$(mktemp -d)" | 
|  |  | 
|  | while read line | 
|  | do | 
|  | header="$(echo "$line" | grep -o '^\s*#[0-9]\+')" | 
|  | if [ -z "$header" ] | 
|  | then | 
|  | echo "$line" | 
|  | continue | 
|  | fi | 
|  |  | 
|  | location_with_parentheses="$(echo "$line" | grep -o '(/[^)]*)$')" | 
|  | location="$(echo "$location_with_parentheses" | tr -d '()' )" | 
|  | file="$(echo "$location" | cut -d '+' -f 1)" | 
|  | address="$(echo "$location" | cut -d '+' -f 2)" | 
|  | if [[ -z "$file" || -z "$address" ]] | 
|  | then | 
|  | echo "$line" | 
|  | continue | 
|  | fi | 
|  |  | 
|  | file_basename="$(basename "$file")" | 
|  | pulled_file="$tmpdir/$file_basename" | 
|  | if [ ! -f "$pulled_file" ] | 
|  | then | 
|  | adb pull "$file" "$pulled_file" 1>/dev/null 2>/dev/null | 
|  | fi | 
|  | llvm_symbolizer_output="$($ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-symbolizer --obj "$pulled_file" "$address")" | 
|  | if [ -z "$llvm_symbolizer_output" ] | 
|  | then | 
|  | echo "$line" | 
|  | continue | 
|  | fi | 
|  |  | 
|  | function="$(echo "$llvm_symbolizer_output" | head -n1)" | 
|  | source_location="$(echo "$llvm_symbolizer_output" | tail -n1)" | 
|  | echo "$header $source_location $function" | 
|  | done | 
|  |  | 
|  | rm -rf "$tmpdir" |