Always put SILFunctions into a zombie list, when they are erased.

This removes the function body, but preserves the SILFunction object, which may be still referenced by different kinds of meta-information e.g. debug info for inlined functions, generic specializations information, etc.

Doing this unconditionally simplifies the code and makes it less error-prone to reference SILFunctions from any kind of meta-information. It just works. No need to set any special flags, etc.
This commit is contained in:
Roman Levenstein
2017-08-11 11:14:19 -07:00
parent ca6f9f6d55
commit bae290cdab
3 changed files with 18 additions and 51 deletions

View File

@@ -2231,13 +2231,7 @@ void KeyPathInst::dropReferencedPattern() {
GenericSpecializationInformation::GenericSpecializationInformation(
SILFunction *Caller, SILFunction *Parent, SubstitutionList Subs)
: Caller(Caller), Parent(Parent), Subs(Subs) {
// Specialization information may reference these functions, even
// if they are removed by means of e.g. dead function elimination.
if (Caller)
Caller->setReferencedByMetainformation();
Parent->setReferencedByMetainformation();
}
: Caller(Caller), Parent(Parent), Subs(Subs) {}
const GenericSpecializationInformation *
GenericSpecializationInformation::create(SILFunction *Caller,