Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

# Copyright (C) 2013-2020 Free Software Foundation, Inc.

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

if [is_remote host] {
    set tempfile [remote_download host tmpdir/bintest.o]
    set copyfile copy
} else {
    set tempfile tmpdir/bintest.o
    set copyfile tmpdir/copy
}

# run_dump_test_abi ABI NAME ARGS
#
# Invoke "run_dump_test" for test NAME using ABI if supported by the
# target used, passing predefined ABI-specific arguments.  ARGS are
# as with "run_dump_test" and are appended to ABI-specific arguments,
# except for the special "noarch" keyword, which, if present, must
# appear first and is consumed causing any "-march=" option to be
# removed from ABI-specific GAS arguments, and likewise the special
# "useld" keyword, which, if present, must be next and is consumed
# causing LD arguments to be passed.
proc run_dump_test_abi { abi name args } {
    global abi_asflags
    global abi_ldflags
    global has_abi

    set args [lindex $args 0]
    set asflags $abi_asflags($abi)
    if { [lindex $args 0] == "noarch" } {
	set asflags [regsub -- {-march=[^[:blank:]]*} $asflags {}]
	set args [lreplace $args 0 0]
    }
    if { [lindex $args 0] == "useld" } {
	set ldflags $abi_ldflags($abi)
	set args [lreplace $args 0 0]
    }
    if !$has_abi($abi) {
	lappend args {notarget *-*-*}
    }

    set testargs [list [list as $asflags]]
    if { [info exists ldflags] } {
	lappend testargs [list ld $ldflags]
    }
    if { [llength $args] > 0 } {
	set testargs [concat $testargs $args]
    }

    run_dump_test $name $testargs
}

# run_dump_test_o32 NAME ARGS
#
# Invoke "run_dump_test_abi" for test NAME using the o32 ABI and
# passing ARGS.
proc run_dump_test_o32 { name args } {
    run_dump_test_abi o32 $name [lindex $args 0]
}

# run_dump_test_n32 NAME ARGS
#
# Invoke "run_dump_test_abi" for test NAME using the n32 ABI and
# passing ARGS.
proc run_dump_test_n32 { name args } {
    run_dump_test_abi n32 $name [lindex $args 0]
}

# run_dump_test_n64 NAME ARGS
#
# Invoke "run_dump_test_abi" for test NAME using the n64 ABI and
# passing ARGS.
proc run_dump_test_n64 { name args } {
    run_dump_test_abi n64 $name [lindex $args 0]
}

set has_abi(o32) [expr ![istarget *-*-openbsd*] \
		     && ![istarget mips64*el-ps2-elf*]]
set has_abi(n32) [expr [istarget *-img-elf*] \
		     || [istarget *-mti-elf*] \
		     || [istarget mips64*el-ps2-elf*] \
		     || [istarget *-sde-elf*] \
		     || [istarget *-*-freebsd*] \
		     || [istarget *-*-irix6*] \
		     || [istarget *-*-kfreebsd*-gnu] \
		     || [istarget *-*-linux*]]
set has_abi(n64) [expr [istarget *-*-freebsd*] \
		     || [istarget *-*-irix6*] \
		     || [istarget *-*-kfreebsd*-gnu] \
		     || [istarget *-*-linux*] \
		     || [istarget *-*-netbsd*] \
		     || [istarget *-*-openbsd*]]

# Set defaults.
set abi_asflags(o32) ""
set abi_asflags(n32) ""
set abi_asflags(n64) ""
set abi_asflags(eabi) ""
set abi_ldflags(o32) ""
set abi_ldflags(n32) ""
set abi_ldflags(n64) ""
set abi_ldflags(eabi) ""

