[cfe-commits] r121302 - in /cfe/trunk: lib/CodeGen/CGDebugInfo.cpp lib/CodeGen/CGDebugInfo.h test/CodeGen/2010-03-09-DbgInfo.c

Devang Patel dpatel at apple.com
Wed Dec 8 14:42:58 PST 2010


Author: dpatel
Date: Wed Dec  8 16:42:58 2010
New Revision: 121302

URL: http://llvm.org/viewvc/llvm-project?rev=121302&view=rev
Log:
Start using DIBuilder. It provides cleaner interface.

Modified:
    cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
    cfe/trunk/lib/CodeGen/CGDebugInfo.h
    cfe/trunk/test/CodeGen/2010-03-09-DbgInfo.c

Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=121302&r1=121301&r2=121302&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Wed Dec  8 16:42:58 2010
@@ -38,7 +38,7 @@
 using namespace clang::CodeGen;
 
 CGDebugInfo::CGDebugInfo(CodeGenModule &CGM)
-  : CGM(CGM), DebugFactory(CGM.getModule()),
+  : CGM(CGM), DBuilder(CGM.getModule()),
     BlockLiteralGenericSet(false) {
   CreateCompileUnit();
 }
@@ -153,13 +153,16 @@
 
 /// getOrCreateFile - Get the file debug info descriptor for the input location.
 llvm::DIFile CGDebugInfo::getOrCreateFile(SourceLocation Loc) {
+  if (!Loc.isValid())
+    // If Location is not valid then use main input file.
+    return DBuilder.CreateFile(TheCU.getFilename(), TheCU.getDirectory());
+
   SourceManager &SM = CGM.getContext().getSourceManager();
   PresumedLoc PLoc = SM.getPresumedLoc(Loc);
 
   if (PLoc.isInvalid())
     // If the location is not valid then use main input file.
-    return DebugFactory.CreateFile(TheCU.getFilename(), TheCU.getDirectory(),
-                                   TheCU);
+    return DBuilder.CreateFile(TheCU.getFilename(), TheCU.getDirectory());
 
   // Cache the results.
   const char *fname = PLoc.getFilename();
@@ -172,8 +175,7 @@
       return llvm::DIFile(cast<llvm::MDNode>(it->second));
   }
 
-  llvm::DIFile F = DebugFactory.CreateFile(PLoc.getFilename(),
-                                           getCurrentDirname(), TheCU);
+  llvm::DIFile F = DBuilder.CreateFile(PLoc.getFilename(), getCurrentDirname());
 
   DIFileCache[fname] = F;
   return F;
@@ -182,8 +184,7 @@
 
 /// getOrCreateMainFile - Get the file info for main compile unit.
 llvm::DIFile CGDebugInfo::getOrCreateMainFile() {
-  return DebugFactory.CreateFile(TheCU.getFilename(), TheCU.getDirectory(),
-                                 TheCU);
+  return DBuilder.CreateFile(TheCU.getFilename(), TheCU.getDirectory());
 }
 
 /// getLineNumber - Get line number for the location. If location is invalid
@@ -262,10 +263,12 @@
     RuntimeVers = LO.ObjCNonFragileABI ? 2 : 1;
 
   // Create new compile unit.
-  TheCU = DebugFactory.CreateCompileUnit(
+  DBuilder.CreateCompileUnit(
     LangTag, Filename, getCurrentDirname(),
-    Producer, true,
+    Producer,
     LO.Optimize, CGM.getCodeGenOpts().DwarfDebugFlags, RuntimeVers);
+  // FIXME - Eliminate TheCU.
+  TheCU = llvm::DICompileUnit(DBuilder.getCU());
 }
 
 /// CreateType - Get the Basic type from the cache or create a new
@@ -278,11 +281,10 @@
   case BuiltinType::Void:
     return llvm::DIType();
   case BuiltinType::ObjCClass:
-    return DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_structure_type,
-                                            TheCU, "objc_class", 
-                                            getOrCreateMainFile(), 0, 0, 0,
-                                            0, llvm::DIDescriptor::FlagFwdDecl, 
-                                            llvm::DIType(), llvm::DIArray());
+    return DBuilder.CreateStructType(TheCU, "objc_class", 
+                                     getOrCreateMainFile(), 0, 0, 0,
+                                     llvm::DIDescriptor::FlagFwdDecl, 
+                                     llvm::DIArray());
   case BuiltinType::ObjCId: {
     // typedef struct objc_class *Class;
     // typedef struct objc_object {
@@ -290,33 +292,25 @@
     // } *id;
 
     llvm::DIType OCTy = 
-      DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_structure_type,
-                                       TheCU, "objc_class", 
-                                       getOrCreateMainFile(), 0, 0, 0, 0,
-                                       llvm::DIDescriptor::FlagFwdDecl, 
-                                       llvm::DIType(), llvm::DIArray());
+      DBuilder.CreateStructType(TheCU, "objc_class", 
+                                getOrCreateMainFile(), 0, 0, 0,
+                                llvm::DIDescriptor::FlagFwdDecl, 
+                                llvm::DIArray());
     unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy);
     
-    llvm::DIType ISATy = 
-      DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_pointer_type,
-                                     TheCU, "", getOrCreateMainFile(),
-                                     0, Size, 0, 0, 0, OCTy);
-
-    llvm::SmallVector<llvm::DIDescriptor, 16> EltTys;
+    llvm::DIType ISATy = DBuilder.CreatePointerType(OCTy, Size);
 
+    llvm::SmallVector<llvm::Value *, 16> EltTys;
     llvm::DIType FieldTy = 
-      DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, TheCU,
-                                     "isa", getOrCreateMainFile(),
-                                     0,Size, 0, 0, 0, ISATy);
+      DBuilder.CreateMemberType("isa", getOrCreateMainFile(),
+                                0,Size, 0, 0, 0, ISATy);
     EltTys.push_back(FieldTy);
     llvm::DIArray Elements =
-      DebugFactory.GetOrCreateArray(EltTys.data(), EltTys.size());
+      DBuilder.GetOrCreateArray(EltTys.data(), EltTys.size());
     
-    return DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_structure_type,
-                                            TheCU, "objc_object", 
-                                            getOrCreateMainFile(),
-                                            0, 0, 0, 0, 0,
-                                            llvm::DIType(), Elements);
+    return DBuilder.CreateStructType(TheCU, "objc_object", 
+                                     getOrCreateMainFile(),
+                                     0, 0, 0, 0, Elements);
   }
   case BuiltinType::UChar:
   case BuiltinType::Char_U: Encoding = llvm::dwarf::DW_ATE_unsigned_char; break;
@@ -348,10 +342,8 @@
   // Bit size, align and offset of the type.
   uint64_t Size = CGM.getContext().getTypeSize(BT);
   uint64_t Align = CGM.getContext().getTypeAlign(BT);
-  uint64_t Offset = 0;
   llvm::DIType DbgTy = 
-    DebugFactory.CreateBasicType(TheCU, BTName, getOrCreateMainFile(),
-                                 0, Size, Align, Offset, /*flags*/ 0, Encoding);
+    DBuilder.CreateBasicType(BTName, Size, Align, Encoding);
   return DbgTy;
 }
 
