# Copyright (C) 2012-2014 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.  

# Relocation test.

proc ld_test { objects ldflags dest test } {
    set ld_output [target_link $objects $dest $ldflags]
    if [string match "" $ld_output] then { pass $test } else { fail $test }
}

proc objdump_test { exec flags dest test } {
    set objcopy [find_binutils_prog objdump]
    verbose -log "$objcopy $flags $exec > $dest"
    catch "exec $objcopy $flags $exec > $dest" objdump_output
    if [string match "" $objdump_output] then { pass $test } else { fail $test }
}

proc regexp_test { file1 file2 test } {
    if [regexp_diff $file1 $file2] then { fail $test } else { pass $test }
}


global srcdir subdir
if [istarget microblaze*-*-*] {
    gas_test "reloc_strongsym.s" {-o reloc_strongsym.o} {} {assembling reloc_strongsym}
    gas_test "reloc_weaksym.s" {-o reloc_weaksym.o} {} {assembling reloc_weaksym}
    ld_test {reloc_strongsym.o reloc_weaksym.o} {-e 0 -section-start .text=0x10000054 -section-start .testsection=0x4} {reloc_sym.x} {linking reloc_sym.x}
    objdump_test {reloc_sym.x} {-d --section=.text --section=.testsection} {reloc_sym.dump} {disassembling reloc_sym.x}
    regexp_test {reloc_sym.dump} "$srcdir/$subdir/reloc_sym.d" {matching disassembly}
}
