# Expect script for linker support of STB_GNU_UNIQUE symbols
#
#   Copyright 2009, 2010, 2011 Free Software Foundation, Inc.
#   Contributed by Red Hat.
#
# 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 Nick Clifton <nickc@redhat.com>
# Adapted for unique checking by Mark J. Wielaard <mjw@redhat.com>


# STB_GNU_UNIQUE support has only been implemented for the ix86, x86_64,
# arm, powerpc, and sparc so far.
if {!(([istarget "i?86-*-*"]
       || [istarget "x86_64-*-*"]
       || [istarget "arm-*-*"]
       || [istarget "powerpc*-*-*"]
       || [istarget "sparc*-*-*"])
      && ([istarget "*-*-elf*"]
	  || (([istarget "*-*-linux*"]
	       || [istarget "*-*-gnu*"])
	      && ![istarget "*-*-*aout*"]
	      && ![istarget "*-*-*oldld*"]))) } {
    verbose "UNIQUE tests not run - target does not support UNIQUE"
    return
}

# We need a native system.  FIXME: Strictly speaking this
# is not true, we just need to know how to create a fully
# linked executable, including the C and Z libraries, using
# the linker that is under test.
if ![isnative] {
    verbose "UNIQUE tests not run - not a native toolchain"
    return
}

# We need a working compiler.  (Strictly speaking this is
# not true, we could use target specific assembler files).
if { [which $CC] == 0 } {
    verbose "UNIQUE tests not run - no compiler available"
    return
}

# A procedure to check the OS/ABI field in the ELF header of a binary file.
proc check_osabi { binary_file expected_osabi } {
    global READELF
    global READELFFLAGS

    catch "exec $READELF $READELFFLAGS --file-header $binary_file > readelf.out" got

    if ![string match "" $got] then {
	verbose "proc check_osabi: Readelf produced unexpected out processing $binary_file: $got"
	return 0
    }

    if { ![regexp "\n\[ \]*OS/ABI:\[ \]*(.+)\n\[ \]*ABI" \
	   [file_contents readelf.out] nil osabi] } {
	verbose "proc check_osabi: Readelf failed to extract an ELF header from $binary_file"
	return 0
    }

    if { $osabi == $expected_osabi } {
	return 1
    }

    verbose "Expected OSABI: $expected_osabi, Obtained osabi: $osabi"

    return 0
}

# A procedure to confirm that a file contains the UNIQUE symbol.
# Returns -1 upon error, 0 if the symbol was not found and 1 if it was found.
proc contains_unique_symbol { binary_file } {
    global READELF
    global READELFFLAGS

    catch "exec $READELF $READELFFLAGS --symbols $binary_file > readelf.out" got

    if ![string match "" $got] then {
	verbose "proc contains_unique_symbol: Readelf produced unexpected out processing $binary_file: $got"
	return -1
    }

    # Look for a line like this:
    #    54: 0000000000400474     4 OBJECT  UNIQUE DEFAULT   13 a

    if { ![regexp ".*\[ \]*OBJECT\[ \]+UNIQUE\[ \]+DEFAULT\[ \]+\[UND0-9\]+\[ \]+\[ab\]\n" [file_contents readelf.out]] } {
	return 0
    }

    return 1
}

set fails 0

# Create object file containing unique symbol.
if ![ld_compile "$CC -c" "$srcdir/$subdir/unique.s" "tmpdir/unique.o"] {
    fail "Could not create a unique object"
    set fails [expr $fails + 1]
}

# Create object file NOT containing unique symbol.
if ![ld_compile "$CC -c" "$srcdir/$subdir/unique_empty.s" "tmpdir/unique_empty.o"] {
    fail "Could not create a non-unique object"
    set fails [expr $fails + 1]
}

# Create pic object file containing unique symbol.
if ![ld_compile "$CC -c -fPIC" "$srcdir/$subdir/unique_shared.s" "tmpdir/unique_shared.o"] {
    fail "Could not create a pic unique object"
    set fails [expr $fails + 1]
}

# Create executable containing unique symbol.
if ![default_ld_link $ld "tmpdir/unique_prog" "tmpdir/unique.o"] {
    fail "Could not link a unique executable"
    set fails [expr $fails + 1]
}

