@@ -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
}
@@ -1395,23 +1374,12 @@ class ClangRecordLowering {
1395
1374
void collectBases (const clang::RecordDecl *decl) {
1396
1375
auto &layout = decl->getASTContext ().getASTRecordLayout (decl);
1397
1376
if (auto cxxRecord = dyn_cast<clang::CXXRecordDecl>(decl)) {
1398
- for (auto base : cxxRecord->bases ()) {
1399
- if (base.isVirtual ())
1400
- continue ;
1401
-
1402
- auto baseType = base.getType ().getCanonicalType ();
1403
-
1404
- auto baseRecord = cast<clang::RecordType>(baseType)->getDecl ();
1405
- auto baseCxxRecord = cast<clang::CXXRecordDecl>(baseRecord);
1406
-
1407
- if (baseCxxRecord->isEmpty ())
1408
- continue ;
1409
-
1410
- auto baseOffset = Size (layout.getBaseClassOffset (baseCxxRecord).getQuantity ());
1411
- SubobjectAdjustment += baseOffset;
1412
- collectBases (baseCxxRecord);
1413
- collectStructFields (baseCxxRecord);
1414
- SubobjectAdjustment -= baseOffset;
1377
+ auto bases = getBasesAndOffsets (cxxRecord);
1378
+ for (auto base : bases) {
1379
+ SubobjectAdjustment += base.offset ;
1380
+ collectBases (base.decl );
1381
+ collectStructFields (base.decl );
1382
+ SubobjectAdjustment -= base.offset ;
1415
1383
}
1416
1384
}
1417
1385
}
0 commit comments