1/*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Copyright 2013-2014, Rene Gollent, rene@gollent.com.
4 * Distributed under the terms of the MIT License.
5 */
6#ifndef DWARF_UTILS_H
7#define DWARF_UTILS_H
8
9#include "DebugInfoEntries.h"
10
11
12class BString;
13class DebugInfoEntry;
14class DwarfFile;
15
16
17class DwarfUtils {
18public:
19	static	void				GetDIEName(const DebugInfoEntry* entry,
20									BString& _name);
21	static	void				GetDIETypeName(const DebugInfoEntry* entry,
22									BString& _name,
23									const DebugInfoEntry*
24										requestingEntry = NULL);
25	static	void				GetFullDIEName(const DebugInfoEntry* entry,
26									BString& _name);
27	static	void				GetFullyQualifiedDIEName(
28									const DebugInfoEntry* entry,
29									BString& _name,
30									const DebugInfoEntry*
31										requestingEntry = NULL);
32
33	static	bool				GetDeclarationLocation(DwarfFile* dwarfFile,
34									const DebugInfoEntry* entry,
35									const char*& _directory,
36									const char*& _file,
37									int32& _line, int32& _column);
38
39	template<typename EntryType, typename Predicate>
40	static	EntryType*			GetDIEByPredicate(EntryType* entry,
41									const Predicate& predicate);
42};
43
44
45template<typename EntryType, typename Predicate>
46/*static*/ EntryType*
47DwarfUtils::GetDIEByPredicate(EntryType* entry, const Predicate& predicate)
48{
49	if (predicate(entry))
50		return entry;
51
52	// try the abstract origin
53	if (EntryType* abstractOrigin = dynamic_cast<EntryType*>(
54			entry->AbstractOrigin())) {
55		entry = abstractOrigin;
56		if (predicate(entry))
57			return entry;
58	}
59
60	// try the specification
61	if (EntryType* specification = dynamic_cast<EntryType*>(
62			entry->Specification())) {
63		entry = specification;
64		if (predicate(entry))
65			return entry;
66	}
67
68	// try the type unit signature
69	if (EntryType* signature = dynamic_cast<EntryType*>(
70			entry->SignatureType())) {
71		entry = signature;
72		if (predicate(entry))
73			return entry;
74	}
75
76	return NULL;
77}
78
79
80#endif	// DWARF_UTILS_H
81