private void createThunk(Map<String, Object> result, Function func) {
		String thunkStr = (String) result.get("thunkAddress");
		if (thunkStr == null) {
			throw new RuntimeException("No thunk address provided.");
		}
		Function thunkFn = null;
		Address thunk = parseAddress(factory, thunkStr);
		if (thunk.isExternalAddress()) {
			Symbol symbol = externalMap.get(thunkStr).getSymbol();
			if (symbol.getSymbolType() == SymbolType.FUNCTION) {
				thunkFn = (Function) symbol.getObject();
				func.setThunkedFunction(thunkFn);
			}
		}
		else {
			thunkFn = program.getFunctionManager().getFunctionAt(thunk);
			if (thunkFn == null) {
				CreateFunctionCmd cmd = new CreateFunctionCmd(thunk);
				if (!cmd.applyTo(program)) {
					Msg.error(this,
						"Failed to create function at " + thunk + ": " + cmd.getStatusMsg());
				}
				thunkFn = cmd.getFunction();
			}
			func.setThunkedFunction(thunkFn);
		}
	}
Parses a list of {@link Function function} definitions from SARIF and creates
then, adding them to the current {@link Program program}.
<p>
Information from a TYPEINFO_COMMENT is used in preference to information from
RETURN_TYPE and STACK_FRAME/STACK_VARs that are tagged as parameters.
<p>
DTD for the FUNCTION element:

<pre>
<code>
&lt;!ELEMENT FUNCTION (RETURN_TYPE?, ADDRESS_RANGE*, REGULAR_CMT?, REPEATABLE_CMT?, TYPEINFO_CMT?, STACK_FRAME?, REGISTER_VAR*)&gt;
</code>
</pre>

@param result             the parser
@param options
@param monitor            the task monitor
@throws AddressFormatException if any address is not parsable
@throws CancelledException     if the operation is cancelled through the
                               monitor
Ghidra/Features/Sarif/src/main/java/sarif/managers/FunctionsSarifMgr.java