From 1a90a58f486893187a70299a9d213e827e0b152e Mon Sep 17 00:00:00 2001 From: Philippe Houdoin Date: Thu, 25 Jun 2009 22:49:07 +0000 Subject: [PATCH] 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 --- .../kernel/debugger/demangle/demangle.cpp | 8 +- .../kernel/debugger/demangle/demangle.h | 9 ++ src/apps/debugger/demangler/Demangler.cpp | 95 ++++++++++++++++--- src/apps/debugger/demangler/Jamfile | 3 +- 4 files changed, 99 insertions(+), 16 deletions(-) diff --git a/src/add-ons/kernel/debugger/demangle/demangle.cpp b/src/add-ons/kernel/debugger/demangle/demangle.cpp index cf9919125f..dcff13c067 100644 --- a/src/add-ons/kernel/debugger/demangle/demangle.cpp +++ b/src/add-ons/kernel/debugger/demangle/demangle.cpp @@ -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 diff --git a/src/add-ons/kernel/debugger/demangle/demangle.h b/src/add-ons/kernel/debugger/demangle/demangle.h index c84b113f72..5eb41103f6 100644 --- a/src/add-ons/kernel/debugger/demangle/demangle.h +++ b/src/add-ons/kernel/debugger/demangle/demangle.h @@ -7,6 +7,14 @@ #include +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); diff --git a/src/apps/debugger/demangler/Demangler.cpp b/src/apps/debugger/demangler/Demangler.cpp index e6dc1f8c32..6ddf7af08e 100644 --- a/src/apps/debugger/demangler/Demangler.cpp +++ b/src/apps/debugger/demangler/Demangler.cpp @@ -3,6 +3,8 @@ * Distributed under the terms of the MIT License. */ +#include + #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; } diff --git a/src/apps/debugger/demangler/Jamfile b/src/apps/debugger/demangler/Jamfile index dfe049c047..e66ddc6e3f 100644 --- a/src/apps/debugger/demangler/Jamfile +++ b/src/apps/debugger/demangler/Jamfile @@ -12,7 +12,8 @@ SEARCH_SOURCE MergeObject Debugger_demangler.o : Demangler.cpp - + + demangle.cpp gcc2.cpp gcc3+.cpp ;