diff --git a/include/llvm/Analysis/DebugInfo.h b/include/llvm/Analysis/DebugInfo.h
index e9a7cb1..fac86b3 100644
--- a/include/llvm/Analysis/DebugInfo.h
+++ b/include/llvm/Analysis/DebugInfo.h
@@ -86,6 +86,15 @@
     
     unsigned getAnchorTag() const { return getUnsignedField(1); }
   };
+
+  /// DISubrange - This is used to represent ranges, for array bounds.
+  class DISubrange : public DIDescriptor {
+  public:
+    explicit DISubrange(GlobalVariable *GV = 0);
+    
+    int64_t getLo() const { return (int64_t)getUInt64Field(1); }
+    int64_t getHi() const { return (int64_t)getUInt64Field(2); }
+  };
   
   /// DIArray - This descriptor holds an array of descriptors.
   class DIArray : public DIDescriptor {
@@ -93,7 +102,9 @@
     explicit DIArray(GlobalVariable *GV = 0) : DIDescriptor(GV) {}
     
     unsigned getNumElements() const;
-    DIDescriptor getElement(unsigned Idx) const;
+    DISubrange getElement(unsigned Idx) const {
+      return getFieldAs<DISubrange>(Idx); 
+    }
   };
   
   /// DICompileUnit - A wrapper for a compile unit.
@@ -118,15 +129,6 @@
     uint64_t getLanguage() const { return getUInt64Field(2); }
   };
   
-  /// DISubrange - This is used to represent ranges, for array bounds.
-  class DISubrange : public DIDescriptor {
-  public:
-    explicit DISubrange(GlobalVariable *GV = 0);
-    
-    int64_t getLo() const { return (int64_t)getUInt64Field(1); }
-    int64_t getHi() const { return (int64_t)getUInt64Field(2); }
-  };
-  
   /// DIType - This is a wrapper for a type.
   /// FIXME: Types should be factored much better so that CV qualifiers and
   /// others do not require a huge and empty descriptor full of zeros.
diff --git a/lib/Analysis/DebugInfo.cpp b/lib/Analysis/DebugInfo.cpp
index f1f7d8e..8b802d7 100644
--- a/lib/Analysis/DebugInfo.cpp
+++ b/lib/Analysis/DebugInfo.cpp
@@ -174,7 +174,12 @@
     GV = 0;
 }
 
-
+unsigned DIArray::getNumElements() const {
+  assert (GV && "Invalid DIArray");
+  Constant *C = GV->getInitializer();
+  assert (C && "Invalid DIArray initializer");
+  return C->getNumOperands();
+}
 
 //===----------------------------------------------------------------------===//
 // DIFactory: Basic Helpers
diff --git a/lib/CodeGen/AsmPrinter/DwarfWriter.cpp b/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
index 30f14b7..af41982 100644
--- a/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
@@ -1512,6 +1512,7 @@
     AddUInt(&Buffer, DW_AT_byte_size, 0, Size);
   }
 
+  /// ConstructType - Construct derived type die from DIDerivedType.
   void ConstructType(CompileUnit *DW_Unit, DIE &Buffer,
                      DIDerivedType *DTy) {
 
@@ -1540,6 +1541,45 @@
     // FIXME - Enable this.     AddSourceLine(&Buffer, *DTy);
   }
 
+  // ConstructSubrangeDIE - Construct subrange DIE from DISubrange.
+  void ConstructSubrangeDIE (DIE &Buffer, DISubrange *SR, DIE *IndexTy) {
+    int64_t L = SR->getLo();
+    int64_t H = SR->getHi();
+    DIE *DW_Subrange = new DIE(DW_TAG_subrange_type);
+    if (L != H) {
+      AddDIEntry(DW_Subrange, DW_AT_type, DW_FORM_ref4, IndexTy);
+      if (L)
+	AddSInt(DW_Subrange, DW_AT_lower_bound, 0, L);
+        AddSInt(DW_Subrange, DW_AT_upper_bound, 0, H);
+    }
+    Buffer.AddChild(DW_Subrange);
+  }
+
+  /// ConstructArrayTypeDIE - Construct array type DIE from DICompositeType.
+  void ConstructArrayTypeDIE(CompileUnit *DW_Unit, DIE &Buffer, 
+                             DICompositeType *CTy) {
+    Buffer.setTag(DW_TAG_array_type);
+    if (CTy->getTag() == DW_TAG_vector_type)
+      AddUInt(&Buffer, DW_AT_GNU_vector, DW_FORM_flag, 1);
+    
+    DIArray Elements = CTy->getTypeArray();
+    // FIXME - Enable this. 
+    // AddType(&Buffer, CTy->getTypeDerivedFrom(), DW_Unit);
+
+    // Construct an anonymous type for index type.
+    DIE IdxBuffer(DW_TAG_base_type);
+    AddUInt(&IdxBuffer, DW_AT_byte_size, 0, sizeof(int32_t));
+    AddUInt(&IdxBuffer, DW_AT_encoding, DW_FORM_data1, DW_ATE_signed);
+    DIE *IndexTy = DW_Unit->AddDie(IdxBuffer);
+
+    // Add subranges to array type.
+    for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
+      DISubrange Element = Elements.getElement(i);
+      ConstructSubrangeDIE(Buffer, &Element, IndexTy);
+    }
+  }
+
+
   /// ConstructType - Adds all the required attributes to the type.
   ///
   void ConstructType(DIE &Buffer, TypeDesc *TyDesc, CompileUnit *Unit) {
