[AutoDiff upstream] Serialize derivative function configurations. (#30672)

Serialize derivative function configurations per module.

`@differentiable` and `@derivative` attributes register derivatives for
`AbstractFunctionDecl`s for a particular "derivative function configuration":
parameter indices and dervative generic signature.

To find `@derivative` functions registered in other Swift modules, derivative
function configurations must be serialized per module. When configurations for
a `AbstractFunctionDecl` are requested, all configurations from imported
modules are deserialized. This module serialization technique has precedent: it
is used for protocol conformances (e.g. extension declarations for a nominal
type) and Obj-C members for a class type.

Add `AbstractFunctionDecl::getDerivativeFunctionConfigurations` entry point
for accessing derivative function configurations.

In the differentiation transform: use
`AbstractFunctionDecl::getDerivativeFunctionConfigurations` to implement
`findMinimalDerivativeConfiguration` for canonical derivative function
configuration lookup, replacing `getMinimalASTDifferentiableAttr`.

Resolves TF-1100.
This commit is contained in:
Dan Zheng
2020-03-27 06:40:27 -07:00
committed by GitHub
parent bbe86e908d
commit 28315487dc
15 changed files with 346 additions and 13 deletions

View File

@@ -993,6 +993,17 @@ void SerializedModuleLoaderBase::loadObjCMethods(
}
}
void SerializedModuleLoaderBase::loadDerivativeFunctionConfigurations(
AbstractFunctionDecl *originalAFD, unsigned int previousGeneration,
llvm::SetVector<AutoDiffConfig> &results) {
for (auto &modulePair : LoadedModuleFiles) {
if (modulePair.second <= previousGeneration)
continue;
modulePair.first->loadDerivativeFunctionConfigurations(originalAFD,
results);
}
}
std::error_code MemoryBufferSerializedModuleLoader::findModuleFilesInDirectory(
AccessPathElem ModuleID,
const SerializedModuleBaseName &BaseName,