public synchronized SignatureResult generateSignatures(Function func, boolean keepcalllist,
			int timeoutSecs, TaskMonitor monitor) {

		decompileMessage = "";
		if (monitor != null && monitor.isCancelled()) {
			return null;
		}

		if (monitor != null) {
			monitor.addCancelledListener(monitorListener);
		}
		Decoder decoder = null;
		try {
			Address funcEntry = func.getEntryPoint();
			decompCallback.setFunction(func, funcEntry, null);
			verifyProcess();
			EncodeDecodeSet activeSet = setupEncodeDecode(funcEntry);
			decoder = activeSet.mainResponse;
			activeSet.mainQuery.clear();
			AddressXML.encode(activeSet.mainQuery, funcEntry);
			decompProcess.sendCommandTimeout("generateSignatures", timeoutSecs, activeSet);
			decompileMessage = decompCallback.getNativeMessage();
		}
		catch (Exception ex) {
			decompileMessage = "Exception while generating signatures: " + ex.getMessage() + '\n';
		}
		finally {
			if (monitor != null) {
				monitor.removeCancelledListener(monitorListener);
			}
		}
		flushCache();
		if (!decoder.isEmpty()) {
			try {
				return SignatureResult.decode(decoder, func, keepcalllist);
			}
			catch (DecoderException e) {		// Error walking the DOM
				decompileMessage = "Exception while parsing signatures: " + e.getMessage() + '\n';
			}
		}
		return null;
	}
Generate a signature, using the current signature settings, for the given function.
The signature is returned as a raw feature vector, {@link SignatureResult}.
@param func is the given function
@param keepcalllist is true if direct call addresses are collected as part of the result
@param timeoutSecs is the maximum amount of time to spend decompiling the function
@param monitor is the TaskMonitor
@return the feature vector
Ghidra/Features/Decompiler/src/main/java/ghidra/app/decompiler/DecompInterface.java