# Expect script for common symbol tests
#   Copyright 2003, 2005, 2006, 2007, 2008, 2009
#   Free Software Foundation, Inc.
#
# This file is part of the GNU Binutils.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
# MA 02110-1301, USA.
#
# Written by H.J. Lu (hjl@gnu.org)
#

# Make sure that ld correctly handles common symbols in ELF.

# This test can only be run on ELF platforms.
if ![is_elf_format] {
    return
}

# hpux assembly is weird
if [istarget "hppa*-*-hpux*"] {
    return
}

proc test_sort_common {} {
    global exec_output
    global objdump
    global srcdir
    global subdir
    global as
    global ld
  
    set test "--sort-common (descending)"
  
    verbose "Check to see that --sort-common sorts in descending alignment"

    # We do not run the sort common tests for the DLX target because we know that the linker
    # will seg-fault.  The built-in DLX linker script requires that there be something in the
    # .text section and our sort-common.s file does not provide anything.
    if [istarget dlx-*-*] {
	untested "$test"
	return 0
    }
    
    if { ![ld_assemble $as $srcdir/$subdir/sort-common.s tmpdir/sort-common.o] } {
	unresolved "$test"
	return 0
    }

    if { ![ld_simple_link $ld tmpdir/sort-common.dx "--sort-common=descending tmpdir/sort-common.o"] } {
	fail "$test"
	return 0
    }

    send_log "$objdump --syms tmpdir/sort-common.dx | grep var | sort\n"
    set exec_output [run_host_cmd "$objdump" "--syms tmpdir/sort-common.dx | grep var | sort"]

    # Don't know why, but the CR ports fail this test.
    setup_xfail "cr16-*-*" "crx-*-*"

    # Note: The second regexp is for targets which put small commons in a .sbss
    #  section and large commons in a .bss section.
    if {   ![regexp ".*var_16.*var_8.*var_4.*var_2.*var_1.*" $exec_output]
        && ![regexp ".*sbss.*var_8.*var_4.*var_2.*var_1.*bss.*var_16.*" $exec_output] } {      
	fail $test
    } else {
	pass $test
    }

    set test "--sort-common (ascending)"
  
    verbose "Check to see that --sort-common=ascending sorts in ascending alignment"

    if { ![ld_simple_link $ld tmpdir/sort-common.ax "--sort-common=ascending tmpdir/sort-common.o"] } {
	fail "$test"
	return 0
    }

    send_log "$objdump --syms tmpdir/sort-common.ax | grep var | sort\n"
    set exec_output [run_host_cmd "$objdump" "--syms tmpdir/sort-common.ax | grep var | sort"]

    if {![regexp ".*var_1.*var_2.*var_4.*var_8.*var_16.*" $exec_output]} {      
	fail $test
	return 0
    }

    pass $test
    return 1
}

test_sort_common

set test1	"size/aligment change of common symbols"
set test1w1	"$test1 (warning 1)"
set test1w2	"$test1 (warning 2)"
set test1c1	"$test1 (change 1)"
set test1c2	"$test1 (change 2)"

if { ![is_remote host] && [which $CC] == 0 } {
    untested $test1w1
    untested $test1w2
    untested $test1c1
    untested $test1c2
    return
}
if { [istarget score-*-*] } {
    untested $test1w1
    untested $test1w2
    untested $test1c1
    untested $test1c2
    return
}

proc dump_common1 { testname } {
    global exec_output
    global READELF

    send_log "$READELF --syms tmpdir/common1.o | grep foo\n"
    set exec_output [run_host_cmd "$READELF" "--syms tmpdir/common1.o | grep foo"]

    if {   ![regexp "(\[ 	\]*)(\[0-9\]+):(\[ 	\]*)(\[0\]*)80(\[ 	\]+)4(\[ 	\]+)(COMMON|OBJECT)(\[ 	\]+)GLOBAL(\[ 	\]+)DEFAULT(\[ 	\]+)(PRC\\\[0xff03\\\]|COM|SCOM)(\[ 	\]+)_?foo2" $exec_output]
	|| ![regexp "(\[ 	\]*)(\[0-9\]+):(\[ 	\]*)(\[0-9\]+)(\[ 	\]+)21(\[ 	\]+)OBJECT(\[ 	\]+)GLOBAL(\[ 	\]+)DEFAULT(\[ 	\]+)(\[0-9\]+)(\[ 	\]+)_?foo1" $exec_output] } {
	verbose $exec_output
	fail $testname
	return 0
    }

    return 1
}

