Home | History | Annotate | Download | only in ld-mips-elf
      1 #   Copyright (C) 2003-2016 Free Software Foundation, Inc.
      2 #
      3 # This file is part of the GNU Binutils.
      4 #
      5 # This program is free software; you can redistribute it and/or modify
      6 # it under the terms of the GNU General Public License as published by
      7 # the Free Software Foundation; either version 3 of the License, or
      8 # (at your option) any later version.
      9 #
     10 # This program is distributed in the hope that it will be useful,
     11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13 # GNU General Public License for more details.
     14 #
     15 # You should have received a copy of the GNU General Public License
     16 # along with this program; if not, write to the Free Software
     17 # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     18 # MA 02110-1301, USA.
     19 
     20 if {![istarget mips*-*-*] || ![is_elf_format]} {
     21     return
     22 }
     23 
     24 global ldemul
     25 if {[istarget mips*-*-irix6*]} {
     26     set ldemul "-melf32bsmip"
     27 } elseif {[istarget mips*el-*-linux*]} {
     28     set ldemul "-melf32ltsmip"
     29 } elseif {[istarget mips*-*-linux*]} {
     30     set ldemul "-melf32btsmip"
     31 } elseif {[istarget mips*el-*-*freebsd*]} {
     32     set ldemul "-melf32ltsmip_fbsd"
     33 } elseif {[istarget mips*-*-*freebsd*]} {
     34     set ldemul "-melf32btsmip_fbsd"
     35 } else {
     36     set ldemul ""
     37 }
     38 
     39 # Assemble jr.s using each of the argument lists in ARGLIST.  Return the
     40 # list of object files on success and an empty list on failure.
     41 proc assemble_for_flags {arglist} {
     42     global as srcdir subdir
     43 
     44     set objs {}
     45     set index 1
     46 
     47     foreach args $arglist {
     48 	set obj "tmpdir/mips-flags-${index}.o"
     49 	if {![ld_assemble $as "$args $srcdir/$subdir/jr.s" $obj]} {
     50 	    return ""
     51 	}
     52 	lappend objs $obj
     53 	incr index
     54     }
     55     return $objs
     56 }
     57 
     58 # Assemble a file using each set of arguments in ARGLIST.  Check that
     59 # the objects can be linked together and that the readelf output
     60 # includes each flag named in FLAGS.
     61 proc good_combination {arglist flags} {
     62     global ld ldemul READELF
     63 
     64     set finalobj "tmpdir/mips-flags.o"
     65     set testname "MIPS compatible objects: $arglist"
     66     set objs [assemble_for_flags $arglist]
     67 
     68     if {$objs == ""} {
     69 	unresolved $testname
     70     } elseif {![ld_simple_link "$ld $ldemul" $finalobj "-r $objs"]} {
     71 	fail $testname
     72     } else {
     73 	catch "exec $READELF --headers $finalobj" output
     74 	if {![regexp "Flags: *(\[^\n\]*)" $output full gotflags]} {
     75 	    unresolved $testname
     76 	} else {
     77 	    set failed 0
     78 
     79 	    # GOTFLAGS is a list of flags separated by ", ".
     80 	    # Convert it to a tcl list.
     81 	    regsub -all ", " $gotflags "," gotflags
     82 	    set gotflags [split $gotflags ","]
     83 
     84 	    foreach flag $flags {
     85 		if {[lsearch -exact $gotflags $flag] < 0} {
     86 		    set failed 1
     87 		}
     88 	    }
     89 	    if {$failed} {
     90 		fail $testname
     91 	    } else {
     92 		pass $testname
     93 	    }
     94 	}
     95     }
     96 }
     97 
     98 # Like good_combination, but check that the objects can't be linked
     99 # together successfully and that the output includes MESSAGE.
    100 proc bad_combination {arglist message} {
    101     global link_output ld ldemul
    102 
    103     set finalobj "tmpdir/mips-flags.o"
    104     set testname "MIPS incompatible objects: $arglist"
    105     set objs [assemble_for_flags $arglist]
    106 
    107     if {$objs == ""} {
    108 	unresolved $testname
    109     } elseif {[ld_simple_link "$ld $ldemul" $finalobj "-r $objs"]
    110 	      || [string first $message $link_output] < 0} {
    111 	fail $testname
    112     } else {
    113 	pass $testname
    114     }
    115 }
    116 
    117 # Routines to check for various kinds of incompatibility.
    118 
    119 proc abi_conflict {arglist firstabi secondabi} {
    120     bad_combination $arglist \
    121       "linking $secondabi module with previous $firstabi modules"
    122 }
    123 
    124 proc isa_conflict {arglist firstisa secondisa} {
    125     bad_combination $arglist \
    126       "linking mips:$secondisa module with previous mips:$firstisa modules"
    127 }
    128 
    129 proc regsize_conflict {arglist} {
    130     bad_combination $arglist \
    131       "linking 32-bit code with 64-bit code"
    132 }
    133 
    134 abi_conflict { "-mabi=eabi -mgp32" "-mips4 -mabi=32" } EABI32 O32
    135 abi_conflict { "-mips4 -mabi=o64"  "-mips3 -mabi=eabi" } O64 EABI64
    136 
    137 isa_conflict { "-march=vr5500 -32"     "-march=sb1 -32" } 5500 sb1
    138 isa_conflict { "-march=vr5400 -32"     "-march=4120 -32" } 5400 4120
    139 isa_conflict { "-march=r3900 -32"      "-march=r6000 -32" } 3900 6000
    140 isa_conflict { "-march=r4010 -32"      "-march=r4650 -32" } 4010 4650
    141 isa_conflict { "-mips3 -mgp32 -32"     "-mips32 -32" } 4000 isa32
    142 isa_conflict { "-march=sb1 -mgp32 -32" "-mips32r2 -32" } sb1 isa32r2
    143 isa_conflict { "-march=sb1 -32"        "-mips64r2 -32" } sb1 isa64r2
    144 
    145 isa_conflict { "-march=vr4100 -32"     "-march=r10000 -32" } 4100 8000
    146 isa_conflict { "-march=r5900 -32"      "-march=vr4111 -32" } 5900 4111
    147 isa_conflict { "-march=loongson2e -32" "-march=loongson2f -32" } loongson_2e loongson_2f
    148 isa_conflict { "-march=loongson3a -32" "-march=loongson2f -32" } loongson_3a loongson_2f
    149 
    150 regsize_conflict { "-mips4 -mgp64 -mabi=o64"         "-mips2 -32" }
    151 regsize_conflict { "-mips4 -mabi=o64"                "-mips4 -mabi=32" }
    152 regsize_conflict { "-mips4 -mabi=eabi -mgp32"        "-mips4 -mabi=eabi -mgp64" }
    153 regsize_conflict { "-march=vr5000 -mgp64 -mabi=o64"  "-march=vr5000 -mgp32 -32" }
    154 regsize_conflict { "-mips32 -32"                     "-mips64 -mabi=o64" }
    155 regsize_conflict { "-mips32r2 -32"                   "-mips64 -mabi=o64" }
    156 regsize_conflict { "-mips32r2 -32"                   "-mips64r2 -mabi=o64" }
    157 
    158 good_combination { "-mips4 -mgp32 -32"  "-mips2 -32" } { mips4 o32 }
    159 good_combination { "-mips4 -mabi=32"    "-mips2 -32" } { mips4 o32 }
    160 good_combination { "-mips2 -32"         "-mips4 -mabi=32" } { mips4 o32 }
    161 good_combination { "-mips2 -mabi=eabi"  "-mips4 -mabi=eabi -mgp32" } { mips4 eabi32 }
    162 good_combination { "-mips2 -32"         "-mips32 -32" "-mips32r2 -32" } { mips32r2 }
    163 good_combination { "-mips1 -32"         "-mips32r2 -32" "-mips32 -32" } { mips32r2 }
    164 
    165 good_combination { "-march=vr4100 -32"  "-march=vr4120 -32" } { 4120 }
    166 good_combination { "-march=vr5400 -32"  "-march=vr5500 -32" "-mips4 -32" } { 5500 }
    167 good_combination { "-mips3 -32"         "-mips4 -32"        "-march=sb1 -32"  "-mips5 -32" } { sb1 }
    168 good_combination { "-mips1 -32"         "-march=3900 -32" } { 3900 }
    169 good_combination { "-mips3 -32"         "-mips64r2 -32" "   -mips64 -32" } { mips64r2 }
    170 
    171 good_combination { "-march=vr4120 -mabi=32"  "-mips3 -mabi=32" } { 4120 o32 }
    172 good_combination { "-march=sb1 -mgp32 -32"   "-march=4000 -mgp32 -32" } { sb1 o32 }
    173 good_combination { "-mips32 -mabi=32"        "-march=sb1 -mabi=32" } { sb1 o32 }
    174 good_combination { "-mips64r2 -mabi=32"      "-mips32 -mabi=32" } { mips64r2 o32 }
    175 good_combination { "-mips5 -mabi=o64"        "-mips64r2 -mabi=o64" } { mips64r2 o64 }
    176