1*4d9fdb46SRobert Mustacchi /*
2*4d9fdb46SRobert Mustacchi Copyright (c) 2020, David Anderson
3*4d9fdb46SRobert Mustacchi All rights reserved.
4*4d9fdb46SRobert Mustacchi 
5*4d9fdb46SRobert Mustacchi Redistribution and use in source and binary forms, with
6*4d9fdb46SRobert Mustacchi or without modification, are permitted provided that the
7*4d9fdb46SRobert Mustacchi following conditions are met:
8*4d9fdb46SRobert Mustacchi 
9*4d9fdb46SRobert Mustacchi     Redistributions of source code must retain the above
10*4d9fdb46SRobert Mustacchi     copyright notice, this list of conditions and the following
11*4d9fdb46SRobert Mustacchi     disclaimer.
12*4d9fdb46SRobert Mustacchi 
13*4d9fdb46SRobert Mustacchi     Redistributions in binary form must reproduce the above
14*4d9fdb46SRobert Mustacchi     copyright notice, this list of conditions and the following
15*4d9fdb46SRobert Mustacchi     disclaimer in the documentation and/or other materials
16*4d9fdb46SRobert Mustacchi     provided with the distribution.
17*4d9fdb46SRobert Mustacchi 
18*4d9fdb46SRobert Mustacchi THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
19*4d9fdb46SRobert Mustacchi CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
20*4d9fdb46SRobert Mustacchi INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21*4d9fdb46SRobert Mustacchi OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*4d9fdb46SRobert Mustacchi ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23*4d9fdb46SRobert Mustacchi CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24*4d9fdb46SRobert Mustacchi SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25*4d9fdb46SRobert Mustacchi NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26*4d9fdb46SRobert Mustacchi LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27*4d9fdb46SRobert Mustacchi HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28*4d9fdb46SRobert Mustacchi CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29*4d9fdb46SRobert Mustacchi OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30*4d9fdb46SRobert Mustacchi EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*4d9fdb46SRobert Mustacchi */
32*4d9fdb46SRobert Mustacchi #ifndef DWARF_RNGLISTS_H
33*4d9fdb46SRobert Mustacchi #define DWARF_RNGLISTS_H
34*4d9fdb46SRobert Mustacchi #ifdef __cplusplus
35*4d9fdb46SRobert Mustacchi extern "C" {
36*4d9fdb46SRobert Mustacchi #endif /* __cplusplus */
37*4d9fdb46SRobert Mustacchi 
38*4d9fdb46SRobert Mustacchi /*  Rangelists header for a CU. The
39*4d9fdb46SRobert Mustacchi     type is never visible to libdwarf callers  */
40*4d9fdb46SRobert Mustacchi struct Dwarf_Rnglists_Context_s {
41*4d9fdb46SRobert Mustacchi     Dwarf_Debug    rc_dbg;
42*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned rc_index; /* An index  assigned by
43*4d9fdb46SRobert Mustacchi         libdwarf to each rnglists context. Starting
44*4d9fdb46SRobert Mustacchi         with zero at the zero offset in .debug_rnglists. */
45*4d9fdb46SRobert Mustacchi 
46*4d9fdb46SRobert Mustacchi     /* Offset of the .debug_rnglists header involved. */
47*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  rc_header_offset;
48*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  rc_length;
49*4d9fdb46SRobert Mustacchi 
50*4d9fdb46SRobert Mustacchi     /* Many places in in libdwarf this is called length_size. */
51*4d9fdb46SRobert Mustacchi     Dwarf_Small     rc_offset_size;
52*4d9fdb46SRobert Mustacchi 
53*4d9fdb46SRobert Mustacchi     /*  rc_extension_size is zero unless this is standard
54*4d9fdb46SRobert Mustacchi         DWARF3 and later 64bit dwarf using the extension mechanism.
55*4d9fdb46SRobert Mustacchi         64bit DWARF3 and later: rc_extension_size is 4.
56*4d9fdb46SRobert Mustacchi         64bit DWARF2 MIPS/IRIX: rc_extension_size is zero.
57*4d9fdb46SRobert Mustacchi         32bit DWARF:            rc_extension_size is zero.  */
58*4d9fdb46SRobert Mustacchi     Dwarf_Small     rc_extension_size;
59*4d9fdb46SRobert Mustacchi 
60*4d9fdb46SRobert Mustacchi     unsigned        rc_version; /* 5 */
61*4d9fdb46SRobert Mustacchi     Dwarf_Small     rc_address_size;
62*4d9fdb46SRobert Mustacchi     Dwarf_Small     rc_segment_selector_size;
63*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  rc_offset_entry_count;
64*4d9fdb46SRobert Mustacchi 
65*4d9fdb46SRobert Mustacchi     /* offset in the section of the offset entries */
66*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  rc_offsets_off_in_sect;
67*4d9fdb46SRobert Mustacchi 
68*4d9fdb46SRobert Mustacchi     /* Do not free. Points into section memory */
69*4d9fdb46SRobert Mustacchi     Dwarf_Small   * rc_offsets_array;
70*4d9fdb46SRobert Mustacchi 
71*4d9fdb46SRobert Mustacchi     /*  Offset in the .debug_rnglists section of the
72*4d9fdb46SRobert Mustacchi         first rangelist in the set of rangelists for the
73*4d9fdb46SRobert Mustacchi         CU. */
74*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  rc_first_rnglist_offset;
75*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  rc_past_last_rnglist_offset;
76*4d9fdb46SRobert Mustacchi 
77*4d9fdb46SRobert Mustacchi     /* pointer to 1st byte of rangelist header*/
78*4d9fdb46SRobert Mustacchi     Dwarf_Small *  rc_rnglists_header;
79*4d9fdb46SRobert Mustacchi     /*  pointer to first byte of the rnglist data
80*4d9fdb46SRobert Mustacchi         for rnglist involved. Do not free. */
81*4d9fdb46SRobert Mustacchi     Dwarf_Small    *rc_startaddr;
82*4d9fdb46SRobert Mustacchi     /*  pointer one past end of the rnglist data. */
83*4d9fdb46SRobert Mustacchi     Dwarf_Small    *rc_endaddr;
84*4d9fdb46SRobert Mustacchi };
85*4d9fdb46SRobert Mustacchi 
86*4d9fdb46SRobert Mustacchi struct Dwarf_Rnglists_Entry_s {
87*4d9fdb46SRobert Mustacchi     unsigned       rle_entrylen;
88*4d9fdb46SRobert Mustacchi     unsigned       rle_code;
89*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned rle_raw1;
90*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned rle_raw2;
91*4d9fdb46SRobert Mustacchi     /*  Cooked means the raw values from the .debug_rnglists
92*4d9fdb46SRobert Mustacchi         section translated to DIE-specific addresses. */
93*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned rle_cooked1;
94*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned rle_cooked2;
95*4d9fdb46SRobert Mustacchi     Dwarf_Rnglists_Entry rle_next;
96*4d9fdb46SRobert Mustacchi };
97*4d9fdb46SRobert Mustacchi 
98*4d9fdb46SRobert Mustacchi 
99*4d9fdb46SRobert Mustacchi struct Dwarf_Rnglists_Head_s {
100*4d9fdb46SRobert Mustacchi     Dwarf_Rnglists_Entry *rh_rnglists;
101*4d9fdb46SRobert Mustacchi     /*  rh_last and rh_first used during build-up.
102*4d9fdb46SRobert Mustacchi         Zero when array rh_rnglists built. */
103*4d9fdb46SRobert Mustacchi     Dwarf_Rnglists_Entry  rh_first;
104*4d9fdb46SRobert Mustacchi     Dwarf_Rnglists_Entry  rh_last;
105*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned        rh_count;
106*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned        rh_bytes_total;
107*4d9fdb46SRobert Mustacchi 
108*4d9fdb46SRobert Mustacchi     /*  A global Rnglists Context, */
109*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context      rh_context;
110*4d9fdb46SRobert Mustacchi     Dwarf_Debug           rh_dbg;
111*4d9fdb46SRobert Mustacchi     Dwarf_Rnglists_Context rh_localcontext;
112*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned         rh_version;
113*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned         rh_index;
114*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned         rh_offset_size;
115*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned         rh_address_size;
116*4d9fdb46SRobert Mustacchi     unsigned               rh_segment_selector_size;
117*4d9fdb46SRobert Mustacchi 
118*4d9fdb46SRobert Mustacchi     /*  DW_AT_rnglists_base */
119*4d9fdb46SRobert Mustacchi     Dwarf_Bool      rh_at_rnglists_base_present;
120*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  rh_at_rnglists_base;
121*4d9fdb46SRobert Mustacchi 
122*4d9fdb46SRobert Mustacchi     /* DW_AT_low_pc of CU or zero if none. */
123*4d9fdb46SRobert Mustacchi     Dwarf_Bool      rh_cu_base_address_present;
124*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  rh_cu_base_address;
125*4d9fdb46SRobert Mustacchi 
126*4d9fdb46SRobert Mustacchi     /*  DW_AT_addr_base, so we can use .debug_addr
127*4d9fdb46SRobert Mustacchi         if such is needed. */
128*4d9fdb46SRobert Mustacchi     Dwarf_Bool      rh_cu_addr_base_present;
129*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  rh_cu_addr_base;
130*4d9fdb46SRobert Mustacchi     Dwarf_Small    * rh_rlepointer;
131*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   rh_rlearea_offset;
132*4d9fdb46SRobert Mustacchi     Dwarf_Small    * rh_end_data_area;
133*4d9fdb46SRobert Mustacchi };
134*4d9fdb46SRobert Mustacchi 
135*4d9fdb46SRobert Mustacchi void _dwarf_rnglists_head_destructor(void *m);
136*4d9fdb46SRobert Mustacchi 
137*4d9fdb46SRobert Mustacchi #ifdef __cplusplus
138*4d9fdb46SRobert Mustacchi }
139*4d9fdb46SRobert Mustacchi #endif /* __cplusplus */
140*4d9fdb46SRobert Mustacchi #endif /* DWARF_RNGLISTS_H */
141