proc stt_common_test { options testname } {
    global exec_output
    global READELF
    global ld

    set options "$options tmpdir/common1a.o"

    if { ! [ld_simple_link $ld tmpdir/common.exe $options] } {
      unresolved $testname
      return 0
    }

    send_log "$READELF --syms tmpdir/common.exe | grep foo\n"
    set exec_output [run_host_cmd "$READELF" "--syms tmpdir/common.exe | grep foo"]

    if {![regexp "(\[ 	\]*)(\[0-9\]+):(\[ 	\]*)(\[0-9\]+)(\[ 	\]+)(\[0-9\]+)(\[ 	\]+)COMMON(\[ 	\]+)GLOBAL(\[ 	\]+)DEFAULT(\[ 	\]+)(\[0-9\]+)(\[ 	\]+)_?foo2" $exec_output] } {
	fail $testname
	return 0
    }

    pass $testname
    return 1
}

# Check to see if the assembler is generating symbols with the STT_COMMON type.
proc assembler_generates_commons {} {
    global exec_output
    global READELF

    verbose "Check to see if STT_COMMON symbols are being generated:"
    set exec_output [run_host_cmd "$READELF" "--syms tmpdir/common1a.o | grep foo"]

    if { ![regexp "(\[ 	\]*)(\[0-9\]+):(\[ 	\]*)(\[0\]*)80(\[ 	\]+).(\[ 	\]+)COMMON(\[ 	\]+)GLOBAL(\[ 	\]+)DEFAULT(\[ 	\]+)(PRC\\\[0xff03\\\]|COM|SCOM)(\[ 	\]+)_?foo2" $exec_output] } {
	verbose "STT_COMMON not generated"
	return 0
    }

    verbose "STT_COMMON's are generated"
    return 1
}

# Explicitly use "-fcommon" so that even if $CFLAGS includes
# "-fno-common", these tests are compiled as expected.
if {   ![ld_compile "$CC $CFLAGS -fcommon" $srcdir/$subdir/common1a.c tmpdir/common1a.o]
    || ![ld_compile "$CC $CFLAGS -fcommon" $srcdir/$subdir/common1b.c tmpdir/common1b.o] } {
    unresolved $test1
    return
}

global ld
global link_output

set options "-r tmpdir/common1a.o tmpdir/common1b.o"

# SH64 targets needs an extra ld option for this test.
if [istarget sh64*-*-*] {
    if [istarget sh64*l*-*-*] {
	set options "-mshlelf32 $options"
    } else {
	set options "-mshelf32 $options"
    }
}

if { [ld_simple_link $ld tmpdir/common1.o $options] } {
    unresolved $test1w1
    return
}

# This test fails on MIPS because the backend sets type_change_ok.
# The size change warning is suppressed.  Same on hppa64.
if {[istarget mips*-*-*] || [istarget hppa*64*-*-*]} {
    if { ![regexp "Warning: alignment (\[0-9\]+) of symbol \`_?foo1\' in tmpdir/common1b.o is smaller than 64 in tmpdir/common1a.o" $link_output] } {
        fail $test1w1
    } else {
        pass $test1w1
    }
} else {
    if { ![regexp "Warning: alignment (\[0-9\]+) of symbol \`_?foo1\' in tmpdir/common1b.o is smaller than 64 in tmpdir/common1a.o" $link_output]
         || ![regexp "Warning: size of symbol \`_?foo1\' changed from 2 in tmpdir/common1a.o to 21 in tmpdir/common1b.o" $link_output] } {
        fail $test1w1
    } else {
        pass $test1w1
    }
}

if { [dump_common1 $test1c1] } {
    pass $test1c1
}

set options "-r tmpdir/common1b.o tmpdir/common1a.o"

# SH64 targets needs an extra ld option for this test.
if [istarget sh64*-*-*] {
    if [istarget sh64*l*-*-*] {
	set options "-mshlelf32 $options"
    } else {
	set options "-mshelf32 $options"
    }
}

if { [ld_simple_link $ld tmpdir/common1.o $options] } {
    unresolved $test1w2
    return
}

if { ![regexp "Warning: alignment (\[0-9\]+) of symbol \`_?foo1\' in tmpdir/common1b.o is smaller than 64 in tmpdir/common1a.o" $link_output] } {
    fail $test1w2
} else {
    pass $test1w2
}

if { [dump_common1 $test1c2] } {
    pass $test1c2
}

#
# The following tests are for when we are generating STT_COMMON symbols only.
#

if { ![assembler_generates_commons] } {
    return
}

stt_common_test "-static -e 0" "static link of common symbols"
stt_common_test "-shared"      "shared link of common symbols"
stt_common_test "-pie"         "position independent link of common symbols"

