diff options
| author | lizzie <lizzie@eden-emu.dev> | 2026-06-03 22:53:09 +0200 |
|---|---|---|
| committer | crueter <crueter@eden-emu.dev> | 2026-06-03 22:53:09 +0200 |
| commit | f729dbb3c3fbf30f06ff7c986f1a6761e3fb598f (patch) | |
| tree | b3369f3de816f743af5b7920cf69ef4c69fbe471 | |
| parent | ec2b9b04001ebea637f01273ac8e6c17b2cc8390 (diff) | |
[common] use abi::__cxa_demangle for demangling using the system's glibcxx/libc++ (#3894)
most stdlibc++ already provide this functionality out of the box, very consistently and well implemented (usually)
my main irk is that the llvm itanium demangle is totally unescesary when there is a perfectly stable, tested and well documented equivalent functionality in the standard stdc++ provided in most UNIX oses
its mostly to reduce binary size by a very thin margin, but he stdc++ is more than capable of doing he same behaviour we use a dpeendency for
for mingw or such howeger,, demangling becomies trickier so we have to exclude windows entirely because well windows likes to do things differently dont they
Signed-off-by: lizzie <lizzie@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3894
Reviewed-by: crueter <crueter@eden-emu.dev>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
| -rw-r--r-- | CMakeModules/FindLLVM.cmake | 6 | ||||
| -rw-r--r-- | externals/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | src/common/CMakeLists.txt | 7 | ||||
| -rw-r--r-- | src/common/demangle.cpp | 42 | ||||
| -rw-r--r-- | src/common/demangle.h | 3 |
5 files changed, 44 insertions, 18 deletions
diff --git a/CMakeModules/FindLLVM.cmake b/CMakeModules/FindLLVM.cmake index 8dc064d5d1..f169f134d5 100644 --- a/CMakeModules/FindLLVM.cmake +++ b/CMakeModules/FindLLVM.cmake @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + # SPDX-FileCopyrightText: 2023 Alexandre Bouvier <contact@amb.tf> # # SPDX-License-Identifier: GPL-3.0-or-later @@ -13,7 +16,8 @@ endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(LLVM HANDLE_COMPONENTS CONFIG_MODE) -if (LLVM_FOUND AND LLVM_Demangle_FOUND AND NOT TARGET LLVM::Demangle) +# Demangle only for Windows targets +if (WIN32 AND LLVM_FOUND AND LLVM_Demangle_FOUND AND NOT TARGET LLVM::Demangle) add_library(LLVM::Demangle INTERFACE IMPORTED) target_compile_definitions(LLVM::Demangle INTERFACE ${LLVM_DEFINITIONS}) target_include_directories(LLVM::Demangle INTERFACE ${LLVM_INCLUDE_DIRS}) diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 1aaa4c57ca..d4ac807322 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -49,8 +49,8 @@ if (NOT TARGET stb::headers) add_library(stb::headers ALIAS stb) endif() -# ItaniumDemangle -if (NOT TARGET LLVM::Demangle) +# ItaniumDemangle (Windows only) +if (WIN32 AND NOT TARGET LLVM::Demangle) add_library(demangle demangle/ItaniumDemangle.cpp) target_include_directories(demangle PUBLIC ./demangle) if (NOT MSVC) diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 5896ae4d1f..b462107bcd 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -243,7 +243,12 @@ if (lz4_ADDED) endif() target_link_libraries(common PUBLIC fmt::fmt stb::headers Threads::Threads unordered_dense::unordered_dense) -target_link_libraries(common PRIVATE lz4::lz4 LLVM::Demangle zstd::zstd) +target_link_libraries(common PRIVATE lz4::lz4 zstd::zstd) + +# Please refer to src/common/demangle.cpp +if (WIN32) + target_link_libraries(common PRIVATE LLVM::Demangle) +endif() if(ANDROID) # For ASharedMemory_create diff --git a/src/common/demangle.cpp b/src/common/demangle.cpp index 8cb8c35515..8f76a884a8 100644 --- a/src/common/demangle.cpp +++ b/src/common/demangle.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -6,30 +6,44 @@ #include <string> #include <string_view> +#ifdef _WIN32 #include <llvm/Demangle/Demangle.h> - +#else +#include <cxxabi.h> +#endif #include "common/demangle.h" -#include "common/scope_exit.h" -namespace Common { +static bool IsItanium(std::string_view name) { + // A valid Itanium encoding requires 1-4 leading underscores, followed by 'Z'. + auto const pos = name.find_first_not_of('_'); + return pos > 0 && pos <= 4 && pos < name.size() && name[pos] == 'Z'; +} +namespace Common { std::string DemangleSymbol(const std::string& mangled) { if (mangled.size() > 0) { - auto const is_itanium = [](std::string_view name) -> bool { - // A valid Itanium encoding requires 1-4 leading underscores, followed by 'Z'. - auto const pos = name.find_first_not_of('_'); - return pos > 0 && pos <= 4 && pos < name.size() && name[pos] == 'Z'; - }; - std::string ret = mangled; - if (is_itanium(mangled)) { + if (IsItanium(mangled)) { +#ifdef _WIN32 + // requires the use of llvm if (char* p = llvm::itaniumDemangle(mangled); p != nullptr) { - ret = std::string{p}; + std::string ret = std::string{p}; std::free(p); + return ret; } +#else + // can safely use libc++ and glibcxx provided demangling functions + // it's available since 2008(!) so no system should have issues with it + // see https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a01696.html + int status; + if (char* p = abi::__cxa_demangle(mangled.c_str(), NULL, NULL, &status); p != nullptr) { + std::string ret = std::string{p}; + std::free(p); + return ret; + } +#endif } - return ret; + return mangled; } return std::string{}; } - } // namespace Common diff --git a/src/common/demangle.h b/src/common/demangle.h index f072d22f33..c96f14ff42 100644 --- a/src/common/demangle.h +++ b/src/common/demangle.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later |
