From bb6916c395fd1e435b1f9a0001966869cd8c1cfe Mon Sep 17 00:00:00 2001 From: Michael Buch Date: Wed, 1 Oct 2025 10:29:21 +0100 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=8D=92=20[lldb][Mangled][NFC]=20Remov?= =?UTF-8?q?e=20redundant=20const-qualifier=20on=20llvm::StringRef=20argume?= =?UTF-8?q?nt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 5c50bdcea3977672d1183ee69cb840498f2fcf15) --- lldb/include/lldb/Core/Mangled.h | 2 +- lldb/source/Core/Mangled.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lldb/include/lldb/Core/Mangled.h b/lldb/include/lldb/Core/Mangled.h index 5a6e3ac2e4974..71ffd6bcc0c6b 100644 --- a/lldb/include/lldb/Core/Mangled.h +++ b/lldb/include/lldb/Core/Mangled.h @@ -257,7 +257,7 @@ class Mangled { /// \return /// eManglingSchemeNone if no known mangling scheme could be identified /// for s, otherwise the enumerator for the mangling scheme detected. - static Mangled::ManglingScheme GetManglingScheme(llvm::StringRef const name); + static Mangled::ManglingScheme GetManglingScheme(llvm::StringRef name); static bool IsMangledName(llvm::StringRef name); diff --git a/lldb/source/Core/Mangled.cpp b/lldb/source/Core/Mangled.cpp index d67c5b07e650b..e147cce4842e4 100644 --- a/lldb/source/Core/Mangled.cpp +++ b/lldb/source/Core/Mangled.cpp @@ -49,7 +49,7 @@ bool Mangled::IsMangledName(llvm::StringRef name) { return Mangled::GetManglingScheme(name) != Mangled::eManglingSchemeNone; } -Mangled::ManglingScheme Mangled::GetManglingScheme(llvm::StringRef const name) { +Mangled::ManglingScheme Mangled::GetManglingScheme(llvm::StringRef name) { if (name.empty()) return Mangled::eManglingSchemeNone; From b8be76cafc75c322397c374de2f9b1c84cf62a1e Mon Sep 17 00:00:00 2001 From: Michael Buch Date: Wed, 1 Oct 2025 13:07:21 +0100 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=8D=92=20[lldb][CPlusPlusLanguage]=20?= =?UTF-8?q?Avoid=20redundant=20const=20char*=20->=20StringRef=20roundtrip?= =?UTF-8?q?=20(#161499)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We've been seen (very sporadic) lifetime issues around this area. Here's an example backtrace: ``` [ 8] 0x0000000188e56743 libsystem_platform.dylib`_sigtramp + 55 [ 9] 0x00000001181e041f LLDB`lldb_private::CPlusPlusLanguage::SymbolNameFitsToLanguage(lldb_private::Mangled) const [inlined] unsigned long std::1::constexpr_strlen[abi:nn200100](char const*) + 7 at constexpr_c_functions.h:63:10 [ 9] 0x00000001181e0418 LLDB`lldb_private::CPlusPlusLanguage::SymbolNameFitsToLanguage(lldb_private::Mangled) const [inlined] std::__1::char_traits::length[abi:nn200100](char const*) at char_traits.h:232:12 [ 9] 0x00000001181e0418 LLDB`lldb_private::CPlusPlusLanguage::SymbolNameFitsToLanguage(lldb_private::Mangled) const [inlined] llvm::StringRef::StringRef(char const*) at StringRef.h:90:33 [ 9] 0x00000001181e0418 LLDB`lldb_private::CPlusPlusLanguage::SymbolNameFitsToLanguage(lldb_private::Mangled) const [inlined] llvm::StringRef::StringRef(char const*) at StringRef.h:92:38 [ 9] 0x00000001181e0418 LLDB`lldb_private::CPlusPlusLanguage::SymbolNameFitsToLanguage(lldb_private::Mangled) const + 20 at CPlusPlusLanguage.cpp:68:62 ``` Looks like we're calling `strlen` on a nullptr. I stared at this codepath for a while but am still not sure how that could happen unless the underlying `ConstString` somehow pointed to corrupted data. But `SymbolNameFitsToLanguage` does some roundtripping through a `const char*` before calling `GetManglingScheme`. No other callsite does this and it just seems redundant. This patch cleans this up. rdar://161128180 (cherry picked from commit 2a96d19ab01a4b5d992f492233f6a21d1e7cc4e0) --- .../Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 60b50c2e25cab..6e8a2d9379b68 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -103,10 +103,10 @@ CPlusPlusLanguage::GetFunctionNameInfo(ConstString name) const { } bool CPlusPlusLanguage::SymbolNameFitsToLanguage(Mangled mangled) const { - const char *mangled_name = mangled.GetMangledName().GetCString(); - auto mangling_scheme = Mangled::GetManglingScheme(mangled_name); - return mangled_name && (mangling_scheme == Mangled::eManglingSchemeItanium || - mangling_scheme == Mangled::eManglingSchemeMSVC); + auto mangling_scheme = + Mangled::GetManglingScheme(mangled.GetMangledName().GetStringRef()); + return mangling_scheme == Mangled::eManglingSchemeItanium || + mangling_scheme == Mangled::eManglingSchemeMSVC; } ConstString CPlusPlusLanguage::GetDemangledFunctionNameWithoutArguments( From a98fd2888b1e2675f8da8e05dd3a6ec9d3fdee0e Mon Sep 17 00:00:00 2001 From: Michael Buch Date: Wed, 1 Oct 2025 13:13:23 +0100 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=8D=92=20[lldb][NFCI]=20Remove=20the?= =?UTF-8?q?=20non-const=20reference=20Mangled::GetMangledName=20accessor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We've been seen (very sporadic) lifetime issues around this area. We noticed that GetMangledName has two accessors, one of which returns a non-const reference. I audited all the callsites and no users of this overload actually mutate the ConstString itself (which is a suspicious thing to do anyway since it's just a wrapper around a const char*). This patch removes the redundant overload. rdar://161128180 --- lldb/include/lldb/Core/Mangled.h | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/lldb/include/lldb/Core/Mangled.h b/lldb/include/lldb/Core/Mangled.h index 71ffd6bcc0c6b..246011f18969f 100644 --- a/lldb/include/lldb/Core/Mangled.h +++ b/lldb/include/lldb/Core/Mangled.h @@ -153,13 +153,7 @@ class Mangled { /// Mangled name get accessor. /// /// \return - /// A reference to the mangled name string object. - ConstString &GetMangledName() { return m_mangled; } - - /// Mangled name get accessor. - /// - /// \return - /// A const reference to the mangled name string object. + /// The mangled name string object. ConstString GetMangledName() const { return m_mangled; } /// Best name get accessor.