From 1d292e59d3334891c08ce8a5aee287c1160f121d Mon Sep 17 00:00:00 2001 From: Eric Christopher Date: Wed, 12 Sep 2012 00:27:32 +0000 Subject: Make clang emit a flag for DW_AT_object_pointer for the artificial args where it should (implicit first arguments). FileCheck-ize a test as well and update tests to take into account the object pointer flag. rdar://9797999 llvm-svn: 163668 --- clang/lib/CodeGen/CGDebugInfo.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'clang/lib') diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 2bb98076cf3..35c012fa3f3 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -891,12 +891,12 @@ CGDebugInfo::getOrCreateMethodType(const CXXMethodDecl *Method, // TODO: This and the artificial type below are misleading, the // types aren't artificial the argument is, but the current // metadata doesn't represent that. - ThisPtrType = DBuilder.createArtificialType(ThisPtrType); + ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType); Elts.push_back(ThisPtrType); } else { llvm::DIType ThisPtrType = getOrCreateType(ThisPtr, Unit); TypeCache[ThisPtr.getAsOpaquePtr()] = ThisPtrType; - ThisPtrType = DBuilder.createArtificialType(ThisPtrType); + ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType); Elts.push_back(ThisPtrType); } } @@ -1999,7 +1999,7 @@ llvm::DIType CGDebugInfo::getOrCreateFunctionType(const Decl *D, Elts.push_back(getOrCreateType(OMethod->getResultType(), F)); // "self" pointer is always first argument. llvm::DIType SelfTy = getOrCreateType(OMethod->getSelfDecl()->getType(), F); - Elts.push_back(DBuilder.createArtificialType(SelfTy)); + Elts.push_back(DBuilder.createObjectPointerType(SelfTy)); // "_cmd" pointer is always second argument. llvm::DIType CmdTy = getOrCreateType(OMethod->getCmdDecl()->getType(), F); Elts.push_back(DBuilder.createArtificialType(CmdTy)); @@ -2297,8 +2297,16 @@ void CGDebugInfo::EmitDeclare(const VarDecl *VD, unsigned Tag, unsigned Flags = 0; if (VD->isImplicit()) Flags |= llvm::DIDescriptor::FlagArtificial; + // If this is the first argument and it is implicit then + // give it an object pointer flag. + // FIXME: There has to be a better way to do this, but for static + // functions there won't be an implicit param at arg1 and + // otherwise it is 'self' or 'this'. + if (isa(VD) && ArgNo == 1) + Flags |= llvm::DIDescriptor::FlagObjectPointer; + llvm::MDNode *Scope = LexicalBlockStack.back(); - + StringRef Name = VD->getName(); if (!Name.empty()) { if (VD->hasAttr()) { -- cgit v1.2.3