@@ -368,28 +368,6 @@ namespace {
368
368
ClangFieldInfo> {
369
369
const clang::RecordDecl *ClangDecl;
370
370
371
- template <class Fn >
372
- void forEachNonEmptyBase (Fn fn) const {
373
- auto &layout = ClangDecl->getASTContext ().getASTRecordLayout (ClangDecl);
374
-
375
- if (auto cxxRecord = dyn_cast<clang::CXXRecordDecl>(ClangDecl)) {
376
- for (auto base : cxxRecord->bases ()) {
377
- auto baseType = base.getType ().getCanonicalType ();
378
-
379
- auto baseRecord = cast<clang::RecordType>(baseType)->getDecl ();
380
- auto baseCxxRecord = cast<clang::CXXRecordDecl>(baseRecord);
381
-
382
- if (baseCxxRecord->isEmpty ())
383
- continue ;
384
-
385
- auto offset = layout.getBaseClassOffset (baseCxxRecord);
386
- auto size =
387
- ClangDecl->getASTContext ().getTypeSizeInChars (baseType);
388
- fn (baseType, offset, size);
389
- }
390
- }
391
- }
392
-
393
371
public:
394
372
LoadableClangRecordTypeInfo (ArrayRef<ClangFieldInfo> fields,
395
373
unsigned explosionSize, llvm::Type *storageType,
@@ -446,10 +424,11 @@ namespace {
446
424
447
425
void addToAggLowering (IRGenModule &IGM, SwiftAggLowering &lowering,
448
426
Size offset) const override {
449
- forEachNonEmptyBase ([&](clang::QualType type, clang::CharUnits offset,
450
- clang::CharUnits) {
451
- lowering.addTypedData (type, offset);
452
- });
427
+ if (auto cxxRecordDecl = dyn_cast<clang::CXXRecordDecl>(ClangDecl)) {
428
+ for (auto base : getBasesAndOffsets (cxxRecordDecl)) {
429
+ lowering.addTypedData (base.decl , base.offset .asCharUnits ());
430
+ }
431
+ }
453
432
454
433
lowering.addTypedData (ClangDecl, offset.asCharUnits ());
455
434
}
@@ -1384,23 +1363,12 @@ class ClangRecordLowering {
1384
1363
void collectBases (const clang::RecordDecl *decl) {
1385
1364
auto &layout = decl->getASTContext ().getASTRecordLayout (decl);
1386
1365
if (auto cxxRecord = dyn_cast<clang::CXXRecordDecl>(decl)) {
1387
- for (auto base : cxxRecord->bases ()) {
1388
- if (base.isVirtual ())
1389
- continue ;
1390
-
1391
- auto baseType = base.getType ().getCanonicalType ();
1392
-
1393
- auto baseRecord = cast<clang::RecordType>(baseType)->getDecl ();
1394
- auto baseCxxRecord = cast<clang::CXXRecordDecl>(baseRecord);
1395
-
1396
- if (baseCxxRecord->isEmpty ())
1397
- continue ;
1398
-
1399
- auto baseOffset = Size (layout.getBaseClassOffset (baseCxxRecord).getQuantity ());
1400
- SubobjectAdjustment += baseOffset;
1401
- collectBases (baseCxxRecord);
1402
- collectStructFields (baseCxxRecord);
1403
- SubobjectAdjustment -= baseOffset;
1366
+ auto bases = getBasesAndOffsets (cxxRecord);
1367
+ for (auto base : bases) {
1368
+ SubobjectAdjustment += base.offset ;
1369
+ collectBases (base.decl );
1370
+ collectStructFields (base.decl );
1371
+ SubobjectAdjustment -= base.offset ;
1404
1372
}
1405
1373
}
1406
1374
}
0 commit comments