public void getExternalRef(Address addr, Encoder resultEncoder) throws IOException {
		Function func = null;
		if (cachedFunction != null && cachedFunction.getEntryPoint().equals(addr)) {
			func = cachedFunction;
		}
		else {
			ExternalReference extRef = getExternalReference(addr);
			if (extRef != null) {
				func = listing.getFunctionAt(extRef.getToAddress());
				if (func == null) {
					Symbol symbol = extRef.getExternalLocation().getSymbol();
					long extId;
					if (symbol != null) {
						extId = symbol.getID();
					}
					else {
						extId = program.getSymbolTable().getDynamicSymbolID(addr);

					}
					HighSymbol shellSymbol =
						new HighFunctionShellSymbol(extId, extRef.getLabel(), addr, dtmanage);
					encodeResult(resultEncoder, shellSymbol, null);
					return;
				}
			}
			else {
				func = listing.getFunctionAt(addr);
			}
		}
		if (func == null) {
			// Its conceivable we could have external data, but we aren't currently checking for it
			return;
		}

		HighFunction hfunc = new HighFunction(func, pcodelanguage, pcodecompilerspec, dtmanage);

		int extrapop = getExtraPopOverride(func, addr);
		hfunc.grabFromFunction(extrapop, false, (extrapop != default_extrapop));

		HighSymbol funcSymbol = new HighFunctionSymbol(addr, 2, hfunc);
		Namespace namespc = funcSymbol.getNamespace();
		if (debug != null) {
			debug.getFNTypes(hfunc);
			debug.addPossiblePrototypeExtension(func);
		}
		encodeResult(resultEncoder, funcSymbol, namespc);
	}
Get a description of an external reference at the given address
@param addr is the given address
@param resultEncoder will contain the resulting description
@throws IOException for errors encoding the result
Ghidra/Features/Decompiler/src/main/java/ghidra/app/decompiler/DecompileCallback.java