@@ -364,11 +356,9 @@
 
   uint64_t Size = CGM.getContext().getTypeSize(Ty);
   uint64_t Align = CGM.getContext().getTypeAlign(Ty);
-  uint64_t Offset = 0;
-
   llvm::DIType DbgTy = 
-    DebugFactory.CreateBasicType(TheCU, "complex", getOrCreateMainFile(), 
-                                 0, Size, Align, Offset, /*flags*/ 0, Encoding);
+    DBuilder.CreateBasicType("complex", Size, Align, Encoding);
+
   return DbgTy;
 }
 
@@ -403,9 +393,8 @@
 
   // No need to fill in the Name, Line, Size, Alignment, Offset in case of
   // CVR derived types.
-  llvm::DIType DbgTy =
-    DebugFactory.CreateDerivedType(Tag, Unit, "", Unit,
-                                   0, 0, 0, 0, 0, FromTy);
+  llvm::DIType DbgTy = DBuilder.CreateQualifiedType(Tag, FromTy);
+  
   return DbgTy;
 }
 
@@ -432,26 +421,25 @@
   
   if (const RecordType *RTy = dyn_cast<RecordType>(PointeeTy)) {
     RecordDecl *RD = RTy->getDecl();
-    unsigned RTag;
+    llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation());
+    unsigned Line = getLineNumber(RD->getLocation());
+    llvm::DIDescriptor FDContext =
+      getContextDescriptor(dyn_cast<Decl>(RD->getDeclContext()), Unit);
+
     if (RD->isStruct())
-      RTag = llvm::dwarf::DW_TAG_structure_type;
+      return DBuilder.CreateStructType(FDContext, RD->getName(), DefUnit,
+                                       Line, 0, 0, llvm::DIType::FlagFwdDecl,
+                                       llvm::DIArray());
     else if (RD->isUnion())
-      RTag = llvm::dwarf::DW_TAG_union_type;
+      return DBuilder.CreateUnionType(FDContext, RD->getName(), DefUnit,
+                                      Line, 0, 0, llvm::DIType::FlagFwdDecl,
+                                      llvm::DIArray());
     else {
       assert(RD->isClass() && "Unknown RecordType!");
-      RTag = llvm::dwarf::DW_TAG_class_type;
+      return DBuilder.CreateClassType(FDContext, RD->getName(), DefUnit,
+                                      Line, 0, 0, 0, llvm::DIType::FlagFwdDecl,
+                                      llvm::DIType(), llvm::DIArray());
     }
-
-    llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation());
-    unsigned Line = getLineNumber(RD->getLocation());
-    llvm::DIDescriptor FDContext =
-      getContextDescriptor(dyn_cast<Decl>(RD->getDeclContext()), Unit);
-  
-    return
-      DebugFactory.CreateCompositeType(RTag, FDContext, RD->getName(),
-                                       DefUnit, Line, 0, 0, 0,
-                                       llvm::DIType::FlagFwdDecl,
-                                       llvm::DIType(), llvm::DIArray());
   }
   return getOrCreateType(PointeeTy, Unit);
 
@@ -461,18 +449,19 @@
                                                 const Type *Ty, 
                                                 QualType PointeeTy,
                                                 llvm::DIFile Unit) {
+
+  if (Tag == llvm::dwarf::DW_TAG_reference_type)
+    return DBuilder.CreateReferenceType(CreatePointeeType(PointeeTy, Unit));
+                                    
   // Bit size, align and offset of the type.
-  
   // Size is always the size of a pointer. We can't use getTypeSize here
   // because that does not return the correct value for references.
   uint64_t Size = 
     CGM.getContext().Target.getPointerWidth(PointeeTy.getAddressSpace());
   uint64_t Align = CGM.getContext().getTypeAlign(Ty);
 
-  return DebugFactory.CreateDerivedType(Tag, Unit, "", Unit,
-                                        0, Size, Align, 0, 0, 
-                                        CreatePointeeType(PointeeTy, Unit));
-
+  return 
+    DBuilder.CreatePointerType(CreatePointeeType(PointeeTy, Unit), Size, Align);
 }
 
 llvm::DIType CGDebugInfo::CreateType(const BlockPointerType *Ty,
@@ -480,16 +469,11 @@
   if (BlockLiteralGenericSet)
     return BlockLiteralGeneric;
 
-  unsigned Tag = llvm::dwarf::DW_TAG_structure_type;
-
-  llvm::SmallVector<llvm::DIDescriptor, 5> EltTys;
-
+  llvm::SmallVector<llvm::Value *, 8> EltTys;
   llvm::DIType FieldTy;
-
   QualType FType;
   uint64_t FieldSize, FieldOffset;
   unsigned FieldAlign;
-
   llvm::DIArray Elements;
   llvm::DIType EltTy, DescTy;
 
@@ -498,23 +482,20 @@
   EltTys.push_back(CreateMemberType(Unit, FType, "reserved", &FieldOffset));
   EltTys.push_back(CreateMemberType(Unit, FType, "Size", &FieldOffset));
 
-  Elements = DebugFactory.GetOrCreateArray(EltTys.data(), EltTys.size());
+  Elements = DBuilder.GetOrCreateArray(EltTys.data(), EltTys.size());
   EltTys.clear();
 
   unsigned Flags = llvm::DIDescriptor::FlagAppleBlock;
   unsigned LineNo = getLineNumber(CurLoc);
 
-  EltTy = DebugFactory.CreateCompositeType(Tag, Unit, "__block_descriptor",
-                                           Unit, LineNo, FieldOffset, 0, 0, 
-                                           Flags, llvm::DIType(), Elements);
+  EltTy = DBuilder.CreateStructType(Unit, "__block_descriptor",
+                                    Unit, LineNo, FieldOffset, 0,
+                                    Flags, Elements);
 
   // Bit size, align and offset of the type.
   uint64_t Size = CGM.getContext().getTypeSize(Ty);
-  uint64_t Align = CGM.getContext().getTypeAlign(Ty);
 
-  DescTy = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_pointer_type,
-                                          Unit, "", Unit,
-                                          LineNo, Size, Align, 0, 0, EltTy);
+  DescTy = DBuilder.CreatePointerType(EltTy, Size);
 
   FieldOffset = 0;
   FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy);
@@ -529,24 +510,20 @@
   FieldTy = DescTy;
   FieldSize = CGM.getContext().getTypeSize(Ty);
   FieldAlign = CGM.getContext().getTypeAlign(Ty);
-  FieldTy = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, Unit,
-                                           "__descriptor", Unit,
-                                           LineNo, FieldSize, FieldAlign,
-                                           FieldOffset, 0, FieldTy);
+  FieldTy = DBuilder.CreateMemberType("__descriptor", Unit,
+                                      LineNo, FieldSize, FieldAlign,
+                                      FieldOffset, 0, FieldTy);
   EltTys.push_back(FieldTy);
 
   FieldOffset += FieldSize;
-  Elements = DebugFactory.GetOrCreateArray(EltTys.data(), EltTys.size());
+  Elements = DBuilder.GetOrCreateArray(EltTys.data(), EltTys.size());
 
