BaseTypeStruct *PtrTypes;\r
size_t NbVariables; // Variables number\r
VariablesStruct *PtrVariables; // Pointer to the global variables list information structure\r
+ size_t NbFrames; // Frames number\r
}S_CUStruct;\r
\r
\r
// Die type detection\r
switch (return_tagval)\r
{\r
- case DW_TAG_compile_unit:\r
+ case DW_TAG_compile_unit:\r
if (dwarf_attrlist(return_sib, &atlist, &atcnt, &error) == DW_DLV_OK)\r
{\r
for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
{\r
switch (return_attr)\r
{\r
- case DW_AT_low_pc:\r
+ // Start address\r
+ case DW_AT_low_pc:\r
if (dwarf_lowpc(return_sib, &return_lowpc, &error) == DW_DLV_OK)\r
{\r
PtrCU[NbCU].LowPC = return_lowpc;\r
}\r
break;\r
\r
- case DW_AT_high_pc:\r
+ // End address\r
+ case DW_AT_high_pc:\r
if (dwarf_highpc(return_sib, &return_highpc, &error) == DW_DLV_OK)\r
{\r
PtrCU[NbCU].HighPC = return_highpc;\r
}\r
break;\r
\r
- case DW_AT_producer:\r
+ // compilation information\r
+ case DW_AT_producer:\r
if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK)\r
{\r
PtrCU[NbCU].PtrProducer = (char *)calloc(strlen(return_string) + 1, 1);\r
}\r
break;\r
\r
- case DW_AT_name:\r
+ // Filename\r
+ case DW_AT_name:\r
if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK)\r
{\r
SourceFilename = (char *)realloc(SourceFilename, strlen(return_string) + 1);\r
}\r
break;\r
\r
- case DW_AT_comp_dir:\r
+ // Directory name\r
+ case DW_AT_comp_dir:\r
if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK)\r
{\r
SourceFileDirectory = (char *)realloc(SourceFileDirectory, strlen(return_string) + 1);\r
}\r
\r
Ptr = SourceFullFilename = (char *)realloc(SourceFullFilename, strlen(SourceFilename) + strlen(SourceFileDirectory) + 2);\r
+#if defined(_WIN32)\r
sprintf(SourceFullFilename, "%s\\%s", SourceFileDirectory, SourceFilename);\r
+#else\r
+ sprintf(SourceFullFilename, "%s/%s", SourceFileDirectory, SourceFilename);\r
+#endif\r
while (*Ptr)\r
{\r
+#if defined(_WIN32)\r
if (*Ptr == '/')\r
{\r
*Ptr = '\\';\r
}\r
+#else\r
+ if (*Ptr == '\\')\r
+ {\r
+ *Ptr = '/';\r
+ }\r
+#endif\r
Ptr++;\r
}\r
PtrCU[NbCU].PtrFullFilename = (char *)calloc(strlen(SourceFullFilename) + 1, 1);\r
{\r
switch (return_tagval)\r
{\r
- case DW_TAG_lexical_block:\r
+ case DW_TAG_lexical_block:\r
break;\r
\r
- case DW_TAG_variable:\r
+ case DW_TAG_variable:\r
if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK)\r
{\r
PtrCU[NbCU].PtrVariables = (VariablesStruct *)realloc(PtrCU[NbCU].PtrVariables, ((PtrCU[NbCU].NbVariables + 1) * sizeof(VariablesStruct)));\r
{\r
switch (return_attr)\r
{\r
- case DW_AT_location:\r
+ case DW_AT_location:\r
if (dwarf_formblock(return_attr1, &return_block, &error) == DW_DLV_OK)\r
{\r
PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].Op = (*((unsigned char *)(return_block->bl_data)));\r
}\r
break;\r
\r
- case DW_AT_type:\r
+ case DW_AT_type:\r
if (dwarf_global_formref(return_attr1, &return_offset, &error) == DW_DLV_OK)\r
{\r
PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].TypeOffset = return_offset;\r
}\r
break;\r
\r
- case DW_AT_name:\r
+ // Variable name\r
+ case DW_AT_name:\r
if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
{\r
#ifdef DEBUG_VariableName\r
}\r
break;\r
\r
- default:\r
+ default:\r
break;\r
}\r
}\r
}\r
break;\r
\r
- case DW_TAG_base_type:\r
- case DW_TAG_typedef:\r
- case DW_TAG_structure_type:\r
- case DW_TAG_pointer_type:\r
- case DW_TAG_const_type:\r
- case DW_TAG_array_type:\r
- case DW_TAG_subrange_type:\r
- case DW_TAG_subroutine_type:\r
+ case DW_TAG_base_type:\r
+ case DW_TAG_typedef:\r
+ case DW_TAG_structure_type:\r
+ case DW_TAG_pointer_type:\r
+ case DW_TAG_const_type:\r
+ case DW_TAG_array_type:\r
+ case DW_TAG_subrange_type:\r
+ case DW_TAG_subroutine_type:\r
if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK)\r
{\r
PtrCU[NbCU].PtrTypes = (BaseTypeStruct *)realloc(PtrCU[NbCU].PtrTypes, ((PtrCU[NbCU].NbTypes + 1) * sizeof(BaseTypeStruct)));\r
{\r
switch (return_attr)\r
{\r
- case DW_AT_type:\r
+ case DW_AT_type:\r
if (dwarf_global_formref(return_attr1, &return_offset, &error) == DW_DLV_OK)\r
{\r
PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].TypeOffset = return_offset;\r
}\r
break;\r
\r
- case DW_AT_byte_size:\r
+ case DW_AT_byte_size:\r
if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
{\r
PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].ByteSize = return_uvalue;\r
}\r
break;\r
\r
- case DW_AT_encoding:\r
+ case DW_AT_encoding:\r
if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
{\r
PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Encoding = return_uvalue;\r
}\r
break;\r
\r
- case DW_AT_name:\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].PtrName = (char *)calloc(strlen(return_string) + 1, 1);\r
}\r
break;\r
\r
- default:\r
+ default:\r
break;\r
}\r
}\r
}\r
break;\r
\r
- case DW_TAG_subprogram:\r
+ case DW_TAG_subprogram:\r
if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK)\r
{\r
PtrCU[NbCU].PtrSubProgs = (SubProgStruct *)realloc(PtrCU[NbCU].PtrSubProgs, ((PtrCU[NbCU].NbSubProgs + 1) * sizeof(SubProgStruct)));\r
{\r
switch (return_attr)\r
{\r
+ // start address\r
case DW_AT_low_pc:\r
if (dwarf_lowpc(return_die, &return_lowpc, &error) == DW_DLV_OK)\r
{\r
}\r
break;\r
\r
+ // end address\r
case DW_AT_high_pc:\r
if (dwarf_highpc(return_die, &return_highpc, &error) == DW_DLV_OK)\r
{\r
}\r
break;\r
\r
+ // Line number\r
case DW_AT_decl_line:\r
if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
{\r
}\r
break;\r
\r
+ // Frame\r
case DW_AT_frame_base:\r
if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
{\r
PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].FrameBase = return_uvalue;\r
+ PtrCU[NbCU].NbFrames++;\r
}\r
break;\r
\r
+ // function name\r
case DW_AT_name:\r
if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
{\r
}\r
break;\r
\r
+ case DW_AT_sibling:\r
+ break;\r
+\r
+ case DW_AT_GNU_all_tail_call_sites:\r
+ break;\r
+\r
+ case DW_AT_type:\r
+ break;\r
+\r
+ case DW_AT_prototyped:\r
+ break;\r
+\r
+ // File number\r
+ case DW_AT_decl_file:\r
+ break;\r
+\r
+ case DW_AT_external:\r
+ break;\r
+\r
default:\r
break;\r
}\r
{\r
switch (return_attr)\r
{\r
- case DW_AT_location:\r
+ case DW_AT_location:\r
if (dwarf_formblock(return_attr1, &return_block, &error) == DW_DLV_OK)\r
{\r
PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].Op = *((unsigned char *)(return_block->bl_data));\r
\r
switch (return_tagval)\r
{\r
- case DW_TAG_variable:\r
+ case DW_TAG_variable:\r
PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].Offset -= 0x80;\r
break;\r
\r
- case DW_TAG_formal_parameter:\r
+ case DW_TAG_formal_parameter:\r
break;\r
\r
default:\r
}\r
break;\r
\r
- case DW_AT_type:\r
+ case DW_AT_type:\r
if (dwarf_global_formref(return_attr1, &return_offset, &error) == DW_DLV_OK)\r
{\r
PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].TypeOffset = return_offset;\r
}\r
break;\r
\r
- case DW_AT_name:\r
+ case DW_AT_name:\r
if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
{\r
#ifdef DEBUG_VariableName\r
}\r
break;\r
\r
- case DW_AT_decl_file:\r
+ case DW_AT_decl_file:\r
break;\r
\r
- case DW_AT_decl_line:\r
+ case DW_AT_decl_line:\r
break;\r
\r
default:\r
}\r
\r
\r
-// \r
+// Variables information initialisation\r
void DWARFManager_InitInfosVariable(VariablesStruct *PtrVariables)\r
{\r
size_t j, TypeOffset;\r
{\r
switch (PtrCU[NbCU].PtrTypes[j].Tag)\r
{\r
+ // Structure type tag\r
case DW_TAG_structure_type:\r
- PtrVariables->TypeTag |= 0x1;\r
+ PtrVariables->TypeTag |= TypeTag_structure;\r
if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
{\r
j = -1;\r
}\r
else\r
{\r
- if ((PtrVariables->TypeTag & 0x2))\r
+ if ((PtrVariables->TypeTag & TypeTag_pointer))\r
{\r
strcat(PtrVariables->PtrTypeName, " *");\r
}\r
}\r
break;\r
\r
+ // Pointer type tag\r
case DW_TAG_pointer_type:\r
- PtrVariables->TypeTag |= 0x2;\r
+ PtrVariables->TypeTag |= TypeTag_pointer;\r
PtrVariables->TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize;\r
PtrVariables->TypeEncoding = 0x10;\r
if (!(TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
}\r
break;\r
\r
+ // Typedef type tag\r
case DW_TAG_typedef:\r
- if (!(PtrVariables->TypeTag & 0x20))\r
+ if (!(PtrVariables->TypeTag & TypeTag_typedef))\r
{\r
- PtrVariables->TypeTag |= 0x20;\r
+ PtrVariables->TypeTag |= TypeTag_typedef;\r
strcat(PtrVariables->PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName);\r
}\r
if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
}\r
break;\r
\r
+ // ? type tag\r
case DW_TAG_subrange_type:\r
- PtrVariables->TypeTag |= 0x4;\r
+ PtrVariables->TypeTag |= TypeTag_0x04;\r
break;\r
\r
+ // Array type tag\r
case DW_TAG_array_type:\r
- PtrVariables->TypeTag |= 0x8;\r
+ PtrVariables->TypeTag |= TypeTag_arraytype;\r
if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
{\r
j = -1;\r
}\r
break;\r
\r
+ // Const type tag\r
case DW_TAG_const_type:\r
- PtrVariables->TypeTag |= 0x10;\r
+ PtrVariables->TypeTag |= TypeTag_consttype;\r
strcat(PtrVariables->PtrTypeName, "const ");\r
if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
{\r
}\r
break;\r
\r
+ // Base type tag\r
case DW_TAG_base_type:\r
- if (!(PtrVariables->TypeTag & 0x20))\r
+ if (!(PtrVariables->TypeTag & TypeTag_typedef))\r
{\r
strcat(PtrVariables->PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName);\r
}\r
- if ((PtrVariables->TypeTag & 0x2))\r
+ if ((PtrVariables->TypeTag & TypeTag_pointer))\r
{\r
strcat(PtrVariables->PtrTypeName, " *");\r
}\r
PtrVariables->TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize;\r
PtrVariables->TypeEncoding = PtrCU[NbCU].PtrTypes[j].Encoding;\r
}\r
- if ((PtrVariables->TypeTag & 0x8))\r
+ if ((PtrVariables->TypeTag & TypeTag_arraytype))\r
{\r
strcat(PtrVariables->PtrTypeName, "[]");\r
}\r