PTX: Emit global arrays with proper sizes

- Emit all arrays as type .b8 and proper sizes in bytes to conform
  to the output of nvcc

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127584 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/PTX/PTXAsmPrinter.cpp b/lib/Target/PTX/PTXAsmPrinter.cpp
index 087d4f9..0b07f74 100644
--- a/lib/Target/PTX/PTXAsmPrinter.cpp
+++ b/lib/Target/PTX/PTXAsmPrinter.cpp
@@ -316,13 +316,42 @@
     decl += " ";
   }
 
-  decl += getTypeName(gv->getType());
-  decl += " ";
 
-  decl += gvsym->getName();
+  if (PointerType::classof(gv->getType())) {
+    const PointerType* pointerTy = dyn_cast<const PointerType>(gv->getType());
+    const Type* elementTy = pointerTy->getElementType();
 
-  if (ArrayType::classof(gv->getType()) || PointerType::classof(gv->getType()))
-    decl += "[]";
+    assert(elementTy->isArrayTy() && "Only pointers to arrays are supported");
+
+    const ArrayType* arrayTy = dyn_cast<const ArrayType>(elementTy);
+    elementTy = arrayTy->getElementType();
+
+    // FIXME: isPrimitiveType() == false for i16?
+    assert(elementTy->isSingleValueType() &&
+           "Non-primitive types are not handled");
+
+    // Compute the size of the array, in bytes.
+    uint64_t arraySize = (elementTy->getPrimitiveSizeInBits() >> 3)
+                         * arrayTy->getNumElements();
+
+    decl += ".b8 ";
+    decl += gvsym->getName();
+    decl += "[";
+    decl += utostr(arraySize);
+    decl += "]";
+  }
+  else {
+    // Note: this is currently the fall-through case and most likely generates
+    //       incorrect code.
+    decl += getTypeName(gv->getType());
+    decl += " ";
+
+    decl += gvsym->getName();
+
+    if (ArrayType::classof(gv->getType()) ||
+        PointerType::classof(gv->getType()))
+      decl += "[]";
+  }
 
   decl += ";";