# Create shared library containing unique symbol.
if ![ld_simple_link $ld "tmpdir/libunique_shared.so" "-shared tmpdir/unique_shared.o"] {
    fail "Could not create a shared library containing an unique symbol"
    set fails [expr $fails + 1]
}

# Create executable NOT containing unique symbol linked against library.
if ![default_ld_link $ld "tmpdir/unique_shared_prog" "-Ltmpdir tmpdir/unique_empty.o -Bdynamic -lunique_shared -rpath ./tmpdir"] {
    fail "Could not link a dynamic executable"
    set fails [expr $fails + 1]
}

if { $fails != 0 } {
    return
}

# Check the object file.
if {! [check_osabi tmpdir/unique.o {UNIX - GNU}]} {
    fail "Object containing unique does not have an OS/ABI field of GNU"
    set fails [expr $fails + 1]
}

if {[contains_unique_symbol tmpdir/unique.o] != 1} {
    fail "Object containing unique does not contain an UNIQUE symbol"
    set fails [expr $fails + 1]
}

if { $fails == 0 } {
  pass "Checking unique object"
}

# Check the executable.
if {! [check_osabi tmpdir/unique_prog {UNIX - GNU}]} {
    fail "Executable containing unique does not have an OS/ABI field of GNU"
    set fails [expr $fails + 1]
}

if {[contains_unique_symbol tmpdir/unique_prog] != 1} {
    fail "Executable containing unique does not contain an UNIQUE symbol"
    set fails [expr $fails + 1]
}

if { $fails == 0 } {
  pass "Checking unique executable"
}

# Check the empty object file.
if {! [check_osabi tmpdir/unique_empty.o {UNIX - System V}]} {
    fail "Object NOT containing unique does not have an OS/ABI field of System V"
    set fails [expr $fails + 1]
}

if {[contains_unique_symbol tmpdir/unique_empty.o] == 1} {
    fail "Object NOT containing unique does contain an UNIQUE symbol"
    set fails [expr $fails + 1]
}

if { $fails == 0 } {
  pass "Checking empty unique object"
}

# Check the unique PIC file.
if {! [check_osabi tmpdir/unique_shared.o {UNIX - GNU}]} {
    fail "PIC Object containing unique does not have an OS/ABI field of GNU"
    set fails [expr $fails + 1]
}

if {[contains_unique_symbol tmpdir/unique_shared.o] != 1} {
    fail "PIC Object containing unique does not contain an UNIQUE symbol"
    set fails [expr $fails + 1]
}

if { $fails == 0 } {
  pass "Checking unique PIC object"
}

# Check the unique shared library.
if {! [check_osabi tmpdir/libunique_shared.so {UNIX - GNU}]} {
    fail "Shared library containing unique does not have an OS/ABI field of GNU"
    set fails [expr $fails + 1]
}

if {[contains_unique_symbol tmpdir/libunique_shared.so] != 1} {
    fail "Shared library containing unique does not contain an UNIQUE symbol"
    set fails [expr $fails + 1]
}

if { $fails == 0 } {
  pass "Checking unique PIC object"
}

# Check the empty executable linked against unique shared library.
if {! [check_osabi tmpdir/unique_shared_prog {UNIX - System V}]} {
    fail "Executable NOT containing unique does not have an OS/ABI field of System V"
    set fails [expr $fails + 1]
}

if {[contains_unique_symbol tmpdir/unique_shared_prog] == 1} {
    fail "Executable NOT containing unique does contain an UNIQUE symbol"
    set fails [expr $fails + 1]
}

if { $fails == 0 } {
  pass "Checking shared empty executable"
}

# Clean up, unless we are being verbose, in which case we leave the files available.
if { $verbose < 1 } {
    remote_file host delete "tmpdir/unique_empty.o"
    remote_file host delete "tmpdir/unique.o"
    remote_file host delete "tmpdir/unique_shared.o"
    remote_file host delete "tmpdir/libunique_shared.so"
    remote_file host delete "tmpdir/unique_prog"
    remote_file host delete "tmpdir/unique_shared_prog"
}
