Skip to content

Commit c8e39b6

Browse files
Merge pull request #6824 from adrian-prantl/6814
Support clang structs with void* fields
2 parents bfa3a2c + 0710359 commit c8e39b6

File tree

5 files changed

+33
-8
lines changed

5 files changed

+33
-8
lines changed

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

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -751,13 +751,10 @@ SwiftLanguageRuntimeImpl::emplaceClangTypeInfo(
751751
// The stride is the size rounded up to alignment.
752752
const size_t byte_stride = llvm::alignTo(*byte_size, byte_align);
753753
unsigned extra_inhabitants = 0;
754-
if (clang_type.IsPointerType(nullptr)) {
755-
lldb_assert(TypeSystemSwiftTypeRef::IsKnownSpecialImportedType(
756-
clang_type.GetDisplayTypeName().GetStringRef()),
757-
"Expected clang pointer type to be a known special type!",
758-
__FUNCTION__, __FILE__, __LINE__);
754+
if (clang_type.IsPointerType() &&
755+
TypeSystemSwiftTypeRef::IsKnownSpecialImportedType(
756+
clang_type.GetDisplayTypeName().GetStringRef()))
759757
extra_inhabitants = swift::swift_getHeapObjectExtraInhabitantCount();
760-
}
761758

762759
if (fields.empty()) {
763760
auto it_b = m_clang_type_info.insert(
@@ -1432,7 +1429,7 @@ CompilerType SwiftLanguageRuntimeImpl::GetChildCompilerTypeAtIndex(
14321429
auto fields = rti->getFields();
14331430

14341431
// Handle tuples.
1435-
if (idx > rti->getNumFields())
1432+
if (idx >= rti->getNumFields())
14361433
LLDB_LOGF(GetLog(LLDBLog::Types), "index %zu is out of bounds (%d)", idx,
14371434
rti->getNumFields());
14381435
llvm::Optional<TypeSystemSwift::TupleElement> tuple;

lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,26 @@ TypeSystemSwiftTypeRef::GetClangTypeNode(CompilerType clang_type,
298298
llvm::StringRef swift_name;
299299
llvm::StringRef module_name = swift::MANGLING_MODULE_OBJC;
300300
CompilerType pointee;
301-
if (clang_type.IsPointerType(&pointee))
301+
if (clang_type.IsPointerType(&pointee)) {
302302
clang_type = pointee;
303+
if (clang_type.IsVoidType()) {
304+
// Sugar (void *) as "UnsafeMutableRawPointer?".
305+
NodePointer optional = dem.createNode(Node::Kind::SugaredOptional);
306+
NodePointer type = dem.createNode(Node::Kind::Type);
307+
NodePointer module = dem.createNodeWithAllocatedText(Node::Kind::Module,
308+
swift::STDLIB_NAME);
309+
NodePointer identifier = dem.createNodeWithAllocatedText(
310+
Node::Kind::Identifier, clang_type.IsConst()
311+
? "UnsafeRawPointer"
312+
: "UnsafeMutableRawPointer");
313+
NodePointer nominal = dem.createNode(kind);
314+
nominal->addChild(module, dem);
315+
nominal->addChild(identifier, dem);
316+
type->addChild(nominal, dem);
317+
optional->addChild(type, dem);
318+
return optional;
319+
}
320+
}
303321
llvm::StringRef clang_name = clang_type.GetTypeName().GetStringRef();
304322
#define MAP_TYPE(C_TYPE_NAME, C_TYPE_KIND, C_TYPE_BITWIDTH, SWIFT_MODULE_NAME, \
305323
SWIFT_TYPE_NAME, CAN_BE_MISSING, C_NAME_MAPPING) \

lldb/test/API/lang/swift/dwarfimporter/C/Inputs/c-header.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,8 @@ union DoubleLongUnion {
1212
double double_val;
1313
long long_val;
1414
};
15+
16+
struct WithPointer {
17+
void *ptr;
18+
const void *const_ptr;
19+
};

lldb/test/API/lang/swift/dwarfimporter/C/TestSwiftDWARFImporterC.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ def test_dwarf_importer(self):
6161
# substrs=["(DoubleLongUnion)", "long_val = 42"])
6262
self.expect("target variable fromSubmodule",
6363
substrs=["(FromSubmodule)", "x = 1", "y = 2", "z = 3"])
64+
self.expect("target variable withPointer",
65+
substrs=["(WithPointer)", "ptr = nil"])
6466

6567
@skipIf(archs=['ppc64le'], bugnumber='SR-10214')
6668
@swiftTest

lldb/test/API/lang/swift/dwarfimporter/C/main.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ let swiftStructCMember = SwiftStructCMember()
2222
let typedef = TPoint(x: 5, y: 6)
2323
let union = DoubleLongUnion(long_val: 42)
2424
let fromSubmodule = FromSubmodule(x: 1, y: 2, z: 3)
25+
let withPointer = WithPointer(ptr: UnsafeMutableRawPointer(bitPattern: 0x0),
26+
const_ptr: UnsafeMutableRawPointer(bitPattern: 0x0))
2527

2628
use(pureSwift) // break here
2729
use(point)
@@ -31,3 +33,4 @@ use(swiftStructCMember)
3133
use(typedef)
3234
use(union)
3335
use(fromSubmodule)
36+
use(withPointer)

0 commit comments

Comments
 (0)