Home | History | Annotate | Download | only in testsuite
      1 #!/bin/sh
      2 
      3 # icf_safe_so_test.sh -- test --icf=safe
      4 
      5 # Copyright (C) 2010-2016 Free Software Foundation, Inc.
      6 # Written by Sriraman Tallam <tmsriram (at] google.com>.
      7 
      8 # This file is part of gold.
      9 
     10 # This program is free software; you can redistribute it and/or modify
     11 # it under the terms of the GNU General Public License as published by
     12 # the Free Software Foundation; either version 3 of the License, or
     13 # (at your option) any later version.
     14 
     15 # This program is distributed in the hope that it will be useful,
     16 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18 # GNU General Public License for more details.
     19 
     20 # You should have received a copy of the GNU General Public License
     21 # along with this program; if not, write to the Free Software
     22 # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     23 # MA 02110-1301, USA.
     24 
     25 # The goal of this program is to verify if --icf=safe  works as expected.
     26 # File icf_safe_so_test.cc is in this test.  The goal of this script is
     27 # to verify if identical code folding in safe mode correctly folds
     28 # functions in a shared object.
     29 
     30 set -e
     31 
     32 error_if_symbol_absent()
     33 {
     34     if ! is_symbol_present $1 $2;
     35     then
     36       echo "Symbol" $2 "not present, possibly folded."
     37       exit 1
     38     fi
     39 }
     40 
     41 is_symbol_present()
     42 {
     43     grep $2 $1 > /dev/null 2>&1
     44     return $?
     45 }
     46 
     47 check_nofold()
     48 {
     49     error_if_symbol_absent $1 $2
     50     error_if_symbol_absent $1 $3
     51     func_addr_1=`grep $2 $1 | awk '{print $1}'`
     52     func_addr_2=`grep $3 $1 | awk '{print $1}'`
     53     if [ $func_addr_1 = $func_addr_2 ];
     54     then
     55         echo "Safe Identical Code Folding folded" $2 "and" $3
     56 	exit 1
     57     fi
     58 }
     59 
     60 check_fold()
     61 {
     62     if ! is_symbol_present $1 $2
     63     then
     64       return 0
     65     fi
     66 
     67     if ! is_symbol_present $1 $3
     68     then
     69       return 0
     70     fi
     71 
     72     awk "
     73 BEGIN { discard = 0; }
     74 /^Discarded input/ { discard = 1; }
     75 /^Memory map/ { discard = 0; }
     76 /.*\\.text\\..*($2|$3).*/ { act[discard] = act[discard] \" \" \$0; }
     77 END {
     78       # printf \"kept\" act[0] \"\\nfolded\" act[1] \"\\n\";
     79       if (length(act[0]) == 0 || length(act[1]) == 0)
     80 	{
     81 	  printf \"Safe Identical Code Folding did not fold $2 and $3\\n\"
     82 	  exit 1;
     83 	}
     84     }" $4
     85 }
     86 
     87 arch_specific_safe_fold()
     88 {
     89     if grep -q -e "Intel 80386" -e "ARM" -e "PowerPC" $1;
     90     then
     91       check_fold $2 $4 $5 $3
     92     else
     93       check_nofold $2 $4 $5
     94     fi
     95 }
     96 
     97 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"
     98 arch_specific_safe_fold icf_safe_so_test_2.stdout icf_safe_so_test_1.stdout icf_safe_so_test.map "foo_prot" "foo_internal"
     99 arch_specific_safe_fold icf_safe_so_test_2.stdout icf_safe_so_test_1.stdout icf_safe_so_test.map "foo_prot" "foo_static"
    100 arch_specific_safe_fold icf_safe_so_test_2.stdout icf_safe_so_test_1.stdout icf_safe_so_test.map "foo_hidden" "foo_internal"
    101 arch_specific_safe_fold icf_safe_so_test_2.stdout icf_safe_so_test_1.stdout icf_safe_so_test.map "foo_hidden" "foo_static"
    102 arch_specific_safe_fold icf_safe_so_test_2.stdout icf_safe_so_test_1.stdout icf_safe_so_test.map "foo_internal" "foo_static"
    103 check_nofold icf_safe_so_test_1.stdout "foo_glob" "bar_glob"
    104