Skip to content

Commit 0fece06

Browse files
committed
[lldb] Remove lookups of MultiPayloadEnumDescriptors
RemoteMirrors is able to calculate type infos for multipaylaod enums without needing MultiPayloadEnumDescriptors. Remove the implementation that provides those descriptors from LLDB.
1 parent 74d4671 commit 0fece06

File tree

3 files changed

+0
-137
lines changed

3 files changed

+0
-137
lines changed

lldb/source/Plugins/LanguageRuntime/Swift/ReflectionContext.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,6 @@ struct DescriptorFinderForwarder : public swift::reflection::DescriptorFinder {
4444
return nullptr;
4545
}
4646

47-
std::unique_ptr<swift::reflection::MultiPayloadEnumDescriptorBase>
48-
getMultiPayloadEnumDescriptor(const swift::reflection::TypeRef *TR) override {
49-
if (!m_descriptor_finders.empty() && shouldConsultDescriptorFinder())
50-
return m_descriptor_finders.back()->getMultiPayloadEnumDescriptor(TR);
51-
return nullptr;
52-
}
53-
5447
void PushExternalDescriptorFinder(
5548
swift::reflection::DescriptorFinder *descriptor_finder) {
5649
m_descriptor_finders.push_back(descriptor_finder);

lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserSwift.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,6 @@ class DWARFASTParserSwift : public lldb_private::plugin::dwarf::DWARFASTParser,
8989
std::unique_ptr<swift::reflection::BuiltinTypeDescriptorBase>
9090
getBuiltinTypeDescriptor(const swift::reflection::TypeRef *TR) override;
9191

92-
/// Returns a builtin descriptor constructed from DWARF info.
93-
std::unique_ptr<swift::reflection::MultiPayloadEnumDescriptorBase>
94-
getMultiPayloadEnumDescriptor(const swift::reflection::TypeRef *TR) override;
95-
9692
private:
9793
/// Returns the canonical demangle tree of a die's type.
9894
NodePointer GetCanonicalDemangleTree(DWARFDIE &die);

lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserSwiftDescriptorFinder.cpp

Lines changed: 0 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -280,53 +280,6 @@ class DWARFFieldDescriptorImpl : public swift::reflection::FieldDescriptorBase {
280280
return payload_fields;
281281
}
282282
};
283-
284-
class DWARFMultiPayloadEnumDescriptorImpl
285-
: public swift::reflection::MultiPayloadEnumDescriptorBase {
286-
ConstString m_mangled_name;
287-
DIERef m_die_ref;
288-
std::vector<uint8_t> m_spare_bits_mask;
289-
uint64_t m_byte_offset;
290-
291-
public:
292-
~DWARFMultiPayloadEnumDescriptorImpl() override = default;
293-
294-
DWARFMultiPayloadEnumDescriptorImpl(ConstString mangled_name, DIERef die_ref,
295-
std::vector<uint8_t> &&spare_bits_mask,
296-
uint64_t byte_offset)
297-
: swift::reflection::MultiPayloadEnumDescriptorBase(),
298-
m_mangled_name(mangled_name), m_die_ref(die_ref),
299-
m_spare_bits_mask(std::move(spare_bits_mask)),
300-
m_byte_offset(byte_offset) {}
301-
302-
llvm::StringRef getMangledTypeName() override {
303-
return m_mangled_name.GetStringRef();
304-
}
305-
306-
uint32_t getContentsSizeInWords() const override {
307-
return m_spare_bits_mask.size() / 4;
308-
}
309-
310-
size_t getSizeInBytes() const override { return m_spare_bits_mask.size(); }
311-
312-
uint32_t getFlags() const override { return usesPayloadSpareBits(); }
313-
314-
bool usesPayloadSpareBits() const override {
315-
return !m_spare_bits_mask.empty();
316-
}
317-
318-
uint32_t getPayloadSpareBitMaskByteOffset() const override {
319-
return m_byte_offset;
320-
}
321-
322-
uint32_t getPayloadSpareBitMaskByteCount() const override {
323-
return getSizeInBytes();
324-
}
325-
326-
const uint8_t *getPayloadSpareBits() const override {
327-
return m_spare_bits_mask.data();
328-
}
329-
};
330283
} // namespace
331284

