diff options
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/CGDebugInfo.cpp | 40 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGDebugInfo.h | 5 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenTypes.cpp | 2 | ||||
-rw-r--r-- | clang/lib/CodeGen/ModuleBuilder.cpp | 2 |
4 files changed, 32 insertions, 17 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 5ac4a5dccbf..94f1bde38d5 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -1403,6 +1403,26 @@ llvm::DIType CGDebugInfo::getOrCreateInterfaceType(QualType D, return T; } +void CGDebugInfo::completeType(const RecordDecl *RD) { + if (DebugKind > CodeGenOptions::LimitedDebugInfo || + !CGM.getLangOpts().CPlusPlus) + completeRequiredType(RD); +} + +void CGDebugInfo::completeRequiredType(const RecordDecl *RD) { + QualType Ty = CGM.getContext().getRecordType(RD); + llvm::DIType T = getTypeOrNull(Ty); + if (!T || !T.isForwardDecl()) + return; + void* TyPtr = Ty.getAsOpaquePtr(); + if (CompletedTypeCache.count(TyPtr)) + return; + llvm::DIType Res = CreateTypeDefinition(Ty->castAs<RecordType>()); + assert(!Res.isForwardDecl()); + CompletedTypeCache[TyPtr] = Res; + TypeCache[TyPtr] = Res; +} + /// CreateType - get structure or union type. llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty, bool Declaration) { RecordDecl *RD = Ty->getDecl(); @@ -1419,6 +1439,12 @@ llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty, bool Declaration) { return RetTy; } + return CreateTypeDefinition(Ty); +} + +llvm::DIType CGDebugInfo::CreateTypeDefinition(const RecordType *Ty) { + RecordDecl *RD = Ty->getDecl(); + // Get overall information about the record type for the debug info. llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); @@ -1930,20 +1956,6 @@ llvm::DIType CGDebugInfo::getCompletedTypeOrNull(QualType Ty) { return llvm::DIType(cast_or_null<llvm::MDNode>(V)); } -void CGDebugInfo::completeFwdDecl(const RecordDecl &RD) { - // In limited debug info we only want to do this if the complete type was - // required. - if (DebugKind <= CodeGenOptions::LimitedDebugInfo && - CGM.getLangOpts().CPlusPlus) - return; - - QualType QTy = CGM.getContext().getRecordType(&RD); - llvm::DIType T = getTypeOrNull(QTy); - - if (T && T.isForwardDecl()) - getOrCreateType(QTy, getOrCreateFile(RD.getLocation())); -} - /// getCachedInterfaceTypeOrNull - Get the type from the interface /// cache, unless it needs to regenerated. Otherwise return null. llvm::Value *CGDebugInfo::getCachedInterfaceTypeOrNull(QualType Ty) { diff --git a/clang/lib/CodeGen/CGDebugInfo.h b/clang/lib/CodeGen/CGDebugInfo.h index 74b8e959993..72d956ed373 100644 --- a/clang/lib/CodeGen/CGDebugInfo.h +++ b/clang/lib/CodeGen/CGDebugInfo.h @@ -115,6 +115,7 @@ class CGDebugInfo { llvm::DIType CreateType(const BlockPointerType *Ty, llvm::DIFile F); llvm::DIType CreateType(const FunctionType *Ty, llvm::DIFile F); llvm::DIType CreateType(const RecordType *Ty, bool Declaration); + llvm::DIType CreateTypeDefinition(const RecordType *Ty); llvm::DIType CreateLimitedType(const RecordType *Ty); llvm::DIType CreateType(const ObjCInterfaceType *Ty, llvm::DIFile F); llvm::DIType CreateType(const ObjCObjectType *Ty, llvm::DIFile F); @@ -288,7 +289,9 @@ public: llvm::DIType getOrCreateInterfaceType(QualType Ty, SourceLocation Loc); - void completeFwdDecl(const RecordDecl &TD); + void completeType(const RecordDecl *RD); + void completeRequiredType(const RecordDecl *RD); + private: /// EmitDeclare - Emit call to llvm.dbg.declare for a variable declaration. diff --git a/clang/lib/CodeGen/CodeGenTypes.cpp b/clang/lib/CodeGen/CodeGenTypes.cpp index 88a1393a68f..442f2931a0a 100644 --- a/clang/lib/CodeGen/CodeGenTypes.cpp +++ b/clang/lib/CodeGen/CodeGenTypes.cpp @@ -264,7 +264,7 @@ void CodeGenTypes::UpdateCompletedType(const TagDecl *TD) { // If necessary, provide the full definition of a type only used with a // declaration so far. if (CGDebugInfo *DI = CGM.getModuleDebugInfo()) - DI->completeFwdDecl(*RD); + DI->completeType(RD); } static llvm::Type *getTypeForFormat(llvm::LLVMContext &VMContext, diff --git a/clang/lib/CodeGen/ModuleBuilder.cpp b/clang/lib/CodeGen/ModuleBuilder.cpp index c6d40330e0c..a33b3a38fb5 100644 --- a/clang/lib/CodeGen/ModuleBuilder.cpp +++ b/clang/lib/CodeGen/ModuleBuilder.cpp @@ -100,7 +100,7 @@ namespace { virtual void HandleTagDeclRequiredDefinition(const TagDecl *D) LLVM_OVERRIDE { if (CodeGen::CGDebugInfo *DI = Builder->getModuleDebugInfo()) if (const RecordDecl *RD = dyn_cast<RecordDecl>(D)) - DI->completeFwdDecl(*RD); + DI->completeRequiredType(RD); } virtual void HandleTranslationUnit(ASTContext &Ctx) { |