diff options
author | Devang Patel <dpatel@apple.com> | 2009-10-06 00:35:31 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2009-10-06 00:35:31 +0000 |
commit | 979ec2e5ee9e1a648e13c35510bb1cd437f90d24 (patch) | |
tree | 61a01e92363020348a5a1be6d45eb7f0d5cd6895 /lib/CodeGen/CGDebugInfo.cpp | |
parent | 56fc0d18caf9c829647a5e3ce35197f0d7e0feee (diff) |
Set appropriate context for a global variable while emitting debug info.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83352 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGDebugInfo.cpp')
-rw-r--r-- | lib/CodeGen/CGDebugInfo.cpp | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 7d0c1ad8a5..be742d9b80 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -49,6 +49,22 @@ void CGDebugInfo::setLocation(SourceLocation Loc) { CurLoc = M->getContext().getSourceManager().getInstantiationLoc(Loc); } +/// getContext - Get context info for the decl. +llvm::DIDescriptor CGDebugInfo::getContext(const VarDecl *Decl, + llvm::DIDescriptor &CompileUnit) { + if (Decl->isFileVarDecl()) + return CompileUnit; + if (Decl->getDeclContext()->isFunctionOrMethod()) { + // Find the last subprogram in region stack. + for (unsigned RI = RegionStack.size(), RE = 0; RI != RE; --RI) { + llvm::DIDescriptor R = RegionStack[RI - 1]; + if (R.isSubprogram()) + return R; + } + } + return CompileUnit; +} + /// getOrCreateCompileUnit - Get the compile unit from the cache or create a new /// one if necessary. This returns null for invalid source locations. llvm::DICompileUnit CGDebugInfo::getOrCreateCompileUnit(SourceLocation Loc) { @@ -1327,7 +1343,8 @@ void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, ArrayType::Normal, 0); } - DebugFactory.CreateGlobalVariable(Unit, Name, Name, "", Unit, LineNo, + DebugFactory.CreateGlobalVariable(getContext(Decl, Unit), + Name, Name, "", Unit, LineNo, getOrCreateType(T, Unit), Var->hasInternalLinkage(), true/*definition*/, Var); |