332285
/// Constructs a builtin type descriptor from DWARF information.
@@ -374,85 +327,6 @@ DWARFASTParserSwift::getBuiltinTypeDescriptor(
374327
type.GetMangledTypeName());
375328
}
376329

377-
std::unique_ptr<swift::reflection::MultiPayloadEnumDescriptorBase>
378-
DWARFASTParserSwift::getMultiPayloadEnumDescriptor(
379-
const swift::reflection::TypeRef *TR) {
380-
assert(ModuleList::GetGlobalModuleListProperties()
381-
.GetSwiftEnableFullDwarfDebugging() !=
382-
lldb_private::AutoBool::False &&
383-
"Full DWARF debugging for Swift is disabled!");
384-
385-
auto pair = getTypeAndDie(m_swift_typesystem, TR);
386-
if (!pair)
387-
return nullptr;
388-
389-
auto [type, die] = *pair;
390-
if (!die)
391-
return nullptr;
392-
393-
auto kind = getFieldDescriptorKindForDie(type);
394-
if (!kind)
395-
return nullptr;
396-
397-
auto child_die = die.GetFirstChild();
398-
auto bit_offset =
399-
child_die.GetAttributeValueAsUnsigned(llvm::dwarf::DW_AT_bit_offset, 0);
400-
401-
auto byte_offset = (bit_offset + 7) / 8;
402-
403-
const auto &attributes = child_die.GetAttributes();
404-
auto spare_bits_mask_idx =
405-
attributes.FindAttributeIndex(llvm::dwarf::DW_AT_APPLE_spare_bits_mask);
406-
if (spare_bits_mask_idx == UINT32_MAX)
407-
return nullptr;
408-
409-
DWARFFormValue form_value;
410-
attributes.ExtractFormValueAtIndex(spare_bits_mask_idx, form_value);
411-
412-
if (!form_value.IsValid()) {
413-
if (auto *log = GetLog(LLDBLog::Types)) {
414-
std::stringstream ss;
415-
TR->dump(ss);
416-
LLDB_LOG(log,
417-
"Could not produce MultiPayloadEnumTypeInfo for typeref: {0}",
418-
ss.str());
419-
}
420-
return nullptr;
421-
}
422-
// If there's a block data, this is a number bigger than 64 bits already
423-
// encoded as an array.
424-
if (form_value.BlockData()) {
425-
uint64_t block_length = form_value.Unsigned();
426-
std::vector<uint8_t> bytes(form_value.BlockData(),
427-
form_value.BlockData() + block_length);
428-
return std::make_unique<DWARFMultiPayloadEnumDescriptorImpl>(
429-
type.GetMangledTypeName(), *die.GetDIERef(),
430-
std::move(bytes), byte_offset);
431-
}
432-
433-
// If there is no block data, the spare bits mask is encoded as a single 64
434-
// bit number. Convert this to a byte array with only the amount of bytes
435-
// necessary to cover the whole number (see
436-
// MultiPayloadEnumDescriptorBuilder::layout on GenReflection.cpp for a
437-
// similar calculation when emitting this into metadata).
438-
llvm::APInt bits(64, form_value.Unsigned());
439-
auto bitsInMask = bits.getActiveBits();
440-
uint32_t bytesInMask = (bitsInMask + 7) / 8;
441-
auto wordsInMask = (bytesInMask + 3) / 4;
442-
bits = bits.zextOrTrunc(wordsInMask * 32);
443-
444-
std::vector<uint8_t> bytes;
445-
for (size_t i = 0; i < bytesInMask; ++i) {
446-
uint8_t byte = bits.extractBitsAsZExtValue(8, 0);
447-
bytes.push_back(byte);
448-
bits.lshrInPlace(8);
449-
}
450-
451-
return std::make_unique<DWARFMultiPayloadEnumDescriptorImpl>(
452-
type.GetMangledTypeName(), *die.GetDIERef(), std::move(bytes),
453-
byte_offset);
454-
}
455-
456330
namespace {
457331
DWARFDIE FindSuperClassDIE(DWARFDIE &die) {
458332
const auto inheritance_die_it =

0 commit comments

Comments
 (0)