-  EltTy = DebugFactory.CreateCompositeType(Tag, Unit, "__block_literal_generic",
-                                           Unit, LineNo, FieldOffset, 0, 0, 
-                                           Flags, llvm::DIType(), Elements);
+  EltTy = DBuilder.CreateStructType(Unit, "__block_literal_generic",
+                                    Unit, LineNo, FieldOffset, 0,
+                                    Flags, Elements);
 
   BlockLiteralGenericSet = true;
-  BlockLiteralGeneric
-    = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_pointer_type, Unit,
-                                     "", Unit,
-                                     LineNo, Size, Align, 0, 0, EltTy);
+  BlockLiteralGeneric = DBuilder.CreatePointerType(EltTy, Size);
   return BlockLiteralGeneric;
 }
 
@@ -555,25 +532,19 @@
   // Typedefs are derived from some other type.  If we have a typedef of a
   // typedef, make sure to emit the whole chain.
   llvm::DIType Src = getOrCreateType(Ty->getDecl()->getUnderlyingType(), Unit);
-
+  if (!Src.Verify())
+    return llvm::DIType();
   // We don't set size information, but do specify where the typedef was
   // declared.
   unsigned Line = getLineNumber(Ty->getDecl()->getLocation());
-
-  llvm::DIDescriptor TyContext 
-    = getContextDescriptor(dyn_cast<Decl>(Ty->getDecl()->getDeclContext()),
-                           Unit);
-  llvm::DIType DbgTy = 
-    DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_typedef, 
-                                   TyContext,
-                                   Ty->getDecl()->getName(), Unit,
-                                   Line, 0, 0, 0, 0, Src);
+  llvm::DIType DbgTy = DBuilder.CreateTypedef(Src, Ty->getDecl()->getName(),
+                                              Unit, Line);
   return DbgTy;
 }
 
 llvm::DIType CGDebugInfo::CreateType(const FunctionType *Ty,
                                      llvm::DIFile Unit) {
-  llvm::SmallVector<llvm::DIDescriptor, 16> EltTys;
+  llvm::SmallVector<llvm::Value *, 16> EltTys;
 
   // Add the result type at least.
   EltTys.push_back(getOrCreateType(Ty->getResultType(), Unit));
@@ -581,20 +552,16 @@
   // Set up remainder of arguments if there is a prototype.
   // FIXME: IF NOT, HOW IS THIS REPRESENTED?  llvm-gcc doesn't represent '...'!
   if (isa<FunctionNoProtoType>(Ty))
-    EltTys.push_back(DebugFactory.CreateUnspecifiedParameter());
+    EltTys.push_back(DBuilder.CreateUnspecifiedParameter());
   else if (const FunctionProtoType *FTP = dyn_cast<FunctionProtoType>(Ty)) {
     for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i)
       EltTys.push_back(getOrCreateType(FTP->getArgType(i), Unit));
   }
 
   llvm::DIArray EltTypeArray =
-    DebugFactory.GetOrCreateArray(EltTys.data(), EltTys.size());
+    DBuilder.GetOrCreateArray(EltTys.data(), EltTys.size());
 
-  llvm::DIType DbgTy =
-    DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_subroutine_type,
-                                     Unit, "", Unit,
-                                     0, 0, 0, 0, 0,
-                                     llvm::DIType(), EltTypeArray);
+  llvm::DIType DbgTy = DBuilder.CreateSubroutineType(Unit, EltTypeArray);
   return DbgTy;
 }
 
@@ -602,7 +569,7 @@
 /// record fields. This is used while creating debug info entry for a Record.
 void CGDebugInfo::
 CollectRecordFields(const RecordDecl *RD, llvm::DIFile Unit,
-                    llvm::SmallVectorImpl<llvm::DIDescriptor> &EltTys) {
+                    llvm::SmallVectorImpl<llvm::Value *> &EltTys) {
   unsigned FieldNo = 0;
   const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
   for (RecordDecl::field_iterator I = RD->field_begin(),
@@ -641,13 +608,9 @@
     else if (Access == clang::AS_protected)
       Flags |= llvm::DIDescriptor::FlagProtected;
 
-    // Create a DW_TAG_member node to remember the offset of this field in the
-    // struct.  FIXME: This is an absolutely insane way to capture this
-    // information.  When we gut debug info, this should be fixed.
-    FieldTy = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, Unit,
-                                             FieldName, FieldDefUnit,
-                                             FieldLine, FieldSize, FieldAlign,
-                                             FieldOffset, Flags, FieldTy);
+    FieldTy = DBuilder.CreateMemberType(FieldName, FieldDefUnit,
+                                        FieldLine, FieldSize, FieldAlign,
+                                        FieldOffset, Flags, FieldTy);
     EltTys.push_back(FieldTy);
   }
 }
@@ -668,7 +631,7 @@
   llvm::DIArray Args = llvm::DICompositeType(FnTy).getTypeArray();
   assert (Args.getNumElements() && "Invalid number of arguments!");
 
-  llvm::SmallVector<llvm::DIDescriptor, 16> Elts;
+  llvm::SmallVector<llvm::Value *, 16> Elts;
 
   // First element is always return type. For 'void' functions it is NULL.
   Elts.push_back(Args.getElement(0));
@@ -680,7 +643,7 @@
         QualType ThisPtr =
           Context.getPointerType(Context.getTagDeclType(Method->getParent()));
         llvm::DIType ThisPtrType =
-          DebugFactory.CreateArtificialType(getOrCreateType(ThisPtr, Unit));
+          DBuilder.CreateArtificialType(getOrCreateType(ThisPtr, Unit));
 
         TypeCache[ThisPtr.getAsOpaquePtr()] = ThisPtrType;
         Elts.push_back(ThisPtrType);
@@ -691,13 +654,9 @@
     Elts.push_back(Args.getElement(i));
 
   llvm::DIArray EltTypeArray =
-    DebugFactory.GetOrCreateArray(Elts.data(), Elts.size());
+    DBuilder.GetOrCreateArray(Elts.data(), Elts.size());
 
-  return
-    DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_subroutine_type,
-                                     Unit, "", Unit,
-                                     0, 0, 0, 0, 0,
-                                     llvm::DIType(), EltTypeArray);
+  return DBuilder.CreateSubroutineType(Unit, EltTypeArray);
 }
 
 /// isFunctionLocalClass - Return true if CXXRecordDecl is defined 
@@ -771,14 +730,12 @@
     Flags |= llvm::DIDescriptor::FlagPrototyped;
     
   llvm::DISubprogram SP =
-    DebugFactory.CreateSubprogram(RecordTy , MethodName, MethodName, 
-                                  MethodLinkageName,
-                                  MethodDefUnit, MethodLine,
-                                  MethodTy, /*isLocalToUnit=*/false, 
-                                  /* isDefinition=*/ false,
-                                  Virtuality, VIndex, ContainingType,
-                                  Flags,
-                                  CGM.getLangOptions().Optimize);
+    DBuilder.CreateMethod(RecordTy , MethodName, MethodLinkageName, 
+                          MethodDefUnit, MethodLine,
+                          MethodTy, /*isLocalToUnit=*/false, 
+                          /* isDefinition=*/ false,
+                          Virtuality, VIndex, ContainingType,
+                          Flags, CGM.getLangOptions().Optimize);
   
   // Don't cache ctors or dtors since we have to emit multiple functions for
   // a single ctor or dtor.
