1/*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef DEBUG_INFO_ENTRY_H
6#define DEBUG_INFO_ENTRY_H
7
8#include <String.h>
9
10#include <util/DoublyLinkedList.h>
11
12#include "Types.h"
13
14
15#define DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(name)	\
16	virtual	status_t			AddAttribute_##name(uint16 attributeName, \
17									const AttributeValue& value);
18
19enum {
20	ATTRIBUTE_NOT_HANDLED	= 1,
21	ENTRY_NOT_HANDLED		= 2
22};
23
24
25struct AttributeValue;
26struct ConstantAttributeValue;
27struct DeclarationLocation;
28struct DynamicAttributeValue;
29struct LocationDescription;
30struct MemberLocation;
31struct SourceLanguageInfo;
32
33
34struct DebugInfoEntryInitInfo {
35	const SourceLanguageInfo*	languageInfo;
36};
37
38
39class DebugInfoEntry : public DoublyLinkedListLinkImpl<DebugInfoEntry> {
40public:
41								DebugInfoEntry();
42	virtual						~DebugInfoEntry();
43
44	virtual	status_t			InitAfterHierarchy(
45									DebugInfoEntryInitInfo& info);
46	virtual	status_t			InitAfterAttributes(
47									DebugInfoEntryInitInfo& info);
48
49	virtual	uint16				Tag() const = 0;
50
51			DebugInfoEntry*		Parent() const	{ return fParent; }
52			void				SetParent(DebugInfoEntry* parent);
53
54	virtual	bool				IsType() const;
55	virtual	bool				IsNamespace() const;
56									// a namespace-like thingy (namespace,
57									// class, ...)
58
59	virtual	const char*			Name() const;
60	virtual	const char*			Description() const;
61	virtual	DebugInfoEntry*		Specification() const;
62	virtual	DebugInfoEntry*		AbstractOrigin() const;
63	virtual	LocationDescription* GetLocationDescription();
64
65			bool				GetDeclarationFile(uint32& _file) const;
66			bool				GetDeclarationLine(uint32& _line) const;
67			bool				GetDeclarationColumn(uint32& _column) const;
68
69	virtual	status_t			AddChild(DebugInfoEntry* child);
70
71	virtual	status_t			AddAttribute_decl_file(uint16 attributeName,
72									const AttributeValue& value);
73	virtual	status_t			AddAttribute_decl_line(uint16 attributeName,
74									const AttributeValue& value);
75	virtual	status_t			AddAttribute_decl_column(uint16 attributeName,
76									const AttributeValue& value);
77	virtual	status_t			AddAttribute_location(uint16 attributeName,
78									const AttributeValue& value);
79	virtual	status_t			AddAttribute_sibling(uint16 attributeName,
80									const AttributeValue& value);
81
82// TODO: Handle (ignore?) DW_AT_description here?
83
84	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(name)
85	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(ordering)
86	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(byte_size)
87	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(bit_offset)
88	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(bit_size)
89	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(stmt_list)
90	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(low_pc)
91	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(high_pc)
92	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(language)
93	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(discr)
94	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(discr_value)
95	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(visibility)
96	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(import)
97	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(string_length)
98	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(common_reference)
99	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(comp_dir)
100	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(const_value)
101	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(containing_type)
102	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(default_value)
103	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(inline)
104	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(is_optional)
105	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(lower_bound)
106	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(producer)
107	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(prototyped)
108	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(return_addr)
109	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(start_scope)
110	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(bit_stride)
111	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(upper_bound)
112	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(abstract_origin)
113	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(accessibility)
114	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(address_class)
115	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(artificial)
116	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(base_types)
117	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(calling_convention)
118	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(count)
119	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(data_member_location)
120	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(declaration)
121	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(discr_list)
122	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(encoding)
123	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(external)
124	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(frame_base)
125	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(friend)
126	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(identifier_case)
127	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(macro_info)
128	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(namelist_item)
129	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(priority)
130	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(segment)
131	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(specification)
132	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(static_link)
133	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(type)
134	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(use_location)
135	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(variable_parameter)
136	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(virtuality)
137	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(vtable_elem_location)
138	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(allocated)
139	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(associated)
140	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(data_location)
141	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(byte_stride)
142	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(entry_pc)
143	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(use_UTF8)
144	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(extension)
145	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(ranges)
146	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(trampoline)
147	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(call_column)
148	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(call_file)
149	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(call_line)
150	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(description)
151	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(binary_scale)
152	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(decimal_scale)
153	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(small)
154	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(decimal_sign)
155	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(digit_count)
156	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(picture_string)
157	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(mutable)
158	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(threads_scaled)
159	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(explicit)
160	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(object_pointer)
161	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(endianity)
162	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(elemental)
163	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(pure)
164	DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(recursive)
165
166protected:
167	virtual	DeclarationLocation* GetDeclarationLocation();
168
169			status_t	 		SetDynamicAttributeValue(
170									DynamicAttributeValue& toSet,
171									const AttributeValue& value);
172			status_t	 		SetConstantAttributeValue(
173									ConstantAttributeValue& toSet,
174									const AttributeValue& value);
175			status_t	 		SetMemberLocation(MemberLocation& toSet,
176									const AttributeValue& value);
177
178protected:
179			DebugInfoEntry*		fParent;
180};
181
182
183typedef DoublyLinkedList<DebugInfoEntry> DebugInfoEntryList;
184
185
186#endif	// DEBUG_INFO_ENTRY_H
187