# Expect script for DWARF relocation test.
#   Copyright (C) 2008-2014 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.
#

#
# Written by Jan Kratochvil (jan.kratochvil@redhat.com)
#
# Test PR ld/3290 Comment 8+9.  DW_FORM_ref_addr used in dwarfreloc2.s was left
# unrelocated as its target symbol from dwarfreloc1.s became LOCAL due to its
# `ld -r'.
#
#  <1><57>: Abbrev Number: 2 (DW_TAG_variable)
#     <58>   DW_AT_name        : i2
#  ...
#     <5d>   DW_AT_type        : <0x32>
# vs.
#     <5d>   DW_AT_type        : <0x0>

# Only the testcase .s files are arch-dependent, the relocations are cross-arch.
if { !([istarget "x86_64-*-elf*"]
       || [istarget "x86_64-*-nacl*"]
       || [istarget "x86_64-*-linux*"]) } {
    return
}

set build_tests_ld {
  {"Build dwarfreloc1x.o"
   "-r" "" ""
   {dwarfreloc1.s} {} "dwarfreloc1x.o"}
  {"Build dwarfreloc2.o"
   "-r" "" ""
   {dwarfreloc2.s} {} "dwarfreloc2x.o"}
}

run_ld_link_tests $build_tests_ld

set testname "Link dwarfreloc1x.o and dwarfreloc2x.o to dwarfreloc.o"
if [ld_simple_link $ld "tmpdir/dwarfreloc.o" "-r tmpdir/dwarfreloc1x.o tmpdir/dwarfreloc2x.o"] {
    pass $testname
} else {
    fail $testname
}

# The code is copied from `ld-lib.exp'.  We cannot use the functions there as
# they expect source (.s or .c) files while we to check a `ld -r' output (.o).

set testname "Check dwarfreloc.o readelf"
set dumpfile "dwarfreloc.rd"
set cmd "$READELF --debug-dump=info tmpdir/dwarfreloc.o"
set status [remote_exec host [concat sh -c [list "$cmd >dump.out 2>ld.stderr"]] "" "/dev/null"]
send_log "$cmd\n"
remote_upload host "ld.stderr"
set comp_output [prune_warnings [file_contents "ld.stderr"]]
remote_file host delete "ld.stderr"
remote_file build delete "ld.stderr"

if ![string match "" $comp_output] then {
    send_log "$comp_output\n"
    fail $testname
} else {
    remote_upload host "dump.out"
    if { [regexp_diff "dump.out" "$srcdir/$subdir/$dumpfile"] } then {
	verbose "output is [file_contents "dump.out"]" 2
	fail $testname
    } else {
	pass $testname
    }
    remote_file build delete "dump.out"
    remote_file host delete "dump.out"
}
