ProgramStateRef ProgramStateManager::getPersistentState(ProgramState &State) { llvm::FoldingSetNodeID ID; State.Profile(ID); void *InsertPos; if (ProgramState *I = StateSet.FindNodeOrInsertPos(ID, InsertPos)) return I; ProgramState *newState = nullptr; if (!freeStates.empty()) { newState = freeStates.back(); freeStates.pop_back(); } else { newState = (ProgramState*) Alloc.Allocate<ProgramState>(); } new (newState) ProgramState(State); StateSet.InsertNode(newState, InsertPos); return newState; }