private void getInputObjects(PcodeOp pcode, HashSet<Object> inputObjects,
			HashSet<Object> writtenObjects) {
		Varnode[] varNode = pcode.getInputs();
		int vi = 0;
		// if this is a store or load instruction, skip over address space
		int opID = pcode.getOpcode();
		if (opID == PcodeOp.CALL || opID == PcodeOp.BRANCH) {
			return; // flow only
		}
		if (opID == PcodeOp.CBRANCH) {
			++vi; // ignore flow address
		}
		else if (opID == PcodeOp.STORE) {
			++vi; // ignore space ID
		}
		else if (opID == PcodeOp.LOAD) {
			if (varNode[1].isConstant()) {
				AddressSpace space =
					language.getAddressFactory().getAddressSpace((int) varNode[0].getOffset());
				if (space != null) {
					Address inAddr = space.getAddress(varNode[1].getOffset());
					// check that we didn't write to the location
					if (!writtenObjects.contains(inAddr)) {
						inputObjects.add(inAddr);
					}
					return;
				}
			}
			++vi; // ignore space ID
		}
		for (; vi < varNode.length; vi++) {
			Varnode node = varNode[vi];
			Object obj = getVarnodeObject(node);
			if (obj != null && !writtenObjects.contains(obj)) {
				inputObjects.add(obj);
			}
		}
	}
Gather all the flow records (perhaps across multiple InstructionPrototypes via crossbuilds)
and convert to Addresses

@param res is the resulting flow Addresses
@param parsecontext is the parsing context for the current instruction
@param context is the context for the particular address so crossbuilds can be resolved
@throws MemoryAccessException if a memory error occurred while resolving instruction details
@throws UnknownContextException if the gather encounters an instruction not previously parsed
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/SleighInstructionPrototype.java