@@ -793,7 +750,7 @@
 /// a Record.
 void CGDebugInfo::
 CollectCXXMemberFunctions(const CXXRecordDecl *RD, llvm::DIFile Unit,
-                          llvm::SmallVectorImpl<llvm::DIDescriptor> &EltTys,
+                          llvm::SmallVectorImpl<llvm::Value *> &EltTys,
                           llvm::DIType RecordTy) {
   for(CXXRecordDecl::method_iterator I = RD->method_begin(),
         E = RD->method_end(); I != E; ++I) {
@@ -811,26 +768,15 @@
 /// a Record.
 void CGDebugInfo::
 CollectCXXFriends(const CXXRecordDecl *RD, llvm::DIFile Unit,
-                llvm::SmallVectorImpl<llvm::DIDescriptor> &EltTys,
+                llvm::SmallVectorImpl<llvm::Value *> &EltTys,
                 llvm::DIType RecordTy) {
 
   for (CXXRecordDecl::friend_iterator BI =  RD->friend_begin(),
          BE = RD->friend_end(); BI != BE; ++BI) {
-
-    TypeSourceInfo *TInfo = (*BI)->getFriendType();
-    if(TInfo)
-    {
-        llvm::DIType Ty = getOrCreateType(TInfo->getType(), Unit);
-
-            llvm::DIType DTy =
-          DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_friend,
-                                         RecordTy, llvm::StringRef(),
-                                         Unit, 0, 0, 0,
-                                         0, 0, Ty);
-
-        EltTys.push_back(DTy);
-    }
-
+    if (TypeSourceInfo *TInfo = (*BI)->getFriendType())
+      EltTys.push_back(DBuilder.CreateFriend(RecordTy, 
+                                             getOrCreateType(TInfo->getType(), 
+                                                             Unit)));
   }
 }
 
@@ -839,7 +785,7 @@
 /// a Record.
 void CGDebugInfo::
 CollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile Unit,
-                llvm::SmallVectorImpl<llvm::DIDescriptor> &EltTys,
+                llvm::SmallVectorImpl<llvm::Value *> &EltTys,
                 llvm::DIType RecordTy) {
 
   const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
@@ -865,13 +811,10 @@
     else if (Access == clang::AS_protected)
       BFlags |= llvm::DIDescriptor::FlagProtected;
     
-    llvm::DIType DTy =
-      DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_inheritance,
-                                     RecordTy, llvm::StringRef(), 
-                                     Unit, 0, 0, 0,
-                                     BaseOffset, BFlags,
-                                     getOrCreateType(BI->getType(),
-                                                     Unit));
+    llvm::DIType DTy = 
+      DBuilder.CreateInheritance(RecordTy,                                     
+                                 getOrCreateType(BI->getType(), Unit),
+                                 BaseOffset, BFlags);
     EltTys.push_back(DTy);
   }
 }
@@ -884,23 +827,13 @@
   ASTContext &Context = CGM.getContext();
 
   /* Function type */
-  llvm::DIDescriptor STy = getOrCreateType(Context.IntTy, Unit);
-  llvm::DIArray SElements = DebugFactory.GetOrCreateArray(&STy, 1);
-  llvm::DIType SubTy =
-    DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_subroutine_type,
-                                     Unit, "", Unit,
-                                     0, 0, 0, 0, 0, llvm::DIType(), SElements);
-
+  llvm::Value *STy = getOrCreateType(Context.IntTy, Unit);
+  llvm::DIArray SElements = DBuilder.GetOrCreateArray(&STy, 1);
+  llvm::DIType SubTy = DBuilder.CreateSubroutineType(Unit, SElements);
   unsigned Size = Context.getTypeSize(Context.VoidPtrTy);
-  llvm::DIType vtbl_ptr_type 
-    = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_pointer_type,
-                                     Unit, "__vtbl_ptr_type", Unit,
-                                     0, Size, 0, 0, 0, SubTy);
-
-  VTablePtrType = 
-    DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_pointer_type,
-                                   Unit, "", Unit,
-                                   0, Size, 0, 0, 0, vtbl_ptr_type);
+  llvm::DIType vtbl_ptr_type = DBuilder.CreatePointerType(SubTy, Size, 0,
+                                                          "__vtbl_ptr_type");
+  VTablePtrType = DBuilder.CreatePointerType(vtbl_ptr_type, Size);
   return VTablePtrType;
 }
 
@@ -920,7 +853,7 @@
 /// debug info entry in EltTys vector.
 void CGDebugInfo::
 CollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile Unit,
-                  llvm::SmallVectorImpl<llvm::DIDescriptor> &EltTys) {
+                  llvm::SmallVectorImpl<llvm::Value *> &EltTys) {
   const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
 
   // If there is a primary base then it will hold vtable info.
@@ -933,10 +866,9 @@
 
   unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy);
   llvm::DIType VPTR
-    = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, Unit,
-                                     getVTableName(RD), Unit,
-                                     0, Size, 0, 0, 0, 
-                                     getOrCreateVTablePtrType(Unit));
+    = DBuilder.CreateMemberType(getVTableName(RD), Unit,
+                                0, Size, 0, 0, 0, 
+                                getOrCreateVTablePtrType(Unit));
   EltTys.push_back(VPTR);
 }
 
@@ -944,7 +876,7 @@
 llvm::DIType CGDebugInfo::getOrCreateRecordType(QualType RTy, 
                                                 SourceLocation Loc) {
   llvm::DIType T =  getOrCreateType(RTy, getOrCreateFile(Loc));
-  DebugFactory.RecordType(T);
+  DBuilder.RetainType(T);
   return T;
 }
 
@@ -953,16 +885,6 @@
                                      llvm::DIFile Unit) {
   RecordDecl *RD = Ty->getDecl();
 
-  unsigned Tag;
-  if (RD->isStruct())
-    Tag = llvm::dwarf::DW_TAG_structure_type;
-  else if (RD->isUnion())
-    Tag = llvm::dwarf::DW_TAG_union_type;
-  else {
-    assert(RD->isClass() && "Unknown RecordType!");
-    Tag = llvm::dwarf::DW_TAG_class_type;
-  }
-
   // Get overall information about the record type for the debug info.
   llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation());
   unsigned Line = getLineNumber(RD->getLocation());
@@ -979,16 +901,16 @@
   // If this is just a forward declaration, construct an appropriately
   // marked node and just return it.
   if (!RD->getDefinition()) {
-    llvm::DICompositeType FwdDecl =
-      DebugFactory.CreateCompositeType(Tag, FDContext, RD->getName(),
-                                       DefUnit, Line, 0, 0, 0,
-                                       llvm::DIDescriptor::FlagFwdDecl,
-                                       llvm::DIType(), llvm::DIArray());
+    llvm::DIType FwdDecl =
+      DBuilder.CreateStructType(FDContext, RD->getName(),
+                                DefUnit, Line, 0, 0,
+                                llvm::DIDescriptor::FlagFwdDecl,
+                                llvm::DIArray());
 
       return FwdDecl;
   }
 
