1da0c48c4Sopenharmony_ci#! /bin/sh
2da0c48c4Sopenharmony_ci# Copyright (C) 2013 Red Hat, Inc.
3da0c48c4Sopenharmony_ci# This file is part of elfutils.
4da0c48c4Sopenharmony_ci#
5da0c48c4Sopenharmony_ci# This file is free software; you can redistribute it and/or modify
6da0c48c4Sopenharmony_ci# it under the terms of the GNU General Public License as published by
7da0c48c4Sopenharmony_ci# the Free Software Foundation; either version 3 of the License, or
8da0c48c4Sopenharmony_ci# (at your option) any later version.
9da0c48c4Sopenharmony_ci#
10da0c48c4Sopenharmony_ci# elfutils is distributed in the hope that it will be useful, but
11da0c48c4Sopenharmony_ci# WITHOUT ANY WARRANTY; without even the implied warranty of
12da0c48c4Sopenharmony_ci# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13da0c48c4Sopenharmony_ci# GNU General Public License for more details.
14da0c48c4Sopenharmony_ci#
15da0c48c4Sopenharmony_ci# You should have received a copy of the GNU General Public License
16da0c48c4Sopenharmony_ci# along with this program.  If not, see <http://www.gnu.org/licenses/>.
17da0c48c4Sopenharmony_ci
18da0c48c4Sopenharmony_ci. $srcdir/test-subr.sh
19da0c48c4Sopenharmony_ci
20da0c48c4Sopenharmony_ci# Tests readelf --debug-dump=aranges and --debug-dump=decodedaranges
21da0c48c4Sopenharmony_ci#
22da0c48c4Sopenharmony_ci# - foobarbaz.h
23da0c48c4Sopenharmony_ci#
24da0c48c4Sopenharmony_ci# int bar ();
25da0c48c4Sopenharmony_ci# int baz (int i);
26da0c48c4Sopenharmony_ci#
27da0c48c4Sopenharmony_ci# - bar.c
28da0c48c4Sopenharmony_ci#
29da0c48c4Sopenharmony_ci# #include "foobarbaz.h"
30da0c48c4Sopenharmony_ci#
31da0c48c4Sopenharmony_ci# static int bi;
32da0c48c4Sopenharmony_ci#
33da0c48c4Sopenharmony_ci# static int
34da0c48c4Sopenharmony_ci# barbaz (int i)
35da0c48c4Sopenharmony_ci# {
36da0c48c4Sopenharmony_ci#   return i * 2 - 1;
37da0c48c4Sopenharmony_ci# }
38da0c48c4Sopenharmony_ci#
39da0c48c4Sopenharmony_ci# __attribute__ ((constructor)) void
40da0c48c4Sopenharmony_ci# nobar ()
41da0c48c4Sopenharmony_ci# {
42da0c48c4Sopenharmony_ci#   bi = 1;
43da0c48c4Sopenharmony_ci# }
44da0c48c4Sopenharmony_ci#
45da0c48c4Sopenharmony_ci# int
46da0c48c4Sopenharmony_ci# bar ()
47da0c48c4Sopenharmony_ci# {
48da0c48c4Sopenharmony_ci#   bi++;
49da0c48c4Sopenharmony_ci#   return barbaz (bi);
50da0c48c4Sopenharmony_ci# }
51da0c48c4Sopenharmony_ci#
52da0c48c4Sopenharmony_ci# - foo.c
53da0c48c4Sopenharmony_ci#
54da0c48c4Sopenharmony_ci# include "foobarbaz.h"
55da0c48c4Sopenharmony_ci#
56da0c48c4Sopenharmony_ci# static int fi = 0;
57da0c48c4Sopenharmony_ci#
58da0c48c4Sopenharmony_ci# static int
59da0c48c4Sopenharmony_ci# foo (int i, int j)
60da0c48c4Sopenharmony_ci# {
61da0c48c4Sopenharmony_ci#   if (i > j)
62da0c48c4Sopenharmony_ci#     return i - j + fi;
63da0c48c4Sopenharmony_ci#   else
64da0c48c4Sopenharmony_ci#     return (2 * j) - i + fi;
65da0c48c4Sopenharmony_ci# }
66da0c48c4Sopenharmony_ci#
67da0c48c4Sopenharmony_ci# int
68da0c48c4Sopenharmony_ci# main (int argc, char **argv)
69da0c48c4Sopenharmony_ci# {
70da0c48c4Sopenharmony_ci#   int a = bar ();
71da0c48c4Sopenharmony_ci#   int b = baz (a + argc);
72da0c48c4Sopenharmony_ci#   int r = foo (a, b) - 1;
73da0c48c4Sopenharmony_ci#
74da0c48c4Sopenharmony_ci#   return r - 48;
75da0c48c4Sopenharmony_ci# }
76da0c48c4Sopenharmony_ci#
77da0c48c4Sopenharmony_ci# - baz.c
78da0c48c4Sopenharmony_ci# include "foobarbaz.h"
79da0c48c4Sopenharmony_ci#
80da0c48c4Sopenharmony_ci# static int bj;
81da0c48c4Sopenharmony_ci#
82da0c48c4Sopenharmony_ci# static int
83da0c48c4Sopenharmony_ci# bazbaz (int j)
84da0c48c4Sopenharmony_ci# {
85da0c48c4Sopenharmony_ci#   return bj * j - bar ();
86da0c48c4Sopenharmony_ci# }
87da0c48c4Sopenharmony_ci#
88da0c48c4Sopenharmony_ci# __attribute__ ((constructor)) void
89da0c48c4Sopenharmony_ci# nobaz ()
90da0c48c4Sopenharmony_ci# {
91da0c48c4Sopenharmony_ci#   bj = 1;
92da0c48c4Sopenharmony_ci# }
93da0c48c4Sopenharmony_ci#
94da0c48c4Sopenharmony_ci# int
95da0c48c4Sopenharmony_ci# baz (int i)
96da0c48c4Sopenharmony_ci# {
97da0c48c4Sopenharmony_ci#   if (i < 0)
98da0c48c4Sopenharmony_ci#     return bazbaz (i);
99da0c48c4Sopenharmony_ci#   else
100da0c48c4Sopenharmony_ci#     {
101da0c48c4Sopenharmony_ci#       while (i-- > 0)
102da0c48c4Sopenharmony_ci#         bj += bar ();
103da0c48c4Sopenharmony_ci#     }
104da0c48c4Sopenharmony_ci#   return bazbaz (i);
105da0c48c4Sopenharmony_ci# }
106da0c48c4Sopenharmony_ci#
107da0c48c4Sopenharmony_ci# gcc -g -O2 -m32 -c baz.c
108da0c48c4Sopenharmony_ci# gcc -g -O2 -m32 -c bar.c
109da0c48c4Sopenharmony_ci# gcc -g -O2 -m32 -c foo.c
110da0c48c4Sopenharmony_ci# gcc -g -O2 -m32 -o testfilefoobarbaz foo.o bar.o baz.o
111da0c48c4Sopenharmony_ci
112da0c48c4Sopenharmony_citestfiles testfilefoobarbaz
113da0c48c4Sopenharmony_ci
114da0c48c4Sopenharmony_citestrun_compare ${abs_top_builddir}/src/readelf --debug-dump=aranges testfilefoobarbaz <<EOF
115da0c48c4Sopenharmony_ci
116da0c48c4Sopenharmony_ciDWARF section [27] '.debug_aranges' at offset 0x1044:
117da0c48c4Sopenharmony_ci
118da0c48c4Sopenharmony_ciTable at offset 0:
119da0c48c4Sopenharmony_ci
120da0c48c4Sopenharmony_ci Length:            28
121da0c48c4Sopenharmony_ci DWARF version:      2
122da0c48c4Sopenharmony_ci CU offset:          0
123da0c48c4Sopenharmony_ci Address size:       4
124da0c48c4Sopenharmony_ci Segment size:       0
125da0c48c4Sopenharmony_ci
126da0c48c4Sopenharmony_ci   0x080482f0 <main>..0x08048323 <main+0x33>
127da0c48c4Sopenharmony_ci
128da0c48c4Sopenharmony_ciTable at offset 32:
129da0c48c4Sopenharmony_ci
130da0c48c4Sopenharmony_ci Length:            36
131da0c48c4Sopenharmony_ci DWARF version:      2
132da0c48c4Sopenharmony_ci CU offset:        136
133da0c48c4Sopenharmony_ci Address size:       4
134da0c48c4Sopenharmony_ci Segment size:       0
135da0c48c4Sopenharmony_ci
136da0c48c4Sopenharmony_ci   0x08048440 <bar>..0x08048451 <bar+0x11>
137da0c48c4Sopenharmony_ci   0x08048330 <nobar>..0x0804833a <nobar+0xa>
138da0c48c4Sopenharmony_ci
139da0c48c4Sopenharmony_ciTable at offset 72:
140da0c48c4Sopenharmony_ci
141da0c48c4Sopenharmony_ci Length:            36
142da0c48c4Sopenharmony_ci DWARF version:      2
143da0c48c4Sopenharmony_ci CU offset:        1d1
144da0c48c4Sopenharmony_ci Address size:       4
145da0c48c4Sopenharmony_ci Segment size:       0
146da0c48c4Sopenharmony_ci
147da0c48c4Sopenharmony_ci   0x08048460 <baz>..0x080484bb <baz+0x5b>
148da0c48c4Sopenharmony_ci   0x08048340 <nobaz>..0x0804834a <nobaz+0xa>
149da0c48c4Sopenharmony_ciEOF
150da0c48c4Sopenharmony_ci
151da0c48c4Sopenharmony_citestrun_compare ${abs_top_builddir}/src/readelf --debug-dump=decodedaranges testfilefoobarbaz <<\EOF
152da0c48c4Sopenharmony_ci
153da0c48c4Sopenharmony_ciDWARF section [27] '.debug_aranges' at offset 0x1044 contains 5 entries:
154da0c48c4Sopenharmony_ci [0] start: 0x080482f0, length:    52, CU DIE offset:     11
155da0c48c4Sopenharmony_ci [1] start: 0x08048330, length:    11, CU DIE offset:    321
156da0c48c4Sopenharmony_ci [2] start: 0x08048340, length:    11, CU DIE offset:    476
157da0c48c4Sopenharmony_ci [3] start: 0x08048440, length:    18, CU DIE offset:    321
158da0c48c4Sopenharmony_ci [4] start: 0x08048460, length:    92, CU DIE offset:    476
159da0c48c4Sopenharmony_ciEOF
160da0c48c4Sopenharmony_ci
161da0c48c4Sopenharmony_ciexit 0
162