@@ -2197,7 +2197,16 @@ static void addPrepareFunction(const Module &M,
21972197 Fns.push_back (PrepareFn);
21982198}
21992199
2200- static coro::BaseABI *CreateNewABI (Function &F, coro::Shape &S) {
2200+ static coro::BaseABI *
2201+ CreateNewABI (Function &F, coro::Shape &S,
2202+ const SmallVector<CoroSplitPass::BaseABITy> GenCustomABIs) {
2203+ if (S.CoroBegin ->hasCustomABI ()) {
2204+ unsigned CustomABI = S.CoroBegin ->getCustomABI ();
2205+ if (CustomABI >= GenCustomABIs.size ())
2206+ llvm_unreachable (" Custom ABI not found amoung those specified" );
2207+ return GenCustomABIs[CustomABI](F, S);
2208+ }
2209+
22012210 switch (S.ABI ) {
22022211 case coro::ABI::Switch:
22032212 return new coro::SwitchABI (F, S);
@@ -2213,15 +2222,32 @@ static coro::BaseABI *CreateNewABI(Function &F, coro::Shape &S) {
22132222
22142223CoroSplitPass::CoroSplitPass (bool OptimizeFrame)
22152224 : CreateAndInitABI([](Function &F, coro::Shape &S) {
2216- coro::BaseABI *ABI = CreateNewABI (F, S);
2225+ coro::BaseABI *ABI = CreateNewABI (F, S, {});
2226+ ABI->init ();
2227+ return ABI;
2228+ }),
2229+ OptimizeFrame (OptimizeFrame) {}
2230+
2231+ CoroSplitPass::CoroSplitPass (
2232+ SmallVector<CoroSplitPass::BaseABITy> GenCustomABIs, bool OptimizeFrame)
2233+ : CreateAndInitABI([=](Function &F, coro::Shape &S) {
2234+ coro::BaseABI *ABI = CreateNewABI (F, S, GenCustomABIs);
22172235 ABI->init ();
22182236 return ABI;
22192237 }),
22202238 OptimizeFrame (OptimizeFrame) {}
22212239
22222240static coro::BaseABI *
22232241CreateNewABIIsMat (Function &F, coro::Shape &S,
2224- std::function<bool (Instruction &)> IsMatCallback) {
2242+ std::function<bool (Instruction &)> IsMatCallback,
2243+ const SmallVector<CoroSplitPass::BaseABITy> GenCustomABIs) {
2244+ if (S.CoroBegin ->hasCustomABI ()) {
2245+ unsigned CustomABI = S.CoroBegin ->getCustomABI ();
2246+ if (CustomABI >= GenCustomABIs.size ())
2247+ llvm_unreachable (" Custom ABI not found amoung those specified" );
2248+ return GenCustomABIs[CustomABI](F, S);
2249+ }
2250+
22252251 switch (S.ABI ) {
22262252 case coro::ABI::Switch:
22272253 return new coro::SwitchABI (F, S, IsMatCallback);
@@ -2240,7 +2266,20 @@ CreateNewABIIsMat(Function &F, coro::Shape &S,
22402266CoroSplitPass::CoroSplitPass (std::function<bool (Instruction &)> IsMatCallback,
22412267 bool OptimizeFrame)
22422268 : CreateAndInitABI([=](Function &F, coro::Shape &S) {
2243- coro::BaseABI *ABI = CreateNewABIIsMat (F, S, IsMatCallback);
2269+ coro::BaseABI *ABI = CreateNewABIIsMat (F, S, IsMatCallback, {});
2270+ ABI->init ();
2271+ return ABI;
2272+ }),
2273+ OptimizeFrame (OptimizeFrame) {}
2274+
2275+ // For back compatibility, constructor takes a materializable callback and
2276+ // creates a generator for an ABI with a modified materializable callback.
2277+ CoroSplitPass::CoroSplitPass (
2278+ std::function<bool (Instruction &)> IsMatCallback,
2279+ SmallVector<CoroSplitPass::BaseABITy> GenCustomABIs, bool OptimizeFrame)
2280+ : CreateAndInitABI([=](Function &F, coro::Shape &S) {
2281+ coro::BaseABI *ABI =
2282+ CreateNewABIIsMat (F, S, IsMatCallback, GenCustomABIs);
22442283 ABI->init ();
22452284 return ABI;
22462285 }),
0 commit comments