Automatic structure extraction tool...works on binaries with dwarf-2 debug informatio...
[repair.git] / Repair / RepairCompiler / structextract / typedata.h
1 /*
2    This file is part of Kvasir, a Valgrind skin that implements the
3    C language front-end for the Daikon Invariant Detection System
4
5    Copyright (C) 2004 Philip Guo, MIT CSAIL Program Analysis Group
6
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.
11 */
12
13 /* typedata.h:
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
18    in tracking.
19 */
20
21 #ifndef TYPEDATA_H
22 #define TYPEDATA_H
23
24 // Type information data structures
25
26 // Contains one entry that holds data for one of many possible types
27 // depending on tag_name
28 typedef struct
29 {
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
33   unsigned int level;
34 } dwarf_entry;
35
36 // Entries for individual types
37
38 typedef struct
39 {
40   unsigned long byte_size; // DW_AT_byte_size
41   unsigned long encoding;
42
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
48
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
52 // arrays of size 1 -
53 // I will add full support for arrays later!!! //PG
54 // modifier_type = {const_type, pointer_type, array_type, volatile_type}
55 typedef struct
56 {
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)
59   int num_array;
60   dwarf_entry** array_ptr;
61 } modifier_type;
62
63 typedef struct
64
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)
68 } array_bound;
69
70 // collection_type = {structure_type, union_type, enumeration_type}
71 typedef struct
72 {
73   char* name;
74   unsigned long byte_size;
75   unsigned long num_members;
76   dwarf_entry** members; // Array of size num_members, type = {member, enumerator}
77 } collection_type;
78
79 // struct or union member
80 typedef struct
81 {
82   char* name;
83   unsigned long type_ID;
84   dwarf_entry* type_ptr;
85   long data_member_location; // Addr offset relative to struct head
86                              // This will be 0 for a union
87                              // This is stored as:
88                              // (DW_OP_plus_uconst: x)
89                              // where x is the location relative to struct head
90   //  char is_bit_field; // 1 = bit field
91   // Only relevant for bit fields
92   unsigned long byte_size;
93   unsigned long bit_offset;
94   unsigned long bit_size;
95 } member;
96
97 // enumeration member
98 typedef struct
99 {
100   char* name;
101   long const_value; // Enumeration value (SIGNED!)
102 } enumerator;
103
104 // FUNCTION!!!
105 typedef struct
106 {
107   char* name;
108   char* filename; // The file name relative to the compilation directory
109   unsigned long return_type_ID;
110   dwarf_entry* return_type;
111   unsigned long num_formal_params;
112   dwarf_entry* params; // Array of size num_formal_params, type = {formal_parameter}
113   int is_external; /* Is it extern? If so, probably want to skip it */
114   unsigned long start_pc; /* Location of the function in memory */
115 } function;
116
117 /* This is for abstract function types, as might be used in declaring
118    a parameter as taking a function pointer. At least for the moment, we
119    won't bother about the parameters. */
120 typedef struct {
121   unsigned long return_type_ID;
122   dwarf_entry* return_type;
123 } function_type;
124
125 // function formal parameter
126 typedef struct
127 {
128   char* name;
129   unsigned long type_ID;
130   dwarf_entry* type_ptr;
131   long location; // Offset from function base (this is SIGNED!)
132                  // This is stored as: (DW_OP_fbreg: x),
133                  // where x is location offset
134 } formal_parameter;
135
136 // compile_unit - only used to figure out filename and compilation directory
137 // We assume that every function belongs to the file specified
138 // by the nearest compile_unit entry (to its left) in dwarf_entry_array
139 typedef struct
140 {
141   char* filename;
142   char* comp_dir;
143 } compile_unit;
144
145 // Globals
146
147 extern dwarf_entry* dwarf_entry_array;
148 extern unsigned long dwarf_entry_array_size;
149
150 // Function declarations
151
152 // From readelf.c
153 char *get_TAG_name(unsigned long tag);
154 int process_elf_binary_data(char* filename);
155
156 // From typedata.c
157 char tag_is_relevant_entry(unsigned long tag);
158 char tag_is_modifier_type(unsigned long tag);
159 char tag_is_collection_type(unsigned long tag);
160 char tag_is_base_type(unsigned long tag);
161 char tag_is_member(unsigned long tag);
162 char tag_is_enumerator(unsigned long tag);
163 char tag_is_function(unsigned long tag);
164 char tag_is_formal_parameter(unsigned long tag);
165 char tag_is_compile_unit(unsigned long tag);
166 char tag_is_function_type(unsigned long tag);
167 char entry_is_listening_for_attribute(dwarf_entry* e, unsigned long attr);
168
169 char harvest_type_value(dwarf_entry* e, unsigned long value);
170 char harvest_byte_size_value(dwarf_entry* e, unsigned long value);
171 char harvest_encoding_value(dwarf_entry* e, unsigned long value);
172 char harvest_bit_size_value(dwarf_entry* e, unsigned long value);
173 char harvest_bit_offset_value(dwarf_entry* e, unsigned long value);
174 char harvest_const_value(dwarf_entry* e, unsigned long value);
175 char harvest_name(dwarf_entry* e, const char* str);
176 char harvest_comp_dir(dwarf_entry* e, const char* str);
177 char harvest_location(dwarf_entry* e, long value);
178 char harvest_data_member_location(dwarf_entry* e, long value);
179 char harvest_string(dwarf_entry* e, unsigned long attr, const char* str);
180 char harvest_external_flag_value(dwarf_entry *e, unsigned long value);
181 char harvest_address_value(dwarf_entry* e, unsigned long attr, unsigned long value);
182 char harvest_ordinary_unsigned_value(dwarf_entry* e, unsigned long attr, unsigned long value);
183
184 char binary_search_dwarf_entry_array(unsigned long target_ID, unsigned long* index_ptr);
185
186 void link_entries_to_type_entries();
187 void link_collection_to_members(dwarf_entry* e, unsigned long dist_to_end);
188 void link_function_to_params(dwarf_entry* e, unsigned long dist_to_end);
189 void initialize_function_filenames();
190 void link_array_entries_to_members();
191 void print_dwarf_entry(dwarf_entry* e);
192
193 void initialize_dwarf_entry_array(unsigned long num_entries);
194 void destroy_dwarf_entry_array(void);
195 void print_dwarf_entry_array();
196 void initialize_dwarf_entry_ptr(dwarf_entry* e);
197 void finish_dwarf_entry_array_init(void);
198
199 char tag_is_modifier_type(unsigned long tag);
200 char tag_is_collection_type(unsigned long tag);
201 char tag_is_base_type(unsigned long tag);
202 char tag_is_member(unsigned long tag);
203 char tag_is_enumerator(unsigned long tag);
204 char tag_is_function(unsigned long tag);
205 char tag_is_formal_parameter(unsigned long tag);
206
207
208 #endif