handle const/volatile qualifiers and remove external-only check
This commit is contained in:
parent
c918c1e2e2
commit
6e8cfba046
@ -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) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user