-  llvm::DIType FwdDecl = DebugFactory.CreateTemporaryType();
+  llvm::DIType FwdDecl = DBuilder.CreateTemporaryType(DefUnit);
 
   llvm::MDNode *MN = FwdDecl;
   llvm::TrackingVH<llvm::MDNode> FwdDeclNode = MN;
@@ -1000,7 +922,7 @@
   RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl);
 
   // Convert all the elements.
-  llvm::SmallVector<llvm::DIDescriptor, 16> EltTys;
+  llvm::SmallVector<llvm::Value *, 16> EltTys;
 
   const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD);
   if (CXXDecl) {
@@ -1024,21 +946,46 @@
           llvm::DIType VTy = getOrCreateType(V->getType(), VUnit);
           // Do not use DIGlobalVariable for enums.
           if (VTy.getTag() != llvm::dwarf::DW_TAG_enumeration_type) {
-            DebugFactory.CreateGlobalVariable(FwdDecl, VName, VName, VName, VUnit,
-                                              getLineNumber(V->getLocation()),
-                                              VTy, true, true, CI);
+            DBuilder.CreateStaticVariable(FwdDecl, VName, VName, VUnit,
+                                          getLineNumber(V->getLocation()),
+                                          VTy, true, CI);
           }
         }
       }
     }
 
   CollectRecordFields(RD, Unit, EltTys);
-  llvm::MDNode *ContainingType = NULL;
   if (CXXDecl) {
     CollectCXXMemberFunctions(CXXDecl, Unit, EltTys, FwdDecl);
     CollectCXXFriends(CXXDecl, Unit, EltTys, FwdDecl);
+  }
 
-    // A class's primary base or the class itself contains the vtable.
+  RegionStack.pop_back();
+  llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator RI = 
+    RegionMap.find(Ty->getDecl());
+  if (RI != RegionMap.end())
+    RegionMap.erase(RI);
+
+  llvm::DIDescriptor RDContext =  
+    getContextDescriptor(dyn_cast<Decl>(RD->getDeclContext()), Unit);
+  llvm::StringRef RDName = RD->getName();
+  uint64_t Size = CGM.getContext().getTypeSize(Ty);
+  uint64_t Align = CGM.getContext().getTypeAlign(Ty);
+  llvm::DIArray Elements =
+    DBuilder.GetOrCreateArray(EltTys.data(), EltTys.size());
+  llvm::MDNode *RealDecl = NULL;
+
+  if (RD->isStruct()) 
+    RealDecl = DBuilder.CreateStructType(RDContext, RDName, DefUnit, Line,
+                                         Size, Align, 0, Elements);
+  else if (RD->isUnion())
+    RealDecl = DBuilder.CreateUnionType(RDContext, RDName, DefUnit, Line,
+                                         Size, Align, 0, Elements);
+  else {
+    assert(RD->isClass() && "Unknown RecordType!");
+    RDName = getClassName(RD);
+     // A class's primary base or the class itself contains the vtable.
+    llvm::MDNode *ContainingType = NULL;
     const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
     if (const CXXRecordDecl *PBase = RL.getPrimaryBase()) {
       // Seek non virtual primary base root.
@@ -1055,41 +1002,16 @@
     }
     else if (CXXDecl->isDynamicClass()) 
       ContainingType = FwdDecl;
+   RealDecl = DBuilder.CreateClassType(RDContext, RDName, DefUnit, Line,
+                                       Size, Align, 0, 0, llvm::DIType(),
+                                       Elements, ContainingType);
   }
 
-  llvm::DIArray Elements =
-    DebugFactory.GetOrCreateArray(EltTys.data(), EltTys.size());
-
-  // Bit size, align and offset of the type.
-  uint64_t Size = CGM.getContext().getTypeSize(Ty);
-  uint64_t Align = CGM.getContext().getTypeAlign(Ty);
-
-  RegionStack.pop_back();
-  llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator RI = 
-    RegionMap.find(Ty->getDecl());
-  if (RI != RegionMap.end())
-    RegionMap.erase(RI);
-
-  llvm::DIDescriptor RDContext =  
-    getContextDescriptor(dyn_cast<Decl>(RD->getDeclContext()), Unit);
-
-  llvm::StringRef RDName = RD->getName();
-  // If this is a class, include the template arguments also.
-  if (Tag == llvm::dwarf::DW_TAG_class_type) 
-    RDName = getClassName(RD);
-  
-  llvm::DICompositeType RealDecl =
-    DebugFactory.CreateCompositeType(Tag, RDContext,
-                                     RDName,
-                                     DefUnit, Line, Size, Align, 0, 0, 
-                                     llvm::DIType(), Elements, 
-                                     0, ContainingType);
-
   // Now that we have a real decl for the struct, replace anything using the
   // old decl with the new one.  This will recursively update the debug info.
   llvm::DIType(FwdDeclNode).replaceAllUsesWith(RealDecl);
   RegionMap[RD] = llvm::WeakVH(RealDecl);
-  return RealDecl;
+  return llvm::DIType(RealDecl);
 }
 
 /// CreateType - get objective-c object type.
@@ -1105,8 +1027,6 @@
   ObjCInterfaceDecl *ID = Ty->getDecl();
   if (!ID)
     return llvm::DIType();
-  
-  unsigned Tag = llvm::dwarf::DW_TAG_structure_type;
 
   // Get overall information about the record type for the debug info.
   llvm::DIFile DefUnit = getOrCreateFile(ID->getLocation());
@@ -1116,11 +1036,10 @@
   // If this is just a forward declaration, return a special forward-declaration
   // debug type.
   if (ID->isForwardDecl()) {
-    llvm::DICompositeType FwdDecl =
-      DebugFactory.CreateCompositeType(Tag, Unit, ID->getName(),
-                                       DefUnit, Line, 0, 0, 0, 0,
-                                       llvm::DIType(), llvm::DIArray(),
-                                       RuntimeLang);
+    llvm::DIType FwdDecl =
+      DBuilder.CreateStructType(Unit, ID->getName(),
+                                DefUnit, Line, 0, 0, 0,
+                                llvm::DIArray(), RuntimeLang);
     return FwdDecl;
   }
 
@@ -1130,7 +1049,7 @@
   // its members.  Finally, we create a descriptor for the complete type (which
   // may refer to the forward decl if the struct is recursive) and replace all
   // uses of the forward declaration with the final definition.
-  llvm::DIType FwdDecl = DebugFactory.CreateTemporaryType();
+  llvm::DIType FwdDecl = DBuilder.CreateTemporaryType(DefUnit);
 
   llvm::MDNode *MN = FwdDecl;
   llvm::TrackingVH<llvm::MDNode> FwdDeclNode = MN;
@@ -1142,7 +1061,7 @@
   RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl);
 
   // Convert all the elements.
