+\r
+ switch (return_tagval)\r
+ {\r
+ case DW_TAG_structure_type:\r
+ case DW_TAG_union_type:\r
+ if (dwarf_child(return_die, &return_subdie, &error) == DW_DLV_OK)\r
+ {\r
+ do\r
+ {\r
+ return_sub = return_subdie;\r
+ if ((dwarf_tag(return_subdie, &return_tagval, &error) == DW_DLV_OK))\r
+ {\r
+ switch (return_tagval)\r
+ {\r
+ case DW_TAG_member:\r
+ if (dwarf_attrlist(return_subdie, &atlist, &atcnt, &error) == DW_DLV_OK)\r
+ {\r
+ // Allocate memory for this member\r
+ PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrStructureMembers = (StructureMembersStruct *)realloc(PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrStructureMembers, ((PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].NbStructureMembers + 1) * sizeof(StructureMembersStruct)));\r
+ memset(PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrStructureMembers + PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].NbStructureMembers, 0, sizeof(StructureMembersStruct));\r
+\r
+ for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
+ {\r
+ if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)\r
+ {\r
+ if (dwarf_attr(return_subdie, return_attr, &return_attr1, &error) == DW_DLV_OK)\r
+ {\r
+ switch (return_attr)\r
+ {\r
+ case DW_AT_data_member_location:\r
+ if (dwarf_whatform(return_attr1, &form, &error) == DW_DLV_OK)\r
+ {\r
+ if ((form == DW_FORM_data1) || (form == DW_FORM_data2) || (form == DW_FORM_data2) || (form == DW_FORM_data4) || (form == DW_FORM_data8) || (form == DW_FORM_udata))\r
+ {\r
+ if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
+ {\r
+ PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrStructureMembers[PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].NbStructureMembers].DataMemberLocation = return_uvalue;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if (form == DW_FORM_sdata)\r
+ {\r
+ if (dwarf_formsdata(return_attr1, &return_value, &error) == DW_DLV_OK)\r
+ {\r
+ PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrStructureMembers[PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].NbStructureMembers].DataMemberLocation = return_value;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if (dwarf_formblock(return_attr1, &return_block, &error) == DW_DLV_OK)\r
+ {\r
+ switch (return_block->bl_len)\r
+ {\r
+ case 2:\r
+ case 3:\r
+ case 4:\r
+ PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrStructureMembers[PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].NbStructureMembers].DataMemberLocation = ReadULEB128((char *)return_block->bl_data + 1);\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ dwarf_dealloc(dbg, return_block, DW_DLA_BLOCK);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ break;\r
+\r
+ case DW_AT_type:\r
+ //dwarf_whatform(return_attr1, &form, &error);\r
+ if (dwarf_global_formref(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
+ {\r
+ PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrStructureMembers[PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].NbStructureMembers].TypeOffset = return_uvalue;\r
+ }\r
+ break;\r
+\r
+ case DW_AT_name:\r
+ if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
+ {\r
+ PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrStructureMembers[PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].NbStructureMembers].PtrName = (char *)calloc(strlen(return_string) + 1, 1);\r
+ strcpy(PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrStructureMembers[PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].NbStructureMembers].PtrName, return_string);\r
+\r
+ dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
+ }\r
+ break;\r
+\r
+ // Member's file number\r
+ case DW_AT_decl_file:\r
+ break;\r
+\r
+ // Member's line number\r
+ case DW_AT_decl_line:\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
+\r
+ PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].NbStructureMembers++;\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ } while (dwarf_siblingof(dbg, return_sub, &return_subdie, &error) == DW_DLV_OK);\r
+ }\r
+ break;\r
+ }\r
+\r
+ PtrCU[NbCU].NbTypes++;\r