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:
Philippe Houdoin
2009-06-25 22:49:07 +00:00
parent 6f2bdd6354
commit 1a90a58f48
4 changed files with 99 additions and 16 deletions
@@ -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);
+82 -13
View File
@@ -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;
}
+2 -1
View File
@@ -12,7 +12,8 @@ SEARCH_SOURCE
MergeObject Debugger_demangler.o
:
Demangler.cpp
demangle.cpp
gcc2.cpp
gcc3+.cpp
;