private UnwrapInfo?GetUnwrapInfo(ArrayType arrayType, Type typeInArray) { long unwrapCount; Type unwrapType; // in bits long unwrapTypeWidth; if (typeInArray.IsPointerToPrimitiveType()) { // need to unwrap if field is array of pointer to primitive type // int* A[N] // becomes // int* A_0; // int* A_N; // unwrap to multiple pointer fields unwrapType = new PointerType { QualifiedPointee = ((PointerType)typeInArray).QualifiedPointee }; unwrapCount = arrayType.Size; // TODO: get type width from driver TargetInfo! unwrapTypeWidth = 0; } else if (typeInArray.IsPointerToArrayType()) { // need to unwrap if field is array of pointer to array // A (*int[N])[M] // becomes // int** X_0; // int** X_M; var innerArray = (ArrayType)((PointerType)typeInArray).Pointee; unwrapType = new PointerType { QualifiedPointee = new QualifiedType(new PointerType { QualifiedPointee = new QualifiedType(innerArray.Type) }) }; unwrapCount = arrayType.Size; unwrapTypeWidth = Driver.TargetInfo.PointerWidth; } else if (typeInArray is ArrayType) { // need to unwrap if field is array of array // int A[N][M] // becomes // int A_0[M]; // int A_N[M]; Type innerArray = ((ArrayType)(typeInArray)).Type; unwrapType = new ArrayType { Size = ((ArrayType)(typeInArray)).Size, SizeType = ArrayType.ArraySize.Constant, Type = innerArray }; unwrapCount = arrayType.Size / ((ArrayType)(typeInArray)).Size; // TODO: get type width from driver TargetInfo! unwrapTypeWidth = 0; } else if (!typeInArray.IsPrimitiveType()) { // need tp unwrap if field is array of complex type // Struct A[N] // becomes // Struct A_0; // Struct A_N; unwrapType = typeInArray; unwrapCount = arrayType.Size; // TODO: get type width from driver TargetInfo! unwrapTypeWidth = 0; } else { return(null); } return(new UnwrapInfo { UnwrapType = unwrapType, UnwrapCount = unwrapCount, UnwrapTypeWidth = unwrapTypeWidth }); }