bool FunctionAccessedStorage::summarizeFunction(SILFunction *F) { assert(accessResult.isEmpty() && "expected uninitialized results."); if (F->isDefinition()) return false; // If the function definition is unavailable, set unidentifiedAccess to a // conservative value, since analyzeInstruction will never be called. // // If FunctionSideEffects can be summarized, use that information. FunctionSideEffects functionSideEffects; if (!functionSideEffects.summarizeFunction(F)) { setWorstEffects(); // May as well consider this a successful summary since there are no // instructions to visit anyway. return true; } bool mayRead = functionSideEffects.getGlobalEffects().mayRead(); bool mayWrite = functionSideEffects.getGlobalEffects().mayWrite(); for (auto ¶mEffects : functionSideEffects.getParameterEffects()) { mayRead |= paramEffects.mayRead(); mayWrite |= paramEffects.mayWrite(); } if (mayWrite) accessResult.setUnidentifiedAccess(SILAccessKind::Modify); else if (mayRead) accessResult.setUnidentifiedAccess(SILAccessKind::Read); // If function side effects is "readnone" then this result will have an empty // storageAccessSet and unidentifiedAccess == None. return true; }