CGDebugInfo.cpp revision 951094baa05a72f2623b7e25df609796ad97d908
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. 54656b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopherllvm::DIType CGDebugInfo::CreateQualifiedType(QualType Ty, llvm::DIFile Unit, 54756b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher bool Declaration) { 5487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualifierCollector Qc; 5497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Type *T = Qc.strip(Ty); 5507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore these qualifiers for now. 5527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeObjCGCAttr(); 5537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeAddressSpace(); 5547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeObjCLifetime(); 5557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We will create one Derived type for one qualifier and recurse to handle any 5577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // additional ones. 5587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Tag; 5597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Qc.hasConst()) { 5607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_const_type; 5617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeConst(); 5627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Qc.hasVolatile()) { 5637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_volatile_type; 5647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeVolatile(); 5657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Qc.hasRestrict()) { 5667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_restrict_type; 5677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeRestrict(); 5687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 5697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Qc.empty() && "Unknown type qualifier for debug info"); 5707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(QualType(T, 0), Unit); 5717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 57356b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher llvm::DIType FromTy = 57456b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher getOrCreateType(Qc.apply(CGM.getContext(), T), Unit, Declaration); 5757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // No need to fill in the Name, Line, Size, Alignment, Offset in case of 5777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // CVR derived types. 5787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType DbgTy = DBuilder.createQualifiedType(Tag, FromTy); 5796537f083555f9606c495d05c562878aa49bae987Eric Christopher 5807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 5817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ObjCObjectPointerType *Ty, 5847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 58505f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian 58605f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian // The frontend treats 'id' as a typedef to an ObjCObjectType, 58705f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian // whereas 'id<protocol>' is treated as an ObjCPointerType. For the 58805f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian // debug info, we want to emit 'id' in both cases. 58905f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian if (Ty->isObjCQualifiedIdType()) 59005f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian return getOrCreateType(CGM.getContext().getObjCIdType(), Unit); 59105f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian 5927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType DbgTy = 5936537f083555f9606c495d05c562878aa49bae987Eric Christopher CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty, 5947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty->getPointeeType(), Unit); 5957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 5967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const PointerType *Ty, 5997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 6006537f083555f9606c495d05c562878aa49bae987Eric Christopher return CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty, 6017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty->getPointeeType(), Unit); 6027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Creates a forward declaration for a RecordDecl in the given context. 605951094baa05a72f2623b7e25df609796ad97d908David Blaikiellvm::DICompositeType 606951094baa05a72f2623b7e25df609796ad97d908David BlaikieCGDebugInfo::getOrCreateRecordFwdDecl(const RecordDecl *RD, 607951094baa05a72f2623b7e25df609796ad97d908David Blaikie llvm::DIDescriptor Ctx) { 608951094baa05a72f2623b7e25df609796ad97d908David Blaikie llvm::DICompositeType T(getTypeOrNull(CGM.getContext().getRecordType(RD))); 609951094baa05a72f2623b7e25df609796ad97d908David Blaikie if (T) 610951094baa05a72f2623b7e25df609796ad97d908David Blaikie return T; 6117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); 6127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(RD->getLocation()); 6137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef RDName = getClassName(RD); 6147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Tag = 0; 6167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RD->isStruct() || RD->isInterface()) 6177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_structure_type; 6187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (RD->isUnion()) 6197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_union_type; 6207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 6217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(RD->isClass()); 6227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_class_type; 6237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the type. 6267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createForwardDecl(Tag, RDName, Ctx, DefUnit, Line); 6277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Walk up the context chain and create forward decls for record decls, 6307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// and normal descriptors for namespaces. 6317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIDescriptor CGDebugInfo::createContextChain(const Decl *Context) { 6327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Context) 6337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TheCU; 6347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // See if we already have the parent. 6367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator 6377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I = RegionMap.find(Context); 6387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (I != RegionMap.end()) { 6397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = I->second; 6407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIDescriptor(dyn_cast_or_null<llvm::MDNode>(V)); 6417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6426537f083555f9606c495d05c562878aa49bae987Eric Christopher 6437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check namespace. 6447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const NamespaceDecl *NSDecl = dyn_cast<NamespaceDecl>(Context)) 6457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIDescriptor(getOrCreateNameSpace(NSDecl)); 6467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const RecordDecl *RD = dyn_cast<RecordDecl>(Context)) { 6487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!RD->isDependentType()) { 6494a0771680ee2fa8e76e1c0d54eaf69f459daf424David Blaikie llvm::DIType Ty = getOrCreateLimitedType( 6504a0771680ee2fa8e76e1c0d54eaf69f459daf424David Blaikie CGM.getContext().getRecordType(RD)->castAs<RecordType>(), getOrCreateMainFile()); 6517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIDescriptor(Ty); 6527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TheCU; 6557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreatePointerLikeType(unsigned Tag, 6586537f083555f9606c495d05c562878aa49bae987Eric Christopher const Type *Ty, 6597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType PointeeTy, 6607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 6617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Tag == llvm::dwarf::DW_TAG_reference_type || 6627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag == llvm::dwarf::DW_TAG_rvalue_reference_type) 663b0f77b065761670921fdf9c56029856cb5d9c306David Blaikie return DBuilder.createReferenceType( 664b3c2377422e820ab9d95145ab67a2fb9f9f4bf3fDavid Blaikie Tag, getOrCreateType(PointeeTy, Unit, true)); 66505f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian 6667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 6677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Size is always the size of a pointer. We can't use getTypeSize here 6687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // because that does not return the correct value for references. 6697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned AS = CGM.getContext().getTargetAddressSpace(PointeeTy); 67064aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall uint64_t Size = CGM.getTarget().getPointerWidth(AS); 6717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 6727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 673b3c2377422e820ab9d95145ab67a2fb9f9f4bf3fDavid Blaikie return DBuilder.createPointerType(getOrCreateType(PointeeTy, Unit, true), 6747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size, Align); 6757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 677f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopherllvm::DIType CGDebugInfo::getOrCreateStructPtrType(StringRef Name, 678f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher llvm::DIType &Cache) { 679b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (Cache) 680b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return Cache; 6811e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie Cache = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, Name, 6821e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie TheCU, getOrCreateMainFile(), 0); 6831e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 6841e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie Cache = DBuilder.createPointerType(Cache, Size); 6851e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie return Cache; 686b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei} 687b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei 6887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const BlockPointerType *Ty, 6897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 690b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (BlockLiteralGeneric) 6917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return BlockLiteralGeneric; 6927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 8> EltTys; 6947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy; 6957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FType; 6967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize, FieldOffset; 6977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign; 6987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray Elements; 6997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType EltTy, DescTy; 7007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 7027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().UnsignedLongTy; 7037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "reserved", &FieldOffset)); 7047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "Size", &FieldOffset)); 7057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elements = DBuilder.getOrCreateArray(EltTys); 7077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.clear(); 7087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = llvm::DIDescriptor::FlagAppleBlock; 7107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(CurLoc); 7117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTy = DBuilder.createStructType(Unit, "__block_descriptor", 7137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unit, LineNo, FieldOffset, 0, 714c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie Flags, llvm::DIType(), Elements); 7157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 7177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 7187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DescTy = DBuilder.createPointerType(EltTy, Size); 7207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 7227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 7237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset)); 7247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().IntTy; 7257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset)); 7267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__reserved", &FieldOffset)); 7277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 7287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__FuncPtr", &FieldOffset)); 7297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 7317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldTy = DescTy; 7327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize = CGM.getContext().getTypeSize(Ty); 7337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldAlign = CGM.getContext().getTypeAlign(Ty); 7347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldTy = DBuilder.createMemberType(Unit, "__descriptor", Unit, 7357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LineNo, FieldSize, FieldAlign, 7367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset, 0, FieldTy); 7377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(FieldTy); 7387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset += FieldSize; 7407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elements = DBuilder.getOrCreateArray(EltTys); 7417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTy = DBuilder.createStructType(Unit, "__block_literal_generic", 7437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unit, LineNo, FieldOffset, 0, 744c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie Flags, llvm::DIType(), Elements); 7457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BlockLiteralGeneric = DBuilder.createPointerType(EltTy, Size); 7477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return BlockLiteralGeneric; 7487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7505f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikiellvm::DIType CGDebugInfo::CreateType(const TypedefType *Ty, llvm::DIFile Unit, 7515f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie bool Declaration) { 7527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Typedefs are derived from some other type. If we have a typedef of a 7537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // typedef, make sure to emit the whole chain. 754b0f77b065761670921fdf9c56029856cb5d9c306David Blaikie llvm::DIType Src = 7555f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie getOrCreateType(Ty->getDecl()->getUnderlyingType(), Unit, Declaration); 756b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (!Src) 7577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 7587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We don't set size information, but do specify where the typedef was 7597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // declared. 7607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(Ty->getDecl()->getLocation()); 7617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TypedefNameDecl *TyDecl = Ty->getDecl(); 7626537f083555f9606c495d05c562878aa49bae987Eric Christopher 7637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor TypedefContext = 7647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(cast<Decl>(Ty->getDecl()->getDeclContext())); 7656537f083555f9606c495d05c562878aa49bae987Eric Christopher 7667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 7677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createTypedef(Src, TyDecl->getName(), Unit, Line, TypedefContext); 7687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const FunctionType *Ty, 7717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 7727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> EltTys; 7737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add the result type at least. 7757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(getOrCreateType(Ty->getResultType(), Unit)); 7767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Set up remainder of arguments if there is a prototype. 7787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: IF NOT, HOW IS THIS REPRESENTED? llvm-gcc doesn't represent '...'! 7797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<FunctionNoProtoType>(Ty)) 7807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(DBuilder.createUnspecifiedParameter()); 7817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(Ty)) { 7827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0, e = FPT->getNumArgs(); i != e; ++i) 7837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(getOrCreateType(FPT->getArgType(i), Unit)); 7847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(EltTys); 7877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createSubroutineType(Unit, EltTypeArray); 7887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::createFieldType(StringRef name, 7927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType type, 7937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t sizeInBitsOverride, 7947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation loc, 7957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei AccessSpecifier AS, 7967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t offsetInBits, 7977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile tunit, 7987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor scope) { 7997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType debugType = getOrCreateType(type, tunit); 8007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the location for the field. 8027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile file = getOrCreateFile(loc); 8037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned line = getLineNumber(loc); 8047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t sizeInBits = 0; 8067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned alignInBits = 0; 8077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!type->isIncompleteArrayType()) { 8087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::tie(sizeInBits, alignInBits) = CGM.getContext().getTypeInfo(type); 8097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (sizeInBitsOverride) 8117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei sizeInBits = sizeInBitsOverride; 8127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 8137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned flags = 0; 8157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (AS == clang::AS_private) 8167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei flags |= llvm::DIDescriptor::FlagPrivate; 8177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (AS == clang::AS_protected) 8187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei flags |= llvm::DIDescriptor::FlagProtected; 8197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createMemberType(scope, name, file, line, sizeInBits, 8217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei alignInBits, offsetInBits, flags, debugType); 8227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 8237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8240395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// CollectRecordLambdaFields - Helper for CollectRecordFields. 8250395de36004a718e265cc256b1bbee3bd3a791dcEric Christophervoid CGDebugInfo:: 8260395de36004a718e265cc256b1bbee3bd3a791dcEric ChristopherCollectRecordLambdaFields(const CXXRecordDecl *CXXDecl, 8270395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SmallVectorImpl<llvm::Value *> &elements, 8280395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType RecordTy) { 8290395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // For C++11 Lambdas a Field will be the same as a Capture, but the Capture 8300395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // has the name and the location of the variable so we should iterate over 8310395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // both concurrently. 8320395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(CXXDecl); 8330395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher RecordDecl::field_iterator Field = CXXDecl->field_begin(); 8340395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher unsigned fieldno = 0; 8350395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher for (CXXRecordDecl::capture_const_iterator I = CXXDecl->captures_begin(), 8360395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher E = CXXDecl->captures_end(); I != E; ++I, ++Field, ++fieldno) { 8370395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const LambdaExpr::Capture C = *I; 8380395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (C.capturesVariable()) { 8390395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher VarDecl *V = C.getCapturedVar(); 8400395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIFile VUnit = getOrCreateFile(C.getLocation()); 8410395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StringRef VName = V->getName(); 8420395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher uint64_t SizeInBitsOverride = 0; 8430395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (Field->isBitField()) { 8440395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SizeInBitsOverride = Field->getBitWidthValue(CGM.getContext()); 8450395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher assert(SizeInBitsOverride && "found named 0-width bitfield"); 8460395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 8470395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType fieldType 8480395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher = createFieldType(VName, Field->getType(), SizeInBitsOverride, 8490395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher C.getLocation(), Field->getAccess(), 8500395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher layout.getFieldOffset(fieldno), VUnit, RecordTy); 8510395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher elements.push_back(fieldType); 8520395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } else { 8530395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // TODO: Need to handle 'this' in some way by probably renaming the 8540395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // this of the lambda class and having a field member of 'this' or 8550395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // by using AT_object_pointer for the function and having that be 8560395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // used as 'this' for semantic references. 8570395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher assert(C.capturesThis() && "Field that isn't captured and isn't this?"); 8580395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher FieldDecl *f = *Field; 8590395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIFile VUnit = getOrCreateFile(f->getLocation()); 8600395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher QualType type = f->getType(); 8610395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType fieldType 8620395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher = createFieldType("this", type, 0, f->getLocation(), f->getAccess(), 8630395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher layout.getFieldOffset(fieldno), VUnit, RecordTy); 8640395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8650395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher elements.push_back(fieldType); 8660395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 8670395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 8680395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher} 8690395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8700395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// CollectRecordStaticField - Helper for CollectRecordFields. 8710395de36004a718e265cc256b1bbee3bd3a791dcEric Christophervoid CGDebugInfo:: 8720395de36004a718e265cc256b1bbee3bd3a791dcEric ChristopherCollectRecordStaticField(const VarDecl *Var, 8730395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SmallVectorImpl<llvm::Value *> &elements, 8740395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType RecordTy) { 8750395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Create the descriptor for the static variable, with or without 8760395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // constant initializers. 8770395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIFile VUnit = getOrCreateFile(Var->getLocation()); 8780395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType VTy = getOrCreateType(Var->getType(), VUnit); 8790395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8800395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Do not describe enums as static members. 8810395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (VTy.getTag() == llvm::dwarf::DW_TAG_enumeration_type) 8820395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher return; 8830395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8840395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher unsigned LineNumber = getLineNumber(Var->getLocation()); 8850395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StringRef VName = Var->getName(); 886a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie llvm::Constant *C = NULL; 8870395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (Var->getInit()) { 8880395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const APValue *Value = Var->evaluateValue(); 889a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie if (Value) { 890a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie if (Value->isInt()) 891a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie C = llvm::ConstantInt::get(CGM.getLLVMContext(), Value->getInt()); 892a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie if (Value->isFloat()) 893a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie C = llvm::ConstantFP::get(CGM.getLLVMContext(), Value->getFloat()); 894a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie } 8950395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 8960395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8970395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher unsigned Flags = 0; 8980395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher AccessSpecifier Access = Var->getAccess(); 8990395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (Access == clang::AS_private) 9000395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher Flags |= llvm::DIDescriptor::FlagPrivate; 9010395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher else if (Access == clang::AS_protected) 9020395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher Flags |= llvm::DIDescriptor::FlagProtected; 9030395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9040395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType GV = DBuilder.createStaticMemberType(RecordTy, VName, VUnit, 905a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie LineNumber, VTy, Flags, C); 9060395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher elements.push_back(GV); 9070395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StaticDataMemberCache[Var->getCanonicalDecl()] = llvm::WeakVH(GV); 9080395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher} 9090395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9100395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// CollectRecordNormalField - Helper for CollectRecordFields. 9110395de36004a718e265cc256b1bbee3bd3a791dcEric Christophervoid CGDebugInfo:: 9120395de36004a718e265cc256b1bbee3bd3a791dcEric ChristopherCollectRecordNormalField(const FieldDecl *field, uint64_t OffsetInBits, 9130395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIFile tunit, 9140395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SmallVectorImpl<llvm::Value *> &elements, 9150395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType RecordTy) { 9160395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StringRef name = field->getName(); 9170395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher QualType type = field->getType(); 9180395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9190395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Ignore unnamed fields unless they're anonymous structs/unions. 9200395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (name.empty() && !type->isRecordType()) 9210395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher return; 9220395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9230395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher uint64_t SizeInBitsOverride = 0; 9240395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (field->isBitField()) { 9250395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SizeInBitsOverride = field->getBitWidthValue(CGM.getContext()); 9260395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher assert(SizeInBitsOverride && "found named 0-width bitfield"); 9270395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 9280395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9290395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType fieldType 9300395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher = createFieldType(name, type, SizeInBitsOverride, 9310395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher field->getLocation(), field->getAccess(), 9320395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher OffsetInBits, tunit, RecordTy); 9330395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9340395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher elements.push_back(fieldType); 9350395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher} 9360395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectRecordFields - A helper function to collect debug info for 9387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// record fields. This is used while creating debug info entry for a Record. 9397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 9407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectRecordFields(const RecordDecl *record, llvm::DIFile tunit, 9417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &elements, 9427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 9437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(record); 9447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9450395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (CXXDecl && CXXDecl->isLambda()) 9460395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher CollectRecordLambdaFields(CXXDecl, elements, RecordTy); 9470395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher else { 9480395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(record); 9490395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9500395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Field number for non-static fields. 951fd5ac0d75abd6ead8dd39bf526b34eeaff81cef6Eric Christopher unsigned fieldNo = 0; 9520395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9530395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Static and non-static members should appear in the same order as 9540395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // the corresponding declarations in the source program. 9550395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher for (RecordDecl::decl_iterator I = record->decls_begin(), 9560395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher E = record->decls_end(); I != E; ++I) 9570395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (const VarDecl *V = dyn_cast<VarDecl>(*I)) 9580395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher CollectRecordStaticField(V, elements, RecordTy); 9590395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher else if (FieldDecl *field = dyn_cast<FieldDecl>(*I)) { 9600395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher CollectRecordNormalField(field, layout.getFieldOffset(fieldNo), 9610395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher tunit, elements, RecordTy); 9627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9630395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Bump field number for next field. 9640395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher ++fieldNo; 9657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 9687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateMethodType - CXXMethodDecl's type is a FunctionType. This 9707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// function type is not updated to include implicit "this" pointer. Use this 9717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// routine to get a method type which includes "this" pointer. 9729a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikiellvm::DICompositeType 9737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::getOrCreateMethodType(const CXXMethodDecl *Method, 9747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 9759c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie const FunctionProtoType *Func = Method->getType()->getAs<FunctionProtoType>(); 97667f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie if (Method->isStatic()) 9779a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie return llvm::DICompositeType(getOrCreateType(QualType(Func, 0), Unit)); 9789c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie return getOrCreateInstanceMethodType(Method->getThisType(CGM.getContext()), 9799c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie Func, Unit); 9809c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie} 98167f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie 9829a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikiellvm::DICompositeType CGDebugInfo::getOrCreateInstanceMethodType( 9839c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie QualType ThisPtr, const FunctionProtoType *Func, llvm::DIFile Unit) { 9847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add "this" pointer. 9859c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie llvm::DIArray Args = llvm::DICompositeType( 9869c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie getOrCreateType(QualType(Func, 0), Unit)).getTypeArray(); 9877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert (Args.getNumElements() && "Invalid number of arguments!"); 9887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> Elts; 9907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // First element is always return type. For 'void' functions it is NULL. 9927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elts.push_back(Args.getElement(0)); 9937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 99467f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // "this" pointer is always first argument. 9959c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie const CXXRecordDecl *RD = ThisPtr->getPointeeCXXRecordDecl(); 99667f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie if (isa<ClassTemplateSpecializationDecl>(RD)) { 99767f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // Create pointer type directly in this case. 99867f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie const PointerType *ThisPtrTy = cast<PointerType>(ThisPtr); 99967f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie QualType PointeeTy = ThisPtrTy->getPointeeType(); 100067f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie unsigned AS = CGM.getContext().getTargetAddressSpace(PointeeTy); 100164aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall uint64_t Size = CGM.getTarget().getPointerWidth(AS); 100267f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie uint64_t Align = CGM.getContext().getTypeAlign(ThisPtrTy); 100367f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie llvm::DIType PointeeType = getOrCreateType(PointeeTy, Unit); 1004f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher llvm::DIType ThisPtrType = 1005f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher DBuilder.createPointerType(PointeeType, Size, Align); 100667f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie TypeCache[ThisPtr.getAsOpaquePtr()] = ThisPtrType; 100767f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // TODO: This and the artificial type below are misleading, the 100867f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // types aren't artificial the argument is, but the current 100967f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // metadata doesn't represent that. 101067f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType); 101167f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie Elts.push_back(ThisPtrType); 101267f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie } else { 101367f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie llvm::DIType ThisPtrType = getOrCreateType(ThisPtr, Unit); 101467f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie TypeCache[ThisPtr.getAsOpaquePtr()] = ThisPtrType; 101567f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType); 101667f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie Elts.push_back(ThisPtrType); 10177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Copy rest of the arguments. 10207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 1, e = Args.getNumElements(); i != e; ++i) 10217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elts.push_back(Args.getElement(i)); 10227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(Elts); 10247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createSubroutineType(Unit, EltTypeArray); 10267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10286537f083555f9606c495d05c562878aa49bae987Eric Christopher/// isFunctionLocalClass - Return true if CXXRecordDecl is defined 10297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// inside a function. 10307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool isFunctionLocalClass(const CXXRecordDecl *RD) { 10317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXRecordDecl *NRD = dyn_cast<CXXRecordDecl>(RD->getDeclContext())) 10327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return isFunctionLocalClass(NRD); 10337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<FunctionDecl>(RD->getDeclContext())) 10347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 10357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 10367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateCXXMemberFunction - A helper function to create a DISubprogram for 10397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a single member function GlobalDecl. 10407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DISubprogram 10417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::CreateCXXMemberFunction(const CXXMethodDecl *Method, 10427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit, 10437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 10446537f083555f9606c495d05c562878aa49bae987Eric Christopher bool IsCtorOrDtor = 10457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei isa<CXXConstructorDecl>(Method) || isa<CXXDestructorDecl>(Method); 10466537f083555f9606c495d05c562878aa49bae987Eric Christopher 10477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef MethodName = getFunctionName(Method); 10489a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie llvm::DICompositeType MethodTy = getOrCreateMethodType(Method, Unit); 10497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Since a single ctor/dtor corresponds to multiple functions, it doesn't 10517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // make sense to give a single ctor/dtor a linkage name. 10527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef MethodLinkageName; 10537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!IsCtorOrDtor && !isFunctionLocalClass(Method->getParent())) 10547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MethodLinkageName = CGM.getMangledName(Method); 10557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the location for the method. 10577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile MethodDefUnit = getOrCreateFile(Method->getLocation()); 10587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned MethodLine = getLineNumber(Method->getLocation()); 10597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Collect virtual method info. 10617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType ContainingType; 10626537f083555f9606c495d05c562878aa49bae987Eric Christopher unsigned Virtuality = 0; 10637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned VIndex = 0; 10646537f083555f9606c495d05c562878aa49bae987Eric Christopher 10657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->isVirtual()) { 10667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->isPure()) 10677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Virtuality = llvm::dwarf::DW_VIRTUALITY_pure_virtual; 10687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 10697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Virtuality = llvm::dwarf::DW_VIRTUALITY_virtual; 10706537f083555f9606c495d05c562878aa49bae987Eric Christopher 10717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // It doesn't make sense to give a virtual destructor a vtable index, 10727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // since a single destructor has two entries in the vtable. 10737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!isa<CXXDestructorDecl>(Method)) 10747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VIndex = CGM.getVTableContext().getMethodVTableIndex(Method); 10757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContainingType = RecordTy; 10767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 10797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->isImplicit()) 10807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagArtificial; 10817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei AccessSpecifier Access = Method->getAccess(); 10827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Access == clang::AS_private) 10837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrivate; 10847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (Access == clang::AS_protected) 10857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagProtected; 10867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXConstructorDecl *CXXC = dyn_cast<CXXConstructorDecl>(Method)) { 10877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXC->isExplicit()) 10887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagExplicit; 10896537f083555f9606c495d05c562878aa49bae987Eric Christopher } else if (const CXXConversionDecl *CXXC = 10907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<CXXConversionDecl>(Method)) { 10917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXC->isExplicit()) 10927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagExplicit; 10937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->hasPrototype()) 10957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrototyped; 10967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray TParamsArray = CollectFunctionTemplateParams(Method, Unit); 10987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DISubprogram SP = 10996537f083555f9606c495d05c562878aa49bae987Eric Christopher DBuilder.createMethod(RecordTy, MethodName, MethodLinkageName, 11007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MethodDefUnit, MethodLine, 11016537f083555f9606c495d05c562878aa49bae987Eric Christopher MethodTy, /*isLocalToUnit=*/false, 11027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /* isDefinition=*/ false, 11037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Virtuality, VIndex, ContainingType, 11047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags, CGM.getLangOpts().Optimize, NULL, 11057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TParamsArray); 11066537f083555f9606c495d05c562878aa49bae987Eric Christopher 11077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SPCache[Method->getCanonicalDecl()] = llvm::WeakVH(SP); 11087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SP; 11107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 11117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectCXXMemberFunctions - A helper function to collect debug info for 11136537f083555f9606c495d05c562878aa49bae987Eric Christopher/// C++ member functions. This is used while creating debug info entry for 11147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a Record. 11157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 11167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectCXXMemberFunctions(const CXXRecordDecl *RD, llvm::DIFile Unit, 11177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &EltTys, 11187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 11197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Since we want more than just the individual member decls if we 11217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // have templated functions iterate over every declaration to gather 11227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the functions. 11237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for(DeclContext::decl_iterator I = RD->decls_begin(), 11247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = RD->decls_end(); I != E; ++I) { 11257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decl *D = *I; 1126d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie if (D->isImplicit()) 11277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 11287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) 11307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateCXXMemberFunction(Method, Unit, RecordTy)); 11317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11326537f083555f9606c495d05c562878aa49bae987Eric Christopher} 11337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectCXXFriends - A helper function to collect debug info for 11357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// C++ base classes. This is used while creating debug info entry for 11367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a Record. 11377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 11387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectCXXFriends(const CXXRecordDecl *RD, llvm::DIFile Unit, 11397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &EltTys, 11407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 11417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (CXXRecordDecl::friend_iterator BI = RD->friend_begin(), 11427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BE = RD->friend_end(); BI != BE; ++BI) { 11437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if ((*BI)->isUnsupportedFriend()) 11447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 11457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TypeSourceInfo *TInfo = (*BI)->getFriendType()) 11466537f083555f9606c495d05c562878aa49bae987Eric Christopher EltTys.push_back(DBuilder.createFriend(RecordTy, 11476537f083555f9606c495d05c562878aa49bae987Eric Christopher getOrCreateType(TInfo->getType(), 11487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unit))); 11497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 11517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectCXXBases - A helper function to collect debug info for 11536537f083555f9606c495d05c562878aa49bae987Eric Christopher/// C++ base classes. This is used while creating debug info entry for 11547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a Record. 11557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 11567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile Unit, 11577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &EltTys, 11587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 11597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 11617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (CXXRecordDecl::base_class_const_iterator BI = RD->bases_begin(), 11627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BE = RD->bases_end(); BI != BE; ++BI) { 11637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned BFlags = 0; 11647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t BaseOffset; 11656537f083555f9606c495d05c562878aa49bae987Eric Christopher 11667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *Base = 11677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<CXXRecordDecl>(BI->getType()->getAs<RecordType>()->getDecl()); 11686537f083555f9606c495d05c562878aa49bae987Eric Christopher 11697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (BI->isVirtual()) { 11707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // virtual base offset offset is -ve. The code generator emits dwarf 11717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // expression where it expects +ve number. 11726537f083555f9606c495d05c562878aa49bae987Eric Christopher BaseOffset = 11737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 0 - CGM.getVTableContext() 11747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei .getVirtualBaseOffsetOffset(RD, Base).getQuantity(); 11757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BFlags = llvm::DIDescriptor::FlagVirtual; 11767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else 11777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BaseOffset = CGM.getContext().toBits(RL.getBaseClassOffset(Base)); 11787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Inconsistent units for BaseOffset. It is in bytes when 11797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // BI->isVirtual() and bits when not. 11806537f083555f9606c495d05c562878aa49bae987Eric Christopher 11817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei AccessSpecifier Access = BI->getAccessSpecifier(); 11827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Access == clang::AS_private) 11837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BFlags |= llvm::DIDescriptor::FlagPrivate; 11847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (Access == clang::AS_protected) 11857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BFlags |= llvm::DIDescriptor::FlagProtected; 11866537f083555f9606c495d05c562878aa49bae987Eric Christopher 11876537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIType DTy = 11886537f083555f9606c495d05c562878aa49bae987Eric Christopher DBuilder.createInheritance(RecordTy, 11897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(BI->getType(), Unit), 11907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BaseOffset, BFlags); 11917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(DTy); 11927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 11947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectTemplateParams - A helper function to collect template parameters. 11967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIArray CGDebugInfo:: 11977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectTemplateParams(const TemplateParameterList *TPList, 119835178dc09d97bb2e0612813def09833866e3ad82David Blaikie ArrayRef<TemplateArgument> TAList, 11997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 12006537f083555f9606c495d05c562878aa49bae987Eric Christopher SmallVector<llvm::Value *, 16> TemplateParams; 12017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0, e = TAList.size(); i != e; ++i) { 12027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgument &TA = TAList[i]; 120335178dc09d97bb2e0612813def09833866e3ad82David Blaikie StringRef Name; 120435178dc09d97bb2e0612813def09833866e3ad82David Blaikie if (TPList) 120535178dc09d97bb2e0612813def09833866e3ad82David Blaikie Name = TPList->getParam(i)->getName(); 12069dfd24324c079b564dda936c6ae46898b82121e2David Blaikie switch (TA.getKind()) { 12079dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Type: { 12087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType TTy = getOrCreateType(TA.getAsType(), Unit); 12097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DITemplateTypeParameter TTP = 121035178dc09d97bb2e0612813def09833866e3ad82David Blaikie DBuilder.createTemplateTypeParameter(TheCU, Name, TTy); 12117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateParams.push_back(TTP); 12129dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 12139dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Integral: { 12147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType TTy = getOrCreateType(TA.getIntegralType(), Unit); 12157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DITemplateValueParameter TVP = 12169dfd24324c079b564dda936c6ae46898b82121e2David Blaikie DBuilder.createTemplateValueParameter( 121735178dc09d97bb2e0612813def09833866e3ad82David Blaikie TheCU, Name, TTy, 12189dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::ConstantInt::get(CGM.getLLVMContext(), TA.getAsIntegral())); 12199dfd24324c079b564dda936c6ae46898b82121e2David Blaikie TemplateParams.push_back(TVP); 12209dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 12219dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Declaration: { 12229dfd24324c079b564dda936c6ae46898b82121e2David Blaikie const ValueDecl *D = TA.getAsDecl(); 12239dfd24324c079b564dda936c6ae46898b82121e2David Blaikie bool InstanceMember = D->isCXXInstanceMember(); 12249dfd24324c079b564dda936c6ae46898b82121e2David Blaikie QualType T = InstanceMember 12259dfd24324c079b564dda936c6ae46898b82121e2David Blaikie ? CGM.getContext().getMemberPointerType( 12269dfd24324c079b564dda936c6ae46898b82121e2David Blaikie D->getType(), cast<RecordDecl>(D->getDeclContext()) 12279dfd24324c079b564dda936c6ae46898b82121e2David Blaikie ->getTypeForDecl()) 12289dfd24324c079b564dda936c6ae46898b82121e2David Blaikie : CGM.getContext().getPointerType(D->getType()); 12299dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::DIType TTy = getOrCreateType(T, Unit); 12309dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::Value *V = 0; 12319dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Variable pointer template parameters have a value that is the address 12329dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // of the variable. 12339dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (const VarDecl *VD = dyn_cast<VarDecl>(D)) 12349dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.GetAddrOfGlobalVar(VD); 12359dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Member function pointers have special support for building them, though 12369dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // this is currently unsupported in LLVM CodeGen. 1237f8aa155e40bc98844f46ecbfdbe430696c36ce24David Blaikie if (InstanceMember) { 12389dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (const CXXMethodDecl *method = dyn_cast<CXXMethodDecl>(D)) 12399dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.getCXXABI().EmitMemberPointer(method); 1240f8aa155e40bc98844f46ecbfdbe430696c36ce24David Blaikie } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) 1241f8aa155e40bc98844f46ecbfdbe430696c36ce24David Blaikie V = CGM.GetAddrOfFunction(FD); 12429dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Member data pointers have special handling too to compute the fixed 12439dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // offset within the object. 12449dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (isa<FieldDecl>(D)) { 12459dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // These five lines (& possibly the above member function pointer 12469dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // handling) might be able to be refactored to use similar code in 12479dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // CodeGenModule::getMemberPointerConstant 12489dfd24324c079b564dda936c6ae46898b82121e2David Blaikie uint64_t fieldOffset = CGM.getContext().getFieldOffset(D); 12499dfd24324c079b564dda936c6ae46898b82121e2David Blaikie CharUnits chars = 12509dfd24324c079b564dda936c6ae46898b82121e2David Blaikie CGM.getContext().toCharUnitsFromBits((int64_t) fieldOffset); 12519dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.getCXXABI().EmitMemberDataPointer( 12529dfd24324c079b564dda936c6ae46898b82121e2David Blaikie cast<MemberPointerType>(T.getTypePtr()), chars); 12539dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } 12549dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::DITemplateValueParameter TVP = 125535178dc09d97bb2e0612813def09833866e3ad82David Blaikie DBuilder.createTemplateValueParameter(TheCU, Name, TTy, V); 12569dfd24324c079b564dda936c6ae46898b82121e2David Blaikie TemplateParams.push_back(TVP); 12579dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 12589dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::NullPtr: { 12599dfd24324c079b564dda936c6ae46898b82121e2David Blaikie QualType T = TA.getNullPtrType(); 12609dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::DIType TTy = getOrCreateType(T, Unit); 12619dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::Value *V = 0; 12629dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Special case member data pointer null values since they're actually -1 12639dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // instead of zero. 12649dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (const MemberPointerType *MPT = 12659dfd24324c079b564dda936c6ae46898b82121e2David Blaikie dyn_cast<MemberPointerType>(T.getTypePtr())) 12669dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // But treat member function pointers as simple zero integers because 12679dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // it's easier than having a special case in LLVM's CodeGen. If LLVM 12689dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // CodeGen grows handling for values of non-null member function 12699dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // pointers then perhaps we could remove this special case and rely on 12709dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // EmitNullMemberPointer for member function pointers. 12719dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (MPT->isMemberDataPointer()) 12729dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.getCXXABI().EmitNullMemberPointer(MPT); 12739dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (!V) 12749dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = llvm::ConstantInt::get(CGM.Int8Ty, 0); 12759dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::DITemplateValueParameter TVP = 127635178dc09d97bb2e0612813def09833866e3ad82David Blaikie DBuilder.createTemplateValueParameter(TheCU, Name, TTy, V); 127735178dc09d97bb2e0612813def09833866e3ad82David Blaikie TemplateParams.push_back(TVP); 127835178dc09d97bb2e0612813def09833866e3ad82David Blaikie } break; 127935178dc09d97bb2e0612813def09833866e3ad82David Blaikie case TemplateArgument::Template: { 128035178dc09d97bb2e0612813def09833866e3ad82David Blaikie llvm::DITemplateValueParameter TVP = 128135178dc09d97bb2e0612813def09833866e3ad82David Blaikie DBuilder.createTemplateTemplateParameter( 128235178dc09d97bb2e0612813def09833866e3ad82David Blaikie TheCU, Name, llvm::DIType(), 128335178dc09d97bb2e0612813def09833866e3ad82David Blaikie TA.getAsTemplate().getAsTemplateDecl() 128435178dc09d97bb2e0612813def09833866e3ad82David Blaikie ->getQualifiedNameAsString()); 128535178dc09d97bb2e0612813def09833866e3ad82David Blaikie TemplateParams.push_back(TVP); 128635178dc09d97bb2e0612813def09833866e3ad82David Blaikie } break; 128735178dc09d97bb2e0612813def09833866e3ad82David Blaikie case TemplateArgument::Pack: { 128835178dc09d97bb2e0612813def09833866e3ad82David Blaikie llvm::DITemplateValueParameter TVP = 128935178dc09d97bb2e0612813def09833866e3ad82David Blaikie DBuilder.createTemplateParameterPack( 129035178dc09d97bb2e0612813def09833866e3ad82David Blaikie TheCU, Name, llvm::DIType(), 129135178dc09d97bb2e0612813def09833866e3ad82David Blaikie CollectTemplateParams(NULL, TA.getPackAsArray(), Unit)); 12929dfd24324c079b564dda936c6ae46898b82121e2David Blaikie TemplateParams.push_back(TVP); 12939dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 1294e8065128777e13322aa2b4de86a362326e0c7686David Blaikie // And the following should never occur: 12959dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Expression: 12969dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::TemplateExpansion: 12979dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Null: 12989dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm_unreachable( 12999dfd24324c079b564dda936c6ae46898b82121e2David Blaikie "These argument types shouldn't exist in concrete types"); 13007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.getOrCreateArray(TemplateParams); 13037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectFunctionTemplateParams - A helper function to collect debug 13067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// info for function template parameters. 13077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIArray CGDebugInfo:: 13087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectFunctionTemplateParams(const FunctionDecl *FD, llvm::DIFile Unit) { 13097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FD->getTemplatedKind() == 13107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionDecl::TK_FunctionTemplateSpecialization) { 13117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateParameterList *TList = 13127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FD->getTemplateSpecializationInfo()->getTemplate() 13137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ->getTemplateParameters(); 131435178dc09d97bb2e0612813def09833866e3ad82David Blaikie return CollectTemplateParams( 131535178dc09d97bb2e0612813def09833866e3ad82David Blaikie TList, FD->getTemplateSpecializationArgs()->asArray(), Unit); 13167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIArray(); 13187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectCXXTemplateParams - A helper function to collect debug info for 13217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// template parameters. 13227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIArray CGDebugInfo:: 13237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectCXXTemplateParams(const ClassTemplateSpecializationDecl *TSpecial, 13247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 13257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::PointerUnion<ClassTemplateDecl *, 13267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ClassTemplatePartialSpecializationDecl *> 13277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PU = TSpecial->getSpecializedTemplateOrPartial(); 13286537f083555f9606c495d05c562878aa49bae987Eric Christopher 13297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateParameterList *TPList = PU.is<ClassTemplateDecl *>() ? 13307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PU.get<ClassTemplateDecl *>()->getTemplateParameters() : 13317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PU.get<ClassTemplatePartialSpecializationDecl *>()->getTemplateParameters(); 13327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgumentList &TAList = TSpecial->getTemplateInstantiationArgs(); 133335178dc09d97bb2e0612813def09833866e3ad82David Blaikie return CollectTemplateParams(TPList, TAList.asArray(), Unit); 13347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateVTablePtrType - Return debug info descriptor for vtable. 13377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getOrCreateVTablePtrType(llvm::DIFile Unit) { 13387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VTablePtrType.isValid()) 13397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VTablePtrType; 13407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTContext &Context = CGM.getContext(); 13427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /* Function type */ 13447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *STy = getOrCreateType(Context.IntTy, Unit); 13457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray SElements = DBuilder.getOrCreateArray(STy); 13467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType SubTy = DBuilder.createSubroutineType(Unit, SElements); 13477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Size = Context.getTypeSize(Context.VoidPtrTy); 13487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType vtbl_ptr_type = DBuilder.createPointerType(SubTy, Size, 0, 13497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "__vtbl_ptr_type"); 13507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTablePtrType = DBuilder.createPointerType(vtbl_ptr_type, Size); 13517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VTablePtrType; 13527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getVTableName - Get vtable name for the given Class. 13557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getVTableName(const CXXRecordDecl *RD) { 13567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Construct gdb compatible name name. 13577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Name = "_vptr$" + RD->getNameAsString(); 13587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Copy this name on the side and use its reference. 13607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei char *StrPtr = DebugInfoNames.Allocate<char>(Name.length()); 13617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(StrPtr, Name.data(), Name.length()); 13627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return StringRef(StrPtr, Name.length()); 13637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectVTableInfo - If the C++ class has vtable info then insert appropriate 13677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// debug info entry in EltTys vector. 13687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 13697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile Unit, 13707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &EltTys) { 13717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 13727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there is a primary base then it will hold vtable info. 13747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RL.getPrimaryBase()) 13757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 13767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this class is not dynamic then there is not any vtable info to collect. 13787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!RD->isDynamicClass()) 13797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 13807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 13827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType VPTR 13837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = DBuilder.createMemberType(Unit, getVTableName(RD), Unit, 1384f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher 0, Size, 0, 0, 1385f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher llvm::DIDescriptor::FlagArtificial, 13867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateVTablePtrType(Unit)); 13877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(VPTR); 13887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13906537f083555f9606c495d05c562878aa49bae987Eric Christopher/// getOrCreateRecordType - Emit record type's standalone debug info. 13916537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DIType CGDebugInfo::getOrCreateRecordType(QualType RTy, 13927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc) { 139313c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 13947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType T = getOrCreateType(RTy, getOrCreateFile(Loc)); 13957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 13967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateInterfaceType - Emit an objective c interface type standalone 13997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// debug info. 14007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getOrCreateInterfaceType(QualType D, 1401be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher SourceLocation Loc) { 140213c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 14037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType T = getOrCreateType(D, getOrCreateFile(Loc)); 1404ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl RetainedTypes.push_back(D.getAsOpaquePtr()); 14057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 14067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateType - get structure or union type. 14095f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikiellvm::DIType CGDebugInfo::CreateType(const RecordType *Ty, bool Declaration) { 14107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordDecl *RD = Ty->getDecl(); 1411776bfa16c96d501c7fd51beb14f929fa4736caacAdrian Prantl // Limited debug info should only remove struct definitions that can 1412776bfa16c96d501c7fd51beb14f929fa4736caacAdrian Prantl // safely be replaced by a forward declaration in the source code. 1413658cd2c287b1a0b419f51cd18e5a48d4560d1c56David Blaikie if (DebugKind <= CodeGenOptions::LimitedDebugInfo && Declaration && 1414ac00b79047318f917c5c49c487d5b8b3196e4d93David Blaikie !RD->isCompleteDefinitionRequired() && CGM.getLangOpts().CPlusPlus) { 1415776bfa16c96d501c7fd51beb14f929fa4736caacAdrian Prantl // FIXME: This implementation is problematic; there are some test 1416776bfa16c96d501c7fd51beb14f929fa4736caacAdrian Prantl // cases where we violate the above principle, such as 1417776bfa16c96d501c7fd51beb14f929fa4736caacAdrian Prantl // test/CodeGen/debug-info-records.c . 14185f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie llvm::DIDescriptor FDContext = 14195f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie getContextDescriptor(cast<Decl>(RD->getDeclContext())); 1420951094baa05a72f2623b7e25df609796ad97d908David Blaikie llvm::DIType RetTy = getOrCreateRecordFwdDecl(RD, FDContext); 14215f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = RetTy; 14225f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie return RetTy; 14235f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie } 14247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the record type for the debug info. 14267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); 14277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Records and classes and unions can all be recursive. To handle them, we 14297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // first generate a debug descriptor for the struct as a forward declaration. 14307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Then (if it is a definition) we go through and get debug info for all of 14317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // its members. Finally, we create a descriptor for the complete type (which 14327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // may refer to the forward decl if the struct is recursive) and replace all 14337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // uses of the forward declaration with the final definition. 14347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14354a0771680ee2fa8e76e1c0d54eaf69f459daf424David Blaikie llvm::DICompositeType FwdDecl(getOrCreateLimitedType(Ty, DefUnit)); 1436b6b0a711e4996a43e1932c20d0fd235bb711ad36Manman Ren assert(FwdDecl.isCompositeType() && 14379a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie "The debug type of a RecordType should be a llvm::DICompositeType"); 14387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FwdDecl.isForwardDecl()) 14407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return FwdDecl; 14417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Push the struct on region stack. 1443f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher LexicalBlockStack.push_back(&*FwdDecl); 14447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl); 14457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14464919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl // Add this to the completed-type cache while we're completing it recursively. 14477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CompletedTypeCache[QualType(Ty, 0).getAsOpaquePtr()] = FwdDecl; 14487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Convert all the elements. 14507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> EltTys; 14517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Note: The split of CXXDecl information here is intentional, the 14537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // gdb tests will depend on a certain ordering at printout. The debug 14547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // information offsets are still correct if we merge them all together 14557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // though. 14567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD); 14577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXDecl) { 14587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectCXXBases(CXXDecl, DefUnit, EltTys, FwdDecl); 14597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectVTableInfo(CXXDecl, DefUnit, EltTys); 14607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 14617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14620395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Collect data fields (including static variables and any initializers). 14637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectRecordFields(RD, DefUnit, EltTys, FwdDecl); 14647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXDecl) { 14657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectCXXMemberFunctions(CXXDecl, DefUnit, EltTys, FwdDecl); 14667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectCXXFriends(CXXDecl, DefUnit, EltTys, FwdDecl); 14677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 14687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 14707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap.erase(Ty->getDecl()); 14717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys); 14738058833e12dd9cd38107f6dde3d5a17021ad3a5dDavid Blaikie FwdDecl.setTypeArray(Elements); 1474bd0152fb251e84c6f335c66322b83a9af09fed0cNico Weber 1475f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl); 1476f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher return FwdDecl; 14777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateType - get objective-c object type. 14807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ObjCObjectType *Ty, 14817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 14827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore protocols. 14837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(Ty->getBaseType(), Unit); 14847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14865ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 14875ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl/// \return true if Getter has the default name for the property PD. 14885ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantlstatic bool hasDefaultGetterName(const ObjCPropertyDecl *PD, 14895ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl const ObjCMethodDecl *Getter) { 14905ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl assert(PD); 14915ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl if (!Getter) 14925ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl return true; 14935ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 14945ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl assert(Getter->getDeclName().isObjCZeroArgSelector()); 14955ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl return PD->getName() == 14965ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl Getter->getDeclName().getObjCSelector().getNameForSlot(0); 14975ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl} 14985ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 14995ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl/// \return true if Setter has the default name for the property PD. 15005ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantlstatic bool hasDefaultSetterName(const ObjCPropertyDecl *PD, 15015ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl const ObjCMethodDecl *Setter) { 15025ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl assert(PD); 15035ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl if (!Setter) 15045ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl return true; 15055ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 15065ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl assert(Setter->getDeclName().isObjCOneArgSelector()); 150780e8ea92d6dcaa05165dcb4730485db82dcd4629Adrian Prantl return SelectorTable::constructSetterName(PD->getName()) == 15085ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl Setter->getDeclName().getObjCSelector().getNameForSlot(0); 15095ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl} 15105ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 15117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateType - get objective-c interface type. 15127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, 15137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 15147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *ID = Ty->getDecl(); 15157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ID) 15167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 15177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the record type for the debug info. 15197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(ID->getLocation()); 15207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(ID->getLocation()); 15217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RuntimeLang = TheCU.getLanguage(); 15227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is just a forward declaration return a special forward-declaration 15247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // debug type since we won't be able to lay out the entire type. 15257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *Def = ID->getDefinition(); 15267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Def) { 15277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FwdDecl = 15287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 1529be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher ID->getName(), TheCU, DefUnit, Line, 1530be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher RuntimeLang); 15317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return FwdDecl; 15327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID = Def; 15357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 15377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 15387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 15397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 15417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID->getImplementation()) 15427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagObjcClassComplete; 15437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1544f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher llvm::DICompositeType RealDecl = 15457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createStructType(Unit, ID->getName(), DefUnit, 15467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Line, Size, Align, Flags, 1547c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie llvm::DIType(), llvm::DIArray(), RuntimeLang); 15487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise, insert it into the CompletedTypeCache so that recursive uses 15507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // will find it and we're emitting the complete type. 15514919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl QualType QualTy = QualType(Ty, 0); 15524919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl CompletedTypeCache[QualTy.getAsOpaquePtr()] = RealDecl; 15537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1554d3003dc68535e94fe2501265d68a10aec429d7d0Eric Christopher // Push the struct on region stack. 1555f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher LexicalBlockStack.push_back(static_cast<llvm::MDNode*>(RealDecl)); 15567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[Ty->getDecl()] = llvm::WeakVH(RealDecl); 15577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Convert all the elements. 15597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> EltTys; 15607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *SClass = ID->getSuperClass(); 15627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SClass) { 15637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType SClassTy = 15647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(CGM.getContext().getObjCInterfaceType(SClass), Unit); 15657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!SClassTy.isValid()) 15667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 15676537f083555f9606c495d05c562878aa49bae987Eric Christopher 15687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType InhTag = 15697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createInheritance(RealDecl, SClassTy, 0, 0); 15707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(InhTag); 15717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1573d3003dc68535e94fe2501265d68a10aec429d7d0Eric Christopher // Create entries for all of the properties. 15747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ObjCContainerDecl::prop_iterator I = ID->prop_begin(), 15757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = ID->prop_end(); I != E; ++I) { 15767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ObjCPropertyDecl *PD = *I; 15777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc = PD->getLocation(); 15787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile PUnit = getOrCreateFile(Loc); 15797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned PLine = getLineNumber(Loc); 15807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Getter = PD->getGetterMethodDecl(); 15817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Setter = PD->getSetterMethodDecl(); 15827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *PropertyNode = 15837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createObjCProperty(PD->getName(), 1584be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher PUnit, PLine, 15855ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl hasDefaultGetterName(PD, Getter) ? "" : 15867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getSelectorName(PD->getGetterName()), 15875ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl hasDefaultSetterName(PD, Setter) ? "" : 15887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getSelectorName(PD->getSetterName()), 15897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PD->getPropertyAttributes(), 1590be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher getOrCreateType(PD->getType(), PUnit)); 15917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(PropertyNode); 15927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &RL = CGM.getContext().getASTObjCInterfaceLayout(ID); 15957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldNo = 0; 15967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ObjCIvarDecl *Field = ID->all_declared_ivar_begin(); Field; 15977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Field = Field->getNextIvar(), ++FieldNo) { 15987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy = getOrCreateType(Field->getType(), Unit); 15997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FieldTy.isValid()) 16007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 16016537f083555f9606c495d05c562878aa49bae987Eric Christopher 16027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef FieldName = Field->getName(); 16037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore unnamed fields. 16057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FieldName.empty()) 16067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 16077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the location for the field. 16097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile FieldDefUnit = getOrCreateFile(Field->getLocation()); 16107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldLine = getLineNumber(Field->getLocation()); 16117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FType = Field->getType(); 16127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize = 0; 16137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign = 0; 16147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FType->isIncompleteArrayType()) { 16167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 16187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize = Field->isBitField() 1619d3003dc68535e94fe2501265d68a10aec429d7d0Eric Christopher ? Field->getBitWidthValue(CGM.getContext()) 1620d3003dc68535e94fe2501265d68a10aec429d7d0Eric Christopher : CGM.getContext().getTypeSize(FType); 16217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldAlign = CGM.getContext().getTypeAlign(FType); 16227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldOffset; 16257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CGM.getLangOpts().ObjCRuntime.isNonFragile()) { 16267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We don't know the runtime offset of an ivar if we're using the 16277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // non-fragile ABI. For bitfields, use the bit offset into the first 16287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // byte of storage of the bitfield. For other fields, use zero. 16297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Field->isBitField()) { 16307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = CGM.getObjCRuntime().ComputeBitfieldBitOffset( 16317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM, ID, Field); 16327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset %= CGM.getContext().getCharWidth(); 16337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 16347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 16357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 16377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = RL.getFieldOffset(FieldNo); 16387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 16417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Field->getAccessControl() == ObjCIvarDecl::Protected) 16427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags = llvm::DIDescriptor::FlagProtected; 16437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (Field->getAccessControl() == ObjCIvarDecl::Private) 16447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags = llvm::DIDescriptor::FlagPrivate; 16457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *PropertyNode = NULL; 16477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ObjCImplementationDecl *ImpD = ID->getImplementation()) { 16486537f083555f9606c495d05c562878aa49bae987Eric Christopher if (ObjCPropertyImplDecl *PImpD = 16497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ImpD->FindPropertyImplIvarDecl(Field->getIdentifier())) { 16507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ObjCPropertyDecl *PD = PImpD->getPropertyDecl()) { 1651be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher SourceLocation Loc = PD->getLocation(); 1652be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher llvm::DIFile PUnit = getOrCreateFile(Loc); 1653be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher unsigned PLine = getLineNumber(Loc); 16547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Getter = PD->getGetterMethodDecl(); 16557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Setter = PD->getSetterMethodDecl(); 16567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PropertyNode = 16577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createObjCProperty(PD->getName(), 16587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PUnit, PLine, 16595ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl hasDefaultGetterName(PD, Getter) ? "" : 16607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getSelectorName(PD->getGetterName()), 16615ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl hasDefaultSetterName(PD, Setter) ? "" : 16627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getSelectorName(PD->getSetterName()), 16637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PD->getPropertyAttributes(), 16647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(PD->getType(), PUnit)); 16657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldTy = DBuilder.createObjCIVar(FieldName, FieldDefUnit, 16697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldLine, FieldSize, FieldAlign, 16707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset, Flags, FieldTy, 16717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PropertyNode); 16727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(FieldTy); 16737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys); 1676f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher RealDecl.setTypeArray(Elements); 16774919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl 16784919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl // If the implementation is not yet set, we do not want to mark it 16794919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl // as complete. An implementation may declare additional 16804919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl // private ivars that we would miss otherwise. 16814919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl if (ID->getImplementation() == 0) 16824919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl CompletedTypeCache.erase(QualTy.getAsOpaquePtr()); 16836537f083555f9606c495d05c562878aa49bae987Eric Christopher 16847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 1685f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher return RealDecl; 16867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 16877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const VectorType *Ty, llvm::DIFile Unit) { 16897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType ElementTy = getOrCreateType(Ty->getElementType(), Unit); 16907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei int64_t Count = Ty->getNumElements(); 16917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Count == 0) 16927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If number of elements are not known then this is an unbounded array. 16937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use Count == -1 to express such arrays. 16947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Count = -1; 16957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *Subscript = DBuilder.getOrCreateSubrange(0, Count); 16977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray SubscriptArray = DBuilder.getOrCreateArray(Subscript); 16987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 17007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 17017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createVectorType(Size, Align, ElementTy, SubscriptArray); 17037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ArrayType *Ty, 17067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 17077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size; 17087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align; 17097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: make getTypeAlign() aware of VLAs and incomplete array types 17117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(Ty)) { 17127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = 0; 17137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = 17147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getContext().getTypeAlign(CGM.getContext().getBaseElementType(VAT)); 17157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Ty->isIncompleteArrayType()) { 17167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = 0; 17177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty->getElementType()->isIncompleteType()) 17187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = 0; 17197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 17207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = CGM.getContext().getTypeAlign(Ty->getElementType()); 1721089db2e3af0b6166a8e2253c453eccf551ddfbd8David Blaikie } else if (Ty->isIncompleteType()) { 17227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = 0; 17237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = 0; 17247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 17257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Size and align of the whole array, not the element type. 17267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = CGM.getContext().getTypeSize(Ty); 17277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = CGM.getContext().getTypeAlign(Ty); 17287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add the dimensions of the array. FIXME: This loses CV qualifiers from 17317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // interior arrays, do we care? Why aren't nested arrays represented the 17327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // obvious/recursive way? 17337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 8> Subscripts; 17347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType EltTy(Ty, 0); 17357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while ((Ty = dyn_cast<ArrayType>(EltTy))) { 17367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the number of elements is known, then count is that number. Otherwise, 17377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // it's -1. This allows us to represent a subrange with an array of 0 17387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // elements, like this: 17397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 17407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // struct foo { 17417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // int x[0]; 17427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // }; 17437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei int64_t Count = -1; // Count == -1 is an unbounded array. 17447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(Ty)) 17457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Count = CAT->getSize().getZExtValue(); 17466537f083555f9606c495d05c562878aa49bae987Eric Christopher 17477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Verify this is right for VLAs. 17487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Subscripts.push_back(DBuilder.getOrCreateSubrange(0, Count)); 17497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTy = Ty->getElementType(); 17507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray SubscriptArray = DBuilder.getOrCreateArray(Subscripts); 17537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17546537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIType DbgTy = 17557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createArrayType(Size, Align, getOrCreateType(EltTy, Unit), 17567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubscriptArray); 17577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 17587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17606537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DIType CGDebugInfo::CreateType(const LValueReferenceType *Ty, 17617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 17626537f083555f9606c495d05c562878aa49bae987Eric Christopher return CreatePointerLikeType(llvm::dwarf::DW_TAG_reference_type, 17637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty, Ty->getPointeeType(), Unit); 17647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17666537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DIType CGDebugInfo::CreateType(const RValueReferenceType *Ty, 17677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 17686537f083555f9606c495d05c562878aa49bae987Eric Christopher return CreatePointerLikeType(llvm::dwarf::DW_TAG_rvalue_reference_type, 17697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty, Ty->getPointeeType(), Unit); 17707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17726537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DIType CGDebugInfo::CreateType(const MemberPointerType *Ty, 17737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile U) { 1774e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie llvm::DIType ClassType = getOrCreateType(QualType(Ty->getClass(), 0), U); 1775e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie if (!Ty->getPointeeType()->isFunctionType()) 1776e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie return DBuilder.createMemberPointerType( 1777b3c2377422e820ab9d95145ab67a2fb9f9f4bf3fDavid Blaikie getOrCreateType(Ty->getPointeeType(), U, true), ClassType); 1778e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie return DBuilder.createMemberPointerType(getOrCreateInstanceMethodType( 1779e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie CGM.getContext().getPointerType( 1780e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie QualType(Ty->getClass(), Ty->getPointeeType().getCVRQualifiers())), 1781e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie Ty->getPointeeType()->getAs<FunctionProtoType>(), U), 1782e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie ClassType); 17837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17856537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DIType CGDebugInfo::CreateType(const AtomicType *Ty, 17867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile U) { 17877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore the atomic wrapping 17887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: What is the correct representation? 17897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(Ty->getValueType(), U); 17907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateEnumType - get enumeration type. 17937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateEnumType(const EnumDecl *ED) { 17947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = 0; 17957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = 0; 17967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ED->getTypeForDecl()->isIncompleteType()) { 17977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = CGM.getContext().getTypeSize(ED->getTypeForDecl()); 17987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = CGM.getContext().getTypeAlign(ED->getTypeForDecl()); 17997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is just a forward declaration, construct an appropriately 18027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // marked node and just return it. 18037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ED->getDefinition()) { 18047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor EDContext; 18057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EDContext = getContextDescriptor(cast<Decl>(ED->getDeclContext())); 18067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(ED->getLocation()); 18077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(ED->getLocation()); 18087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef EDName = ED->getName(); 18097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_enumeration_type, 18107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EDName, EDContext, DefUnit, Line, 0, 18117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size, Align); 18127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create DIEnumerator elements for each enumerator. 18157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> Enumerators; 18167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ED = ED->getDefinition(); 18177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (EnumDecl::enumerator_iterator 18187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Enum = ED->enumerator_begin(), EnumEnd = ED->enumerator_end(); 18197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Enum != EnumEnd; ++Enum) { 18207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Enumerators.push_back( 18217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createEnumerator(Enum->getName(), 1822ac8f43c9cb71880ed3fa7f56a2a2429eafbd4625David Blaikie Enum->getInitVal().getSExtValue())); 18237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Return a CompositeType for the enum itself. 18267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray EltArray = DBuilder.getOrCreateArray(Enumerators); 18277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(ED->getLocation()); 18297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(ED->getLocation()); 18306537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIDescriptor EnumContext = 18317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(cast<Decl>(ED->getDeclContext())); 183259d6a71d681adfdc7d976492eeb3deae84e8f2e2Adrian Prantl llvm::DIType ClassTy = ED->isFixed() ? 18337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(ED->getIntegerType(), DefUnit) : llvm::DIType(); 18346537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIType DbgTy = 18357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createEnumerationType(EnumContext, ED->getName(), DefUnit, Line, 18367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size, Align, EltArray, 18377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ClassTy); 18387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 18397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18414b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikiestatic QualType UnwrapTypeForDebugInfo(QualType T, const ASTContext &C) { 18424b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Qualifiers Quals; 18437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei do { 18444b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Quals += T.getLocalQualifiers(); 18457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType LastT = T; 18467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (T->getTypeClass()) { 18477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 18484b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie return C.getQualifiedType(T.getTypePtr(), Quals); 18497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TemplateSpecialization: 18507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<TemplateSpecializationType>(T)->desugar(); 18517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOfExpr: 18537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType(); 18547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOf: 18567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<TypeOfType>(T)->getUnderlyingType(); 18577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Decltype: 18597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<DecltypeType>(T)->getUnderlyingType(); 18607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::UnaryTransform: 18627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<UnaryTransformType>(T)->getUnderlyingType(); 18637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Attributed: 18657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<AttributedType>(T)->getEquivalentType(); 18667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Elaborated: 18687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<ElaboratedType>(T)->getNamedType(); 18697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Paren: 18717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<ParenType>(T)->getInnerType(); 18727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18734b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie case Type::SubstTemplateTypeParm: 18747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<SubstTemplateTypeParmType>(T)->getReplacementType(); 18757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Auto: 1877912964863c344dd84976ee281bd213d0485645baDavid Blaikie QualType DT = cast<AutoType>(T)->getDeducedType(); 1878912964863c344dd84976ee281bd213d0485645baDavid Blaikie if (DT.isNull()) 1879912964863c344dd84976ee281bd213d0485645baDavid Blaikie return T; 1880912964863c344dd84976ee281bd213d0485645baDavid Blaikie T = DT; 18817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18836537f083555f9606c495d05c562878aa49bae987Eric Christopher 18847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(T != LastT && "Type unwrapping failed to unwrap!"); 1885d24c9ab90b42370bb417f44e001a0347ee1ca87eNAKAMURA Takumi (void)LastT; 18867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } while (true); 18877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1889f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher/// getType - Get the type from the cache or return null type if it doesn't 1890f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher/// exist. 18917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getTypeOrNull(QualType Ty) { 18927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Unwrap the type as needed for debug information. 18944b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext()); 18956537f083555f9606c495d05c562878aa49bae987Eric Christopher 18967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check for existing entry. 1897ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl if (Ty->getTypeClass() == Type::ObjCInterface) { 1898ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl llvm::Value *V = getCachedInterfaceTypeOrNull(Ty); 1899ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl if (V) 1900ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl return llvm::DIType(cast<llvm::MDNode>(V)); 1901ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl else return llvm::DIType(); 1902ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl } 1903ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 19047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<void *, llvm::WeakVH>::iterator it = 19057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeCache.find(Ty.getAsOpaquePtr()); 19067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (it != TypeCache.end()) { 19077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Verify that the debug info still exists. 19087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::Value *V = it->second) 19097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(cast<llvm::MDNode>(V)); 19107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 19137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 19147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getCompletedTypeOrNull - Get the type from the cache or return null if it 19167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// doesn't exist. 19177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getCompletedTypeOrNull(QualType Ty) { 19187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Unwrap the type as needed for debug information. 19204b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext()); 19217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check for existing entry. 19234919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl llvm::Value *V = 0; 19247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<void *, llvm::WeakVH>::iterator it = 19257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CompletedTypeCache.find(Ty.getAsOpaquePtr()); 19264919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl if (it != CompletedTypeCache.end()) 19274919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl V = it->second; 19284919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl else { 1929ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl V = getCachedInterfaceTypeOrNull(Ty); 19307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19324919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl // Verify that any cached debug info still exists. 193300383088ac262a998b83892056090622275d1992David Blaikie return llvm::DIType(cast_or_null<llvm::MDNode>(V)); 1934eab6a36cf1eed9a7fec0babd2206048e28dedd02David Blaikie} 19356bb110292c4e33a6ee2856cf91e0774107aa7d9cAdrian Prantl 1936eab6a36cf1eed9a7fec0babd2206048e28dedd02David Blaikievoid CGDebugInfo::completeFwdDecl(const RecordDecl &RD) { 1937eab6a36cf1eed9a7fec0babd2206048e28dedd02David Blaikie // In limited debug info we only want to do this if the complete type was 1938eab6a36cf1eed9a7fec0babd2206048e28dedd02David Blaikie // required. 1939ac00b79047318f917c5c49c487d5b8b3196e4d93David Blaikie if (DebugKind <= CodeGenOptions::LimitedDebugInfo && 1940ac00b79047318f917c5c49c487d5b8b3196e4d93David Blaikie CGM.getLangOpts().CPlusPlus) 1941eab6a36cf1eed9a7fec0babd2206048e28dedd02David Blaikie return; 19424919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl 1943076f51fd1f306cafc3b1f1d323d25ac81bf7d4f7David Blaikie QualType QTy = CGM.getContext().getRecordType(&RD); 1944076f51fd1f306cafc3b1f1d323d25ac81bf7d4f7David Blaikie llvm::DIType T = getTypeOrNull(QTy); 1945eab6a36cf1eed9a7fec0babd2206048e28dedd02David Blaikie 1946b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (T && T.isForwardDecl()) 1947076f51fd1f306cafc3b1f1d323d25ac81bf7d4f7David Blaikie getOrCreateType(QTy, getOrCreateFile(RD.getLocation())); 19487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 19497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1950ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl/// getCachedInterfaceTypeOrNull - Get the type from the interface 1951ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl/// cache, unless it needs to regenerated. Otherwise return null. 1952ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantlllvm::Value *CGDebugInfo::getCachedInterfaceTypeOrNull(QualType Ty) { 1953ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // Is there a cached interface that hasn't changed? 1954ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl llvm::DenseMap<void *, std::pair<llvm::WeakVH, unsigned > > 1955ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl ::iterator it1 = ObjCInterfaceCache.find(Ty.getAsOpaquePtr()); 1956ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 1957ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl if (it1 != ObjCInterfaceCache.end()) 1958ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl if (ObjCInterfaceDecl* Decl = getObjCInterfaceDecl(Ty)) 1959ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl if (Checksum(Decl) == it1->second.second) 1960ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // Return cached forward declaration. 1961ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl return it1->second.first; 1962ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 1963ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl return 0; 1964ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl} 19657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateType - Get the type from the cache or create a new 19677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// one if necessary. 196856b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopherllvm::DIType CGDebugInfo::getOrCreateType(QualType Ty, llvm::DIFile Unit, 196956b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher bool Declaration) { 19707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty.isNull()) 19717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 19727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Unwrap the type as needed for debug information. 19744b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext()); 19757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 197600383088ac262a998b83892056090622275d1992David Blaikie if (llvm::DIType T = getCompletedTypeOrNull(Ty)) { 1977f0c31d98d3db8ed76077999d10ac45ed23f7e75eDavid Blaikie // If we're looking for a definition, make sure we have definitions of any 1978f0c31d98d3db8ed76077999d10ac45ed23f7e75eDavid Blaikie // underlying types. 1979f0c31d98d3db8ed76077999d10ac45ed23f7e75eDavid Blaikie if (const TypedefType* TTy = dyn_cast<TypedefType>(Ty)) 1980f0c31d98d3db8ed76077999d10ac45ed23f7e75eDavid Blaikie getOrCreateType(TTy->getDecl()->getUnderlyingType(), Unit, Declaration); 1981f0c31d98d3db8ed76077999d10ac45ed23f7e75eDavid Blaikie if (Ty.hasLocalQualifiers()) 1982f0c31d98d3db8ed76077999d10ac45ed23f7e75eDavid Blaikie getOrCreateType(QualType(Ty.getTypePtr(), 0), Unit, Declaration); 19837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 1984f0c31d98d3db8ed76077999d10ac45ed23f7e75eDavid Blaikie } 19857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise create the type. 19875f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie llvm::DIType Res = CreateTypeNode(Ty, Unit, Declaration); 1988ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl void* TyPtr = Ty.getAsOpaquePtr(); 1989ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 1990ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // And update the type cache. 1991ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl TypeCache[TyPtr] = Res; 19927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType TC = getTypeOrNull(Ty); 1994b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (TC && TC.isForwardDecl()) 1995ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl ReplaceMap.push_back(std::make_pair(TyPtr, static_cast<llvm::Value*>(TC))); 1996ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl else if (ObjCInterfaceDecl* Decl = getObjCInterfaceDecl(Ty)) { 1997ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // Interface types may have elements added to them by a 1998ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // subsequent implementation or extension, so we keep them in 1999ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // the ObjCInterfaceCache together with a checksum. Instead of 2000f06989b9f360e2b43cb1d94c317cc6e1826f7611Adrian Prantl // the (possibly) incomplete interface type, we return a forward 2001ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // declaration that gets RAUW'd in CGDebugInfo::finalize(). 2002e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie std::pair<llvm::WeakVH, unsigned> &V = ObjCInterfaceCache[TyPtr]; 2003e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie if (V.first) 2004e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie return llvm::DIType(cast<llvm::MDNode>(V.first)); 2005e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie TC = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 2006e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie Decl->getName(), TheCU, Unit, 2007e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie getLineNumber(Decl->getLocation()), 2008e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie TheCU.getLanguage()); 2009e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie // Store the forward declaration in the cache. 2010e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie V.first = TC; 2011e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie V.second = Checksum(Decl); 2012e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie 2013e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie // Register the type for replacement in finalize(). 2014e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie ReplaceMap.push_back(std::make_pair(TyPtr, static_cast<llvm::Value*>(TC))); 2015e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie 2016ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl return TC; 2017ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl } 20187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Res.isForwardDecl()) 2020ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl CompletedTypeCache[TyPtr] = Res; 20217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Res; 20237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2025b5a50075d810002c718711675aae067f92b80670Adrian Prantl/// Currently the checksum of an interface includes the number of 2026b5a50075d810002c718711675aae067f92b80670Adrian Prantl/// ivars and property accessors. 202756b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopherunsigned CGDebugInfo::Checksum(const ObjCInterfaceDecl *ID) { 20284f97f853357e2769db3d7999424e346ac5adb297Adrian Prantl // The assumption is that the number of ivars can only increase 20294f97f853357e2769db3d7999424e346ac5adb297Adrian Prantl // monotonically, so it is safe to just use their current number as 20304f97f853357e2769db3d7999424e346ac5adb297Adrian Prantl // a checksum. 2031b5a50075d810002c718711675aae067f92b80670Adrian Prantl unsigned Sum = 0; 2032b5a50075d810002c718711675aae067f92b80670Adrian Prantl for (const ObjCIvarDecl *Ivar = ID->all_declared_ivar_begin(); 2033b5a50075d810002c718711675aae067f92b80670Adrian Prantl Ivar != 0; Ivar = Ivar->getNextIvar()) 2034b5a50075d810002c718711675aae067f92b80670Adrian Prantl ++Sum; 2035b5a50075d810002c718711675aae067f92b80670Adrian Prantl 2036b5a50075d810002c718711675aae067f92b80670Adrian Prantl return Sum; 20374919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl} 20384919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl 20394919de6a53a007487c6d6b173921b5e7152a2004Adrian PrantlObjCInterfaceDecl *CGDebugInfo::getObjCInterfaceDecl(QualType Ty) { 20404919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl switch (Ty->getTypeClass()) { 20414919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl case Type::ObjCObjectPointer: 2042f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher return getObjCInterfaceDecl(cast<ObjCObjectPointerType>(Ty) 2043f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher ->getPointeeType()); 20444919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl case Type::ObjCInterface: 20454919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl return cast<ObjCInterfaceType>(Ty)->getDecl(); 20464919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl default: 20474919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl return 0; 20484919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl } 20494919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl} 20504919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl 20517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateTypeNode - Create a new debug type node. 205256b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopherllvm::DIType CGDebugInfo::CreateTypeNode(QualType Ty, llvm::DIFile Unit, 205356b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher bool Declaration) { 20547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Handle qualifiers, which recursively handles what they refer to. 20557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty.hasLocalQualifiers()) 20565f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie return CreateQualifiedType(Ty, Unit, Declaration); 20577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const char *Diag = 0; 20596537f083555f9606c495d05c562878aa49bae987Eric Christopher 20607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Work out details of type. 20617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Ty->getTypeClass()) { 20627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define TYPE(Class, Base) 20637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define ABSTRACT_TYPE(Class, Base) 20647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define NON_CANONICAL_TYPE(Class, Base) 20657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define DEPENDENT_TYPE(Class, Base) case Type::Class: 20667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/TypeNodes.def" 20677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Dependent types cannot show up in debug information"); 20687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ExtVector: 20707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Vector: 20717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<VectorType>(Ty), Unit); 20727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCObjectPointer: 20737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ObjCObjectPointerType>(Ty), Unit); 20747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCObject: 20757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ObjCObjectType>(Ty), Unit); 20767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCInterface: 20777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ObjCInterfaceType>(Ty), Unit); 20787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Builtin: 20797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<BuiltinType>(Ty)); 20807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Complex: 20817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ComplexType>(Ty)); 20827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Pointer: 20837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<PointerType>(Ty), Unit); 208412df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner case Type::Decayed: 208512df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner // Decayed types are just pointers in LLVM and DWARF. 208612df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner return CreateType( 208712df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner cast<PointerType>(cast<DecayedType>(Ty)->getDecayedType()), Unit); 20887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::BlockPointer: 20897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<BlockPointerType>(Ty), Unit); 20907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Typedef: 20915f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie return CreateType(cast<TypedefType>(Ty), Unit, Declaration); 20927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Record: 20935f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie return CreateType(cast<RecordType>(Ty), Declaration); 20947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Enum: 20957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateEnumType(cast<EnumType>(Ty)->getDecl()); 20967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::FunctionProto: 20977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::FunctionNoProto: 20987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<FunctionType>(Ty), Unit); 20997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ConstantArray: 21007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::VariableArray: 21017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::IncompleteArray: 21027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ArrayType>(Ty), Unit); 21037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::LValueReference: 21057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<LValueReferenceType>(Ty), Unit); 21067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::RValueReference: 21077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<RValueReferenceType>(Ty), Unit); 21087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::MemberPointer: 21107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<MemberPointerType>(Ty), Unit); 21117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Atomic: 21137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<AtomicType>(Ty), Unit); 21147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Attributed: 21167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TemplateSpecialization: 21177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Elaborated: 21187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Paren: 21197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::SubstTemplateTypeParm: 21207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOfExpr: 21217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOf: 21227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Decltype: 21237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::UnaryTransform: 2124226399ce18cdcbb1e83af7c5e644bdabb9d4f2f8David Blaikie case Type::PackExpansion: 21257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("type should have been unwrapped!"); 2126912964863c344dd84976ee281bd213d0485645baDavid Blaikie case Type::Auto: 2127912964863c344dd84976ee281bd213d0485645baDavid Blaikie Diag = "auto"; 2128912964863c344dd84976ee281bd213d0485645baDavid Blaikie break; 21297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 21306537f083555f9606c495d05c562878aa49bae987Eric Christopher 21317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Diag && "Fall through without a diagnostic?"); 21327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DiagID = CGM.getDiags().getCustomDiagID(DiagnosticsEngine::Error, 21337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "debug information for %0 is not yet supported"); 21347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getDiags().Report(DiagID) 21357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << Diag; 21367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 21377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateLimitedType - Get the type from the cache or create a new 21407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// limited type if necessary. 21414a0771680ee2fa8e76e1c0d54eaf69f459daf424David Blaikiellvm::DIType CGDebugInfo::getOrCreateLimitedType(const RecordType *Ty, 2142be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher llvm::DIFile Unit) { 21434a0771680ee2fa8e76e1c0d54eaf69f459daf424David Blaikie QualType QTy(Ty, 0); 21447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21454a0771680ee2fa8e76e1c0d54eaf69f459daf424David Blaikie llvm::DIType T = getTypeOrNull(QTy); 21467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We may have cached a forward decl when we could have created 21487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // a non-forward decl. Go ahead and create a non-forward decl 21497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // now. 2150b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (T && !T.isForwardDecl()) return T; 21517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise create the type. 21534a0771680ee2fa8e76e1c0d54eaf69f459daf424David Blaikie llvm::DIType Res = CreateLimitedType(Ty); 21547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2155b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (T && T.isForwardDecl()) 21564a0771680ee2fa8e76e1c0d54eaf69f459daf424David Blaikie ReplaceMap.push_back( 21574a0771680ee2fa8e76e1c0d54eaf69f459daf424David Blaikie std::make_pair(QTy.getAsOpaquePtr(), static_cast<llvm::Value *>(T))); 21587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // And update the type cache. 21604a0771680ee2fa8e76e1c0d54eaf69f459daf424David Blaikie TypeCache[QTy.getAsOpaquePtr()] = Res; 21617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Res; 21627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// TODO: Currently used for context chains when limiting debug info. 21657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateLimitedType(const RecordType *Ty) { 21667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordDecl *RD = Ty->getDecl(); 21676537f083555f9606c495d05c562878aa49bae987Eric Christopher 21687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the record type for the debug info. 21697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); 21707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(RD->getLocation()); 21717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef RDName = getClassName(RD); 21727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor RDContext; 217413c976710415041fca5aba25cc02d3813c74b990Eric Christopher if (DebugKind == CodeGenOptions::LimitedDebugInfo) 21757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RDContext = createContextChain(cast<Decl>(RD->getDeclContext())); 21767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 21777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RDContext = getContextDescriptor(cast<Decl>(RD->getDeclContext())); 21787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is just a forward declaration, construct an appropriately 21807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // marked node and just return it. 21817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!RD->getDefinition()) 2182951094baa05a72f2623b7e25df609796ad97d908David Blaikie return getOrCreateRecordFwdDecl(RD, RDContext); 21837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 21857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 21862fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie llvm::DICompositeType RealDecl; 21876537f083555f9606c495d05c562878aa49bae987Eric Christopher 21887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RD->isUnion()) 21897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RealDecl = DBuilder.createUnionType(RDContext, RDName, DefUnit, Line, 2190be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher Size, Align, 0, llvm::DIArray()); 21917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (RD->isClass()) { 21927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: This could be a struct type giving a default visibility different 21937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // than C++ class type, but needs llvm metadata changes first. 21947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RealDecl = DBuilder.createClassType(RDContext, RDName, DefUnit, Line, 2195be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher Size, Align, 0, 0, llvm::DIType(), 2196be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher llvm::DIArray(), llvm::DIType(), 2197be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher llvm::DIArray()); 21987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else 21997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RealDecl = DBuilder.createStructType(RDContext, RDName, DefUnit, Line, 2200f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher Size, Align, 0, llvm::DIType(), 2201f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher llvm::DIArray()); 22027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[Ty->getDecl()] = llvm::WeakVH(RealDecl); 22042fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = RealDecl; 22057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2206841b37c346380d051f827a874a4f1d97cbbe52cfDavid Blaikie if (const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD)) { 22077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // A class's primary base or the class itself contains the vtable. 22082fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie llvm::DICompositeType ContainingType; 22097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 22107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXRecordDecl *PBase = RL.getPrimaryBase()) { 22117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Seek non virtual primary base root. 22127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (1) { 2213be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher const ASTRecordLayout &BRL = CGM.getContext().getASTRecordLayout(PBase); 2214be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher const CXXRecordDecl *PBT = BRL.getPrimaryBase(); 2215be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher if (PBT && !BRL.isPrimaryBaseVirtual()) 2216be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher PBase = PBT; 2217be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher else 2218be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher break; 22197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22202fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie ContainingType = llvm::DICompositeType( 22212fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie getOrCreateType(QualType(PBase->getTypeForDecl(), 0), DefUnit)); 22222fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie } else if (CXXDecl->isDynamicClass()) 22237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContainingType = RealDecl; 22247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22252fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie RealDecl.setContainingType(ContainingType); 22268058833e12dd9cd38107f6dde3d5a17021ad3a5dDavid Blaikie if (const ClassTemplateSpecializationDecl *TSpecial = 22278058833e12dd9cd38107f6dde3d5a17021ad3a5dDavid Blaikie dyn_cast<ClassTemplateSpecializationDecl>(CXXDecl)) 22288058833e12dd9cd38107f6dde3d5a17021ad3a5dDavid Blaikie RealDecl.setTypeArray(llvm::DIArray(), 22298058833e12dd9cd38107f6dde3d5a17021ad3a5dDavid Blaikie CollectCXXTemplateParams(TSpecial, DefUnit)); 22307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(RealDecl); 22327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 22337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateMemberType - Create new member and increase Offset by FType's size. 22357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateMemberType(llvm::DIFile Unit, QualType FType, 22367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name, 22377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t *Offset) { 22387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy = CGDebugInfo::getOrCreateType(FType, Unit); 22397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize = CGM.getContext().getTypeSize(FType); 22407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign = CGM.getContext().getTypeAlign(FType); 22417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty = DBuilder.createMemberType(Unit, Name, Unit, 0, 22427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize, FieldAlign, 22437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *Offset, 0, FieldTy); 22447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *Offset += FieldSize; 22457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Ty; 22467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 22477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22489faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikiellvm::DIDescriptor CGDebugInfo::getDeclarationOrDefinition(const Decl *D) { 22499faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // We only need a declaration (not a definition) of the type - so use whatever 22509faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // we would otherwise do to get a type for a pointee. (forward declarations in 22519faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // limited debug info, full definitions (if the type definition is available) 22529faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // in unlimited debug info) 2253b3c2377422e820ab9d95145ab67a2fb9f9f4bf3fDavid Blaikie if (const TypeDecl *TD = dyn_cast<TypeDecl>(D)) 2254b3c2377422e820ab9d95145ab67a2fb9f9f4bf3fDavid Blaikie return getOrCreateType(CGM.getContext().getTypeDeclType(TD), 2255b3c2377422e820ab9d95145ab67a2fb9f9f4bf3fDavid Blaikie getOrCreateFile(TD->getLocation()), true); 22569faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // Otherwise fall back to a fairly rudimentary cache of existing declarations. 22579faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // This doesn't handle providing declarations (for functions or variables) for 22589faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // entities without definitions in this TU, nor when the definition proceeds 22599faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // the call to this function. 22609faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // FIXME: This should be split out into more specific maps with support for 22619faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // emitting forward declarations and merging definitions with declarations, 22629faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // the same way as we do for types. 22639faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator I = 22649faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie DeclCache.find(D->getCanonicalDecl()); 22659faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (I == DeclCache.end()) 22669faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return llvm::DIDescriptor(); 22679faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie llvm::Value *V = I->second; 22689faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return llvm::DIDescriptor(dyn_cast_or_null<llvm::MDNode>(V)); 22699faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie} 22709faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie 22717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getFunctionDeclaration - Return debug info descriptor to describe method 22727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// declaration for the given method definition. 22737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DISubprogram CGDebugInfo::getFunctionDeclaration(const Decl *D) { 227423e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie if (!D || DebugKind == CodeGenOptions::DebugLineTablesOnly) 227523e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie return llvm::DISubprogram(); 227623e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie 22777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FunctionDecl *FD = dyn_cast<FunctionDecl>(D); 22787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FD) return llvm::DISubprogram(); 22797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Setup context. 2281d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie llvm::DIScope S = getContextDescriptor(cast<Decl>(D->getDeclContext())); 22827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator 22847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MI = SPCache.find(FD->getCanonicalDecl()); 2285d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie if (MI == SPCache.end()) { 2286d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) { 2287d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie llvm::DICompositeType T(S); 2288d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie llvm::DISubprogram SP = CreateCXXMemberFunction(MD, getOrCreateFile(MD->getLocation()), T); 2289d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie T.addMember(SP); 2290d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie return SP; 2291d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie } 2292d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie } 22937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MI != SPCache.end()) { 22947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = MI->second; 22957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DISubprogram SP(dyn_cast_or_null<llvm::MDNode>(V)); 229623e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie if (SP.isSubprogram() && !SP.isDefinition()) 22977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SP; 22987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (FunctionDecl::redecl_iterator I = FD->redecls_begin(), 23017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = FD->redecls_end(); I != E; ++I) { 23027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FunctionDecl *NextFD = *I; 23037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator 23047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MI = SPCache.find(NextFD->getCanonicalDecl()); 23057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MI != SPCache.end()) { 23067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = MI->second; 23077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DISubprogram SP(dyn_cast_or_null<llvm::MDNode>(V)); 230823e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie if (SP.isSubprogram() && !SP.isDefinition()) 23097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SP; 23107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DISubprogram(); 23137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 23147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// getOrCreateFunctionType - Construct DIType. If it is a c++ method, include 23167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// implicit parameter "this". 23179a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikiellvm::DICompositeType CGDebugInfo::getOrCreateFunctionType(const Decl *D, 23189a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie QualType FnType, 23199a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie llvm::DIFile F) { 232023e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie if (!D || DebugKind == CodeGenOptions::DebugLineTablesOnly) 232123e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie // Create fake but valid subroutine type. Otherwise 232223e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie // llvm::DISubprogram::Verify() would return false, and 232323e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie // subprogram DIE will miss DW_AT_decl_file and 232423e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie // DW_AT_decl_line fields. 232523e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie return DBuilder.createSubroutineType(F, DBuilder.getOrCreateArray(None)); 23267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) 23287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateMethodType(Method, F); 23297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const ObjCMethodDecl *OMethod = dyn_cast<ObjCMethodDecl>(D)) { 23307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add "self" and "_cmd" 23317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> Elts; 23327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // First element is always return type. For 'void' functions it is NULL. 23340cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl QualType ResultTy = OMethod->getResultType(); 23350cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl 23360cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl // Replace the instancetype keyword with the actual type. 23370cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl if (ResultTy == CGM.getContext().getObjCInstanceType()) 23380cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl ResultTy = CGM.getContext().getPointerType( 23390cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl QualType(OMethod->getClassInterface()->getTypeForDecl(), 0)); 23400cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl 2341566a9c3680d9960bb0eb6acf33507251cc13a8d8Adrian Prantl Elts.push_back(getOrCreateType(ResultTy, F)); 23427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // "self" pointer is always first argument. 2343e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl QualType SelfDeclTy = OMethod->getSelfDecl()->getType(); 2344e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl llvm::DIType SelfTy = getOrCreateType(SelfDeclTy, F); 2345e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl Elts.push_back(CreateSelfType(SelfDeclTy, SelfTy)); 23467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // "_cmd" pointer is always second argument. 23477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType CmdTy = getOrCreateType(OMethod->getCmdDecl()->getType(), F); 23487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elts.push_back(DBuilder.createArtificialType(CmdTy)); 23497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get rest of the arguments. 23506537f083555f9606c495d05c562878aa49bae987Eric Christopher for (ObjCMethodDecl::param_const_iterator PI = OMethod->param_begin(), 23517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PE = OMethod->param_end(); PI != PE; ++PI) 23527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elts.push_back(getOrCreateType((*PI)->getType(), F)); 23537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(Elts); 23557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createSubroutineType(F, EltTypeArray); 23567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23579a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie return llvm::DICompositeType(getOrCreateType(FnType, F)); 23587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 23597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitFunctionStart - Constructs the debug code for entering a function. 23617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitFunctionStart(GlobalDecl GD, QualType FnType, 23627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Function *Fn, 23637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 23647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name; 23667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef LinkageName; 23677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FnBeginRegionCount.push_back(LexicalBlockStack.size()); 23697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Decl *D = GD.getDecl(); 23717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Function may lack declaration in source code if it is created by Clang 23727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // CodeGen (examples: _GLOBAL__I_a, __cxx_global_array_dtor, thunk). 23737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool HasDecl = (D != 0); 23747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use the location of the declaration. 23757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc; 23767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (HasDecl) 23777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Loc = D->getLocation(); 23787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 23807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(Loc); 23817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor FDContext(Unit); 23827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray TParamsArray; 23837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!HasDecl) { 23847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use llvm function name. 23857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = Fn->getName(); 23867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 23877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there is a DISubprogram for this function available then use it. 23887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator 23897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FI = SPCache.find(FD->getCanonicalDecl()); 23907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FI != SPCache.end()) { 23917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = FI->second; 23927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor SP(dyn_cast_or_null<llvm::MDNode>(V)); 23937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SP.isSubprogram() && llvm::DISubprogram(SP).isDefinition()) { 23947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *SPN = SP; 23957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(SPN); 23967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[D] = llvm::WeakVH(SP); 23977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 23987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = getFunctionName(FD); 2401f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky // Use mangled name as linkage name for C/C++ functions. 24027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FD->hasPrototype()) { 24037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LinkageName = CGM.getMangledName(GD); 24047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrototyped; 24057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2406f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky // No need to replicate the linkage name if it isn't different from the 2407f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky // subprogram name, no need to have it at all unless coverage is enabled or 2408f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky // debug is set to more than just line tables. 24097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LinkageName == Name || 2410f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky (!CGM.getCodeGenOpts().EmitGcovArcs && 2411f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky !CGM.getCodeGenOpts().EmitGcovNotes && 241213c976710415041fca5aba25cc02d3813c74b990Eric Christopher DebugKind <= CodeGenOptions::DebugLineTablesOnly)) 24137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LinkageName = StringRef(); 24147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 241513c976710415041fca5aba25cc02d3813c74b990Eric Christopher if (DebugKind >= CodeGenOptions::LimitedDebugInfo) { 24167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const NamespaceDecl *NSDecl = 24177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast_or_null<NamespaceDecl>(FD->getDeclContext())) 24187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FDContext = getOrCreateNameSpace(NSDecl); 24197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (const RecordDecl *RDecl = 24207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast_or_null<RecordDecl>(FD->getDeclContext())) 24217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FDContext = getContextDescriptor(cast<Decl>(RDecl->getDeclContext())); 24227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Collect template parameters. 24247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TParamsArray = CollectFunctionTemplateParams(FD, Unit); 24257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D)) { 24277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = getObjCMethodName(OMD); 24287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrototyped; 24297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 24307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use llvm function name. 24317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = Fn->getName(); 24327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrototyped; 24337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Name.empty() && Name[0] == '\01') 24357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = Name.substr(1); 24367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(Loc); 24387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!HasDecl || D->isImplicit()) 24397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagArtificial; 24407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 244123e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie llvm::DISubprogram SP = DBuilder.createFunction( 244223e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie FDContext, Name, LinkageName, Unit, LineNo, 244323e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie getOrCreateFunctionType(D, FnType, Unit), Fn->hasInternalLinkage(), 244423e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie true /*definition*/, getLineNumber(CurLoc), Flags, 244523e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie CGM.getLangOpts().Optimize, Fn, TParamsArray, getFunctionDeclaration(D)); 24469faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (HasDecl) 24479faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie DeclCache.insert(std::make_pair(D->getCanonicalDecl(), llvm::WeakVH(SP))); 24487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Push function on region stack. 24507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *SPN = SP; 24517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(SPN); 24527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (HasDecl) 24537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[D] = llvm::WeakVH(SP); 24547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitLocation - Emit metadata to indicate a change in line/column 245718a0cd5ef787db1b6849b962f67a5a8ed3c49be3Adrian Prantl/// information in the source file. If the location is invalid, the 245818a0cd5ef787db1b6849b962f67a5a8ed3c49be3Adrian Prantl/// previous location will be reused. 245900df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantlvoid CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc, 246000df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl bool ForceColumnInfo) { 24617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Update our current location 24627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei setLocation(Loc); 24637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CurLoc.isInvalid() || CurLoc.isMacroID()) return; 24657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Don't bother if things are the same as last time. 24677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 24687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CurLoc == PrevLoc || 24697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SM.getExpansionLoc(CurLoc) == SM.getExpansionLoc(PrevLoc)) 24707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // New Builder may not be in sync with CGDebugInfo. 24710a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikie if (!Builder.getCurrentDebugLocation().isUnknown() && 24720a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikie Builder.getCurrentDebugLocation().getScope(CGM.getLLVMContext()) == 24730a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikie LexicalBlockStack.back()) 24747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 24756537f083555f9606c495d05c562878aa49bae987Eric Christopher 24767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Update last state. 24777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PrevLoc = CurLoc; 24787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *Scope = LexicalBlockStack.back(); 248000df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl Builder.SetCurrentDebugLocation(llvm::DebugLoc::get 248100df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl (getLineNumber(CurLoc), 248200df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl getColumnNumber(CurLoc, ForceColumnInfo), 248300df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl Scope)); 24847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateLexicalBlock - Creates a new lexical block node and pushes it on 24877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// the stack. 24887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::CreateLexicalBlock(SourceLocation Loc) { 24897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor D = 24907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createLexicalBlock(LexicalBlockStack.empty() ? 24917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor() : 24927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor(LexicalBlockStack.back()), 24937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateFile(CurLoc), 24947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getLineNumber(CurLoc), 24957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getColumnNumber(CurLoc)); 24967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *DN = D; 24977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(DN); 24987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitLexicalBlockStart - Constructs the debug code for entering a declarative 25017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// region - beginning of a DW_TAG_lexical_block. 2502f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christophervoid CGDebugInfo::EmitLexicalBlockStart(CGBuilderTy &Builder, 2503f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher SourceLocation Loc) { 25047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Set our current location. 25057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei setLocation(Loc); 25067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create a new lexical block and push it on the stack. 25087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CreateLexicalBlock(Loc); 25097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Emit a line table change for the current location inside the new scope. 25117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Builder.SetCurrentDebugLocation(llvm::DebugLoc::get(getLineNumber(Loc), 25127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getColumnNumber(Loc), 25137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.back())); 25147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 25157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitLexicalBlockEnd - Constructs the debug code for exiting a declarative 25177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// region - end of a DW_TAG_lexical_block. 2518f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christophervoid CGDebugInfo::EmitLexicalBlockEnd(CGBuilderTy &Builder, 2519f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher SourceLocation Loc) { 25207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 25217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Provide an entry in the line table for the end of the block. 25237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitLocation(Builder, Loc); 25247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 25267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 25277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitFunctionEnd - Constructs the debug code for exiting a function. 25297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitFunctionEnd(CGBuilderTy &Builder) { 25307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 25317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RCount = FnBeginRegionCount.back(); 25327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(RCount <= LexicalBlockStack.size() && "Region stack mismatch"); 25337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Pop all regions for this function. 25357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (LexicalBlockStack.size() != RCount) 25367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitLexicalBlockEnd(Builder, CurLoc); 25377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FnBeginRegionCount.pop_back(); 25387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 25397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25406537f083555f9606c495d05c562878aa49bae987Eric Christopher// EmitTypeForVarWithBlocksAttr - Build up structure info for the byref. 25417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// See BuildByRefType. 25427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::EmitTypeForVarWithBlocksAttr(const VarDecl *VD, 25437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t *XOffset) { 25447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 5> EltTys; 25467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FType; 25477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize, FieldOffset; 25487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign; 25496537f083555f9606c495d05c562878aa49bae987Eric Christopher 25507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 25516537f083555f9606c495d05c562878aa49bae987Eric Christopher QualType Type = VD->getType(); 25527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 25547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 25557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset)); 25567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__forwarding", &FieldOffset)); 25577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().IntTy; 25587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset)); 25597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__size", &FieldOffset)); 25607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool HasCopyAndDispose = CGM.getContext().BlockRequiresCopying(Type, VD); 25627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (HasCopyAndDispose) { 25637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 25647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__copy_helper", 25657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei &FieldOffset)); 25667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__destroy_helper", 25677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei &FieldOffset)); 25687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool HasByrefExtendedLayout; 25707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qualifiers::ObjCLifetime Lifetime; 25717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CGM.getContext().getByrefLifetime(Type, 25727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Lifetime, HasByrefExtendedLayout) 25731f4379184ee07217183d11acf142ea6fe0d487a0Adrian Prantl && HasByrefExtendedLayout) { 25741f4379184ee07217183d11acf142ea6fe0d487a0Adrian Prantl FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 25757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, 25767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "__byref_variable_layout", 25777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei &FieldOffset)); 25781f4379184ee07217183d11acf142ea6fe0d487a0Adrian Prantl } 25796537f083555f9606c495d05c562878aa49bae987Eric Christopher 25807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits Align = CGM.getContext().getDeclAlign(VD); 25817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Align > CGM.getContext().toCharUnitsFromBits( 258264aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall CGM.getTarget().getPointerAlign(0))) { 25836537f083555f9606c495d05c562878aa49bae987Eric Christopher CharUnits FieldOffsetInBytes 25847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = CGM.getContext().toCharUnitsFromBits(FieldOffset); 25857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits AlignedOffsetInBytes 25867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = FieldOffsetInBytes.RoundUpToAlignment(Align); 25877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits NumPaddingBytes 25887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = AlignedOffsetInBytes - FieldOffsetInBytes; 25896537f083555f9606c495d05c562878aa49bae987Eric Christopher 25907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NumPaddingBytes.isPositive()) { 25917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APInt pad(32, NumPaddingBytes.getQuantity()); 25927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getConstantArrayType(CGM.getContext().CharTy, 25937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei pad, ArrayType::Normal, 0); 25947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "", &FieldOffset)); 25957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25976537f083555f9606c495d05c562878aa49bae987Eric Christopher 25987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = Type; 25997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy = CGDebugInfo::getOrCreateType(FType, Unit); 26007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize = CGM.getContext().getTypeSize(FType); 26017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldAlign = CGM.getContext().toBits(Align); 26027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26036537f083555f9606c495d05c562878aa49bae987Eric Christopher *XOffset = FieldOffset; 26047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldTy = DBuilder.createMemberType(Unit, VD->getName(), Unit, 26057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 0, FieldSize, FieldAlign, 26067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset, 0, FieldTy); 26077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(FieldTy); 26087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset += FieldSize; 26096537f083555f9606c495d05c562878aa49bae987Eric Christopher 26107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys); 26116537f083555f9606c495d05c562878aa49bae987Eric Christopher 26127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = llvm::DIDescriptor::FlagBlockByrefStruct; 26136537f083555f9606c495d05c562878aa49bae987Eric Christopher 26147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createStructType(Unit, "", Unit, 0, FieldOffset, 0, Flags, 2615c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie llvm::DIType(), Elements); 26167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 26177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitDeclare - Emit local variable declaration debug info. 26197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclare(const VarDecl *VD, unsigned Tag, 26206537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::Value *Storage, 26217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ArgNo, CGBuilderTy &Builder) { 262213c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 26237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 26247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 26267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty; 26277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t XOffset = 0; 26287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VD->hasAttr<BlocksAttr>()) 26297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset); 26306537f083555f9606c495d05c562878aa49bae987Eric Christopher else 26317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = getOrCreateType(VD->getType(), Unit); 26327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there is no debug info for this type then do not emit debug info 26347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // for this variable. 26357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Ty) 26367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 26377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get location information. 26397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(VD->getLocation()); 26407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Column = getColumnNumber(VD->getLocation()); 26417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 26427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VD->isImplicit()) 26437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagArtificial; 26447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is the first argument and it is implicit then 26457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // give it an object pointer flag. 26467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: There has to be a better way to do this, but for static 26477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // functions there won't be an implicit param at arg1 and 26487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // otherwise it is 'self' or 'this'. 26497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<ImplicitParamDecl>(VD) && ArgNo == 1) 26507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagObjectPointer; 265141c9baed95a1e7974e6cccf7b4120fd1866ff125David Blaikie if (llvm::Argument *Arg = dyn_cast<llvm::Argument>(Storage)) 26527dab97b5af44556453c13cf877e02b8ea4c6c1cfEric Christopher if (Arg->getType()->isPointerTy() && !Arg->hasByValAttr() && 26537dab97b5af44556453c13cf877e02b8ea4c6c1cfEric Christopher !VD->getType()->isPointerType()) 265441c9baed95a1e7974e6cccf7b4120fd1866ff125David Blaikie Flags |= llvm::DIDescriptor::FlagIndirectVariable; 26557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *Scope = LexicalBlockStack.back(); 26577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = VD->getName(); 26597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Name.empty()) { 26607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VD->hasAttr<BlocksAttr>()) { 26617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits offset = CharUnits::fromQuantity(32); 26627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 9> addr; 26637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Type *Int64Ty = CGM.Int64Ty; 26647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 26657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of __forwarding field 26667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext().toCharUnitsFromBits( 266764aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall CGM.getTarget().getPointerWidth(0)); 26687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 26697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpDeref)); 26707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 26717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of x field 26727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext().toCharUnitsFromBits(XOffset); 26737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 26747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the variable. 26767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIVariable D = 26776537f083555f9606c495d05c562878aa49bae987Eric Christopher DBuilder.createComplexVariable(Tag, 26787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor(Scope), 26797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VD->getName(), Unit, Line, Ty, 26807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr, ArgNo); 26816537f083555f9606c495d05c562878aa49bae987Eric Christopher 26827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Insert an llvm.dbg.declare into the current block. 26837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Instruction *Call = 26847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.insertDeclare(Storage, D, Builder.GetInsertBlock()); 26857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); 26867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 26877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2688436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie } else if (const RecordType *RT = dyn_cast<RecordType>(VD->getType())) { 2689436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // If VD is an anonymous union then Storage represents value for 2690436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // all union fields. 26917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordDecl *RD = cast<RecordDecl>(RT->getDecl()); 2692d8180cf9877cd793949ae94edbf2ee84341041c5David Blaikie if (RD->isUnion() && RD->isAnonymousStructOrUnion()) { 26937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (RecordDecl::field_iterator I = RD->field_begin(), 26947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = RD->field_end(); 26957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I != E; ++I) { 26967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldDecl *Field = *I; 26977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy = getOrCreateType(Field->getType(), Unit); 26987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef FieldName = Field->getName(); 26996537f083555f9606c495d05c562878aa49bae987Eric Christopher 27007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore unnamed fields. Do not ignore unnamed records. 27017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FieldName.empty() && !isa<RecordType>(Field->getType())) 27027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 27036537f083555f9606c495d05c562878aa49bae987Eric Christopher 27047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use VarDecl's Tag, Scope and Line number. 27057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIVariable D = 27067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createLocalVariable(Tag, llvm::DIDescriptor(Scope), 27076537f083555f9606c495d05c562878aa49bae987Eric Christopher FieldName, Unit, Line, FieldTy, 27087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getLangOpts().Optimize, Flags, 27097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArgNo); 27106537f083555f9606c495d05c562878aa49bae987Eric Christopher 27117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Insert an llvm.dbg.declare into the current block. 27127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Instruction *Call = 27137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.insertDeclare(Storage, D, Builder.GetInsertBlock()); 27147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); 27157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2716d8180cf9877cd793949ae94edbf2ee84341041c5David Blaikie return; 27177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2719436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie 2720436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // Create the descriptor for the variable. 2721436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie llvm::DIVariable D = 2722436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie DBuilder.createLocalVariable(Tag, llvm::DIDescriptor(Scope), 2723436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie Name, Unit, Line, Ty, 2724436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie CGM.getLangOpts().Optimize, Flags, ArgNo); 2725436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie 2726436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // Insert an llvm.dbg.declare into the current block. 2727436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie llvm::Instruction *Call = 2728436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie DBuilder.insertDeclare(Storage, D, Builder.GetInsertBlock()); 2729436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); 27307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 27317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfAutoVariable(const VarDecl *VD, 27337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *Storage, 27347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 273513c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 27367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitDeclare(VD, llvm::dwarf::DW_TAG_auto_variable, Storage, 0, Builder); 27377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 27387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2739e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// Look up the completed type for a self pointer in the TypeCache and 2740e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// create a copy of it with the ObjectPointer and Artificial flags 2741e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// set. If the type is not cached, a new one is created. This should 2742e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// never happen though, since creating a type for the implicit self 2743e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// argument implies that we already parsed the interface definition 2744e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// and the ivar declarations in the implementation. 2745f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopherllvm::DIType CGDebugInfo::CreateSelfType(const QualType &QualTy, 2746f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher llvm::DIType Ty) { 2747e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl llvm::DIType CachedTy = getTypeOrNull(QualTy); 2748b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (CachedTy) Ty = CachedTy; 2749e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl else DEBUG(llvm::dbgs() << "No cached type for self."); 2750e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl return DBuilder.createObjectPointerType(Ty); 2751e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl} 2752e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl 27537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfBlockDeclRefVariable(const VarDecl *VD, 27547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *Storage, 27557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder, 27567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CGBlockInfo &blockInfo) { 275713c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 27587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 27596537f083555f9606c495d05c562878aa49bae987Eric Christopher 27607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Builder.GetInsertBlock() == 0) 27617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 27626537f083555f9606c495d05c562878aa49bae987Eric Christopher 27637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool isByRef = VD->hasAttr<BlocksAttr>(); 27646537f083555f9606c495d05c562878aa49bae987Eric Christopher 27657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t XOffset = 0; 27667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 27677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty; 27687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isByRef) 27697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset); 27706537f083555f9606c495d05c562878aa49bae987Eric Christopher else 27717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = getOrCreateType(VD->getType(), Unit); 27727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Self is passed along as an implicit non-arg variable in a 27747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // block. Mark it as the object pointer. 27757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<ImplicitParamDecl>(VD) && VD->getName() == "self") 2776e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl Ty = CreateSelfType(VD->getType(), Ty); 27777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get location information. 27797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(VD->getLocation()); 27807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Column = getColumnNumber(VD->getLocation()); 27817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const llvm::DataLayout &target = CGM.getDataLayout(); 27837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits offset = CharUnits::fromQuantity( 27857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei target.getStructLayout(blockInfo.StructureType) 27867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ->getElementOffset(blockInfo.getCapture(VD).getIndex())); 27877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 9> addr; 27897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Type *Int64Ty = CGM.Int64Ty; 27909b97adfb770c3b55c1a45049d53b624bbc6f62e1Adrian Prantl if (isa<llvm::AllocaInst>(Storage)) 27919b97adfb770c3b55c1a45049d53b624bbc6f62e1Adrian Prantl addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpDeref)); 27927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 27937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 27947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isByRef) { 27957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpDeref)); 27967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 27977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of __forwarding field 27987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext() 27997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei .toCharUnitsFromBits(target.getPointerSizeInBits(0)); 28007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 28017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpDeref)); 28027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 28037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of x field 28047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext().toCharUnitsFromBits(XOffset); 28057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 28067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the variable. 28097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIVariable D = 28106537f083555f9606c495d05c562878aa49bae987Eric Christopher DBuilder.createComplexVariable(llvm::dwarf::DW_TAG_auto_variable, 28117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor(LexicalBlockStack.back()), 28127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VD->getName(), Unit, Line, Ty, addr); 28139b97adfb770c3b55c1a45049d53b624bbc6f62e1Adrian Prantl 28147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Insert an llvm.dbg.declare into the current block. 28157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Instruction *Call = 28167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.insertDeclare(Storage, D, Builder.GetInsertPoint()); 28177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, 28187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.back())); 28197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 28207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitDeclareOfArgVariable - Emit call to llvm.dbg.declare for an argument 28227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// variable declaration. 28237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfArgVariable(const VarDecl *VD, llvm::Value *AI, 28247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ArgNo, 28257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 282613c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 28277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitDeclare(VD, llvm::dwarf::DW_TAG_arg_variable, AI, ArgNo, Builder); 28287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 28297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 28317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei struct BlockLayoutChunk { 28327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t OffsetInBits; 28337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BlockDecl::Capture *Capture; 28347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 28357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool operator<(const BlockLayoutChunk &l, const BlockLayoutChunk &r) { 28367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return l.OffsetInBits < r.OffsetInBits; 28377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 28397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block, 2841836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl llvm::Value *Arg, 2842836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl llvm::Value *LocalAddr, 28437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 284413c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 28457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTContext &C = CGM.getContext(); 28467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BlockDecl *blockDecl = block.getBlockDecl(); 28477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Collect some general information about the block's location. 28497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation loc = blockDecl->getCaretLocation(); 28507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile tunit = getOrCreateFile(loc); 28517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned line = getLineNumber(loc); 28527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned column = getColumnNumber(loc); 28536537f083555f9606c495d05c562878aa49bae987Eric Christopher 28547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Build the debug-info type for the block literal. 28557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(cast<Decl>(blockDecl->getDeclContext())); 28567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const llvm::StructLayout *blockLayout = 28587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getDataLayout().getStructLayout(block.StructureType); 28597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value*, 16> fields; 28617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__isa", C.VoidPtrTy, 0, loc, AS_public, 28627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(0), 28637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 28647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__flags", C.IntTy, 0, loc, AS_public, 28657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(1), 28667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 28677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__reserved", C.IntTy, 0, loc, AS_public, 28687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(2), 28697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 28707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__FuncPtr", C.VoidPtrTy, 0, loc, AS_public, 28717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(3), 28727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 28737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__descriptor", 28747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei C.getPointerType(block.NeedsCopyDispose ? 28757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei C.getBlockDescriptorExtendedType() : 28767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei C.getBlockDescriptorType()), 28777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 0, loc, AS_public, 28787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(4), 28797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 28807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We want to sort the captures by offset, not because DWARF 28827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // requires this, but because we're paranoid about debuggers. 28837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<BlockLayoutChunk, 8> chunks; 28847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 'this' capture. 28867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (blockDecl->capturesCXXThis()) { 28877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BlockLayoutChunk chunk; 28887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.OffsetInBits = 28897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(block.CXXThisIndex); 28907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.Capture = 0; 28917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunks.push_back(chunk); 28927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Variable captures. 28957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (BlockDecl::capture_const_iterator 28967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei i = blockDecl->capture_begin(), e = blockDecl->capture_end(); 28977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei i != e; ++i) { 28987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BlockDecl::Capture &capture = *i; 28997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const VarDecl *variable = capture.getVariable(); 29007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CGBlockInfo::Capture &captureInfo = block.getCapture(variable); 29017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore constant captures. 29037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (captureInfo.isConstant()) 29047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 29057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BlockLayoutChunk chunk; 29077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.OffsetInBits = 29087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(captureInfo.getIndex()); 29097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.Capture = &capture; 29107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunks.push_back(chunk); 29117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Sort by offset. 29147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::array_pod_sort(chunks.begin(), chunks.end()); 29157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (SmallVectorImpl<BlockLayoutChunk>::iterator 29177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei i = chunks.begin(), e = chunks.end(); i != e; ++i) { 29187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t offsetInBits = i->OffsetInBits; 29197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BlockDecl::Capture *capture = i->Capture; 29207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we have a null capture, this must be the C++ 'this' capture. 29227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!capture) { 29237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXMethodDecl *method = 29247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<CXXMethodDecl>(blockDecl->getNonClosureContext()); 29257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType type = method->getThisType(C); 29267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("this", type, 0, loc, AS_public, 29287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offsetInBits, tunit, tunit)); 29297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 29307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const VarDecl *variable = capture->getVariable(); 29337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef name = variable->getName(); 29347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType fieldType; 29367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (capture->isByRef()) { 29377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::pair<uint64_t,unsigned> ptrInfo = C.getTypeInfo(C.VoidPtrTy); 29387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: this creates a second copy of this type! 29407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t xoffset; 29417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fieldType = EmitTypeForVarWithBlocksAttr(variable, &xoffset); 29427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fieldType = DBuilder.createPointerType(fieldType, ptrInfo.first); 29437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fieldType = DBuilder.createMemberType(tunit, name, tunit, line, 29447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ptrInfo.first, ptrInfo.second, 29457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offsetInBits, 0, fieldType); 29467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 29477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fieldType = createFieldType(name, variable->getType(), 0, 29487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei loc, AS_public, offsetInBits, tunit, tunit); 29497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(fieldType); 29517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<36> typeName; 29547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::raw_svector_ostream(typeName) 29557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << "__block_literal_" << CGM.getUniqueBlockCount(); 29567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray fieldsArray = DBuilder.getOrCreateArray(fields); 29587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType type = 29607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createStructType(tunit, typeName.str(), tunit, line, 29617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getContext().toBits(block.BlockSize), 29627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getContext().toBits(block.BlockAlign), 2963c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie 0, llvm::DIType(), fieldsArray); 29647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei type = DBuilder.createPointerType(type, CGM.PointerWidthInBits); 29657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the block. 29677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned flags = llvm::DIDescriptor::FlagArtificial; 29687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *scope = LexicalBlockStack.back(); 29697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the parameter. 29717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIVariable debugVar = 29727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createLocalVariable(llvm::dwarf::DW_TAG_arg_variable, 29736537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIDescriptor(scope), 2974836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl Arg->getName(), tunit, line, type, 29757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getLangOpts().Optimize, flags, 2976836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl cast<llvm::Argument>(Arg)->getArgNo() + 1); 2977836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl 2978bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl if (LocalAddr) { 2979836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl // Insert an llvm.dbg.value into the current block. 2980bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl llvm::Instruction *DbgVal = 2981bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl DBuilder.insertDbgValueIntrinsic(LocalAddr, 0, debugVar, 2982f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher Builder.GetInsertBlock()); 2983bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl DbgVal->setDebugLoc(llvm::DebugLoc::get(line, column, scope)); 2984bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl } 2985836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl 2986bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl // Insert an llvm.dbg.declare into the current block. 2987bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl llvm::Instruction *DbgDecl = 2988bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl DBuilder.insertDeclare(Arg, debugVar, Builder.GetInsertBlock()); 2989bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl DbgDecl->setDebugLoc(llvm::DebugLoc::get(line, column, scope)); 29907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 29917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29920395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// getStaticDataMemberDeclaration - If D is an out-of-class definition of 29930395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// a static data member of a class, find its corresponding in-class 29940395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// declaration. 29950395de36004a718e265cc256b1bbee3bd3a791dcEric Christopherllvm::DIDerivedType CGDebugInfo::getStaticDataMemberDeclaration(const Decl *D) { 29960395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (cast<VarDecl>(D)->isStaticDataMember()) { 29970395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator 29980395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher MI = StaticDataMemberCache.find(D->getCanonicalDecl()); 29990395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (MI != StaticDataMemberCache.end()) 30000395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Verify the info still exists. 30010395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (llvm::Value *V = MI->second) 30020395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher return llvm::DIDerivedType(cast<llvm::MDNode>(V)); 30030395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 30040395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher return llvm::DIDerivedType(); 30050395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher} 30060395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 30077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitGlobalVariable - Emit information about a global variable. 30087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, 30097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const VarDecl *D) { 301013c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 30117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create global variable debug descriptor. 30127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(D->getLocation()); 30137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(D->getLocation()); 30147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei setLocation(D->getLocation()); 30167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType T = D->getType(); 30187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (T->isIncompleteArrayType()) { 30197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // CodeGen turns int[] into int[1] so we'll do the same here. 30217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APInt ConstVal(32, 1); 30227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ET = CGM.getContext().getAsArrayType(T)->getElementType(); 30237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = CGM.getContext().getConstantArrayType(ET, ConstVal, 30257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayType::Normal, 0); 30267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef DeclName = D->getName(); 30287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef LinkageName; 30297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (D->getDeclContext() && !isa<FunctionDecl>(D->getDeclContext()) 30307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei && !isa<ObjCMethodDecl>(D->getDeclContext())) 30317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LinkageName = Var->getName(); 30327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LinkageName == DeclName) 30337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LinkageName = StringRef(); 30346537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIDescriptor DContext = 30357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(dyn_cast<Decl>(D->getDeclContext())); 303656b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher llvm::DIGlobalVariable GV = 303756b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher DBuilder.createStaticVariable(DContext, DeclName, LinkageName, Unit, 303856b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher LineNo, getOrCreateType(T, Unit), 303956b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher Var->hasInternalLinkage(), Var, 304056b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher getStaticDataMemberDeclaration(D)); 30419faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie DeclCache.insert(std::make_pair(D->getCanonicalDecl(), llvm::WeakVH(GV))); 30427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 30437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitGlobalVariable - Emit information about an objective-c interface. 30457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, 30467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *ID) { 304713c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 30487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create global variable debug descriptor. 30497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(ID->getLocation()); 30507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(ID->getLocation()); 30517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = ID->getName(); 30537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType T = CGM.getContext().getObjCInterfaceType(ID); 30557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (T->isIncompleteArrayType()) { 30567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // CodeGen turns int[] into int[1] so we'll do the same here. 30587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APInt ConstVal(32, 1); 30597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ET = CGM.getContext().getAsArrayType(T)->getElementType(); 30607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = CGM.getContext().getConstantArrayType(ET, ConstVal, 30627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayType::Normal, 0); 30637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createGlobalVariable(Name, Unit, LineNo, 30667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(T, Unit), 30677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Var->hasInternalLinkage(), Var); 30687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 30697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitGlobalVariable - Emit global variable's debug info. 30716537f083555f9606c495d05c562878aa49bae987Eric Christophervoid CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, 30727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Constant *Init) { 307313c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 30747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the variable. 30757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 30767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = VD->getName(); 30777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty = getOrCreateType(VD->getType(), Unit); 30787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(VD)) { 30797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const EnumDecl *ED = cast<EnumDecl>(ECD->getDeclContext()); 30807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(isa<EnumType>(ED->getTypeForDecl()) && "Enum without EnumType?"); 30817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = getOrCreateType(QualType(ED->getTypeForDecl(), 0), Unit); 30827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Do not use DIGlobalVariable for enums. 30847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty.getTag() == llvm::dwarf::DW_TAG_enumeration_type) 30857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 308656b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher llvm::DIGlobalVariable GV = 308756b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher DBuilder.createStaticVariable(Unit, Name, Name, Unit, 308856b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher getLineNumber(VD->getLocation()), Ty, true, 308956b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher Init, getStaticDataMemberDeclaration(VD)); 30909faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie DeclCache.insert(std::make_pair(VD->getCanonicalDecl(), llvm::WeakVH(GV))); 30919faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie} 30929faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie 30939faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikiellvm::DIScope CGDebugInfo::getCurrentContextDescriptor(const Decl *D) { 30949faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (!LexicalBlockStack.empty()) 30959faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return llvm::DIScope(LexicalBlockStack.back()); 30969faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return getContextDescriptor(D); 30977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 30987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3099957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikievoid CGDebugInfo::EmitUsingDirective(const UsingDirectiveDecl &UD) { 31009faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (CGM.getCodeGenOpts().getDebugInfo() < CodeGenOptions::LimitedDebugInfo) 31019faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return; 3102957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie DBuilder.createImportedModule( 31039faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie getCurrentContextDescriptor(cast<Decl>(UD.getDeclContext())), 31049faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie getOrCreateNameSpace(UD.getNominatedNamespace()), 3105957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie getLineNumber(UD.getLocation())); 3106957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie} 3107957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie 31089faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikievoid CGDebugInfo::EmitUsingDecl(const UsingDecl &UD) { 31099faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (CGM.getCodeGenOpts().getDebugInfo() < CodeGenOptions::LimitedDebugInfo) 31109faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return; 31119faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie assert(UD.shadow_size() && 31129faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie "We shouldn't be codegening an invalid UsingDecl containing no decls"); 31139faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // Emitting one decl is sufficient - debuggers can detect that this is an 31149faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // overloaded name & provide lookup for all the overloads. 31159faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie const UsingShadowDecl &USD = **UD.shadow_begin(); 311656b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher if (llvm::DIDescriptor Target = 311756b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher getDeclarationOrDefinition(USD.getUnderlyingDecl())) 31189faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie DBuilder.createImportedDeclaration( 31199faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie getCurrentContextDescriptor(cast<Decl>(USD.getDeclContext())), Target, 31209faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie getLineNumber(USD.getLocation())); 31219faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie} 31229faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie 3123fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikiellvm::DIImportedEntity 3124fc46ebc2b1345723a894ae352cfb206c1d930295David BlaikieCGDebugInfo::EmitNamespaceAlias(const NamespaceAliasDecl &NA) { 3125fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie if (CGM.getCodeGenOpts().getDebugInfo() < CodeGenOptions::LimitedDebugInfo) 3126fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie return llvm::DIImportedEntity(0); 3127fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie llvm::WeakVH &VH = NamespaceAliasCache[&NA]; 3128fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie if (VH) 3129fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie return llvm::DIImportedEntity(cast<llvm::MDNode>(VH)); 3130fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie llvm::DIImportedEntity R(0); 3131fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie if (const NamespaceAliasDecl *Underlying = 3132fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie dyn_cast<NamespaceAliasDecl>(NA.getAliasedNamespace())) 3133fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie // This could cache & dedup here rather than relying on metadata deduping. 3134fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie R = DBuilder.createImportedModule( 3135fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie getCurrentContextDescriptor(cast<Decl>(NA.getDeclContext())), 3136fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie EmitNamespaceAlias(*Underlying), getLineNumber(NA.getLocation()), 3137fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie NA.getName()); 3138fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie else 3139fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie R = DBuilder.createImportedModule( 3140fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie getCurrentContextDescriptor(cast<Decl>(NA.getDeclContext())), 3141fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie getOrCreateNameSpace(cast<NamespaceDecl>(NA.getAliasedNamespace())), 3142fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie getLineNumber(NA.getLocation()), NA.getName()); 3143fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie VH = R; 3144fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie return R; 3145fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie} 3146fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie 31477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateNamesSpace - Return namespace descriptor for the given 31487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// namespace decl. 31496537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DINameSpace 31507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::getOrCreateNameSpace(const NamespaceDecl *NSDecl) { 31516537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DenseMap<const NamespaceDecl *, llvm::WeakVH>::iterator I = 31527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NameSpaceCache.find(NSDecl); 31537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (I != NameSpaceCache.end()) 31547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DINameSpace(cast<llvm::MDNode>(I->second)); 31556537f083555f9606c495d05c562878aa49bae987Eric Christopher 31567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(NSDecl->getLocation()); 31577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile FileD = getOrCreateFile(NSDecl->getLocation()); 31586537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIDescriptor Context = 31597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(dyn_cast<Decl>(NSDecl->getDeclContext())); 31607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DINameSpace NS = 31617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createNameSpace(Context, NSDecl->getName(), FileD, LineNo); 31627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NameSpaceCache[NSDecl] = llvm::WeakVH(NS); 31637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return NS; 31647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 31657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::finalize() { 31677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (std::vector<std::pair<void *, llvm::WeakVH> >::const_iterator VI 31687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ReplaceMap.begin(), VE = ReplaceMap.end(); VI != VE; ++VI) { 31697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty, RepTy; 31707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Verify that the debug info still exists. 31717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::Value *V = VI->second) 31727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = llvm::DIType(cast<llvm::MDNode>(V)); 31736537f083555f9606c495d05c562878aa49bae987Eric Christopher 31747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<void *, llvm::WeakVH>::iterator it = 31757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeCache.find(VI->first); 31767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (it != TypeCache.end()) { 31777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Verify that the debug info still exists. 31787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::Value *V = it->second) 31797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RepTy = llvm::DIType(cast<llvm::MDNode>(V)); 31807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3181ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 3182b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (Ty && Ty.isForwardDecl() && RepTy) 31837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty.replaceAllUsesWith(RepTy); 31847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3185ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 3186ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // We keep our own list of retained types, because we need to look 3187ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // up the final type in the type cache. 3188ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl for (std::vector<void *>::const_iterator RI = RetainedTypes.begin(), 3189ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl RE = RetainedTypes.end(); RI != RE; ++RI) 3190ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl DBuilder.retainType(llvm::DIType(cast<llvm::MDNode>(TypeCache[*RI]))); 3191ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 31927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.finalize(); 31937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3194