@@ -472,7 +472,7 @@ class DestroyLocalVariable : public Cleanup {
472
472
Var->print(llvm::errs());
473
473
llvm::errs() << "\n";
474
474
if (isActive()) {
475
- auto & loc = SGF.VarLocs[Var];
475
+ auto loc = SGF.VarLocs[Var];
476
476
assert((loc.box || loc.value) && "One of box or value should be set");
477
477
if (loc.box) {
478
478
llvm::errs() << "Box: " << loc.box << "\n";
@@ -664,8 +664,7 @@ class LocalVariableInitialization : public SingleBufferInitialization {
664
664
/// decl to.
665
665
assert(SGF.VarLocs.count(decl) == 0 && "Already emitted the local?");
666
666
667
- SGF.VarLocs[decl] = SILGenFunction::VarLoc(Addr,
668
- SILAccessEnforcement::Dynamic, Box);
667
+ SGF.VarLocs[decl] = SILGenFunction::VarLoc::get(Addr, Box);
669
668
670
669
SingleBufferInitialization::finishInitialization(SGF);
671
670
assert(!DidFinish &&
@@ -678,54 +677,6 @@ class LocalVariableInitialization : public SingleBufferInitialization {
678
677
} // end anonymous namespace
679
678
680
679
namespace {
681
-
682
- static void deallocateAddressable(SILGenFunction &SGF,
683
- SILLocation l,
684
- SILGenFunction::VarLoc &loc) {
685
- SGF.B.createEndBorrow(l, loc.addressableBuffer.state->storeBorrow);
686
- SGF.B.createDeallocStack(l, loc.addressableBuffer.state->allocStack);
687
- if (loc.addressableBuffer.state->reabstraction) {
688
- SGF.B.createDestroyValue(l, loc.addressableBuffer.state->reabstraction);
689
- }
690
- }
691
-
692
- /// Cleanup to deallocate the addressable buffer for a parameter or let
693
- /// binding.
694
- class DeallocateLocalVariableAddressableBuffer : public Cleanup {
695
- ValueDecl *vd;
696
- public:
697
- DeallocateLocalVariableAddressableBuffer(ValueDecl *vd) : vd(vd) {}
698
-
699
- void emit(SILGenFunction &SGF, CleanupLocation l,
700
- ForUnwind_t forUnwind) override {
701
- auto found = SGF.VarLocs.find(vd);
702
- if (found == SGF.VarLocs.end()) {
703
- return;
704
- }
705
- auto &loc = found->second;
706
-
707
- if (loc.addressableBuffer.state) {
708
- // The addressable buffer was forced, so clean it up now.
709
- deallocateAddressable(SGF, l, loc);
710
- } else {
711
- // Remember this insert location in case we need to force the addressable
712
- // buffer later.
713
- SILInstruction *marker = SGF.B.createTuple(l, {});
714
- loc.addressableBuffer.cleanupPoints.emplace_back(marker);
715
- }
716
- }
717
-
718
- void dump(SILGenFunction &SGF) const override {
719
- #ifndef NDEBUG
720
- llvm::errs() << "DeallocateLocalVariableAddressableBuffer\n"
721
- << "State:" << getState() << "\n"
722
- << "Decl: ";
723
- vd->print(llvm::errs());
724
- llvm::errs() << "\n";
725
- #endif
726
- }
727
- };
728
-
729
680
/// Initialize a writeback buffer that receives the value of a 'let'
730
681
/// declaration.
731
682
class LetValueInitialization : public Initialization {
@@ -804,8 +755,7 @@ class LetValueInitialization : public Initialization {
804
755
if (isUninitialized)
805
756
address = SGF.B.createMarkUninitializedVar(vd, address);
806
757
DestroyCleanup = SGF.enterDormantTemporaryCleanup(address, *lowering);
807
- SGF.VarLocs[vd] = SILGenFunction::VarLoc(address,
808
- SILAccessEnforcement::Unknown);
758
+ SGF.VarLocs[vd] = SILGenFunction::VarLoc::get(address);
809
759
}
810
760
// Push a cleanup to destroy the let declaration. This has to be
811
761
// inactive until the variable is initialized: if control flow exits the
@@ -816,10 +766,6 @@ class LetValueInitialization : public Initialization {
816
766
SGF.Cleanups.pushCleanupInState<DestroyLocalVariable>(
817
767
CleanupState::Dormant, vd);
818
768
DestroyCleanup = SGF.Cleanups.getTopCleanup();
819
-
820
- // If the binding has an addressable buffer forced, it should be cleaned
821
- // up here.
822
- SGF.enterLocalVariableAddressableBufferScope(vd);
823
769
}
824
770
825
771
~LetValueInitialization() override {
@@ -937,8 +883,7 @@ class LetValueInitialization : public Initialization {
937
883
if (SGF.getASTContext().SILOpts.supportsLexicalLifetimes(SGF.getModule()))
938
884
value = getValueForLexicalLifetimeBinding(SGF, loc, value, wasPlusOne);
939
885
940
- SGF.VarLocs[vd] = SILGenFunction::VarLoc(value,
941
- SILAccessEnforcement::Unknown);
886
+ SGF.VarLocs[vd] = SILGenFunction::VarLoc::get(value);
942
887
943
888
// Emit a debug_value[_addr] instruction to record the start of this value's
944
889
// lifetime, if permitted to do so.
@@ -1518,7 +1463,7 @@ SILGenFunction::emitInitializationForVarDecl(VarDecl *vd, bool forceImmutable,
1518
1463
assert(SILDebugClient && "Debugger client doesn't support SIL");
1519
1464
SILValue SV = SILDebugClient->emitLValueForVariable(vd, B);
1520
1465
1521
- VarLocs[vd] = VarLoc(SV, SILAccessEnforcement::Dynamic );
1466
+ VarLocs[vd] = SILGenFunction:: VarLoc::get(SV );
1522
1467
return InitializationPtr(new KnownAddressInitialization(SV));
1523
1468
}
1524
1469
@@ -1549,7 +1494,7 @@ SILGenFunction::emitInitializationForVarDecl(VarDecl *vd, bool forceImmutable,
1549
1494
if (isUninitialized)
1550
1495
addr = B.createMarkUninitializedVar(loc, addr);
1551
1496
1552
- VarLocs[vd] = VarLoc(addr, SILAccessEnforcement::Dynamic );
1497
+ VarLocs[vd] = SILGenFunction:: VarLoc::get(addr );
1553
1498
Result = InitializationPtr(new KnownAddressInitialization(addr));
1554
1499
} else {
1555
1500
std::optional<MarkUninitializedInst::Kind> uninitKind;
@@ -2364,7 +2309,7 @@ void SILGenFunction::destroyLocalVariable(SILLocation silLoc, VarDecl *vd) {
2364
2309
}
2365
2310
};
2366
2311
2367
- auto & loc = VarLocs[vd];
2312
+ auto loc = VarLocs[vd];
2368
2313
2369
2314
// For a heap variable, the box is responsible for the value. We just need
2370
2315
// to give up our retain count on it.
@@ -2461,101 +2406,6 @@ void SILGenFunction::destroyLocalVariable(SILLocation silLoc, VarDecl *vd) {
2461
2406
llvm_unreachable("unhandled case");
2462
2407
}
2463
2408
2464
- void
2465
- SILGenFunction::enterLocalVariableAddressableBufferScope(VarDecl *decl) {
2466
- Cleanups.pushCleanup<DeallocateLocalVariableAddressableBuffer>(decl);
2467
- }
2468
-
2469
- SILValue
2470
- SILGenFunction::getLocalVariableAddressableBuffer(VarDecl *decl,
2471
- SILLocation curLoc,
2472
- ValueOwnership ownership) {
2473
- auto foundVarLoc = VarLocs.find(decl);
2474
- if (foundVarLoc == VarLocs.end()) {
2475
- return SILValue();
2476
- }
2477
-
2478
- auto &varLoc = foundVarLoc->second;
2479
- SILType fullyAbstractedTy = getLoweredType(AbstractionPattern::getOpaque(),
2480
- decl->getTypeInContext()->getRValueType());
2481
-
2482
- // Check whether the bound value is inherently suitable for addressability.
2483
- // It must already be in memory and fully abstracted.
2484
- if (varLoc.value->getType().isAddress()
2485
- && fullyAbstractedTy.getASTType()==varLoc.value->getType().getASTType()) {
2486
- SILValue address = varLoc.value;
2487
- // Begin an access if the address is mutable.
2488
- if (varLoc.access != SILAccessEnforcement::Unknown) {
2489
- address = B.emitBeginAccess(curLoc, address,
2490
- ownership == ValueOwnership::InOut ? SILAccessKind::Modify
2491
- : SILAccessKind::Read,
2492
- varLoc.access);
2493
- }
2494
- return address;
2495
- }
2496
-
2497
- // We can't retroactively introduce a reabstracted representation for a
2498
- // mutable binding (since we would now have two mutable memory locations
2499
- // representing the same value).
2500
- if (varLoc.access != SILAccessEnforcement::Unknown) {
2501
- return SILValue();
2502
- }
2503
-
2504
- assert(ownership == ValueOwnership::Shared);
2505
-
2506
- // Check whether the in-memory representation has already been forced.
2507
- if (auto &state = varLoc.addressableBuffer.state) {
2508
- return state->storeBorrow;
2509
- }
2510
-
2511
- // Otherwise, force the addressable representation.
2512
- SILValue reabstraction, allocStack, storeBorrow;
2513
- {
2514
- SavedInsertionPointRAII save(B);
2515
- B.setInsertionPoint(varLoc.value->getNextInstruction());
2516
- auto declarationLoc = varLoc.value->getDefiningInsertionPoint()->getLoc();
2517
-
2518
- // Reabstract if necessary.
2519
- auto value = varLoc.value;
2520
- reabstraction = SILValue();
2521
- if (value->getType().getASTType() != fullyAbstractedTy.getASTType()){
2522
- auto reabstracted = emitSubstToOrigValue(curLoc,
2523
- ManagedValue::forBorrowedRValue(value),
2524
- AbstractionPattern::getOpaque(),
2525
- decl->getTypeInContext()->getCanonicalType(),
2526
- SGFContext());
2527
- reabstraction = reabstracted.forward(*this);
2528
- value = reabstraction;
2529
- }
2530
- // TODO: reabstract
2531
- allocStack = B.createAllocStack(declarationLoc, value->getType(),
2532
- std::nullopt,
2533
- DoesNotHaveDynamicLifetime,
2534
- IsNotLexical,
2535
- IsNotFromVarDecl,
2536
- DoesNotUseMoveableValueDebugInfo,
2537
- /*skipVarDeclAssert*/ true);
2538
- storeBorrow = B.createStoreBorrow(declarationLoc, value, allocStack);
2539
- }
2540
-
2541
- // Record the addressable representation.
2542
- varLoc.addressableBuffer.state
2543
- = std::make_unique<VarLoc::AddressableBuffer::State>(reabstraction,
2544
- allocStack,
2545
- storeBorrow);
2546
-
2547
- // Emit cleanups on any paths where we previously would have cleaned up
2548
- // the addressable representation if it had been forced earlier.
2549
- for (SILInstruction *cleanupPoint : varLoc.addressableBuffer.cleanupPoints) {
2550
- SavedInsertionPointRAII insertCleanup(B, cleanupPoint);
2551
- deallocateAddressable(*this, cleanupPoint->getLoc(), varLoc);
2552
- cleanupPoint->eraseFromParent();
2553
- }
2554
- varLoc.addressableBuffer.cleanupPoints.clear();
2555
-
2556
- return storeBorrow;
2557
- }
2558
-
2559
2409
void BlackHoleInitialization::performPackExpansionInitialization(
2560
2410
SILGenFunction &SGF,
2561
2411
SILLocation loc,
@@ -2587,9 +2437,3 @@ void BlackHoleInitialization::copyOrInitValueInto(SILGenFunction &SGF, SILLocati
2587
2437
value = SGF.B.createMoveValue(loc, value);
2588
2438
SGF.B.createIgnoredUse(loc, value.getValue());
2589
2439
}
2590
-
2591
- SILGenFunction::VarLoc::AddressableBuffer::~AddressableBuffer() {
2592
- for (auto cleanupPoint : cleanupPoints) {
2593
- cleanupPoint->eraseFromParent();
2594
- }
2595
- }
0 commit comments