private boolean createFunctionVariable(FunctionSymbolApplier applier,
			AbstractRegisterRelativeAddressMsSymbol symbol)
			throws CancelledException, PdbException {
		Objects.requireNonNull(applier, "FunctionSymbolApplier cannot be null");
		Function function = applier.getFunction();

		if (function == null) {
			applicator.appendLogMsg("Could not create stack variable for non-existent function.");
			return false;
		}
		//Variable[] allVariables = function.getAllVariables();

		String registerName = symbol.getRegisterNameString();
		Register register = applicator.getRegister(registerName);
		Register sp = applicator.getProgram().getCompilerSpec().getStackPointer();
		if (register != sp) {
			// have seen fbp here.
			// TODO; can we do something more generic below that does not rely on stack frame?
			//  would like to do RSP + X, or RBP + X, or RDX + X.
			return false;
		}

		Integer registerChange = applier.getRegisterPrologChange(register);

		StackFrame stackFrame = function.getStackFrame();

		int baseParamOffset = applier.getBaseParamOffset();
		long frameSize = applier.getCurrentFrameSize();
//		long relativeOffset = symbol.getOffset() - applier.getCurrentFrameSize();
		if (registerChange == null) {
			registerChange = 0;
		}
		long relativeOffset = symbol.getOffset() + registerChange;
//		long relativeOffset = symbol.getOffset() + x;
//		if (relativeOffset > Integer.MAX_VALUE) {
//			applicator.appendLogMsg("Offset too large for our applier.");
//			//return false;
//		}
		int offset = (int) (relativeOffset & 0xffffffffL);

		RecordNumber typeRecord = symbol.getTypeRecordNumber();
		DataType dt = applicator.getCompletedDataType(typeRecord);
		if (dt != null) {
//			Variable m16 = stackFrame.getVariableContaining(-16);
//			Variable m8 = stackFrame.getVariableContaining(-8);
//			Variable x0 = stackFrame.getVariableContaining(0);
//			Variable x8 = stackFrame.getVariableContaining(8);
//			Variable x16 = stackFrame.getVariableContaining(16);
//			Variable x24 = stackFrame.getVariableContaining(24);
//			Variable x32 = stackFrame.getVariableContaining(32);
//			Variable x40 = stackFrame.getVariableContaining(40);
//			Variable x48 = stackFrame.getVariableContaining(48);
//			Variable x56 = stackFrame.getVariableContaining(56);
			Variable variable = stackFrame.getVariableContaining(offset);
			try {
				if (variable == null || variable.getStackOffset() != offset) {
					if (variable != null) {
						stackFrame.clearVariable(variable.getStackOffset());
					}
					try {
						variable = stackFrame.createVariable(symbol.getName(), offset, dt,
							SourceType.IMPORTED);
					}
					catch (DuplicateNameException e) {
						variable = stackFrame.createVariable(
							symbol.getName() + "@" + Integer.toHexString(offset), offset, dt,
							SourceType.IMPORTED);
					}
				}
				else {
					variable.setDataType(dt, false, true, SourceType.ANALYSIS);
					try {
						variable.setName(symbol.getName(), SourceType.IMPORTED);
					}
					catch (DuplicateNameException e) {
						variable.setName(symbol.getName() + "@" + Integer.toHexString(offset),
							SourceType.IMPORTED);
					}
				}
			}
			catch (InvalidInputException | DuplicateNameException e) {
				applicator.appendLogMsg("Unable to create stack variable " + symbol.getName() +
					" at offset " + offset + " in " + function.getName());
				return false;
			}
		}
		return true;
	}
Constructor
@param applicator the {@link DefaultPdbApplicator} for which we are working.
@param symbol the symbol for this applier
Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/RegisterRelativeSymbolApplier.java