1/*
2 * Copyright 2009-2011, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6#include "demangle.h"
7
8#include <string.h>
9
10#ifdef _KERNEL_MODE
11#	include <debug.h>
12#endif
13
14
15static inline bool
16looks_like_gcc3_symbol(const char* symbol)
17{
18	return strncmp(symbol, "_Z", 2) == 0;
19}
20
21
22const char*
23demangle_symbol(const char* mangledName, char* buffer, size_t bufferSize,
24	bool* _isObjectMethod)
25{
26	// try the gcc3 demangler, if it looks like a gcc3 symbol
27	const char* demangled = NULL;
28	if (looks_like_gcc3_symbol(mangledName)) {
29		demangled = demangle_symbol_gcc3(mangledName, buffer, bufferSize,
30			_isObjectMethod);
31		if (demangled != NULL)
32			return demangled;
33	}
34
35	// fallback is gcc2
36	return demangle_symbol_gcc2(mangledName, buffer, bufferSize,
37		_isObjectMethod);
38}
39
40
41status_t
42get_next_argument(uint32* _cookie, const char* mangledName, char* name,
43	size_t nameSize, int32* _type, size_t* _argumentLength)
44{
45	// try the gcc3 demangler, if it looks like a gcc3 symbol
46	if (looks_like_gcc3_symbol(mangledName)) {
47		status_t error = get_next_argument_gcc3(_cookie, mangledName, name,
48			nameSize, _type, _argumentLength);
49		if (error == B_OK || error == B_BAD_INDEX)
50			return error;
51	}
52
53	// fallback is gcc2
54	return get_next_argument_gcc2(_cookie, mangledName, name, nameSize, _type,
55		_argumentLength);
56}
57
58
59#ifdef _KERNEL_MODE
60
61static status_t
62std_ops(int32 op, ...)
63{
64	switch (op) {
65		case B_MODULE_INIT:
66		case B_MODULE_UNINIT:
67			return B_OK;
68	}
69
70	return B_BAD_VALUE;
71}
72
73
74static struct debugger_demangle_module_info sModuleInfo = {
75	{
76		"debugger/demangle/v1",
77		0,
78		std_ops
79	},
80
81	demangle_symbol,
82	get_next_argument,
83};
84
85module_info* modules[] = {
86	(module_info*)&sModuleInfo,
87	NULL
88};
89
90#endif // _KERNEL_MODE
91