IRGen: Deserialize SIL witness tables and shared-linkage definitions by need.

Code may end up indirectly using a witness table for a Clang-imported type by inlining code that used the conformance from another module, in which case we need to ensure we have a local definition at hand in the inlining module so we can have something to link against independently. This needs to be fixed from both sides:

- During serialization, serialize not only witness tables from the current module, but from Clang-imported modules too, so that their definitions can be used by other modules that inline code from the current module
- During IRGen, when we emit a reference to a SILWitnessTable or SILFunction declaration with shared linkage, attempt to deserialize the definition on demand

Fixes rdar://problem/38687726.
This commit is contained in:
Joe Groff
2018-03-28 15:32:01 -07:00
parent 5db268292f
commit ae2d2973d1
9 changed files with 117 additions and 10 deletions

View File

@@ -715,6 +715,11 @@ public:
bool isDefaultAtomic() const {
return ! getOptions().AssumeSingleThreaded;
}
/// Returns true if SIL entities associated with declarations in the given
/// declaration context ought to be serialized as part of this module.
bool shouldSerializeEntitiesAssociatedWithDeclContext(const DeclContext *DC)
const;
};
inline llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const SILModule &M){