2 This file is part of Kvasir, a Valgrind skin that implements the
3 C language front-end for the Daikon Invariant Detection System
5 Copyright (C) 2004 Philip Guo, MIT CSAIL Program Analysis Group
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 2 of the
10 License, or (at your option) any later version.
14 Everything here attempts to extract the information directly
15 from the DWARF2 debugging information embedded within an ELF
16 executable, piggy-backing off of readelf.c code. These data
17 structures mimic the types of DWARF2 entries that we are interested
24 // Type information data structures
26 // Contains one entry that holds data for one of many possible types
27 // depending on tag_name
30 unsigned long ID; // Unique ID for each entry
31 unsigned long tag_name; // DW_TAG_____ for the type of this entry
32 void* entry_ptr; // Cast this pointer depending on value of tag_name
36 // Entries for individual types
40 unsigned long byte_size; // DW_AT_byte_size
41 unsigned long encoding;
43 // char is_bit_field; // 1 = bit field
44 // Only relevant for bit fields
45 unsigned long bit_size;
46 unsigned long bit_offset;
47 } base_type; // DW_TAG_base_type
49 // COP-OUT!!! Treat array_type JUST LIKE pointer_type for now
50 // so we don't keep track of the array size. We only care about the
51 // FIRST ELEMENT of the array since we just treat all pointers as
53 // I will add full support for arrays later!!! //PG
54 // modifier_type = {const_type, pointer_type, array_type, volatile_type}
57 unsigned long target_ID; // ID of the entry that contains the type that this modifies
58 dwarf_entry* target_ptr; // Type that this entry modifies (DW_AT_type)
60 dwarf_entry** array_ptr;
65 unsigned long target_ID; // ID of the entry that contains the type that this modifies
66 unsigned long upperbound;
67 dwarf_entry* target_ptr; // Type that this entry modifies (DW_AT_type)
72 unsigned long target_ID; // ID of the entry that contains the type that this modifies
74 dwarf_entry* target_ptr; // Type that this entry modifies (DW_AT_type)
79 unsigned long target_ID; // ID of the entry that contains the type that this modifies
80 dwarf_entry* target_ptr; // Type that this entry modifies (DW_AT_type)
85 unsigned long target_ID; // ID of the entry that contains the type that this modifies
86 dwarf_entry* target_ptr; // Type that this entry modifies (DW_AT_type)
87 long data_member_location; // Addr offset relative to struct head
90 // collection_type = {structure_type, union_type, enumeration_type}
94 unsigned long byte_size;
95 unsigned long num_members;
96 dwarf_entry** members; // Array of size num_members, type = {member, enumerator}
99 // struct or union member
103 unsigned long type_ID;
104 dwarf_entry* type_ptr;
105 long data_member_location; // Addr offset relative to struct head
106 // This will be 0 for a union
107 // This is stored as:
108 // (DW_OP_plus_uconst: x)
109 // where x is the location relative to struct head
110 // char is_bit_field; // 1 = bit field
111 // Only relevant for bit fields
112 unsigned long byte_size;
113 unsigned long bit_offset;
114 unsigned long bit_size;
117 // enumeration member
121 long const_value; // Enumeration value (SIGNED!)
128 char* filename; // The file name relative to the compilation directory
129 unsigned long return_type_ID;
130 dwarf_entry* return_type;
131 unsigned long num_formal_params;
132 dwarf_entry* params; // Array of size num_formal_params, type = {formal_parameter}
133 int is_external; /* Is it extern? If so, probably want to skip it */
134 unsigned long start_pc; /* Location of the function in memory */
137 /* This is for abstract function types, as might be used in declaring
138 a parameter as taking a function pointer. At least for the moment, we
139 won't bother about the parameters. */
141 unsigned long return_type_ID;
142 dwarf_entry* return_type;
145 // function formal parameter
149 unsigned long type_ID;
150 dwarf_entry* type_ptr;
151 long location; // Offset from function base (this is SIGNED!)
152 // This is stored as: (DW_OP_fbreg: x),
153 // where x is location offset
156 // compile_unit - only used to figure out filename and compilation directory
157 // We assume that every function belongs to the file specified
158 // by the nearest compile_unit entry (to its left) in dwarf_entry_array
167 extern dwarf_entry* dwarf_entry_array;
168 extern unsigned long dwarf_entry_array_size;
170 // Function declarations
173 char *get_TAG_name(unsigned long tag);
174 int process_elf_binary_data(char* filename);
177 char tag_is_relevant_entry(unsigned long tag);
178 char tag_is_modifier_type(unsigned long tag);
179 char tag_is_collection_type(unsigned long tag);
180 char tag_is_base_type(unsigned long tag);
181 char tag_is_member(unsigned long tag);
182 char tag_is_enumerator(unsigned long tag);
183 char tag_is_function(unsigned long tag);
184 char tag_is_formal_parameter(unsigned long tag);
185 char tag_is_compile_unit(unsigned long tag);
186 char tag_is_function_type(unsigned long tag);
187 char entry_is_listening_for_attribute(dwarf_entry* e, unsigned long attr);
189 char harvest_type_value(dwarf_entry* e, unsigned long value);
190 char harvest_byte_size_value(dwarf_entry* e, unsigned long value);
191 char harvest_encoding_value(dwarf_entry* e, unsigned long value);
192 char harvest_bit_size_value(dwarf_entry* e, unsigned long value);
193 char harvest_bit_offset_value(dwarf_entry* e, unsigned long value);
194 char harvest_const_value(dwarf_entry* e, unsigned long value);
195 char harvest_name(dwarf_entry* e, const char* str);
196 char harvest_comp_dir(dwarf_entry* e, const char* str);
197 char harvest_location(dwarf_entry* e, long value);
198 char harvest_data_member_location(dwarf_entry* e, long value);
199 char harvest_string(dwarf_entry* e, unsigned long attr, const char* str);
200 char harvest_external_flag_value(dwarf_entry *e, unsigned long value);
201 char harvest_address_value(dwarf_entry* e, unsigned long attr, unsigned long value);
202 char harvest_ordinary_unsigned_value(dwarf_entry* e, unsigned long attr, unsigned long value);
204 char binary_search_dwarf_entry_array(unsigned long target_ID, unsigned long* index_ptr);
206 void link_entries_to_type_entries();
207 void link_collection_to_members(dwarf_entry* e, unsigned long dist_to_end);
208 void link_function_to_params(dwarf_entry* e, unsigned long dist_to_end);
209 void initialize_function_filenames();
210 void link_array_entries_to_members();
211 void print_dwarf_entry(dwarf_entry* e);
213 void initialize_dwarf_entry_array(unsigned long num_entries);
214 void destroy_dwarf_entry_array(void);
215 void print_dwarf_entry_array();
216 void initialize_dwarf_entry_ptr(dwarf_entry* e);
217 void finish_dwarf_entry_array_init(void);
219 char tag_is_modifier_type(unsigned long tag);
220 char tag_is_collection_type(unsigned long tag);
221 char tag_is_base_type(unsigned long tag);
222 char tag_is_member(unsigned long tag);
223 char tag_is_enumerator(unsigned long tag);
224 char tag_is_function(unsigned long tag);
225 char tag_is_formal_parameter(unsigned long tag);