# Override as needed.
if {[istarget *-*-openbsd*] } {
    set irixemul 0
} elseif { [istarget mips64*-*-linux*] } {
    if [istarget *el-*-*] {
	set abi_asflags(o32) -32
	set abi_ldflags(o32) -melf32ltsmip
	set abi_asflags(n64) "-march=from-abi -64"
	set abi_ldflags(n64) -melf64ltsmip
    } else {
	set abi_asflags(o32) -32
	set abi_ldflags(o32) -melf32btsmip
	set abi_asflags(n64) "-march=from-abi -64"
	set abi_ldflags(n64) -melf64btsmip
    }
    set irixemul 0
} elseif {[istarget *-*-linux*] } {
    if [istarget *el-*-*] {
	set abi_asflags(n32) "-march=from-abi -n32"
	set abi_ldflags(n32) -melf32ltsmipn32
	set abi_asflags(n64) "-march=from-abi -64"
	set abi_ldflags(n64) -melf64ltsmip
    } else {
	set abi_asflags(n32) "-march=from-abi -n32"
	set abi_ldflags(n32) -melf32btsmipn32
	set abi_asflags(n64) "-march=from-abi -64"
	set abi_ldflags(n64) -melf64btsmip
    }
    set irixemul 0
} elseif {[istarget *-img-elf*] \
     || [istarget *-mti-elf*] \
     || [istarget *-sde-elf*] \
     || [istarget *-*-netbsd*] \
     || [istarget *-*-linux*] \
     || [istarget *-*-sysv4*] } {
    if [istarget *el-*-*] {
	set abi_asflags(o32) -32
	set abi_asflags(n32) "-march=from-abi -n32"
	set abi_ldflags(n32) -melf32ltsmipn32
	set abi_asflags(n64) "-march=from-abi -64"
	set abi_ldflags(n64) -melf64ltsmip
    } else {
	set abi_asflags(o32) -32
	set abi_asflags(n32) "-march=from-abi -n32"
	set abi_ldflags(n32) -melf32btsmipn32
	set abi_asflags(n64) "-march=from-abi -64"
	set abi_ldflags(n64) -melf64btsmip
    }
    set irixemul 0
} elseif { [istarget mips64*-*-freebsd*] \
	   || [istarget mips64*-*-kfreebsd*-gnu] } {
    if [istarget *el-*-*] {
	set abi_asflags(o32) -32
	set abi_ldflags(o32) -melf32ltsmip_fbsd
	set abi_asflags(n64) "-march=from-abi -64"
	set abi_ldflags(n64) -melf64ltsmip_fbsd
    } else {
	set abi_asflags(o32) -32
	set abi_ldflags(o32) -melf32btsmip_fbsd
	set abi_asflags(n64) "-march=from-abi -64"
	set abi_ldflags(n64) -melf64btsmip_fbsd
    }
    set irixemul 0
} elseif { [istarget *-*-freebsd*] \
	   || [istarget *-*-kfreebsd*-gnu] } {
    if [istarget *el-*-*] {
	set abi_asflags(n32) "-march=from-abi -n32"
	set abi_ldflags(n32) -melf32ltsmipn32_fbsd
	set abi_asflags(n64) "-march=from-abi -64"
	set abi_ldflags(n64) -melf64ltsmip_fbsd
    } else {
	set abi_asflags(n32) "-march=from-abi -n32"
	set abi_ldflags(n32) -melf32btsmipn32_fbsd
	set abi_asflags(n64) "-march=from-abi -64"
	set abi_ldflags(n64) -melf64btsmip_fbsd
    }
    set irixemul 0
} elseif { [istarget *vr4100*-*-elf*] \
	   || [istarget *vr4300*-*-elf*] \
	   || [istarget *vr5000*-*-elf*] } {
    set abi_asflags(o32) -32
    set irixemul 1
} elseif { [istarget mips64*el-ps2-elf*] } {
    set abi_asflags(o32) -32
    set abi_ldflags(o32) -melf32lr5900
    set irixemul 1
} elseif { [istarget *-*-elf*] \
	   || [istarget *-*-rtems*] } {
    set abi_asflags(o32) -32
    set irixemul 1
} elseif { [istarget *-*-irix6*] } {
    set abi_asflags(o32) -32
    set abi_asflags(n64) "-march=from-abi -64"
    set abi_ldflags(o32) -melf32bsmip
    set abi_ldflags(n64) -melf64bmip
    set irixemul 1
} else {
    set abi_asflags(o32) -32
    set irixemul 1
}
set tmips [expr $irixemul ? {""} : {"t"}]

run_dump_test_o32 "mips-ase-1"
run_dump_test_o32 "mips-ase-2"
run_dump_test_o32 "mips-ase-3"
run_dump_test "mips-xpa-virt-1"
run_dump_test "mips-xpa-virt-2"
run_dump_test "mips-xpa-virt-3"
run_dump_test "mips-xpa-virt-4"
run_dump_test_o32 "mixed-mips16" noarch
run_dump_test_o32 "mixed-micromips" noarch
run_dump_test "mixed-mips16-micromips"
run_dump_test_o32 "mips16-undecoded" noarch
run_dump_test_o32 "mips16e2-undecoded" noarch
run_dump_test_o32 "mips16-pcrel"
run_dump_test_o32 "mips16-extend-noinsn"
run_dump_test_o32 "mips16-extend-insn" noarch
run_dump_test_o32 "mips16e2-extend-insn" noarch
run_dump_test_o32 "mips16-alias" noarch
run_dump_test_o32 "mips16-noalias" noarch

run_dump_test_o32 "mips-note-2"
run_dump_test_n32 "mips-note-2-n32"
run_dump_test_n64 "mips-note-2-n64"
run_dump_test_o32 "mips-note-2r"
run_dump_test_n32 "mips-note-2r-n32"
run_dump_test_n64 "mips-note-2r-n64"

run_dump_test_o32 "mips-reginfo"
run_dump_test_n32 "mips-reginfo-n32"

run_dump_test_o32 "global-local-symtab-o32${tmips}"
run_dump_test_n32 "global-local-symtab-n32${tmips}"
run_dump_test_n64 "global-local-symtab-n64"
run_dump_test_o32 "global-local-symtab-sort-o32${tmips}"
run_dump_test_n32 "global-local-symtab-sort-n32${tmips}"
run_dump_test_n64 "global-local-symtab-sort-n64${tmips}"
run_dump_test_o32 "global-local-symtab-final-o32" useld
run_dump_test_n32 "global-local-symtab-final-n32" useld
run_dump_test_n64 "global-local-symtab-final-n64" useld