Skip to content

Commit acfc1f3

Browse files
Michael137IanWood1
authored andcommitted
[lldb][Format] Introduce new frame-format variables for function parts (llvm#131836)
Adds new frame-format variables and implements them in the CPlusPlusLanguage plugin. We use the `DemangledNameInfo` type to retrieve the necessary part of the demangled name. llvm#131836
1 parent 2e060b9 commit acfc1f3

20 files changed

+719
-30
lines changed

lldb/include/lldb/Core/FormatEntity.h

+7
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,13 @@ struct Entry {
8888
FunctionNameWithArgs,
8989
FunctionNameNoArgs,
9090
FunctionMangledName,
91+
FunctionScope,
92+
FunctionBasename,
93+
FunctionTemplateArguments,
94+
FunctionFormattedArguments,
95+
FunctionReturnLeft,
96+
FunctionReturnRight,
97+
FunctionQualifiers,
9198
FunctionAddrOffset,
9299
FunctionAddrOffsetConcrete,
93100
FunctionLineOffset,

lldb/include/lldb/Symbol/SymbolContext.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -311,8 +311,7 @@ class SymbolContext {
311311
/// mangling preference. If this object represents an inlined function,
312312
/// returns the name of the inlined function. Returns nullptr if no function
313313
/// name could be determined.
314-
const char *GetPossiblyInlinedFunctionName(
315-
Mangled::NamePreference mangling_preference) const;
314+
Mangled GetPossiblyInlinedFunctionName() const;
316315

317316
// Member variables
318317
lldb::TargetSP target_sp; ///< The Target for a given query

lldb/include/lldb/Target/Language.h

+8
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <set>
1616
#include <vector>
1717

18+
#include "lldb/Core/FormatEntity.h"
1819
#include "lldb/Core/Highlighter.h"
1920
#include "lldb/Core/PluginInterface.h"
2021
#include "lldb/DataFormatters/DumpValueObjectOptions.h"
@@ -371,6 +372,13 @@ class Language : public PluginInterface {
371372
FunctionNameRepresentation representation,
372373
Stream &s);
373374

375+
virtual bool HandleFrameFormatVariable(const SymbolContext &sc,
376+
const ExecutionContext *exe_ctx,
377+
FormatEntity::Entry::Type type,
378+
Stream &s) {
379+
return false;
380+
}
381+
374382
virtual ConstString
375383
GetDemangledFunctionNameWithoutArguments(Mangled mangled) const {
376384
if (ConstString demangled = mangled.GetDemangledName())

lldb/source/Core/FormatEntity.cpp

+50-11
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,15 @@ constexpr Definition g_function_child_entries[] = {
122122
Definition("pc-offset", EntryType::FunctionPCOffset),
123123
Definition("initial-function", EntryType::FunctionInitial),
124124
Definition("changed", EntryType::FunctionChanged),
125-
Definition("is-optimized", EntryType::FunctionIsOptimized)};
125+
Definition("is-optimized", EntryType::FunctionIsOptimized),
126+
Definition("scope", EntryType::FunctionScope),
127+
Definition("basename", EntryType::FunctionBasename),
128+
Definition("template-arguments", EntryType::FunctionTemplateArguments),
129+
Definition("formatted-arguments", EntryType::FunctionFormattedArguments),
130+
Definition("return-left", EntryType::FunctionReturnLeft),
131+
Definition("return-right", EntryType::FunctionReturnRight),
132+
Definition("qualifiers", EntryType::FunctionQualifiers),
133+
};
126134

127135
constexpr Definition g_line_child_entries[] = {
128136
Entry::DefinitionWithChildren("file", EntryType::LineEntryFile,
@@ -353,6 +361,13 @@ const char *FormatEntity::Entry::TypeToCString(Type t) {
353361
ENUM_TO_CSTR(FunctionNameWithArgs);
354362
ENUM_TO_CSTR(FunctionNameNoArgs);
355363
ENUM_TO_CSTR(FunctionMangledName);
364+
ENUM_TO_CSTR(FunctionScope);
365+
ENUM_TO_CSTR(FunctionBasename);
366+
ENUM_TO_CSTR(FunctionTemplateArguments);
367+
ENUM_TO_CSTR(FunctionFormattedArguments);
368+
ENUM_TO_CSTR(FunctionReturnLeft);
369+
ENUM_TO_CSTR(FunctionReturnRight);
370+
ENUM_TO_CSTR(FunctionQualifiers);
356371
ENUM_TO_CSTR(FunctionAddrOffset);
357372
ENUM_TO_CSTR(FunctionAddrOffsetConcrete);
358373
ENUM_TO_CSTR(FunctionLineOffset);
@@ -1167,8 +1182,9 @@ static bool PrintFunctionNameWithArgs(Stream &s,
11671182
ExecutionContextScope *exe_scope =
11681183
exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr;
11691184

1170-
const char *cstr =
1171-
sc.GetPossiblyInlinedFunctionName(Mangled::ePreferDemangled);
1185+
const char *cstr = sc.GetPossiblyInlinedFunctionName()
1186+
.GetName(Mangled::ePreferDemangled)
1187+
.AsCString();
11721188
if (!cstr)
11731189
return false;
11741190

@@ -1186,7 +1202,8 @@ static bool PrintFunctionNameWithArgs(Stream &s,
11861202
return true;
11871203
}
11881204

1189-
static bool HandleFunctionNameWithArgs(Stream &s,const ExecutionContext *exe_ctx,
1205+
static bool HandleFunctionNameWithArgs(Stream &s,
1206+
const ExecutionContext *exe_ctx,
11901207
const SymbolContext &sc) {
11911208
Language *language_plugin = nullptr;
11921209
bool language_plugin_handled = false;
@@ -1711,8 +1728,9 @@ bool FormatEntity::Format(const Entry &entry, Stream &s,
17111728
return true;
17121729
}
17131730

1714-
const char *name = sc->GetPossiblyInlinedFunctionName(
1715-
Mangled::NamePreference::ePreferDemangled);
1731+
const char *name = sc->GetPossiblyInlinedFunctionName()
1732+
.GetName(Mangled::NamePreference::ePreferDemangled)
1733+
.AsCString();
17161734
if (!name)
17171735
return false;
17181736

@@ -1743,8 +1761,10 @@ bool FormatEntity::Format(const Entry &entry, Stream &s,
17431761
return true;
17441762
}
17451763

1746-
const char *name = sc->GetPossiblyInlinedFunctionName(
1747-
Mangled::NamePreference::ePreferDemangledWithoutArguments);
1764+
const char *name =
1765+
sc->GetPossiblyInlinedFunctionName()
1766+
.GetName(Mangled::NamePreference::ePreferDemangledWithoutArguments)
1767+
.AsCString();
17481768
if (!name)
17491769
return false;
17501770

@@ -1753,19 +1773,38 @@ bool FormatEntity::Format(const Entry &entry, Stream &s,
17531773
return true;
17541774
}
17551775

1776+
case Entry::Type::FunctionScope:
1777+
case Entry::Type::FunctionBasename:
1778+
case Entry::Type::FunctionTemplateArguments:
1779+
case Entry::Type::FunctionFormattedArguments:
1780+
case Entry::Type::FunctionReturnRight:
1781+
case Entry::Type::FunctionReturnLeft:
1782+
case Entry::Type::FunctionQualifiers: {
1783+
if (!sc->function)
1784+
return false;
1785+
1786+
Language *language_plugin =
1787+
Language::FindPlugin(sc->function->GetLanguage());
1788+
if (!language_plugin)
1789+
return false;
1790+
1791+
return language_plugin->HandleFrameFormatVariable(*sc, exe_ctx, entry.type,
1792+
s);
1793+
}
1794+
17561795
case Entry::Type::FunctionNameWithArgs: {
17571796
if (!sc)
17581797
return false;
17591798

17601799
return HandleFunctionNameWithArgs(s, exe_ctx, *sc);
17611800
}
1762-
17631801
case Entry::Type::FunctionMangledName: {
17641802
if (!sc)
17651803
return false;
17661804

1767-
const char *name = sc->GetPossiblyInlinedFunctionName(
1768-
Mangled::NamePreference::ePreferMangled);
1805+
const char *name = sc->GetPossiblyInlinedFunctionName()
1806+
.GetName(Mangled::NamePreference::ePreferMangled)
1807+
.AsCString();
17691808
if (!name)
17701809
return false;
17711810

0 commit comments

Comments
 (0)