Fixed a bug handling void function types.
authorJim Laskey <jlaskey@mac.com>
Thu, 13 Jul 2006 15:27:42 +0000 (15:27 +0000)
committerJim Laskey <jlaskey@mac.com>
Thu, 13 Jul 2006 15:27:42 +0000 (15:27 +0000)
Requires rebuild of llvm-gcc4 (touch llvm-debug.cpp.)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29131 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/DwarfWriter.cpp
lib/CodeGen/MachineDebugInfo.cpp

index 14bb9622edb9e106ff8effe7c9d31d128cd181d5..ff62b4624c58265e1a7149fc722443917d0ab8e8 100644 (file)
@@ -1413,7 +1413,7 @@ DIE *DwarfWriter::NewType(DIE *Context, TypeDesc *TyDesc, CompileUnit *Unit) {
       Ty->AddUInt(DW_AT_prototyped, DW_FORM_flag, 1);
       // Add return type.
       Ty->AddDIEntry(DW_AT_type, DW_FORM_ref4,
-                     NewType(Context, cast<TypeDesc>(Elements[0]), Unit));
+                     NewType(Context, dyn_cast<TypeDesc>(Elements[0]), Unit));
       
       // Add arguments.
       for(unsigned i = 1, N = Elements.size(); i < N; ++i) {
index 54fb1b923cad78ed1b72bd7e3238905b90ca54a9..fa2f57f0e0c85db5de23906231db7a4a520b1582 100644 (file)
@@ -223,16 +223,21 @@ public:
     Field = getGlobalVariable(C);
   }
   virtual void Apply(std::vector<DebugInfoDesc *> &Field) {
+    Field.resize(0);
     Constant *C = CI->getOperand(I++);
     GlobalVariable *GV = getGlobalVariable(C);
-    Field.resize(0);
-    // Have to be able to deal with the empty array case (zero initializer)
-    if (!GV->hasInitializer()) return;
-    if (ConstantArray *CA = dyn_cast<ConstantArray>(GV->getInitializer())) {
-      for (unsigned i = 0, N = CA->getNumOperands(); i < N; ++i) {
-        GlobalVariable *GVE = getGlobalVariable(CA->getOperand(i));
-        DebugInfoDesc *DE = DR.Deserialize(GVE);
-        Field.push_back(DE);
+    if (GV->hasInitializer()) {
+      if (ConstantArray *CA = dyn_cast<ConstantArray>(GV->getInitializer())) {
+        for (unsigned i = 0, N = CA->getNumOperands(); i < N; ++i) {
+          GlobalVariable *GVE = getGlobalVariable(CA->getOperand(i));
+          DebugInfoDesc *DE = DR.Deserialize(GVE);
+          Field.push_back(DE);
+        }
+      } else if (GV->getInitializer()->isNullValue()) {
+        if (const ArrayType *T =
+            dyn_cast<ArrayType>(GV->getType()->getElementType())) {
+          Field.resize(T->getNumElements());
+        }
       }
     }
   }
@@ -305,9 +310,13 @@ public:
     std::vector<Constant *> ArrayElements;
 
     for (unsigned i = 0, N = Field.size(); i < N; ++i) {
-      GlobalVariable *GVE = SR.Serialize(Field[i]);
-      Constant *CE = ConstantExpr::getCast(GVE, EmptyTy);
-      ArrayElements.push_back(cast<Constant>(CE));
+      if (DebugInfoDesc *Element = Field[i]) {
+        GlobalVariable *GVE = SR.Serialize(Element);
+        Constant *CE = ConstantExpr::getCast(GVE, EmptyTy);
+        ArrayElements.push_back(cast<Constant>(CE));
+      } else {
+        ArrayElements.push_back(ConstantPointerNull::get(EmptyTy));
+      }
     }
     
     Constant *CA = ConstantArray::get(AT, ArrayElements);