#   Copyright 2003, 2007 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.

if {![istarget mips*-*-*] || ![is_elf_format]} {
    return
}

global ldemul
if {[istarget mips*-*-irix6*]} {
    set ldemul "-melf32bsmip"
} elseif {[istarget mips*el-*-linux*]} {
    set ldemul "-melf32ltsmip"
} elseif {[istarget mips*-*-linux*]} {
    set ldemul "-melf32btsmip"
} else {
    set ldemul ""
}

# Assemble jr.s using each of the argument lists in ARGLIST.  Return the
# list of object files on success and an empty list on failure.
proc assemble_for_flags {arglist} {
    global as srcdir subdir

    set objs {}
    set index 1

    foreach args $arglist {
	set obj "tmpdir/mips-flags-${index}.o"
	if {![ld_assemble $as "$args $srcdir/$subdir/jr.s" $obj]} {
	    return ""
	}
	lappend objs $obj
	incr index
    }
    return $objs
}

# Assemble a file using each set of arguments in ARGLIST.  Check that
# the objects can be linked together and that the readelf output
# includes each flag named in FLAGS.
proc good_combination {arglist flags} {
    global ld ldemul READELF

    set finalobj "tmpdir/mips-flags.o"
    set testname "MIPS compatible objects: $arglist"
    set objs [assemble_for_flags $arglist]

    if {$objs == ""} {
	unresolved $testname
    } elseif {![ld_simple_link "$ld $ldemul" $finalobj "-r $objs"]} {
	fail $testname
    } else {
	catch "exec $READELF --headers $finalobj" output
	if {![regexp "Flags: *(\[^\n\]*)" $output full gotflags]} {
	    unresolved $testname
	} else {
	    set failed 0

	    # GOTFLAGS is a list of flags separated by ", ".
	    # Convert it to a tcl list.
	    regsub -all ", " $gotflags "," gotflags
	    set gotflags [split $gotflags ","]

	    foreach flag $flags {
		if {[lsearch -exact $gotflags $flag] < 0} {
		    set failed 1
		}
	    }
	    if {$failed} {
		fail $testname
	    } else {
		pass $testname
	    }
	}
    }
}

# Like good_combination, but check that the objects can't be linked
# together successfully and that the output includes MESSAGE.
proc bad_combination {arglist message} {
    global link_output ld ldemul

    set finalobj "tmpdir/mips-flags.o"
    set testname "MIPS incompatible objects: $arglist"
    set objs [assemble_for_flags $arglist]

    if {$objs == ""} {
	unresolved $testname
    } elseif {[ld_simple_link "$ld $ldemul" $finalobj "-r $objs"]
	      || [string first $message $link_output] < 0} {
	fail $testname
    } else {
	pass $testname
    }
}

# Routines to check for various kinds of incompatibility.

proc abi_conflict {arglist firstabi secondabi} {
    bad_combination $arglist \
      "linking $secondabi module with previous $firstabi modules"
}

proc isa_conflict {arglist firstisa secondisa} {
    bad_combination $arglist \
      "linking mips:$secondisa module with previous mips:$firstisa modules"
}

proc regsize_conflict {arglist} {
    bad_combination $arglist \
      "linking 32-bit code with 64-bit code"
}

abi_conflict { "-mabi=eabi -mgp32" "-mips4 -mabi=32" } EABI32 O32
abi_conflict { "-mips4 -mabi=o64" "-mips3 -mabi=eabi" } O64 EABI64

isa_conflict { "-march=vr5500 -32" "-march=sb1 -32" } 5500 sb1
isa_conflict { "-march=vr5400 -32" "-march=4120 -32" } 5400 4120
isa_conflict { "-march=r3900 -32" "-march=r6000 -32" } 3900 6000
isa_conflict { "-march=r4010 -32" "-march=r4650 -32" } 4010 4650
isa_conflict { "-mips3 -mgp32 -32" "-mips32 -32" } 4000 isa32
isa_conflict { "-march=sb1 -mgp32 -32" "-mips32r2 -32" } sb1 isa32r2
isa_conflict { "-march=sb1 -32" "-mips64r2 -32" } sb1 isa64r2

regsize_conflict { "-mips4 -mgp64 -mabi=o64" "-mips2 -32" }
regsize_conflict { "-mips4 -mabi=o64" "-mips4 -mabi=32" }
regsize_conflict { "-mips4 -mabi=eabi -mgp32" "-mips4 -mabi=eabi -mgp64" }
regsize_conflict { "-march=vr5000 -mgp64 -mabi=o64" "-march=vr5000 -mgp32 -32" }
regsize_conflict { "-mips32 -32" "-mips64 -mabi=o64" }
regsize_conflict { "-mips32r2 -32" "-mips64 -mabi=o64" }
regsize_conflict { "-mips32r2 -32" "-mips64r2 -mabi=o64" }

good_combination { "-mips4 -mgp32 -32" "-mips2 -32" } { mips4 o32 }
good_combination { "-mips4 -mabi=32" "-mips2 -32" } { mips4 o32 }
good_combination { "-mips2 -32" "-mips4 -mabi=32" } { mips4 o32 }
good_combination { "-mips2 -mabi=eabi" "-mips4 -mabi=eabi -mgp32" } { mips4 eabi32 }
good_combination { "-mips2 -32" "-mips32 -32" "-mips32r2 -32" } { mips32r2 }
good_combination { "-mips1 -32" "-mips32r2 -32" "-mips32 -32" } { mips32r2 }

good_combination { "-march=vr4100 -32" "-march=vr4120 -32" } { 4120 }
good_combination { "-march=vr5400 -32" "-march=vr5500 -32" "-mips4 -32" } { 5500 }
good_combination { "-mips3 -32" "-mips4 -32" "-march=sb1 -32" "-mips5 -32" } { sb1 }
good_combination { "-mips1 -32" "-march=3900 -32" } { 3900 }
good_combination { "-mips3 -32" "-mips64r2 -32" "-mips64 -32" } { mips64r2 }

good_combination { "-march=vr4120 -mabi=32" "-mips3 -mabi=32" } { 4120 o32 }
good_combination { "-march=sb1 -mgp32 -32" "-march=4000 -mgp32 -32" } { sb1 o32 }
good_combination { "-mips32 -mabi=32" "-march=sb1 -mabi=32" } { sb1 o32 }
good_combination { "-mips64r2 -mabi=32" "-mips32 -mabi=32" } { mips64r2 o32 }
good_combination { "-mips5 -mabi=o64" "-mips64r2 -mabi=o64" } { mips64r2 o64 }
