protected void analyze(Program program, PCodeTestControlBlock testControlBlock)
			throws Exception {

		setAnalysisOptions(program.getOptions(Program.ANALYSIS_PROPERTIES));

		GhidraProgramUtilities.markProgramAnalyzed(program);

		// Remove all single-byte functions created by Elf importer
		// NOTE: This is a known issues with optimized code and symbols marked as ElfSymbol.STT_FUNC
		for (Function function : program.getFunctionManager().getFunctions(true)) {
			if (function.getBody().getNumAddresses() == 1) {
				function.getSymbol().delete();
			}
		}

		AutoAnalysisManager analysisMgr = AutoAnalysisManager.getAnalysisManager(program);
		analysisMgr.cancelQueuedTasks(); // GhidraProject import utility jumped the gun with analysis initialization
		analysisMgr.initializeOptions();

		// ensure that all known functions have been disassembled
		AddressSet disassembleStarts = new AddressSet();

		addFunctionStartDisassemblyPoint(testControlBlock.getBreakOnDoneAddress(), "breakOnDone",
			disassembleStarts, program);
		addFunctionStartDisassemblyPoint(testControlBlock.getBreakOnPassAddress(), "breakOnPass",
			disassembleStarts, program);
		addFunctionStartDisassemblyPoint(testControlBlock.getBreakOnErrorAddress(), "breakOnError",
			disassembleStarts, program);
		addFunctionStartDisassemblyPoint(testControlBlock.getSprintf5Address(), "printf5",
			disassembleStarts, program);

		int functionCnt = testControlBlock.getNumberFunctions();
		for (int i = 0; i < functionCnt; i++) {
			FunctionInfo functionInfo = testControlBlock.getFunctionInfo(i);
			addFunctionStartDisassemblyPoint(functionInfo.functionAddr, functionInfo.functionName,
				disassembleStarts, program);
		}

		for (PCodeTestGroup testGroup : testControlBlock.getTestGroups()) {
			functionCnt = testGroup.controlBlock.getNumberFunctions();
			for (int i = 0; i < functionCnt; i++) {
				FunctionInfo functionInfo = testGroup.controlBlock.getFunctionInfo(i);
				addFunctionStartDisassemblyPoint(functionInfo.functionAddr,
					functionInfo.functionName, disassembleStarts, program);
			}
		}

		new DisassembleCommand(disassembleStarts, null).applyTo(program);

		new CreateFunctionCmd(disassembleStarts).applyTo(program);

		analysisMgr.reAnalyzeAll(null);
		analysisMgr.startAnalysis(TaskMonitor.DUMMY); // method blocks during analysis

		// Apply known function signatures
		// Signatures with Float types have been excluded due to limited calling convention support
		ArrayList<DataTypeManager> dtMgrList = new ArrayList<>();
		dtMgrList.add(archiveDtMgr);
		ApplyFunctionDataTypesCmd cmd =
			new ApplyFunctionDataTypesCmd(dtMgrList, null, SourceType.ANALYSIS, true, false);
		cmd.applyTo(program);

		// Apply various *_main and *_Main test function signatures
		Pointer testInfoStructPtrType = new PointerDataType(testInfoStruct);
		for (Function func : program.getFunctionManager().getFunctions(true)) {
			String name = func.getName();
			if (name.endsWith("_Main")) {
				func.setReturnType(VoidDataType.dataType, SourceType.ANALYSIS);
			}
			else if (name.endsWith("_main")) {
				func.setReturnType(VoidDataType.dataType, SourceType.ANALYSIS);
				func.replaceParameters(FunctionUpdateType.DYNAMIC_STORAGE_ALL_PARAMS, false,
					SourceType.ANALYSIS, new ParameterImpl("ti", testInfoStructPtrType, program));
			}
		}

	}
Invoked for non-gzf files to perform auto-analysis.
NOTE: This method will only be invoked once during the first test setup
for all test binaries found.  This method will not be invoked
during subsequent tests since the analyzed program will be cached.
@param program
@throws Exception
Ghidra/Features/Base/src/main/java/ghidra/test/processors/support/ProcessorEmulatorTestAdapter.java