From 1e18935513af0d3948af1feaa1eaa5d0adc60949 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Thu, 11 Jul 2024 20:38:22 +0200 Subject: [PATCH] impr: Handle demangling of identifiers without leading underscore --- plugins/builtin/CMakeLists.txt | 2 ++ .../include/content/helpers/demangle.hpp | 9 +++++++++ .../source/content/command_line_interface.cpp | 3 ++- .../builtin/source/content/helpers/demangle.cpp | 17 +++++++++++++++++ .../source/content/pl_builtin_functions.cpp | 4 ++-- .../builtin/source/content/tools/demangler.cpp | 4 ++-- .../builtin/source/content/views/view_find.cpp | 6 +++--- 7 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 plugins/builtin/include/content/helpers/demangle.hpp create mode 100644 plugins/builtin/source/content/helpers/demangle.cpp diff --git a/plugins/builtin/CMakeLists.txt b/plugins/builtin/CMakeLists.txt index 80c6c9405..38a488ec2 100644 --- a/plugins/builtin/CMakeLists.txt +++ b/plugins/builtin/CMakeLists.txt @@ -48,6 +48,8 @@ add_imhex_plugin( source/content/window_decoration.cpp source/content/data_information_sections.cpp + source/content/helpers/demangle.cpp + source/content/data_processor_nodes/basic_nodes.cpp source/content/data_processor_nodes/control_nodes.cpp source/content/data_processor_nodes/decode_nodes.cpp diff --git a/plugins/builtin/include/content/helpers/demangle.hpp b/plugins/builtin/include/content/helpers/demangle.hpp new file mode 100644 index 000000000..e5c0d8213 --- /dev/null +++ b/plugins/builtin/include/content/helpers/demangle.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include + +namespace hex::plugin::builtin { + + std::string demangle(const std::string &mangled); + +} \ No newline at end of file diff --git a/plugins/builtin/source/content/command_line_interface.cpp b/plugins/builtin/source/content/command_line_interface.cpp index aceba8b35..bfc1bdd85 100644 --- a/plugins/builtin/source/content/command_line_interface.cpp +++ b/plugins/builtin/source/content/command_line_interface.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -348,7 +349,7 @@ namespace hex::plugin::builtin { std::exit(EXIT_FAILURE); } - log::println("{}", llvm::demangle(args[0])); + log::println("{}", hex::plugin::builtin::demangle(args[0])); std::exit(EXIT_SUCCESS); } diff --git a/plugins/builtin/source/content/helpers/demangle.cpp b/plugins/builtin/source/content/helpers/demangle.cpp new file mode 100644 index 000000000..6f95720eb --- /dev/null +++ b/plugins/builtin/source/content/helpers/demangle.cpp @@ -0,0 +1,17 @@ +#include +#include + +namespace hex::plugin::builtin { + + std::string demangle(const std::string &mangled) { + std::string result = llvm::demangle(mangled); + if (result.empty() || result == mangled) + result = llvm::demangle("_" + mangled); + + if (result.empty() || result == ("_" + mangled)) + result = mangled; + + return result; + } + +} \ No newline at end of file diff --git a/plugins/builtin/source/content/pl_builtin_functions.cpp b/plugins/builtin/source/content/pl_builtin_functions.cpp index d2ec0c461..6779264a9 100644 --- a/plugins/builtin/source/content/pl_builtin_functions.cpp +++ b/plugins/builtin/source/content/pl_builtin_functions.cpp @@ -7,7 +7,7 @@ #include #include -#include +#include #include namespace hex::plugin::builtin { @@ -75,7 +75,7 @@ namespace hex::plugin::builtin { ContentRegistry::PatternLanguage::addFunction(nsHexDec, "demangle", FunctionParameterCount::exactly(1), [](Evaluator *, auto params) -> std::optional { const auto mangledString = params[0].toString(false); - return llvm::demangle(mangledString); + return hex::plugin::builtin::demangle(mangledString); }); } diff --git a/plugins/builtin/source/content/tools/demangler.cpp b/plugins/builtin/source/content/tools/demangler.cpp index a11cf3498..cb3ff62c2 100644 --- a/plugins/builtin/source/content/tools/demangler.cpp +++ b/plugins/builtin/source/content/tools/demangler.cpp @@ -1,7 +1,7 @@ #include #include -#include +#include #include #include @@ -31,7 +31,7 @@ namespace hex::plugin::builtin { static float prevWindowWidth; if (ImGui::InputTextWithHint("hex.builtin.tools.demangler.mangled"_lang, "Itanium, MSVC, Dlang & Rust", mangledName)) { - demangledName = llvm::demangle(mangledName); + demangledName = hex::plugin::builtin::demangle(mangledName); if (demangledName == mangledName) { demangledName = "???"; diff --git a/plugins/builtin/source/content/views/view_find.cpp b/plugins/builtin/source/content/views/view_find.cpp index 29cea9980..8abb226ae 100644 --- a/plugins/builtin/source/content/views/view_find.cpp +++ b/plugins/builtin/source/content/views/view_find.cpp @@ -12,7 +12,7 @@ #include #include -#include +#include #include namespace hex::plugin::builtin { @@ -68,7 +68,7 @@ namespace hex::plugin::builtin { ImGui::TableNextColumn(); ImGuiExt::TextFormatted("[ 0x{:08X} - 0x{:08X} ]", region.getStartAddress(), region.getEndAddress()); - auto demangledValue = llvm::demangle(value); + auto demangledValue = hex::plugin::builtin::demangle(value); if (value != demangledValue) { ImGui::TableNextRow(); @@ -602,7 +602,7 @@ namespace hex::plugin::builtin { if (ImGui::MenuItem("hex.builtin.view.find.context.copy"_lang)) ImGui::SetClipboardText(value.c_str()); if (ImGui::MenuItem("hex.builtin.view.find.context.copy_demangle"_lang)) - ImGui::SetClipboardText(llvm::demangle(value).c_str()); + ImGui::SetClipboardText(hex::plugin::builtin::demangle(value).c_str()); if (ImGui::BeginMenu("hex.builtin.view.find.context.replace"_lang)) { if (ImGui::BeginTabBar("##replace_tabs")) { if (ImGui::BeginTabItem("hex.builtin.view.find.context.replace.hex"_lang)) {