diff options
author | Eric Christopher <echristo@apple.com> | 2012-01-25 02:06:59 +0000 |
---|---|---|
committer | Eric Christopher <echristo@apple.com> | 2012-01-25 02:06:59 +0000 |
commit | 5d613b57972a761973861f7c38b3e6442243a6ab (patch) | |
tree | aa6333ea5b21c947ecdaa87b3f9c84d55006ac73 /lib/CodeGen/CGDebugInfo.cpp | |
parent | a70e2468865408df4f4a37212b40b85983aac4de (diff) |
Refactor the record decl forward declaration code a bit.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@148904 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGDebugInfo.cpp')
-rw-r--r-- | lib/CodeGen/CGDebugInfo.cpp | 64 |
1 files changed, 27 insertions, 37 deletions
diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 332fa8e1b8..65b88f5e5b 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -479,6 +479,31 @@ llvm::DIType CGDebugInfo::CreateType(const PointerType *Ty, Ty->getPointeeType(), Unit); } +// Creates a forward declaration for a RecordDecl in the given context. +llvm::DIType CGDebugInfo::createRecordFwdDecl(const RecordDecl *RD, + llvm::DIDescriptor Ctx) { + + llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); + unsigned Line = getLineNumber(RD->getLocation()); + const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD); + + if (CXXDecl) + return DBuilder.createClassType(Ctx, RD->getName(), DefUnit, + Line, 0, 0, 0, + llvm::DIType::FlagFwdDecl, + llvm::DIType(), llvm::DIArray()); + else if (RD->isStruct()) + return DBuilder.createStructType(Ctx, RD->getName(), DefUnit, + Line, 0, 0, llvm::DIType::FlagFwdDecl, + llvm::DIArray()); + else if (RD->isUnion()) + return DBuilder.createUnionType(Ctx, RD->getName(), DefUnit, + Line, 0, 0, llvm::DIType::FlagFwdDecl, + llvm::DIArray()); + else + llvm_unreachable("Unknown RecordDecl type!"); +} + // Walk up the context chain and create forward decls for record decls, // and normal descriptors for namespaces. llvm::DIDescriptor CGDebugInfo::createContextChain(const Decl *Context) { @@ -497,27 +522,9 @@ llvm::DIDescriptor CGDebugInfo::createContextChain(const Decl *Context) { if (const RecordDecl *RD = dyn_cast<RecordDecl>(Context)) { if (!RD->isDependentType()) { - llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); - unsigned Line = getLineNumber(RD->getLocation()); llvm::DIDescriptor FDContext = createContextChain(cast<Decl>(RD->getDeclContext())); - - const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD); - llvm::DIType Ty = llvm::DIType(); - - if (CXXDecl) - Ty = DBuilder.createClassType(FDContext, RD->getName(), DefUnit, - Line, 0, 0, 0, - llvm::DIType::FlagFwdDecl, - llvm::DIType(), llvm::DIArray()); - else if (RD->isStruct()) - Ty = DBuilder.createStructType(FDContext, RD->getName(), DefUnit, - Line, 0, 0, llvm::DIType::FlagFwdDecl, - llvm::DIArray()); - else if (RD->isUnion()) - Ty = DBuilder.createUnionType(FDContext, RD->getName(), DefUnit, - Line, 0, 0, llvm::DIType::FlagFwdDecl, - llvm::DIArray()); + llvm::DIType Ty = createRecordFwdDecl(RD, FDContext); RegionMap[Context] = llvm::WeakVH(Ty); return llvm::DIDescriptor(Ty); @@ -546,26 +553,9 @@ llvm::DIType CGDebugInfo::CreatePointeeType(QualType PointeeTy, if (const RecordType *RTy = dyn_cast<RecordType>(PointeeTy)) { RecordDecl *RD = RTy->getDecl(); - llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); - unsigned Line = getLineNumber(RD->getLocation()); llvm::DIDescriptor FDContext = getContextDescriptor(cast<Decl>(RD->getDeclContext())); - - CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD); - if (CXXDecl) - return DBuilder.createClassType(FDContext, RD->getName(), DefUnit, - Line, 0, 0, 0, llvm::DIType::FlagFwdDecl, - llvm::DIType(), llvm::DIArray()); - else if (RD->isStruct()) - return DBuilder.createStructType(FDContext, RD->getName(), DefUnit, - Line, 0, 0, llvm::DIType::FlagFwdDecl, - llvm::DIArray()); - else if (RD->isUnion()) - return DBuilder.createUnionType(FDContext, RD->getName(), DefUnit, - Line, 0, 0, llvm::DIType::FlagFwdDecl, - llvm::DIArray()); - else - llvm_unreachable("Unknown RecordDecl type!"); + return createRecordFwdDecl(RD, FDContext); } return getOrCreateType(PointeeTy, Unit); |