Add a mechanism to let cross-module-optimization add additional TBD symbols.

PublicCMOSymbols stores symbols which are made public by cross-module-optimizations.
Those symbols are primarily stored in SILModule and eventually used by TBD generation and validation.
This commit is contained in:
Erik Eckstein
2021-12-15 18:42:38 +01:00
parent 31a1c08083
commit c55f040308
13 changed files with 117 additions and 41 deletions

View File

@@ -692,15 +692,10 @@ static bool writeTBDIfNeeded(CompilerInstance &Instance) {
return false;
}
if (Invocation.getSILOptions().CrossModuleOptimization) {
Instance.getDiags().diagnose(SourceLoc(),
diag::tbd_not_supported_with_cmo);
return false;
}
const std::string &TBDPath = Invocation.getTBDPathForWholeModule();
return writeTBD(Instance.getMainModule(), TBDPath, tbdOpts);
return writeTBD(Instance.getMainModule(), TBDPath, tbdOpts,
Instance.getPublicCMOSymbols());
}
static bool performCompileStepsPostSILGen(CompilerInstance &Instance,
@@ -1353,19 +1348,19 @@ static bool processCommandLineAndRunImmediately(CompilerInstance &Instance,
static bool validateTBDIfNeeded(const CompilerInvocation &Invocation,
ModuleOrSourceFile MSF,
const llvm::Module &IRModule) {
const auto mode = Invocation.getFrontendOptions().ValidateTBDAgainstIR;
const llvm::Module &IRModule,
TBDSymbolSetPtr publicCMOSymbols) {
auto mode = Invocation.getFrontendOptions().ValidateTBDAgainstIR;
if (mode == FrontendOptions::TBDValidationMode::All &&
Invocation.getSILOptions().CrossModuleOptimization)
mode = FrontendOptions::TBDValidationMode::MissingFromTBD;
const bool canPerformTBDValidation = [&]() {
// If the user has requested we skip validation, honor it.
if (mode == FrontendOptions::TBDValidationMode::None) {
return false;
}
// Cross-module optimization does not support TBD.
if (Invocation.getSILOptions().CrossModuleOptimization) {
return false;
}
// If we can't validate the given input file, bail early. This covers cases
// like passing raw SIL as a primary file.
const auto &IO = Invocation.getFrontendOptions().InputsAndOutputs;
@@ -1426,9 +1421,10 @@ static bool validateTBDIfNeeded(const CompilerInvocation &Invocation,
// noise from e.g. statically-linked libraries.
Opts.embedSymbolsFromModules.clear();
if (auto *SF = MSF.dyn_cast<SourceFile *>()) {
return validateTBD(SF, IRModule, Opts, diagnoseExtraSymbolsInTBD);
return validateTBD(SF, IRModule, Opts, publicCMOSymbols,
diagnoseExtraSymbolsInTBD);
} else {
return validateTBD(MSF.get<ModuleDecl *>(), IRModule, Opts,
return validateTBD(MSF.get<ModuleDecl *>(), IRModule, Opts, publicCMOSymbols,
diagnoseExtraSymbolsInTBD);
}
}
@@ -1621,6 +1617,8 @@ static bool performCompileStepsPostSILGen(CompilerInstance &Instance,
return processCommandLineAndRunImmediately(
Instance, std::move(SM), MSF, observer, ReturnValue);
TBDSymbolSetPtr publicCMOSymbols = SM->getPublicCMOSymbols();
StringRef OutputFilename = PSPs.OutputFilename;
std::vector<std::string> ParallelOutputFilenames =
opts.InputsAndOutputs.copyOutputFilenames();
@@ -1635,7 +1633,8 @@ static bool performCompileStepsPostSILGen(CompilerInstance &Instance,
if (!IRModule)
return Instance.getDiags().hadAnyError();
if (validateTBDIfNeeded(Invocation, MSF, *IRModule.getModule()))
if (validateTBDIfNeeded(Invocation, MSF, *IRModule.getModule(),
publicCMOSymbols))
return true;
return generateCode(Instance, OutputFilename, IRModule.getModule(),