#! /bin/sh
# Copyright (C) 2018 Red Hat, Inc.
# This file is part of elfutils.
#
# This file 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.
#
# elfutils 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, see <http://www.gnu.org/licenses/>.

. $srcdir/test-subr.sh

# Make sure --debug-dump=info implies .debug_types, even when implicit.
# See run-typeiter.sh
testfiles testfile-debug-types

testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=str --debug-dump=info testfile-debug-types<<\EOF

DWARF section [28] '.debug_info' at offset 0x1089:
 [Offset]
 Compilation unit at offset 0:
 Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4
 [     b]  compile_unit         abbrev: 8
           producer             (strp) "GNU C++ 4.8.2 20140120 (Red Hat 4.8.2-16) -mtune=generic -march=x86-64 -g -fdebug-types-section"
           language             (data1) C_plus_plus (4)
           comp_dir             (strp) "/home/mark/src/elfutils/tests"
           low_pc               (addr) 0x00000000004005b0 <main>
           high_pc              (data8) 11 (0x00000000004005bb)
           stmt_list            (sec_offset) 0
 [    29]    subprogram           abbrev: 9
             external             (flag_present) yes
             name                 (strp) "main"
             decl_file            (data1) <stdin> (1)
             decl_line            (data1) 1
             type                 (ref4) [    46]
             low_pc               (addr) 0x00000000004005b0 <main>
             high_pc              (data8) 11 (0x00000000004005bb)
             frame_base           (exprloc) 
              [ 0] call_frame_cfa
             GNU_all_call_sites   (flag_present) yes
 [    46]    base_type            abbrev: 10
             byte_size            (data1) 4
             encoding             (data1) signed (5)
             name                 (string) "int"
 [    4d]    variable             abbrev: 11
             name                 (string) "a"
             decl_file            (data1) <stdin> (1)
             decl_line            (data1) 1
             type                 (ref_sig8) {18763953736e2de0}
             external             (flag_present) yes
             location             (exprloc) 
              [ 0] addr 0x601030 <a>
 [    64]    variable             abbrev: 11
             name                 (string) "b"
             decl_file            (data1) <stdin> (1)
             decl_line            (data1) 1
             type                 (ref_sig8) {7cf9bbf793fcaf13}
             external             (flag_present) yes
             location             (exprloc) 
              [ 0] addr 0x601031 <b>

DWARF section [31] '.debug_str' at offset 0x11dd:
 Offset  String
 [   0]  "/home/mark/src/elfutils/tests"
 [  1e]  "GNU C++ 4.8.2 20140120 (Red Hat 4.8.2-16) -mtune=generic -march=x86-64 -g -fdebug-types-section"
 [  7e]  "main"

DWARF section [32] '.debug_types' at offset 0x1260:
 [Offset]
 Type unit at offset 0:
 Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4
 Type signature: 0x7cf9bbf793fcaf13, Type offset: 0x38 [38]
 [    17]  type_unit            abbrev: 1
           language             (data1) C_plus_plus (4)
           GNU_odr_signature    (data8) 4783233826607187165
           stmt_list            (sec_offset) 0
 [    25]    structure_type       abbrev: 2
             name                 (string) "A"
             signature            (ref_sig8) {18763953736e2de0}
             declaration          (flag_present) yes
             sibling              (ref4) [    38]
 [    34]      structure_type       abbrev: 3
               name                 (string) "B"
               declaration          (flag_present) yes
 [    38]    structure_type       abbrev: 4
             name                 (string) "B"
             byte_size            (data1) 1
             decl_file            (data1) <stdin> (1)
             decl_line            (data1) 1
             specification        (ref4) [    34]
 Type unit at offset 67:
 Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4
 Type signature: 0x18763953736e2de0, Type offset: 0x25 [25]
 [    5a]  type_unit            abbrev: 1
           language             (data1) C_plus_plus (4)
           GNU_odr_signature    (data8) 16005269134005989797
           stmt_list            (sec_offset) 0
 [    68]    structure_type       abbrev: 5
             name                 (string) "A"
             byte_size            (data1) 1
             decl_file            (data1) <stdin> (1)
             decl_line            (data1) 1
 [    6e]      structure_type       abbrev: 6
               name                 (string) "B"
               declaration          (flag_present) yes
               signature            (ref_sig8) {7cf9bbf793fcaf13}
 [    79]      member               abbrev: 7
               name                 (string) "x"
               decl_file            (data1) <stdin> (1)
               decl_line            (data1) 1
               type                 (ref4) [    6e]
               data_member_location (data1) 0
EOF

exit 0
