diff options
Diffstat (limited to 'clang/lib/CodeGen/CGDebugInfo.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGDebugInfo.cpp | 57 |
1 files changed, 7 insertions, 50 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index f6ad8f2cc59..2dd1741d832 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -2173,30 +2173,6 @@ llvm::DIType CGDebugInfo::CreateMemberType(llvm::DIFile Unit, QualType FType, return Ty; } -llvm::DIDescriptor CGDebugInfo::getDeclarationOrDefinition(const Decl *D) { - // We only need a declaration (not a definition) of the type - so use whatever - // we would otherwise do to get a type for a pointee. (forward declarations in - // limited debug info, full definitions (if the type definition is available) - // in unlimited debug info) - if (const TypeDecl *TD = dyn_cast<TypeDecl>(D)) { - llvm::DIFile DefUnit = getOrCreateFile(TD->getLocation()); - return CreatePointeeType(CGM.getContext().getTypeDeclType(TD), DefUnit); - } - // Otherwise fall back to a fairly rudimentary cache of existing declarations. - // This doesn't handle providing declarations (for functions or variables) for - // entities without definitions in this TU, nor when the definition proceeds - // the call to this function. - // FIXME: This should be split out into more specific maps with support for - // emitting forward declarations and merging definitions with declarations, - // the same way as we do for types. - llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator I = - DeclCache.find(D->getCanonicalDecl()); - if (I == DeclCache.end()) - return llvm::DIDescriptor(); - llvm::Value *V = I->second; - return llvm::DIDescriptor(dyn_cast_or_null<llvm::MDNode>(V)); -} - /// getFunctionDeclaration - Return debug info descriptor to describe method /// declaration for the given method definition. llvm::DISubprogram CGDebugInfo::getFunctionDeclaration(const Decl *D) { @@ -2368,8 +2344,6 @@ void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, QualType FnType, getLineNumber(CurLoc), Flags, CGM.getLangOpts().Optimize, Fn, TParamsArray, SPDecl); - if (HasDecl) - DeclCache.insert(std::make_pair(D->getCanonicalDecl(), llvm::WeakVH(SP))); // Push function on region stack. llvm::MDNode *SPN = SP; @@ -2980,11 +2954,10 @@ void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, LinkageName = StringRef(); llvm::DIDescriptor DContext = getContextDescriptor(dyn_cast<Decl>(D->getDeclContext())); - llvm::DIGlobalVariable GV = DBuilder.createStaticVariable(DContext, DeclName, LinkageName, + DBuilder.createStaticVariable(DContext, DeclName, LinkageName, Unit, LineNo, getOrCreateType(T, Unit), Var->hasInternalLinkage(), Var, getStaticDataMemberDeclaration(D)); - DeclCache.insert(std::make_pair(D->getCanonicalDecl(), llvm::WeakVH(GV))); } /// EmitGlobalVariable - Emit information about an objective-c interface. @@ -3029,38 +3002,22 @@ void CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, // Do not use DIGlobalVariable for enums. if (Ty.getTag() == llvm::dwarf::DW_TAG_enumeration_type) return; - llvm::DIGlobalVariable GV = DBuilder.createStaticVariable(Unit, Name, Name, Unit, + DBuilder.createStaticVariable(Unit, Name, Name, Unit, getLineNumber(VD->getLocation()), Ty, true, Init, getStaticDataMemberDeclaration(VD)); - DeclCache.insert(std::make_pair(VD->getCanonicalDecl(), llvm::WeakVH(GV))); -} - -llvm::DIScope CGDebugInfo::getCurrentContextDescriptor(const Decl *D) { - if (!LexicalBlockStack.empty()) - return llvm::DIScope(LexicalBlockStack.back()); - return getContextDescriptor(D); } void CGDebugInfo::EmitUsingDirective(const UsingDirectiveDecl &UD) { + llvm::DIScope Scope = + LexicalBlockStack.empty() + ? getContextDescriptor(cast<Decl>(UD.getDeclContext())) + : llvm::DIScope(LexicalBlockStack.back()); DBuilder.createImportedModule( - getCurrentContextDescriptor(cast<Decl>(UD.getDeclContext())), - getOrCreateNameSpace(UD.getNominatedNamespace()), + Scope, getOrCreateNameSpace(UD.getNominatedNamespace()), getLineNumber(UD.getLocation())); } -void CGDebugInfo::EmitUsingDecl(const UsingDecl &UD) { - assert(UD.shadow_size() && - "We shouldn't be codegening an invalid UsingDecl containing no decls"); - // Emitting one decl is sufficient - debuggers can detect that this is an - // overloaded name & provide lookup for all the overloads. - const UsingShadowDecl &USD = **UD.shadow_begin(); - if (llvm::DIDescriptor Target = getDeclarationOrDefinition(USD.getUnderlyingDecl())) - DBuilder.createImportedDeclaration( - getCurrentContextDescriptor(cast<Decl>(USD.getDeclContext())), Target, - getLineNumber(USD.getLocation())); -} - /// getOrCreateNamesSpace - Return namespace descriptor for the given /// namespace decl. llvm::DINameSpace |