Reuse KDL demangler module demangle_symbol() and get_next_argument() to
improve userland Debugger arguments demangling support: now with argument name and/or type, when available. I hope I didn't break coding guideline doing so. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31243 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -17,7 +17,7 @@ looks_like_gcc3_symbol(const char* symbol)
|
||||
}
|
||||
|
||||
|
||||
static const char*
|
||||
const char*
|
||||
demangle_symbol(const char* mangledName, char* buffer, size_t bufferSize,
|
||||
bool* _isObjectMethod)
|
||||
{
|
||||
@@ -36,7 +36,7 @@ demangle_symbol(const char* mangledName, char* buffer, size_t bufferSize,
|
||||
}
|
||||
|
||||
|
||||
static status_t
|
||||
status_t
|
||||
get_next_argument(uint32* _cookie, const char* mangledName, char* name,
|
||||
size_t nameSize, int32* _type, size_t* _argumentLength)
|
||||
{
|
||||
@@ -54,6 +54,8 @@ get_next_argument(uint32* _cookie, const char* mangledName, char* name,
|
||||
}
|
||||
|
||||
|
||||
#ifdef _KERNEL_MODE
|
||||
|
||||
static status_t
|
||||
std_ops(int32 op, ...)
|
||||
{
|
||||
@@ -82,3 +84,5 @@ module_info* modules[] = {
|
||||
(module_info*)&sModuleInfo,
|
||||
NULL
|
||||
};
|
||||
|
||||
#endif // _KERNEL_MODE
|
||||
|
||||
@@ -7,6 +7,14 @@
|
||||
|
||||
#include <SupportDefs.h>
|
||||
|
||||
const char*
|
||||
demangle_symbol(const char* mangledName, char* buffer, size_t bufferSize,
|
||||
bool* _isObjectMethod);
|
||||
|
||||
status_t
|
||||
get_next_argument(uint32* _cookie, const char* mangledName, char* name,
|
||||
size_t nameSize, int32* _type, size_t* _argumentLength);
|
||||
|
||||
|
||||
// gcc 2
|
||||
const char* demangle_symbol_gcc2(const char* name, char* buffer,
|
||||
@@ -22,6 +30,7 @@ const char* demangle_symbol_gcc3(const char* name, char* buffer,
|
||||
status_t get_next_argument_gcc3(uint32* _cookie, const char* symbol,
|
||||
char* name, size_t nameSize, int32* _type,
|
||||
size_t* _argumentLength);
|
||||
|
||||
#ifndef _KERNEL_MODE
|
||||
const char* demangle_name_gcc3(const char* name, char* buffer,
|
||||
size_t bufferSize);
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
|
||||
#include <TypeConstants.h>
|
||||
|
||||
#include "Demangler.h"
|
||||
|
||||
#include "demangle.h"
|
||||
@@ -11,21 +13,88 @@
|
||||
/*static*/ BString
|
||||
Demangler::Demangle(const BString& mangledName)
|
||||
{
|
||||
BString demangledName;
|
||||
char buffer[1024];
|
||||
const char* demangled;
|
||||
|
||||
if (mangledName.Compare("_Z", 2) == 0) {
|
||||
demangled = demangle_name_gcc3(mangledName.String(), buffer,
|
||||
sizeof(buffer));
|
||||
if (demangled != NULL)
|
||||
return demangled;
|
||||
|
||||
demangled = demangle_symbol(mangledName.String(), buffer,
|
||||
sizeof(buffer), NULL);
|
||||
if (demangled == NULL)
|
||||
return mangledName;
|
||||
|
||||
demangledName << demangled << "(";
|
||||
|
||||
size_t length;
|
||||
int32 type, i = 0;
|
||||
uint32 cookie = 0;
|
||||
while (get_next_argument(&cookie, mangledName.String(), buffer,
|
||||
sizeof(buffer), &type, &length) == B_OK) {
|
||||
|
||||
if (i++ > 0)
|
||||
demangledName << ", ";
|
||||
|
||||
if (buffer[0]) {
|
||||
demangledName << buffer;
|
||||
continue;
|
||||
}
|
||||
|
||||
// unnamed argument: fallback to known type
|
||||
switch (type) {
|
||||
case B_ANY_TYPE:
|
||||
break;
|
||||
case B_INT64_TYPE:
|
||||
demangledName << "int64";
|
||||
break;
|
||||
case B_INT32_TYPE:
|
||||
demangledName << "int32";
|
||||
break;
|
||||
case B_INT16_TYPE:
|
||||
demangledName << "int16";
|
||||
break;
|
||||
case B_INT8_TYPE:
|
||||
demangledName << "int8";
|
||||
break;
|
||||
case B_UINT64_TYPE:
|
||||
demangledName << "uint64";
|
||||
break;
|
||||
case B_UINT32_TYPE:
|
||||
demangledName << "uint32";
|
||||
break;
|
||||
case B_UINT16_TYPE:
|
||||
demangledName << "uint16";
|
||||
break;
|
||||
case B_UINT8_TYPE:
|
||||
demangledName << "uint8";
|
||||
break;
|
||||
case B_BOOL_TYPE:
|
||||
demangledName << "bool";
|
||||
break;
|
||||
case B_CHAR_TYPE:
|
||||
demangledName << "char";
|
||||
break;
|
||||
case B_FLOAT_TYPE:
|
||||
demangledName << "float";
|
||||
break;
|
||||
case B_DOUBLE_TYPE:
|
||||
demangledName << "double";
|
||||
break;
|
||||
case B_POINTER_TYPE:
|
||||
// TODO: use length as hint on pointer type
|
||||
demangledName << "void*";
|
||||
break;
|
||||
case B_REF_TYPE:
|
||||
// TODO: use length as hint on reference type
|
||||
demangledName << "&";
|
||||
break;
|
||||
case B_STRING_TYPE:
|
||||
demangledName << "char*";
|
||||
break;
|
||||
default:
|
||||
demangledName << "?";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// fallback is gcc2
|
||||
demangled = demangle_symbol_gcc2(mangledName.String(), buffer,
|
||||
sizeof(buffer), NULL);
|
||||
if (demangled != NULL)
|
||||
return demangled;
|
||||
|
||||
return mangledName;
|
||||
demangledName << ")";
|
||||
return demangledName;
|
||||
}
|
||||
|
||||
@@ -12,7 +12,8 @@ SEARCH_SOURCE
|
||||
MergeObject Debugger_demangler.o
|
||||
:
|
||||
Demangler.cpp
|
||||
|
||||
|
||||
demangle.cpp
|
||||
gcc2.cpp
|
||||
gcc3+.cpp
|
||||
;
|
||||
|
||||
Reference in New Issue
Block a user