@Override protected void action(PointerKey lexicalKey, int vn) { PointerKey rval = getPointerKeyForLocal(vn); if (contentsAreInvariant(symbolTable, du, vn)) { InstanceKey[] ik = getInvariantContents(vn); system.recordImplicitPointsToSet(rval); for (InstanceKey element : ik) { system.findOrCreateIndexForInstanceKey(element); system.newConstraint(lexicalKey, element); } } else { system.newConstraint(lexicalKey, assignOperator, rval); } } });
@Override protected void action(PointerKey lexicalKey, int vn) { PointerKey rval = getPointerKeyForLocal(vn); if (contentsAreInvariant(symbolTable, du, vn)) { InstanceKey[] ik = getInvariantContents(vn); system.recordImplicitPointsToSet(rval); for (InstanceKey element : ik) { system.findOrCreateIndexForInstanceKey(element); system.newConstraint(lexicalKey, element); } } else { system.newConstraint(lexicalKey, assignOperator, rval); } } });
/** * Add a constraint to the system indicating that the contents of local src flows to dst, with no special type filter. */ private void addPiAssignment(PointerKey dst, int src) { PointerKey srcKey = getPointerKeyForLocal(src); if (contentsAreInvariant(symbolTable, du, src)) { system.recordImplicitPointsToSet(srcKey); InstanceKey[] ik = getInvariantContents(src); for (InstanceKey element : ik) { system.newConstraint(dst, element); } } else { system.newConstraint(dst, assignOperator, srcKey); } }
/** * Add a constraint to the system indicating that the contents of local src flows to dst, with no special type filter. */ private void addPiAssignment(PointerKey dst, int src) { PointerKey srcKey = getPointerKeyForLocal(src); if (contentsAreInvariant(symbolTable, du, src)) { system.recordImplicitPointsToSet(srcKey); InstanceKey[] ik = getInvariantContents(src); for (InstanceKey element : ik) { system.newConstraint(dst, element); } } else { system.newConstraint(dst, assignOperator, srcKey); } }
@Override public void visitPhi(SSAPhiInstruction instruction) { if (ir.getMethod() instanceof AbstractRootMethod) { PointerKey dst = getPointerKeyForLocal(instruction.getDef()); if (hasNoInterestingUses(instruction.getDef())) { system.recordImplicitPointsToSet(dst); } else { for (int i = 0; i < instruction.getNumberOfUses(); i++) { PointerKey use = getPointerKeyForLocal(instruction.getUse(i)); if (contentsAreInvariant(symbolTable, du, instruction.getUse(i))) { system.recordImplicitPointsToSet(use); InstanceKey[] ik = getInvariantContents(instruction.getUse(i)); for (InstanceKey element : ik) { system.newConstraint(dst, element); } } else { system.newConstraint(dst, assignOperator, use); } } } } }
@Override public void visitPhi(SSAPhiInstruction instruction) { if (ir.getMethod() instanceof AbstractRootMethod) { PointerKey dst = getPointerKeyForLocal(instruction.getDef()); if (hasNoInterestingUses(instruction.getDef())) { system.recordImplicitPointsToSet(dst); } else { for (int i = 0; i < instruction.getNumberOfUses(); i++) { PointerKey use = getPointerKeyForLocal(instruction.getUse(i)); if (contentsAreInvariant(symbolTable, du, instruction.getUse(i))) { system.recordImplicitPointsToSet(use); InstanceKey[] ik = getInvariantContents(instruction.getUse(i)); for (InstanceKey element : ik) { system.newConstraint(dst, element); } } else { system.newConstraint(dst, assignOperator, use); } } } } }
public void newFieldWrite(CGNode opNode, int objVn, int fieldsVn, int rhsVn) { IRView ir = getBuilder().getCFAContextInterpreter().getIRView(opNode); SymbolTable symtab = ir.getSymbolTable(); DefUse du = getBuilder().getCFAContextInterpreter().getDU(opNode); PointerKey rhsKey = getBuilder().getPointerKeyForLocal(opNode, rhsVn); if (contentsAreInvariant(symtab, du, rhsVn)) { system.recordImplicitPointsToSet(rhsKey); newFieldWrite(opNode, objVn, fieldsVn, getInvariantContents(symtab, du, opNode, rhsVn)); } else { newFieldWrite(opNode, objVn, fieldsVn, rhsKey); } }
public void newFieldWrite(CGNode opNode, int objVn, int fieldsVn, int rhsVn) { IRView ir = getBuilder().getCFAContextInterpreter().getIRView(opNode); SymbolTable symtab = ir.getSymbolTable(); DefUse du = getBuilder().getCFAContextInterpreter().getDU(opNode); PointerKey rhsKey = getBuilder().getPointerKeyForLocal(opNode, rhsVn); if (contentsAreInvariant(symtab, du, rhsVn)) { system.recordImplicitPointsToSet(rhsKey); newFieldWrite(opNode, objVn, fieldsVn, getInvariantContents(symtab, du, opNode, rhsVn)); } else { newFieldWrite(opNode, objVn, fieldsVn, rhsKey); } }
protected void newFieldOperationFieldConstant(CGNode opNode, final boolean isLoadOperation, final ReflectedFieldAction action, final int objVn, final InstanceKey[] fieldsKeys) { IRView ir = getBuilder().getCFAContextInterpreter().getIRView(opNode); SymbolTable symtab = ir.getSymbolTable(); DefUse du = getBuilder().getCFAContextInterpreter().getDU(opNode); PointerKey objKey = getBuilder().getPointerKeyForLocal(opNode, objVn); if (contentsAreInvariant(symtab, du, objVn)) { system.recordImplicitPointsToSet(objKey); InstanceKey[] objectKeys = getInvariantContents(symtab, du, opNode, objVn); newFieldOperationObjectAndFieldConstant(isLoadOperation, action, objectKeys, fieldsKeys); } else { newFieldOperationOnlyFieldConstant(isLoadOperation, action, objKey, fieldsKeys); } }
protected void newFieldOperationFieldConstant(CGNode opNode, final boolean isLoadOperation, final ReflectedFieldAction action, final int objVn, final InstanceKey[] fieldsKeys) { IRView ir = getBuilder().getCFAContextInterpreter().getIRView(opNode); SymbolTable symtab = ir.getSymbolTable(); DefUse du = getBuilder().getCFAContextInterpreter().getDU(opNode); PointerKey objKey = getBuilder().getPointerKeyForLocal(opNode, objVn); if (contentsAreInvariant(symtab, du, objVn)) { system.recordImplicitPointsToSet(objKey); InstanceKey[] objectKeys = getInvariantContents(symtab, du, opNode, objVn); newFieldOperationObjectAndFieldConstant(isLoadOperation, action, objectKeys, fieldsKeys); } else { newFieldOperationOnlyFieldConstant(isLoadOperation, action, objKey, fieldsKeys); } }
@Override public void visitReturn(SSAReturnInstruction instruction) { // skip returns of primitive type if (instruction.returnsPrimitiveType() || instruction.returnsVoid()) { return; } if (DEBUG) { System.err.println("visitReturn: " + instruction); } PointerKey returnValue = getPointerKeyForReturnValue(); PointerKey result = getPointerKeyForLocal(instruction.getResult()); if (contentsAreInvariant(symbolTable, du, instruction.getResult())) { system.recordImplicitPointsToSet(result); InstanceKey[] ik = getInvariantContents(instruction.getResult()); for (InstanceKey element : ik) { if (DEBUG) { System.err.println("invariant contents: " + returnValue + ' ' + element); } system.newConstraint(returnValue, element); } } else { system.newConstraint(returnValue, assignOperator, result); } }
@Override public void visitReturn(SSAReturnInstruction instruction) { // skip returns of primitive type if (instruction.returnsPrimitiveType() || instruction.returnsVoid()) { return; } if (DEBUG) { System.err.println("visitReturn: " + instruction); } PointerKey returnValue = getPointerKeyForReturnValue(); PointerKey result = getPointerKeyForLocal(instruction.getResult()); if (contentsAreInvariant(symbolTable, du, instruction.getResult())) { system.recordImplicitPointsToSet(result); InstanceKey[] ik = getInvariantContents(instruction.getResult()); for (InstanceKey element : ik) { if (DEBUG) { System.err.println("invariant contents: " + returnValue + ' ' + element); } system.newConstraint(returnValue, element); } } else { system.newConstraint(returnValue, assignOperator, result); } }
@Override public void visitAstGlobalRead(AstGlobalRead instruction) { int lval = instruction.getDef(); FieldReference field = makeNonGlobalFieldReference(instruction.getDeclaredField()); PointerKey def = getPointerKeyForLocal(lval); assert def != null; IField f = getClassHierarchy().resolveField(field); assert f != null : "could not resolve referenced global " + field; if (hasNoInterestingUses(lval)) { system.recordImplicitPointsToSet(def); } else { InstanceKey globalObj = getBuilder().getGlobalObject(JavaScriptTypes.jsName); if (directGlobalObjectRef(field)) { // points-to set is just the global object system.newConstraint(def, globalObj); } else { system.findOrCreateIndexForInstanceKey(globalObj); PointerKey p = getPointerKeyForInstanceField(globalObj, f); system.newConstraint(def, assignOperator, p); } } }
@Override public void visitLoadMetadata(SSALoadMetadataInstruction instruction) { PointerKey def = getPointerKeyForLocal(instruction.getDef()); InstanceKey iKey = getInstanceKeyForClassObject(instruction.getToken(), instruction.getType()); if (instruction.getToken() instanceof TypeReference) { IClass klass = getClassHierarchy().lookupClass((TypeReference) instruction.getToken()); if (klass != null) { processClassInitializer(klass); } } if (!contentsAreInvariant(symbolTable, du, instruction.getDef())) { system.newConstraint(def, iKey); } else { system.findOrCreateIndexForInstanceKey(iKey); system.recordImplicitPointsToSet(def); } }
@Override public void visitAstGlobalRead(AstGlobalRead instruction) { int lval = instruction.getDef(); FieldReference field = makeNonGlobalFieldReference(instruction.getDeclaredField()); PointerKey def = getPointerKeyForLocal(lval); assert def != null; IField f = getClassHierarchy().resolveField(field); assert f != null : "could not resolve referenced global " + field; if (hasNoInterestingUses(lval)) { system.recordImplicitPointsToSet(def); } else { InstanceKey globalObj = getBuilder().getGlobalObject(JavaScriptTypes.jsName); if (directGlobalObjectRef(field)) { // points-to set is just the global object system.newConstraint(def, globalObj); } else { system.findOrCreateIndexForInstanceKey(globalObj); PointerKey p = getPointerKeyForInstanceField(globalObj, f); system.newConstraint(def, assignOperator, p); } } }
@Override public void visitLoadMetadata(SSALoadMetadataInstruction instruction) { PointerKey def = getPointerKeyForLocal(instruction.getDef()); InstanceKey iKey = getInstanceKeyForClassObject(instruction.getToken(), instruction.getType()); if (instruction.getToken() instanceof TypeReference) { IClass klass = getClassHierarchy().lookupClass((TypeReference) instruction.getToken()); if (klass != null) { processClassInitializer(klass); } } if (!contentsAreInvariant(symbolTable, du, instruction.getDef())) { system.newConstraint(def, iKey); } else { system.findOrCreateIndexForInstanceKey(iKey); system.recordImplicitPointsToSet(def); } }
@Override protected void action(PointerKey lexicalKey, int vn) { PointerKey lval = getPointerKeyForLocal(vn); if (lexicalKey instanceof LocalPointerKey) { CGNode lnode = ((LocalPointerKey) lexicalKey).getNode(); int lvn = ((LocalPointerKey) lexicalKey).getValueNumber(); IRView lir = getBuilder().getCFAContextInterpreter().getIRView(lnode); SymbolTable lsymtab = lir.getSymbolTable(); DefUse ldu = getBuilder().getCFAContextInterpreter().getDU(lnode); // DefUse ldu = getAnalysisCache().getDefUse(lir); if (contentsAreInvariant(lsymtab, ldu, lvn)) { InstanceKey[] ik = getInvariantContents(lsymtab, ldu, lnode, lvn); system.recordImplicitPointsToSet(lexicalKey); for (InstanceKey element : ik) { system.findOrCreateIndexForInstanceKey(element); system.newConstraint(lval, element); } return; } } system.newConstraint(lval, assignOperator, lexicalKey); } });
protected void processPutStatic(int rval, FieldReference field, IField f) { PointerKey fKey = getPointerKeyForStaticField(f); PointerKey rvalKey = getPointerKeyForLocal(rval); // if (!supportFullPointerFlowGraph && // contentsAreInvariant(rval)) { if (contentsAreInvariant(symbolTable, du, rval)) { system.recordImplicitPointsToSet(rvalKey); InstanceKey[] ik = getInvariantContents(rval); for (InstanceKey element : ik) { system.newConstraint(fKey, element); } } else { system.newConstraint(fKey, assignOperator, rvalKey); } if (DEBUG) { System.err.println("visitPut class init " + field.getDeclaringClass() + ' ' + field); } // side effect of putstatic: may call class initializer IClass klass = getClassHierarchy().lookupClass(field.getDeclaringClass()); if (klass == null) { Warnings.add(FieldResolutionFailure.create(field)); } else { processClassInitializer(klass); } }
@Override public void visitAstGlobalWrite(AstGlobalWrite instruction) { int rval = instruction.getVal(); FieldReference field = makeNonGlobalFieldReference(instruction.getDeclaredField()); IField f = getClassHierarchy().resolveField(field); assert f != null : "could not resolve referenced global " + field; assert !f.getFieldTypeReference().isPrimitiveType(); InstanceKey globalObj = getBuilder().getGlobalObject(JavaScriptTypes.jsName); system.findOrCreateIndexForInstanceKey(globalObj); PointerKey p = getPointerKeyForInstanceField(globalObj, f); PointerKey rvalKey = getPointerKeyForLocal(rval); if (contentsAreInvariant(symbolTable, du, rval)) { system.recordImplicitPointsToSet(rvalKey); InstanceKey[] ik = getInvariantContents(rval); for (InstanceKey element : ik) { system.newConstraint(p, element); } } else { system.newConstraint(p, assignOperator, rvalKey); } }
@Override public void visitAstGlobalWrite(AstGlobalWrite instruction) { int rval = instruction.getVal(); FieldReference field = makeNonGlobalFieldReference(instruction.getDeclaredField()); IField f = getClassHierarchy().resolveField(field); assert f != null : "could not resolve referenced global " + field; assert !f.getFieldTypeReference().isPrimitiveType(); InstanceKey globalObj = getBuilder().getGlobalObject(JavaScriptTypes.jsName); system.findOrCreateIndexForInstanceKey(globalObj); PointerKey p = getPointerKeyForInstanceField(globalObj, f); PointerKey rvalKey = getPointerKeyForLocal(rval); if (contentsAreInvariant(symbolTable, du, rval)) { system.recordImplicitPointsToSet(rvalKey); InstanceKey[] ik = getInvariantContents(rval); for (InstanceKey element : ik) { system.newConstraint(p, element); } } else { system.newConstraint(p, assignOperator, rvalKey); } }