Skip to content

Commit e14778b

Browse files
authored
Merge pull request #10986 from augusto2112/cp-0601-change-remote-addr
Cherry pick [NFC][lldb] Adapt LLDB to RemoteInspection's RemoteAddress changes and others to rebranch
2 parents 0610aca + dbacde9 commit e14778b

File tree

51 files changed

+1224
-811
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+1224
-811
lines changed

lldb/packages/Python/lldbsuite/test/lldbtest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -787,7 +787,7 @@ def setUpCommands(cls):
787787
),
788788
# Enable expensive validations in TypeSystemSwiftTypeRef.
789789
"settings set symbols.swift-validate-typesystem true",
790-
"settings set symbols.swift-typesystem-compiler-fallback true",
790+
"settings set symbols.swift-typesystem-compiler-fallback false",
791791
]
792792

793793
# Set any user-overridden settings.

lldb/source/Plugins/ExpressionParser/Swift/SwiftExpressionSourceCode.cpp

Lines changed: 66 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#include "Plugins/ExpressionParser/Swift/SwiftASTManipulator.h"
1414
#include "Plugins/TypeSystem/Swift/SwiftASTContext.h"
15+
#include "lldb/Symbol/Variable.h"
1516
#include "lldb/Target/Language.h"
1617
#include "lldb/Target/Platform.h"
1718
#include "lldb/Target/Target.h"
@@ -114,6 +115,56 @@ struct CallsAndArgs {
114115
std::string lldb_call;
115116
};
116117

