@@ -692,15 +692,10 @@ static bool writeTBDIfNeeded(CompilerInstance &Instance) {
692692 return false ;
693693 }
694694
695- if (Invocation.getSILOptions ().CrossModuleOptimization ) {
696- Instance.getDiags ().diagnose (SourceLoc (),
697- diag::tbd_not_supported_with_cmo);
698- return false ;
699- }
700-
701695 const std::string &TBDPath = Invocation.getTBDPathForWholeModule ();
702696
703- return writeTBD (Instance.getMainModule (), TBDPath, tbdOpts);
697+ return writeTBD (Instance.getMainModule (), TBDPath, tbdOpts,
698+ Instance.getPublicCMOSymbols ());
704699}
705700
706701static bool performCompileStepsPostSILGen (CompilerInstance &Instance,
@@ -1353,19 +1348,19 @@ static bool processCommandLineAndRunImmediately(CompilerInstance &Instance,
13531348
13541349static bool validateTBDIfNeeded (const CompilerInvocation &Invocation,
13551350 ModuleOrSourceFile MSF,
1356- const llvm::Module &IRModule) {
1357- const auto mode = Invocation.getFrontendOptions ().ValidateTBDAgainstIR ;
1351+ const llvm::Module &IRModule,
1352+ TBDSymbolSetPtr publicCMOSymbols) {
1353+ auto mode = Invocation.getFrontendOptions ().ValidateTBDAgainstIR ;
1354+ if (mode == FrontendOptions::TBDValidationMode::All &&
1355+ Invocation.getSILOptions ().CrossModuleOptimization )
1356+ mode = FrontendOptions::TBDValidationMode::MissingFromTBD;
1357+
13581358 const bool canPerformTBDValidation = [&]() {
13591359 // If the user has requested we skip validation, honor it.
13601360 if (mode == FrontendOptions::TBDValidationMode::None) {
13611361 return false ;
13621362 }
13631363
1364- // Cross-module optimization does not support TBD.
1365- if (Invocation.getSILOptions ().CrossModuleOptimization ) {
1366- return false ;
1367- }
1368-
13691364 // If we can't validate the given input file, bail early. This covers cases
13701365 // like passing raw SIL as a primary file.
13711366 const auto &IO = Invocation.getFrontendOptions ().InputsAndOutputs ;
@@ -1426,9 +1421,10 @@ static bool validateTBDIfNeeded(const CompilerInvocation &Invocation,
14261421 // noise from e.g. statically-linked libraries.
14271422 Opts.embedSymbolsFromModules .clear ();
14281423 if (auto *SF = MSF.dyn_cast <SourceFile *>()) {
1429- return validateTBD (SF, IRModule, Opts, diagnoseExtraSymbolsInTBD);
1424+ return validateTBD (SF, IRModule, Opts, publicCMOSymbols,
1425+ diagnoseExtraSymbolsInTBD);
14301426 } else {
1431- return validateTBD (MSF.get <ModuleDecl *>(), IRModule, Opts,
1427+ return validateTBD (MSF.get <ModuleDecl *>(), IRModule, Opts, publicCMOSymbols,
14321428 diagnoseExtraSymbolsInTBD);
14331429 }
14341430}
@@ -1621,6 +1617,8 @@ static bool performCompileStepsPostSILGen(CompilerInstance &Instance,
16211617 return processCommandLineAndRunImmediately (
16221618 Instance, std::move (SM), MSF, observer, ReturnValue);
16231619
1620+ TBDSymbolSetPtr publicCMOSymbols = SM->getPublicCMOSymbols ();
1621+
16241622 StringRef OutputFilename = PSPs.OutputFilename ;
16251623 std::vector<std::string> ParallelOutputFilenames =
16261624 opts.InputsAndOutputs .copyOutputFilenames ();
@@ -1635,7 +1633,8 @@ static bool performCompileStepsPostSILGen(CompilerInstance &Instance,
16351633 if (!IRModule)
16361634 return Instance.getDiags ().hadAnyError ();
16371635
1638- if (validateTBDIfNeeded (Invocation, MSF, *IRModule.getModule ()))
1636+ if (validateTBDIfNeeded (Invocation, MSF, *IRModule.getModule (),
1637+ publicCMOSymbols))
16391638 return true ;
16401639
16411640 return generateCode (Instance, OutputFilename, IRModule.getModule (),
0 commit comments