Skip to content

Commit cf9b14c

Browse files
add NameFormatPreference enum
1 parent 7ee1b24 commit cf9b14c

File tree

3 files changed

+51
-36
lines changed

3 files changed

+51
-36
lines changed

lldb/include/lldb/Core/Mangled.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ class Mangled {
3939
ePreferDemangledWithoutArguments
4040
};
4141

42+
enum NameFormatPreference {
43+
eCompactName,
44+
eFullName,
45+
};
46+
4247
enum ManglingScheme {
4348
eManglingSchemeNone = 0,
4449
eManglingSchemeMSVC,
@@ -127,7 +132,9 @@ class Mangled {
127132
///
128133
/// \return
129134
/// A const reference to the demangled name string object.
130-
ConstString GetDemangledName(const SymbolContext *sc = nullptr) const;
135+
ConstString
136+
GetDemangledName(const SymbolContext *sc = nullptr,
137+
NameFormatPreference preference = eFullName) const;
131138

132139
/// Display demangled name get accessor.
133140
///
@@ -291,8 +298,9 @@ class Mangled {
291298
/// demangled name (if any). If \c force is \c true (or the mangled name
292299
/// on this object was not previously demangled), demangle and cache the
293300
/// name.
294-
ConstString GetDemangledNameImpl(bool force,
295-
const SymbolContext *sc = nullptr) const;
301+
ConstString
302+
GetDemangledNameImpl(bool force, const SymbolContext *sc = nullptr,
303+
NameFormatPreference preference = eFullName) const;
296304

297305
/// The mangled version of the name.
298306
ConstString m_mangled;

lldb/source/Core/Mangled.cpp

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -152,20 +152,32 @@ void Mangled::SetValue(ConstString name) {
152152
#ifdef LLDB_ENABLE_SWIFT
153153
std::pair<ConstString, DemangledNameInfo>
154154
GetSwiftDemangledStr(ConstString m_mangled, const SymbolContext *sc,
155-
ConstString &m_demangled) {
155+
ConstString &m_demangled,
156+
Mangled::NameFormatPreference preference) {
156157
const char *mangled_name = m_mangled.AsCString("");
157158
Log *log = GetLog(LLDBLog::Demangle);
158159
LLDB_LOGF(log, "demangle swift: %s", mangled_name);
160+
SwiftLanguageRuntime::DemangleMode demangle_mode;
161+
switch (preference) {
162+
case Mangled::eFullName:
163+
demangle_mode = SwiftLanguageRuntime::DemangleMode::eTypeName;
164+
break;
165+
case Mangled::eCompactName:
166+
demangle_mode = SwiftLanguageRuntime::DemangleMode::eSimplified;
167+
break;
168+
}
159169
auto [demangled, info] = SwiftLanguageRuntime::TrackedDemangleSymbolAsString(
160-
mangled_name, SwiftLanguageRuntime::eTypeName, sc);
170+
mangled_name, demangle_mode, sc);
161171
info.PrefixRange.second =
162172
std::min(info.BasenameRange.first, info.ArgumentsRange.first);
163173
info.SuffixRange.first =
164174
std::max(info.BasenameRange.second, info.ArgumentsRange.second);
165175
info.SuffixRange.second = demangled.length();
166176

167177
// Don't cache the demangled name if the function isn't available yet.
168-
if (!sc || !sc->function) {
178+
// Only cache eFullName demangled functions to keep the cache consistent.
179+
if (!sc || !sc->function ||
180+
preference == Mangled::NameFormatPreference::eCompactName) {
169181
LLDB_LOGF(log, "demangle swift: %s -> \"%s\" (not cached)", mangled_name,
170182
demangled.c_str());
171183
return std::make_pair(ConstString(demangled), info);
@@ -328,10 +340,10 @@ bool Mangled::GetRichManglingInfo(RichManglingContext &context,
328340
}
329341

330342
ConstString Mangled::GetDemangledName( // BEGIN SWIFT
331-
const SymbolContext *sc
343+
const SymbolContext *sc, NameFormatPreference preference
332344
// END SWIFT
333345
) const {
334-
return GetDemangledNameImpl(/*force=*/false, sc);
346+
return GetDemangledNameImpl(/*force=*/false, sc, preference);
335347
}
336348

337349
std::optional<DemangledNameInfo> const &Mangled::GetDemangledInfo() const {
@@ -346,7 +358,8 @@ std::optional<DemangledNameInfo> const &Mangled::GetDemangledInfo() const {
346358
// name. The result is cached and will be kept until a new string value is
347359
// supplied to this object, or until the end of the object's lifetime.
348360
ConstString Mangled::GetDemangledNameImpl(bool force, // BEGIN SWIFT
349-
const SymbolContext *sc
361+
const SymbolContext *sc,
362+
NameFormatPreference preference
350363
// END SWIFT
351364
) const {
352365
if (!m_mangled)
@@ -385,7 +398,8 @@ ConstString Mangled::GetDemangledNameImpl(bool force, // BEGIN SWIFT
385398
// explicitly unsupported on llvm.org.
386399
#ifdef LLDB_ENABLE_SWIFT
387400
{
388-
auto demangled = GetSwiftDemangledStr(m_mangled, sc, m_demangled);
401+
auto demangled =
402+
GetSwiftDemangledStr(m_mangled, sc, m_demangled, preference);
389403
m_demangled_info.emplace(std::move(demangled.second));
390404
return demangled.first;
391405
}

lldb/source/Plugins/Language/Swift/SwiftLanguage.cpp

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1906,50 +1906,46 @@ SwiftLanguage::GetDemangledFunctionNameWithoutArguments(Mangled mangled) const {
19061906
return mangled_name;
19071907
}
19081908

1909-
static llvm::Expected<std::pair<std::string, DemangledNameInfo>>
1909+
static llvm::Expected<std::pair<llvm::StringRef, DemangledNameInfo>>
19101910
GetAndValidateInfo(const SymbolContext &sc) {
19111911
Mangled mangled = sc.GetPossiblyInlinedFunctionName();
19121912
if (!mangled)
19131913
return llvm::createStringError("Function does not have a mangled name.");
19141914

1915-
const char *mangled_name = mangled.GetMangledName().AsCString("");
1916-
auto [demangled_name, info] =
1917-
SwiftLanguageRuntime::TrackedDemangleSymbolAsString(
1918-
mangled_name, SwiftLanguageRuntime::eSimplified, &sc);
1919-
info.PrefixRange.second =
1920-
std::min(info.BasenameRange.first, info.ArgumentsRange.first);
1921-
info.SuffixRange.first =
1922-
std::max(info.BasenameRange.second, info.ArgumentsRange.second);
1923-
info.SuffixRange.second = demangled_name.length();
1924-
1915+
auto demangled_name =
1916+
mangled.GetDemangledName(nullptr, Mangled::eCompactName).GetStringRef();
19251917
if (demangled_name.empty())
19261918
return llvm::createStringError(
19271919
"Function '%s' does not have a demangled name.",
19281920
mangled.GetMangledName().AsCString(""));
19291921

1922+
const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo();
1923+
if (!info)
1924+
return llvm::createStringError(
1925+
"Function '%s' does not have demangled info.", demangled_name.data());
1926+
19301927
// Function without a basename is nonsense.
1931-
if (!info.hasBasename())
1928+
if (!info->hasBasename())
19321929
return llvm::createStringError(
19331930
"DemangledInfo for '%s does not have basename range.",
19341931
demangled_name.data());
19351932

1936-
return std::make_pair(demangled_name, info);
1933+
return std::make_pair(demangled_name, *info);
19371934
}
19381935

1939-
static llvm::Expected<std::string>
1936+
static llvm::Expected<llvm::StringRef>
19401937
GetDemangledBasename(const SymbolContext &sc) {
19411938
auto info_or_err = GetAndValidateInfo(sc);
19421939
if (!info_or_err)
19431940
return info_or_err.takeError();
19441941

19451942
auto [demangled_name, info] = *info_or_err;
19461943

1947-
return demangled_name.substr(info.BasenameRange.first,
1948-
info.BasenameRange.second -
1949-
info.BasenameRange.first);
1944+
return demangled_name.slice(info.BasenameRange.first,
1945+
info.BasenameRange.second);
19501946
}
19511947

1952-
static llvm::Expected<std::string>
1948+
static llvm::Expected<llvm::StringRef>
19531949
GetDemangledFunctionPrefix(const SymbolContext &sc) {
19541950
auto info_or_err = GetAndValidateInfo(sc);
19551951
if (!info_or_err)
@@ -1962,11 +1958,10 @@ GetDemangledFunctionPrefix(const SymbolContext &sc) {
19621958
"DemangledInfo for '%s does not have suffix range.",
19631959
demangled_name.data());
19641960

1965-
return demangled_name.substr(
1966-
info.PrefixRange.first, info.PrefixRange.second - info.PrefixRange.first);
1961+
return demangled_name.slice(info.PrefixRange.first, info.PrefixRange.second);
19671962
}
19681963

1969-
static llvm::Expected<std::string>
1964+
static llvm::Expected<llvm::StringRef>
19701965
GetDemangledFunctionSuffix(const SymbolContext &sc) {
19711966
auto info_or_err = GetAndValidateInfo(sc);
19721967
if (!info_or_err)
@@ -1979,8 +1974,7 @@ GetDemangledFunctionSuffix(const SymbolContext &sc) {
19791974
"DemangledInfo for '%s does not have suffix range.",
19801975
demangled_name.data());
19811976

1982-
return demangled_name.substr(
1983-
info.SuffixRange.first, info.SuffixRange.second - info.SuffixRange.first);
1977+
return demangled_name.slice(info.SuffixRange.first, info.SuffixRange.second);
19841978
}
19851979

19861980
static bool PrintDemangledArgumentList(Stream &s, const SymbolContext &sc) {
@@ -1998,9 +1992,8 @@ static bool PrintDemangledArgumentList(Stream &s, const SymbolContext &sc) {
19981992
if (!info.hasArguments())
19991993
return false;
20001994

2001-
s << demangled_name.substr(info.ArgumentsRange.first,
2002-
info.ArgumentsRange.second -
2003-
info.ArgumentsRange.first);
1995+
s << demangled_name.slice(info.ArgumentsRange.first,
1996+
info.ArgumentsRange.second);
20041997

20051998
return true;
20061999
}

0 commit comments

Comments
 (0)