diff options
author | Devang Patel <dpatel@apple.com> | 2010-10-11 21:58:41 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2010-10-11 21:58:41 +0000 |
commit | 33ddf69fb3bbf08b7dddaf96d3b71bd92b1ee416 (patch) | |
tree | a7f2587636d8a5fcd02ca7fbc881720bdf3fc3fe /clang/lib/CodeGen/CGDebugInfo.cpp | |
parent | ded95b79f297e1fdbb0803c8e8c45c1799784d34 (diff) | |
download | bcm5719-llvm-33ddf69fb3bbf08b7dddaf96d3b71bd92b1ee416.tar.gz bcm5719-llvm-33ddf69fb3bbf08b7dddaf96d3b71bd92b1ee416.zip |
Fix debug info for functions whose context is a namespace.
This is tested by namespace.exp in gdb testsuite.
llvm-svn: 116248
Diffstat (limited to 'clang/lib/CodeGen/CGDebugInfo.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGDebugInfo.cpp | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 8764babd631..f3a3420c5a0 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -1529,6 +1529,8 @@ void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, QualType FnType, const Decl *D = GD.getDecl(); unsigned Flags = 0; + llvm::DIFile Unit = getOrCreateFile(CurLoc); + llvm::DIDescriptor FDContext(Unit); if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { // If there is a DISubprogram for this function available then use it. llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator @@ -1547,6 +1549,9 @@ void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, QualType FnType, LinkageName = CGM.getMangledName(GD); if (FD->hasPrototype()) Flags |= llvm::DIDescriptor::FlagPrototyped; + if (const NamespaceDecl *NSDecl = + dyn_cast_or_null<NamespaceDecl>(FD->getDeclContext())) + FDContext = getOrCreateNameSpace(NSDecl, Unit); } else if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D)) { Name = getObjCMethodName(OMD); LinkageName = Name; @@ -1563,12 +1568,11 @@ void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, QualType FnType, // It is expected that CurLoc is set before using EmitFunctionStart. // Usually, CurLoc points to the left bracket location of compound // statement representing function body. - llvm::DIFile Unit = getOrCreateFile(CurLoc); unsigned LineNo = getLineNumber(CurLoc); if (D->isImplicit()) Flags |= llvm::DIDescriptor::FlagArtificial; llvm::DISubprogram SP = - DebugFactory.CreateSubprogram(Unit, Name, Name, LinkageName, Unit, LineNo, + DebugFactory.CreateSubprogram(FDContext, Name, Name, LinkageName, Unit, LineNo, getOrCreateType(FnType, Unit), Fn->hasInternalLinkage(), true/*definition*/, 0, 0, llvm::DIType(), |