Blame src/demangle_unittest.sh

Packit 18d29c
#! /bin/sh
Packit 18d29c
#
Packit 18d29c
# Copyright (c) 2006, Google Inc.
Packit 18d29c
# All rights reserved.
Packit 18d29c
#
Packit 18d29c
# Redistribution and use in source and binary forms, with or without
Packit 18d29c
# modification, are permitted provided that the following conditions are
Packit 18d29c
# met:
Packit 18d29c
#
Packit 18d29c
#     * Redistributions of source code must retain the above copyright
Packit 18d29c
# notice, this list of conditions and the following disclaimer.
Packit 18d29c
#     * Redistributions in binary form must reproduce the above
Packit 18d29c
# copyright notice, this list of conditions and the following disclaimer
Packit 18d29c
# in the documentation and/or other materials provided with the
Packit 18d29c
# distribution.
Packit 18d29c
#     * Neither the name of Google Inc. nor the names of its
Packit 18d29c
# contributors may be used to endorse or promote products derived from
Packit 18d29c
# this software without specific prior written permission.
Packit 18d29c
#
Packit 18d29c
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit 18d29c
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit 18d29c
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit 18d29c
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit 18d29c
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit 18d29c
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit 18d29c
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit 18d29c
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit 18d29c
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit 18d29c
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit 18d29c
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit 18d29c
#
Packit 18d29c
# Author: Satoru Takabayashi
Packit 18d29c
#
Packit 18d29c
# Unit tests for demangle.c with a real binary.
Packit 18d29c
Packit 18d29c
set -e
Packit 18d29c
Packit 18d29c
die () {
Packit 18d29c
    echo $1
Packit 18d29c
    exit 1
Packit 18d29c
}
Packit 18d29c
Packit 18d29c
BINDIR=".libs"
Packit 18d29c
LIBGLOG="$BINDIR/libglog.so"
Packit 18d29c
Packit 18d29c
DEMANGLER="$BINDIR/demangle_unittest"
Packit 18d29c
Packit 18d29c
if test -e "$DEMANGLER"; then
Packit 18d29c
  # We need shared object.
Packit 18d29c
  export LD_LIBRARY_PATH=$BINDIR
Packit 18d29c
  export DYLD_LIBRARY_PATH=$BINDIR
Packit 18d29c
else
Packit 18d29c
  # For windows
Packit 18d29c
  DEMANGLER="./demangle_unittest.exe"
Packit 18d29c
  if ! test -e "$DEMANGLER"; then
Packit 18d29c
    echo "We coundn't find demangle_unittest binary."
Packit 18d29c
    exit 1
Packit 18d29c
  fi
Packit 18d29c
fi
Packit 18d29c
Packit 18d29c
# Extract C++ mangled symbols from libbase.so.
Packit 18d29c
NM_OUTPUT="demangle.nm"
Packit 18d29c
nm "$LIBGLOG" | perl -nle 'print $1 if /\s(_Z\S+$)/' > "$NM_OUTPUT"
Packit 18d29c
Packit 18d29c
# Check if mangled symbols exist. If there are none, we quit.
Packit 18d29c
# The binary is more likely compiled with GCC 2.95 or something old.
Packit 18d29c
if ! grep --quiet '^_Z' "$NM_OUTPUT"; then
Packit 18d29c
    echo "PASS"
Packit 18d29c
    exit 0
Packit 18d29c
fi
Packit 18d29c
Packit 18d29c
# Demangle the symbols using our demangler.
Packit 18d29c
DM_OUTPUT="demangle.dm"
Packit 18d29c
GLOG_demangle_filter=1 "$DEMANGLER" --demangle_filter < "$NM_OUTPUT" > "$DM_OUTPUT"
Packit 18d29c
Packit 18d29c
# Calculate the numbers of lines.
Packit 18d29c
NM_LINES=`wc -l "$NM_OUTPUT" | awk '{ print $1 }'`
Packit 18d29c
DM_LINES=`wc -l "$DM_OUTPUT" | awk '{ print $1 }'`
Packit 18d29c
Packit 18d29c
# Compare the numbers of lines.  They must be the same.
Packit 18d29c
if test "$NM_LINES" != "$DM_LINES"; then
Packit 18d29c
    die "$NM_OUTPUT and $DM_OUTPUT don't have the same numbers of lines"
Packit 18d29c
fi
Packit 18d29c
Packit 18d29c
# Check if mangled symbols exist.  They must not exist.
Packit 18d29c
if grep --quiet '^_Z' "$DM_OUTPUT"; then
Packit 18d29c
    MANGLED=`grep '^_Z' "$DM_OUTPUT" | wc -l | awk '{ print \$1 }'`
Packit 18d29c
    echo "Mangled symbols ($MANGLED out of $NM_LINES) found in $DM_OUTPUT:"
Packit 18d29c
    grep '^_Z' "$DM_OUTPUT"
Packit 18d29c
    die "Mangled symbols ($MANGLED out of $NM_LINES) found in $DM_OUTPUT"
Packit 18d29c
fi
Packit 18d29c
Packit 18d29c
# All C++ symbols are demangled successfully.
Packit 18d29c
echo "PASS"
Packit 18d29c
exit 0