1/*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Copyright 2013, Rene Gollent, rene@gollent.com.
4 * Distributed under the terms of the MIT License.
5 */
6
7#include "TagNames.h"
8
9#include "Dwarf.h"
10
11
12struct tag_name_info {
13	uint16					tag;
14	const char*				name;
15};
16
17
18#undef ENTRY
19#define ENTRY(name)	{ DW_TAG_##name, "DW_TAG_" #name }
20
21static const tag_name_info kTagNameInfos[] = {
22	ENTRY(array_type),
23	ENTRY(class_type),
24	ENTRY(entry_point),
25	ENTRY(enumeration_type),
26	ENTRY(formal_parameter),
27	ENTRY(imported_declaration),
28	ENTRY(label),
29	ENTRY(lexical_block),
30	ENTRY(member),
31	ENTRY(pointer_type),
32	ENTRY(reference_type),
33	ENTRY(compile_unit),
34	ENTRY(string_type),
35	ENTRY(structure_type),
36	ENTRY(subroutine_type),
37	ENTRY(typedef),
38	ENTRY(union_type),
39	ENTRY(unspecified_parameters),
40	ENTRY(variant),
41	ENTRY(common_block),
42	ENTRY(common_inclusion),
43	ENTRY(inheritance),
44	ENTRY(inlined_subroutine),
45	ENTRY(module),
46	ENTRY(ptr_to_member_type),
47	ENTRY(set_type),
48	ENTRY(subrange_type),
49	ENTRY(with_stmt),
50	ENTRY(access_declaration),
51	ENTRY(base_type),
52	ENTRY(catch_block),
53	ENTRY(const_type),
54	ENTRY(constant),
55	ENTRY(enumerator),
56	ENTRY(file_type),
57	ENTRY(friend),
58	ENTRY(namelist),
59	ENTRY(namelist_item),
60	ENTRY(packed_type),
61	ENTRY(subprogram),
62	ENTRY(template_type_parameter),
63	ENTRY(template_value_parameter),
64	ENTRY(thrown_type),
65	ENTRY(try_block),
66	ENTRY(variant_part),
67	ENTRY(variable),
68	ENTRY(volatile_type),
69	ENTRY(dwarf_procedure),
70	ENTRY(restrict_type),
71	ENTRY(interface_type),
72	ENTRY(namespace),
73	ENTRY(imported_module),
74	ENTRY(unspecified_type),
75	ENTRY(partial_unit),
76	ENTRY(imported_unit),
77	ENTRY(condition),
78	ENTRY(shared_type),
79	ENTRY(type_unit),
80	ENTRY(rvalue_reference_type),
81	ENTRY(template_alias),
82	ENTRY(coarray_type),
83	ENTRY(generic_subrange),
84	ENTRY(dynamic_type),
85	ENTRY(atomic_type),
86	ENTRY(call_site),
87	ENTRY(call_site_parameter),
88	ENTRY(skeleton_unit),
89	ENTRY(immutable_type),
90	ENTRY(GNU_template_parameter_pack),
91	ENTRY(GNU_formal_parameter_pack),
92	ENTRY(GNU_call_site),
93	ENTRY(GNU_call_site_parameter),
94	{}
95};
96
97
98static const uint32 kTagNameInfoCount = DW_TAG_immutable_type + 5;
99static const char* sTagNames[kTagNameInfoCount];
100
101static struct InitTagNames {
102	InitTagNames()
103	{
104		for (uint32 i = 0; kTagNameInfos[i].name != NULL; i++) {
105			const tag_name_info& info = kTagNameInfos[i];
106			if (info.tag <= DW_TAG_immutable_type)
107				sTagNames[info.tag] = info.name;
108			else {
109				sTagNames[DW_TAG_immutable_type + 1 + (info.tag
110						- DW_TAG_GNU_template_parameter_pack)] = info.name;
111			}
112		}
113	}
114} sInitTagNames;
115
116
117const char*
118get_entry_tag_name(uint16 tag)
119{
120	if (tag <= DW_TAG_immutable_type)
121		return sTagNames[tag];
122	else if (tag >= DW_TAG_GNU_template_parameter_pack
123		&& tag <= DW_TAG_GNU_call_site_parameter) {
124		return sTagNames[DW_TAG_immutable_type + 1 + (tag
125				- DW_TAG_GNU_template_parameter_pack)];
126	}
127
128	return NULL;
129}
130