@@ -702,10 +702,16 @@ static bool writeTBDIfNeeded(CompilerInstance &Instance) {
702702 return false ;
703703 }
704704
705+ if (Invocation.getSILOptions ().CMOMode ==
706+ CrossModuleOptimizationMode::Aggressive) {
707+ Instance.getDiags ().diagnose (SourceLoc (),
708+ diag::tbd_not_supported_with_cmo);
709+ return false ;
710+ }
711+
705712 const std::string &TBDPath = Invocation.getTBDPathForWholeModule ();
706713
707- return writeTBD (Instance.getMainModule (), TBDPath, tbdOpts,
708- Instance.getPublicCMOSymbols ());
714+ return writeTBD (Instance.getMainModule (), TBDPath, tbdOpts);
709715}
710716
711717static bool performCompileStepsPostSILGen (CompilerInstance &Instance,
@@ -1392,19 +1398,19 @@ static bool processCommandLineAndRunImmediately(CompilerInstance &Instance,
13921398
13931399static bool validateTBDIfNeeded (const CompilerInvocation &Invocation,
13941400 ModuleOrSourceFile MSF,
1395- const llvm::Module &IRModule,
1396- TBDSymbolSetPtr publicCMOSymbols) {
1397- auto mode = Invocation.getFrontendOptions ().ValidateTBDAgainstIR ;
1398- if (mode == FrontendOptions::TBDValidationMode::All &&
1399- Invocation.getSILOptions ().CrossModuleOptimization )
1400- mode = FrontendOptions::TBDValidationMode::MissingFromTBD;
1401-
1401+ const llvm::Module &IRModule) {
1402+ const auto mode = Invocation.getFrontendOptions ().ValidateTBDAgainstIR ;
14021403 const bool canPerformTBDValidation = [&]() {
14031404 // If the user has requested we skip validation, honor it.
14041405 if (mode == FrontendOptions::TBDValidationMode::None) {
14051406 return false ;
14061407 }
14071408
1409+ // Cross-module optimization does not support TBD.
1410+ if (Invocation.getSILOptions ().CMOMode == CrossModuleOptimizationMode::Aggressive) {
1411+ return false ;
1412+ }
1413+
14081414 // If we can't validate the given input file, bail early. This covers cases
14091415 // like passing raw SIL as a primary file.
14101416 const auto &IO = Invocation.getFrontendOptions ().InputsAndOutputs ;
@@ -1465,10 +1471,9 @@ static bool validateTBDIfNeeded(const CompilerInvocation &Invocation,
14651471 // noise from e.g. statically-linked libraries.
14661472 Opts.embedSymbolsFromModules .clear ();
14671473 if (auto *SF = MSF.dyn_cast <SourceFile *>()) {
1468- return validateTBD (SF, IRModule, Opts, publicCMOSymbols,
1469- diagnoseExtraSymbolsInTBD);
1474+ return validateTBD (SF, IRModule, Opts, diagnoseExtraSymbolsInTBD);
14701475 } else {
1471- return validateTBD (MSF.get <ModuleDecl *>(), IRModule, Opts, publicCMOSymbols,
1476+ return validateTBD (MSF.get <ModuleDecl *>(), IRModule, Opts,
14721477 diagnoseExtraSymbolsInTBD);
14731478 }
14741479}
@@ -1681,8 +1686,6 @@ static bool performCompileStepsPostSILGen(CompilerInstance &Instance,
16811686 return processCommandLineAndRunImmediately (
16821687 Instance, std::move (SM), MSF, observer, ReturnValue);
16831688
1684- TBDSymbolSetPtr publicCMOSymbols = SM->getPublicCMOSymbols ();
1685-
16861689 StringRef OutputFilename = PSPs.OutputFilename ;
16871690 std::vector<std::string> ParallelOutputFilenames =
16881691 opts.InputsAndOutputs .copyOutputFilenames ();
@@ -1701,8 +1704,7 @@ static bool performCompileStepsPostSILGen(CompilerInstance &Instance,
17011704 if (!IRModule)
17021705 return Instance.getDiags ().hadAnyError ();
17031706
1704- if (validateTBDIfNeeded (Invocation, MSF, *IRModule.getModule (),
1705- publicCMOSymbols))
1707+ if (validateTBDIfNeeded (Invocation, MSF, *IRModule.getModule ()))
17061708 return true ;
17071709
17081710 return generateCode (Instance, OutputFilename, IRModule.getModule (),
0 commit comments