- switch (tag) {
- case DW_TAG_array_type:
- case DW_TAG_class_type:
- case DW_TAG_enumeration_type:
- case DW_TAG_typedef:
- case DW_TAG_pointer_type:
- case DW_TAG_reference_type:
- case DW_TAG_rvalue_reference_type:
- case DW_TAG_string_type:
- case DW_TAG_structure_type:
- case DW_TAG_subroutine_type:
- case DW_TAG_union_type:
- case DW_TAG_ptr_to_member_type:
- case DW_TAG_set_type:
- case DW_TAG_subrange_type:
- case DW_TAG_base_type:
- case DW_TAG_const_type:
- case DW_TAG_file_type:
- case DW_TAG_packed_type:
- case DW_TAG_volatile_type:
- case DW_TAG_restrict_type:
- case DW_TAG_interface_type:
- case DW_TAG_unspecified_type:
- case DW_TAG_shared_type:
- return TagClass::Type;
-
- case DW_TAG_subprogram:
- return TagClass::Subprogram;
-
- case DW_TAG_variable:
- case DW_TAG_formal_parameter:
- return TagClass::Variable;
-
- case DW_TAG_lexical_block:
- case DW_TAG_try_block:
- case DW_TAG_catch_block:
- case DW_TAG_inlined_subroutine:
- case DW_TAG_with_stmt:
- return TagClass::Scope;
-
- case DW_TAG_namespace:
- return TagClass::Namespace;
-
- default:
- return TagClass::Unknown;
- }
+ static const std::unordered_map<int, TagClass> map = {
+ {DW_TAG_array_type, TagClass::Type}, {DW_TAG_class_type, TagClass::Type},
+ {DW_TAG_enumeration_type, TagClass::Type}, {DW_TAG_typedef, TagClass::Type},
+ {DW_TAG_pointer_type, TagClass::Type}, {DW_TAG_reference_type, TagClass::Type},
+ {DW_TAG_rvalue_reference_type, TagClass::Type}, {DW_TAG_string_type, TagClass::Type},
+ {DW_TAG_structure_type, TagClass::Type}, {DW_TAG_subroutine_type, TagClass::Type},
+ {DW_TAG_union_type, TagClass::Type}, {DW_TAG_ptr_to_member_type, TagClass::Type},
+ {DW_TAG_set_type, TagClass::Type}, {DW_TAG_subrange_type, TagClass::Type},
+ {DW_TAG_base_type, TagClass::Type}, {DW_TAG_const_type, TagClass::Type},
+ {DW_TAG_file_type, TagClass::Type}, {DW_TAG_packed_type, TagClass::Type},
+ {DW_TAG_volatile_type, TagClass::Type}, {DW_TAG_restrict_type, TagClass::Type},
+ {DW_TAG_interface_type, TagClass::Type}, {DW_TAG_unspecified_type, TagClass::Type},
+ {DW_TAG_shared_type, TagClass::Type},
+
+ {DW_TAG_subprogram, TagClass::Subprogram},
+
+ {DW_TAG_variable, TagClass::Variable}, {DW_TAG_formal_parameter, TagClass::Variable},
+
+ {DW_TAG_lexical_block, TagClass::Scope}, {DW_TAG_try_block, TagClass::Scope},
+ {DW_TAG_catch_block, TagClass::Scope}, {DW_TAG_inlined_subroutine, TagClass::Scope},
+ {DW_TAG_with_stmt, TagClass::Scope},
+
+ {DW_TAG_namespace, TagClass::Namespace}};
+
+ auto res = map.find(tag);
+ return res != map.end() ? res->second : TagClass::Unknown;