Handle ConstantArray Type.

Change-Id: Id3677e818693d6f95445d67116db3d6766d1fbd6
diff --git a/slang_rs_export_element.cpp b/slang_rs_export_element.cpp
index c5c66ec..718f84e 100644
--- a/slang_rs_export_element.cpp
+++ b/slang_rs_export_element.cpp
@@ -65,12 +65,18 @@
         }
         break;
 
+        case Type::ConstantArray:
+          {
+            //XXX
+            break;
+          }
+
         case Type::ExtVector:
         {
             assert(EI->vsize > 1 && "Element not a vector class (please check your macro)");
-            RSExportVectorType* EVT = RSExportVectorType::Create(Context, 
-                                                                 static_cast<ExtVectorType*>(T->getCanonicalTypeInternal().getTypePtr()), 
-                                                                 TypeName, 
+            RSExportVectorType* EVT = RSExportVectorType::Create(Context,
+                                                                 static_cast<ExtVectorType*>(T->getCanonicalTypeInternal().getTypePtr()),
+                                                                 TypeName,
                                                                  EI->kind,
                                                                  EI->normalized);
             /* verify */
@@ -82,11 +88,34 @@
 
         case Type::Record:
         {
-            /* Must be RS object type */
+          /* Must be RS object type */
+
+          if ( TypeName.equals(llvm::StringRef("rs_matrix2x2")) ||
+               TypeName.equals(llvm::StringRef("rs_matrix3x3")) ||
+               TypeName.equals(llvm::StringRef("rs_matrix4x4")) ) {
+
+            const clang::RecordType* RT = static_cast<const RecordType*> (T);
+            const RecordDecl* RD = RT->getDecl();
+            RD = RD->getDefinition();
+            //RSExportRecordType* ERT = new RSExportRecordType(Context, TypeName, RD->hasAttr<PackedAttr>());
+            RecordDecl::field_iterator fit = RD->field_begin();
+            FieldDecl* FD = *fit;
+            const Type* FT = RSExportType::GetTypeOfDecl(FD);
+            RSExportConstantArrayType* ECT = RSExportConstantArrayType::Create(Context, static_cast<const ConstantArrayType*> (FT), TypeName);
+            ET = ECT;
+
+            //RSExportType* FieldET = RSExportElement::CreateFromDecl(Context, FD);
+            //ERT->mFields.push_back( new Field(FieldET, FD->getName(), ERT, 0) );
+            //const ASTRecordLayout &ASTRL = Context->getASTContext()->getASTRecordLayout(RD);
+            //ERT->AllocSize = (ASTRL.getSize() > ASTRL.getDataSize()) ? (ASTRL.getSize() >> 3) : (ASTRL.getDataSize() >> 3);
+            //ET = ERT;
+
+          } else {
             RSExportPrimitiveType* EPT = RSExportPrimitiveType::Create(Context, T, TypeName, EI->kind, EI->normalized);
             /* verify */
             assert(EI->type == EPT->getType() && "Element has unexpected type");
             ET = EPT;
+          }
         }
         break;
 
@@ -94,7 +123,7 @@
             /* TODO: warning: type is not exportable */
             printf("RSExportElement::Create : type '%s' is not exportable\n", T->getTypeClassName());
         break;
-    } 
+    }
 
     return ET;
 }
@@ -104,29 +133,32 @@
     const Type* CT = GET_CANONICAL_TYPE(T);
     const ElementInfo* EI = NULL;
 
-    /* Shortcut, rs element like rs_color4f should be the type of primitive or vector */
-    if((CT->getTypeClass() != Type::Builtin) && (CT->getTypeClass() != Type::ExtVector))
+    /* For rs element that's NOT like those rs_color4f..., just call Create(Context, T) without finding EI */
+    /* Note: Those rs_color4f kind of elements are either typed primitive or vector */
+    if ((CT->getTypeClass() != Type::Builtin) && (CT->getTypeClass() != Type::ExtVector) && (CT->getTypeClass() != Type::Record)) {
         return RSExportType::Create(Context, T);
+    }
 
-    /* Iterative query the name of type to see whether it's element name like rs_color4f or its alias (via typedef) */
-    while(T != CT) {
-        if(T->getTypeClass() != Type::Typedef) 
+    /* Iterative query the name of type to see whether it's an element name like rs_color4f or its alias (via typedef) */
+    while (T != CT) {
+        if (T->getTypeClass() != Type::Typedef) {
             break;
-        else {
+        } else {
             const TypedefType* TT = static_cast<const TypedefType*>(T);
             const TypedefDecl* TD = TT->getDecl();
             EI = GetElementInfo(TD->getName());
-            if(EI != NULL)
+            if (EI != NULL)
                 break;
-                
+
             T = TD->getUnderlyingType().getTypePtr();
         }
     }
 
-    if(EI == NULL)
+    if(EI == NULL) {
         return RSExportType::Create(Context, T);
-    else
+    } else {
         return RSExportElement::Create(Context, T, EI);
+    }
 }
 
 const RSExportElement::ElementInfo* RSExportElement::GetElementInfo(const llvm::StringRef& Name) {