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