]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gold/testsuite/icf_safe_so_test.sh
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / gold / testsuite / icf_safe_so_test.sh
index db2e73ebc14d41d508272ac3c5ace32a734bd530..10f8782d1f5736ea8bfdf4c4adb84500211b9a7c 100755 (executable)
@@ -1,6 +1,8 @@
+#!/bin/sh
+
 # icf_safe_so_test.sh -- test --icf=safe
 
-# Copyright 2010 Free Software Foundation, Inc.
+# Copyright (C) 2010-2020 Free Software Foundation, Inc.
 # Written by Sriraman Tallam <tmsriram@google.com>.
 
 # This file is part of gold.
 # to verify if identical code folding in safe mode correctly folds
 # functions in a shared object.
 
+set -e
+
+error_if_symbol_absent()
+{
+    if ! is_symbol_present $1 $2;
+    then
+      echo "Symbol" $2 "not present, possibly folded."
+      exit 1
+    fi
+}
+
+is_symbol_present()
+{
+    grep $2 $1 > /dev/null 2>&1
+    return $?
+}
+
 check_nofold()
 {
+    error_if_symbol_absent $1 $2
+    error_if_symbol_absent $1 $3
     func_addr_1=`grep $2 $1 | awk '{print $1}'`
     func_addr_2=`grep $3 $1 | awk '{print $1}'`
     if [ $func_addr_1 = $func_addr_2 ];
@@ -38,32 +59,51 @@ check_nofold()
 
 check_fold()
 {
-    func_addr_1=`grep $2 $1 | awk '{print $1}'`
-    func_addr_2=`grep $3 $1 | awk '{print $1}'`
-    if [ $func_addr_1 != $func_addr_2 ];
-    then
-        echo "Safe Identical Code Folding did not fold " $2 "and" $3
-       exit 1
-    fi
+    map=$1
+    shift
+    num_syms=$#
+    save_IFS="$IFS"
+    IFS='|'
+    sym_patt="$*"
+    IFS="$save_IFS"
+    awk "
+BEGIN { discard = 0; }
+/^Discarded input/ { discard = 1; }
+/^Memory map/ { discard = 0; }
+/.*\\.text\\..*($sym_patt).*/ { act[discard] = act[discard] \" \" \$0; cnt[discard] = cnt[discard] + 1 }
+END {
+      printf \"kept\" act[0] \"\\nfolded\" act[1] \"\\n\";
+      if (cnt[0] != 1 || cnt[1] != $num_syms - 1)
+       {
+         printf \"Safe Identical Code Folding failed\\n\"
+         exit 1;
+       }
+    }" $map
 }
 
 arch_specific_safe_fold()
 {
-    grep_x86_64=`grep -q "Advanced Micro Devices X86-64" $2`
-    if [ $? == 0 ];
+    if grep -q -e "Intel 80386" -e "ARM" -e "PowerPC" $1;
     then
-      check_fold $1 $3 $4
+       shift
+       shift
+       #echo check_fold $*
+       check_fold $*
     else
-      check_nofold $1 $3 $4
+       shift
+       nm_output=$1
+       shift
+       shift
+       while test $# -gt 1; do
+           sym1=$1
+           shift
+           for sym2 in $*; do
+               #echo check_nofold $nm_output $sym1 $sym2
+               check_nofold $nm_output $sym1 $sym2
+           done
+       done
     fi
 }
 
-check_nofold icf_safe_so_test_1.stdout "foo_prot" "foo_hidden"
-check_nofold icf_safe_so_test_1.stdout "foo_prot" "foo_internal"
-check_nofold icf_safe_so_test_1.stdout "foo_prot" "foo_static"
-check_nofold icf_safe_so_test_1.stdout "foo_hidden" "foo_internal"
-check_nofold icf_safe_so_test_1.stdout "foo_hidden" "foo_static"
-check_nofold icf_safe_so_test_1.stdout "foo_internal" "foo_static"
-arch_specific_safe_fold icf_safe_so_test_1.stdout icf_safe_so_test_2.stdout \
-  "foo_glob" "bar_glob"
-
+arch_specific_safe_fold icf_safe_so_test_2.stdout icf_safe_so_test_1.stdout icf_safe_so_test.map foo_prot foo_hidden foo_internal foo_static
+check_nofold icf_safe_so_test_1.stdout foo_glob bar_glob