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-2014 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 error_if_symbol_absent()
     31 {
     32     if ! is_symbol_present $1 $2;
     33     then
     34       echo "Symbol" $2 "not present, possibly folded."
     35       exit 1
     36     fi
     37 }
     38 
     39 is_symbol_present()
     40 {
     41     grep $2 $1 > /dev/null 2>&1
     42     return $?
     43 }
     44 
     45 check_nofold()
     46 {
     47     error_if_symbol_absent $1 $2
     48     error_if_symbol_absent $1 $3
     49     func_addr_1=`grep $2 $1 | awk '{print $1}'`
     50     func_addr_2=`grep $3 $1 | awk '{print $1}'`
     51     if [ $func_addr_1 = $func_addr_2 ];
     52     then
     53         echo "Safe Identical Code Folding folded" $2 "and" $3
     54 	exit 1
     55     fi
     56 }
     57 
     58 check_fold()
     59 {
     60     if ! is_symbol_present $1 $2
     61     then
     62       return 0
     63     fi
     64 
     65     if ! is_symbol_present $1 $3
     66     then
     67       return 0
     68     fi
     69 
     70     awk "
     71 BEGIN { discard = 0; }
     72 /^Discarded input/ { discard = 1; }
     73 /^Memory map/ { discard = 0; }
     74 /.*\\.text\\..*($2|$3).*/ { act[discard] = act[discard] \" \" \$0; }
     75 END {
     76       # printf \"kept\" act[0] \"\\nfolded\" act[1] \"\\n\";
     77       if (length(act[0]) == 0 || length(act[1]) == 0)
     78 	{
     79 	  printf \"Safe Identical Code Folding did not fold $2 and $3\\n\"
     80 	  exit 1;
     81 	}
     82     }" $4
     83 }
     84 
     85 arch_specific_safe_fold()
     86 {
     87     grep -e "Intel 80386" -e "ARM" -e "PowerPC" $1 > /dev/null 2>&1
     88     if [ $? -eq 0 ];
     89     then
     90       check_fold $2 $4 $5 $3
     91     else
     92       check_nofold $2 $4 $5
     93     fi
     94 }
     95 
     96 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"
     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_internal"
     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_static"
     99 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"
    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_static"
    101 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"
    102 check_nofold icf_safe_so_test_1.stdout "foo_glob" "bar_glob"
    103