@@ -1394,6 +1394,19 @@ static StructType *buildFrameType(Function &F, coro::Shape &Shape,
13941394 B.getStructAlign () <= Id->getStorageAlignment ());
13951395 break ;
13961396 }
1397+ case coro::ABI::RetconOnceDynamic: {
1398+ // In the dynamic retcon.once ABI, the frame is always inline in the
1399+ // storage.
1400+ Shape.RetconLowering .IsFrameInlineInStorage = true ;
1401+ Shape.RetconLowering .ContextSize =
1402+ alignTo (Shape.FrameSize , Shape.RetconLowering .StorageAlignment );
1403+ if (Shape.RetconLowering .StorageAlignment < Shape.FrameAlign ) {
1404+ report_fatal_error (
1405+ " The alignment requirment of frame variables cannot be higher than "
1406+ " the alignment of the coro function context" );
1407+ }
1408+ break ;
1409+ }
13971410 case coro::ABI::Async: {
13981411 Shape.AsyncLowering .FrameOffset =
13991412 alignTo (Shape.AsyncLowering .ContextHeaderSize , Shape.FrameAlign );
@@ -1969,7 +1982,8 @@ static void insertSpills(const FrameDataInfo &FrameData, coro::Shape &Shape) {
19691982
19701983 // retcon and retcon.once lowering assumes all uses have been sunk.
19711984 if (Shape.ABI == coro::ABI::Retcon || Shape.ABI == coro::ABI::RetconOnce ||
1972- Shape.ABI == coro::ABI::Async) {
1985+ Shape.ABI == coro::ABI::Async ||
1986+ Shape.ABI == coro::ABI::RetconOnceDynamic) {
19731987 // If we found any allocas, replace all of their remaining uses with Geps.
19741988 Builder.SetInsertPoint (SpillBlock, SpillBlock->begin ());
19751989 for (const auto &P : FrameData.Allocas ) {
@@ -2857,7 +2871,8 @@ static void collectFrameAlloca(AllocaInst *AI, coro::Shape &Shape,
28572871 // code.
28582872 bool ShouldUseLifetimeStartInfo =
28592873 (Shape.ABI != coro::ABI::Async && Shape.ABI != coro::ABI::Retcon &&
2860- Shape.ABI != coro::ABI::RetconOnce);
2874+ Shape.ABI != coro::ABI::RetconOnce &&
2875+ Shape.ABI != coro::ABI::RetconOnceDynamic);
28612876 AllocaUseVisitor Visitor{AI->getDataLayout (), DT, Shape, Checker,
28622877 ShouldUseLifetimeStartInfo};
28632878 Visitor.visitPtr (*AI);
@@ -3160,7 +3175,8 @@ void coro::buildCoroutineFrame(
31603175 SmallVector<CoroAllocaAllocInst*, 4 > LocalAllocas;
31613176 SmallVector<Instruction*, 4 > DeadInstructions;
31623177 if (Shape.ABI != coro::ABI::Async && Shape.ABI != coro::ABI::Retcon &&
3163- Shape.ABI != coro::ABI::RetconOnce)
3178+ Shape.ABI != coro::ABI::RetconOnce &&
3179+ Shape.ABI != coro::ABI::RetconOnceDynamic)
31643180 sinkLifetimeStartMarkers (F, Shape, Checker, DT);
31653181
31663182 // Collect the spills for arguments and other not-materializable values.
@@ -3238,7 +3254,8 @@ void coro::buildCoroutineFrame(
32383254
32393255 LLVM_DEBUG (dumpSpills (" Spills" , FrameData.Spills ));
32403256 if (Shape.ABI == coro::ABI::Retcon || Shape.ABI == coro::ABI::RetconOnce ||
3241- Shape.ABI == coro::ABI::Async)
3257+ Shape.ABI == coro::ABI::Async ||
3258+ Shape.ABI == coro::ABI::RetconOnceDynamic)
32423259 sinkSpillUsesAfterCoroBegin (F, FrameData, Shape.CoroBegin );
32433260 Shape.FrameTy = buildFrameType (F, Shape, FrameData);
32443261 Shape.FramePtr = Shape.CoroBegin ;
0 commit comments