-  llvm::SmallVector<llvm::DIDescriptor, 16> EltTys;
+  llvm::SmallVector<llvm::Value *, 16> EltTys;
 
   ObjCInterfaceDecl *SClass = ID->getSuperClass();
   if (SClass) {
@@ -1152,9 +1071,7 @@
       return llvm::DIType();
     
     llvm::DIType InhTag =
-      DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_inheritance,
-                                     Unit, "", Unit, 0, 0, 0,
-                                     0 /* offset */, 0, SClassTy);
+      DBuilder.CreateInheritance(FwdDecl, SClassTy, 0, 0);
     EltTys.push_back(InhTag);
   }
 
@@ -1199,18 +1116,14 @@
     else if (Field->getAccessControl() == ObjCIvarDecl::Private)
       Flags = llvm::DIDescriptor::FlagPrivate;
 
-    // Create a DW_TAG_member node to remember the offset of this field in the
-    // struct.  FIXME: This is an absolutely insane way to capture this
-    // information.  When we gut debug info, this should be fixed.
-    FieldTy = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, Unit,
-                                             FieldName, FieldDefUnit,
-                                             FieldLine, FieldSize, FieldAlign,
-                                             FieldOffset, Flags, FieldTy);
+    FieldTy = DBuilder.CreateMemberType(FieldName, FieldDefUnit,
+                                        FieldLine, FieldSize, FieldAlign,
+                                        FieldOffset, Flags, FieldTy);
     EltTys.push_back(FieldTy);
   }
 
   llvm::DIArray Elements =
-    DebugFactory.GetOrCreateArray(EltTys.data(), EltTys.size());
+    DBuilder.GetOrCreateArray(EltTys.data(), EltTys.size());
 
   RegionStack.pop_back();
   llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator RI = 
@@ -1222,10 +1135,10 @@
   uint64_t Size = CGM.getContext().getTypeSize(Ty);
   uint64_t Align = CGM.getContext().getTypeAlign(Ty);
 
-  llvm::DICompositeType RealDecl =
-    DebugFactory.CreateCompositeType(Tag, Unit, ID->getName(), DefUnit,
-                                     Line, Size, Align, 0, 0, llvm::DIType(), 
-                                     Elements, RuntimeLang);
+  llvm::DIType RealDecl =
+    DBuilder.CreateStructType(Unit, ID->getName(), DefUnit,
+                                  Line, Size, Align, 0,
+                                  Elements, RuntimeLang);
 
   // Now that we have a real decl for the struct, replace anything using the
   // old decl with the new one.  This will recursively update the debug info.
@@ -1258,17 +1171,14 @@
   if (NumElems > 0)
     --NumElems;
 
-  llvm::DIDescriptor Subscript = DebugFactory.GetOrCreateSubrange(0, NumElems);
-  llvm::DIArray SubscriptArray = DebugFactory.GetOrCreateArray(&Subscript, 1);
+  llvm::Value *Subscript = DBuilder.GetOrCreateSubrange(0, NumElems);
+  llvm::DIArray SubscriptArray = DBuilder.GetOrCreateArray(&Subscript, 1);
 
   uint64_t Size = CGM.getContext().getTypeSize(Ty);
   uint64_t Align = CGM.getContext().getTypeAlign(Ty);
 
   return
-    DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_vector_type,
-                                     Unit, "", Unit,
-                                     0, Size, Align, 0, 0,
-                                     ElementTy,  SubscriptArray);
+    DBuilder.CreateVectorType(Size, Align, ElementTy, SubscriptArray);
 }
 
 llvm::DIType CGDebugInfo::CreateType(const ArrayType *Ty,
@@ -1294,7 +1204,7 @@
   // Add the dimensions of the array.  FIXME: This loses CV qualifiers from
   // interior arrays, do we care?  Why aren't nested arrays represented the
   // obvious/recursive way?
-  llvm::SmallVector<llvm::DIDescriptor, 8> Subscripts;
+  llvm::SmallVector<llvm::Value *, 8> Subscripts;
   QualType EltTy(Ty, 0);
   if (Ty->isIncompleteArrayType())
     EltTy = Ty->getElementType();
@@ -1305,20 +1215,17 @@
         if (CAT->getSize().getZExtValue())
           Upper = CAT->getSize().getZExtValue() - 1;
       // FIXME: Verify this is right for VLAs.
-      Subscripts.push_back(DebugFactory.GetOrCreateSubrange(0, Upper));
+      Subscripts.push_back(DBuilder.GetOrCreateSubrange(0, Upper));
       EltTy = Ty->getElementType();
     }
   }
 
   llvm::DIArray SubscriptArray =
-    DebugFactory.GetOrCreateArray(Subscripts.data(), Subscripts.size());
+    DBuilder.GetOrCreateArray(Subscripts.data(), Subscripts.size());
 
   llvm::DIType DbgTy = 
-    DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_array_type,
-                                     Unit, "", Unit,
-                                     0, Size, Align, 0, 0,
-                                     getOrCreateType(EltTy, Unit),
-                                     SubscriptArray);
+    DBuilder.CreateArrayType(Size, Align, getOrCreateType(EltTy, Unit),
+                             SubscriptArray);
   return DbgTy;
 }
 
@@ -1343,47 +1250,45 @@
   std::pair<uint64_t, unsigned> Info = CGM.getContext().getTypeInfo(Ty);
 
   uint64_t FieldOffset = 0;
-  llvm::DIDescriptor ElementTypes[2];
+  llvm::Value *ElementTypes[2];
   
   // FIXME: This should probably be a function type instead.
   ElementTypes[0] =
-    DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, U,
-                                   "ptr", U, 0,
-                                   Info.first, Info.second, FieldOffset, 0,
-                                   PointerDiffDITy);
+    DBuilder.CreateMemberType("ptr", U, 0,
+                              Info.first, Info.second, FieldOffset, 0,
+                              PointerDiffDITy);
   FieldOffset += Info.first;
   
   ElementTypes[1] =
-    DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, U,
-                                   "ptr", U, 0,
-                                   Info.first, Info.second, FieldOffset, 0,
-                                   PointerDiffDITy);
+    DBuilder.CreateMemberType("ptr", U, 0,
+                              Info.first, Info.second, FieldOffset, 0,
+                              PointerDiffDITy);
   
   llvm::DIArray Elements = 
-    DebugFactory.GetOrCreateArray(&ElementTypes[0],
-                                  llvm::array_lengthof(ElementTypes));
+    DBuilder.GetOrCreateArray(&ElementTypes[0],
+                              llvm::array_lengthof(ElementTypes));
 
