# 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
}

if [istarget nios2*-*-*] {
    set CFLAGS "$CFLAGS -G0"
}

# 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"

