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,
|
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);
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
;
|
;
|
||||||
|
|||||||
Reference in New Issue
Block a user