-  return DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_structure_type, 
-                                          U, llvm::StringRef("test"), 
-                                          U, 0, FieldOffset, 
-                                          0, 0, 0, llvm::DIType(), Elements);
+  return DBuilder.CreateStructType(U, llvm::StringRef("test"), 
+                                   U, 0, FieldOffset, 
+                                   0, 0, Elements);
 }
 
 /// CreateEnumType - get enumeration type.
 llvm::DIType CGDebugInfo::CreateEnumType(const EnumDecl *ED, llvm::DIFile Unit){
-  llvm::SmallVector<llvm::DIDescriptor, 32> Enumerators;
+  llvm::SmallVector<llvm::Value *, 16> Enumerators;
 
   // Create DIEnumerator elements for each enumerator.
   for (EnumDecl::enumerator_iterator
          Enum = ED->enumerator_begin(), EnumEnd = ED->enumerator_end();
        Enum != EnumEnd; ++Enum) {
-    Enumerators.push_back(DebugFactory.CreateEnumerator(Enum->getName(),
-                                            Enum->getInitVal().getZExtValue()));
+    Enumerators.push_back(
+      DBuilder.CreateEnumerator(Enum->getName(),
+                                Enum->getInitVal().getZExtValue()));
   }
 
   // Return a CompositeType for the enum itself.
   llvm::DIArray EltArray =
-    DebugFactory.GetOrCreateArray(Enumerators.data(), Enumerators.size());
+    DBuilder.GetOrCreateArray(Enumerators.data(), Enumerators.size());
 
   llvm::DIFile DefUnit = getOrCreateFile(ED->getLocation());
   unsigned Line = getLineNumber(ED->getLocation());
@@ -1396,10 +1301,8 @@
   llvm::DIDescriptor EnumContext = 
     getContextDescriptor(dyn_cast<Decl>(ED->getDeclContext()), Unit);
   llvm::DIType DbgTy = 
-    DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_enumeration_type,
-                                     EnumContext, ED->getName(),
-                                     DefUnit, Line, Size, Align, 0, 0,
-                                     llvm::DIType(), EltArray);
+    DBuilder.CreateEnumerationType(EnumContext, ED->getName(), DefUnit, Line,
+                                   Size, Align, EltArray);
   return DbgTy;
 }
 
@@ -1549,10 +1452,9 @@
   llvm::DIType FieldTy = CGDebugInfo::getOrCreateType(FType, Unit);
   uint64_t FieldSize = CGM.getContext().getTypeSize(FType);
   unsigned FieldAlign = CGM.getContext().getTypeAlign(FType);
-  llvm::DIType Ty = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member,
-                                                   Unit, Name, Unit, 0,
-                                                   FieldSize, FieldAlign,
-                                                   *Offset, 0, FieldTy);
+  llvm::DIType Ty = DBuilder.CreateMemberType(Name, Unit, 0,
+                                              FieldSize, FieldAlign,
+                                              *Offset, 0, FieldTy);
   *Offset += FieldSize;
   return Ty;
 }
@@ -1613,12 +1515,10 @@
   if (D->isImplicit())
     Flags |= llvm::DIDescriptor::FlagArtificial;
   llvm::DISubprogram SP =
-    DebugFactory.CreateSubprogram(FDContext, Name, Name, LinkageName, Unit,
-                                  LineNo, getOrCreateType(FnType, Unit),
-                                  Fn->hasInternalLinkage(), true/*definition*/,
-                                  0, 0, llvm::DIType(),
-                                  Flags,
-                                  CGM.getLangOptions().Optimize, Fn);
+    DBuilder.CreateFunction(FDContext, Name, LinkageName, Unit,
+                            LineNo, getOrCreateType(FnType, Unit),
+                            Fn->hasInternalLinkage(), true/*definition*/,
+                            Flags, CGM.getLangOptions().Optimize, Fn);
 
   // Push function on region stack.
   llvm::MDNode *SPN = SP;
@@ -1707,12 +1607,12 @@
 /// region - "llvm.dbg.region.start.".
 void CGDebugInfo::EmitRegionStart(CGBuilderTy &Builder) {
   llvm::DIDescriptor D =
-    DebugFactory.CreateLexicalBlock(RegionStack.empty() ? 
-                                    llvm::DIDescriptor() : 
-                                    llvm::DIDescriptor(RegionStack.back()),
-                                    getOrCreateFile(CurLoc),
-                                    getLineNumber(CurLoc), 
-                                    getColumnNumber(CurLoc));
+    DBuilder.CreateLexicalBlock(RegionStack.empty() ? 
+                                llvm::DIDescriptor() : 
+                                llvm::DIDescriptor(RegionStack.back()),
+                                getOrCreateFile(CurLoc),
+                                getLineNumber(CurLoc), 
+                                getColumnNumber(CurLoc));
   llvm::MDNode *DN = D;
   RegionStack.push_back(DN);
 }
@@ -1745,8 +1645,7 @@
 llvm::DIType CGDebugInfo::EmitTypeForVarWithBlocksAttr(const ValueDecl *VD,
                                                        uint64_t *XOffset) {
 
-  llvm::SmallVector<llvm::DIDescriptor, 5> EltTys;
-
+  llvm::SmallVector<llvm::Value *, 5> EltTys;
   QualType FType;
   uint64_t FieldSize, FieldOffset;
   unsigned FieldAlign;
@@ -1793,24 +1692,21 @@
   FieldAlign = Align.getQuantity()*8;
 
   *XOffset = FieldOffset;  
-  FieldTy = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_member, Unit,
-                                           VD->getName(), Unit,
-                                           0, FieldSize, FieldAlign,
-                                           FieldOffset, 0, FieldTy);
+  FieldTy = DBuilder.CreateMemberType(VD->getName(), Unit,
+                                      0, FieldSize, FieldAlign,
+                                      FieldOffset, 0, FieldTy);
   EltTys.push_back(FieldTy);
   FieldOffset += FieldSize;
   
   llvm::DIArray Elements = 
-    DebugFactory.GetOrCreateArray(EltTys.data(), EltTys.size());
+    DBuilder.GetOrCreateArray(EltTys.data(), EltTys.size());
   
   unsigned Flags = llvm::DIDescriptor::FlagBlockByrefStruct;
   
-  return DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_structure_type, 
-                                          Unit, "", Unit,
-                                          0, FieldOffset, 0, 0, Flags,
-                                          llvm::DIType(), Elements);
-  
+  return DBuilder.CreateStructType(Unit, "", Unit, 0, FieldOffset, 0, Flags,
+                                   Elements);
 }
+
 /// EmitDeclare - Emit local variable declaration debug info.
 void CGDebugInfo::EmitDeclare(const VarDecl *VD, unsigned Tag,
                               llvm::Value *Storage, CGBuilderTy &Builder) {
@@ -1841,13 +1737,13 @@
   if (!Name.empty()) {
     // Create the descriptor for the variable.
     llvm::DIVariable D =
-      DebugFactory.CreateVariable(Tag, llvm::DIDescriptor(Scope),
-                                  Name, Unit, Line, Ty, 
-                                  CGM.getLangOptions().Optimize, Flags);
+      DBuilder.CreateLocalVariable(Tag, llvm::DIDescriptor(Scope), 
+                                   Name, Unit, Line, Ty, 
+                                   CGM.getLangOptions().Optimize, Flags);
     
     // Insert an llvm.dbg.declare into the current block.
     llvm::Instruction *Call =
-      DebugFactory.InsertDeclare(Storage, D, Builder.GetInsertBlock());
+      DBuilder.InsertDeclare(Storage, D, Builder.GetInsertBlock());
     
     Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope));
     return;
@@ -1871,13 +1767,13 @@
           
           // Use VarDecl's Tag, Scope and Line number.
           llvm::DIVariable D =
