@Override
	protected void writeRule(PrintWriter writer, TaintLabel mark, boolean isSource) {
		Boolean allAccess = taintOptions.getTaintUseAllAccess();
		String method = isSource ? "TaintSource" : "LeakingSink";
		Address addr = mark.getAddress();
		boolean functionLevel = mark.getVarnodeAddress() == null;

		if (mark.getFunctionName() == null) {
			return;
		}

		ClangToken token = mark.getToken();
		if (token instanceof ClangFuncNameToken) {

			writer.println(method + "Vertex(\"" + mark.getLabel() + "\", vn, p) :-");
			writer.println("\tHFUNC_NAME(f, \"" + mark.getFunctionName() + "\"),");
			writer.println("\tCFunction_FormalParam(f, n, vn),");
			writer.println("\tCReturnParameter(n),");
			writer.println("\tVertex(vn, p).");

		}
		else {

			HighVariable hv = mark.getHighVariable();
			String pathConstraint = null;
			if (hv == null && token instanceof ClangFieldToken ftoken) {
				ClangVariableToken vtoken = TaintState.getParentToken(ftoken);
				if (vtoken != null) {
					hv = vtoken.getHighVariable();
					pathConstraint = token.getText();
					token = vtoken;
				}
			}
			writer.println(method + "Vertex(\"" + mark.getLabel() + "\", vn, p) :-");
			writer.println("\t((HFUNC_NAME(m, \"" + mark.getFunctionName() + "\"),");
			writer.println("\tCVar_InFunction(vn, m)) ; CVar_isGlobal(vn)),");
			if (!functionLevel && !mark.bySymbol()) {
				writer.println("\t(PCODE_INPUT(i, _, vn) ; PCODE_OUTPUT(i, vn)),");
				writer.println("\tPCODE_TARGET(i, " + addr.getOffset() + "),");
			}
			if (mark.bySymbol() && hv != null) {
				writer.println("\t((SYMBOL_NAME(sym, \"" + token.getText() + "\"),");
				writer.println("\tSYMBOL_HVAR(sym, hv),");
				// Note this is an OR
				writer.println("\tVNODE_HVAR(vn, hv));");
				writer.println("\tCVar_SourceInfo(vn, SOURCE_INFO_NAME_KEY, \"" +
					TaintState.varName(token, false) + "\")),");
			}
			else if (mark.bySymbol()) {
				writer.println("\tSYMBOL_NAME(sym, \"" + token.getText() + "\"),");
				writer.println("\tSYMBOL_HVAR(sym, hv),");
				writer.println("\tVNODE_HVAR(vn, hv),");
			}
			else if (hv != null) {
				writer.println("\tCVar_SourceInfo(vn, SOURCE_INFO_NAME_KEY, \"" +
					TaintState.varName(token, false) + "\"),");
			}
			else {
				writer.println("\t(CVar_SourceInfo(vn, SOURCE_INFO_NAME_KEY, \"" +
					TaintState.varName(token, false) + "\");");
			}
			if (pathConstraint != null) {
				writer.println("\tp = \"." + pathConstraint + "\",");
			}
			if (!allAccess) {
				writer.println("\tp = \"\",");
			}
			writer.println("\tVertex(vn, p).");

		}
	}
Container for all the decompiler elements the users "selects" via the menu.
This data is used to build queries.
Ghidra/Features/DecompilerDependent/src/main/java/ghidra/app/plugin/core/decompiler/taint/ctadl/CTADLTaintState.java