From: Devang Patel Date: Wed, 8 Dec 2010 22:42:58 +0000 (+0000) Subject: Start using DIBuilder. It provides cleaner interface. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=823d8e96cf3ff11775b8beb7f4d817a578972dc4;p=clang Start using DIBuilder. It provides cleaner interface. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@121302 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index d532214cc9..f102f8b3a9 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -38,7 +38,7 @@ using namespace clang; 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 @@ CGDebugInfo::getClassName(RecordDecl *RD) { /// 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 @@ llvm::DIFile CGDebugInfo::getOrCreateFile(SourceLocation Loc) { return llvm::DIFile(cast(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 @@ llvm::DIFile CGDebugInfo::getOrCreateFile(SourceLocation Loc) { /// 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 @@ void CGDebugInfo::CreateCompileUnit() { 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 @@ llvm::DIType CGDebugInfo::CreateType(const BuiltinType *BT) { 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 @@ llvm::DIType CGDebugInfo::CreateType(const BuiltinType *BT) { // } *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 EltTys; + llvm::DIType ISATy = DBuilder.CreatePointerType(OCTy, Size); + llvm::SmallVector 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 @@ llvm::DIType CGDebugInfo::CreateType(const BuiltinType *BT) { // 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 @@ llvm::DIType CGDebugInfo::CreateType(const ComplexType *Ty, 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 @@ llvm::DIType CGDebugInfo::CreateQualifiedType(QualType Ty, llvm::DIFile Unit) { // 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 @@ llvm::DIType CGDebugInfo::CreatePointeeType(QualType PointeeTy, if (const RecordType *RTy = dyn_cast(PointeeTy)) { RecordDecl *RD = RTy->getDecl(); - unsigned RTag; + llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); + unsigned Line = getLineNumber(RD->getLocation()); + llvm::DIDescriptor FDContext = + getContextDescriptor(dyn_cast(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(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 @@ llvm::DIType CGDebugInfo::CreatePointerLikeType(unsigned Tag, 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 @@ llvm::DIType CGDebugInfo::CreateType(const BlockPointerType *Ty, if (BlockLiteralGenericSet) return BlockLiteralGeneric; - unsigned Tag = llvm::dwarf::DW_TAG_structure_type; - - llvm::SmallVector EltTys; - + llvm::SmallVector EltTys; llvm::DIType FieldTy; - QualType FType; uint64_t FieldSize, FieldOffset; unsigned FieldAlign; - llvm::DIArray Elements; llvm::DIType EltTy, DescTy; @@ -498,23 +482,20 @@ llvm::DIType CGDebugInfo::CreateType(const BlockPointerType *Ty, 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 @@ llvm::DIType CGDebugInfo::CreateType(const BlockPointerType *Ty, 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 @@ llvm::DIType CGDebugInfo::CreateType(const TypedefType *Ty, // 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(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 EltTys; + llvm::SmallVector EltTys; // Add the result type at least. EltTys.push_back(getOrCreateType(Ty->getResultType(), Unit)); @@ -581,20 +552,16 @@ llvm::DIType CGDebugInfo::CreateType(const FunctionType *Ty, // Set up remainder of arguments if there is a prototype. // FIXME: IF NOT, HOW IS THIS REPRESENTED? llvm-gcc doesn't represent '...'! if (isa(Ty)) - EltTys.push_back(DebugFactory.CreateUnspecifiedParameter()); + EltTys.push_back(DBuilder.CreateUnspecifiedParameter()); else if (const FunctionProtoType *FTP = dyn_cast(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 @@ llvm::DIType CGDebugInfo::CreateType(const FunctionType *Ty, /// record fields. This is used while creating debug info entry for a Record. void CGDebugInfo:: CollectRecordFields(const RecordDecl *RD, llvm::DIFile Unit, - llvm::SmallVectorImpl &EltTys) { + llvm::SmallVectorImpl &EltTys) { unsigned FieldNo = 0; const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); for (RecordDecl::field_iterator I = RD->field_begin(), @@ -641,13 +608,9 @@ CollectRecordFields(const RecordDecl *RD, llvm::DIFile Unit, 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 @@ CGDebugInfo::getOrCreateMethodType(const CXXMethodDecl *Method, llvm::DIArray Args = llvm::DICompositeType(FnTy).getTypeArray(); assert (Args.getNumElements() && "Invalid number of arguments!"); - llvm::SmallVector Elts; + llvm::SmallVector Elts; // First element is always return type. For 'void' functions it is NULL. Elts.push_back(Args.getElement(0)); @@ -680,7 +643,7 @@ CGDebugInfo::getOrCreateMethodType(const CXXMethodDecl *Method, 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 @@ CGDebugInfo::getOrCreateMethodType(const CXXMethodDecl *Method, 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 @@ CGDebugInfo::CreateCXXMemberFunction(const CXXMethodDecl *Method, 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 @@ CGDebugInfo::CreateCXXMemberFunction(const CXXMethodDecl *Method, /// a Record. void CGDebugInfo:: CollectCXXMemberFunctions(const CXXRecordDecl *RD, llvm::DIFile Unit, - llvm::SmallVectorImpl &EltTys, + llvm::SmallVectorImpl &EltTys, llvm::DIType RecordTy) { for(CXXRecordDecl::method_iterator I = RD->method_begin(), E = RD->method_end(); I != E; ++I) { @@ -811,26 +768,15 @@ CollectCXXMemberFunctions(const CXXRecordDecl *RD, llvm::DIFile Unit, /// a Record. void CGDebugInfo:: CollectCXXFriends(const CXXRecordDecl *RD, llvm::DIFile Unit, - llvm::SmallVectorImpl &EltTys, + llvm::SmallVectorImpl &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 @@ CollectCXXFriends(const CXXRecordDecl *RD, llvm::DIFile Unit, /// a Record. void CGDebugInfo:: CollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile Unit, - llvm::SmallVectorImpl &EltTys, + llvm::SmallVectorImpl &EltTys, llvm::DIType RecordTy) { const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); @@ -865,13 +811,10 @@ CollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile Unit, 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 @@ llvm::DIType CGDebugInfo::getOrCreateVTablePtrType(llvm::DIFile Unit) { 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 @@ llvm::StringRef CGDebugInfo::getVTableName(const CXXRecordDecl *RD) { /// debug info entry in EltTys vector. void CGDebugInfo:: CollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile Unit, - llvm::SmallVectorImpl &EltTys) { + llvm::SmallVectorImpl &EltTys) { const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); // If there is a primary base then it will hold vtable info. @@ -933,10 +866,9 @@ CollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile Unit, 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 @@ CollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile Unit, 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::DIType CGDebugInfo::CreateType(const RecordType *Ty, 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 @@ llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty, // 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 FwdDeclNode = MN; @@ -1000,7 +922,7 @@ llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty, RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl); // Convert all the elements. - llvm::SmallVector EltTys; + llvm::SmallVector EltTys; const CXXRecordDecl *CXXDecl = dyn_cast(RD); if (CXXDecl) { @@ -1024,21 +946,46 @@ llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty, 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::iterator RI = + RegionMap.find(Ty->getDecl()); + if (RI != RegionMap.end()) + RegionMap.erase(RI); + + llvm::DIDescriptor RDContext = + getContextDescriptor(dyn_cast(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 @@ llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty, } 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::iterator RI = - RegionMap.find(Ty->getDecl()); - if (RI != RegionMap.end()) - RegionMap.erase(RI); - - llvm::DIDescriptor RDContext = - getContextDescriptor(dyn_cast(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 @@ llvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, 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 @@ llvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, // 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 @@ llvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, // 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 FwdDeclNode = MN; @@ -1142,7 +1061,7 @@ llvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl); // Convert all the elements. - llvm::SmallVector EltTys; + llvm::SmallVector EltTys; ObjCInterfaceDecl *SClass = ID->getSuperClass(); if (SClass) { @@ -1152,9 +1071,7 @@ llvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, 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 @@ llvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, 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::iterator RI = @@ -1222,10 +1135,10 @@ llvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, 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 @@ llvm::DIType CGDebugInfo::CreateType(const VectorType *Ty, 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 @@ llvm::DIType CGDebugInfo::CreateType(const ArrayType *Ty, // 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 Subscripts; + llvm::SmallVector Subscripts; QualType EltTy(Ty, 0); if (Ty->isIncompleteArrayType()) EltTy = Ty->getElementType(); @@ -1305,20 +1215,17 @@ llvm::DIType CGDebugInfo::CreateType(const ArrayType *Ty, 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 @@ llvm::DIType CGDebugInfo::CreateType(const MemberPointerType *Ty, std::pair 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 Enumerators; + llvm::SmallVector 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::DIType CGDebugInfo::CreateEnumType(const EnumDecl *ED, llvm::DIFile Unit){ llvm::DIDescriptor EnumContext = getContextDescriptor(dyn_cast(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 CGDebugInfo::CreateMemberType(llvm::DIFile Unit, QualType FType, 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 @@ void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, QualType FnType, 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 @@ void CGDebugInfo::UpdateLineDirectiveRegion(CGBuilderTy &Builder) { /// 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 @@ void CGDebugInfo::EmitFunctionEnd(CGBuilderTy &Builder) { llvm::DIType CGDebugInfo::EmitTypeForVarWithBlocksAttr(const ValueDecl *VD, uint64_t *XOffset) { - llvm::SmallVector EltTys; - + llvm::SmallVector EltTys; QualType FType; uint64_t FieldSize, FieldOffset; unsigned FieldAlign; @@ -1793,24 +1692,21 @@ llvm::DIType CGDebugInfo::EmitTypeForVarWithBlocksAttr(const ValueDecl *VD, 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 @@ void CGDebugInfo::EmitDeclare(const VarDecl *VD, unsigned Tag, 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 @@ void CGDebugInfo::EmitDeclare(const VarDecl *VD, unsigned Tag, // 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 @@ void CGDebugInfo::EmitDeclare(const BlockDeclRefExpr *BDRE, unsigned Tag, // 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 @@ void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, LinkageName = llvm::StringRef(); llvm::DIDescriptor DContext = getContextDescriptor(dyn_cast(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 @@ void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, 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 @@ void CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, // 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 @@ CGDebugInfo::getOrCreateNameSpace(const NamespaceDecl *NSDecl, llvm::DIDescriptor Context = getContextDescriptor(dyn_cast(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; } diff --git a/lib/CodeGen/CGDebugInfo.h b/lib/CodeGen/CGDebugInfo.h index bcbe67fe74..104349e085 100644 --- a/lib/CodeGen/CGDebugInfo.h +++ b/lib/CodeGen/CGDebugInfo.h @@ -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 @@ namespace CodeGen { /// 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 @@ class CGDebugInfo { void CollectCXXMemberFunctions(const CXXRecordDecl *Decl, llvm::DIFile F, - llvm::SmallVectorImpl &E, + llvm::SmallVectorImpl &E, llvm::DIType T); void CollectCXXFriends(const CXXRecordDecl *Decl, llvm::DIFile F, - llvm::SmallVectorImpl &EltTys, + llvm::SmallVectorImpl &EltTys, llvm::DIType RecordTy); void CollectCXXBases(const CXXRecordDecl *Decl, llvm::DIFile F, - llvm::SmallVectorImpl &EltTys, + llvm::SmallVectorImpl &EltTys, llvm::DIType RecordTy); void CollectRecordFields(const RecordDecl *Decl, llvm::DIFile F, - llvm::SmallVectorImpl &E); + llvm::SmallVectorImpl &E); void CollectVTableInfo(const CXXRecordDecl *Decl, llvm::DIFile F, - llvm::SmallVectorImpl &EltTys); + llvm::SmallVectorImpl &EltTys); public: CGDebugInfo(CodeGenModule &CGM); diff --git a/test/CodeGen/2010-03-09-DbgInfo.c b/test/CodeGen/2010-03-09-DbgInfo.c index 04ee02e437..3541e5f561 100644 --- a/test/CodeGen/2010-03-09-DbgInfo.c +++ b/test/CodeGen/2010-03-09-DbgInfo.c @@ -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 };