private void markupGoFunctions(TaskMonitor monitor) throws IOException, CancelledException {
		Set<String> noreturnFuncNames = readNoReturnFuncNames();
		int noreturnFuncCount = 0;
		int functionSignatureFromBootstrap = 0;
		int functionSignatureFromMethod = 0;

		List<GoFuncData> funcs = goBinary.getAllFunctions();

		monitor.initialize(funcs.size(), "Fixing golang function signatures");
		for (GoFuncData funcdata : funcs) {
			monitor.increment();

			Address funcAddr = funcdata.getFuncAddress();
			GoSymbolName funcSymbolNameInfo = funcdata.getSymbolName();
			String funcname =
				SymbolUtilities.replaceInvalidChars(funcSymbolNameInfo.asString(), true);
			Namespace funcns = funcSymbolNameInfo.getSymbolNamespace(program);

			if ("go:buildid".equals(funcSymbolNameInfo.asString())) {
				// this funcdata entry is a bogus element that points to the go buildid string.  skip
				continue;
			}

			Function func = markupSession.createFunctionIfMissing(funcname, funcns, funcAddr);
			if (func == null ||
				func.getSignatureSource().isHigherPriorityThan(SourceType.IMPORTED)) {
				continue;
			}

			boolean prevNoReturnFlag = func.hasNoReturn();

			markupSession.appendComment(func, "Golang function info: ",
				AddressAnnotatedStringHandler.createAddressAnnotationString(
					funcdata.getStructureContext().getStructureAddress(),
					"Flags: %s".formatted(funcdata.getFlags())));

			if (!funcSymbolNameInfo.asString().equals(funcname)) {
				markupSession.appendComment(func, "Golang original name: ",
					funcSymbolNameInfo.asString());
			}

			GoSourceFileInfo sfi = null;
			if (analyzerOptions.outputSourceInfo && (sfi = funcdata.getSourceFileInfo()) != null) {
				markupSession.appendComment(func, "Golang source: ", sfi.getDescription());
				funcdata.markupSourceFileInfo();
			}

			if (funcdata.getFlags().isEmpty() /* dont try to get arg info for ASM funcs*/) {
				markupSession.appendComment(func, null,
					"Golang stacktrace signature: " + funcdata.recoverFunctionSignature());
			}

			// Try to get a function definition signature from:
			// 1) Methods (with full info) attached to a type that point to this func
			// 2) Snapshot json file
			// 3) Partial signature with receiver or closure context info params
			FuncDefResult funcDefResult = goBinary.getFuncDefFor(funcdata);
			if (funcDefResult != null) {
				Set<FuncDefFlags> flags = funcDefResult.flags();
				String flagStr = !flags.isEmpty() ? " " + flags.toString().toLowerCase() : "";
				String snapshotStr = funcDefResult.funcDefStr();
				if (!flagStr.isEmpty() || !snapshotStr.isEmpty()) {
					markupSession.appendComment(func, null,
						"Golang signature%s: %s".formatted(flagStr, snapshotStr));
				}
				if (flags.contains(FuncDefFlags.FROM_SNAPSHOT)) {
					functionSignatureFromBootstrap++;
				}
				if (flags.contains(FuncDefFlags.FROM_RTTI_METHOD)) {
					functionSignatureFromMethod++;
				}

				GoFunctionFixup ff = new GoFunctionFixup(func, funcDefResult.funcDef(),
					goBinary.getCallingConventionFor(funcdata), goBinary.newStorageAllocator());

				try {
					ff.apply();
				}
				catch (DuplicateNameException | InvalidInputException
						| IllegalArgumentException e) {
					MarkupSession.logWarningAt(program, func.getEntryPoint(),
						"Failed to update function signature: " + e.getMessage());
					continue;
				}

				if (funcDefResult.symbolName().hasReceiver()) {
					GoType recvType = funcDefResult.recvType();
					Address typeStructAddr = recvType != null && !(recvType instanceof GoTypeBridge)
							? recvType.getStructureContext().getStructureAddress()
							: null;
					String typeStr = typeStructAddr != null
							? AddressAnnotatedStringHandler.createAddressAnnotationString(
								typeStructAddr, recvType.getName())
							: funcDefResult.symbolName().receiverString();
					markupSession.appendComment(func, "",
						"Golang method in type %s".formatted(typeStr));
				}
			}

			if (noreturnFuncNames.contains(funcname)) {
				if (!func.hasNoReturn()) {
					func.setNoReturn(true);
				}
			}

			if (func.hasNoReturn() && func.hasNoReturn() != prevNoReturnFlag) {
				noreturnFuncCount++;
			}
		}

		Msg.info(this, "Marked %d golang funcs as NoReturn".formatted(noreturnFuncCount));
		Msg.info(this, "Fixed %d golang function signatures from runtime snapshot signatures"
				.formatted(functionSignatureFromBootstrap));
		Msg.info(this, "Fixed %d golang function signatures from method info"
				.formatted(functionSignatureFromMethod));
	}
Converts all discovered golang rtti type records to Ghidra data types, placing them
in the program's DTM in /golang-recovered

@param monitor {@link TaskMonitor}
@throws IOException error converting a golang type to a Ghidra type
@throws CancelledException if the user cancelled the import
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/GolangSymbolAnalyzer.java