private void addArrayMatchEdges(LocalPointerKey pk) { Collection<MemoryAccess> arrayWrites = fam.getArrayWrites(null); for (MemoryAccess a : arrayWrites) { addSubgraphForNode(a.getNode()); } for (MemoryAccess a : arrayWrites) { IR ir = a.getNode().getIR(); SSAArrayStoreInstruction s = (SSAArrayStoreInstruction) ir.getInstructions()[a.getInstructionIndex()]; PointerKey r = heapModel.getPointerKeyForLocal(a.getNode(), s.getValue()); assert containsNode(r); assert containsNode(pk); addMatchEdge(pk, r); } }
/* * (non-Javadoc) * * @see com.ibm.domo.ssa.SSAInstruction.Visitor#visitArrayStore(com.ibm.domo.ssa.SSAArrayStoreInstruction) */ @Override public void visitArrayStore(SSAArrayStoreInstruction instruction) { // Assertions.UNREACHABLE(); // skip arrays of primitive type if (instruction.typeIsPrimitive()) { return; } // make node for used value PointerKey value = heapModel.getPointerKeyForLocal(node, instruction.getValue()); addNode(value); // // // (requires the creation of assign constraints as // // the set points-to(a[]) grows.) // PointerKey arrayRef = getPointerKeyForLocal(node, // instruction.getArrayRef()); // // if (!supportFullPointerFlowGraph && // // contentsAreInvariant(instruction.getArrayRef())) { // if (contentsAreInvariant(symbolTable, du, instruction.getArrayRef())) { // system.recordImplicitPointsToSet(arrayRef); // InstanceKey[] ik = getInvariantContents(symbolTable, du, node, // instruction.getArrayRef(), // SSAPropagationCallGraphBuilder.this); // // for (int i = 0; i < ik.length; i++) { // system.findOrCreateIndexForInstanceKey(ik[i]); // PointerKey p = getPointerKeyForArrayContents(ik[i]); // IClass contents = ((ArrayClass) // ik[i].getConcreteType()).getElementClass(); // if (p == null) { // getWarnings().add(ResolutionFailure.create(node, // ik[i].getConcreteType())); // } else { // if (DEBUG_TRACK_INSTANCE) { // if (system.findOrCreateIndexForInstanceKey(ik[i]) == // DEBUG_INSTANCE_KEY) { // Assertions.UNREACHABLE(); // } // } // if (contentsAreInvariant(symbolTable, du, instruction.getValue())) { // system.recordImplicitPointsToSet(value); // InstanceKey[] vk = getInvariantContents(symbolTable, du, node, // instruction.getValue(), // SSAPropagationCallGraphBuilder.this); // for (int j = 0; j < vk.length; j++) { // system.findOrCreateIndexForInstanceKey(vk[j]); // if (vk[j].getConcreteType() != null) { // if (contents.isInterface()) { // if (getClassHierarchy().implementsInterface(vk[j].getConcreteType(), // contents.getReference())) { // system.newConstraint(p, vk[j]); // } // } else { // if (getClassHierarchy().isSubclassOf(vk[j].getConcreteType(), // contents)) { // system.newConstraint(p, vk[j]); // } // } // } // } // } else { // if (isRootType(contents)) { // system.newConstraint(p, assignOperator, value); // } else { // system.newConstraint(p, filterOperator, value); // } // } // } // } // } else { // if (contentsAreInvariant(symbolTable, du, instruction.getValue())) { // system.recordImplicitPointsToSet(value); // InstanceKey[] ik = getInvariantContents(symbolTable, du, node, // instruction.getValue(), // SSAPropagationCallGraphBuilder.this); // for (int i = 0; i < ik.length; i++) { // system.findOrCreateIndexForInstanceKey(ik[i]); // if (Assertions.verifyAssertions) { // Assertions._assert(!system.isUnified(arrayRef)); // } // system.newSideEffect(new InstanceArrayStoreOperator(ik[i]), arrayRef); // } // } else { // system.newSideEffect(new // ArrayStoreOperator(system.findOrCreatePointsToSet(value)), arrayRef); // } // } }