private void processSubprogram(DIEAggregate diea)
			throws IOException, InvalidInputException, DWARFExpressionException {

		if (diea == null || !shouldProcess(diea)) {
			return;
		}

		// read the dwarf function info (name, addr, params)
		DWARFFunction dfunc = DWARFFunction.read(diea);
		if (dfunc == null) {
			markAllChildrenAsProcessed(diea.getHeadFragment());
			return;
		}

		FunctionDefinition origFuncDef = dfunc.asFunctionDefinition(true); // before any fixups

		if (functionsProcessed.contains(dfunc.address)) {
			markAllChildrenAsProcessed(dfunc.diea.getHeadFragment());

			Function currentFunction = currentProgram.getListing().getFunctionAt(dfunc.address);
			if (currentFunction != null) {
				decorateFunctionWithAlternateInfo(dfunc, currentFunction, origFuncDef);
			}
			return;
		}
		functionsProcessed.add(dfunc.address);

		// only process the children (lexical blocks, local vars, etc) if we are going
		// to emit a new ghidra function, otherwise if 2 dwarf function defs point to same
		// location, we will get multiple side-effect output from processFuncChildren
		processFuncChildren(diea, dfunc, 0);

		if (!dfunc.syncWithExistingGhidraFunction(true)) {
			// if false, the stub ghidra function could not be found or created
			return;
		}

		dfunc.runFixups();

		String defaultCC = prog.getImportOptions().getDefaultCC();
		if (defaultCC != null && defaultCC.isBlank()) {
			defaultCC = null;
		}
		if (dfunc.callingConventionName == null && defaultCC != null) {
			dfunc.callingConventionName = defaultCC;
		}

		decorateFunctionWithDWARFInfo(dfunc, origFuncDef);

		if (dfunc.signatureCommitMode != CommitMode.SKIP) {
			dfunc.updateFunctionSignature();
		}
		else {
			prog.logWarningAt(dfunc.function.getEntryPoint(), dfunc.function.getName(),
				"Failed to get DWARF function signature information, leaving undefined");
		}

		for (DWARFVariable localVar : dfunc.localVars) {
			if (localVar.isRamStorage()) {
				outputGlobal(localVar); // static variable scoped to the function
			}
			else {
				dfunc.commitLocalVariable(localVar);
			}
		}

		if (importOptions.isCreateFuncSignatures()) {
			DataType funcDefDT = dfunc.asFunctionDefinition(false);
			funcDefDT = prog.getGhidraProgram()
					.getDataTypeManager()
					.addDataType(funcDefDT, DWARFDataTypeConflictHandler.INSTANCE);

			// Look for the source info in the funcdef die and fall back to its
			// parent's source info (handles auto-generated ctors and such)
			dwarfDTM.addDataType(diea.getOffset(), funcDefDT,
				DWARFSourceInfo.getSourceInfoWithFallbackToParent(diea));

		}

	}
Inline funcs shorter than this value receive comments at EOL instead of PRE
(ie. inline funcs that reduce down to a single operand or operand value)
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf/DWARFFunctionImporter.java