diff --git a/src/symbol.cpp b/src/symbol.cpp index 33f6f51..d797925 100644 --- a/src/symbol.cpp +++ b/src/symbol.cpp @@ -34,6 +34,39 @@ bool Symbol::is_integer_type(Dwarf_Debug dbg, Dwarf_Die die) { return false; } + // Skip through const/volatile qualifiers + while (tag == DW_TAG_const_type || tag == DW_TAG_volatile_type) { + Dwarf_Attribute inner_type_attr; + Dwarf_Off inner_type_offset; + Dwarf_Die inner_type_die; + + if (dwarf_attr(type_die, DW_AT_type, &inner_type_attr, &err) != DW_DLV_OK) { + dwarf_dealloc(dbg, type_die, DW_DLA_DIE); + return false; + } + + if (dwarf_global_formref(inner_type_attr, &inner_type_offset, &err) != DW_DLV_OK) { + dwarf_dealloc(dbg, inner_type_attr, DW_DLA_ATTR); + dwarf_dealloc(dbg, type_die, DW_DLA_DIE); + return false; + } + + dwarf_dealloc(dbg, inner_type_attr, DW_DLA_ATTR); + + if (dwarf_offdie_b(dbg, inner_type_offset, true, &inner_type_die, &err) != DW_DLV_OK) { + dwarf_dealloc(dbg, type_die, DW_DLA_DIE); + return false; + } + + dwarf_dealloc(dbg, type_die, DW_DLA_DIE); + type_die = inner_type_die; + + if (dwarf_tag(type_die, &tag, &err) != DW_DLV_OK) { + dwarf_dealloc(dbg, type_die, DW_DLA_DIE); + return false; + } + } + // Check if it's a base type (integer types are base types) if (tag != DW_TAG_base_type) { dwarf_dealloc(dbg, type_die, DW_DLA_DIE); @@ -152,20 +185,9 @@ void Symbol::list_global_integer_vars(Dwarf_Debug dbg) { Dwarf_Half tag; if (dwarf_tag(child_die, &tag, &err) == DW_DLV_OK && tag == DW_TAG_variable) { - // Check if it's a global variable (has DW_AT_external) - Dwarf_Attribute external_attr; - Dwarf_Bool is_external; - - bool is_global = false; - if (dwarf_attr(child_die, DW_AT_external, &external_attr, &err) == DW_DLV_OK) { - if (dwarf_formflag(external_attr, &is_external, &err) == DW_DLV_OK && is_external) { - is_global = true; - } - dwarf_dealloc(dbg, external_attr, DW_DLA_ATTR); - } - - // Process global integer variables - if (is_global && is_integer_type(dbg, child_die)) { + // Top-level variables are globals (excludes namespace/function-scoped vars) + // Check if it's an integer type + if (is_integer_type(dbg, child_die)) { char *var_name = nullptr; if (dwarf_diename(child_die, &var_name, &err) == DW_DLV_OK && var_name) {