From cba41432170dc9fdc61c53e7ba80e41c0ff2b797 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sat, 20 Jun 2009 18:45:20 +0000 Subject: [PATCH] Added demangling support. Only implemented for gcc 4 yet. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31146 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/debugger/Jamfile | 3 +++ .../debugger/debug_info/DebuggerDebugInfo.cpp | 5 ++-- src/apps/debugger/demangler/Demangler.cpp | 25 +++++++++++++++++++ src/apps/debugger/demangler/Demangler.h | 17 +++++++++++++ src/apps/debugger/demangler/Jamfile | 17 +++++++++++++ 5 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 src/apps/debugger/demangler/Demangler.cpp create mode 100644 src/apps/debugger/demangler/Demangler.h create mode 100644 src/apps/debugger/demangler/Jamfile diff --git a/src/apps/debugger/Jamfile b/src/apps/debugger/Jamfile index dcd6f0807b..cea43c57d4 100644 --- a/src/apps/debugger/Jamfile +++ b/src/apps/debugger/Jamfile @@ -16,6 +16,7 @@ SEARCH_SOURCE += [ FDirName $(SUBDIR) model ] ; local debugAnalyzerSources = [ FDirName $(HAIKU_TOP) src apps debuganalyzer ] ; +SubDirHdrs [ FDirName $(SUBDIR) demangler ] ; SubDirHdrs [ FDirName $(HAIKU_TOP) src bin debug ] ; SubDirHdrs [ FDirName $(debugAnalyzerSources) gui ] ; @@ -75,6 +76,7 @@ Application Debugger : # tag_names.cpp : + Debugger_demangler.o DebugAnalyzer_gui_table.o debug_utils.a @@ -87,4 +89,5 @@ Application Debugger : : Debugger.rdef ; +HaikuSubInclude demangler ; HaikuSubInclude gui running_teams_window ; diff --git a/src/apps/debugger/debug_info/DebuggerDebugInfo.cpp b/src/apps/debugger/debug_info/DebuggerDebugInfo.cpp index bcd221134e..6a5ef8ff66 100644 --- a/src/apps/debugger/debug_info/DebuggerDebugInfo.cpp +++ b/src/apps/debugger/debug_info/DebuggerDebugInfo.cpp @@ -9,6 +9,7 @@ #include "BasicFunctionDebugInfo.h" #include "DebuggerInterface.h" +#include "Demangler.h" #include "SymbolInfo.h" @@ -72,8 +73,8 @@ DebuggerDebugInfo::FindFunction(target_addr_t address) return NULL; return new(std::nothrow) BasicFunctionDebugInfo(this, symbolInfo->Address(), - symbolInfo->Size(), symbolInfo->Name(), symbolInfo->Name()); - // TODO: Demangle! + symbolInfo->Size(), symbolInfo->Name(), + Demangler::Demangle(symbolInfo->Name())); } diff --git a/src/apps/debugger/demangler/Demangler.cpp b/src/apps/debugger/demangler/Demangler.cpp new file mode 100644 index 0000000000..c547ed7714 --- /dev/null +++ b/src/apps/debugger/demangler/Demangler.cpp @@ -0,0 +1,25 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ + +#include "Demangler.h" + +#include "demangle.h" + + +/*static*/ BString +Demangler::Demangle(const BString& mangledName) +{ + char buffer[1024]; + if (mangledName.Compare("_Z", 2) == 0) { + const char* demangled = demangle_name_gcc3(mangledName.String(), buffer, + sizeof(buffer)); + if (demangled != NULL) + return demangled; + } + + // TODO: gcc2 demangling! + + return mangledName; +} diff --git a/src/apps/debugger/demangler/Demangler.h b/src/apps/debugger/demangler/Demangler.h new file mode 100644 index 0000000000..bda5bc2468 --- /dev/null +++ b/src/apps/debugger/demangler/Demangler.h @@ -0,0 +1,17 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ +#ifndef DEMANGLER_H +#define DEMANGLER_H + +#include + + +class Demangler { +public: + static BString Demangle(const BString& mangledName); +}; + + +#endif // DEMANGLER_H diff --git a/src/apps/debugger/demangler/Jamfile b/src/apps/debugger/demangler/Jamfile new file mode 100644 index 0000000000..8eb47bb6c0 --- /dev/null +++ b/src/apps/debugger/demangler/Jamfile @@ -0,0 +1,17 @@ +SubDir HAIKU_TOP src apps debugger demangler ; + +CCFLAGS += -Werror ; +C++FLAGS += -Werror ; + +UsePrivateHeaders kernel ; + +SEARCH_SOURCE + += [ FDirName $(HAIKU_TOP) src add-ons kernel debugger demangle ] ; + + +MergeObject Debugger_demangler.o + : + Demangler.cpp + + gcc3+.cpp +;