public static DataType getBaseDataType(DataType dt) {
		DataType baseDataType = dt;
		while ((baseDataType instanceof Pointer) || (baseDataType instanceof Array) ||
			(baseDataType instanceof TypeDef)) {
			if (baseDataType instanceof Pointer) {
				DataType innerDt = ((Pointer) baseDataType).getDataType();
				if (innerDt != null) {
					baseDataType = innerDt;
				}
				else {
					return baseDataType;
				}
			}
			else if (baseDataType instanceof Array) {
				baseDataType = ((Array) baseDataType).getDataType();
			}
			else {
				baseDataType = ((TypeDef) baseDataType).getDataType();
			}
		}
		return baseDataType;
	}
Get the base data type for the specified data type.

<p>For example, the base data type for Word*[5] is Word.  For a pointer, the base data type
is the type being pointed to or the pointer itself if it is pointing at nothing.

<p>If "INT" is a typedef on a "dword" then INT[7][3] would have a base data type of dword.
If you wanted to get the INT from INT[7][3] you should call getNamedBasedDataType(DataType)
instead.

@param dt the data type whose base data type is to be determined.
@return the base data type.
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/util/DataTypeUtils.java