-            DebugFactory.CreateVariable(Tag, llvm::DIDescriptor(Scope),
-                                        FieldName, Unit, Line, FieldTy, 
-                                        CGM.getLangOptions().Optimize, Flags);
+            DBuilder.CreateLocalVariable(Tag, llvm::DIDescriptor(Scope),
+                                         FieldName, Unit, Line, FieldTy, 
+                                         CGM.getLangOptions().Optimize, Flags);
           
           // Insert an llvm.dbg.declare into the current block.
           llvm::Instruction *Call =
-            DebugFactory.InsertDeclare(Storage, D, Builder.GetInsertBlock());
+            DBuilder.InsertDeclare(Storage, D, Builder.GetInsertBlock());
           
           Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope));
         }
@@ -1927,13 +1823,12 @@
 
   // Create the descriptor for the variable.
   llvm::DIVariable D =
-    DebugFactory.CreateComplexVariable(Tag,
-                                       llvm::DIDescriptor(RegionStack.back()),
-                                       VD->getName(), Unit, Line, Ty,
-                                       addr.data(), addr.size());
+    DBuilder.CreateComplexVariable(Tag, llvm::DIDescriptor(RegionStack.back()),
+                                   VD->getName(), Unit, Line, Ty,
+                                   addr.data(), addr.size());
   // Insert an llvm.dbg.declare into the current block.
   llvm::Instruction *Call = 
-    DebugFactory.InsertDeclare(Storage, D, Builder.GetInsertBlock());
+    DBuilder.InsertDeclare(Storage, D, Builder.GetInsertBlock());
   
   llvm::MDNode *Scope = RegionStack.back();
   Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope));
@@ -1988,10 +1883,9 @@
     LinkageName = llvm::StringRef();
   llvm::DIDescriptor DContext = 
     getContextDescriptor(dyn_cast<Decl>(D->getDeclContext()), Unit);
-  DebugFactory.CreateGlobalVariable(DContext, DeclName, DeclName, LinkageName,
-                                    Unit, LineNo, getOrCreateType(T, Unit),
-                                    Var->hasInternalLinkage(),
-                                    true/*definition*/, Var);
+  DBuilder.CreateStaticVariable(DContext, DeclName, LinkageName,
+                                Unit, LineNo, getOrCreateType(T, Unit),
+                                Var->hasInternalLinkage(), Var);
 }
 
 /// EmitGlobalVariable - Emit information about an objective-c interface.
@@ -2016,10 +1910,9 @@
                                            ArrayType::Normal, 0);
   }
 
-  DebugFactory.CreateGlobalVariable(Unit, Name, Name, Name, Unit, LineNo,
-                                    getOrCreateType(T, Unit),
-                                    Var->hasInternalLinkage(),
-                                    true/*definition*/, Var);
+  DBuilder.CreateGlobalVariable(Name, Unit, LineNo,
+                                getOrCreateType(T, Unit),
+                                Var->hasInternalLinkage(), Var);
 }
 
 /// EmitGlobalVariable - Emit global variable's debug info.
@@ -2036,9 +1929,9 @@
   // Do not use DIGlobalVariable for enums.
   if (Ty.getTag() == llvm::dwarf::DW_TAG_enumeration_type)
     return;
-  DebugFactory.CreateGlobalVariable(Unit, Name, Name, Name, Unit,
-                                    getLineNumber(VD->getLocation()),
-                                    Ty, true, true, Init);
+  DBuilder.CreateStaticVariable(Unit, Name, Name, Unit,
+                                getLineNumber(VD->getLocation()),
+                                Ty, true, Init);
 }
 
 /// getOrCreateNamesSpace - Return namespace descriptor for the given
@@ -2056,7 +1949,7 @@
   llvm::DIDescriptor Context = 
     getContextDescriptor(dyn_cast<Decl>(NSDecl->getDeclContext()), Unit);
   llvm::DINameSpace NS =
-    DebugFactory.CreateNameSpace(Context, NSDecl->getName(), FileD, LineNo);
+    DBuilder.CreateNameSpace(Context, NSDecl->getName(), FileD, LineNo);
   NameSpaceCache[NSDecl] = llvm::WeakVH(NS);
   return NS;
 }

Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.h?rev=121302&r1=121301&r2=121302&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGDebugInfo.h (original)
+++ cfe/trunk/lib/CodeGen/CGDebugInfo.h Wed Dec  8 16:42:58 2010
@@ -19,6 +19,7 @@
 #include "clang/Basic/SourceLocation.h"
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/Analysis/DebugInfo.h"
+#include "llvm/Analysis/DIBuilder.h"
 #include "llvm/Support/ValueHandle.h"
 #include "llvm/Support/Allocator.h"
 
@@ -42,7 +43,7 @@
 /// the backend.
 class CGDebugInfo {
   CodeGenModule &CGM;
-  llvm::DIFactory DebugFactory;
+  llvm::DIBuilder DBuilder;
   llvm::DICompileUnit TheCU;
   SourceLocation CurLoc, PrevLoc;
   llvm::DIType VTablePtrType;
@@ -109,26 +110,26 @@
   
   void CollectCXXMemberFunctions(const CXXRecordDecl *Decl,
                                  llvm::DIFile F,
-                                 llvm::SmallVectorImpl<llvm::DIDescriptor> &E,
+                                 llvm::SmallVectorImpl<llvm::Value *> &E,
                                  llvm::DIType T);
 
   void CollectCXXFriends(const CXXRecordDecl *Decl,
                        llvm::DIFile F,
-                       llvm::SmallVectorImpl<llvm::DIDescriptor> &EltTys,
+                       llvm::SmallVectorImpl<llvm::Value *> &EltTys,
                        llvm::DIType RecordTy);
 
   void CollectCXXBases(const CXXRecordDecl *Decl,
                        llvm::DIFile F,
-                       llvm::SmallVectorImpl<llvm::DIDescriptor> &EltTys,
+                       llvm::SmallVectorImpl<llvm::Value *> &EltTys,
                        llvm::DIType RecordTy);
 
 
   void CollectRecordFields(const RecordDecl *Decl, llvm::DIFile F,
-                           llvm::SmallVectorImpl<llvm::DIDescriptor> &E);
+                           llvm::SmallVectorImpl<llvm::Value *> &E);
 
   void CollectVTableInfo(const CXXRecordDecl *Decl,
                          llvm::DIFile F,
-                         llvm::SmallVectorImpl<llvm::DIDescriptor> &EltTys);
+                         llvm::SmallVectorImpl<llvm::Value *> &EltTys);
 
 public:
   CGDebugInfo(CodeGenModule &CGM);

Modified: cfe/trunk/test/CodeGen/2010-03-09-DbgInfo.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/2010-03-09-DbgInfo.c?rev=121302&r1=121301&r2=121302&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/2010-03-09-DbgInfo.c (original)
+++ cfe/trunk/test/CodeGen/2010-03-09-DbgInfo.c Wed Dec  8 16:42:58 2010
@@ -1,2 +1,2 @@
-// RUN: %clang -dA -S -O0 -g %s -o - | grep DW_TAG_variable
+// RUN: %clang -emit-llvm -S -O0 -g %s -o - | grep DW_TAG_variable
 unsigned char ctable1[1] = { 0001 };





More information about the cfe-commits mailing list