@@ -692,15 +692,10 @@ static bool writeTBDIfNeeded(CompilerInstance &Instance) {
692
692
return false ;
693
693
}
694
694
695
- if (Invocation.getSILOptions ().CrossModuleOptimization ) {
696
- Instance.getDiags ().diagnose (SourceLoc (),
697
- diag::tbd_not_supported_with_cmo);
698
- return false ;
699
- }
700
-
701
695
const std::string &TBDPath = Invocation.getTBDPathForWholeModule ();
702
696
703
- return writeTBD (Instance.getMainModule (), TBDPath, tbdOpts);
697
+ return writeTBD (Instance.getMainModule (), TBDPath, tbdOpts,
698
+ Instance.getPublicCMOSymbols ());
704
699
}
705
700
706
701
static bool performCompileStepsPostSILGen (CompilerInstance &Instance,
@@ -1353,19 +1348,19 @@ static bool processCommandLineAndRunImmediately(CompilerInstance &Instance,
1353
1348
1354
1349
static bool validateTBDIfNeeded (const CompilerInvocation &Invocation,
1355
1350
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
+
1358
1358
const bool canPerformTBDValidation = [&]() {
1359
1359
// If the user has requested we skip validation, honor it.
1360
1360
if (mode == FrontendOptions::TBDValidationMode::None) {
1361
1361
return false ;
1362
1362
}
1363
1363
1364
- // Cross-module optimization does not support TBD.
1365
- if (Invocation.getSILOptions ().CrossModuleOptimization ) {
1366
- return false ;
1367
- }
1368
-
1369
1364
// If we can't validate the given input file, bail early. This covers cases
1370
1365
// like passing raw SIL as a primary file.
1371
1366
const auto &IO = Invocation.getFrontendOptions ().InputsAndOutputs ;
@@ -1426,9 +1421,10 @@ static bool validateTBDIfNeeded(const CompilerInvocation &Invocation,
1426
1421
// noise from e.g. statically-linked libraries.
1427
1422
Opts.embedSymbolsFromModules .clear ();
1428
1423
if (auto *SF = MSF.dyn_cast <SourceFile *>()) {
1429
- return validateTBD (SF, IRModule, Opts, diagnoseExtraSymbolsInTBD);
1424
+ return validateTBD (SF, IRModule, Opts, publicCMOSymbols,
1425
+ diagnoseExtraSymbolsInTBD);
1430
1426
} else {
1431
- return validateTBD (MSF.get <ModuleDecl *>(), IRModule, Opts,
1427
+ return validateTBD (MSF.get <ModuleDecl *>(), IRModule, Opts, publicCMOSymbols,
1432
1428
diagnoseExtraSymbolsInTBD);
1433
1429
}
1434
1430
}
@@ -1621,6 +1617,8 @@ static bool performCompileStepsPostSILGen(CompilerInstance &Instance,
1621
1617
return processCommandLineAndRunImmediately (
1622
1618
Instance, std::move (SM), MSF, observer, ReturnValue);
1623
1619
1620
+ TBDSymbolSetPtr publicCMOSymbols = SM->getPublicCMOSymbols ();
1621
+
1624
1622
StringRef OutputFilename = PSPs.OutputFilename ;
1625
1623
std::vector<std::string> ParallelOutputFilenames =
1626
1624
opts.InputsAndOutputs .copyOutputFilenames ();
@@ -1635,7 +1633,8 @@ static bool performCompileStepsPostSILGen(CompilerInstance &Instance,
1635
1633
if (!IRModule)
1636
1634
return Instance.getDiags ().hadAnyError ();
1637
1635
1638
- if (validateTBDIfNeeded (Invocation, MSF, *IRModule.getModule ()))
1636
+ if (validateTBDIfNeeded (Invocation, MSF, *IRModule.getModule (),
1637
+ publicCMOSymbols))
1639
1638
return true ;
1640
1639
1641
1640
return generateCode (Instance, OutputFilename, IRModule.getModule (),
0 commit comments