1.\" Copyright (c) 2010,2014 Kai Wang
2.\" All rights reserved.
3.\"
4.\" Redistribution and use in source and binary forms, with or without
5.\" modification, are permitted provided that the following conditions
6.\" are met:
7.\" 1. Redistributions of source code must retain the above copyright
8.\"    notice, this list of conditions and the following disclaimer.
9.\" 2. Redistributions in binary form must reproduce the above copyright
10.\"    notice, this list of conditions and the following disclaimer in the
11.\"    documentation and/or other materials provided with the distribution.
12.\"
13.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23.\" SUCH DAMAGE.
24.\"
25.\" $Id: dwarf_next_cu_header.3 3182 2015-04-10 16:08:10Z emaste $
26.\"
27.Dd December 21, 2014
28.Os
29.Dt DWARF_NEXT_CU_HEADER 3
30.Sh NAME
31.Nm dwarf_next_cu_header ,
32.Nm dwarf_next_cu_header_b ,
33.Nm dwarf_next_cu_header_c
34.Nd step through compilation units in a DWARF debug context
35.Sh LIBRARY
36.Lb libdwarf
37.Sh SYNOPSIS
38.In libdwarf.h
39.Ft int
40.Fo dwarf_next_cu_header
41.Fa "Dwarf_Debug dbg"
42.Fa "Dwarf_Unsigned *cu_length"
43.Fa "Dwarf_Half *cu_version"
44.Fa "Dwarf_Off *cu_abbrev_offset"
45.Fa "Dwarf_Half *cu_pointer_size"
46.Fa "Dwarf_Unsigned *cu_next_offset"
47.Fa "Dwarf_Error *err"
48.Fc
49.Ft int
50.Fo dwarf_next_cu_header_b
51.Fa "Dwarf_Debug dbg"
52.Fa "Dwarf_Unsigned *cu_length"
53.Fa "Dwarf_Half *cu_version"
54.Fa "Dwarf_Off *cu_abbrev_offset"
55.Fa "Dwarf_Half *cu_pointer_size"
56.Fa "Dwarf_Half *cu_offset_size"
57.Fa "Dwarf_Half *cu_extension_size"
58.Fa "Dwarf_Unsigned *cu_next_offset"
59.Fa "Dwarf_Error *err"
60.Fc
61.Ft int
62.Fo dwarf_next_cu_header_c
63.Fa "Dwarf_Debug dbg"
64.Fa "Dwarf_Bool is_info"
65.Fa "Dwarf_Unsigned *cu_length"
66.Fa "Dwarf_Half *cu_version"
67.Fa "Dwarf_Off *cu_abbrev_offset"
68.Fa "Dwarf_Half *cu_pointer_size"
69.Fa "Dwarf_Half *cu_offset_size"
70.Fa "Dwarf_Half *cu_extension_size"
71.Fa "Dwarf_Sig8 *type_signature"
72.Fa "Dwarf_Unsigned *type_offset"
73.Fa "Dwarf_Unsigned *cu_next_offset"
74.Fa "Dwarf_Error *err"
75.Fc
76.Sh DESCRIPTION
77These functions are used to step through compilation or type units
78associated with a DWARF debug context, optionally returning information
79about the unit.
80.Pp
81Function
82.Fn dwarf_next_cu_header_c
83is the API recommended for new application code.
84Function
85.Fn dwarf_next_cu_header
86and
87.Fn dwarf_next_cu_header_b
88can only operate on compilation units associated with the
89.Dq \&.debug_info
90section.
91They are less general than function
92.Fn dwarf_next_cu_header_c ,
93and are deprecated for use by new application code.
94.Pp
95Argument
96.Ar dbg
97should reference a DWARF debug context allocated using
98.Xr dwarf_init 3 .
99If argument
100.Ar is_info
101is set to 1,
102the function returns information for compilation units found in the
103.Dq \&.debug_info
104section.
105If argument
106.Ar is_info
107is set to 0,
108the function returns information for type units found in the
109.Dq \&.debug_types
110sections.
111Argument
112.Ar cu_length
113should point to a location that will be set to the
114length of the compilation or type unit.
115Argument
116.Ar cu_version
117should point to a location that will be set to the
118version number for the compilation or type unit.
119Argument
120.Ar cu_abbrev_offset
121should point to a location that will be set to the
122starting offset (in the
123.Dq .debug_abbrev
124section) of the set of debugging information entry abbreviations
125associated with this compilation or type unit.
126Argument
127.Ar cu_pointer_size
128should point to a location that will be set to the
129size in bytes of an address for the machine architecture of the
130underlying object being debugged.
131Argument
132.Ar cu_offset_size
133should point to a location that will be set to the
134size in bytes for a DWARF offset in the compilation or type unit.
135Argument
136.Ar cu_extension_size
137is only needed for processing MIPS/IRIX objects that use
138a non-standard DWARF format.
139It should point to a location that will be set to 4 for normal
140objects and to 0 for non-standard ones.
141Argument
142.Ar type_signature
143and
144.Ar type_offset
145is only needed for processing type units.
146Argument
147.Ar type_signature
148should point to a location that will be set to the 64-bit unique signature
149of the type described in the type unit.
150Argument
151.Ar type_offset
152should point to a location that will be set to the offset of the debugging
153information entry that describes the type.
154Argument
155.Ar cu_next_offset
156should point to a location that will be set to the
157offset of the next compilation unit header in the
158.Dq \&.debug_info
159section,
160or the offset of the next type unit header in the
161.Dq \&.debug_types
162section.
163Argument
164.Ar err
165should point to a location that will hold an error descriptor in case
166of an error.
167.Pp
168Function
169.Fn dwarf_next_cu_header_b
170is identical to function
171.Fn dwarf_next_cu_header_c
172except that it does not provide arguments
173.Ar is_info ,
174.Ar type_signature
175and
176.Ar type_offset .
177.Pp
178Function
179.Fn dwarf_next_cu_header
180is identical to function
181.Fn dwarf_next_cu_header_b
182except that it does not provide arguments
183.Ar cu_offset_size
184and
185.Ar cu_extension_size .
186.Pp
187A value of NULL may be used for any of the arguments
188.Ar cu_length ,
189.Ar cu_version ,
190.Ar cu_abbrev_offset ,
191.Ar cu_pointer_size ,
192.Ar cu_offset_size ,
193.Ar cu_extension_size ,
194.Ar type_signature ,
195.Ar type_offset ,
196.Ar cu_next_offset
197and
198.Ar err
199if the caller is not interested in the respective value.
200.Ss Iterating Through Compilation Units in a Debug Context
201.Pp
202The first call to function
203.Fn dwarf_next_cu_header_c
204for a given debug context with argument
205.Ar is_info
206set to 1 will return information about the first
207compilation unit in the
208.Dq \&.debug_info
209section.
210Subsequent calls to the function will iterate through the remaining
211compilation units in the section.
212On stepping past the last compilation unit in the section,
213function
214.Fn dwarf_next_cu_header_c
215returns
216.Dv DW_DLV_NO_ENTRY
217and resets its internal state.
218The next call to the function will restart from the first compilation
219unit in the section.
220.Ss Iterating Through Type Units in a Debug Context
221When a DWARF debug context is allocated using
222.Xr dwarf_init 3 ,
223an internal pointer associated with the context will point to the first
224.Dq \&.debug_types
225section found in the debug object.
226The first call to function
227.Fn dwarf_next_cu_header_c
228for the debug context with argument
229.Ar is_info
230set to 0 will return information about the first
231type unit in that
232.Dq \&.debug_types
233section.
234Subsequent calls to the function will iterate through the remaining
235type units in the section.
236On stepping past the last type unit in the debug context,
237function
238.Fn dwarf_next_cu_header_c
239returns
240.Dv DW_DLV_NO_ENTRY
241and resets its internal state.
242The next call to the function will restart from the first type
243unit in the
244.Dq \&.debug_types
245section.
246.Pp
247If the debug object contains multiple
248.Dq \&.debug_types
249sections, the function
250.Fn dwarf_next_types_section
251can be called to move the internal pointer to the next
252.Dq \&.debug_types
253section.
254As a result, subsequent calls of the function
255.Fn dwarf_next_cu_header_c
256will operate on the new
257.Dq \&.debug_types
258section.
259Function
260.Fn dwarf_next_types_section
261returns
262.Dv DW_DLV_NO_ENTRY
263when there are no more
264.Dq \&.debug_types
265sections left in the debug object.
266.Sh RETURN VALUES
267On success, these functions return
268.Dv DW_DLV_OK .
269In case of an error, they return
270.Dv DW_DLV_ERROR
271and set argument
272.Ar err .
273When there are no more compilation units left to traverse, they return
274.Dv DW_DLV_NO_ENTRY .
275.Sh ERRORS
276These functions can fail with the following error:
277.Bl -tag -width ".Bq Er DW_DLE_ARGUMENT"
278.It Bq Er DW_DLE_ARGUMENT
279Argument
280.Va dbg
281was NULL.
282.El
283.Sh SEE ALSO
284.Xr dwarf 3 ,
285.Xr dwarf_get_cu_die_offset_given_cu_header_offset 3 ,
286.Xr dwarf_init 3 ,
287.Xr dwarf_next_types_section 3 ,
288.Xr dwarf_siblingof 3
289