Skip to content

Commit fac7453

Browse files
authored
[lldb][Mangled] Move SuffixRange computation into TrackingOutputBuffer (llvm#152483)
This way all the tracking is self-contained in `TrackingOutputBuffer` and we can test the `SuffixRange` properly.
1 parent 900d20d commit fac7453

File tree

5 files changed

+31
-20
lines changed

5 files changed

+31
-20
lines changed

lldb/source/Core/DemangledNameInfo.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,11 @@ void TrackingOutputBuffer::finalizeEnd() {
111111
if (NameInfo.ScopeRange.first > NameInfo.ScopeRange.second)
112112
NameInfo.ScopeRange.second = NameInfo.ScopeRange.first;
113113
NameInfo.BasenameRange.first = NameInfo.ScopeRange.second;
114+
115+
// We call anything past the FunctionEncoding the "suffix".
116+
// In practice this would be nodes like `DotSuffix` that wrap
117+
// a FunctionEncoding.
118+
NameInfo.SuffixRange.first = getCurrentPosition();
114119
}
115120

116121
ScopedOverride<unsigned> TrackingOutputBuffer::enterFunctionTypePrinting() {
@@ -138,6 +143,9 @@ void TrackingOutputBuffer::printLeft(const Node &N) {
138143
default:
139144
OutputBuffer::printLeft(N);
140145
}
146+
147+
// Keep updating suffix until we reach the end.
148+
NameInfo.SuffixRange.second = getCurrentPosition();
141149
}
142150

143151
void TrackingOutputBuffer::printRight(const Node &N) {
@@ -151,6 +159,9 @@ void TrackingOutputBuffer::printRight(const Node &N) {
151159
default:
152160
OutputBuffer::printRight(N);
153161
}
162+
163+
// Keep updating suffix until we reach the end.
164+
NameInfo.SuffixRange.second = getCurrentPosition();
154165
}
155166

156167
void TrackingOutputBuffer::printLeftImpl(const FunctionType &N) {

lldb/source/Core/Mangled.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,6 @@ GetItaniumDemangledStr(const char *M) {
172172

173173
TrackingOutputBuffer OB(demangled_cstr, demangled_size);
174174
demangled_cstr = ipd.finishDemangle(&OB);
175-
// TODO: we should set the SuffixRange inside the TrackingOutputBuffer.
176-
OB.NameInfo.SuffixRange.first = OB.NameInfo.QualifiersRange.second;
177-
OB.NameInfo.SuffixRange.second = std::string_view(OB).size();
178175
info = std::move(OB.NameInfo);
179176

180177
assert(demangled_cstr &&

lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -392,13 +392,16 @@ GetDemangledScope(const SymbolContext &sc) {
392392
return CPlusPlusLanguage::GetDemangledScope(demangled_name, info);
393393
}
394394

395-
/// Handles anything printed after the FunctionEncoding ItaniumDemangle
396-
/// node. Most notably the DotSuffix node.
397-
///
398-
/// FIXME: the suffix should also have an associated
399-
/// CPlusPlusLanguage::GetDemangledFunctionSuffix
400-
/// once we start setting the `DemangledNameInfo::SuffixRange`
401-
/// from inside the `TrackingOutputBuffer`.
395+
llvm::Expected<llvm::StringRef>
396+
CPlusPlusLanguage::GetDemangledFunctionSuffix(llvm::StringRef demangled,
397+
const DemangledNameInfo &info) {
398+
if (!info.hasSuffix())
399+
return llvm::createStringError("Suffix range for '%s' is invalid.",
400+
demangled.data());
401+
402+
return demangled.slice(info.SuffixRange.first, info.SuffixRange.second);
403+
}
404+
402405
static llvm::Expected<llvm::StringRef>
403406
GetDemangledFunctionSuffix(const SymbolContext &sc) {
404407
auto info_or_err = GetAndValidateInfo(sc);
@@ -407,11 +410,7 @@ GetDemangledFunctionSuffix(const SymbolContext &sc) {
407410

408411
auto [demangled_name, info] = *info_or_err;
409412

410-
if (!info.hasSuffix())
411-
return llvm::createStringError("Suffix range for '%s' is invalid.",
412-
demangled_name.data());
413-
414-
return demangled_name.slice(info.SuffixRange.first, info.SuffixRange.second);
413+
return CPlusPlusLanguage::GetDemangledFunctionSuffix(demangled_name, info);
415414
}
416415

417416
llvm::Expected<llvm::StringRef>
@@ -2424,7 +2423,7 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable(
24242423
return true;
24252424
}
24262425
case FormatEntity::Entry::Type::FunctionSuffix: {
2427-
auto suffix_or_err = GetDemangledFunctionSuffix(sc);
2426+
auto suffix_or_err = ::GetDemangledFunctionSuffix(sc);
24282427
if (!suffix_or_err) {
24292428
LLDB_LOG_ERROR(
24302429
GetLog(LLDBLog::Language), suffix_or_err.takeError(),

lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,10 @@ class CPlusPlusLanguage : public Language {
138138
GetDemangledFunctionArguments(llvm::StringRef demangled,
139139
const DemangledNameInfo &info);
140140

141+
static llvm::Expected<llvm::StringRef>
142+
GetDemangledFunctionSuffix(llvm::StringRef demangled,
143+
const DemangledNameInfo &info);
144+
141145
// Extract C++ context and identifier from a string using heuristic matching
142146
// (as opposed to
143147
// CPlusPlusLanguage::CxxMethodName which has to have a fully qualified C++

lldb/unittests/Core/MangledTest.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -889,10 +889,10 @@ TEST_P(DemanglingInfoCorrectnessTestFixutre, Correctness) {
889889
EXPECT_THAT_EXPECTED(qualifiers, llvm::Succeeded());
890890
reconstructed_name += *qualifiers;
891891

892-
// TODO: should retrieve suffix using the plugin too.
893-
auto suffix = tracked_name.slice(OB->NameInfo.QualifiersRange.second,
894-
llvm::StringRef::npos);
895-
reconstructed_name += suffix;
892+
auto suffix =
893+
CPlusPlusLanguage::GetDemangledFunctionSuffix(tracked_name, OB->NameInfo);
894+
EXPECT_THAT_EXPECTED(suffix, llvm::Succeeded());
895+
reconstructed_name += *suffix;
896896

897897
EXPECT_EQ(reconstructed_name, demangled);
898898
}

0 commit comments

Comments
 (0)