CGDebugInfo.cpp revision 18760453868e9b831b8575ae64119b07ab4dcdf5
17f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===--- CGDebugInfo.cpp - Emit Debug Information for a Module ------------===// 27f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 37f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// The LLVM Compiler Infrastructure 47f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 57f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// This file is distributed under the University of Illinois Open Source 67f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// License. See LICENSE.TXT for details. 77f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 87f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 97f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// This coordinates the debug information generation while generating code. 117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CGDebugInfo.h" 157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CGBlocks.h" 169dfd24324c079b564dda936c6ae46898b82121e2David Blaikie#include "CGCXXABI.h" 177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CGObjCRuntime.h" 187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CodeGenFunction.h" 197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CodeGenModule.h" 207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/ASTContext.h" 217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/DeclFriend.h" 227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/DeclObjC.h" 237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/DeclTemplate.h" 247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/Expr.h" 257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/RecordLayout.h" 267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/FileManager.h" 277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/SourceManager.h" 287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/Version.h" 297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Frontend/CodeGenOptions.h" 307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/ADT/SmallVector.h" 317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/ADT/StringExtras.h" 323b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/Constants.h" 333b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/DataLayout.h" 343b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/DerivedTypes.h" 353b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/Instructions.h" 363b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/Intrinsics.h" 373b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/Module.h" 387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/Dwarf.h" 397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/FileSystem.h" 407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang; 417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang::CodeGen; 427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::CGDebugInfo(CodeGenModule &CGM) 44688cf5b05713055d27bf53460f7c20a776440767Eric Christopher : CGM(CGM), DebugKind(CGM.getCodeGenOpts().getDebugInfo()), 45688cf5b05713055d27bf53460f7c20a776440767Eric Christopher DBuilder(CGM.getModule()) { 467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CreateCompileUnit(); 477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::~CGDebugInfo() { 507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(LexicalBlockStack.empty() && 517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Region stack mismatch, stack not empty!"); 527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl 55ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian PrantlNoLocation::NoLocation(CodeGenFunction &CGF, CGBuilderTy &B) 56ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl : DI(CGF.getDebugInfo()), Builder(B) { 57ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl if (DI) { 58ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl SavedLoc = DI->getLocation(); 59ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl DI->CurLoc = SourceLocation(); 60ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl Builder.SetCurrentDebugLocation(llvm::DebugLoc()); 61ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl } 62ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl} 63ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl 64ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian PrantlNoLocation::~NoLocation() { 65ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl if (DI) { 66ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl assert(Builder.getCurrentDebugLocation().isUnknown()); 67ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl DI->CurLoc = SavedLoc; 68ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl } 69ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl} 70ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl 71b061ce2c7af5bb19294e16dbaf19a6b37ed2f716Adrian PrantlArtificialLocation::ArtificialLocation(CodeGenFunction &CGF, CGBuilderTy &B) 72ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl : DI(CGF.getDebugInfo()), Builder(B) { 73ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl if (DI) { 74ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl SavedLoc = DI->getLocation(); 75b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl DI->CurLoc = SourceLocation(); 76b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl Builder.SetCurrentDebugLocation(llvm::DebugLoc()); 77b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl } 78b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl} 79b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl 80b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantlvoid ArtificialLocation::Emit() { 81b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl if (DI) { 82ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl // Sync the Builder. 83ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl DI->EmitLocation(Builder, SavedLoc); 84ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl DI->CurLoc = SourceLocation(); 85ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl // Construct a location that has a valid scope, but no line info. 86b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl assert(!DI->LexicalBlockStack.empty()); 87b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl llvm::DIDescriptor Scope(DI->LexicalBlockStack.back()); 88ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl Builder.SetCurrentDebugLocation(llvm::DebugLoc::get(0, 0, Scope)); 89ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl } 90ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl} 91ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl 92b061ce2c7af5bb19294e16dbaf19a6b37ed2f716Adrian PrantlArtificialLocation::~ArtificialLocation() { 93ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl if (DI) { 94ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl assert(Builder.getCurrentDebugLocation().getLine() == 0); 95ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl DI->CurLoc = SavedLoc; 96ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl } 97ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl} 98ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl 997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::setLocation(SourceLocation Loc) { 1007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the new location isn't valid return. 1015f4554f8c8f07c90048705f165fe1ed44413eaa2Adrian Prantl if (Loc.isInvalid()) return; 1027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurLoc = CGM.getContext().getSourceManager().getExpansionLoc(Loc); 1047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we've changed files in the middle of a lexical scope go ahead 1067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // and create a new lexical scope with file node if it's different 1077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // from the one in the scope. 1087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LexicalBlockStack.empty()) return; 1097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 1117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PCLoc = SM.getPresumedLoc(CurLoc); 1127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PPLoc = SM.getPresumedLoc(PrevLoc); 1137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PCLoc.isInvalid() || PPLoc.isInvalid() || 1157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei !strcmp(PPLoc.getFilename(), PCLoc.getFilename())) 1167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 1177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *LB = LexicalBlockStack.back(); 1197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIScope Scope = llvm::DIScope(LB); 1207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Scope.isLexicalBlockFile()) { 1217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DILexicalBlockFile LBF = llvm::DILexicalBlockFile(LB); 1227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor D 1237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = DBuilder.createLexicalBlockFile(LBF.getScope(), 1247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateFile(CurLoc)); 1257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *N = D; 1267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 1277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(N); 128a6504853d297c30cfa271f4710af5a3d5db59449David Blaikie } else if (Scope.isLexicalBlock() || Scope.isSubprogram()) { 1297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor D 1307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = DBuilder.createLexicalBlockFile(Scope, getOrCreateFile(CurLoc)); 1317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *N = D; 1327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 1337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(N); 1347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getContextDescriptor - Get context info for the decl. 138bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikiellvm::DIScope CGDebugInfo::getContextDescriptor(const Decl *Context) { 1397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Context) 1407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TheCU; 1417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator 1437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I = RegionMap.find(Context); 1447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (I != RegionMap.end()) { 1457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = I->second; 146bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie return llvm::DIScope(dyn_cast_or_null<llvm::MDNode>(V)); 1477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check namespace. 1507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const NamespaceDecl *NSDecl = dyn_cast<NamespaceDecl>(Context)) 151bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie return getOrCreateNameSpace(NSDecl); 1527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 153bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie if (const RecordDecl *RDecl = dyn_cast<RecordDecl>(Context)) 154bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie if (!RDecl->isDependentType()) 155bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie return getOrCreateType(CGM.getContext().getTypeDeclType(RDecl), 1567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateMainFile()); 1577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TheCU; 1587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getFunctionName - Get function name for the given FunctionDecl. If the 1617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// name is constructred on demand (e.g. C++ destructor) then the name 1627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// is stored on the side. 1637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getFunctionName(const FunctionDecl *FD) { 1647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert (FD && "Invalid FunctionDecl!"); 1657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *FII = FD->getIdentifier(); 1667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionTemplateSpecializationInfo *Info 1677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = FD->getTemplateSpecializationInfo(); 1687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Info && FII) 1697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return FII->getName(); 1707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise construct human readable name for debug info. 1725eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer SmallString<128> NS; 1735eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer llvm::raw_svector_ostream OS(NS); 1745eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer FD->printName(OS); 1757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add any template specialization args. 1777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Info) { 1787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgumentList *TArgs = Info->TemplateArguments; 1797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgument *Args = TArgs->data(); 1807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumArgs = TArgs->size(); 1817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PrintingPolicy Policy(CGM.getLangOpts()); 1825eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer TemplateSpecializationType::PrintTemplateArgumentList(OS, Args, NumArgs, 1835eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer Policy); 1847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Copy this name on the side and use its reference. 1875eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer OS.flush(); 1885eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer char *StrPtr = DebugInfoNames.Allocate<char>(NS.size()); 1895eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer memcpy(StrPtr, NS.data(), NS.size()); 1905eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer return StringRef(StrPtr, NS.size()); 1917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getObjCMethodName(const ObjCMethodDecl *OMD) { 1947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<256> MethodName; 1957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::raw_svector_ostream OS(MethodName); 1967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << (OMD->isInstanceMethod() ? '-' : '+') << '['; 1977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const DeclContext *DC = OMD->getDeclContext(); 1986537f083555f9606c495d05c562878aa49bae987Eric Christopher if (const ObjCImplementationDecl *OID = 1997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<const ObjCImplementationDecl>(DC)) { 2007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << OID->getName(); 2016537f083555f9606c495d05c562878aa49bae987Eric Christopher } else if (const ObjCInterfaceDecl *OID = 2027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<const ObjCInterfaceDecl>(DC)) { 2037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << OID->getName(); 2046537f083555f9606c495d05c562878aa49bae987Eric Christopher } else if (const ObjCCategoryImplDecl *OCD = 2057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<const ObjCCategoryImplDecl>(DC)){ 2067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << ((const NamedDecl *)OCD)->getIdentifier()->getNameStart() << '(' << 2077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OCD->getIdentifier()->getNameStart() << ')'; 208b509224b28bf7ddb2e4ff1d52855df5b56b44bf4Adrian Prantl } else if (isa<ObjCProtocolDecl>(DC)) { 209687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl // We can extract the type of the class from the self pointer. 210687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl if (ImplicitParamDecl* SelfDecl = OMD->getSelfDecl()) { 211687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl QualType ClassTy = 212687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl cast<ObjCObjectPointerType>(SelfDecl->getType())->getPointeeType(); 213687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl ClassTy.print(OS, PrintingPolicy(LangOptions())); 214687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl } 2157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << ' ' << OMD->getSelector().getAsString() << ']'; 2177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei char *StrPtr = DebugInfoNames.Allocate<char>(OS.tell()); 2197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(StrPtr, MethodName.begin(), OS.tell()); 2207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return StringRef(StrPtr, OS.tell()); 2217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getSelectorName - Return selector name. This is used for debugging 2247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// info. 2257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getSelectorName(Selector S) { 2267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const std::string &SName = S.getAsString(); 2277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei char *StrPtr = DebugInfoNames.Allocate<char>(SName.size()); 2287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(StrPtr, SName.data(), SName.size()); 2297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return StringRef(StrPtr, SName.size()); 2307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getClassName - Get class name including template argument list. 2336537f083555f9606c495d05c562878aa49bae987Eric ChristopherStringRef 2347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::getClassName(const RecordDecl *RD) { 2357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ClassTemplateSpecializationDecl *Spec 2367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast<ClassTemplateSpecializationDecl>(RD); 2377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Spec) 2387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return RD->getName(); 2397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgument *Args; 2417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumArgs; 2427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TypeSourceInfo *TAW = Spec->getTypeAsWritten()) { 2437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateSpecializationType *TST = 2447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<TemplateSpecializationType>(TAW->getType()); 2457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Args = TST->getArgs(); 2467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumArgs = TST->getNumArgs(); 2477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 2487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs(); 2497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Args = TemplateArgs.data(); 2507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumArgs = TemplateArgs.size(); 2517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = RD->getIdentifier()->getName(); 2537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PrintingPolicy Policy(CGM.getLangOpts()); 2545eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer SmallString<128> TemplateArgList; 2555eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer { 2565eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer llvm::raw_svector_ostream OS(TemplateArgList); 2575eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer TemplateSpecializationType::PrintTemplateArgumentList(OS, Args, NumArgs, 2585eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer Policy); 2595eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer } 2607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Copy this name on the side and use its reference. 2627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei size_t Length = Name.size() + TemplateArgList.size(); 2637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei char *StrPtr = DebugInfoNames.Allocate<char>(Length); 2647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(StrPtr, Name.data(), Name.size()); 2657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(StrPtr + Name.size(), TemplateArgList.data(), TemplateArgList.size()); 2667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return StringRef(StrPtr, Length); 2677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateFile - Get the file debug info descriptor for the input location. 2707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIFile CGDebugInfo::getOrCreateFile(SourceLocation Loc) { 2717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Loc.isValid()) 2727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If Location is not valid then use main input file. 2737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createFile(TheCU.getFilename(), TheCU.getDirectory()); 2747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 2767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PLoc = SM.getPresumedLoc(Loc); 2777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PLoc.isInvalid() || StringRef(PLoc.getFilename()).empty()) 2797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the location is not valid then use main input file. 2807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createFile(TheCU.getFilename(), TheCU.getDirectory()); 2817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Cache the results. 2837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const char *fname = PLoc.getFilename(); 2847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const char *, llvm::WeakVH>::iterator it = 2857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DIFileCache.find(fname); 2867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (it != DIFileCache.end()) { 2887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Verify that the information still exists. 2897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::Value *V = it->second) 2907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIFile(cast<llvm::MDNode>(V)); 2917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile F = DBuilder.createFile(PLoc.getFilename(), getCurrentDirname()); 2947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DIFileCache[fname] = F; 2967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return F; 2977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateMainFile - Get the file info for main compile unit. 3007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIFile CGDebugInfo::getOrCreateMainFile() { 3017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createFile(TheCU.getFilename(), TheCU.getDirectory()); 3027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getLineNumber - Get line number for the location. If location is invalid 3057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// then use current location. 3067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned CGDebugInfo::getLineNumber(SourceLocation Loc) { 3077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Loc.isInvalid() && CurLoc.isInvalid()) 3087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 3097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 3107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc); 3117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return PLoc.isValid()? PLoc.getLine() : 0; 3127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getColumnNumber - Get column number for the location. 31500df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantlunsigned CGDebugInfo::getColumnNumber(SourceLocation Loc, bool Force) { 3167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We may not want column information at all. 31700df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl if (!Force && !CGM.getCodeGenOpts().DebugColumnInfo) 3187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 3197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the location is invalid then use the current column. 3217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Loc.isInvalid() && CurLoc.isInvalid()) 3227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 3237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 3247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc); 3257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return PLoc.isValid()? PLoc.getColumn() : 0; 3267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getCurrentDirname() { 3297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CGM.getCodeGenOpts().DebugCompilationDir.empty()) 3307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CGM.getCodeGenOpts().DebugCompilationDir; 3317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CWDName.empty()) 3337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CWDName; 3347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<256> CWD; 3357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::sys::fs::current_path(CWD); 3367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei char *CompDirnamePtr = DebugInfoNames.Allocate<char>(CWD.size()); 3377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(CompDirnamePtr, CWD.data(), CWD.size()); 3387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CWDName = StringRef(CompDirnamePtr, CWD.size()); 3397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateCompileUnit - Create new compile unit. 3427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::CreateCompileUnit() { 3437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get absolute path name. 3457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 3467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string MainFileName = CGM.getCodeGenOpts().MainFileName; 3477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MainFileName.empty()) 3487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MainFileName = "<unknown>"; 3497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The main file name provided via the "-main-file-name" option contains just 3517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the file name itself with no path information. This file name may have had 3527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // a relative path, so we look into the actual file entry for the main 3537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // file to determine the real absolute path for the file. 3547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string MainFileDir; 3557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID())) { 3567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MainFileDir = MainFile->getDir()->getName(); 3577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MainFileDir != ".") 3587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MainFileName = MainFileDir + "/" + MainFileName; 3597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Save filename string. 3627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei char *FilenamePtr = DebugInfoNames.Allocate<char>(MainFileName.length()); 3637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(FilenamePtr, MainFileName.c_str(), MainFileName.length()); 3647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Filename(FilenamePtr, MainFileName.length()); 365ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher 366ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher // Save split dwarf file string. 367ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher std::string SplitDwarfFile = CGM.getCodeGenOpts().SplitDwarfFile; 368ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher char *SplitDwarfPtr = DebugInfoNames.Allocate<char>(SplitDwarfFile.length()); 369ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher memcpy(SplitDwarfPtr, SplitDwarfFile.c_str(), SplitDwarfFile.length()); 370ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher StringRef SplitDwarfFilename(SplitDwarfPtr, SplitDwarfFile.length()); 3716537f083555f9606c495d05c562878aa49bae987Eric Christopher 3727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LangTag; 3737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const LangOptions &LO = CGM.getLangOpts(); 3747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LO.CPlusPlus) { 3757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LO.ObjC1) 3767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_ObjC_plus_plus; 3777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 3787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_C_plus_plus; 3797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (LO.ObjC1) { 3807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_ObjC; 3817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (LO.C99) { 3827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_C99; 3837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 3847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_C89; 3857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Producer = getClangFullVersion(); 3887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Figure out which version of the ObjC runtime we have. 3907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RuntimeVers = 0; 3917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LO.ObjC1) 3927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RuntimeVers = LO.ObjCRuntime.isNonFragile() ? 2 : 1; 3937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create new compile unit. 3957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME - Eliminate TheCU. 3968fed3f487962b284aecbed65662fec6bbe31b016Eric Christopher TheCU = DBuilder.createCompileUnit(LangTag, Filename, getCurrentDirname(), 3978fed3f487962b284aecbed65662fec6bbe31b016Eric Christopher Producer, LO.Optimize, 3988fed3f487962b284aecbed65662fec6bbe31b016Eric Christopher CGM.getCodeGenOpts().DwarfDebugFlags, 3998fed3f487962b284aecbed65662fec6bbe31b016Eric Christopher RuntimeVers, SplitDwarfFilename); 4007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 4017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateType - Get the Basic type from the cache or create a new 4037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// one if necessary. 4047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const BuiltinType *BT) { 4057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Encoding = 0; 4067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef BTName; 4077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (BT->getKind()) { 4087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define BUILTIN_TYPE(Id, SingletonId) 4097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define PLACEHOLDER_TYPE(Id, SingletonId) \ 4107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Id: 4117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/BuiltinTypes.def" 4127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Dependent: 4137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Unexpected builtin type"); 4147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::NullPtr: 41524118f5d62f68b18a75db4eb570a0aaf7f4dda97Peter Collingbourne return DBuilder.createNullPtrType(); 4167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Void: 4177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 4187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ObjCClass: 419b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (ClassTy) 4207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ClassTy; 4217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ClassTy = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 4227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "objc_class", TheCU, 4237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateMainFile(), 0); 4247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ClassTy; 4257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ObjCId: { 4267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // typedef struct objc_class *Class; 4277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // typedef struct objc_object { 4287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Class isa; 4297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // } *id; 4307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 431b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (ObjTy) 4327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ObjTy; 4337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 434b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (!ClassTy) 4357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ClassTy = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 4367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "objc_class", TheCU, 4377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateMainFile(), 0); 4387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 4406537f083555f9606c495d05c562878aa49bae987Eric Christopher 4417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType ISATy = DBuilder.createPointerType(ClassTy, Size); 4427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 443f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher ObjTy = 444c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie DBuilder.createStructType(TheCU, "objc_object", getOrCreateMainFile(), 445c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie 0, 0, 0, 0, llvm::DIType(), llvm::DIArray()); 4467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 447f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher ObjTy.setTypeArray(DBuilder.getOrCreateArray(&*DBuilder.createMemberType( 448f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher ObjTy, "isa", getOrCreateMainFile(), 0, Size, 0, 0, 0, ISATy))); 4497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ObjTy; 4507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ObjCSel: { 452b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (SelTy) 4537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SelTy; 4547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SelTy = 4557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 4567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "objc_selector", TheCU, getOrCreateMainFile(), 4577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 0); 4587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SelTy; 4597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 460b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei 461b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage1d: 462b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return getOrCreateStructPtrType("opencl_image1d_t", 463b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage1dDITy); 464b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage1dArray: 4656537f083555f9606c495d05c562878aa49bae987Eric Christopher return getOrCreateStructPtrType("opencl_image1d_array_t", 466b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage1dArrayDITy); 467b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage1dBuffer: 468b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return getOrCreateStructPtrType("opencl_image1d_buffer_t", 469b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage1dBufferDITy); 470b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage2d: 471b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return getOrCreateStructPtrType("opencl_image2d_t", 472b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage2dDITy); 473b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage2dArray: 474b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return getOrCreateStructPtrType("opencl_image2d_array_t", 475b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage2dArrayDITy); 476b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage3d: 477b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return getOrCreateStructPtrType("opencl_image3d_t", 478b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage3dDITy); 47921f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei case BuiltinType::OCLSampler: 48021f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei return DBuilder.createBasicType("opencl_sampler_t", 48121f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei CGM.getContext().getTypeSize(BT), 48221f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei CGM.getContext().getTypeAlign(BT), 48321f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei llvm::dwarf::DW_ATE_unsigned); 484e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case BuiltinType::OCLEvent: 485e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei return getOrCreateStructPtrType("opencl_event_t", 486e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei OCLEventDITy); 487b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei 4887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UChar: 4897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char_U: Encoding = llvm::dwarf::DW_ATE_unsigned_char; break; 4907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char_S: 4917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::SChar: Encoding = llvm::dwarf::DW_ATE_signed_char; break; 4927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char16: 4937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char32: Encoding = llvm::dwarf::DW_ATE_UTF; break; 4947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UShort: 4957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UInt: 4967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UInt128: 4977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULong: 4987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::WChar_U: 4997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULongLong: Encoding = llvm::dwarf::DW_ATE_unsigned; break; 5007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Short: 5017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Int: 5027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Int128: 5037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Long: 5047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::WChar_S: 5057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::LongLong: Encoding = llvm::dwarf::DW_ATE_signed; break; 5067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Bool: Encoding = llvm::dwarf::DW_ATE_boolean; break; 5077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Half: 5087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Float: 5097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::LongDouble: 5107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Double: Encoding = llvm::dwarf::DW_ATE_float; break; 5117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (BT->getKind()) { 5147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Long: BTName = "long int"; break; 5157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::LongLong: BTName = "long long int"; break; 5167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULong: BTName = "long unsigned int"; break; 5177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULongLong: BTName = "long long unsigned int"; break; 5187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 5197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BTName = BT->getName(CGM.getLangOpts()); 5207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 5217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 5237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(BT); 5247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(BT); 5256537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIType DbgTy = 5267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createBasicType(BTName, Size, Align, Encoding); 5277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 5287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ComplexType *Ty) { 5317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 5327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Encoding = llvm::dwarf::DW_ATE_complex_float; 5337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty->isComplexIntegerType()) 5347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Encoding = llvm::dwarf::DW_ATE_lo_user; 5357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 5377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 5386537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIType DbgTy = 5397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createBasicType("complex", Size, Align, Encoding); 5407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 5427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateCVRType - Get the qualified type from the cache or create 5457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a new one if necessary. 546472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikiellvm::DIType CGDebugInfo::CreateQualifiedType(QualType Ty, llvm::DIFile Unit) { 5477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualifierCollector Qc; 5487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Type *T = Qc.strip(Ty); 5497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore these qualifiers for now. 5517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeObjCGCAttr(); 5527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeAddressSpace(); 5537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeObjCLifetime(); 5547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We will create one Derived type for one qualifier and recurse to handle any 5567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // additional ones. 5577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Tag; 5587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Qc.hasConst()) { 5597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_const_type; 5607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeConst(); 5617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Qc.hasVolatile()) { 5627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_volatile_type; 5637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeVolatile(); 5647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Qc.hasRestrict()) { 5657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_restrict_type; 5667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeRestrict(); 5677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 5687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Qc.empty() && "Unknown type qualifier for debug info"); 5697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(QualType(T, 0), Unit); 5707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 572472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie llvm::DIType FromTy = getOrCreateType(Qc.apply(CGM.getContext(), T), Unit); 5737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // No need to fill in the Name, Line, Size, Alignment, Offset in case of 5757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // CVR derived types. 5767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType DbgTy = DBuilder.createQualifiedType(Tag, FromTy); 5776537f083555f9606c495d05c562878aa49bae987Eric Christopher 5787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 5797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ObjCObjectPointerType *Ty, 5827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 58305f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian 58405f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian // The frontend treats 'id' as a typedef to an ObjCObjectType, 58505f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian // whereas 'id<protocol>' is treated as an ObjCPointerType. For the 58605f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian // debug info, we want to emit 'id' in both cases. 58705f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian if (Ty->isObjCQualifiedIdType()) 58805f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian return getOrCreateType(CGM.getContext().getObjCIdType(), Unit); 58905f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian 5907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType DbgTy = 5916537f083555f9606c495d05c562878aa49bae987Eric Christopher CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty, 5927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty->getPointeeType(), Unit); 5937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 5947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const PointerType *Ty, 5977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 5986537f083555f9606c495d05c562878aa49bae987Eric Christopher return CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty, 5997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty->getPointeeType(), Unit); 6007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Creates a forward declaration for a RecordDecl in the given context. 603eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikiellvm::DICompositeType 604f332733e141905ccefe43e7fe65f9a8a4263a2f6Manman RenCGDebugInfo::getOrCreateRecordFwdDecl(const RecordType *Ty, 605eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie llvm::DIDescriptor Ctx) { 606f332733e141905ccefe43e7fe65f9a8a4263a2f6Manman Ren const RecordDecl *RD = Ty->getDecl(); 607c5cd1a712eb98852ae73f027414d06be85dafff6David Blaikie if (llvm::DIType T = getTypeOrNull(CGM.getContext().getRecordType(RD))) 608eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie return llvm::DICompositeType(T); 6097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); 6107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(RD->getLocation()); 6117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef RDName = getClassName(RD); 6127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Tag = 0; 6147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RD->isStruct() || RD->isInterface()) 6157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_structure_type; 6167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (RD->isUnion()) 6177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_union_type; 6187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 6197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(RD->isClass()); 6207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_class_type; 6217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the type. 62418760453868e9b831b8575ae64119b07ab4dcdf5Manman Ren return DBuilder.createForwardDecl(Tag, RDName, Ctx, DefUnit, Line); 6257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Walk up the context chain and create forward decls for record decls, 6287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// and normal descriptors for namespaces. 6297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIDescriptor CGDebugInfo::createContextChain(const Decl *Context) { 6307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Context) 6317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TheCU; 6327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // See if we already have the parent. 6347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator 6357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I = RegionMap.find(Context); 6367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (I != RegionMap.end()) { 6377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = I->second; 6387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIDescriptor(dyn_cast_or_null<llvm::MDNode>(V)); 6397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6406537f083555f9606c495d05c562878aa49bae987Eric Christopher 6417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check namespace. 6427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const NamespaceDecl *NSDecl = dyn_cast<NamespaceDecl>(Context)) 6437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIDescriptor(getOrCreateNameSpace(NSDecl)); 6447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 645eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie if (const RecordDecl *RD = dyn_cast<RecordDecl>(Context)) 646eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie if (!RD->isDependentType()) 647eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie return getOrCreateLimitedType( 6485434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie CGM.getContext().getRecordType(RD)->castAs<RecordType>(), 649eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie getOrCreateMainFile()); 6507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TheCU; 6517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreatePointerLikeType(unsigned Tag, 6546537f083555f9606c495d05c562878aa49bae987Eric Christopher const Type *Ty, 6557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType PointeeTy, 6567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 6577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Tag == llvm::dwarf::DW_TAG_reference_type || 6587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag == llvm::dwarf::DW_TAG_rvalue_reference_type) 659472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie return DBuilder.createReferenceType(Tag, getOrCreateType(PointeeTy, Unit)); 66005f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian 6617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 6627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Size is always the size of a pointer. We can't use getTypeSize here 6637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // because that does not return the correct value for references. 6647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned AS = CGM.getContext().getTargetAddressSpace(PointeeTy); 66564aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall uint64_t Size = CGM.getTarget().getPointerWidth(AS); 6667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 6677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 668472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie return DBuilder.createPointerType(getOrCreateType(PointeeTy, Unit), Size, 669472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie Align); 6707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 672f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopherllvm::DIType CGDebugInfo::getOrCreateStructPtrType(StringRef Name, 673f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher llvm::DIType &Cache) { 674b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (Cache) 675b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return Cache; 6761e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie Cache = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, Name, 6771e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie TheCU, getOrCreateMainFile(), 0); 6781e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 6791e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie Cache = DBuilder.createPointerType(Cache, Size); 6801e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie return Cache; 681b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei} 682b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei 6837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const BlockPointerType *Ty, 6847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 685b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (BlockLiteralGeneric) 6867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return BlockLiteralGeneric; 6877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 8> EltTys; 6897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy; 6907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FType; 6917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize, FieldOffset; 6927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign; 6937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray Elements; 6947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType EltTy, DescTy; 6957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 6977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().UnsignedLongTy; 6987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "reserved", &FieldOffset)); 6997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "Size", &FieldOffset)); 7007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elements = DBuilder.getOrCreateArray(EltTys); 7027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.clear(); 7037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = llvm::DIDescriptor::FlagAppleBlock; 7057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(CurLoc); 7067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTy = DBuilder.createStructType(Unit, "__block_descriptor", 7087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unit, LineNo, FieldOffset, 0, 709c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie Flags, llvm::DIType(), Elements); 7107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 7127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 7137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DescTy = DBuilder.createPointerType(EltTy, Size); 7157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 7177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 7187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset)); 7197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().IntTy; 7207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset)); 7217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__reserved", &FieldOffset)); 7227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 7237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__FuncPtr", &FieldOffset)); 7247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 7267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldTy = DescTy; 7277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize = CGM.getContext().getTypeSize(Ty); 7287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldAlign = CGM.getContext().getTypeAlign(Ty); 7297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldTy = DBuilder.createMemberType(Unit, "__descriptor", Unit, 7307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LineNo, FieldSize, FieldAlign, 7317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset, 0, FieldTy); 7327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(FieldTy); 7337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset += FieldSize; 7357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elements = DBuilder.getOrCreateArray(EltTys); 7367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTy = DBuilder.createStructType(Unit, "__block_literal_generic", 7387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unit, LineNo, FieldOffset, 0, 739c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie Flags, llvm::DIType(), Elements); 7407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BlockLiteralGeneric = DBuilder.createPointerType(EltTy, Size); 7427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return BlockLiteralGeneric; 7437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 745472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikiellvm::DIType CGDebugInfo::CreateType(const TypedefType *Ty, llvm::DIFile Unit) { 7467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Typedefs are derived from some other type. If we have a typedef of a 7477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // typedef, make sure to emit the whole chain. 748472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie llvm::DIType Src = getOrCreateType(Ty->getDecl()->getUnderlyingType(), Unit); 749b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (!Src) 7507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 7517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We don't set size information, but do specify where the typedef was 7527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // declared. 7537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(Ty->getDecl()->getLocation()); 7547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TypedefNameDecl *TyDecl = Ty->getDecl(); 7556537f083555f9606c495d05c562878aa49bae987Eric Christopher 7567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor TypedefContext = 7577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(cast<Decl>(Ty->getDecl()->getDeclContext())); 7586537f083555f9606c495d05c562878aa49bae987Eric Christopher 7597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 7607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createTypedef(Src, TyDecl->getName(), Unit, Line, TypedefContext); 7617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const FunctionType *Ty, 7647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 7657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> EltTys; 7667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add the result type at least. 768472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie EltTys.push_back(getOrCreateType(Ty->getResultType(), Unit)); 7697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Set up remainder of arguments if there is a prototype. 7717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: IF NOT, HOW IS THIS REPRESENTED? llvm-gcc doesn't represent '...'! 7727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<FunctionNoProtoType>(Ty)) 7737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(DBuilder.createUnspecifiedParameter()); 7747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(Ty)) { 7757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0, e = FPT->getNumArgs(); i != e; ++i) 776472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie EltTys.push_back(getOrCreateType(FPT->getArgType(i), Unit)); 7777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(EltTys); 7807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createSubroutineType(Unit, EltTypeArray); 7817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::createFieldType(StringRef name, 7857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType type, 7867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t sizeInBitsOverride, 7877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation loc, 7887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei AccessSpecifier AS, 7897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t offsetInBits, 7907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile tunit, 7917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor scope) { 7927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType debugType = getOrCreateType(type, tunit); 7937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the location for the field. 7957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile file = getOrCreateFile(loc); 7967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned line = getLineNumber(loc); 7977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t sizeInBits = 0; 7997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned alignInBits = 0; 8007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!type->isIncompleteArrayType()) { 8017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::tie(sizeInBits, alignInBits) = CGM.getContext().getTypeInfo(type); 8027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (sizeInBitsOverride) 8047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei sizeInBits = sizeInBitsOverride; 8057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 8067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned flags = 0; 8087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (AS == clang::AS_private) 8097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei flags |= llvm::DIDescriptor::FlagPrivate; 8107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (AS == clang::AS_protected) 8117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei flags |= llvm::DIDescriptor::FlagProtected; 8127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createMemberType(scope, name, file, line, sizeInBits, 8147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei alignInBits, offsetInBits, flags, debugType); 8157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 8167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8170395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// CollectRecordLambdaFields - Helper for CollectRecordFields. 8180395de36004a718e265cc256b1bbee3bd3a791dcEric Christophervoid CGDebugInfo:: 8190395de36004a718e265cc256b1bbee3bd3a791dcEric ChristopherCollectRecordLambdaFields(const CXXRecordDecl *CXXDecl, 8200395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SmallVectorImpl<llvm::Value *> &elements, 8210395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType RecordTy) { 8220395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // For C++11 Lambdas a Field will be the same as a Capture, but the Capture 8230395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // has the name and the location of the variable so we should iterate over 8240395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // both concurrently. 8250395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(CXXDecl); 8260395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher RecordDecl::field_iterator Field = CXXDecl->field_begin(); 8270395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher unsigned fieldno = 0; 8280395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher for (CXXRecordDecl::capture_const_iterator I = CXXDecl->captures_begin(), 8290395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher E = CXXDecl->captures_end(); I != E; ++I, ++Field, ++fieldno) { 8300395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const LambdaExpr::Capture C = *I; 8310395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (C.capturesVariable()) { 8320395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher VarDecl *V = C.getCapturedVar(); 8330395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIFile VUnit = getOrCreateFile(C.getLocation()); 8340395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StringRef VName = V->getName(); 8350395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher uint64_t SizeInBitsOverride = 0; 8360395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (Field->isBitField()) { 8370395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SizeInBitsOverride = Field->getBitWidthValue(CGM.getContext()); 8380395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher assert(SizeInBitsOverride && "found named 0-width bitfield"); 8390395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 8400395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType fieldType 8410395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher = createFieldType(VName, Field->getType(), SizeInBitsOverride, 8420395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher C.getLocation(), Field->getAccess(), 8430395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher layout.getFieldOffset(fieldno), VUnit, RecordTy); 8440395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher elements.push_back(fieldType); 8450395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } else { 8460395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // TODO: Need to handle 'this' in some way by probably renaming the 8470395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // this of the lambda class and having a field member of 'this' or 8480395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // by using AT_object_pointer for the function and having that be 8490395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // used as 'this' for semantic references. 8500395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher assert(C.capturesThis() && "Field that isn't captured and isn't this?"); 8510395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher FieldDecl *f = *Field; 8520395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIFile VUnit = getOrCreateFile(f->getLocation()); 8530395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher QualType type = f->getType(); 8540395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType fieldType 8550395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher = createFieldType("this", type, 0, f->getLocation(), f->getAccess(), 8560395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher layout.getFieldOffset(fieldno), VUnit, RecordTy); 8570395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8580395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher elements.push_back(fieldType); 8590395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 8600395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 8610395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher} 8620395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8635434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie/// Helper for CollectRecordFields. 864cbcb030ab33d23c5f7e2e76e2e36843cb5295d50David Blaikiellvm::DIDerivedType 865cbcb030ab33d23c5f7e2e76e2e36843cb5295d50David BlaikieCGDebugInfo::CreateRecordStaticField(const VarDecl *Var, 866cbcb030ab33d23c5f7e2e76e2e36843cb5295d50David Blaikie llvm::DIType RecordTy) { 8670395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Create the descriptor for the static variable, with or without 8680395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // constant initializers. 8690395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIFile VUnit = getOrCreateFile(Var->getLocation()); 8700395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType VTy = getOrCreateType(Var->getType(), VUnit); 8710395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8720395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher unsigned LineNumber = getLineNumber(Var->getLocation()); 8730395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StringRef VName = Var->getName(); 874a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie llvm::Constant *C = NULL; 8750395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (Var->getInit()) { 8760395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const APValue *Value = Var->evaluateValue(); 877a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie if (Value) { 878a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie if (Value->isInt()) 879a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie C = llvm::ConstantInt::get(CGM.getLLVMContext(), Value->getInt()); 880a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie if (Value->isFloat()) 881a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie C = llvm::ConstantFP::get(CGM.getLLVMContext(), Value->getFloat()); 882a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie } 8830395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 8840395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8850395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher unsigned Flags = 0; 8860395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher AccessSpecifier Access = Var->getAccess(); 8870395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (Access == clang::AS_private) 8880395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher Flags |= llvm::DIDescriptor::FlagPrivate; 8890395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher else if (Access == clang::AS_protected) 8900395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher Flags |= llvm::DIDescriptor::FlagProtected; 8910395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 892cbcb030ab33d23c5f7e2e76e2e36843cb5295d50David Blaikie llvm::DIDerivedType GV = DBuilder.createStaticMemberType( 893cbcb030ab33d23c5f7e2e76e2e36843cb5295d50David Blaikie RecordTy, VName, VUnit, LineNumber, VTy, Flags, C); 8940395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StaticDataMemberCache[Var->getCanonicalDecl()] = llvm::WeakVH(GV); 895cbcb030ab33d23c5f7e2e76e2e36843cb5295d50David Blaikie return GV; 8960395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher} 8970395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8980395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// CollectRecordNormalField - Helper for CollectRecordFields. 8990395de36004a718e265cc256b1bbee3bd3a791dcEric Christophervoid CGDebugInfo:: 9000395de36004a718e265cc256b1bbee3bd3a791dcEric ChristopherCollectRecordNormalField(const FieldDecl *field, uint64_t OffsetInBits, 9010395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIFile tunit, 9020395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SmallVectorImpl<llvm::Value *> &elements, 9030395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType RecordTy) { 9040395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StringRef name = field->getName(); 9050395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher QualType type = field->getType(); 9060395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9070395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Ignore unnamed fields unless they're anonymous structs/unions. 9080395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (name.empty() && !type->isRecordType()) 9090395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher return; 9100395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9110395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher uint64_t SizeInBitsOverride = 0; 9120395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (field->isBitField()) { 9130395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SizeInBitsOverride = field->getBitWidthValue(CGM.getContext()); 9140395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher assert(SizeInBitsOverride && "found named 0-width bitfield"); 9150395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 9160395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9170395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType fieldType 9180395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher = createFieldType(name, type, SizeInBitsOverride, 9190395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher field->getLocation(), field->getAccess(), 9200395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher OffsetInBits, tunit, RecordTy); 9210395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9220395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher elements.push_back(fieldType); 9230395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher} 9240395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectRecordFields - A helper function to collect debug info for 9267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// record fields. This is used while creating debug info entry for a Record. 927841fd110a3b8f35d57050fb7db962232ee8bf764David Blaikievoid CGDebugInfo::CollectRecordFields(const RecordDecl *record, 928841fd110a3b8f35d57050fb7db962232ee8bf764David Blaikie llvm::DIFile tunit, 929841fd110a3b8f35d57050fb7db962232ee8bf764David Blaikie SmallVectorImpl<llvm::Value *> &elements, 930841fd110a3b8f35d57050fb7db962232ee8bf764David Blaikie llvm::DICompositeType RecordTy) { 9317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(record); 9327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9330395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (CXXDecl && CXXDecl->isLambda()) 9340395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher CollectRecordLambdaFields(CXXDecl, elements, RecordTy); 9350395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher else { 9360395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(record); 9370395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9380395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Field number for non-static fields. 939fd5ac0d75abd6ead8dd39bf526b34eeaff81cef6Eric Christopher unsigned fieldNo = 0; 9400395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9410395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Static and non-static members should appear in the same order as 9420395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // the corresponding declarations in the source program. 9430395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher for (RecordDecl::decl_iterator I = record->decls_begin(), 9440395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher E = record->decls_end(); I != E; ++I) 9455e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie if (const VarDecl *V = dyn_cast<VarDecl>(*I)) { 9465e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie // Reuse the existing static member declaration if one exists 9475e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator MI = 9485e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie StaticDataMemberCache.find(V->getCanonicalDecl()); 9495e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie if (MI != StaticDataMemberCache.end()) { 9505e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie assert(MI->second && 9515e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie "Static data member declaration should still exist"); 9525e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie elements.push_back( 9535e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie llvm::DIDerivedType(cast<llvm::MDNode>(MI->second))); 9545e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie } else 9555e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie elements.push_back(CreateRecordStaticField(V, RecordTy)); 9565e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie } else if (FieldDecl *field = dyn_cast<FieldDecl>(*I)) { 9570395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher CollectRecordNormalField(field, layout.getFieldOffset(fieldNo), 9580395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher tunit, elements, RecordTy); 9597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9600395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Bump field number for next field. 9610395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher ++fieldNo; 9627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 9657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateMethodType - CXXMethodDecl's type is a FunctionType. This 9677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// function type is not updated to include implicit "this" pointer. Use this 9687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// routine to get a method type which includes "this" pointer. 9699a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikiellvm::DICompositeType 9707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::getOrCreateMethodType(const CXXMethodDecl *Method, 9717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 9729c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie const FunctionProtoType *Func = Method->getType()->getAs<FunctionProtoType>(); 97367f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie if (Method->isStatic()) 9749a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie return llvm::DICompositeType(getOrCreateType(QualType(Func, 0), Unit)); 9759c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie return getOrCreateInstanceMethodType(Method->getThisType(CGM.getContext()), 9769c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie Func, Unit); 9779c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie} 97867f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie 9799a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikiellvm::DICompositeType CGDebugInfo::getOrCreateInstanceMethodType( 9809c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie QualType ThisPtr, const FunctionProtoType *Func, llvm::DIFile Unit) { 9817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add "this" pointer. 9829c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie llvm::DIArray Args = llvm::DICompositeType( 9839c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie getOrCreateType(QualType(Func, 0), Unit)).getTypeArray(); 9847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert (Args.getNumElements() && "Invalid number of arguments!"); 9857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> Elts; 9877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // First element is always return type. For 'void' functions it is NULL. 9897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elts.push_back(Args.getElement(0)); 9907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 99167f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // "this" pointer is always first argument. 9929c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie const CXXRecordDecl *RD = ThisPtr->getPointeeCXXRecordDecl(); 99367f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie if (isa<ClassTemplateSpecializationDecl>(RD)) { 99467f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // Create pointer type directly in this case. 99567f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie const PointerType *ThisPtrTy = cast<PointerType>(ThisPtr); 99667f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie QualType PointeeTy = ThisPtrTy->getPointeeType(); 99767f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie unsigned AS = CGM.getContext().getTargetAddressSpace(PointeeTy); 99864aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall uint64_t Size = CGM.getTarget().getPointerWidth(AS); 99967f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie uint64_t Align = CGM.getContext().getTypeAlign(ThisPtrTy); 100067f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie llvm::DIType PointeeType = getOrCreateType(PointeeTy, Unit); 1001f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher llvm::DIType ThisPtrType = 1002f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher DBuilder.createPointerType(PointeeType, Size, Align); 100367f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie TypeCache[ThisPtr.getAsOpaquePtr()] = ThisPtrType; 100467f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // TODO: This and the artificial type below are misleading, the 100567f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // types aren't artificial the argument is, but the current 100667f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // metadata doesn't represent that. 100767f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType); 100867f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie Elts.push_back(ThisPtrType); 100967f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie } else { 101067f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie llvm::DIType ThisPtrType = getOrCreateType(ThisPtr, Unit); 101167f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie TypeCache[ThisPtr.getAsOpaquePtr()] = ThisPtrType; 101267f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType); 101367f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie Elts.push_back(ThisPtrType); 10147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Copy rest of the arguments. 10177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 1, e = Args.getNumElements(); i != e; ++i) 10187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elts.push_back(Args.getElement(i)); 10197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(Elts); 10217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createSubroutineType(Unit, EltTypeArray); 10237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10256537f083555f9606c495d05c562878aa49bae987Eric Christopher/// isFunctionLocalClass - Return true if CXXRecordDecl is defined 10267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// inside a function. 10277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool isFunctionLocalClass(const CXXRecordDecl *RD) { 10287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXRecordDecl *NRD = dyn_cast<CXXRecordDecl>(RD->getDeclContext())) 10297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return isFunctionLocalClass(NRD); 10307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<FunctionDecl>(RD->getDeclContext())) 10317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 10327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 10337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateCXXMemberFunction - A helper function to create a DISubprogram for 10367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a single member function GlobalDecl. 10377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DISubprogram 10387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::CreateCXXMemberFunction(const CXXMethodDecl *Method, 10397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit, 10407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 10416537f083555f9606c495d05c562878aa49bae987Eric Christopher bool IsCtorOrDtor = 10427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei isa<CXXConstructorDecl>(Method) || isa<CXXDestructorDecl>(Method); 10436537f083555f9606c495d05c562878aa49bae987Eric Christopher 10447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef MethodName = getFunctionName(Method); 10459a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie llvm::DICompositeType MethodTy = getOrCreateMethodType(Method, Unit); 10467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Since a single ctor/dtor corresponds to multiple functions, it doesn't 10487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // make sense to give a single ctor/dtor a linkage name. 10497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef MethodLinkageName; 10507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!IsCtorOrDtor && !isFunctionLocalClass(Method->getParent())) 10517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MethodLinkageName = CGM.getMangledName(Method); 10527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the location for the method. 1054fc946271e008544b518321fdecc77ca076663c12David Blaikie llvm::DIFile MethodDefUnit; 1055fc946271e008544b518321fdecc77ca076663c12David Blaikie unsigned MethodLine = 0; 1056fc946271e008544b518321fdecc77ca076663c12David Blaikie if (!Method->isImplicit()) { 1057fc946271e008544b518321fdecc77ca076663c12David Blaikie MethodDefUnit = getOrCreateFile(Method->getLocation()); 1058fc946271e008544b518321fdecc77ca076663c12David Blaikie MethodLine = getLineNumber(Method->getLocation()); 1059fc946271e008544b518321fdecc77ca076663c12David Blaikie } 10607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Collect virtual method info. 10627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType ContainingType; 10636537f083555f9606c495d05c562878aa49bae987Eric Christopher unsigned Virtuality = 0; 10647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned VIndex = 0; 10656537f083555f9606c495d05c562878aa49bae987Eric Christopher 10667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->isVirtual()) { 10677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->isPure()) 10687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Virtuality = llvm::dwarf::DW_VIRTUALITY_pure_virtual; 10697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 10707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Virtuality = llvm::dwarf::DW_VIRTUALITY_virtual; 10716537f083555f9606c495d05c562878aa49bae987Eric Christopher 10727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // It doesn't make sense to give a virtual destructor a vtable index, 10737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // since a single destructor has two entries in the vtable. 10747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!isa<CXXDestructorDecl>(Method)) 10757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VIndex = CGM.getVTableContext().getMethodVTableIndex(Method); 10767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContainingType = RecordTy; 10777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 10807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->isImplicit()) 10817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagArtificial; 10827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei AccessSpecifier Access = Method->getAccess(); 10837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Access == clang::AS_private) 10847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrivate; 10857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (Access == clang::AS_protected) 10867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagProtected; 10877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXConstructorDecl *CXXC = dyn_cast<CXXConstructorDecl>(Method)) { 10887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXC->isExplicit()) 10897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagExplicit; 10906537f083555f9606c495d05c562878aa49bae987Eric Christopher } else if (const CXXConversionDecl *CXXC = 10917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<CXXConversionDecl>(Method)) { 10927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXC->isExplicit()) 10937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagExplicit; 10947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->hasPrototype()) 10967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrototyped; 10977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray TParamsArray = CollectFunctionTemplateParams(Method, Unit); 10997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DISubprogram SP = 11006537f083555f9606c495d05c562878aa49bae987Eric Christopher DBuilder.createMethod(RecordTy, MethodName, MethodLinkageName, 11017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MethodDefUnit, MethodLine, 11026537f083555f9606c495d05c562878aa49bae987Eric Christopher MethodTy, /*isLocalToUnit=*/false, 11037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /* isDefinition=*/ false, 11047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Virtuality, VIndex, ContainingType, 11057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags, CGM.getLangOpts().Optimize, NULL, 11067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TParamsArray); 11076537f083555f9606c495d05c562878aa49bae987Eric Christopher 11087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SPCache[Method->getCanonicalDecl()] = llvm::WeakVH(SP); 11097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SP; 11117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 11127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectCXXMemberFunctions - A helper function to collect debug info for 11146537f083555f9606c495d05c562878aa49bae987Eric Christopher/// C++ member functions. This is used while creating debug info entry for 11157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a Record. 11167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 11177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectCXXMemberFunctions(const CXXRecordDecl *RD, llvm::DIFile Unit, 11187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &EltTys, 11197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 11207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Since we want more than just the individual member decls if we 11227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // have templated functions iterate over every declaration to gather 11237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the functions. 11247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for(DeclContext::decl_iterator I = RD->decls_begin(), 11257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = RD->decls_end(); I != E; ++I) { 1126c5761271730ab929f19facef51903c9bdf5c5d0bDavid Blaikie if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(*I)) { 1127dd65802b1cf30d892b82c8370b96e6c94d239510David Blaikie // Reuse the existing member function declaration if it exists. 11284a68491fa179572e6b2c1364e7ff24c05110324bDavid Blaikie // It may be associated with the declaration of the type & should be 11294a68491fa179572e6b2c1364e7ff24c05110324bDavid Blaikie // reused as we're building the definition. 1130dd65802b1cf30d892b82c8370b96e6c94d239510David Blaikie // 1131dd65802b1cf30d892b82c8370b96e6c94d239510David Blaikie // This situation can arise in the vtable-based debug info reduction where 1132dd65802b1cf30d892b82c8370b96e6c94d239510David Blaikie // implicit members are emitted in a non-vtable TU. 11335434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator MI = 11345434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie SPCache.find(Method->getCanonicalDecl()); 1135c5761271730ab929f19facef51903c9bdf5c5d0bDavid Blaikie if (MI == SPCache.end()) { 11364a68491fa179572e6b2c1364e7ff24c05110324bDavid Blaikie // If the member is implicit, lazily create it when we see the 11374a68491fa179572e6b2c1364e7ff24c05110324bDavid Blaikie // definition, not before. (an ODR-used implicit default ctor that's 11384a68491fa179572e6b2c1364e7ff24c05110324bDavid Blaikie // never actually code generated should not produce debug info) 1139c5761271730ab929f19facef51903c9bdf5c5d0bDavid Blaikie if (!Method->isImplicit()) 1140c5761271730ab929f19facef51903c9bdf5c5d0bDavid Blaikie EltTys.push_back(CreateCXXMemberFunction(Method, Unit, RecordTy)); 1141c5761271730ab929f19facef51903c9bdf5c5d0bDavid Blaikie } else 11425434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie EltTys.push_back(MI->second); 1143ac7c25f0cab42a34d6e6acba7afff729caf0258eEric Christopher } else if (const FunctionTemplateDecl *FTD = 1144ac7c25f0cab42a34d6e6acba7afff729caf0258eEric Christopher dyn_cast<FunctionTemplateDecl>(*I)) { 114511fa7518cb2cf92db977ccc15f0db97307eac58cDavid Blaikie // Add any template specializations that have already been seen. Like 114611fa7518cb2cf92db977ccc15f0db97307eac58cDavid Blaikie // implicit member functions, these may have been added to a declaration 114711fa7518cb2cf92db977ccc15f0db97307eac58cDavid Blaikie // in the case of vtable-based debug info reduction. 1148ac7c25f0cab42a34d6e6acba7afff729caf0258eEric Christopher for (FunctionTemplateDecl::spec_iterator SI = FTD->spec_begin(), 1149ac7c25f0cab42a34d6e6acba7afff729caf0258eEric Christopher SE = FTD->spec_end(); 1150ac7c25f0cab42a34d6e6acba7afff729caf0258eEric Christopher SI != SE; ++SI) { 115111fa7518cb2cf92db977ccc15f0db97307eac58cDavid Blaikie llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator MI = 115211fa7518cb2cf92db977ccc15f0db97307eac58cDavid Blaikie SPCache.find(cast<CXXMethodDecl>(*SI)->getCanonicalDecl()); 115311fa7518cb2cf92db977ccc15f0db97307eac58cDavid Blaikie if (MI != SPCache.end()) 115411fa7518cb2cf92db977ccc15f0db97307eac58cDavid Blaikie EltTys.push_back(MI->second); 115511fa7518cb2cf92db977ccc15f0db97307eac58cDavid Blaikie } 11565434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie } 11577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11586537f083555f9606c495d05c562878aa49bae987Eric Christopher} 11597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectCXXFriends - A helper function to collect debug info for 11617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// C++ base classes. This is used while creating debug info entry for 11627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a Record. 11637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 11647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectCXXFriends(const CXXRecordDecl *RD, llvm::DIFile Unit, 11657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &EltTys, 11667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 11677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (CXXRecordDecl::friend_iterator BI = RD->friend_begin(), 11687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BE = RD->friend_end(); BI != BE; ++BI) { 11697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if ((*BI)->isUnsupportedFriend()) 11707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 11717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TypeSourceInfo *TInfo = (*BI)->getFriendType()) 11723de73f007b0ca4cf611d3929d8da73ea7d0c2b8aDavid Blaikie EltTys.push_back(DBuilder.createFriend( 1173472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie RecordTy, getOrCreateType(TInfo->getType(), Unit))); 11747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 11767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectCXXBases - A helper function to collect debug info for 11786537f083555f9606c495d05c562878aa49bae987Eric Christopher/// C++ base classes. This is used while creating debug info entry for 11797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a Record. 11807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 11817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile Unit, 11827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &EltTys, 11837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 11847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 11867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (CXXRecordDecl::base_class_const_iterator BI = RD->bases_begin(), 11877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BE = RD->bases_end(); BI != BE; ++BI) { 11887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned BFlags = 0; 11897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t BaseOffset; 11906537f083555f9606c495d05c562878aa49bae987Eric Christopher 11917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *Base = 11927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<CXXRecordDecl>(BI->getType()->getAs<RecordType>()->getDecl()); 11936537f083555f9606c495d05c562878aa49bae987Eric Christopher 11947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (BI->isVirtual()) { 11957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // virtual base offset offset is -ve. The code generator emits dwarf 11967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // expression where it expects +ve number. 11976537f083555f9606c495d05c562878aa49bae987Eric Christopher BaseOffset = 11987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 0 - CGM.getVTableContext() 11997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei .getVirtualBaseOffsetOffset(RD, Base).getQuantity(); 12007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BFlags = llvm::DIDescriptor::FlagVirtual; 12017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else 12027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BaseOffset = CGM.getContext().toBits(RL.getBaseClassOffset(Base)); 12037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Inconsistent units for BaseOffset. It is in bytes when 12047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // BI->isVirtual() and bits when not. 12056537f083555f9606c495d05c562878aa49bae987Eric Christopher 12067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei AccessSpecifier Access = BI->getAccessSpecifier(); 12077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Access == clang::AS_private) 12087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BFlags |= llvm::DIDescriptor::FlagPrivate; 12097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (Access == clang::AS_protected) 12107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BFlags |= llvm::DIDescriptor::FlagProtected; 12116537f083555f9606c495d05c562878aa49bae987Eric Christopher 12126537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIType DTy = 12136537f083555f9606c495d05c562878aa49bae987Eric Christopher DBuilder.createInheritance(RecordTy, 12147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(BI->getType(), Unit), 12157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BaseOffset, BFlags); 12167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(DTy); 12177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 12197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectTemplateParams - A helper function to collect template parameters. 12217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIArray CGDebugInfo:: 12227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectTemplateParams(const TemplateParameterList *TPList, 122335178dc09d97bb2e0612813def09833866e3ad82David Blaikie ArrayRef<TemplateArgument> TAList, 12247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 12256537f083555f9606c495d05c562878aa49bae987Eric Christopher SmallVector<llvm::Value *, 16> TemplateParams; 12267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0, e = TAList.size(); i != e; ++i) { 12277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgument &TA = TAList[i]; 122835178dc09d97bb2e0612813def09833866e3ad82David Blaikie StringRef Name; 122935178dc09d97bb2e0612813def09833866e3ad82David Blaikie if (TPList) 123035178dc09d97bb2e0612813def09833866e3ad82David Blaikie Name = TPList->getParam(i)->getName(); 12319dfd24324c079b564dda936c6ae46898b82121e2David Blaikie switch (TA.getKind()) { 12329dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Type: { 12337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType TTy = getOrCreateType(TA.getAsType(), Unit); 12347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DITemplateTypeParameter TTP = 123535178dc09d97bb2e0612813def09833866e3ad82David Blaikie DBuilder.createTemplateTypeParameter(TheCU, Name, TTy); 12367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateParams.push_back(TTP); 12379dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 12389dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Integral: { 12397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType TTy = getOrCreateType(TA.getIntegralType(), Unit); 12407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DITemplateValueParameter TVP = 12419dfd24324c079b564dda936c6ae46898b82121e2David Blaikie DBuilder.createTemplateValueParameter( 124235178dc09d97bb2e0612813def09833866e3ad82David Blaikie TheCU, Name, TTy, 12439dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::ConstantInt::get(CGM.getLLVMContext(), TA.getAsIntegral())); 12449dfd24324c079b564dda936c6ae46898b82121e2David Blaikie TemplateParams.push_back(TVP); 12459dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 12469dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Declaration: { 12479dfd24324c079b564dda936c6ae46898b82121e2David Blaikie const ValueDecl *D = TA.getAsDecl(); 12489dfd24324c079b564dda936c6ae46898b82121e2David Blaikie bool InstanceMember = D->isCXXInstanceMember(); 12499dfd24324c079b564dda936c6ae46898b82121e2David Blaikie QualType T = InstanceMember 12509dfd24324c079b564dda936c6ae46898b82121e2David Blaikie ? CGM.getContext().getMemberPointerType( 12519dfd24324c079b564dda936c6ae46898b82121e2David Blaikie D->getType(), cast<RecordDecl>(D->getDeclContext()) 12529dfd24324c079b564dda936c6ae46898b82121e2David Blaikie ->getTypeForDecl()) 12539dfd24324c079b564dda936c6ae46898b82121e2David Blaikie : CGM.getContext().getPointerType(D->getType()); 12549dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::DIType TTy = getOrCreateType(T, Unit); 12559dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::Value *V = 0; 12569dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Variable pointer template parameters have a value that is the address 12579dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // of the variable. 12589dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (const VarDecl *VD = dyn_cast<VarDecl>(D)) 12599dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.GetAddrOfGlobalVar(VD); 12609dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Member function pointers have special support for building them, though 12619dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // this is currently unsupported in LLVM CodeGen. 1262f8aa155e40bc98844f46ecbfdbe430696c36ce24David Blaikie if (InstanceMember) { 12639dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (const CXXMethodDecl *method = dyn_cast<CXXMethodDecl>(D)) 12649dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.getCXXABI().EmitMemberPointer(method); 1265f8aa155e40bc98844f46ecbfdbe430696c36ce24David Blaikie } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) 1266f8aa155e40bc98844f46ecbfdbe430696c36ce24David Blaikie V = CGM.GetAddrOfFunction(FD); 12679dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Member data pointers have special handling too to compute the fixed 12689dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // offset within the object. 12699dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (isa<FieldDecl>(D)) { 12709dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // These five lines (& possibly the above member function pointer 12719dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // handling) might be able to be refactored to use similar code in 12729dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // CodeGenModule::getMemberPointerConstant 12739dfd24324c079b564dda936c6ae46898b82121e2David Blaikie uint64_t fieldOffset = CGM.getContext().getFieldOffset(D); 12749dfd24324c079b564dda936c6ae46898b82121e2David Blaikie CharUnits chars = 12759dfd24324c079b564dda936c6ae46898b82121e2David Blaikie CGM.getContext().toCharUnitsFromBits((int64_t) fieldOffset); 12769dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.getCXXABI().EmitMemberDataPointer( 12779dfd24324c079b564dda936c6ae46898b82121e2David Blaikie cast<MemberPointerType>(T.getTypePtr()), chars); 12789dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } 12799dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::DITemplateValueParameter TVP = 12805db8b3138f36e11bca835881e81cc56bbd7b4fa4David Majnemer DBuilder.createTemplateValueParameter(TheCU, Name, TTy, 12815db8b3138f36e11bca835881e81cc56bbd7b4fa4David Majnemer V->stripPointerCasts()); 12829dfd24324c079b564dda936c6ae46898b82121e2David Blaikie TemplateParams.push_back(TVP); 12839dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 12849dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::NullPtr: { 12859dfd24324c079b564dda936c6ae46898b82121e2David Blaikie QualType T = TA.getNullPtrType(); 12869dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::DIType TTy = getOrCreateType(T, Unit); 12879dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::Value *V = 0; 12889dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Special case member data pointer null values since they're actually -1 12899dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // instead of zero. 12909dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (const MemberPointerType *MPT = 12919dfd24324c079b564dda936c6ae46898b82121e2David Blaikie dyn_cast<MemberPointerType>(T.getTypePtr())) 12929dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // But treat member function pointers as simple zero integers because 12939dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // it's easier than having a special case in LLVM's CodeGen. If LLVM 12949dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // CodeGen grows handling for values of non-null member function 12959dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // pointers then perhaps we could remove this special case and rely on 12969dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // EmitNullMemberPointer for member function pointers. 12979dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (MPT->isMemberDataPointer()) 12989dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.getCXXABI().EmitNullMemberPointer(MPT); 12999dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (!V) 13009dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = llvm::ConstantInt::get(CGM.Int8Ty, 0); 13019dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::DITemplateValueParameter TVP = 130235178dc09d97bb2e0612813def09833866e3ad82David Blaikie DBuilder.createTemplateValueParameter(TheCU, Name, TTy, V); 130335178dc09d97bb2e0612813def09833866e3ad82David Blaikie TemplateParams.push_back(TVP); 130435178dc09d97bb2e0612813def09833866e3ad82David Blaikie } break; 130535178dc09d97bb2e0612813def09833866e3ad82David Blaikie case TemplateArgument::Template: { 130635178dc09d97bb2e0612813def09833866e3ad82David Blaikie llvm::DITemplateValueParameter TVP = 130735178dc09d97bb2e0612813def09833866e3ad82David Blaikie DBuilder.createTemplateTemplateParameter( 130835178dc09d97bb2e0612813def09833866e3ad82David Blaikie TheCU, Name, llvm::DIType(), 130935178dc09d97bb2e0612813def09833866e3ad82David Blaikie TA.getAsTemplate().getAsTemplateDecl() 131035178dc09d97bb2e0612813def09833866e3ad82David Blaikie ->getQualifiedNameAsString()); 131135178dc09d97bb2e0612813def09833866e3ad82David Blaikie TemplateParams.push_back(TVP); 131235178dc09d97bb2e0612813def09833866e3ad82David Blaikie } break; 131335178dc09d97bb2e0612813def09833866e3ad82David Blaikie case TemplateArgument::Pack: { 131435178dc09d97bb2e0612813def09833866e3ad82David Blaikie llvm::DITemplateValueParameter TVP = 131535178dc09d97bb2e0612813def09833866e3ad82David Blaikie DBuilder.createTemplateParameterPack( 131635178dc09d97bb2e0612813def09833866e3ad82David Blaikie TheCU, Name, llvm::DIType(), 131735178dc09d97bb2e0612813def09833866e3ad82David Blaikie CollectTemplateParams(NULL, TA.getPackAsArray(), Unit)); 13189dfd24324c079b564dda936c6ae46898b82121e2David Blaikie TemplateParams.push_back(TVP); 13199dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 132087b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer case TemplateArgument::Expression: { 132187b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer const Expr *E = TA.getAsExpr(); 132287b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer QualType T = E->getType(); 132387b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer llvm::Value *V = CGM.EmitConstantExpr(E, T); 132487b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer assert(V && "Expression in template argument isn't constant"); 132587b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer llvm::DIType TTy = getOrCreateType(T, Unit); 132687b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer llvm::DITemplateValueParameter TVP = 132787b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer DBuilder.createTemplateValueParameter(TheCU, Name, TTy, 132887b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer V->stripPointerCasts()); 132987b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer TemplateParams.push_back(TVP); 133087b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer } break; 1331e8065128777e13322aa2b4de86a362326e0c7686David Blaikie // And the following should never occur: 13329dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::TemplateExpansion: 13339dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Null: 13349dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm_unreachable( 13359dfd24324c079b564dda936c6ae46898b82121e2David Blaikie "These argument types shouldn't exist in concrete types"); 13367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.getOrCreateArray(TemplateParams); 13397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectFunctionTemplateParams - A helper function to collect debug 13427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// info for function template parameters. 13437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIArray CGDebugInfo:: 13447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectFunctionTemplateParams(const FunctionDecl *FD, llvm::DIFile Unit) { 13457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FD->getTemplatedKind() == 13467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionDecl::TK_FunctionTemplateSpecialization) { 13477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateParameterList *TList = 13487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FD->getTemplateSpecializationInfo()->getTemplate() 13497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ->getTemplateParameters(); 135035178dc09d97bb2e0612813def09833866e3ad82David Blaikie return CollectTemplateParams( 135135178dc09d97bb2e0612813def09833866e3ad82David Blaikie TList, FD->getTemplateSpecializationArgs()->asArray(), Unit); 13527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIArray(); 13547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectCXXTemplateParams - A helper function to collect debug info for 13577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// template parameters. 13587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIArray CGDebugInfo:: 13597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectCXXTemplateParams(const ClassTemplateSpecializationDecl *TSpecial, 13607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 13617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::PointerUnion<ClassTemplateDecl *, 13627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ClassTemplatePartialSpecializationDecl *> 13637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PU = TSpecial->getSpecializedTemplateOrPartial(); 13646537f083555f9606c495d05c562878aa49bae987Eric Christopher 13657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateParameterList *TPList = PU.is<ClassTemplateDecl *>() ? 13667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PU.get<ClassTemplateDecl *>()->getTemplateParameters() : 13677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PU.get<ClassTemplatePartialSpecializationDecl *>()->getTemplateParameters(); 13687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgumentList &TAList = TSpecial->getTemplateInstantiationArgs(); 136935178dc09d97bb2e0612813def09833866e3ad82David Blaikie return CollectTemplateParams(TPList, TAList.asArray(), Unit); 13707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateVTablePtrType - Return debug info descriptor for vtable. 13737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getOrCreateVTablePtrType(llvm::DIFile Unit) { 13747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VTablePtrType.isValid()) 13757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VTablePtrType; 13767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTContext &Context = CGM.getContext(); 13787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /* Function type */ 13807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *STy = getOrCreateType(Context.IntTy, Unit); 13817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray SElements = DBuilder.getOrCreateArray(STy); 13827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType SubTy = DBuilder.createSubroutineType(Unit, SElements); 13837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Size = Context.getTypeSize(Context.VoidPtrTy); 13847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType vtbl_ptr_type = DBuilder.createPointerType(SubTy, Size, 0, 13857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "__vtbl_ptr_type"); 13867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTablePtrType = DBuilder.createPointerType(vtbl_ptr_type, Size); 13877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VTablePtrType; 13887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getVTableName - Get vtable name for the given Class. 13917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getVTableName(const CXXRecordDecl *RD) { 13927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Construct gdb compatible name name. 13937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Name = "_vptr$" + RD->getNameAsString(); 13947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Copy this name on the side and use its reference. 13967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei char *StrPtr = DebugInfoNames.Allocate<char>(Name.length()); 13977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(StrPtr, Name.data(), Name.length()); 13987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return StringRef(StrPtr, Name.length()); 13997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectVTableInfo - If the C++ class has vtable info then insert appropriate 14037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// debug info entry in EltTys vector. 14047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 14057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile Unit, 14067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &EltTys) { 14077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 14087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there is a primary base then it will hold vtable info. 14107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RL.getPrimaryBase()) 14117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 14127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this class is not dynamic then there is not any vtable info to collect. 14147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!RD->isDynamicClass()) 14157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 14167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 14187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType VPTR 14197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = DBuilder.createMemberType(Unit, getVTableName(RD), Unit, 1420f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher 0, Size, 0, 0, 1421f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher llvm::DIDescriptor::FlagArtificial, 14227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateVTablePtrType(Unit)); 14237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(VPTR); 14247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14266537f083555f9606c495d05c562878aa49bae987Eric Christopher/// getOrCreateRecordType - Emit record type's standalone debug info. 14276537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DIType CGDebugInfo::getOrCreateRecordType(QualType RTy, 14287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc) { 142913c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 14307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType T = getOrCreateType(RTy, getOrCreateFile(Loc)); 14317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 14327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateInterfaceType - Emit an objective c interface type standalone 14357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// debug info. 14367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getOrCreateInterfaceType(QualType D, 1437be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher SourceLocation Loc) { 143813c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 14397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType T = getOrCreateType(D, getOrCreateFile(Loc)); 1440ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl RetainedTypes.push_back(D.getAsOpaquePtr()); 14417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 14427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1444278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikievoid CGDebugInfo::completeType(const RecordDecl *RD) { 1445278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie if (DebugKind > CodeGenOptions::LimitedDebugInfo || 1446278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie !CGM.getLangOpts().CPlusPlus) 1447278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie completeRequiredType(RD); 1448278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie} 1449278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie 1450278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikievoid CGDebugInfo::completeRequiredType(const RecordDecl *RD) { 14515434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie if (const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD)) 14525434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie if (CXXDecl->isDynamicClass()) 14535434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie return; 14545434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie 1455278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie QualType Ty = CGM.getContext().getRecordType(RD); 1456278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie llvm::DIType T = getTypeOrNull(Ty); 14575434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie if (T && T.isForwardDecl()) 14585434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie completeClassData(RD); 14595434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie} 14605434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie 14615434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikievoid CGDebugInfo::completeClassData(const RecordDecl *RD) { 14625434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie if (DebugKind <= CodeGenOptions::DebugLineTablesOnly) 146390e5523e4cd2230b86c6921b34affdcd35e0c4c0Michael Gottesman return; 14645434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie QualType Ty = CGM.getContext().getRecordType(RD); 1465278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie void* TyPtr = Ty.getAsOpaquePtr(); 1466278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie if (CompletedTypeCache.count(TyPtr)) 1467278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie return; 1468278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie llvm::DIType Res = CreateTypeDefinition(Ty->castAs<RecordType>()); 1469278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie assert(!Res.isForwardDecl()); 1470278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie CompletedTypeCache[TyPtr] = Res; 1471278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie TypeCache[TyPtr] = Res; 1472278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie} 1473278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie 14747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateType - get structure or union type. 1475472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikiellvm::DIType CGDebugInfo::CreateType(const RecordType *Ty) { 14767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordDecl *RD = Ty->getDecl(); 14775434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD); 1478472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie // Always emit declarations for types that aren't required to be complete when 1479472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie // in limit-debug-info mode. If the type is later found to be required to be 1480472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie // complete this declaration will be upgraded to a definition by 1481472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie // `completeRequiredType`. 1482472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie // If the type is dynamic, only emit the definition in TUs that require class 1483472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie // data. This is handled by `completeClassData`. 1484472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie if ((DebugKind <= CodeGenOptions::LimitedDebugInfo && 14855434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie !RD->isCompleteDefinitionRequired() && CGM.getLangOpts().CPlusPlus) || 14865434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie (CXXDecl && CXXDecl->hasDefinition() && CXXDecl->isDynamicClass())) { 14875f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie llvm::DIDescriptor FDContext = 14885f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie getContextDescriptor(cast<Decl>(RD->getDeclContext())); 1489f332733e141905ccefe43e7fe65f9a8a4263a2f6Manman Ren llvm::DIType RetTy = getOrCreateRecordFwdDecl(Ty, FDContext); 14905434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie // FIXME: This is conservatively correct. If we return a non-forward decl 14915434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie // that's not a full definition (such as those created by 14925434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie // createContextChain) then getOrCreateType will record is as a complete 14935434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie // type and we'll never record all its members. But this means we're 14945434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie // emitting full debug info in TUs where GCC successfully emits a partial 14955434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie // definition of the type. 14965434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie if (RetTy.isForwardDecl()) 14975434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie return RetTy; 14985f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie } 14997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1500278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie return CreateTypeDefinition(Ty); 1501278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie} 1502278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie 1503278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikiellvm::DIType CGDebugInfo::CreateTypeDefinition(const RecordType *Ty) { 1504278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie RecordDecl *RD = Ty->getDecl(); 1505278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie 15067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the record type for the debug info. 15077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); 15087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Records and classes and unions can all be recursive. To handle them, we 15107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // first generate a debug descriptor for the struct as a forward declaration. 15117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Then (if it is a definition) we go through and get debug info for all of 15127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // its members. Finally, we create a descriptor for the complete type (which 15137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // may refer to the forward decl if the struct is recursive) and replace all 15147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // uses of the forward declaration with the final definition. 15157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15164a0771680ee2fa8e76e1c0d54eaf69f459daf424David Blaikie llvm::DICompositeType FwdDecl(getOrCreateLimitedType(Ty, DefUnit)); 1517b6b0a711e4996a43e1932c20d0fd235bb711ad36Manman Ren assert(FwdDecl.isCompositeType() && 15189a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie "The debug type of a RecordType should be a llvm::DICompositeType"); 15197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FwdDecl.isForwardDecl()) 15217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return FwdDecl; 15227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1523498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie if (const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD)) 1524498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie CollectContainingType(CXXDecl, FwdDecl); 1525498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie 15267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Push the struct on region stack. 1527f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher LexicalBlockStack.push_back(&*FwdDecl); 15287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl); 15297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15304919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl // Add this to the completed-type cache while we're completing it recursively. 15317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CompletedTypeCache[QualType(Ty, 0).getAsOpaquePtr()] = FwdDecl; 15327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Convert all the elements. 15347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> EltTys; 15355434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie // what about nested types? 15367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Note: The split of CXXDecl information here is intentional, the 15387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // gdb tests will depend on a certain ordering at printout. The debug 15397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // information offsets are still correct if we merge them all together 15407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // though. 15417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD); 15427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXDecl) { 15437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectCXXBases(CXXDecl, DefUnit, EltTys, FwdDecl); 15447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectVTableInfo(CXXDecl, DefUnit, EltTys); 15457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15470395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Collect data fields (including static variables and any initializers). 15487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectRecordFields(RD, DefUnit, EltTys, FwdDecl); 15497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXDecl) { 15507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectCXXMemberFunctions(CXXDecl, DefUnit, EltTys, FwdDecl); 15517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectCXXFriends(CXXDecl, DefUnit, EltTys, FwdDecl); 15527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 15557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap.erase(Ty->getDecl()); 15567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys); 15588058833e12dd9cd38107f6dde3d5a17021ad3a5dDavid Blaikie FwdDecl.setTypeArray(Elements); 1559bd0152fb251e84c6f335c66322b83a9af09fed0cNico Weber 1560f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl); 1561f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher return FwdDecl; 15627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 15637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateType - get objective-c object type. 15657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ObjCObjectType *Ty, 15667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 15677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore protocols. 15687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(Ty->getBaseType(), Unit); 15697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 15707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15715ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 15725ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl/// \return true if Getter has the default name for the property PD. 15735ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantlstatic bool hasDefaultGetterName(const ObjCPropertyDecl *PD, 15745ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl const ObjCMethodDecl *Getter) { 15755ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl assert(PD); 15765ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl if (!Getter) 15775ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl return true; 15785ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 15795ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl assert(Getter->getDeclName().isObjCZeroArgSelector()); 15805ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl return PD->getName() == 15815ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl Getter->getDeclName().getObjCSelector().getNameForSlot(0); 15825ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl} 15835ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 15845ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl/// \return true if Setter has the default name for the property PD. 15855ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantlstatic bool hasDefaultSetterName(const ObjCPropertyDecl *PD, 15865ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl const ObjCMethodDecl *Setter) { 15875ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl assert(PD); 15885ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl if (!Setter) 15895ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl return true; 15905ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 15915ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl assert(Setter->getDeclName().isObjCOneArgSelector()); 159280e8ea92d6dcaa05165dcb4730485db82dcd4629Adrian Prantl return SelectorTable::constructSetterName(PD->getName()) == 15935ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl Setter->getDeclName().getObjCSelector().getNameForSlot(0); 15945ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl} 15955ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 15967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateType - get objective-c interface type. 15977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, 15987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 15997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *ID = Ty->getDecl(); 16007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ID) 16017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 16027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the record type for the debug info. 16047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(ID->getLocation()); 16057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(ID->getLocation()); 16067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RuntimeLang = TheCU.getLanguage(); 16077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is just a forward declaration return a special forward-declaration 16097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // debug type since we won't be able to lay out the entire type. 16107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *Def = ID->getDefinition(); 16117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Def) { 16127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FwdDecl = 16137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 1614be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher ID->getName(), TheCU, DefUnit, Line, 1615be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher RuntimeLang); 16167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return FwdDecl; 16177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID = Def; 16207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 16227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 16237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 16247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 16267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID->getImplementation()) 16277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagObjcClassComplete; 16287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1629f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher llvm::DICompositeType RealDecl = 16307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createStructType(Unit, ID->getName(), DefUnit, 16317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Line, Size, Align, Flags, 1632c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie llvm::DIType(), llvm::DIArray(), RuntimeLang); 16337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise, insert it into the CompletedTypeCache so that recursive uses 16357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // will find it and we're emitting the complete type. 16364919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl QualType QualTy = QualType(Ty, 0); 16374919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl CompletedTypeCache[QualTy.getAsOpaquePtr()] = RealDecl; 16387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1639d3003dc68535e94fe2501265d68a10aec429d7d0Eric Christopher // Push the struct on region stack. 1640f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher LexicalBlockStack.push_back(static_cast<llvm::MDNode*>(RealDecl)); 16417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[Ty->getDecl()] = llvm::WeakVH(RealDecl); 16427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Convert all the elements. 16447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> EltTys; 16457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *SClass = ID->getSuperClass(); 16477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SClass) { 16487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType SClassTy = 16497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(CGM.getContext().getObjCInterfaceType(SClass), Unit); 16507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!SClassTy.isValid()) 16517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 16526537f083555f9606c495d05c562878aa49bae987Eric Christopher 16537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType InhTag = 16547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createInheritance(RealDecl, SClassTy, 0, 0); 16557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(InhTag); 16567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1658d3003dc68535e94fe2501265d68a10aec429d7d0Eric Christopher // Create entries for all of the properties. 16597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ObjCContainerDecl::prop_iterator I = ID->prop_begin(), 16607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = ID->prop_end(); I != E; ++I) { 16617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ObjCPropertyDecl *PD = *I; 16627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc = PD->getLocation(); 16637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile PUnit = getOrCreateFile(Loc); 16647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned PLine = getLineNumber(Loc); 16657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Getter = PD->getGetterMethodDecl(); 16667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Setter = PD->getSetterMethodDecl(); 16677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *PropertyNode = 16687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createObjCProperty(PD->getName(), 1669be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher PUnit, PLine, 16705ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl hasDefaultGetterName(PD, Getter) ? "" : 16717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getSelectorName(PD->getGetterName()), 16725ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl hasDefaultSetterName(PD, Setter) ? "" : 16737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getSelectorName(PD->getSetterName()), 16747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PD->getPropertyAttributes(), 1675be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher getOrCreateType(PD->getType(), PUnit)); 16767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(PropertyNode); 16777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &RL = CGM.getContext().getASTObjCInterfaceLayout(ID); 16807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldNo = 0; 16817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ObjCIvarDecl *Field = ID->all_declared_ivar_begin(); Field; 16827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Field = Field->getNextIvar(), ++FieldNo) { 16837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy = getOrCreateType(Field->getType(), Unit); 16847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FieldTy.isValid()) 16857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 16866537f083555f9606c495d05c562878aa49bae987Eric Christopher 16877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef FieldName = Field->getName(); 16887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore unnamed fields. 16907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FieldName.empty()) 16917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 16927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the location for the field. 16947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile FieldDefUnit = getOrCreateFile(Field->getLocation()); 16957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldLine = getLineNumber(Field->getLocation()); 16967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FType = Field->getType(); 16977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize = 0; 16987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign = 0; 16997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FType->isIncompleteArrayType()) { 17017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 17037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize = Field->isBitField() 1704d3003dc68535e94fe2501265d68a10aec429d7d0Eric Christopher ? Field->getBitWidthValue(CGM.getContext()) 1705d3003dc68535e94fe2501265d68a10aec429d7d0Eric Christopher : CGM.getContext().getTypeSize(FType); 17067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldAlign = CGM.getContext().getTypeAlign(FType); 17077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldOffset; 17107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CGM.getLangOpts().ObjCRuntime.isNonFragile()) { 17117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We don't know the runtime offset of an ivar if we're using the 17127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // non-fragile ABI. For bitfields, use the bit offset into the first 17137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // byte of storage of the bitfield. For other fields, use zero. 17147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Field->isBitField()) { 17157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = CGM.getObjCRuntime().ComputeBitfieldBitOffset( 17167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM, ID, Field); 17177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset %= CGM.getContext().getCharWidth(); 17187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 17197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 17207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 17227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = RL.getFieldOffset(FieldNo); 17237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 17267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Field->getAccessControl() == ObjCIvarDecl::Protected) 17277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags = llvm::DIDescriptor::FlagProtected; 17287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (Field->getAccessControl() == ObjCIvarDecl::Private) 17297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags = llvm::DIDescriptor::FlagPrivate; 17307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *PropertyNode = NULL; 17327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ObjCImplementationDecl *ImpD = ID->getImplementation()) { 17336537f083555f9606c495d05c562878aa49bae987Eric Christopher if (ObjCPropertyImplDecl *PImpD = 17347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ImpD->FindPropertyImplIvarDecl(Field->getIdentifier())) { 17357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ObjCPropertyDecl *PD = PImpD->getPropertyDecl()) { 1736be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher SourceLocation Loc = PD->getLocation(); 1737be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher llvm::DIFile PUnit = getOrCreateFile(Loc); 1738be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher unsigned PLine = getLineNumber(Loc); 17397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Getter = PD->getGetterMethodDecl(); 17407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Setter = PD->getSetterMethodDecl(); 17417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PropertyNode = 17427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createObjCProperty(PD->getName(), 17437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PUnit, PLine, 17445ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl hasDefaultGetterName(PD, Getter) ? "" : 17457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getSelectorName(PD->getGetterName()), 17465ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl hasDefaultSetterName(PD, Setter) ? "" : 17477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getSelectorName(PD->getSetterName()), 17487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PD->getPropertyAttributes(), 17497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(PD->getType(), PUnit)); 17507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldTy = DBuilder.createObjCIVar(FieldName, FieldDefUnit, 17547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldLine, FieldSize, FieldAlign, 17557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset, Flags, FieldTy, 17567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PropertyNode); 17577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(FieldTy); 17587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys); 1761f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher RealDecl.setTypeArray(Elements); 17624919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl 17634919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl // If the implementation is not yet set, we do not want to mark it 17644919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl // as complete. An implementation may declare additional 17654919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl // private ivars that we would miss otherwise. 17664919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl if (ID->getImplementation() == 0) 17674919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl CompletedTypeCache.erase(QualTy.getAsOpaquePtr()); 17686537f083555f9606c495d05c562878aa49bae987Eric Christopher 17697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 1770f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher return RealDecl; 17717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const VectorType *Ty, llvm::DIFile Unit) { 17747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType ElementTy = getOrCreateType(Ty->getElementType(), Unit); 17757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei int64_t Count = Ty->getNumElements(); 17767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Count == 0) 17777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If number of elements are not known then this is an unbounded array. 17787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use Count == -1 to express such arrays. 17797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Count = -1; 17807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *Subscript = DBuilder.getOrCreateSubrange(0, Count); 17827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray SubscriptArray = DBuilder.getOrCreateArray(Subscript); 17837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 17857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 17867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createVectorType(Size, Align, ElementTy, SubscriptArray); 17887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ArrayType *Ty, 17917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 17927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size; 17937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align; 17947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: make getTypeAlign() aware of VLAs and incomplete array types 17967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(Ty)) { 17977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = 0; 17987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = 17997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getContext().getTypeAlign(CGM.getContext().getBaseElementType(VAT)); 18007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Ty->isIncompleteArrayType()) { 18017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = 0; 18027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty->getElementType()->isIncompleteType()) 18037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = 0; 18047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 18057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = CGM.getContext().getTypeAlign(Ty->getElementType()); 1806089db2e3af0b6166a8e2253c453eccf551ddfbd8David Blaikie } else if (Ty->isIncompleteType()) { 18077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = 0; 18087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = 0; 18097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 18107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Size and align of the whole array, not the element type. 18117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = CGM.getContext().getTypeSize(Ty); 18127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = CGM.getContext().getTypeAlign(Ty); 18137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add the dimensions of the array. FIXME: This loses CV qualifiers from 18167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // interior arrays, do we care? Why aren't nested arrays represented the 18177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // obvious/recursive way? 18187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 8> Subscripts; 18197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType EltTy(Ty, 0); 18207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while ((Ty = dyn_cast<ArrayType>(EltTy))) { 18217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the number of elements is known, then count is that number. Otherwise, 18227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // it's -1. This allows us to represent a subrange with an array of 0 18237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // elements, like this: 18247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 18257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // struct foo { 18267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // int x[0]; 18277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // }; 18287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei int64_t Count = -1; // Count == -1 is an unbounded array. 18297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(Ty)) 18307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Count = CAT->getSize().getZExtValue(); 18316537f083555f9606c495d05c562878aa49bae987Eric Christopher 18327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Verify this is right for VLAs. 18337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Subscripts.push_back(DBuilder.getOrCreateSubrange(0, Count)); 18347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTy = Ty->getElementType(); 18357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray SubscriptArray = DBuilder.getOrCreateArray(Subscripts); 18387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18396537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIType DbgTy = 18407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createArrayType(Size, Align, getOrCreateType(EltTy, Unit), 18417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubscriptArray); 18427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 18437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18456537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DIType CGDebugInfo::CreateType(const LValueReferenceType *Ty, 18467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 18476537f083555f9606c495d05c562878aa49bae987Eric Christopher return CreatePointerLikeType(llvm::dwarf::DW_TAG_reference_type, 18487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty, Ty->getPointeeType(), Unit); 18497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18516537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DIType CGDebugInfo::CreateType(const RValueReferenceType *Ty, 18527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 18536537f083555f9606c495d05c562878aa49bae987Eric Christopher return CreatePointerLikeType(llvm::dwarf::DW_TAG_rvalue_reference_type, 18547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty, Ty->getPointeeType(), Unit); 18557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18576537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DIType CGDebugInfo::CreateType(const MemberPointerType *Ty, 18587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile U) { 1859e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie llvm::DIType ClassType = getOrCreateType(QualType(Ty->getClass(), 0), U); 1860e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie if (!Ty->getPointeeType()->isFunctionType()) 1861e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie return DBuilder.createMemberPointerType( 1862472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie getOrCreateType(Ty->getPointeeType(), U), ClassType); 1863e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie return DBuilder.createMemberPointerType(getOrCreateInstanceMethodType( 1864e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie CGM.getContext().getPointerType( 1865e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie QualType(Ty->getClass(), Ty->getPointeeType().getCVRQualifiers())), 1866e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie Ty->getPointeeType()->getAs<FunctionProtoType>(), U), 1867e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie ClassType); 18687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18706537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DIType CGDebugInfo::CreateType(const AtomicType *Ty, 18717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile U) { 18727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore the atomic wrapping 18737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: What is the correct representation? 18747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(Ty->getValueType(), U); 18757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateEnumType - get enumeration type. 18780a0be741f21e75556f649e7e4fcd30e905fc6e2eManman Renllvm::DIType CGDebugInfo::CreateEnumType(const EnumType *Ty) { 1879f332733e141905ccefe43e7fe65f9a8a4263a2f6Manman Ren const EnumDecl *ED = Ty->getDecl(); 18807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = 0; 18817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = 0; 18827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ED->getTypeForDecl()->isIncompleteType()) { 18837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = CGM.getContext().getTypeSize(ED->getTypeForDecl()); 18847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = CGM.getContext().getTypeAlign(ED->getTypeForDecl()); 18857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is just a forward declaration, construct an appropriately 18887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // marked node and just return it. 18897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ED->getDefinition()) { 18907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor EDContext; 18917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EDContext = getContextDescriptor(cast<Decl>(ED->getDeclContext())); 18927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(ED->getLocation()); 18937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(ED->getLocation()); 18947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef EDName = ED->getName(); 18957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_enumeration_type, 18967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EDName, EDContext, DefUnit, Line, 0, 189718760453868e9b831b8575ae64119b07ab4dcdf5Manman Ren Size, Align); 18987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create DIEnumerator elements for each enumerator. 19017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> Enumerators; 19027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ED = ED->getDefinition(); 19037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (EnumDecl::enumerator_iterator 19047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Enum = ED->enumerator_begin(), EnumEnd = ED->enumerator_end(); 19057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Enum != EnumEnd; ++Enum) { 19067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Enumerators.push_back( 19077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createEnumerator(Enum->getName(), 1908ac8f43c9cb71880ed3fa7f56a2a2429eafbd4625David Blaikie Enum->getInitVal().getSExtValue())); 19097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Return a CompositeType for the enum itself. 19127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray EltArray = DBuilder.getOrCreateArray(Enumerators); 19137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(ED->getLocation()); 19157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(ED->getLocation()); 19166537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIDescriptor EnumContext = 19177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(cast<Decl>(ED->getDeclContext())); 191859d6a71d681adfdc7d976492eeb3deae84e8f2e2Adrian Prantl llvm::DIType ClassTy = ED->isFixed() ? 19197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(ED->getIntegerType(), DefUnit) : llvm::DIType(); 19206537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIType DbgTy = 19217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createEnumerationType(EnumContext, ED->getName(), DefUnit, Line, 19227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size, Align, EltArray, 192318760453868e9b831b8575ae64119b07ab4dcdf5Manman Ren ClassTy); 19247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 19257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 19267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19274b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikiestatic QualType UnwrapTypeForDebugInfo(QualType T, const ASTContext &C) { 19284b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Qualifiers Quals; 19297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei do { 19304b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Quals += T.getLocalQualifiers(); 19317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType LastT = T; 19327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (T->getTypeClass()) { 19337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 19344b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie return C.getQualifiedType(T.getTypePtr(), Quals); 19357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TemplateSpecialization: 19367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<TemplateSpecializationType>(T)->desugar(); 19377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 19387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOfExpr: 19397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType(); 19407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 19417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOf: 19427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<TypeOfType>(T)->getUnderlyingType(); 19437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 19447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Decltype: 19457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<DecltypeType>(T)->getUnderlyingType(); 19467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 19477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::UnaryTransform: 19487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<UnaryTransformType>(T)->getUnderlyingType(); 19497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 19507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Attributed: 19517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<AttributedType>(T)->getEquivalentType(); 19527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 19537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Elaborated: 19547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<ElaboratedType>(T)->getNamedType(); 19557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 19567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Paren: 19577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<ParenType>(T)->getInnerType(); 19587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 19594b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie case Type::SubstTemplateTypeParm: 19607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<SubstTemplateTypeParmType>(T)->getReplacementType(); 19617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 19627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Auto: 1963912964863c344dd84976ee281bd213d0485645baDavid Blaikie QualType DT = cast<AutoType>(T)->getDeducedType(); 1964912964863c344dd84976ee281bd213d0485645baDavid Blaikie if (DT.isNull()) 1965912964863c344dd84976ee281bd213d0485645baDavid Blaikie return T; 1966912964863c344dd84976ee281bd213d0485645baDavid Blaikie T = DT; 19677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 19687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19696537f083555f9606c495d05c562878aa49bae987Eric Christopher 19707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(T != LastT && "Type unwrapping failed to unwrap!"); 1971d24c9ab90b42370bb417f44e001a0347ee1ca87eNAKAMURA Takumi (void)LastT; 19727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } while (true); 19737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 19747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1975f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher/// getType - Get the type from the cache or return null type if it doesn't 1976f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher/// exist. 19777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getTypeOrNull(QualType Ty) { 19787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Unwrap the type as needed for debug information. 19804b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext()); 19816537f083555f9606c495d05c562878aa49bae987Eric Christopher 19827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check for existing entry. 1983ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl if (Ty->getTypeClass() == Type::ObjCInterface) { 1984ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl llvm::Value *V = getCachedInterfaceTypeOrNull(Ty); 1985ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl if (V) 1986ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl return llvm::DIType(cast<llvm::MDNode>(V)); 1987ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl else return llvm::DIType(); 1988ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl } 1989ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 19907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<void *, llvm::WeakVH>::iterator it = 19917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeCache.find(Ty.getAsOpaquePtr()); 19927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (it != TypeCache.end()) { 19937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Verify that the debug info still exists. 19947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::Value *V = it->second) 19957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(cast<llvm::MDNode>(V)); 19967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 19997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getCompletedTypeOrNull - Get the type from the cache or return null if it 20027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// doesn't exist. 20037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getCompletedTypeOrNull(QualType Ty) { 20047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Unwrap the type as needed for debug information. 20064b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext()); 20077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check for existing entry. 20094919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl llvm::Value *V = 0; 20107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<void *, llvm::WeakVH>::iterator it = 20117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CompletedTypeCache.find(Ty.getAsOpaquePtr()); 20124919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl if (it != CompletedTypeCache.end()) 20134919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl V = it->second; 20144919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl else { 2015ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl V = getCachedInterfaceTypeOrNull(Ty); 20167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 20177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20184919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl // Verify that any cached debug info still exists. 201900383088ac262a998b83892056090622275d1992David Blaikie return llvm::DIType(cast_or_null<llvm::MDNode>(V)); 2020eab6a36cf1eed9a7fec0babd2206048e28dedd02David Blaikie} 20216bb110292c4e33a6ee2856cf91e0774107aa7d9cAdrian Prantl 2022ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl/// getCachedInterfaceTypeOrNull - Get the type from the interface 2023ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl/// cache, unless it needs to regenerated. Otherwise return null. 2024ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantlllvm::Value *CGDebugInfo::getCachedInterfaceTypeOrNull(QualType Ty) { 2025ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // Is there a cached interface that hasn't changed? 2026ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl llvm::DenseMap<void *, std::pair<llvm::WeakVH, unsigned > > 2027ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl ::iterator it1 = ObjCInterfaceCache.find(Ty.getAsOpaquePtr()); 2028ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 2029ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl if (it1 != ObjCInterfaceCache.end()) 2030ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl if (ObjCInterfaceDecl* Decl = getObjCInterfaceDecl(Ty)) 2031ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl if (Checksum(Decl) == it1->second.second) 2032ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // Return cached forward declaration. 2033ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl return it1->second.first; 2034ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 2035ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl return 0; 2036ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl} 20377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateType - Get the type from the cache or create a new 20397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// one if necessary. 2040472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikiellvm::DIType CGDebugInfo::getOrCreateType(QualType Ty, llvm::DIFile Unit) { 20417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty.isNull()) 20427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 20437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Unwrap the type as needed for debug information. 20454b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext()); 20467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2047472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie if (llvm::DIType T = getCompletedTypeOrNull(Ty)) 20487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 20497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise create the type. 2051472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie llvm::DIType Res = CreateTypeNode(Ty, Unit); 2052ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl void* TyPtr = Ty.getAsOpaquePtr(); 2053ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 2054ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // And update the type cache. 2055ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl TypeCache[TyPtr] = Res; 20567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2057492b1020a7f9e34591843768cdf89af0ad4a7024David Blaikie // FIXME: this getTypeOrNull call seems silly when we just inserted the type 2058492b1020a7f9e34591843768cdf89af0ad4a7024David Blaikie // into the cache - but getTypeOrNull has a special case for cached interface 2059492b1020a7f9e34591843768cdf89af0ad4a7024David Blaikie // types. We should probably just pull that out as a special case for the 2060492b1020a7f9e34591843768cdf89af0ad4a7024David Blaikie // "else" block below & skip the otherwise needless lookup. 20617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType TC = getTypeOrNull(Ty); 2062b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (TC && TC.isForwardDecl()) 2063ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl ReplaceMap.push_back(std::make_pair(TyPtr, static_cast<llvm::Value*>(TC))); 2064ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl else if (ObjCInterfaceDecl* Decl = getObjCInterfaceDecl(Ty)) { 2065ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // Interface types may have elements added to them by a 2066ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // subsequent implementation or extension, so we keep them in 2067ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // the ObjCInterfaceCache together with a checksum. Instead of 2068f06989b9f360e2b43cb1d94c317cc6e1826f7611Adrian Prantl // the (possibly) incomplete interface type, we return a forward 2069ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // declaration that gets RAUW'd in CGDebugInfo::finalize(). 2070e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie std::pair<llvm::WeakVH, unsigned> &V = ObjCInterfaceCache[TyPtr]; 2071e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie if (V.first) 2072e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie return llvm::DIType(cast<llvm::MDNode>(V.first)); 2073e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie TC = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 2074e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie Decl->getName(), TheCU, Unit, 2075e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie getLineNumber(Decl->getLocation()), 2076e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie TheCU.getLanguage()); 2077e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie // Store the forward declaration in the cache. 2078e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie V.first = TC; 2079e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie V.second = Checksum(Decl); 2080e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie 2081e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie // Register the type for replacement in finalize(). 2082e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie ReplaceMap.push_back(std::make_pair(TyPtr, static_cast<llvm::Value*>(TC))); 2083e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie 2084ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl return TC; 2085ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl } 20867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Res.isForwardDecl()) 2088ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl CompletedTypeCache[TyPtr] = Res; 20897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Res; 20917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2093b5a50075d810002c718711675aae067f92b80670Adrian Prantl/// Currently the checksum of an interface includes the number of 2094b5a50075d810002c718711675aae067f92b80670Adrian Prantl/// ivars and property accessors. 209556b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopherunsigned CGDebugInfo::Checksum(const ObjCInterfaceDecl *ID) { 20964f97f853357e2769db3d7999424e346ac5adb297Adrian Prantl // The assumption is that the number of ivars can only increase 20974f97f853357e2769db3d7999424e346ac5adb297Adrian Prantl // monotonically, so it is safe to just use their current number as 20984f97f853357e2769db3d7999424e346ac5adb297Adrian Prantl // a checksum. 2099b5a50075d810002c718711675aae067f92b80670Adrian Prantl unsigned Sum = 0; 2100b5a50075d810002c718711675aae067f92b80670Adrian Prantl for (const ObjCIvarDecl *Ivar = ID->all_declared_ivar_begin(); 2101b5a50075d810002c718711675aae067f92b80670Adrian Prantl Ivar != 0; Ivar = Ivar->getNextIvar()) 2102b5a50075d810002c718711675aae067f92b80670Adrian Prantl ++Sum; 2103b5a50075d810002c718711675aae067f92b80670Adrian Prantl 2104b5a50075d810002c718711675aae067f92b80670Adrian Prantl return Sum; 21054919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl} 21064919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl 21074919de6a53a007487c6d6b173921b5e7152a2004Adrian PrantlObjCInterfaceDecl *CGDebugInfo::getObjCInterfaceDecl(QualType Ty) { 21084919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl switch (Ty->getTypeClass()) { 21094919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl case Type::ObjCObjectPointer: 2110f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher return getObjCInterfaceDecl(cast<ObjCObjectPointerType>(Ty) 2111f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher ->getPointeeType()); 21124919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl case Type::ObjCInterface: 21134919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl return cast<ObjCInterfaceType>(Ty)->getDecl(); 21144919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl default: 21154919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl return 0; 21164919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl } 21174919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl} 21184919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl 21197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateTypeNode - Create a new debug type node. 2120472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikiellvm::DIType CGDebugInfo::CreateTypeNode(QualType Ty, llvm::DIFile Unit) { 21217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Handle qualifiers, which recursively handles what they refer to. 21227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty.hasLocalQualifiers()) 2123472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie return CreateQualifiedType(Ty, Unit); 21247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const char *Diag = 0; 21266537f083555f9606c495d05c562878aa49bae987Eric Christopher 21277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Work out details of type. 21287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Ty->getTypeClass()) { 21297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define TYPE(Class, Base) 21307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define ABSTRACT_TYPE(Class, Base) 21317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define NON_CANONICAL_TYPE(Class, Base) 21327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define DEPENDENT_TYPE(Class, Base) case Type::Class: 21337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/TypeNodes.def" 21347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Dependent types cannot show up in debug information"); 21357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ExtVector: 21377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Vector: 21387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<VectorType>(Ty), Unit); 21397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCObjectPointer: 21407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ObjCObjectPointerType>(Ty), Unit); 21417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCObject: 21427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ObjCObjectType>(Ty), Unit); 21437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCInterface: 21447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ObjCInterfaceType>(Ty), Unit); 21457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Builtin: 21467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<BuiltinType>(Ty)); 21477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Complex: 21487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ComplexType>(Ty)); 21497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Pointer: 21507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<PointerType>(Ty), Unit); 215112df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner case Type::Decayed: 215212df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner // Decayed types are just pointers in LLVM and DWARF. 215312df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner return CreateType( 215412df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner cast<PointerType>(cast<DecayedType>(Ty)->getDecayedType()), Unit); 21557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::BlockPointer: 21567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<BlockPointerType>(Ty), Unit); 21577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Typedef: 2158472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie return CreateType(cast<TypedefType>(Ty), Unit); 21597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Record: 2160472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie return CreateType(cast<RecordType>(Ty)); 21617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Enum: 2162f332733e141905ccefe43e7fe65f9a8a4263a2f6Manman Ren return CreateEnumType(cast<EnumType>(Ty)); 21637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::FunctionProto: 21647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::FunctionNoProto: 21657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<FunctionType>(Ty), Unit); 21667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ConstantArray: 21677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::VariableArray: 21687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::IncompleteArray: 21697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ArrayType>(Ty), Unit); 21707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::LValueReference: 21727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<LValueReferenceType>(Ty), Unit); 21737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::RValueReference: 21747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<RValueReferenceType>(Ty), Unit); 21757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::MemberPointer: 21777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<MemberPointerType>(Ty), Unit); 21787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Atomic: 21807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<AtomicType>(Ty), Unit); 21817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Attributed: 21837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TemplateSpecialization: 21847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Elaborated: 21857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Paren: 21867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::SubstTemplateTypeParm: 21877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOfExpr: 21887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOf: 21897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Decltype: 21907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::UnaryTransform: 2191226399ce18cdcbb1e83af7c5e644bdabb9d4f2f8David Blaikie case Type::PackExpansion: 21927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("type should have been unwrapped!"); 2193912964863c344dd84976ee281bd213d0485645baDavid Blaikie case Type::Auto: 2194912964863c344dd84976ee281bd213d0485645baDavid Blaikie Diag = "auto"; 2195912964863c344dd84976ee281bd213d0485645baDavid Blaikie break; 21967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 21976537f083555f9606c495d05c562878aa49bae987Eric Christopher 21987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Diag && "Fall through without a diagnostic?"); 21997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DiagID = CGM.getDiags().getCustomDiagID(DiagnosticsEngine::Error, 22007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "debug information for %0 is not yet supported"); 22017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getDiags().Report(DiagID) 22027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << Diag; 22037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 22047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 22057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateLimitedType - Get the type from the cache or create a new 22077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// limited type if necessary. 22084a0771680ee2fa8e76e1c0d54eaf69f459daf424David Blaikiellvm::DIType CGDebugInfo::getOrCreateLimitedType(const RecordType *Ty, 2209be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher llvm::DIFile Unit) { 22104a0771680ee2fa8e76e1c0d54eaf69f459daf424David Blaikie QualType QTy(Ty, 0); 22117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2212eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie llvm::DICompositeType T(getTypeOrNull(QTy)); 22137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We may have cached a forward decl when we could have created 22157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // a non-forward decl. Go ahead and create a non-forward decl 22167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // now. 2217b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (T && !T.isForwardDecl()) return T; 22187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise create the type. 2220eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie llvm::DICompositeType Res = CreateLimitedType(Ty); 2221eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie 2222eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie // Propagate members from the declaration to the definition 2223eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie // CreateType(const RecordType*) will overwrite this with the members in the 2224eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie // correct order if the full type is needed. 2225eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie Res.setTypeArray(T.getTypeArray()); 22267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2227b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (T && T.isForwardDecl()) 22284a0771680ee2fa8e76e1c0d54eaf69f459daf424David Blaikie ReplaceMap.push_back( 22294a0771680ee2fa8e76e1c0d54eaf69f459daf424David Blaikie std::make_pair(QTy.getAsOpaquePtr(), static_cast<llvm::Value *>(T))); 22307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // And update the type cache. 22324a0771680ee2fa8e76e1c0d54eaf69f459daf424David Blaikie TypeCache[QTy.getAsOpaquePtr()] = Res; 22337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Res; 22347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 22357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// TODO: Currently used for context chains when limiting debug info. 2237eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikiellvm::DICompositeType CGDebugInfo::CreateLimitedType(const RecordType *Ty) { 22387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordDecl *RD = Ty->getDecl(); 22396537f083555f9606c495d05c562878aa49bae987Eric Christopher 22407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the record type for the debug info. 22417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); 22427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(RD->getLocation()); 22437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef RDName = getClassName(RD); 22447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor RDContext; 224613c976710415041fca5aba25cc02d3813c74b990Eric Christopher if (DebugKind == CodeGenOptions::LimitedDebugInfo) 22477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RDContext = createContextChain(cast<Decl>(RD->getDeclContext())); 22487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 22497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RDContext = getContextDescriptor(cast<Decl>(RD->getDeclContext())); 22507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2251c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie // If we ended up creating the type during the context chain construction, 2252c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie // just return that. 2253c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie // FIXME: this could be dealt with better if the type was recorded as 2254c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie // completed before we started this (see the CompletedTypeCache usage in 2255c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie // CGDebugInfo::CreateTypeDefinition(const RecordType*) - that would need to 2256c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie // be pushed to before context creation, but after it was known to be 2257c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie // destined for completion (might still have an issue if this caller only 2258c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie // required a declaration but the context construction ended up creating a 2259c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie // definition) 2260eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie llvm::DICompositeType T(getTypeOrNull(CGM.getContext().getRecordType(RD))); 2261eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie if (T && (!T.isForwardDecl() || !RD->getDefinition())) 2262c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie return T; 2263c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie 22647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is just a forward declaration, construct an appropriately 22657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // marked node and just return it. 22667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!RD->getDefinition()) 2267f332733e141905ccefe43e7fe65f9a8a4263a2f6Manman Ren return getOrCreateRecordFwdDecl(Ty, RDContext); 22687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 22707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 22712fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie llvm::DICompositeType RealDecl; 22726537f083555f9606c495d05c562878aa49bae987Eric Christopher 22737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RD->isUnion()) 22747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RealDecl = DBuilder.createUnionType(RDContext, RDName, DefUnit, Line, 227518760453868e9b831b8575ae64119b07ab4dcdf5Manman Ren Size, Align, 0, llvm::DIArray()); 22767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (RD->isClass()) { 22777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: This could be a struct type giving a default visibility different 22787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // than C++ class type, but needs llvm metadata changes first. 22797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RealDecl = DBuilder.createClassType(RDContext, RDName, DefUnit, Line, 2280be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher Size, Align, 0, 0, llvm::DIType(), 2281be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher llvm::DIArray(), llvm::DIType(), 228218760453868e9b831b8575ae64119b07ab4dcdf5Manman Ren llvm::DIArray()); 22837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else 22847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RealDecl = DBuilder.createStructType(RDContext, RDName, DefUnit, Line, 2285f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher Size, Align, 0, llvm::DIType(), 228618760453868e9b831b8575ae64119b07ab4dcdf5Manman Ren llvm::DIArray()); 22877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[Ty->getDecl()] = llvm::WeakVH(RealDecl); 22892fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = RealDecl; 22907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2291498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie if (const ClassTemplateSpecializationDecl *TSpecial = 2292498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie dyn_cast<ClassTemplateSpecializationDecl>(RD)) 2293498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie RealDecl.setTypeArray(llvm::DIArray(), 2294498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie CollectCXXTemplateParams(TSpecial, DefUnit)); 2295fab829d611ed0ef6c93bd2ab1a28c10501beafcbDavid Blaikie return RealDecl; 22967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 22977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2298498298d9d7b20fd67e270711b1a815dc6962d883David Blaikievoid CGDebugInfo::CollectContainingType(const CXXRecordDecl *RD, 2299498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie llvm::DICompositeType RealDecl) { 2300498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie // A class's primary base or the class itself contains the vtable. 2301498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie llvm::DICompositeType ContainingType; 2302498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 2303498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie if (const CXXRecordDecl *PBase = RL.getPrimaryBase()) { 2304498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie // Seek non virtual primary base root. 2305498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie while (1) { 2306498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie const ASTRecordLayout &BRL = CGM.getContext().getASTRecordLayout(PBase); 2307498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie const CXXRecordDecl *PBT = BRL.getPrimaryBase(); 2308498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie if (PBT && !BRL.isPrimaryBaseVirtual()) 2309498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie PBase = PBT; 2310498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie else 2311498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie break; 2312498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie } 2313498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie ContainingType = llvm::DICompositeType( 2314498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie getOrCreateType(QualType(PBase->getTypeForDecl(), 0), 2315498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie getOrCreateFile(RD->getLocation()))); 2316498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie } else if (RD->isDynamicClass()) 2317498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie ContainingType = RealDecl; 2318498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie 2319498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie RealDecl.setContainingType(ContainingType); 2320498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie} 2321498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie 23227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateMemberType - Create new member and increase Offset by FType's size. 23237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateMemberType(llvm::DIFile Unit, QualType FType, 23247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name, 23257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t *Offset) { 23267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy = CGDebugInfo::getOrCreateType(FType, Unit); 23277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize = CGM.getContext().getTypeSize(FType); 23287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign = CGM.getContext().getTypeAlign(FType); 23297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty = DBuilder.createMemberType(Unit, Name, Unit, 0, 23307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize, FieldAlign, 23317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *Offset, 0, FieldTy); 23327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *Offset += FieldSize; 23337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Ty; 23347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 23357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23369faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikiellvm::DIDescriptor CGDebugInfo::getDeclarationOrDefinition(const Decl *D) { 23379faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // We only need a declaration (not a definition) of the type - so use whatever 23389faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // we would otherwise do to get a type for a pointee. (forward declarations in 23399faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // limited debug info, full definitions (if the type definition is available) 23409faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // in unlimited debug info) 2341b3c2377422e820ab9d95145ab67a2fb9f9f4bf3fDavid Blaikie if (const TypeDecl *TD = dyn_cast<TypeDecl>(D)) 2342b3c2377422e820ab9d95145ab67a2fb9f9f4bf3fDavid Blaikie return getOrCreateType(CGM.getContext().getTypeDeclType(TD), 2343472519660a3b88f5bbde8e5ba13772c903a5034eDavid Blaikie getOrCreateFile(TD->getLocation())); 23449faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // Otherwise fall back to a fairly rudimentary cache of existing declarations. 23459faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // This doesn't handle providing declarations (for functions or variables) for 23469faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // entities without definitions in this TU, nor when the definition proceeds 23479faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // the call to this function. 23489faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // FIXME: This should be split out into more specific maps with support for 23499faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // emitting forward declarations and merging definitions with declarations, 23509faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // the same way as we do for types. 23519faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator I = 23529faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie DeclCache.find(D->getCanonicalDecl()); 23539faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (I == DeclCache.end()) 23549faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return llvm::DIDescriptor(); 23559faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie llvm::Value *V = I->second; 23569faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return llvm::DIDescriptor(dyn_cast_or_null<llvm::MDNode>(V)); 23579faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie} 23589faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie 23597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getFunctionDeclaration - Return debug info descriptor to describe method 23607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// declaration for the given method definition. 23617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DISubprogram CGDebugInfo::getFunctionDeclaration(const Decl *D) { 236223e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie if (!D || DebugKind == CodeGenOptions::DebugLineTablesOnly) 236323e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie return llvm::DISubprogram(); 236423e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie 23657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FunctionDecl *FD = dyn_cast<FunctionDecl>(D); 23667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FD) return llvm::DISubprogram(); 23677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Setup context. 2369d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie llvm::DIScope S = getContextDescriptor(cast<Decl>(D->getDeclContext())); 23707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator 23727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MI = SPCache.find(FD->getCanonicalDecl()); 2373d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie if (MI == SPCache.end()) { 2374ac7c25f0cab42a34d6e6acba7afff729caf0258eEric Christopher if (const CXXMethodDecl *MD = 2375ac7c25f0cab42a34d6e6acba7afff729caf0258eEric Christopher dyn_cast<CXXMethodDecl>(FD->getCanonicalDecl())) { 2376d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie llvm::DICompositeType T(S); 2377ac7c25f0cab42a34d6e6acba7afff729caf0258eEric Christopher llvm::DISubprogram SP = 2378ac7c25f0cab42a34d6e6acba7afff729caf0258eEric Christopher CreateCXXMemberFunction(MD, getOrCreateFile(MD->getLocation()), T); 2379d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie T.addMember(SP); 2380d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie return SP; 2381d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie } 2382d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie } 23837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MI != SPCache.end()) { 23847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = MI->second; 23857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DISubprogram SP(dyn_cast_or_null<llvm::MDNode>(V)); 238623e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie if (SP.isSubprogram() && !SP.isDefinition()) 23877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SP; 23887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (FunctionDecl::redecl_iterator I = FD->redecls_begin(), 23917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = FD->redecls_end(); I != E; ++I) { 23927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FunctionDecl *NextFD = *I; 23937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator 23947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MI = SPCache.find(NextFD->getCanonicalDecl()); 23957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MI != SPCache.end()) { 23967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = MI->second; 23977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DISubprogram SP(dyn_cast_or_null<llvm::MDNode>(V)); 239823e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie if (SP.isSubprogram() && !SP.isDefinition()) 23997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SP; 24007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DISubprogram(); 24037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// getOrCreateFunctionType - Construct DIType. If it is a c++ method, include 24067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// implicit parameter "this". 24079a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikiellvm::DICompositeType CGDebugInfo::getOrCreateFunctionType(const Decl *D, 24089a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie QualType FnType, 24099a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie llvm::DIFile F) { 241023e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie if (!D || DebugKind == CodeGenOptions::DebugLineTablesOnly) 241123e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie // Create fake but valid subroutine type. Otherwise 241223e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie // llvm::DISubprogram::Verify() would return false, and 241323e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie // subprogram DIE will miss DW_AT_decl_file and 241423e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie // DW_AT_decl_line fields. 241523e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie return DBuilder.createSubroutineType(F, DBuilder.getOrCreateArray(None)); 24167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) 24187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateMethodType(Method, F); 24197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const ObjCMethodDecl *OMethod = dyn_cast<ObjCMethodDecl>(D)) { 24207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add "self" and "_cmd" 24217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> Elts; 24227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // First element is always return type. For 'void' functions it is NULL. 24240cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl QualType ResultTy = OMethod->getResultType(); 24250cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl 24260cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl // Replace the instancetype keyword with the actual type. 24270cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl if (ResultTy == CGM.getContext().getObjCInstanceType()) 24280cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl ResultTy = CGM.getContext().getPointerType( 24290cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl QualType(OMethod->getClassInterface()->getTypeForDecl(), 0)); 24300cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl 2431566a9c3680d9960bb0eb6acf33507251cc13a8d8Adrian Prantl Elts.push_back(getOrCreateType(ResultTy, F)); 24327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // "self" pointer is always first argument. 2433e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl QualType SelfDeclTy = OMethod->getSelfDecl()->getType(); 2434e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl llvm::DIType SelfTy = getOrCreateType(SelfDeclTy, F); 2435e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl Elts.push_back(CreateSelfType(SelfDeclTy, SelfTy)); 24367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // "_cmd" pointer is always second argument. 24377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType CmdTy = getOrCreateType(OMethod->getCmdDecl()->getType(), F); 24387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elts.push_back(DBuilder.createArtificialType(CmdTy)); 24397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get rest of the arguments. 24406537f083555f9606c495d05c562878aa49bae987Eric Christopher for (ObjCMethodDecl::param_const_iterator PI = OMethod->param_begin(), 24417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PE = OMethod->param_end(); PI != PE; ++PI) 24427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elts.push_back(getOrCreateType((*PI)->getType(), F)); 24437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(Elts); 24457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createSubroutineType(F, EltTypeArray); 24467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24479a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie return llvm::DICompositeType(getOrCreateType(FnType, F)); 24487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitFunctionStart - Constructs the debug code for entering a function. 24517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitFunctionStart(GlobalDecl GD, QualType FnType, 24527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Function *Fn, 24537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 24547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name; 24567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef LinkageName; 24577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FnBeginRegionCount.push_back(LexicalBlockStack.size()); 24597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Decl *D = GD.getDecl(); 24617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Function may lack declaration in source code if it is created by Clang 24627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // CodeGen (examples: _GLOBAL__I_a, __cxx_global_array_dtor, thunk). 24637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool HasDecl = (D != 0); 24647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use the location of the declaration. 24657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc; 24667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (HasDecl) 24677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Loc = D->getLocation(); 24687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 24707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(Loc); 24717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor FDContext(Unit); 24727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray TParamsArray; 24737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!HasDecl) { 24747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use llvm function name. 2475c7971a9efdf9880448a69aabb5182c3c27eecf6dDavid Blaikie LinkageName = Fn->getName(); 24767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 24777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there is a DISubprogram for this function available then use it. 24787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator 24797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FI = SPCache.find(FD->getCanonicalDecl()); 24807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FI != SPCache.end()) { 24817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = FI->second; 24827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor SP(dyn_cast_or_null<llvm::MDNode>(V)); 24837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SP.isSubprogram() && llvm::DISubprogram(SP).isDefinition()) { 24847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *SPN = SP; 24857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(SPN); 24867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[D] = llvm::WeakVH(SP); 24877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 24887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = getFunctionName(FD); 2491f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky // Use mangled name as linkage name for C/C++ functions. 24927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FD->hasPrototype()) { 24937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LinkageName = CGM.getMangledName(GD); 24947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrototyped; 24957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2496f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky // No need to replicate the linkage name if it isn't different from the 2497f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky // subprogram name, no need to have it at all unless coverage is enabled or 2498f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky // debug is set to more than just line tables. 24997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LinkageName == Name || 2500f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky (!CGM.getCodeGenOpts().EmitGcovArcs && 2501f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky !CGM.getCodeGenOpts().EmitGcovNotes && 250213c976710415041fca5aba25cc02d3813c74b990Eric Christopher DebugKind <= CodeGenOptions::DebugLineTablesOnly)) 25037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LinkageName = StringRef(); 25047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 250513c976710415041fca5aba25cc02d3813c74b990Eric Christopher if (DebugKind >= CodeGenOptions::LimitedDebugInfo) { 25067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const NamespaceDecl *NSDecl = 25077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast_or_null<NamespaceDecl>(FD->getDeclContext())) 25087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FDContext = getOrCreateNameSpace(NSDecl); 25097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (const RecordDecl *RDecl = 25107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast_or_null<RecordDecl>(FD->getDeclContext())) 25117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FDContext = getContextDescriptor(cast<Decl>(RDecl->getDeclContext())); 25127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Collect template parameters. 25147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TParamsArray = CollectFunctionTemplateParams(FD, Unit); 25157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D)) { 25177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = getObjCMethodName(OMD); 25187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrototyped; 25197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 25207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use llvm function name. 25217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = Fn->getName(); 25227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrototyped; 25237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Name.empty() && Name[0] == '\01') 25257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = Name.substr(1); 25267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(Loc); 25287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!HasDecl || D->isImplicit()) 25297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagArtificial; 25307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 253123e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie llvm::DISubprogram SP = DBuilder.createFunction( 253223e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie FDContext, Name, LinkageName, Unit, LineNo, 253323e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie getOrCreateFunctionType(D, FnType, Unit), Fn->hasInternalLinkage(), 253423e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie true /*definition*/, getLineNumber(CurLoc), Flags, 253523e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie CGM.getLangOpts().Optimize, Fn, TParamsArray, getFunctionDeclaration(D)); 25369faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (HasDecl) 25379faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie DeclCache.insert(std::make_pair(D->getCanonicalDecl(), llvm::WeakVH(SP))); 25387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Push function on region stack. 25407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *SPN = SP; 25417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(SPN); 25427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (HasDecl) 25437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[D] = llvm::WeakVH(SP); 25447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 25457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitLocation - Emit metadata to indicate a change in line/column 254718a0cd5ef787db1b6849b962f67a5a8ed3c49be3Adrian Prantl/// information in the source file. If the location is invalid, the 254818a0cd5ef787db1b6849b962f67a5a8ed3c49be3Adrian Prantl/// previous location will be reused. 254900df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantlvoid CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc, 255000df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl bool ForceColumnInfo) { 25517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Update our current location 25527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei setLocation(Loc); 25537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CurLoc.isInvalid() || CurLoc.isMacroID()) return; 25557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Don't bother if things are the same as last time. 25577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 25587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CurLoc == PrevLoc || 25597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SM.getExpansionLoc(CurLoc) == SM.getExpansionLoc(PrevLoc)) 25607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // New Builder may not be in sync with CGDebugInfo. 25610a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikie if (!Builder.getCurrentDebugLocation().isUnknown() && 25620a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikie Builder.getCurrentDebugLocation().getScope(CGM.getLLVMContext()) == 25630a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikie LexicalBlockStack.back()) 25647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 25656537f083555f9606c495d05c562878aa49bae987Eric Christopher 25667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Update last state. 25677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PrevLoc = CurLoc; 25687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *Scope = LexicalBlockStack.back(); 257000df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl Builder.SetCurrentDebugLocation(llvm::DebugLoc::get 257100df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl (getLineNumber(CurLoc), 257200df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl getColumnNumber(CurLoc, ForceColumnInfo), 257300df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl Scope)); 25747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 25757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateLexicalBlock - Creates a new lexical block node and pushes it on 25777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// the stack. 25787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::CreateLexicalBlock(SourceLocation Loc) { 25797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor D = 25807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createLexicalBlock(LexicalBlockStack.empty() ? 25817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor() : 25827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor(LexicalBlockStack.back()), 25837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateFile(CurLoc), 25847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getLineNumber(CurLoc), 25857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getColumnNumber(CurLoc)); 25867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *DN = D; 25877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(DN); 25887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 25897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitLexicalBlockStart - Constructs the debug code for entering a declarative 25917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// region - beginning of a DW_TAG_lexical_block. 2592f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christophervoid CGDebugInfo::EmitLexicalBlockStart(CGBuilderTy &Builder, 2593f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher SourceLocation Loc) { 25947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Set our current location. 25957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei setLocation(Loc); 25967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create a new lexical block and push it on the stack. 25987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CreateLexicalBlock(Loc); 25997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Emit a line table change for the current location inside the new scope. 26017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Builder.SetCurrentDebugLocation(llvm::DebugLoc::get(getLineNumber(Loc), 26027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getColumnNumber(Loc), 26037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.back())); 26047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 26057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitLexicalBlockEnd - Constructs the debug code for exiting a declarative 26077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// region - end of a DW_TAG_lexical_block. 2608f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christophervoid CGDebugInfo::EmitLexicalBlockEnd(CGBuilderTy &Builder, 2609f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher SourceLocation Loc) { 26107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 26117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Provide an entry in the line table for the end of the block. 26137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitLocation(Builder, Loc); 26147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 26167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 26177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitFunctionEnd - Constructs the debug code for exiting a function. 26197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitFunctionEnd(CGBuilderTy &Builder) { 26207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 26217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RCount = FnBeginRegionCount.back(); 26227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(RCount <= LexicalBlockStack.size() && "Region stack mismatch"); 26237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Pop all regions for this function. 26257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (LexicalBlockStack.size() != RCount) 26267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitLexicalBlockEnd(Builder, CurLoc); 26277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FnBeginRegionCount.pop_back(); 26287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 26297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26306537f083555f9606c495d05c562878aa49bae987Eric Christopher// EmitTypeForVarWithBlocksAttr - Build up structure info for the byref. 26317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// See BuildByRefType. 26327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::EmitTypeForVarWithBlocksAttr(const VarDecl *VD, 26337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t *XOffset) { 26347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 5> EltTys; 26367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FType; 26377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize, FieldOffset; 26387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign; 26396537f083555f9606c495d05c562878aa49bae987Eric Christopher 26407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 26416537f083555f9606c495d05c562878aa49bae987Eric Christopher QualType Type = VD->getType(); 26427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 26447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 26457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset)); 26467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__forwarding", &FieldOffset)); 26477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().IntTy; 26487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset)); 26497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__size", &FieldOffset)); 26507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool HasCopyAndDispose = CGM.getContext().BlockRequiresCopying(Type, VD); 26527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (HasCopyAndDispose) { 26537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 26547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__copy_helper", 26557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei &FieldOffset)); 26567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__destroy_helper", 26577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei &FieldOffset)); 26587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool HasByrefExtendedLayout; 26607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qualifiers::ObjCLifetime Lifetime; 26617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CGM.getContext().getByrefLifetime(Type, 26627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Lifetime, HasByrefExtendedLayout) 26631f4379184ee07217183d11acf142ea6fe0d487a0Adrian Prantl && HasByrefExtendedLayout) { 26641f4379184ee07217183d11acf142ea6fe0d487a0Adrian Prantl FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 26657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, 26667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "__byref_variable_layout", 26677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei &FieldOffset)); 26681f4379184ee07217183d11acf142ea6fe0d487a0Adrian Prantl } 26696537f083555f9606c495d05c562878aa49bae987Eric Christopher 26707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits Align = CGM.getContext().getDeclAlign(VD); 26717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Align > CGM.getContext().toCharUnitsFromBits( 267264aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall CGM.getTarget().getPointerAlign(0))) { 26736537f083555f9606c495d05c562878aa49bae987Eric Christopher CharUnits FieldOffsetInBytes 26747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = CGM.getContext().toCharUnitsFromBits(FieldOffset); 26757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits AlignedOffsetInBytes 26767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = FieldOffsetInBytes.RoundUpToAlignment(Align); 26777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits NumPaddingBytes 26787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = AlignedOffsetInBytes - FieldOffsetInBytes; 26796537f083555f9606c495d05c562878aa49bae987Eric Christopher 26807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NumPaddingBytes.isPositive()) { 26817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APInt pad(32, NumPaddingBytes.getQuantity()); 26827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getConstantArrayType(CGM.getContext().CharTy, 26837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei pad, ArrayType::Normal, 0); 26847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "", &FieldOffset)); 26857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26876537f083555f9606c495d05c562878aa49bae987Eric Christopher 26887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = Type; 26897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy = CGDebugInfo::getOrCreateType(FType, Unit); 26907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize = CGM.getContext().getTypeSize(FType); 26917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldAlign = CGM.getContext().toBits(Align); 26927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26936537f083555f9606c495d05c562878aa49bae987Eric Christopher *XOffset = FieldOffset; 26947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldTy = DBuilder.createMemberType(Unit, VD->getName(), Unit, 26957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 0, FieldSize, FieldAlign, 26967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset, 0, FieldTy); 26977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(FieldTy); 26987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset += FieldSize; 26996537f083555f9606c495d05c562878aa49bae987Eric Christopher 27007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys); 27016537f083555f9606c495d05c562878aa49bae987Eric Christopher 27027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = llvm::DIDescriptor::FlagBlockByrefStruct; 27036537f083555f9606c495d05c562878aa49bae987Eric Christopher 27047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createStructType(Unit, "", Unit, 0, FieldOffset, 0, Flags, 2705c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie llvm::DIType(), Elements); 27067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 27077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitDeclare - Emit local variable declaration debug info. 27097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclare(const VarDecl *VD, unsigned Tag, 27106537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::Value *Storage, 27117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ArgNo, CGBuilderTy &Builder) { 271213c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 27137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 27147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2715fc946271e008544b518321fdecc77ca076663c12David Blaikie bool Unwritten = 2716fc946271e008544b518321fdecc77ca076663c12David Blaikie VD->isImplicit() || (isa<Decl>(VD->getDeclContext()) && 2717fc946271e008544b518321fdecc77ca076663c12David Blaikie cast<Decl>(VD->getDeclContext())->isImplicit()); 2718fc946271e008544b518321fdecc77ca076663c12David Blaikie llvm::DIFile Unit; 2719fc946271e008544b518321fdecc77ca076663c12David Blaikie if (!Unwritten) 2720fc946271e008544b518321fdecc77ca076663c12David Blaikie Unit = getOrCreateFile(VD->getLocation()); 27217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty; 27227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t XOffset = 0; 27237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VD->hasAttr<BlocksAttr>()) 27247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset); 27256537f083555f9606c495d05c562878aa49bae987Eric Christopher else 27267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = getOrCreateType(VD->getType(), Unit); 27277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there is no debug info for this type then do not emit debug info 27297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // for this variable. 27307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Ty) 27317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 27327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get location information. 2734fc946271e008544b518321fdecc77ca076663c12David Blaikie unsigned Line = 0; 2735fc946271e008544b518321fdecc77ca076663c12David Blaikie unsigned Column = 0; 2736fc946271e008544b518321fdecc77ca076663c12David Blaikie if (!Unwritten) { 2737fc946271e008544b518321fdecc77ca076663c12David Blaikie Line = getLineNumber(VD->getLocation()); 2738fc946271e008544b518321fdecc77ca076663c12David Blaikie Column = getColumnNumber(VD->getLocation()); 2739fc946271e008544b518321fdecc77ca076663c12David Blaikie } 27407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 27417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VD->isImplicit()) 27427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagArtificial; 27437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is the first argument and it is implicit then 27447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // give it an object pointer flag. 27457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: There has to be a better way to do this, but for static 27467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // functions there won't be an implicit param at arg1 and 27477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // otherwise it is 'self' or 'this'. 27487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<ImplicitParamDecl>(VD) && ArgNo == 1) 27497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagObjectPointer; 275041c9baed95a1e7974e6cccf7b4120fd1866ff125David Blaikie if (llvm::Argument *Arg = dyn_cast<llvm::Argument>(Storage)) 27517dab97b5af44556453c13cf877e02b8ea4c6c1cfEric Christopher if (Arg->getType()->isPointerTy() && !Arg->hasByValAttr() && 27527dab97b5af44556453c13cf877e02b8ea4c6c1cfEric Christopher !VD->getType()->isPointerType()) 275341c9baed95a1e7974e6cccf7b4120fd1866ff125David Blaikie Flags |= llvm::DIDescriptor::FlagIndirectVariable; 27547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *Scope = LexicalBlockStack.back(); 27567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = VD->getName(); 27587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Name.empty()) { 27597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VD->hasAttr<BlocksAttr>()) { 27607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits offset = CharUnits::fromQuantity(32); 27617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 9> addr; 27627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Type *Int64Ty = CGM.Int64Ty; 27637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 27647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of __forwarding field 27657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext().toCharUnitsFromBits( 276664aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall CGM.getTarget().getPointerWidth(0)); 27677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 27687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpDeref)); 27697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 27707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of x field 27717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext().toCharUnitsFromBits(XOffset); 27727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 27737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the variable. 27757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIVariable D = 27766537f083555f9606c495d05c562878aa49bae987Eric Christopher DBuilder.createComplexVariable(Tag, 27777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor(Scope), 27787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VD->getName(), Unit, Line, Ty, 27797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr, ArgNo); 27806537f083555f9606c495d05c562878aa49bae987Eric Christopher 27817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Insert an llvm.dbg.declare into the current block. 27827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Instruction *Call = 27837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.insertDeclare(Storage, D, Builder.GetInsertBlock()); 27847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); 27857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 27867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2787436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie } else if (const RecordType *RT = dyn_cast<RecordType>(VD->getType())) { 2788436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // If VD is an anonymous union then Storage represents value for 2789436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // all union fields. 27907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordDecl *RD = cast<RecordDecl>(RT->getDecl()); 2791d8180cf9877cd793949ae94edbf2ee84341041c5David Blaikie if (RD->isUnion() && RD->isAnonymousStructOrUnion()) { 27927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (RecordDecl::field_iterator I = RD->field_begin(), 27937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = RD->field_end(); 27947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I != E; ++I) { 27957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldDecl *Field = *I; 27967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy = getOrCreateType(Field->getType(), Unit); 27977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef FieldName = Field->getName(); 27986537f083555f9606c495d05c562878aa49bae987Eric Christopher 27997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore unnamed fields. Do not ignore unnamed records. 28007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FieldName.empty() && !isa<RecordType>(Field->getType())) 28017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 28026537f083555f9606c495d05c562878aa49bae987Eric Christopher 28037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use VarDecl's Tag, Scope and Line number. 28047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIVariable D = 28057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createLocalVariable(Tag, llvm::DIDescriptor(Scope), 28066537f083555f9606c495d05c562878aa49bae987Eric Christopher FieldName, Unit, Line, FieldTy, 28077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getLangOpts().Optimize, Flags, 28087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArgNo); 28096537f083555f9606c495d05c562878aa49bae987Eric Christopher 28107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Insert an llvm.dbg.declare into the current block. 28117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Instruction *Call = 28127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.insertDeclare(Storage, D, Builder.GetInsertBlock()); 28137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); 28147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2815d8180cf9877cd793949ae94edbf2ee84341041c5David Blaikie return; 28167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2818436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie 2819436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // Create the descriptor for the variable. 2820436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie llvm::DIVariable D = 2821436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie DBuilder.createLocalVariable(Tag, llvm::DIDescriptor(Scope), 2822436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie Name, Unit, Line, Ty, 2823436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie CGM.getLangOpts().Optimize, Flags, ArgNo); 2824436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie 2825436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // Insert an llvm.dbg.declare into the current block. 2826436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie llvm::Instruction *Call = 2827436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie DBuilder.insertDeclare(Storage, D, Builder.GetInsertBlock()); 2828436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); 28297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 28307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfAutoVariable(const VarDecl *VD, 28327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *Storage, 28337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 283413c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 28357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitDeclare(VD, llvm::dwarf::DW_TAG_auto_variable, Storage, 0, Builder); 28367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 28377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2838e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// Look up the completed type for a self pointer in the TypeCache and 2839e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// create a copy of it with the ObjectPointer and Artificial flags 2840e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// set. If the type is not cached, a new one is created. This should 2841e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// never happen though, since creating a type for the implicit self 2842e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// argument implies that we already parsed the interface definition 2843e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// and the ivar declarations in the implementation. 2844f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopherllvm::DIType CGDebugInfo::CreateSelfType(const QualType &QualTy, 2845f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher llvm::DIType Ty) { 2846e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl llvm::DIType CachedTy = getTypeOrNull(QualTy); 2847b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (CachedTy) Ty = CachedTy; 2848e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl else DEBUG(llvm::dbgs() << "No cached type for self."); 2849e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl return DBuilder.createObjectPointerType(Ty); 2850e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl} 2851e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl 28527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfBlockDeclRefVariable(const VarDecl *VD, 28537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *Storage, 28547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder, 28557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CGBlockInfo &blockInfo) { 285613c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 28577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 28586537f083555f9606c495d05c562878aa49bae987Eric Christopher 28597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Builder.GetInsertBlock() == 0) 28607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 28616537f083555f9606c495d05c562878aa49bae987Eric Christopher 28627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool isByRef = VD->hasAttr<BlocksAttr>(); 28636537f083555f9606c495d05c562878aa49bae987Eric Christopher 28647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t XOffset = 0; 28657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 28667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty; 28677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isByRef) 28687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset); 28696537f083555f9606c495d05c562878aa49bae987Eric Christopher else 28707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = getOrCreateType(VD->getType(), Unit); 28717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Self is passed along as an implicit non-arg variable in a 28737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // block. Mark it as the object pointer. 28747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<ImplicitParamDecl>(VD) && VD->getName() == "self") 2875e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl Ty = CreateSelfType(VD->getType(), Ty); 28767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get location information. 28787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(VD->getLocation()); 28797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Column = getColumnNumber(VD->getLocation()); 28807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const llvm::DataLayout &target = CGM.getDataLayout(); 28827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits offset = CharUnits::fromQuantity( 28847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei target.getStructLayout(blockInfo.StructureType) 28857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ->getElementOffset(blockInfo.getCapture(VD).getIndex())); 28867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 9> addr; 28887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Type *Int64Ty = CGM.Int64Ty; 28899b97adfb770c3b55c1a45049d53b624bbc6f62e1Adrian Prantl if (isa<llvm::AllocaInst>(Storage)) 28909b97adfb770c3b55c1a45049d53b624bbc6f62e1Adrian Prantl addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpDeref)); 28917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 28927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 28937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isByRef) { 28947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpDeref)); 28957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 28967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of __forwarding field 28977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext() 28987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei .toCharUnitsFromBits(target.getPointerSizeInBits(0)); 28997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 29007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpDeref)); 29017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 29027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of x field 29037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext().toCharUnitsFromBits(XOffset); 29047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 29057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the variable. 29087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIVariable D = 29096537f083555f9606c495d05c562878aa49bae987Eric Christopher DBuilder.createComplexVariable(llvm::dwarf::DW_TAG_auto_variable, 29107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor(LexicalBlockStack.back()), 29117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VD->getName(), Unit, Line, Ty, addr); 29129b97adfb770c3b55c1a45049d53b624bbc6f62e1Adrian Prantl 29137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Insert an llvm.dbg.declare into the current block. 29147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Instruction *Call = 29157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.insertDeclare(Storage, D, Builder.GetInsertPoint()); 29167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, 29177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.back())); 29187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 29197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitDeclareOfArgVariable - Emit call to llvm.dbg.declare for an argument 29217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// variable declaration. 29227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfArgVariable(const VarDecl *VD, llvm::Value *AI, 29237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ArgNo, 29247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 292513c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 29267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitDeclare(VD, llvm::dwarf::DW_TAG_arg_variable, AI, ArgNo, Builder); 29277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 29287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 29307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei struct BlockLayoutChunk { 29317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t OffsetInBits; 29327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BlockDecl::Capture *Capture; 29337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 29347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool operator<(const BlockLayoutChunk &l, const BlockLayoutChunk &r) { 29357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return l.OffsetInBits < r.OffsetInBits; 29367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 29387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block, 2940836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl llvm::Value *Arg, 2941836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl llvm::Value *LocalAddr, 29427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 294313c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 29447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTContext &C = CGM.getContext(); 29457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BlockDecl *blockDecl = block.getBlockDecl(); 29467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Collect some general information about the block's location. 29487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation loc = blockDecl->getCaretLocation(); 29497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile tunit = getOrCreateFile(loc); 29507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned line = getLineNumber(loc); 29517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned column = getColumnNumber(loc); 29526537f083555f9606c495d05c562878aa49bae987Eric Christopher 29537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Build the debug-info type for the block literal. 29547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(cast<Decl>(blockDecl->getDeclContext())); 29557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const llvm::StructLayout *blockLayout = 29577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getDataLayout().getStructLayout(block.StructureType); 29587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value*, 16> fields; 29607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__isa", C.VoidPtrTy, 0, loc, AS_public, 29617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(0), 29627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 29637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__flags", C.IntTy, 0, loc, AS_public, 29647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(1), 29657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 29667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__reserved", C.IntTy, 0, loc, AS_public, 29677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(2), 29687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 29697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__FuncPtr", C.VoidPtrTy, 0, loc, AS_public, 29707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(3), 29717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 29727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__descriptor", 29737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei C.getPointerType(block.NeedsCopyDispose ? 29747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei C.getBlockDescriptorExtendedType() : 29757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei C.getBlockDescriptorType()), 29767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 0, loc, AS_public, 29777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(4), 29787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 29797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We want to sort the captures by offset, not because DWARF 29817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // requires this, but because we're paranoid about debuggers. 29827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<BlockLayoutChunk, 8> chunks; 29837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 'this' capture. 29857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (blockDecl->capturesCXXThis()) { 29867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BlockLayoutChunk chunk; 29877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.OffsetInBits = 29887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(block.CXXThisIndex); 29897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.Capture = 0; 29907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunks.push_back(chunk); 29917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Variable captures. 29947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (BlockDecl::capture_const_iterator 29957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei i = blockDecl->capture_begin(), e = blockDecl->capture_end(); 29967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei i != e; ++i) { 29977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BlockDecl::Capture &capture = *i; 29987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const VarDecl *variable = capture.getVariable(); 29997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CGBlockInfo::Capture &captureInfo = block.getCapture(variable); 30007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore constant captures. 30027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (captureInfo.isConstant()) 30037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 30047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BlockLayoutChunk chunk; 30067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.OffsetInBits = 30077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(captureInfo.getIndex()); 30087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.Capture = &capture; 30097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunks.push_back(chunk); 30107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Sort by offset. 30137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::array_pod_sort(chunks.begin(), chunks.end()); 30147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (SmallVectorImpl<BlockLayoutChunk>::iterator 30167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei i = chunks.begin(), e = chunks.end(); i != e; ++i) { 30177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t offsetInBits = i->OffsetInBits; 30187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BlockDecl::Capture *capture = i->Capture; 30197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we have a null capture, this must be the C++ 'this' capture. 30217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!capture) { 30227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXMethodDecl *method = 30237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<CXXMethodDecl>(blockDecl->getNonClosureContext()); 30247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType type = method->getThisType(C); 30257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("this", type, 0, loc, AS_public, 30277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offsetInBits, tunit, tunit)); 30287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 30297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const VarDecl *variable = capture->getVariable(); 30327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef name = variable->getName(); 30337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType fieldType; 30357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (capture->isByRef()) { 30367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::pair<uint64_t,unsigned> ptrInfo = C.getTypeInfo(C.VoidPtrTy); 30377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: this creates a second copy of this type! 30397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t xoffset; 30407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fieldType = EmitTypeForVarWithBlocksAttr(variable, &xoffset); 30417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fieldType = DBuilder.createPointerType(fieldType, ptrInfo.first); 30427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fieldType = DBuilder.createMemberType(tunit, name, tunit, line, 30437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ptrInfo.first, ptrInfo.second, 30447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offsetInBits, 0, fieldType); 30457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 30467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fieldType = createFieldType(name, variable->getType(), 0, 30477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei loc, AS_public, offsetInBits, tunit, tunit); 30487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(fieldType); 30507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<36> typeName; 30537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::raw_svector_ostream(typeName) 30547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << "__block_literal_" << CGM.getUniqueBlockCount(); 30557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray fieldsArray = DBuilder.getOrCreateArray(fields); 30577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType type = 30597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createStructType(tunit, typeName.str(), tunit, line, 30607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getContext().toBits(block.BlockSize), 30617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getContext().toBits(block.BlockAlign), 3062c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie 0, llvm::DIType(), fieldsArray); 30637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei type = DBuilder.createPointerType(type, CGM.PointerWidthInBits); 30647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the block. 30667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned flags = llvm::DIDescriptor::FlagArtificial; 30677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *scope = LexicalBlockStack.back(); 30687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the parameter. 30707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIVariable debugVar = 30717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createLocalVariable(llvm::dwarf::DW_TAG_arg_variable, 30726537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIDescriptor(scope), 3073836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl Arg->getName(), tunit, line, type, 30747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getLangOpts().Optimize, flags, 3075836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl cast<llvm::Argument>(Arg)->getArgNo() + 1); 3076836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl 3077bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl if (LocalAddr) { 3078836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl // Insert an llvm.dbg.value into the current block. 3079bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl llvm::Instruction *DbgVal = 3080bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl DBuilder.insertDbgValueIntrinsic(LocalAddr, 0, debugVar, 3081f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher Builder.GetInsertBlock()); 3082bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl DbgVal->setDebugLoc(llvm::DebugLoc::get(line, column, scope)); 3083bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl } 3084836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl 3085bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl // Insert an llvm.dbg.declare into the current block. 3086bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl llvm::Instruction *DbgDecl = 3087bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl DBuilder.insertDeclare(Arg, debugVar, Builder.GetInsertBlock()); 3088bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl DbgDecl->setDebugLoc(llvm::DebugLoc::get(line, column, scope)); 30897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 30907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30915434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie/// If D is an out-of-class definition of a static data member of a class, find 30925434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie/// its corresponding in-class declaration. 30935434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikiellvm::DIDerivedType 30945434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David BlaikieCGDebugInfo::getOrCreateStaticDataMemberDeclarationOrNull(const VarDecl *D) { 30955434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie if (!D->isStaticDataMember()) 30965434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie return llvm::DIDerivedType(); 30975434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator MI = 30985434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie StaticDataMemberCache.find(D->getCanonicalDecl()); 30995434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie if (MI != StaticDataMemberCache.end()) { 31005434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie assert(MI->second && "Static data member declaration should still exist"); 31015434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie return llvm::DIDerivedType(cast<llvm::MDNode>(MI->second)); 31025434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie } 31035e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie 31045e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie // If the member wasn't found in the cache, lazily construct and add it to the 31055e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie // type (used when a limited form of the type is emitted). 31065434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie llvm::DICompositeType Ctxt( 31075434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie getContextDescriptor(cast<Decl>(D->getDeclContext()))); 31085434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie llvm::DIDerivedType T = CreateRecordStaticField(D, Ctxt); 31095434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie Ctxt.addMember(T); 31105434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie return T; 31115434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie} 31125434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie 31137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitGlobalVariable - Emit information about a global variable. 31147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, 31157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const VarDecl *D) { 311613c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 31177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create global variable debug descriptor. 31187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(D->getLocation()); 31197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(D->getLocation()); 31207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei setLocation(D->getLocation()); 31227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType T = D->getType(); 31247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (T->isIncompleteArrayType()) { 31257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // CodeGen turns int[] into int[1] so we'll do the same here. 31277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APInt ConstVal(32, 1); 31287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ET = CGM.getContext().getAsArrayType(T)->getElementType(); 31297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = CGM.getContext().getConstantArrayType(ET, ConstVal, 31317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayType::Normal, 0); 31327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef DeclName = D->getName(); 31347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef LinkageName; 31357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (D->getDeclContext() && !isa<FunctionDecl>(D->getDeclContext()) 31367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei && !isa<ObjCMethodDecl>(D->getDeclContext())) 31377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LinkageName = Var->getName(); 31387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LinkageName == DeclName) 31397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LinkageName = StringRef(); 31406537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIDescriptor DContext = 31417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(dyn_cast<Decl>(D->getDeclContext())); 31425434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie llvm::DIGlobalVariable GV = DBuilder.createStaticVariable( 31435434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie DContext, DeclName, LinkageName, Unit, LineNo, getOrCreateType(T, Unit), 31445434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie Var->hasInternalLinkage(), Var, 31455434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie getOrCreateStaticDataMemberDeclarationOrNull(D)); 31469faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie DeclCache.insert(std::make_pair(D->getCanonicalDecl(), llvm::WeakVH(GV))); 31477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 31487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitGlobalVariable - Emit information about an objective-c interface. 31507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, 31517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *ID) { 315213c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 31537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create global variable debug descriptor. 31547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(ID->getLocation()); 31557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(ID->getLocation()); 31567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = ID->getName(); 31587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType T = CGM.getContext().getObjCInterfaceType(ID); 31607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (T->isIncompleteArrayType()) { 31617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // CodeGen turns int[] into int[1] so we'll do the same here. 31637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APInt ConstVal(32, 1); 31647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ET = CGM.getContext().getAsArrayType(T)->getElementType(); 31657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = CGM.getContext().getConstantArrayType(ET, ConstVal, 31677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayType::Normal, 0); 31687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createGlobalVariable(Name, Unit, LineNo, 31717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(T, Unit), 31727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Var->hasInternalLinkage(), Var); 31737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 31747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitGlobalVariable - Emit global variable's debug info. 31766537f083555f9606c495d05c562878aa49bae987Eric Christophervoid CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, 31777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Constant *Init) { 317813c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 31797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the variable. 31807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 31817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = VD->getName(); 31827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty = getOrCreateType(VD->getType(), Unit); 31837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(VD)) { 31847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const EnumDecl *ED = cast<EnumDecl>(ECD->getDeclContext()); 31857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(isa<EnumType>(ED->getTypeForDecl()) && "Enum without EnumType?"); 31867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = getOrCreateType(QualType(ED->getTypeForDecl(), 0), Unit); 31877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Do not use DIGlobalVariable for enums. 31897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty.getTag() == llvm::dwarf::DW_TAG_enumeration_type) 31907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 319127ab0362bc030de340e25c72002c15f6b22fe683David Blaikie llvm::DIGlobalVariable GV = DBuilder.createStaticVariable( 319227ab0362bc030de340e25c72002c15f6b22fe683David Blaikie Unit, Name, Name, Unit, getLineNumber(VD->getLocation()), Ty, true, Init, 31935434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie getOrCreateStaticDataMemberDeclarationOrNull(cast<VarDecl>(VD))); 31949faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie DeclCache.insert(std::make_pair(VD->getCanonicalDecl(), llvm::WeakVH(GV))); 31959faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie} 31969faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie 31979faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikiellvm::DIScope CGDebugInfo::getCurrentContextDescriptor(const Decl *D) { 31989faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (!LexicalBlockStack.empty()) 31999faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return llvm::DIScope(LexicalBlockStack.back()); 32009faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return getContextDescriptor(D); 32017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 32027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3203957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikievoid CGDebugInfo::EmitUsingDirective(const UsingDirectiveDecl &UD) { 32049faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (CGM.getCodeGenOpts().getDebugInfo() < CodeGenOptions::LimitedDebugInfo) 32059faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return; 3206957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie DBuilder.createImportedModule( 32079faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie getCurrentContextDescriptor(cast<Decl>(UD.getDeclContext())), 32089faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie getOrCreateNameSpace(UD.getNominatedNamespace()), 3209957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie getLineNumber(UD.getLocation())); 3210957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie} 3211957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie 32129faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikievoid CGDebugInfo::EmitUsingDecl(const UsingDecl &UD) { 32139faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (CGM.getCodeGenOpts().getDebugInfo() < CodeGenOptions::LimitedDebugInfo) 32149faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return; 32159faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie assert(UD.shadow_size() && 32169faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie "We shouldn't be codegening an invalid UsingDecl containing no decls"); 32179faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // Emitting one decl is sufficient - debuggers can detect that this is an 32189faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // overloaded name & provide lookup for all the overloads. 32199faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie const UsingShadowDecl &USD = **UD.shadow_begin(); 322056b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher if (llvm::DIDescriptor Target = 322156b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher getDeclarationOrDefinition(USD.getUnderlyingDecl())) 32229faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie DBuilder.createImportedDeclaration( 32239faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie getCurrentContextDescriptor(cast<Decl>(USD.getDeclContext())), Target, 32249faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie getLineNumber(USD.getLocation())); 32259faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie} 32269faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie 3227fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikiellvm::DIImportedEntity 3228fc46ebc2b1345723a894ae352cfb206c1d930295David BlaikieCGDebugInfo::EmitNamespaceAlias(const NamespaceAliasDecl &NA) { 3229fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie if (CGM.getCodeGenOpts().getDebugInfo() < CodeGenOptions::LimitedDebugInfo) 3230fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie return llvm::DIImportedEntity(0); 3231fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie llvm::WeakVH &VH = NamespaceAliasCache[&NA]; 3232fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie if (VH) 3233fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie return llvm::DIImportedEntity(cast<llvm::MDNode>(VH)); 3234fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie llvm::DIImportedEntity R(0); 3235fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie if (const NamespaceAliasDecl *Underlying = 3236fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie dyn_cast<NamespaceAliasDecl>(NA.getAliasedNamespace())) 3237fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie // This could cache & dedup here rather than relying on metadata deduping. 3238fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie R = DBuilder.createImportedModule( 3239fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie getCurrentContextDescriptor(cast<Decl>(NA.getDeclContext())), 3240fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie EmitNamespaceAlias(*Underlying), getLineNumber(NA.getLocation()), 3241fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie NA.getName()); 3242fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie else 3243fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie R = DBuilder.createImportedModule( 3244fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie getCurrentContextDescriptor(cast<Decl>(NA.getDeclContext())), 3245fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie getOrCreateNameSpace(cast<NamespaceDecl>(NA.getAliasedNamespace())), 3246fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie getLineNumber(NA.getLocation()), NA.getName()); 3247fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie VH = R; 3248fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie return R; 3249fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie} 3250fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie 32517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateNamesSpace - Return namespace descriptor for the given 32527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// namespace decl. 32536537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DINameSpace 32547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::getOrCreateNameSpace(const NamespaceDecl *NSDecl) { 32558863e6baaa760c2a0f4541fc6c0ca7993979a4b3David Blaikie NSDecl = NSDecl->getCanonicalDecl(); 32566537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DenseMap<const NamespaceDecl *, llvm::WeakVH>::iterator I = 32577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NameSpaceCache.find(NSDecl); 32587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (I != NameSpaceCache.end()) 32597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DINameSpace(cast<llvm::MDNode>(I->second)); 32606537f083555f9606c495d05c562878aa49bae987Eric Christopher 32617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(NSDecl->getLocation()); 32627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile FileD = getOrCreateFile(NSDecl->getLocation()); 32636537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIDescriptor Context = 32647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(dyn_cast<Decl>(NSDecl->getDeclContext())); 32657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DINameSpace NS = 32667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createNameSpace(Context, NSDecl->getName(), FileD, LineNo); 32677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NameSpaceCache[NSDecl] = llvm::WeakVH(NS); 32687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return NS; 32697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 32707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::finalize() { 32727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (std::vector<std::pair<void *, llvm::WeakVH> >::const_iterator VI 32737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ReplaceMap.begin(), VE = ReplaceMap.end(); VI != VE; ++VI) { 32747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty, RepTy; 32757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Verify that the debug info still exists. 32767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::Value *V = VI->second) 32777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = llvm::DIType(cast<llvm::MDNode>(V)); 32786537f083555f9606c495d05c562878aa49bae987Eric Christopher 32797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<void *, llvm::WeakVH>::iterator it = 32807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeCache.find(VI->first); 32817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (it != TypeCache.end()) { 32827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Verify that the debug info still exists. 32837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::Value *V = it->second) 32847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RepTy = llvm::DIType(cast<llvm::MDNode>(V)); 32857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3286ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 3287b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (Ty && Ty.isForwardDecl() && RepTy) 32887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty.replaceAllUsesWith(RepTy); 32897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3290ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 3291ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // We keep our own list of retained types, because we need to look 3292ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // up the final type in the type cache. 3293ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl for (std::vector<void *>::const_iterator RI = RetainedTypes.begin(), 3294ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl RE = RetainedTypes.end(); RI != RE; ++RI) 329518760453868e9b831b8575ae64119b07ab4dcdf5Manman Ren DBuilder.retainType(llvm::DIType(cast<llvm::MDNode>(TypeCache[*RI]))); 3296ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 32977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.finalize(); 32987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3299