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.
18 #include "dumpstructures.h"
20 #include "elf/dwarf2.h"
22 #include "GenericHashtable.h"
27 int process_elf_binary_data(char* filename);
29 int main(int argc, char **argv) {
32 process_elf_binary_data(argv[1]);
33 daikon_preprocess_entry_array();
36 // Pre-processes global dwarf_entry_array in order to place
37 // the data in a form that can easily be turned into .decls
39 void daikon_preprocess_entry_array()
41 initializeTypeArray();
46 int entry_is_type(dwarf_entry *entry) {
47 if (entry->tag_name==DW_TAG_structure_type||
48 entry->tag_name==DW_TAG_union_type) {
49 collection_type* collection_ptr = (collection_type*)(entry->entry_ptr);
50 /* if (collection_ptr->name==0&&assigntype) {
51 collection_ptr->name=(char*)malloc(100);
52 sprintf(collection_ptr->name,"TYPE%ld",typecount++);
59 int entry_is_valid_function(dwarf_entry *entry) {
60 if (tag_is_function(entry->tag_name)) {
61 function* funcPtr = (function*)(entry->entry_ptr);
62 if (funcPtr->start_pc != 0 && funcPtr->name != 0) {
66 printf("Skipping invalid-looking function %s\n", funcPtr->name);
78 void initializeTypeArray()
81 dwarf_entry * cur_entry;
82 struct genhashtable * ght=genallocatehashtable((unsigned int (*)(void *)) & hashstring,(int (*)(void *,void *)) &equivalentstrings);
84 for (i = 0; i < dwarf_entry_array_size; i++)
86 cur_entry = &dwarf_entry_array[i];
87 if (entry_is_type(cur_entry))
89 collection_type* collection_ptr = (collection_type*)(cur_entry->entry_ptr);
93 for(j=0;j<collection_ptr->num_members;j++) {
94 dwarf_entry *entry=collection_ptr->members[j];
95 member * member_ptr=(member *)entry->entry_ptr;
96 char *name=member_ptr->name;
97 dwarf_entry *type=member_ptr->type_ptr;
98 char *typestr=printname(type,GETTYPE);
99 char *poststr=printname(type,POSTNAME);
104 if (collection_ptr->name!=NULL) {
105 struct valuepair *vp=NULL;
106 if (gencontains(ght,collection_ptr->name))
107 vp=(struct valuepair *)gengettable(ght,collection_ptr->name);
108 if (vp==NULL||vp->value<value) {
109 vp=(struct valuepair*)calloc(1,sizeof(struct valuepair));
112 genputtable(ght,collection_ptr->name,vp);
119 for (i = 0; i < dwarf_entry_array_size; i++)
121 cur_entry = &dwarf_entry_array[i];
122 if (entry_is_type(cur_entry))
124 collection_type* collection_ptr = (collection_type*)(cur_entry->entry_ptr);
127 if (collection_ptr->name==NULL)
129 if (gencontains(ght,collection_ptr->name)) {
130 struct valuepair *vp=(struct valuepair*)gengettable(ght,collection_ptr->name);
134 printf("structure %s {\n",collection_ptr->name);
136 for(j=0;j<collection_ptr->num_members;j++) {
137 dwarf_entry *entry=collection_ptr->members[j];
138 member * member_ptr=(member *)entry->entry_ptr;
139 char *name=member_ptr->name;
140 dwarf_entry *type=member_ptr->type_ptr;
141 char *typestr=printname(type,GETTYPE);
142 char *poststr=printname(type,POSTNAME);
143 if (member_ptr->data_member_location>offset) {
144 printf(" reserved byte[%ld];\n",member_ptr->data_member_location-offset);
145 offset=member_ptr->data_member_location;
147 offset+=getsize(type);
149 printf(" %s %s%s;\n",typestr,name,poststr);
156 int getsize(dwarf_entry *type) {
159 switch(type->tag_name) {
160 case DW_TAG_enumeration_type:
162 case DW_TAG_array_type: {
163 modifier_type * modifier_ptr=(modifier_type*)type->entry_ptr;
164 int size=((array_bound*)modifier_ptr->array_ptr[0]->entry_ptr)->upperbound+1;
165 return size*getsize(modifier_ptr->target_ptr);
167 case DW_TAG_base_type: {
168 base_type *base=(base_type*)type->entry_ptr;
169 return base->byte_size;
171 case DW_TAG_pointer_type: {
174 case DW_TAG_structure_type: {
175 collection_type *ctype=(collection_type*)type->entry_ptr;
176 return ctype->byte_size;
183 char * printname(dwarf_entry * type,int op) {
189 switch(type->tag_name) {
190 case DW_TAG_enumeration_type:
194 case DW_TAG_array_type: {
195 modifier_type * modifier_ptr=(modifier_type*)type->entry_ptr;
197 char *typename=printname(modifier_ptr->target_ptr,op);
199 } else if (op==POSTNAME) {
200 int size=((array_bound*)modifier_ptr->array_ptr[0]->entry_ptr)->upperbound+1;
201 char *typename=printname(modifier_ptr->target_ptr,op);
202 char *newptr=(char *)malloc(200);
203 sprintf(newptr,"%s[%ld]",typename,size);
208 case DW_TAG_const_type:
210 consttype * ctype_ptr=(consttype*)type->entry_ptr;
212 char *typename=printname(ctype_ptr->target_ptr,op);
217 case DW_TAG_subroutine_type: {
222 tdef * tdef_ptr=(tdef*)type->entry_ptr;
224 char *typename=printname(tdef_ptr->target_ptr,op);
229 case DW_TAG_base_type: {
230 base_type *base=(base_type*)type->entry_ptr;
232 switch(base->byte_size) {
240 char *m=(char*)malloc(100);
241 sprintf(m,"error%ld",base->byte_size);
247 case DW_TAG_pointer_type: {
248 modifier_type * modifier_ptr=(modifier_type*)type->entry_ptr;
250 if (modifier_ptr->target_ptr==NULL)
251 return "void *"; /* seems like a good guess */
253 char *typename=printname(modifier_ptr->target_ptr,op);
255 char *newptr=(char *)malloc(200);
256 sprintf(newptr,"%s *",typename);
262 case DW_TAG_union_type:
263 case DW_TAG_structure_type: {
264 collection_type *ctype=(collection_type*)type->entry_ptr;
265 if (op==GETTYPE&&ctype->name==NULL&&assigntype) {
266 ctype->name=(char*)malloc(100);
267 sprintf(ctype->name,"TYPE%ld",typecount++);
278 char * p=(char *)malloc(100);
279 sprintf(p,"0x%x",type->tag_name);