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, demangle_symbol(const char* mangledName, char* buffer, size_t bufferSize,
bool* _isObjectMethod) 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, get_next_argument(uint32* _cookie, const char* mangledName, char* name,
size_t nameSize, int32* _type, size_t* _argumentLength) 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 static status_t
std_ops(int32 op, ...) std_ops(int32 op, ...)
{ {
@@ -82,3 +84,5 @@ module_info* modules[] = {
(module_info*)&sModuleInfo, (module_info*)&sModuleInfo,
NULL NULL
}; };
#endif // _KERNEL_MODE
@@ -7,6 +7,14 @@
#include <SupportDefs.h> #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 // gcc 2
const char* demangle_symbol_gcc2(const char* name, char* buffer, 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, status_t get_next_argument_gcc3(uint32* _cookie, const char* symbol,
char* name, size_t nameSize, int32* _type, char* name, size_t nameSize, int32* _type,
size_t* _argumentLength); size_t* _argumentLength);
#ifndef _KERNEL_MODE #ifndef _KERNEL_MODE
const char* demangle_name_gcc3(const char* name, char* buffer, const char* demangle_name_gcc3(const char* name, char* buffer,
size_t bufferSize); size_t bufferSize);
+82 -13
View File
@@ -3,6 +3,8 @@
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
*/ */
#include <TypeConstants.h>
#include "Demangler.h" #include "Demangler.h"
#include "demangle.h" #include "demangle.h"
@@ -11,21 +13,88 @@
/*static*/ BString /*static*/ BString
Demangler::Demangle(const BString& mangledName) Demangler::Demangle(const BString& mangledName)
{ {
BString demangledName;
char buffer[1024]; char buffer[1024];
const char* demangled; const char* demangled;
if (mangledName.Compare("_Z", 2) == 0) { demangled = demangle_symbol(mangledName.String(), buffer,
demangled = demangle_name_gcc3(mangledName.String(), buffer, sizeof(buffer), NULL);
sizeof(buffer)); if (demangled == NULL)
if (demangled != NULL) return mangledName;
return demangled;
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 demangledName << ")";
demangled = demangle_symbol_gcc2(mangledName.String(), buffer, return demangledName;
sizeof(buffer), NULL);
if (demangled != NULL)
return demangled;
return mangledName;
} }
+2 -1
View File
@@ -12,7 +12,8 @@ SEARCH_SOURCE
MergeObject Debugger_demangler.o MergeObject Debugger_demangler.o
: :
Demangler.cpp Demangler.cpp
demangle.cpp
gcc2.cpp gcc2.cpp
gcc3+.cpp gcc3+.cpp
; ;