118+
static llvm::SmallVector<const SwiftASTManipulator::VariableInfo *>
119+
CollectMetadataVariables(
120+
llvm::ArrayRef<SwiftASTManipulator::VariableInfo> local_variables) {
121+
llvm::SmallVector<const SwiftASTManipulator::VariableInfo *>
122+
metadata_variables;
123+
for (auto &var : local_variables)
124+
if (var.IsOutermostMetadataPointer())
125+
metadata_variables.push_back(&var);
126+
return metadata_variables;
127+
}
128+
129+
struct MetadataInfo {
130+
bool is_pack = false;
131+
unsigned depth;
132+
unsigned index;
133+
llvm::StringRef archetype_name;
134+
135+
MetadataInfo(bool is_pack, unsigned depth, unsigned index, llvm::StringRef archetype_name)
136+
: is_pack(is_pack), depth(depth), index(index), archetype_name(archetype_name) {}
137+
};
138+
139+
static llvm::Expected<llvm::SmallVector<MetadataInfo>> CollectMetadataInfos(
140+
llvm::ArrayRef<const SwiftASTManipulator::VariableInfo *>
141+
metadata_variables,
142+
const std::optional<SwiftLanguageRuntime::GenericSignature> &generic_sig) {
143+
llvm::SmallVector<MetadataInfo> metadata_info;
144+
145+
for (size_t i = 0; i < metadata_variables.size(); ++i) {
146+
auto variable_sp =
147+
llvm::cast<SwiftASTManipulatorBase::VariableMetadataVariable>(
148+
metadata_variables[i]->GetMetadata())
149+
->m_variable_sp;
150+
auto archetype_name = variable_sp->GetType()->GetName();
151+
if (generic_sig)
152+
metadata_info.emplace_back(generic_sig->generic_params[i].is_pack,
153+
generic_sig->generic_params[i].depth,
154+
generic_sig->generic_params[i].index,
155+
archetype_name);
156+
else {
157+
auto maybe_depth_and_index =
158+
ParseSwiftGenericParameter(metadata_variables[i]->GetName().str());
159+
if (!maybe_depth_and_index)
160+
return llvm::createStringError(llvm::errc::not_supported,
161+
"unexpected metadata variable");
162+
metadata_info.emplace_back(false, maybe_depth_and_index->first,
163+
maybe_depth_and_index->second, archetype_name);
164+
}
165+
}
166+
return metadata_info;
167+
}
117168
/// Constructs the signatures for the expression evaluation functions based on
118169
/// the metadata variables in scope and any variadic functiontion parameters.
119170
/// For every outermost metadata pointer in scope ($τ_0_0, $τ_0_1, etc), we want
@@ -149,50 +200,35 @@ static llvm::Expected<CallsAndArgs> MakeGenericSignaturesAndCalls(
149200
llvm::ArrayRef<SwiftASTManipulator::VariableInfo> local_variables,
150201
const std::optional<SwiftLanguageRuntime::GenericSignature> &generic_sig,
151202
bool needs_object_ptr) {
152-
llvm::SmallVector<const SwiftASTManipulator::VariableInfo *>
153-
metadata_variables;
154-
for (auto &var : local_variables)
155-
if (var.IsOutermostMetadataPointer())
156-
metadata_variables.push_back(&var);
157-
203+
auto metadata_variables = CollectMetadataVariables(local_variables);
158204
// The number of metadata variables could be > if the function is in
159205
// a generic context.
160206
if (generic_sig &&
161207
(metadata_variables.size() < generic_sig->dependent_generic_param_count))
162208
return llvm::createStringError(llvm::errc::not_supported,
163209
"Inconsistent generic signature");
164210

211+
auto maybe_metadata_infos = CollectMetadataInfos(metadata_variables, generic_sig);
212+
if (!maybe_metadata_infos)
213+
return maybe_metadata_infos.takeError();
214+
auto metadata_infos = *maybe_metadata_infos;
215+
165216
llvm::SmallDenseMap<std::pair<unsigned, unsigned>, llvm::SmallString<4>> subs;
166217
std::string generic_params;
167218
std::string generic_params_no_packs;
168219
llvm::raw_string_ostream s_generic_params(generic_params);
169220
llvm::raw_string_ostream s_generic_params_no_packs(generic_params_no_packs);
170-
for (size_t i = 0; i < metadata_variables.size(); ++i) {
171-
llvm::SmallString<4> archetype_name;
172-
llvm::raw_svector_ostream s_archetype_name(archetype_name);
173-
bool is_pack = false;
174-
unsigned depth, index;
175-
if (generic_sig) {
176-
auto &gp = generic_sig->generic_params[i];
177-
is_pack = gp.is_pack;
178-
depth = gp.depth;
179-
index = gp.index;
180-
} else {
181-
auto di =
182-
ParseSwiftGenericParameter(metadata_variables[i]->GetName().str());
183-
if (!di)
184-
return llvm::createStringError(llvm::errc::not_supported,
185-
"unexpected metadata variable");
186-
depth = di->first;
187-
index = di->second;
188-
}
221+
222+
for (auto &[is_pack, depth, index, archetype_name] : metadata_infos) {
223+
llvm::SmallString<4> sig_archetype_name;
224+
llvm::raw_svector_ostream s_sig_archetype_name(sig_archetype_name);
189225
if (is_pack)
190-
s_archetype_name << "each ";
191-
s_archetype_name << "T" << i;
226+
s_sig_archetype_name << "each ";
227+
s_sig_archetype_name << archetype_name;
192228
if (!is_pack)
193-
s_generic_params_no_packs << archetype_name << ",";
194-
subs.insert({{depth, index}, archetype_name});
195-
s_generic_params << archetype_name << ",";
229+
s_generic_params_no_packs << sig_archetype_name << ",";
230+
s_generic_params << sig_archetype_name << ",";
231+
subs.insert({{depth, index}, sig_archetype_name});
196232
}
197233

198234
if (!generic_params.empty())

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

Lines changed: 54 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -745,9 +745,9 @@ class EnumSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
745745
llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override;
746746

747747
private:
748-
ExecutionContextRef m_exe_ctx_ref;
749-
ConstString m_element_name;
750-
size_t m_child_index;
748+
ValueObjectSP m_projected;
749+
lldb::DynamicValueType m_dynamic = eNoDynamicValues;
750+
bool m_indirect = false;
751751
};
752752

753753
static std::string mangledTypenameForTasksTuple(size_t count) {
@@ -1516,50 +1516,83 @@ class ActorSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
15161516

15171517
lldb_private::formatters::swift::EnumSyntheticFrontEnd::EnumSyntheticFrontEnd(
15181518
lldb::ValueObjectSP valobj_sp)
1519-
: SyntheticChildrenFrontEnd(*valobj_sp.get()), m_exe_ctx_ref(),
1520-
m_element_name(nullptr), m_child_index(UINT32_MAX) {
1519+
: SyntheticChildrenFrontEnd(*valobj_sp.get()) {
15211520
if (valobj_sp)
15221521
Update();
15231522
}
15241523

15251524
llvm::Expected<uint32_t>
15261525
lldb_private::formatters::swift::EnumSyntheticFrontEnd::CalculateNumChildren() {
1527-
return m_child_index != UINT32_MAX ? 1 : 0;
1526+
if (m_indirect && m_projected)
1527+
return m_projected->GetNumChildren();
1528+
return m_projected ? 1 : 0;
15281529
}
15291530

15301531
lldb::ValueObjectSP
15311532
lldb_private::formatters::swift::EnumSyntheticFrontEnd::GetChildAtIndex(
15321533
uint32_t idx) {
1533-
if (idx)
1534-
return ValueObjectSP();
1535-
if (m_child_index == UINT32_MAX)
1536-
return ValueObjectSP();
1537-
return m_backend.GetChildAtIndex(m_child_index, true);
1534+
ValueObjectSP value_sp;
1535+
// Hide the indirection.
1536+
if (m_indirect && m_projected) {
1537+
value_sp = m_projected->GetChildAtIndex(idx);
1538+
} else {
1539+
if (idx != 0)
1540+
return {};
1541+
value_sp = m_projected;
1542+
}
1543+
if (!value_sp)
1544+
return {};
1545+
1546+
return value_sp;
15381547
}
15391548

15401549
lldb::ChildCacheState
15411550
lldb_private::formatters::swift::EnumSyntheticFrontEnd::Update() {
1542-
m_element_name.Clear();
1543-
m_child_index = UINT32_MAX;
1544-
m_exe_ctx_ref = m_backend.GetExecutionContextRef();
1545-
m_element_name.SetCString(m_backend.GetValueAsCString());
1546-
auto index_or_err = m_backend.GetIndexOfChildWithName(m_element_name);
1547-
if (!index_or_err)
1548-
llvm::consumeError(index_or_err.takeError());
1551+
auto *runtime = SwiftLanguageRuntime::Get(m_backend.GetProcessSP());
1552+
if (!runtime)
1553+
return ChildCacheState::eRefetch;
1554+
1555+
llvm::Expected<ValueObjectSP> projected =
1556+
runtime->SwiftLanguageRuntime::ProjectEnum(m_backend);
1557+
if (!projected) {
1558+
LLDB_LOG_ERROR(GetLog(LLDBLog::DataFormatters), projected.takeError(),
1559+
"{0}");
1560+
return ChildCacheState::eRefetch;
1561+
}
1562+
1563+
m_dynamic = m_backend.GetDynamicValueType();
1564+
m_projected = *projected;
1565+
if (m_projected &&
1566+
m_projected->GetName().GetStringRef().starts_with("$indirect."))
1567+
m_indirect = true;
15491568
else
1550-
m_child_index = *index_or_err;
1569+
m_indirect = false;
1570+
1571+
if (!m_projected)
1572+
return ChildCacheState::eRefetch;
1573+
1574+
if ((m_projected->GetCompilerType().GetTypeInfo() & eTypeIsEnumeration))
1575+
if (auto synthetic_sp = m_projected->GetSyntheticValue())
1576+
m_projected = synthetic_sp;
1577+
1578+
if (m_dynamic != eNoDynamicValues)
1579+
if (auto dynamic_sp = m_projected->GetDynamicValue(m_dynamic))
1580+
m_projected = dynamic_sp;
15511581
return ChildCacheState::eRefetch;
15521582
}
15531583

15541584
bool lldb_private::formatters::swift::EnumSyntheticFrontEnd::
15551585
MightHaveChildren() {
1556-
return m_child_index != UINT32_MAX;
1586+
return m_projected ? true : false;
15571587
}
15581588

15591589
llvm::Expected<size_t>
15601590
lldb_private::formatters::swift::EnumSyntheticFrontEnd::GetIndexOfChildWithName(
15611591
ConstString name) {
1562-
if (name == m_element_name)
1592+
// Hide the indirection.
1593+
if (m_indirect && m_projected)
1594+
return m_projected->GetIndexOfChildWithName(name);
1595+
if (m_projected && name == m_projected->GetName())
15631596
return 0;
15641597
return llvm::createStringError("Type has no child named '%s'",
15651598
name.AsCString());

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

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -522,9 +522,9 @@ static void LoadSwiftFormatters(lldb::TypeCategoryImplSP swift_category_sp) {
522522

523523
TypeSummaryImpl::Flags optional_summary_flags;
524524
optional_summary_flags.SetCascades(true)
525-
.SetDontShowChildren(false) // this one will actually be calculated at
526-
// runtime, what you pass here doesn't matter
527-
.SetDontShowValue(true)
525+
.SetDontShowChildren(true) // this one will actually be calculated at
526+
// runtime, what you pass here doesn't matter
527+
.SetDontShowValue(false)
528528
.SetHideItemNames(false)
529529
.SetShowMembersOneLiner(false)
530530
.SetSkipPointers(true)
@@ -974,10 +974,6 @@ SwiftLanguage::GetHardcodedSynthetics() {
974974
CompilerType type(valobj.GetCompilerType());
975975
Flags type_flags(type.GetTypeInfo());
976976
if (type_flags.AllSet(eTypeIsSwift | eTypeIsEnumeration)) {
977-
// FIXME: The classification of clang-imported enums may
978-
// change based on whether a Swift module is present or not.
979-
if (!valobj.GetValueAsCString())
980-
return nullptr;
981977
if (!swift_enum_synth)
982978
swift_enum_synth = lldb::SyntheticChildrenSP(new CXXSyntheticChildren(
983979
SyntheticChildren::Flags()

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -204,15 +204,16 @@ bool lldb_private::formatters::swift::SwiftOptionSetSummaryProvider::
204204
}
205205
}
206206

207-
if (!any_match)
208-
return false;
209-
210207
if (matched_value != value) {
211208
// Print the unaccounted-for bits separately.
212209
llvm::APInt residual = value & ~matched_value;
213210
llvm::SmallString<24> string;
214211
residual.toString(string, 16, false);
215-
ss << ", 0x" << string;
212+
if (any_match)
213+
ss << ", ";
214+
else
215+
ss << "rawValue = ";
216+
ss << "0x" << string;
216217
}
217218
ss << ']';
218219

0 commit comments

Comments
 (0)