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" 40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/Support/Path.h" 417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang; 427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang::CodeGen; 437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::CGDebugInfo(CodeGenModule &CGM) 45688cf5b05713055d27bf53460f7c20a776440767Eric Christopher : CGM(CGM), DebugKind(CGM.getCodeGenOpts().getDebugInfo()), 46688cf5b05713055d27bf53460f7c20a776440767Eric Christopher DBuilder(CGM.getModule()) { 477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CreateCompileUnit(); 487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::~CGDebugInfo() { 517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(LexicalBlockStack.empty() && 527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Region stack mismatch, stack not empty!"); 537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 55651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesSaveAndRestoreLocation::SaveAndRestoreLocation(CodeGenFunction &CGF, 56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CGBuilderTy &B) 57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : DI(CGF.getDebugInfo()), Builder(B) { 58ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl if (DI) { 59ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl SavedLoc = DI->getLocation(); 60ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl DI->CurLoc = SourceLocation(); 61ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl } 62ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl} 63ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl 64651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesSaveAndRestoreLocation::~SaveAndRestoreLocation() { 65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (DI) 66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DI->EmitLocation(Builder, SavedLoc); 67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 69651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesNoLocation::NoLocation(CodeGenFunction &CGF, CGBuilderTy &B) 70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : SaveAndRestoreLocation(CGF, B) { 71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (DI) 72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Builder.SetCurrentDebugLocation(llvm::DebugLoc()); 73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 75ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian PrantlNoLocation::~NoLocation() { 76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (DI) 77ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl assert(Builder.getCurrentDebugLocation().isUnknown()); 78ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl} 79ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl 80b061ce2c7af5bb19294e16dbaf19a6b37ed2f716Adrian PrantlArtificialLocation::ArtificialLocation(CodeGenFunction &CGF, CGBuilderTy &B) 81651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : SaveAndRestoreLocation(CGF, B) { 82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (DI) 83b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl Builder.SetCurrentDebugLocation(llvm::DebugLoc()); 84b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl} 85b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl 86b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantlvoid ArtificialLocation::Emit() { 87b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl if (DI) { 88ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl // Sync the Builder. 89ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl DI->EmitLocation(Builder, SavedLoc); 90ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl DI->CurLoc = SourceLocation(); 91ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl // Construct a location that has a valid scope, but no line info. 92b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl assert(!DI->LexicalBlockStack.empty()); 93b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl llvm::DIDescriptor Scope(DI->LexicalBlockStack.back()); 94ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl Builder.SetCurrentDebugLocation(llvm::DebugLoc::get(0, 0, Scope)); 95ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl } 96ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl} 97ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl 98b061ce2c7af5bb19294e16dbaf19a6b37ed2f716Adrian PrantlArtificialLocation::~ArtificialLocation() { 99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (DI) 100ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl assert(Builder.getCurrentDebugLocation().getLine() == 0); 101ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl} 102ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl 1037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::setLocation(SourceLocation Loc) { 1047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the new location isn't valid return. 1055f4554f8c8f07c90048705f165fe1ed44413eaa2Adrian Prantl if (Loc.isInvalid()) return; 1067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurLoc = CGM.getContext().getSourceManager().getExpansionLoc(Loc); 1087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we've changed files in the middle of a lexical scope go ahead 1107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // and create a new lexical scope with file node if it's different 1117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // from the one in the scope. 1127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LexicalBlockStack.empty()) return; 1137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 1156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::DIScope Scope(LexicalBlockStack.back()); 1167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PCLoc = SM.getPresumedLoc(CurLoc); 1177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (PCLoc.isInvalid() || Scope.getFilename() == PCLoc.getFilename()) 1197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 1207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Scope.isLexicalBlockFile()) { 1226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::DILexicalBlockFile LBF = llvm::DILexicalBlockFile(Scope); 1237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor D 1247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = DBuilder.createLexicalBlockFile(LBF.getScope(), 1257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateFile(CurLoc)); 1267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *N = D; 1277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 1287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(N); 129a6504853d297c30cfa271f4710af5a3d5db59449David Blaikie } else if (Scope.isLexicalBlock() || Scope.isSubprogram()) { 1307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor D 1317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = DBuilder.createLexicalBlockFile(Scope, getOrCreateFile(CurLoc)); 1327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *N = D; 1337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 1347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(N); 1357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getContextDescriptor - Get context info for the decl. 139bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikiellvm::DIScope CGDebugInfo::getContextDescriptor(const Decl *Context) { 1407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Context) 1417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TheCU; 1427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator 1447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I = RegionMap.find(Context); 1457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (I != RegionMap.end()) { 1467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = I->second; 147bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie return llvm::DIScope(dyn_cast_or_null<llvm::MDNode>(V)); 1487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check namespace. 1517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const NamespaceDecl *NSDecl = dyn_cast<NamespaceDecl>(Context)) 152bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie return getOrCreateNameSpace(NSDecl); 1537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 154bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie if (const RecordDecl *RDecl = dyn_cast<RecordDecl>(Context)) 155bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie if (!RDecl->isDependentType()) 156bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie return getOrCreateType(CGM.getContext().getTypeDeclType(RDecl), 1577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateMainFile()); 1587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TheCU; 1597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getFunctionName - Get function name for the given FunctionDecl. If the 162e575359c34a9248c55ec0c03a8fc945f1ee4cb01Benjamin Kramer/// name is constructed on demand (e.g. C++ destructor) then the name 1637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// is stored on the side. 1647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getFunctionName(const FunctionDecl *FD) { 1657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert (FD && "Invalid FunctionDecl!"); 1667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *FII = FD->getIdentifier(); 1677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionTemplateSpecializationInfo *Info 1687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = FD->getTemplateSpecializationInfo(); 1697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Info && FII) 1707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return FII->getName(); 1717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise construct human readable name for debug info. 1735eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer SmallString<128> NS; 1745eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer llvm::raw_svector_ostream OS(NS); 1755eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer FD->printName(OS); 1767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add any template specialization args. 1787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Info) { 1797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgumentList *TArgs = Info->TemplateArguments; 1807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgument *Args = TArgs->data(); 1817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumArgs = TArgs->size(); 1827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PrintingPolicy Policy(CGM.getLangOpts()); 1835eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer TemplateSpecializationType::PrintTemplateArgumentList(OS, Args, NumArgs, 1845eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer Policy); 1857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Copy this name on the side and use its reference. 1888495379bd6127dac2c39a6dd7840d95bb3a9aaa3Benjamin Kramer return internString(OS.str()); 1897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getObjCMethodName(const ObjCMethodDecl *OMD) { 1927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<256> MethodName; 1937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::raw_svector_ostream OS(MethodName); 1947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << (OMD->isInstanceMethod() ? '-' : '+') << '['; 1957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const DeclContext *DC = OMD->getDeclContext(); 1966537f083555f9606c495d05c562878aa49bae987Eric Christopher if (const ObjCImplementationDecl *OID = 1977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<const ObjCImplementationDecl>(DC)) { 1987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << OID->getName(); 1996537f083555f9606c495d05c562878aa49bae987Eric Christopher } else if (const ObjCInterfaceDecl *OID = 2007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<const ObjCInterfaceDecl>(DC)) { 2017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << OID->getName(); 2026537f083555f9606c495d05c562878aa49bae987Eric Christopher } else if (const ObjCCategoryImplDecl *OCD = 2037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<const ObjCCategoryImplDecl>(DC)){ 2047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << ((const NamedDecl *)OCD)->getIdentifier()->getNameStart() << '(' << 2057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OCD->getIdentifier()->getNameStart() << ')'; 206b509224b28bf7ddb2e4ff1d52855df5b56b44bf4Adrian Prantl } else if (isa<ObjCProtocolDecl>(DC)) { 207687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl // We can extract the type of the class from the self pointer. 208687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl if (ImplicitParamDecl* SelfDecl = OMD->getSelfDecl()) { 209687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl QualType ClassTy = 210687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl cast<ObjCObjectPointerType>(SelfDecl->getType())->getPointeeType(); 211687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl ClassTy.print(OS, PrintingPolicy(LangOptions())); 212687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl } 2137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << ' ' << OMD->getSelector().getAsString() << ']'; 2157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2168495379bd6127dac2c39a6dd7840d95bb3a9aaa3Benjamin Kramer return internString(OS.str()); 2177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getSelectorName - Return selector name. This is used for debugging 2207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// info. 2217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getSelectorName(Selector S) { 2228495379bd6127dac2c39a6dd7840d95bb3a9aaa3Benjamin Kramer return internString(S.getAsString()); 2237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getClassName - Get class name including template argument list. 2266537f083555f9606c495d05c562878aa49bae987Eric ChristopherStringRef 2277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::getClassName(const RecordDecl *RD) { 228651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // quick optimization to avoid having to intern strings that are already 229651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // stored reliably elsewhere 230651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!isa<ClassTemplateSpecializationDecl>(RD)) 2317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return RD->getName(); 2327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SmallString<128> Name; 2345eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer { 235651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::raw_svector_ostream OS(Name); 236651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines RD->getNameForDiagnostic(OS, CGM.getContext().getPrintingPolicy(), 237651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /*Qualified*/ false); 2385eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer } 2397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Copy this name on the side and use its reference. 241651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return internString(Name); 2427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateFile - Get the file debug info descriptor for the input location. 2457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIFile CGDebugInfo::getOrCreateFile(SourceLocation Loc) { 2467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Loc.isValid()) 2477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If Location is not valid then use main input file. 2487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createFile(TheCU.getFilename(), TheCU.getDirectory()); 2497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 2517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PLoc = SM.getPresumedLoc(Loc); 2527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PLoc.isInvalid() || StringRef(PLoc.getFilename()).empty()) 2547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the location is not valid then use main input file. 2557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createFile(TheCU.getFilename(), TheCU.getDirectory()); 2567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Cache the results. 2587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const char *fname = PLoc.getFilename(); 2597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const char *, llvm::WeakVH>::iterator it = 2607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DIFileCache.find(fname); 2617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (it != DIFileCache.end()) { 2637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Verify that the information still exists. 2647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::Value *V = it->second) 2657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIFile(cast<llvm::MDNode>(V)); 2667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile F = DBuilder.createFile(PLoc.getFilename(), getCurrentDirname()); 2697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DIFileCache[fname] = F; 2717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return F; 2727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateMainFile - Get the file info for main compile unit. 2757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIFile CGDebugInfo::getOrCreateMainFile() { 2767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createFile(TheCU.getFilename(), TheCU.getDirectory()); 2777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getLineNumber - Get line number for the location. If location is invalid 2807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// then use current location. 2817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned CGDebugInfo::getLineNumber(SourceLocation Loc) { 2827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Loc.isInvalid() && CurLoc.isInvalid()) 2837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 2847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 2857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc); 2867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return PLoc.isValid()? PLoc.getLine() : 0; 2877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getColumnNumber - Get column number for the location. 29000df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantlunsigned CGDebugInfo::getColumnNumber(SourceLocation Loc, bool Force) { 2917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We may not want column information at all. 29200df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl if (!Force && !CGM.getCodeGenOpts().DebugColumnInfo) 2937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 2947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the location is invalid then use the current column. 2967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Loc.isInvalid() && CurLoc.isInvalid()) 2977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 2987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 2997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc); 3007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return PLoc.isValid()? PLoc.getColumn() : 0; 3017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getCurrentDirname() { 3047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CGM.getCodeGenOpts().DebugCompilationDir.empty()) 3057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CGM.getCodeGenOpts().DebugCompilationDir; 3067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CWDName.empty()) 3087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CWDName; 3097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<256> CWD; 3107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::sys::fs::current_path(CWD); 3118495379bd6127dac2c39a6dd7840d95bb3a9aaa3Benjamin Kramer return CWDName = internString(CWD); 3127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateCompileUnit - Create new compile unit. 3157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::CreateCompileUnit() { 3167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Should we be asking the SourceManager for the main file name, instead of 3186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // accepting it as an argument? This just causes the main file name to 3196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // mismatch with source locations and create extra lexical scopes or 3206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // mismatched debug info (a CU with a DW_AT_file of "-", because that's what 3216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // the driver passed, but functions/other things have DW_AT_file of "<stdin>" 3226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // because that's what the SourceManager says) 3236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get absolute path name. 3257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 3267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string MainFileName = CGM.getCodeGenOpts().MainFileName; 3277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MainFileName.empty()) 3286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines MainFileName = "<stdin>"; 3297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The main file name provided via the "-main-file-name" option contains just 3317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the file name itself with no path information. This file name may have had 3327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // a relative path, so we look into the actual file entry for the main 3337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // file to determine the real absolute path for the file. 3347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string MainFileDir; 3357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID())) { 3367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MainFileDir = MainFile->getDir()->getName(); 337921ac4d6dfab47090b167dc092133d747a18c71aYaron Keren if (MainFileDir != ".") { 338651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::SmallString<1024> MainFileDirSS(MainFileDir); 339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::sys::path::append(MainFileDirSS, MainFileName); 340651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MainFileName = MainFileDirSS.str(); 341921ac4d6dfab47090b167dc092133d747a18c71aYaron Keren } 3427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Save filename string. 3458495379bd6127dac2c39a6dd7840d95bb3a9aaa3Benjamin Kramer StringRef Filename = internString(MainFileName); 346ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher 347ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher // Save split dwarf file string. 348ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher std::string SplitDwarfFile = CGM.getCodeGenOpts().SplitDwarfFile; 3498495379bd6127dac2c39a6dd7840d95bb3a9aaa3Benjamin Kramer StringRef SplitDwarfFilename = internString(SplitDwarfFile); 3506537f083555f9606c495d05c562878aa49bae987Eric Christopher 3516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::dwarf::SourceLanguage LangTag; 3527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const LangOptions &LO = CGM.getLangOpts(); 3537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LO.CPlusPlus) { 3547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LO.ObjC1) 3557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_ObjC_plus_plus; 3567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 3577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_C_plus_plus; 3587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (LO.ObjC1) { 3597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_ObjC; 3607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (LO.C99) { 3617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_C99; 3627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 3637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_C89; 3647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Producer = getClangFullVersion(); 3677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Figure out which version of the ObjC runtime we have. 3697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RuntimeVers = 0; 3707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LO.ObjC1) 3717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RuntimeVers = LO.ObjCRuntime.isNonFragile() ? 2 : 1; 3727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create new compile unit. 3747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME - Eliminate TheCU. 375651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TheCU = DBuilder.createCompileUnit( 376651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LangTag, Filename, getCurrentDirname(), Producer, LO.Optimize, 377651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CGM.getCodeGenOpts().DwarfDebugFlags, RuntimeVers, SplitDwarfFilename, 378ef8225444452a1486bd721f3285301fe84643b00Stephen Hines DebugKind <= CodeGenOptions::DebugLineTablesOnly 379651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ? llvm::DIBuilder::LineTablesOnly 380ef8225444452a1486bd721f3285301fe84643b00Stephen Hines : llvm::DIBuilder::FullDebug, 381ef8225444452a1486bd721f3285301fe84643b00Stephen Hines DebugKind != CodeGenOptions::LocTrackingOnly); 3827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateType - Get the Basic type from the cache or create a new 3857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// one if necessary. 3867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const BuiltinType *BT) { 3876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::dwarf::TypeKind Encoding; 3887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef BTName; 3897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (BT->getKind()) { 3907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define BUILTIN_TYPE(Id, SingletonId) 3917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define PLACEHOLDER_TYPE(Id, SingletonId) \ 3927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Id: 3937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/BuiltinTypes.def" 3947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Dependent: 3957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Unexpected builtin type"); 3967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::NullPtr: 39724118f5d62f68b18a75db4eb570a0aaf7f4dda97Peter Collingbourne return DBuilder.createNullPtrType(); 3987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Void: 3997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 4007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ObjCClass: 4016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!ClassTy) 4026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ClassTy = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 4036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "objc_class", TheCU, 4046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getOrCreateMainFile(), 0); 4057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ClassTy; 4067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ObjCId: { 4077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // typedef struct objc_class *Class; 4087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // typedef struct objc_object { 4097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Class isa; 4107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // } *id; 4117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 412b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (ObjTy) 4137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ObjTy; 4147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 415b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (!ClassTy) 4167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ClassTy = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 4177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "objc_class", TheCU, 4187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateMainFile(), 0); 4197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 4216537f083555f9606c495d05c562878aa49bae987Eric Christopher 4227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType ISATy = DBuilder.createPointerType(ClassTy, Size); 4237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 424f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher ObjTy = 425c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie DBuilder.createStructType(TheCU, "objc_object", getOrCreateMainFile(), 426c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie 0, 0, 0, 0, llvm::DIType(), llvm::DIArray()); 4277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 428f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher ObjTy.setTypeArray(DBuilder.getOrCreateArray(&*DBuilder.createMemberType( 429f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher ObjTy, "isa", getOrCreateMainFile(), 0, Size, 0, 0, 0, ISATy))); 4307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ObjTy; 4317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ObjCSel: { 4336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!SelTy) 4346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SelTy = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 4356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "objc_selector", TheCU, 4366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getOrCreateMainFile(), 0); 4377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SelTy; 4387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 439b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei 440b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage1d: 441b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return getOrCreateStructPtrType("opencl_image1d_t", 442b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage1dDITy); 443b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage1dArray: 4446537f083555f9606c495d05c562878aa49bae987Eric Christopher return getOrCreateStructPtrType("opencl_image1d_array_t", 445b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage1dArrayDITy); 446b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage1dBuffer: 447b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return getOrCreateStructPtrType("opencl_image1d_buffer_t", 448b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage1dBufferDITy); 449b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage2d: 450b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return getOrCreateStructPtrType("opencl_image2d_t", 451b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage2dDITy); 452b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage2dArray: 453b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return getOrCreateStructPtrType("opencl_image2d_array_t", 454b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage2dArrayDITy); 455b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage3d: 456b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return getOrCreateStructPtrType("opencl_image3d_t", 457b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage3dDITy); 45821f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei case BuiltinType::OCLSampler: 45921f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei return DBuilder.createBasicType("opencl_sampler_t", 46021f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei CGM.getContext().getTypeSize(BT), 46121f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei CGM.getContext().getTypeAlign(BT), 46221f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei llvm::dwarf::DW_ATE_unsigned); 463e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case BuiltinType::OCLEvent: 464e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei return getOrCreateStructPtrType("opencl_event_t", 465e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei OCLEventDITy); 466b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei 4677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UChar: 4687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char_U: Encoding = llvm::dwarf::DW_ATE_unsigned_char; break; 4697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char_S: 4707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::SChar: Encoding = llvm::dwarf::DW_ATE_signed_char; break; 4717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char16: 4727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char32: Encoding = llvm::dwarf::DW_ATE_UTF; break; 4737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UShort: 4747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UInt: 4757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UInt128: 4767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULong: 4777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::WChar_U: 4787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULongLong: Encoding = llvm::dwarf::DW_ATE_unsigned; break; 4797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Short: 4807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Int: 4817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Int128: 4827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Long: 4837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::WChar_S: 4847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::LongLong: Encoding = llvm::dwarf::DW_ATE_signed; break; 4857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Bool: Encoding = llvm::dwarf::DW_ATE_boolean; break; 4867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Half: 4877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Float: 4887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::LongDouble: 4897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Double: Encoding = llvm::dwarf::DW_ATE_float; break; 4907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (BT->getKind()) { 4937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Long: BTName = "long int"; break; 4947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::LongLong: BTName = "long long int"; break; 4957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULong: BTName = "long unsigned int"; break; 4967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULongLong: BTName = "long long unsigned int"; break; 4977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 4987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BTName = BT->getName(CGM.getLangOpts()); 4997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 5007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 5027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(BT); 5037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(BT); 5046537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIType DbgTy = 5057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createBasicType(BTName, Size, Align, Encoding); 5067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 5077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ComplexType *Ty) { 5107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 5116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::dwarf::TypeKind Encoding = llvm::dwarf::DW_ATE_complex_float; 5127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty->isComplexIntegerType()) 5137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Encoding = llvm::dwarf::DW_ATE_lo_user; 5147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 5167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 5176537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIType DbgTy = 5187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createBasicType("complex", Size, Align, Encoding); 5197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 5217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateCVRType - Get the qualified type from the cache or create 5247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a new one if necessary. 52529b8b68c93008317acca212970f2e2c37fa8e874David Blaikiellvm::DIType CGDebugInfo::CreateQualifiedType(QualType Ty, llvm::DIFile Unit) { 5267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualifierCollector Qc; 5277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Type *T = Qc.strip(Ty); 5287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore these qualifiers for now. 5307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeObjCGCAttr(); 5317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeAddressSpace(); 5327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeObjCLifetime(); 5337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We will create one Derived type for one qualifier and recurse to handle any 5357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // additional ones. 5366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::dwarf::Tag Tag; 5377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Qc.hasConst()) { 5387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_const_type; 5397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeConst(); 5407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Qc.hasVolatile()) { 5417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_volatile_type; 5427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeVolatile(); 5437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Qc.hasRestrict()) { 5447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_restrict_type; 5457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeRestrict(); 5467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 5477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Qc.empty() && "Unknown type qualifier for debug info"); 5487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(QualType(T, 0), Unit); 5497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 55129b8b68c93008317acca212970f2e2c37fa8e874David Blaikie llvm::DIType FromTy = getOrCreateType(Qc.apply(CGM.getContext(), T), Unit); 5527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // No need to fill in the Name, Line, Size, Alignment, Offset in case of 5547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // CVR derived types. 5557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType DbgTy = DBuilder.createQualifiedType(Tag, FromTy); 5566537f083555f9606c495d05c562878aa49bae987Eric Christopher 5577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 5587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ObjCObjectPointerType *Ty, 5617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 56205f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian 56305f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian // The frontend treats 'id' as a typedef to an ObjCObjectType, 56405f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian // whereas 'id<protocol>' is treated as an ObjCPointerType. For the 56505f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian // debug info, we want to emit 'id' in both cases. 56605f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian if (Ty->isObjCQualifiedIdType()) 56705f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian return getOrCreateType(CGM.getContext().getObjCIdType(), Unit); 56805f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian 5697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType DbgTy = 5706537f083555f9606c495d05c562878aa49bae987Eric Christopher CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty, 5717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty->getPointeeType(), Unit); 5727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 5737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const PointerType *Ty, 5767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 5776537f083555f9606c495d05c562878aa49bae987Eric Christopher return CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty, 5787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty->getPointeeType(), Unit); 5797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58183369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren/// In C++ mode, types have linkage, so we can rely on the ODR and 58283369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren/// on their mangled names, if they're external. 58383369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Renstatic SmallString<256> 58483369bf8f6244f20ae8bfa2fcb3a556f94da27deManman RengetUniqueTagTypeName(const TagType *Ty, CodeGenModule &CGM, 58583369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren llvm::DICompileUnit TheCU) { 58683369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren SmallString<256> FullName; 58783369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren // FIXME: ODR should apply to ObjC++ exactly the same wasy it does to C++. 58883369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren // For now, only apply ODR with C++. 58983369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren const TagDecl *TD = Ty->getDecl(); 59083369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren if (TheCU.getLanguage() != llvm::dwarf::DW_LANG_C_plus_plus || 59183369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren !TD->isExternallyVisible()) 59283369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren return FullName; 59383369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren // Microsoft Mangler does not have support for mangleCXXRTTIName yet. 59483369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren if (CGM.getTarget().getCXXABI().isMicrosoft()) 59583369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren return FullName; 59683369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren 59783369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren // TODO: This is using the RTTI name. Is there a better way to get 59883369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren // a unique string for a type? 59983369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren llvm::raw_svector_ostream Out(FullName); 60083369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(QualType(Ty, 0), Out); 60183369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren Out.flush(); 60283369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren return FullName; 60383369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren} 60483369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren 6057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Creates a forward declaration for a RecordDecl in the given context. 606eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikiellvm::DICompositeType 607f332733e141905ccefe43e7fe65f9a8a4263a2f6Manman RenCGDebugInfo::getOrCreateRecordFwdDecl(const RecordType *Ty, 608eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie llvm::DIDescriptor Ctx) { 609f332733e141905ccefe43e7fe65f9a8a4263a2f6Manman Ren const RecordDecl *RD = Ty->getDecl(); 610c5cd1a712eb98852ae73f027414d06be85dafff6David Blaikie if (llvm::DIType T = getTypeOrNull(CGM.getContext().getRecordType(RD))) 611eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie return llvm::DICompositeType(T); 6127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); 6137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(RD->getLocation()); 6147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef RDName = getClassName(RD); 6157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::dwarf::Tag Tag; 6177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RD->isStruct() || RD->isInterface()) 6187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_structure_type; 6197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (RD->isUnion()) 6207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_union_type; 6217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 6227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(RD->isClass()); 6237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_class_type; 6247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the type. 62783369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren SmallString<256> FullName = getUniqueTagTypeName(Ty, CGM, TheCU); 6286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::DICompositeType RetTy = DBuilder.createReplaceableForwardDecl( 6296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Tag, RDName, Ctx, DefUnit, Line, 0, 0, 0, FullName); 6306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ReplaceMap.push_back(std::make_pair(Ty, static_cast<llvm::Value *>(RetTy))); 6316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return RetTy; 6327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesllvm::DIType CGDebugInfo::CreatePointerLikeType(llvm::dwarf::Tag Tag, 6356537f083555f9606c495d05c562878aa49bae987Eric Christopher const Type *Ty, 6367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType PointeeTy, 6377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 6387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Tag == llvm::dwarf::DW_TAG_reference_type || 6397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag == llvm::dwarf::DW_TAG_rvalue_reference_type) 64029b8b68c93008317acca212970f2e2c37fa8e874David Blaikie return DBuilder.createReferenceType(Tag, getOrCreateType(PointeeTy, Unit)); 64105f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian 6427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 6437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Size is always the size of a pointer. We can't use getTypeSize here 6447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // because that does not return the correct value for references. 6457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned AS = CGM.getContext().getTargetAddressSpace(PointeeTy); 64664aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall uint64_t Size = CGM.getTarget().getPointerWidth(AS); 6477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 6487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64929b8b68c93008317acca212970f2e2c37fa8e874David Blaikie return DBuilder.createPointerType(getOrCreateType(PointeeTy, Unit), Size, 65029b8b68c93008317acca212970f2e2c37fa8e874David Blaikie Align); 6517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 653f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopherllvm::DIType CGDebugInfo::getOrCreateStructPtrType(StringRef Name, 654f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher llvm::DIType &Cache) { 655b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (Cache) 656b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return Cache; 6571e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie Cache = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, Name, 6581e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie TheCU, getOrCreateMainFile(), 0); 6591e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 6601e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie Cache = DBuilder.createPointerType(Cache, Size); 6611e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie return Cache; 662b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei} 663b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei 6647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const BlockPointerType *Ty, 6657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 666b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (BlockLiteralGeneric) 6677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return BlockLiteralGeneric; 6687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 8> EltTys; 6707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy; 6717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FType; 6727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize, FieldOffset; 6737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign; 6747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray Elements; 6757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType EltTy, DescTy; 6767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 6787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().UnsignedLongTy; 6797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "reserved", &FieldOffset)); 6807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "Size", &FieldOffset)); 6817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elements = DBuilder.getOrCreateArray(EltTys); 6837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.clear(); 6847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = llvm::DIDescriptor::FlagAppleBlock; 6867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(CurLoc); 6877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTy = DBuilder.createStructType(Unit, "__block_descriptor", 6897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unit, LineNo, FieldOffset, 0, 690c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie Flags, llvm::DIType(), Elements); 6917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 6937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 6947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DescTy = DBuilder.createPointerType(EltTy, Size); 6967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 6987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 6997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset)); 7007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().IntTy; 7017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset)); 7027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__reserved", &FieldOffset)); 7037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 7047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__FuncPtr", &FieldOffset)); 7057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 7077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldTy = DescTy; 7087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize = CGM.getContext().getTypeSize(Ty); 7097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldAlign = CGM.getContext().getTypeAlign(Ty); 7107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldTy = DBuilder.createMemberType(Unit, "__descriptor", Unit, 7117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LineNo, FieldSize, FieldAlign, 7127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset, 0, FieldTy); 7137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(FieldTy); 7147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset += FieldSize; 7167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elements = DBuilder.getOrCreateArray(EltTys); 7177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTy = DBuilder.createStructType(Unit, "__block_literal_generic", 7197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unit, LineNo, FieldOffset, 0, 720c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie Flags, llvm::DIType(), Elements); 7217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BlockLiteralGeneric = DBuilder.createPointerType(EltTy, Size); 7237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return BlockLiteralGeneric; 7247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesllvm::DIType CGDebugInfo::CreateType(const TemplateSpecializationType *Ty, llvm::DIFile Unit) { 7276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(Ty->isTypeAlias()); 7286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::DIType Src = getOrCreateType(Ty->getAliasedType(), Unit); 7296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 7306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SmallString<128> NS; 7316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::raw_svector_ostream OS(NS); 7326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Ty->getTemplateName().print(OS, CGM.getContext().getPrintingPolicy(), /*qualified*/ false); 7336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 7346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TemplateSpecializationType::PrintTemplateArgumentList( 7356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OS, Ty->getArgs(), Ty->getNumArgs(), 7366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CGM.getContext().getPrintingPolicy()); 7376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 7386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TypeAliasDecl *AliasDecl = 7396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines cast<TypeAliasTemplateDecl>(Ty->getTemplateName().getAsTemplateDecl()) 7406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ->getTemplatedDecl(); 7416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 7426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation Loc = AliasDecl->getLocation(); 7436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::DIFile File = getOrCreateFile(Loc); 7446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned Line = getLineNumber(Loc); 7456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 7466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::DIDescriptor Ctxt = getContextDescriptor(cast<Decl>(AliasDecl->getDeclContext())); 7476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 7486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return DBuilder.createTypedef(Src, internString(OS.str()), File, Line, Ctxt); 7496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 7506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 75129b8b68c93008317acca212970f2e2c37fa8e874David Blaikiellvm::DIType CGDebugInfo::CreateType(const TypedefType *Ty, llvm::DIFile Unit) { 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. 75429b8b68c93008317acca212970f2e2c37fa8e874David Blaikie llvm::DIType Src = getOrCreateType(Ty->getDecl()->getUnderlyingType(), Unit); 7557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We don't set size information, but do specify where the typedef was 7567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // declared. 757651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation Loc = Ty->getDecl()->getLocation(); 758651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::DIFile File = getOrCreateFile(Loc); 759651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned Line = getLineNumber(Loc); 7607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TypedefNameDecl *TyDecl = Ty->getDecl(); 7616537f083555f9606c495d05c562878aa49bae987Eric Christopher 7627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor TypedefContext = 7637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(cast<Decl>(Ty->getDecl()->getDeclContext())); 7646537f083555f9606c495d05c562878aa49bae987Eric Christopher 7657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 766651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DBuilder.createTypedef(Src, TyDecl->getName(), File, Line, TypedefContext); 7677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const FunctionType *Ty, 7707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 7717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> EltTys; 7727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add the result type at least. 774651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EltTys.push_back(getOrCreateType(Ty->getReturnType(), Unit)); 7757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Set up remainder of arguments if there is a prototype. 777651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // otherwise emit it as a variadic function. 7787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<FunctionNoProtoType>(Ty)) 7797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(DBuilder.createUnspecifiedParameter()); 7807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(Ty)) { 781651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (unsigned i = 0, e = FPT->getNumParams(); i != e; ++i) 782651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EltTys.push_back(getOrCreateType(FPT->getParamType(i), Unit)); 783651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (FPT->isVariadic()) 784651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EltTys.push_back(DBuilder.createUnspecifiedParameter()); 7857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(EltTys); 7887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createSubroutineType(Unit, EltTypeArray); 7897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::createFieldType(StringRef name, 7937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType type, 7947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t sizeInBitsOverride, 7957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation loc, 7967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei AccessSpecifier AS, 7977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t offsetInBits, 7987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile tunit, 799c23b1db6268c8e7ce64026d57d1510c1aac200a0Manman Ren llvm::DIScope scope) { 8007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType debugType = getOrCreateType(type, tunit); 8017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the location for the field. 8037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile file = getOrCreateFile(loc); 8047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned line = getLineNumber(loc); 8057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t sizeInBits = 0; 8077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned alignInBits = 0; 8087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!type->isIncompleteArrayType()) { 809651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::tie(sizeInBits, alignInBits) = CGM.getContext().getTypeInfo(type); 8107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (sizeInBitsOverride) 8127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei sizeInBits = sizeInBitsOverride; 8137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 8147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned flags = 0; 8167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (AS == clang::AS_private) 8177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei flags |= llvm::DIDescriptor::FlagPrivate; 8187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (AS == clang::AS_protected) 8197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei flags |= llvm::DIDescriptor::FlagProtected; 8207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createMemberType(scope, name, file, line, sizeInBits, 8227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei alignInBits, offsetInBits, flags, debugType); 8237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 8247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8250395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// CollectRecordLambdaFields - Helper for CollectRecordFields. 8260395de36004a718e265cc256b1bbee3bd3a791dcEric Christophervoid CGDebugInfo:: 8270395de36004a718e265cc256b1bbee3bd3a791dcEric ChristopherCollectRecordLambdaFields(const CXXRecordDecl *CXXDecl, 8280395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SmallVectorImpl<llvm::Value *> &elements, 8290395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType RecordTy) { 8300395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // For C++11 Lambdas a Field will be the same as a Capture, but the Capture 8310395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // has the name and the location of the variable so we should iterate over 8320395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // both concurrently. 8330395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(CXXDecl); 8340395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher RecordDecl::field_iterator Field = CXXDecl->field_begin(); 8350395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher unsigned fieldno = 0; 8360395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher for (CXXRecordDecl::capture_const_iterator I = CXXDecl->captures_begin(), 8370395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher E = CXXDecl->captures_end(); I != E; ++I, ++Field, ++fieldno) { 8386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const LambdaCapture &C = *I; 8390395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (C.capturesVariable()) { 8400395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher VarDecl *V = C.getCapturedVar(); 8410395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIFile VUnit = getOrCreateFile(C.getLocation()); 8420395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StringRef VName = V->getName(); 8430395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher uint64_t SizeInBitsOverride = 0; 8440395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (Field->isBitField()) { 8450395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SizeInBitsOverride = Field->getBitWidthValue(CGM.getContext()); 8460395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher assert(SizeInBitsOverride && "found named 0-width bitfield"); 8470395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 8480395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType fieldType 8490395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher = createFieldType(VName, Field->getType(), SizeInBitsOverride, 8500395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher C.getLocation(), Field->getAccess(), 8510395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher layout.getFieldOffset(fieldno), VUnit, RecordTy); 8520395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher elements.push_back(fieldType); 8530395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } else { 8540395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // TODO: Need to handle 'this' in some way by probably renaming the 8550395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // this of the lambda class and having a field member of 'this' or 8560395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // by using AT_object_pointer for the function and having that be 8570395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // used as 'this' for semantic references. 8580395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher assert(C.capturesThis() && "Field that isn't captured and isn't this?"); 8590395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher FieldDecl *f = *Field; 8600395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIFile VUnit = getOrCreateFile(f->getLocation()); 8610395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher QualType type = f->getType(); 8620395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType fieldType 8630395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher = createFieldType("this", type, 0, f->getLocation(), f->getAccess(), 8640395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher layout.getFieldOffset(fieldno), VUnit, RecordTy); 8650395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8660395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher elements.push_back(fieldType); 8670395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 8680395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 8690395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher} 8700395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8715434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie/// Helper for CollectRecordFields. 872cbcb030ab33d23c5f7e2e76e2e36843cb5295d50David Blaikiellvm::DIDerivedType 873cbcb030ab33d23c5f7e2e76e2e36843cb5295d50David BlaikieCGDebugInfo::CreateRecordStaticField(const VarDecl *Var, 874cbcb030ab33d23c5f7e2e76e2e36843cb5295d50David Blaikie 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 unsigned LineNumber = getLineNumber(Var->getLocation()); 8810395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StringRef VName = Var->getName(); 8826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::Constant *C = nullptr; 8830395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (Var->getInit()) { 8840395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const APValue *Value = Var->evaluateValue(); 885a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie if (Value) { 886a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie if (Value->isInt()) 887a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie C = llvm::ConstantInt::get(CGM.getLLVMContext(), Value->getInt()); 888a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie if (Value->isFloat()) 889a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie C = llvm::ConstantFP::get(CGM.getLLVMContext(), Value->getFloat()); 890a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie } 8910395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 8920395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8930395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher unsigned Flags = 0; 8940395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher AccessSpecifier Access = Var->getAccess(); 8950395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (Access == clang::AS_private) 8960395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher Flags |= llvm::DIDescriptor::FlagPrivate; 8970395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher else if (Access == clang::AS_protected) 8980395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher Flags |= llvm::DIDescriptor::FlagProtected; 8990395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 900cbcb030ab33d23c5f7e2e76e2e36843cb5295d50David Blaikie llvm::DIDerivedType GV = DBuilder.createStaticMemberType( 901cbcb030ab33d23c5f7e2e76e2e36843cb5295d50David Blaikie RecordTy, VName, VUnit, LineNumber, VTy, Flags, C); 9020395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StaticDataMemberCache[Var->getCanonicalDecl()] = llvm::WeakVH(GV); 903cbcb030ab33d23c5f7e2e76e2e36843cb5295d50David Blaikie return GV; 9040395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher} 9050395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9060395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// CollectRecordNormalField - Helper for CollectRecordFields. 9070395de36004a718e265cc256b1bbee3bd3a791dcEric Christophervoid CGDebugInfo:: 9080395de36004a718e265cc256b1bbee3bd3a791dcEric ChristopherCollectRecordNormalField(const FieldDecl *field, uint64_t OffsetInBits, 9090395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIFile tunit, 9100395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SmallVectorImpl<llvm::Value *> &elements, 9110395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType RecordTy) { 9120395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StringRef name = field->getName(); 9130395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher QualType type = field->getType(); 9140395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9150395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Ignore unnamed fields unless they're anonymous structs/unions. 9160395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (name.empty() && !type->isRecordType()) 9170395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher return; 9180395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9190395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher uint64_t SizeInBitsOverride = 0; 9200395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (field->isBitField()) { 9210395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SizeInBitsOverride = field->getBitWidthValue(CGM.getContext()); 9220395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher assert(SizeInBitsOverride && "found named 0-width bitfield"); 9230395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 9240395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9250395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType fieldType 9260395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher = createFieldType(name, type, SizeInBitsOverride, 9270395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher field->getLocation(), field->getAccess(), 9280395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher OffsetInBits, tunit, RecordTy); 9290395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9300395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher elements.push_back(fieldType); 9310395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher} 9320395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectRecordFields - A helper function to collect debug info for 9347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// record fields. This is used while creating debug info entry for a Record. 935841fd110a3b8f35d57050fb7db962232ee8bf764David Blaikievoid CGDebugInfo::CollectRecordFields(const RecordDecl *record, 936841fd110a3b8f35d57050fb7db962232ee8bf764David Blaikie llvm::DIFile tunit, 937841fd110a3b8f35d57050fb7db962232ee8bf764David Blaikie SmallVectorImpl<llvm::Value *> &elements, 938841fd110a3b8f35d57050fb7db962232ee8bf764David Blaikie llvm::DICompositeType RecordTy) { 9397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(record); 9407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9410395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (CXXDecl && CXXDecl->isLambda()) 9420395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher CollectRecordLambdaFields(CXXDecl, elements, RecordTy); 9430395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher else { 9440395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(record); 9450395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9460395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Field number for non-static fields. 947fd5ac0d75abd6ead8dd39bf526b34eeaff81cef6Eric Christopher unsigned fieldNo = 0; 9480395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9490395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Static and non-static members should appear in the same order as 9500395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // the corresponding declarations in the source program. 951651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *I : record->decls()) 952651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (const auto *V = dyn_cast<VarDecl>(I)) { 9535e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie // Reuse the existing static member declaration if one exists 9545e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator MI = 9555e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie StaticDataMemberCache.find(V->getCanonicalDecl()); 9565e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie if (MI != StaticDataMemberCache.end()) { 9575e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie assert(MI->second && 9585e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie "Static data member declaration should still exist"); 9595e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie elements.push_back( 9605e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie llvm::DIDerivedType(cast<llvm::MDNode>(MI->second))); 9615e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie } else 9625e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie elements.push_back(CreateRecordStaticField(V, RecordTy)); 963651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (const auto *field = dyn_cast<FieldDecl>(I)) { 9640395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher CollectRecordNormalField(field, layout.getFieldOffset(fieldNo), 9650395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher tunit, elements, RecordTy); 9667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9670395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Bump field number for next field. 9680395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher ++fieldNo; 9697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 9727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateMethodType - CXXMethodDecl's type is a FunctionType. This 9747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// function type is not updated to include implicit "this" pointer. Use this 9757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// routine to get a method type which includes "this" pointer. 9769a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikiellvm::DICompositeType 9777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::getOrCreateMethodType(const CXXMethodDecl *Method, 9787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 9799c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie const FunctionProtoType *Func = Method->getType()->getAs<FunctionProtoType>(); 98067f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie if (Method->isStatic()) 9819a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie return llvm::DICompositeType(getOrCreateType(QualType(Func, 0), Unit)); 9829c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie return getOrCreateInstanceMethodType(Method->getThisType(CGM.getContext()), 9839c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie Func, Unit); 9849c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie} 98567f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie 9869a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikiellvm::DICompositeType CGDebugInfo::getOrCreateInstanceMethodType( 9879c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie QualType ThisPtr, const FunctionProtoType *Func, llvm::DIFile Unit) { 9887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add "this" pointer. 9899c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie llvm::DIArray Args = llvm::DICompositeType( 9909c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie getOrCreateType(QualType(Func, 0), Unit)).getTypeArray(); 9917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert (Args.getNumElements() && "Invalid number of arguments!"); 9927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> Elts; 9947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // First element is always return type. For 'void' functions it is NULL. 9967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elts.push_back(Args.getElement(0)); 9977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 99867f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // "this" pointer is always first argument. 9999c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie const CXXRecordDecl *RD = ThisPtr->getPointeeCXXRecordDecl(); 100067f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie if (isa<ClassTemplateSpecializationDecl>(RD)) { 100167f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // Create pointer type directly in this case. 100267f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie const PointerType *ThisPtrTy = cast<PointerType>(ThisPtr); 100367f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie QualType PointeeTy = ThisPtrTy->getPointeeType(); 100467f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie unsigned AS = CGM.getContext().getTargetAddressSpace(PointeeTy); 100564aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall uint64_t Size = CGM.getTarget().getPointerWidth(AS); 100667f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie uint64_t Align = CGM.getContext().getTypeAlign(ThisPtrTy); 100767f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie llvm::DIType PointeeType = getOrCreateType(PointeeTy, Unit); 1008f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher llvm::DIType ThisPtrType = 1009f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher DBuilder.createPointerType(PointeeType, Size, Align); 101067f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie TypeCache[ThisPtr.getAsOpaquePtr()] = ThisPtrType; 101167f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // TODO: This and the artificial type below are misleading, the 101267f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // types aren't artificial the argument is, but the current 101367f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // metadata doesn't represent that. 101467f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType); 101567f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie Elts.push_back(ThisPtrType); 101667f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie } else { 101767f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie llvm::DIType ThisPtrType = getOrCreateType(ThisPtr, Unit); 101867f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie TypeCache[ThisPtr.getAsOpaquePtr()] = ThisPtrType; 101967f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType); 102067f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie Elts.push_back(ThisPtrType); 10217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Copy rest of the arguments. 10247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 1, e = Args.getNumElements(); i != e; ++i) 10257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elts.push_back(Args.getElement(i)); 10267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(Elts); 10287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1029651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned Flags = 0; 1030651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Func->getExtProtoInfo().RefQualifier == RQ_LValue) 1031651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Flags |= llvm::DIDescriptor::FlagLValueReference; 1032651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Func->getExtProtoInfo().RefQualifier == RQ_RValue) 1033651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Flags |= llvm::DIDescriptor::FlagRValueReference; 1034651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1035651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return DBuilder.createSubroutineType(Unit, EltTypeArray, Flags); 10367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10386537f083555f9606c495d05c562878aa49bae987Eric Christopher/// isFunctionLocalClass - Return true if CXXRecordDecl is defined 10397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// inside a function. 10407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool isFunctionLocalClass(const CXXRecordDecl *RD) { 10417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXRecordDecl *NRD = dyn_cast<CXXRecordDecl>(RD->getDeclContext())) 10427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return isFunctionLocalClass(NRD); 10437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<FunctionDecl>(RD->getDeclContext())) 10447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 10457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 10467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateCXXMemberFunction - A helper function to create a DISubprogram for 10497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a single member function GlobalDecl. 10507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DISubprogram 10517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::CreateCXXMemberFunction(const CXXMethodDecl *Method, 10527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit, 10537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 10546537f083555f9606c495d05c562878aa49bae987Eric Christopher bool IsCtorOrDtor = 10557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei isa<CXXConstructorDecl>(Method) || isa<CXXDestructorDecl>(Method); 10566537f083555f9606c495d05c562878aa49bae987Eric Christopher 10577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef MethodName = getFunctionName(Method); 10589a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie llvm::DICompositeType MethodTy = getOrCreateMethodType(Method, Unit); 10597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Since a single ctor/dtor corresponds to multiple functions, it doesn't 10617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // make sense to give a single ctor/dtor a linkage name. 10627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef MethodLinkageName; 10637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!IsCtorOrDtor && !isFunctionLocalClass(Method->getParent())) 10647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MethodLinkageName = CGM.getMangledName(Method); 10657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the location for the method. 1067fc946271e008544b518321fdecc77ca076663c12David Blaikie llvm::DIFile MethodDefUnit; 1068fc946271e008544b518321fdecc77ca076663c12David Blaikie unsigned MethodLine = 0; 1069fc946271e008544b518321fdecc77ca076663c12David Blaikie if (!Method->isImplicit()) { 1070fc946271e008544b518321fdecc77ca076663c12David Blaikie MethodDefUnit = getOrCreateFile(Method->getLocation()); 1071fc946271e008544b518321fdecc77ca076663c12David Blaikie MethodLine = getLineNumber(Method->getLocation()); 1072fc946271e008544b518321fdecc77ca076663c12David Blaikie } 10737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Collect virtual method info. 10757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType ContainingType; 10766537f083555f9606c495d05c562878aa49bae987Eric Christopher unsigned Virtuality = 0; 10777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned VIndex = 0; 10786537f083555f9606c495d05c562878aa49bae987Eric Christopher 10797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->isVirtual()) { 10807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->isPure()) 10817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Virtuality = llvm::dwarf::DW_VIRTUALITY_pure_virtual; 10827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 10837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Virtuality = llvm::dwarf::DW_VIRTUALITY_virtual; 10846537f083555f9606c495d05c562878aa49bae987Eric Christopher 10857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // It doesn't make sense to give a virtual destructor a vtable index, 10867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // since a single destructor has two entries in the vtable. 1087a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // FIXME: Add proper support for debug info for virtual calls in 1088a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // the Microsoft ABI, where we may use multiple vptrs to make a vftable 1089a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // lookup if we have multiple or virtual inheritance. 1090a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov if (!isa<CXXDestructorDecl>(Method) && 1091a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov !CGM.getTarget().getCXXABI().isMicrosoft()) 10925f0db587078b5af32fc9ac41fe4276b80918fd8dTimur Iskhodzhanov VIndex = CGM.getItaniumVTableContext().getMethodVTableIndex(Method); 10937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContainingType = RecordTy; 10947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 10977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->isImplicit()) 10987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagArtificial; 10997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei AccessSpecifier Access = Method->getAccess(); 11007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Access == clang::AS_private) 11017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrivate; 11027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (Access == clang::AS_protected) 11037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagProtected; 11047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXConstructorDecl *CXXC = dyn_cast<CXXConstructorDecl>(Method)) { 11057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXC->isExplicit()) 11067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagExplicit; 11076537f083555f9606c495d05c562878aa49bae987Eric Christopher } else if (const CXXConversionDecl *CXXC = 11087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<CXXConversionDecl>(Method)) { 11097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXC->isExplicit()) 11107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagExplicit; 11117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->hasPrototype()) 11137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrototyped; 1114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Method->getRefQualifier() == RQ_LValue) 1115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Flags |= llvm::DIDescriptor::FlagLValueReference; 1116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Method->getRefQualifier() == RQ_RValue) 1117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Flags |= llvm::DIDescriptor::FlagRValueReference; 11187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray TParamsArray = CollectFunctionTemplateParams(Method, Unit); 11207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DISubprogram SP = 11216537f083555f9606c495d05c562878aa49bae987Eric Christopher DBuilder.createMethod(RecordTy, MethodName, MethodLinkageName, 11227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MethodDefUnit, MethodLine, 11236537f083555f9606c495d05c562878aa49bae987Eric Christopher MethodTy, /*isLocalToUnit=*/false, 11247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /* isDefinition=*/ false, 11257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Virtuality, VIndex, ContainingType, 11266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Flags, CGM.getLangOpts().Optimize, nullptr, 11277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TParamsArray); 11286537f083555f9606c495d05c562878aa49bae987Eric Christopher 11297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SPCache[Method->getCanonicalDecl()] = llvm::WeakVH(SP); 11307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SP; 11327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 11337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectCXXMemberFunctions - A helper function to collect debug info for 11356537f083555f9606c495d05c562878aa49bae987Eric Christopher/// C++ member functions. This is used while creating debug info entry for 11367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a Record. 11377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 11387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectCXXMemberFunctions(const CXXRecordDecl *RD, llvm::DIFile Unit, 11397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &EltTys, 11407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 11417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Since we want more than just the individual member decls if we 11437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // have templated functions iterate over every declaration to gather 11447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the functions. 1145651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for(const auto *I : RD->decls()) { 1146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (const auto *Method = dyn_cast<CXXMethodDecl>(I)) { 1147dd65802b1cf30d892b82c8370b96e6c94d239510David Blaikie // Reuse the existing member function declaration if it exists. 11484a68491fa179572e6b2c1364e7ff24c05110324bDavid Blaikie // It may be associated with the declaration of the type & should be 11494a68491fa179572e6b2c1364e7ff24c05110324bDavid Blaikie // reused as we're building the definition. 1150dd65802b1cf30d892b82c8370b96e6c94d239510David Blaikie // 1151dd65802b1cf30d892b82c8370b96e6c94d239510David Blaikie // This situation can arise in the vtable-based debug info reduction where 1152dd65802b1cf30d892b82c8370b96e6c94d239510David Blaikie // implicit members are emitted in a non-vtable TU. 11535434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator MI = 11545434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie SPCache.find(Method->getCanonicalDecl()); 1155c5761271730ab929f19facef51903c9bdf5c5d0bDavid Blaikie if (MI == SPCache.end()) { 11564a68491fa179572e6b2c1364e7ff24c05110324bDavid Blaikie // If the member is implicit, lazily create it when we see the 11574a68491fa179572e6b2c1364e7ff24c05110324bDavid Blaikie // definition, not before. (an ODR-used implicit default ctor that's 11584a68491fa179572e6b2c1364e7ff24c05110324bDavid Blaikie // never actually code generated should not produce debug info) 1159c5761271730ab929f19facef51903c9bdf5c5d0bDavid Blaikie if (!Method->isImplicit()) 1160c5761271730ab929f19facef51903c9bdf5c5d0bDavid Blaikie EltTys.push_back(CreateCXXMemberFunction(Method, Unit, RecordTy)); 1161c5761271730ab929f19facef51903c9bdf5c5d0bDavid Blaikie } else 11625434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie EltTys.push_back(MI->second); 1163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (const auto *FTD = dyn_cast<FunctionTemplateDecl>(I)) { 116411fa7518cb2cf92db977ccc15f0db97307eac58cDavid Blaikie // Add any template specializations that have already been seen. Like 116511fa7518cb2cf92db977ccc15f0db97307eac58cDavid Blaikie // implicit member functions, these may have been added to a declaration 116611fa7518cb2cf92db977ccc15f0db97307eac58cDavid Blaikie // in the case of vtable-based debug info reduction. 1167651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *SI : FTD->specializations()) { 116811fa7518cb2cf92db977ccc15f0db97307eac58cDavid Blaikie llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator MI = 1169651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SPCache.find(cast<CXXMethodDecl>(SI)->getCanonicalDecl()); 117011fa7518cb2cf92db977ccc15f0db97307eac58cDavid Blaikie if (MI != SPCache.end()) 117111fa7518cb2cf92db977ccc15f0db97307eac58cDavid Blaikie EltTys.push_back(MI->second); 117211fa7518cb2cf92db977ccc15f0db97307eac58cDavid Blaikie } 11735434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie } 11747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11756537f083555f9606c495d05c562878aa49bae987Eric Christopher} 11767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectCXXBases - A helper function to collect debug info for 11786537f083555f9606c495d05c562878aa49bae987Eric Christopher/// C++ base classes. This is used while creating debug info entry for 11797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a Record. 11807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 11817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile Unit, 11827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &EltTys, 11837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 11847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 1186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &BI : RD->bases()) { 11877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned BFlags = 0; 11887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t BaseOffset; 11896537f083555f9606c495d05c562878aa49bae987Eric Christopher 11907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *Base = 1191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines cast<CXXRecordDecl>(BI.getType()->getAs<RecordType>()->getDecl()); 11926537f083555f9606c495d05c562878aa49bae987Eric Christopher 1193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (BI.isVirtual()) { 11947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // virtual base offset offset is -ve. The code generator emits dwarf 11957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // expression where it expects +ve number. 11966537f083555f9606c495d05c562878aa49bae987Eric Christopher BaseOffset = 11975f0db587078b5af32fc9ac41fe4276b80918fd8dTimur Iskhodzhanov 0 - CGM.getItaniumVTableContext() 11987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei .getVirtualBaseOffsetOffset(RD, Base).getQuantity(); 11997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BFlags = llvm::DIDescriptor::FlagVirtual; 12007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else 12017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BaseOffset = CGM.getContext().toBits(RL.getBaseClassOffset(Base)); 12027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Inconsistent units for BaseOffset. It is in bytes when 12037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // BI->isVirtual() and bits when not. 12046537f083555f9606c495d05c562878aa49bae987Eric Christopher 1205651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AccessSpecifier Access = BI.getAccessSpecifier(); 12067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Access == clang::AS_private) 12077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BFlags |= llvm::DIDescriptor::FlagPrivate; 12087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (Access == clang::AS_protected) 12097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BFlags |= llvm::DIDescriptor::FlagProtected; 12106537f083555f9606c495d05c562878aa49bae987Eric Christopher 12116537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIType DTy = 12126537f083555f9606c495d05c562878aa49bae987Eric Christopher DBuilder.createInheritance(RecordTy, 1213651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getOrCreateType(BI.getType(), Unit), 12147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BaseOffset, BFlags); 12157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(DTy); 12167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 12187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectTemplateParams - A helper function to collect template parameters. 12207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIArray CGDebugInfo:: 12217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectTemplateParams(const TemplateParameterList *TPList, 122235178dc09d97bb2e0612813def09833866e3ad82David Blaikie ArrayRef<TemplateArgument> TAList, 12237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 12246537f083555f9606c495d05c562878aa49bae987Eric Christopher SmallVector<llvm::Value *, 16> TemplateParams; 12257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0, e = TAList.size(); i != e; ++i) { 12267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgument &TA = TAList[i]; 122735178dc09d97bb2e0612813def09833866e3ad82David Blaikie StringRef Name; 122835178dc09d97bb2e0612813def09833866e3ad82David Blaikie if (TPList) 122935178dc09d97bb2e0612813def09833866e3ad82David Blaikie Name = TPList->getParam(i)->getName(); 12309dfd24324c079b564dda936c6ae46898b82121e2David Blaikie switch (TA.getKind()) { 12319dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Type: { 12327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType TTy = getOrCreateType(TA.getAsType(), Unit); 12337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DITemplateTypeParameter TTP = 123435178dc09d97bb2e0612813def09833866e3ad82David Blaikie DBuilder.createTemplateTypeParameter(TheCU, Name, TTy); 12357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateParams.push_back(TTP); 12369dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 12379dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Integral: { 12387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType TTy = getOrCreateType(TA.getIntegralType(), Unit); 12397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DITemplateValueParameter TVP = 12409dfd24324c079b564dda936c6ae46898b82121e2David Blaikie DBuilder.createTemplateValueParameter( 124135178dc09d97bb2e0612813def09833866e3ad82David Blaikie TheCU, Name, TTy, 12429dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::ConstantInt::get(CGM.getLLVMContext(), TA.getAsIntegral())); 12439dfd24324c079b564dda936c6ae46898b82121e2David Blaikie TemplateParams.push_back(TVP); 12449dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 12459dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Declaration: { 12469dfd24324c079b564dda936c6ae46898b82121e2David Blaikie const ValueDecl *D = TA.getAsDecl(); 12479dfd24324c079b564dda936c6ae46898b82121e2David Blaikie bool InstanceMember = D->isCXXInstanceMember(); 12489dfd24324c079b564dda936c6ae46898b82121e2David Blaikie QualType T = InstanceMember 12499dfd24324c079b564dda936c6ae46898b82121e2David Blaikie ? CGM.getContext().getMemberPointerType( 12509dfd24324c079b564dda936c6ae46898b82121e2David Blaikie D->getType(), cast<RecordDecl>(D->getDeclContext()) 12519dfd24324c079b564dda936c6ae46898b82121e2David Blaikie ->getTypeForDecl()) 12529dfd24324c079b564dda936c6ae46898b82121e2David Blaikie : CGM.getContext().getPointerType(D->getType()); 12539dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::DIType TTy = getOrCreateType(T, Unit); 12546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::Value *V = nullptr; 12559dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Variable pointer template parameters have a value that is the address 12569dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // of the variable. 12579dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (const VarDecl *VD = dyn_cast<VarDecl>(D)) 12589dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.GetAddrOfGlobalVar(VD); 12599dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Member function pointers have special support for building them, though 12609dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // this is currently unsupported in LLVM CodeGen. 1261f8aa155e40bc98844f46ecbfdbe430696c36ce24David Blaikie if (InstanceMember) { 12629dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (const CXXMethodDecl *method = dyn_cast<CXXMethodDecl>(D)) 12639dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.getCXXABI().EmitMemberPointer(method); 1264f8aa155e40bc98844f46ecbfdbe430696c36ce24David Blaikie } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) 1265f8aa155e40bc98844f46ecbfdbe430696c36ce24David Blaikie V = CGM.GetAddrOfFunction(FD); 12669dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Member data pointers have special handling too to compute the fixed 12679dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // offset within the object. 1268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isa<FieldDecl>(D) || isa<IndirectFieldDecl>(D)) { 12699dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // These five lines (& possibly the above member function pointer 12709dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // handling) might be able to be refactored to use similar code in 12719dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // CodeGenModule::getMemberPointerConstant 12729dfd24324c079b564dda936c6ae46898b82121e2David Blaikie uint64_t fieldOffset = CGM.getContext().getFieldOffset(D); 12739dfd24324c079b564dda936c6ae46898b82121e2David Blaikie CharUnits chars = 12749dfd24324c079b564dda936c6ae46898b82121e2David Blaikie CGM.getContext().toCharUnitsFromBits((int64_t) fieldOffset); 12759dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.getCXXABI().EmitMemberDataPointer( 12769dfd24324c079b564dda936c6ae46898b82121e2David Blaikie cast<MemberPointerType>(T.getTypePtr()), chars); 12779dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } 12789dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::DITemplateValueParameter TVP = 12795db8b3138f36e11bca835881e81cc56bbd7b4fa4David Majnemer DBuilder.createTemplateValueParameter(TheCU, Name, TTy, 12805db8b3138f36e11bca835881e81cc56bbd7b4fa4David Majnemer V->stripPointerCasts()); 12819dfd24324c079b564dda936c6ae46898b82121e2David Blaikie TemplateParams.push_back(TVP); 12829dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 12839dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::NullPtr: { 12849dfd24324c079b564dda936c6ae46898b82121e2David Blaikie QualType T = TA.getNullPtrType(); 12859dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::DIType TTy = getOrCreateType(T, Unit); 12866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::Value *V = nullptr; 12879dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Special case member data pointer null values since they're actually -1 12889dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // instead of zero. 12899dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (const MemberPointerType *MPT = 12909dfd24324c079b564dda936c6ae46898b82121e2David Blaikie dyn_cast<MemberPointerType>(T.getTypePtr())) 12919dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // But treat member function pointers as simple zero integers because 12929dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // it's easier than having a special case in LLVM's CodeGen. If LLVM 12939dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // CodeGen grows handling for values of non-null member function 12949dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // pointers then perhaps we could remove this special case and rely on 12959dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // EmitNullMemberPointer for member function pointers. 12969dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (MPT->isMemberDataPointer()) 12979dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.getCXXABI().EmitNullMemberPointer(MPT); 12989dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (!V) 12999dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = llvm::ConstantInt::get(CGM.Int8Ty, 0); 13009dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::DITemplateValueParameter TVP = 130135178dc09d97bb2e0612813def09833866e3ad82David Blaikie DBuilder.createTemplateValueParameter(TheCU, Name, TTy, V); 130235178dc09d97bb2e0612813def09833866e3ad82David Blaikie TemplateParams.push_back(TVP); 130335178dc09d97bb2e0612813def09833866e3ad82David Blaikie } break; 130435178dc09d97bb2e0612813def09833866e3ad82David Blaikie case TemplateArgument::Template: { 130535178dc09d97bb2e0612813def09833866e3ad82David Blaikie llvm::DITemplateValueParameter TVP = 130635178dc09d97bb2e0612813def09833866e3ad82David Blaikie DBuilder.createTemplateTemplateParameter( 130735178dc09d97bb2e0612813def09833866e3ad82David Blaikie TheCU, Name, llvm::DIType(), 130835178dc09d97bb2e0612813def09833866e3ad82David Blaikie TA.getAsTemplate().getAsTemplateDecl() 130935178dc09d97bb2e0612813def09833866e3ad82David Blaikie ->getQualifiedNameAsString()); 131035178dc09d97bb2e0612813def09833866e3ad82David Blaikie TemplateParams.push_back(TVP); 131135178dc09d97bb2e0612813def09833866e3ad82David Blaikie } break; 131235178dc09d97bb2e0612813def09833866e3ad82David Blaikie case TemplateArgument::Pack: { 131335178dc09d97bb2e0612813def09833866e3ad82David Blaikie llvm::DITemplateValueParameter TVP = 131435178dc09d97bb2e0612813def09833866e3ad82David Blaikie DBuilder.createTemplateParameterPack( 131535178dc09d97bb2e0612813def09833866e3ad82David Blaikie TheCU, Name, llvm::DIType(), 13166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CollectTemplateParams(nullptr, TA.getPackAsArray(), Unit)); 13179dfd24324c079b564dda936c6ae46898b82121e2David Blaikie TemplateParams.push_back(TVP); 13189dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 131987b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer case TemplateArgument::Expression: { 132087b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer const Expr *E = TA.getAsExpr(); 132187b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer QualType T = E->getType(); 132287b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer llvm::Value *V = CGM.EmitConstantExpr(E, T); 132387b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer assert(V && "Expression in template argument isn't constant"); 132487b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer llvm::DIType TTy = getOrCreateType(T, Unit); 132587b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer llvm::DITemplateValueParameter TVP = 132687b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer DBuilder.createTemplateValueParameter(TheCU, Name, TTy, 132787b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer V->stripPointerCasts()); 132887b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer TemplateParams.push_back(TVP); 132987b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer } break; 1330e8065128777e13322aa2b4de86a362326e0c7686David Blaikie // And the following should never occur: 13319dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::TemplateExpansion: 13329dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Null: 13339dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm_unreachable( 13349dfd24324c079b564dda936c6ae46898b82121e2David Blaikie "These argument types shouldn't exist in concrete types"); 13357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.getOrCreateArray(TemplateParams); 13387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectFunctionTemplateParams - A helper function to collect debug 13417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// info for function template parameters. 13427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIArray CGDebugInfo:: 13437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectFunctionTemplateParams(const FunctionDecl *FD, llvm::DIFile Unit) { 13447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FD->getTemplatedKind() == 13457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionDecl::TK_FunctionTemplateSpecialization) { 13467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateParameterList *TList = 13477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FD->getTemplateSpecializationInfo()->getTemplate() 13487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ->getTemplateParameters(); 134935178dc09d97bb2e0612813def09833866e3ad82David Blaikie return CollectTemplateParams( 135035178dc09d97bb2e0612813def09833866e3ad82David Blaikie TList, FD->getTemplateSpecializationArgs()->asArray(), Unit); 13517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIArray(); 13537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectCXXTemplateParams - A helper function to collect debug info for 13567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// template parameters. 13577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIArray CGDebugInfo:: 13587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectCXXTemplateParams(const ClassTemplateSpecializationDecl *TSpecial, 13597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 13606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Always get the full list of parameters, not just the ones from 13616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // the specialization. 13626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TemplateParameterList *TPList = 13636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TSpecial->getSpecializedTemplate()->getTemplateParameters(); 13646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const TemplateArgumentList &TAList = TSpecial->getTemplateArgs(); 136535178dc09d97bb2e0612813def09833866e3ad82David Blaikie return CollectTemplateParams(TPList, TAList.asArray(), Unit); 13667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateVTablePtrType - Return debug info descriptor for vtable. 13697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getOrCreateVTablePtrType(llvm::DIFile Unit) { 13707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VTablePtrType.isValid()) 13717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VTablePtrType; 13727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTContext &Context = CGM.getContext(); 13747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /* Function type */ 13767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *STy = getOrCreateType(Context.IntTy, Unit); 13777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray SElements = DBuilder.getOrCreateArray(STy); 13787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType SubTy = DBuilder.createSubroutineType(Unit, SElements); 13797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Size = Context.getTypeSize(Context.VoidPtrTy); 13807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType vtbl_ptr_type = DBuilder.createPointerType(SubTy, Size, 0, 13817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "__vtbl_ptr_type"); 13827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTablePtrType = DBuilder.createPointerType(vtbl_ptr_type, Size); 13837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VTablePtrType; 13847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getVTableName - Get vtable name for the given Class. 13877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getVTableName(const CXXRecordDecl *RD) { 13888495379bd6127dac2c39a6dd7840d95bb3a9aaa3Benjamin Kramer // Copy the gdb compatible name on the side and use its reference. 13898495379bd6127dac2c39a6dd7840d95bb3a9aaa3Benjamin Kramer return internString("_vptr$", RD->getNameAsString()); 13907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectVTableInfo - If the C++ class has vtable info then insert appropriate 13947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// debug info entry in EltTys vector. 13957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 13967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile Unit, 13977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &EltTys) { 13987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 13997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there is a primary base then it will hold vtable info. 14017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RL.getPrimaryBase()) 14027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 14037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this class is not dynamic then there is not any vtable info to collect. 14057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!RD->isDynamicClass()) 14067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 14077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 14097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType VPTR 14107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = DBuilder.createMemberType(Unit, getVTableName(RD), Unit, 1411f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher 0, Size, 0, 0, 1412f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher llvm::DIDescriptor::FlagArtificial, 14137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateVTablePtrType(Unit)); 14147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(VPTR); 14157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14176537f083555f9606c495d05c562878aa49bae987Eric Christopher/// getOrCreateRecordType - Emit record type's standalone debug info. 14186537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DIType CGDebugInfo::getOrCreateRecordType(QualType RTy, 14197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc) { 142013c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 14217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType T = getOrCreateType(RTy, getOrCreateFile(Loc)); 14227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 14237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateInterfaceType - Emit an objective c interface type standalone 14267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// debug info. 14277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getOrCreateInterfaceType(QualType D, 1428be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher SourceLocation Loc) { 142913c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 14307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType T = getOrCreateType(D, getOrCreateFile(Loc)); 1431ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl RetainedTypes.push_back(D.getAsOpaquePtr()); 14327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 14337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid CGDebugInfo::completeType(const EnumDecl *ED) { 14366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (DebugKind <= CodeGenOptions::DebugLineTablesOnly) 14376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return; 14386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines QualType Ty = CGM.getContext().getEnumType(ED); 14396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void* TyPtr = Ty.getAsOpaquePtr(); 14406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto I = TypeCache.find(TyPtr); 14416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (I == TypeCache.end() || 14426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines !llvm::DIType(cast<llvm::MDNode>(static_cast<llvm::Value *>(I->second))) 14436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines .isForwardDecl()) 14446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return; 14456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::DIType Res = CreateTypeDefinition(Ty->castAs<EnumType>()); 14466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(!Res.isForwardDecl()); 14476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TypeCache[TyPtr] = Res; 14486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 14496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1450278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikievoid CGDebugInfo::completeType(const RecordDecl *RD) { 1451278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie if (DebugKind > CodeGenOptions::LimitedDebugInfo || 1452278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie !CGM.getLangOpts().CPlusPlus) 1453278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie completeRequiredType(RD); 1454278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie} 1455278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie 1456278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikievoid CGDebugInfo::completeRequiredType(const RecordDecl *RD) { 1457651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (DebugKind <= CodeGenOptions::DebugLineTablesOnly) 1458651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return; 1459651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 14605434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie if (const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD)) 14615434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie if (CXXDecl->isDynamicClass()) 14625434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie return; 14635434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie 1464278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie QualType Ty = CGM.getContext().getRecordType(RD); 1465278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie llvm::DIType T = getTypeOrNull(Ty); 14665434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie if (T && T.isForwardDecl()) 14675434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie completeClassData(RD); 14685434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie} 14695434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie 14705434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikievoid CGDebugInfo::completeClassData(const RecordDecl *RD) { 14715434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie if (DebugKind <= CodeGenOptions::DebugLineTablesOnly) 147290e5523e4cd2230b86c6921b34affdcd35e0c4c0Michael Gottesman return; 14735434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie QualType Ty = CGM.getContext().getRecordType(RD); 1474278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie void* TyPtr = Ty.getAsOpaquePtr(); 14756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto I = TypeCache.find(TyPtr); 14766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (I != TypeCache.end() && 14776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines !llvm::DIType(cast<llvm::MDNode>(static_cast<llvm::Value *>(I->second))) 14786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines .isForwardDecl()) 1479278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie return; 1480278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie llvm::DIType Res = CreateTypeDefinition(Ty->castAs<RecordType>()); 1481278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie assert(!Res.isForwardDecl()); 1482278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie TypeCache[TyPtr] = Res; 1483278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie} 1484278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie 1485651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic bool hasExplicitMemberDefinition(CXXRecordDecl::method_iterator I, 1486651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CXXRecordDecl::method_iterator End) { 1487651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (; I != End; ++I) 1488651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (FunctionDecl *Tmpl = I->getInstantiatedFromMemberFunction()) 1489651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Tmpl->isImplicit() && Tmpl->isThisDeclarationADefinition() && 1490651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines !I->getMemberSpecializationInfo()->isExplicitSpecialization()) 1491651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 1492651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 1493651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1494651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1495651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic bool shouldOmitDefinition(CodeGenOptions::DebugInfoKind DebugKind, 1496651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const RecordDecl *RD, 1497651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const LangOptions &LangOpts) { 1498651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (DebugKind > CodeGenOptions::LimitedDebugInfo) 1499651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 1500651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1501651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!LangOpts.CPlusPlus) 1502651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 1503651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1504651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!RD->isCompleteDefinitionRequired()) 1505651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 1506651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1507651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD); 1508651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1509651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!CXXDecl) 1510651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 1511651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1512651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (CXXDecl->hasDefinition() && CXXDecl->isDynamicClass()) 1513651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 1514651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1515651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TemplateSpecializationKind Spec = TSK_Undeclared; 1516651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (const ClassTemplateSpecializationDecl *SD = 1517651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines dyn_cast<ClassTemplateSpecializationDecl>(RD)) 1518651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Spec = SD->getSpecializationKind(); 1519651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1520651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Spec == TSK_ExplicitInstantiationDeclaration && 1521651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines hasExplicitMemberDefinition(CXXDecl->method_begin(), 1522651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CXXDecl->method_end())) 1523651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 1524651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1525651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 1526651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1527651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 15287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateType - get structure or union type. 152929b8b68c93008317acca212970f2e2c37fa8e874David Blaikiellvm::DIType CGDebugInfo::CreateType(const RecordType *Ty) { 15307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordDecl *RD = Ty->getDecl(); 153174341d8fd49db382e83008ecea5c0d8ff9d8b6cbDavid Blaikie llvm::DICompositeType T(getTypeOrNull(QualType(Ty, 0))); 1532651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (T || shouldOmitDefinition(DebugKind, RD, CGM.getLangOpts())) { 153374341d8fd49db382e83008ecea5c0d8ff9d8b6cbDavid Blaikie if (!T) 1534651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines T = getOrCreateRecordFwdDecl( 1535651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Ty, getContextDescriptor(cast<Decl>(RD->getDeclContext()))); 153674341d8fd49db382e83008ecea5c0d8ff9d8b6cbDavid Blaikie return T; 15375f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie } 15387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1539278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie return CreateTypeDefinition(Ty); 1540278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie} 1541278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie 1542278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikiellvm::DIType CGDebugInfo::CreateTypeDefinition(const RecordType *Ty) { 1543278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie RecordDecl *RD = Ty->getDecl(); 1544278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie 15457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the record type for the debug info. 15467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); 15477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Records and classes and unions can all be recursive. To handle them, we 15497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // first generate a debug descriptor for the struct as a forward declaration. 15507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Then (if it is a definition) we go through and get debug info for all of 15517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // its members. Finally, we create a descriptor for the complete type (which 15527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // may refer to the forward decl if the struct is recursive) and replace all 15537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // uses of the forward declaration with the final definition. 15547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15554a0771680ee2fa8e76e1c0d54eaf69f459daf424David Blaikie llvm::DICompositeType FwdDecl(getOrCreateLimitedType(Ty, DefUnit)); 1556b6b0a711e4996a43e1932c20d0fd235bb711ad36Manman Ren assert(FwdDecl.isCompositeType() && 15579a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie "The debug type of a RecordType should be a llvm::DICompositeType"); 15587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FwdDecl.isForwardDecl()) 15607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return FwdDecl; 15617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1562498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie if (const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD)) 1563498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie CollectContainingType(CXXDecl, FwdDecl); 1564498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie 15657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Push the struct on region stack. 1566f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher LexicalBlockStack.push_back(&*FwdDecl); 15677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl); 15687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Convert all the elements. 15707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> EltTys; 15715434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie // what about nested types? 15727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Note: The split of CXXDecl information here is intentional, the 15747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // gdb tests will depend on a certain ordering at printout. The debug 15757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // information offsets are still correct if we merge them all together 15767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // though. 15777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD); 15787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXDecl) { 15797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectCXXBases(CXXDecl, DefUnit, EltTys, FwdDecl); 15807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectVTableInfo(CXXDecl, DefUnit, EltTys); 15817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15830395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Collect data fields (including static variables and any initializers). 15847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectRecordFields(RD, DefUnit, EltTys, FwdDecl); 1585d6b52974a74b1819f62a034a6a4939e8d00a04bdEric Christopher if (CXXDecl) 15867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectCXXMemberFunctions(CXXDecl, DefUnit, EltTys, FwdDecl); 15877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 15897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap.erase(Ty->getDecl()); 15907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys); 15928058833e12dd9cd38107f6dde3d5a17021ad3a5dDavid Blaikie FwdDecl.setTypeArray(Elements); 1593bd0152fb251e84c6f335c66322b83a9af09fed0cNico Weber 1594f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl); 1595f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher return FwdDecl; 15967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 15977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateType - get objective-c object type. 15997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ObjCObjectType *Ty, 16007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 16017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore protocols. 16027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(Ty->getBaseType(), Unit); 16037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 16047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16055ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 16065ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl/// \return true if Getter has the default name for the property PD. 16075ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantlstatic bool hasDefaultGetterName(const ObjCPropertyDecl *PD, 16085ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl const ObjCMethodDecl *Getter) { 16095ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl assert(PD); 16105ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl if (!Getter) 16115ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl return true; 16125ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 16135ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl assert(Getter->getDeclName().isObjCZeroArgSelector()); 16145ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl return PD->getName() == 16155ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl Getter->getDeclName().getObjCSelector().getNameForSlot(0); 16165ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl} 16175ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 16185ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl/// \return true if Setter has the default name for the property PD. 16195ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantlstatic bool hasDefaultSetterName(const ObjCPropertyDecl *PD, 16205ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl const ObjCMethodDecl *Setter) { 16215ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl assert(PD); 16225ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl if (!Setter) 16235ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl return true; 16245ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 16255ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl assert(Setter->getDeclName().isObjCOneArgSelector()); 162680e8ea92d6dcaa05165dcb4730485db82dcd4629Adrian Prantl return SelectorTable::constructSetterName(PD->getName()) == 16275ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl Setter->getDeclName().getObjCSelector().getNameForSlot(0); 16285ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl} 16295ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 16307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateType - get objective-c interface type. 16317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, 16327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 16337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *ID = Ty->getDecl(); 16347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ID) 16357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 16367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the record type for the debug info. 16387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(ID->getLocation()); 16397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(ID->getLocation()); 16406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::dwarf::SourceLanguage RuntimeLang = TheCU.getLanguage(); 16417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is just a forward declaration return a special forward-declaration 16437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // debug type since we won't be able to lay out the entire type. 16447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *Def = ID->getDefinition(); 16456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!Def || !Def->getImplementation()) { 16466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::DIType FwdDecl = DBuilder.createReplaceableForwardDecl( 16476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::dwarf::DW_TAG_structure_type, ID->getName(), TheCU, DefUnit, Line, 16486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines RuntimeLang); 16496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCInterfaceCache.push_back(ObjCInterfaceCacheEntry(Ty, FwdDecl, Unit)); 16507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return FwdDecl; 16517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 16546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return CreateTypeDefinition(Ty, Unit); 16556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 16566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 16576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesllvm::DIType CGDebugInfo::CreateTypeDefinition(const ObjCInterfaceType *Ty, llvm::DIFile Unit) { 16586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCInterfaceDecl *ID = Ty->getDecl(); 16596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::DIFile DefUnit = getOrCreateFile(ID->getLocation()); 16606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned Line = getLineNumber(ID->getLocation()); 16616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned RuntimeLang = TheCU.getLanguage(); 16627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 16647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 16657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 16667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 16687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID->getImplementation()) 16697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagObjcClassComplete; 16707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1671f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher llvm::DICompositeType RealDecl = 16727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createStructType(Unit, ID->getName(), DefUnit, 16737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Line, Size, Align, Flags, 1674c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie llvm::DIType(), llvm::DIArray(), RuntimeLang); 16757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines QualType QTy(Ty, 0); 16776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TypeCache[QTy.getAsOpaquePtr()] = RealDecl; 16787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1679d3003dc68535e94fe2501265d68a10aec429d7d0Eric Christopher // Push the struct on region stack. 1680f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher LexicalBlockStack.push_back(static_cast<llvm::MDNode*>(RealDecl)); 16817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[Ty->getDecl()] = llvm::WeakVH(RealDecl); 16827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Convert all the elements. 16847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> EltTys; 16857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *SClass = ID->getSuperClass(); 16877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SClass) { 16887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType SClassTy = 16897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(CGM.getContext().getObjCInterfaceType(SClass), Unit); 16907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!SClassTy.isValid()) 16917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 16926537f083555f9606c495d05c562878aa49bae987Eric Christopher 16937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType InhTag = 16947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createInheritance(RealDecl, SClassTy, 0, 0); 16957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(InhTag); 16967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1698d3003dc68535e94fe2501265d68a10aec429d7d0Eric Christopher // Create entries for all of the properties. 1699651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *PD : ID->properties()) { 17007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc = PD->getLocation(); 17017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile PUnit = getOrCreateFile(Loc); 17027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned PLine = getLineNumber(Loc); 17037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Getter = PD->getGetterMethodDecl(); 17047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Setter = PD->getSetterMethodDecl(); 17057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *PropertyNode = 17067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createObjCProperty(PD->getName(), 1707be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher PUnit, PLine, 17085ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl hasDefaultGetterName(PD, Getter) ? "" : 17097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getSelectorName(PD->getGetterName()), 17105ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl hasDefaultSetterName(PD, Setter) ? "" : 17117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getSelectorName(PD->getSetterName()), 17127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PD->getPropertyAttributes(), 1713be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher getOrCreateType(PD->getType(), PUnit)); 17147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(PropertyNode); 17157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &RL = CGM.getContext().getASTObjCInterfaceLayout(ID); 17187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldNo = 0; 17197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ObjCIvarDecl *Field = ID->all_declared_ivar_begin(); Field; 17207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Field = Field->getNextIvar(), ++FieldNo) { 17217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy = getOrCreateType(Field->getType(), Unit); 17227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FieldTy.isValid()) 17237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 17246537f083555f9606c495d05c562878aa49bae987Eric Christopher 17257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef FieldName = Field->getName(); 17267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore unnamed fields. 17287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FieldName.empty()) 17297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 17307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the location for the field. 17327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile FieldDefUnit = getOrCreateFile(Field->getLocation()); 17337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldLine = getLineNumber(Field->getLocation()); 17347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FType = Field->getType(); 17357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize = 0; 17367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign = 0; 17377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FType->isIncompleteArrayType()) { 17397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 17417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize = Field->isBitField() 1742d3003dc68535e94fe2501265d68a10aec429d7d0Eric Christopher ? Field->getBitWidthValue(CGM.getContext()) 1743d3003dc68535e94fe2501265d68a10aec429d7d0Eric Christopher : CGM.getContext().getTypeSize(FType); 17447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldAlign = CGM.getContext().getTypeAlign(FType); 17457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldOffset; 17487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CGM.getLangOpts().ObjCRuntime.isNonFragile()) { 17497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We don't know the runtime offset of an ivar if we're using the 17507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // non-fragile ABI. For bitfields, use the bit offset into the first 17517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // byte of storage of the bitfield. For other fields, use zero. 17527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Field->isBitField()) { 17537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = CGM.getObjCRuntime().ComputeBitfieldBitOffset( 17547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM, ID, Field); 17557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset %= CGM.getContext().getCharWidth(); 17567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 17577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 17587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 17607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = RL.getFieldOffset(FieldNo); 17617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 17647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Field->getAccessControl() == ObjCIvarDecl::Protected) 17657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags = llvm::DIDescriptor::FlagProtected; 17667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (Field->getAccessControl() == ObjCIvarDecl::Private) 17677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags = llvm::DIDescriptor::FlagPrivate; 17687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::MDNode *PropertyNode = nullptr; 17707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ObjCImplementationDecl *ImpD = ID->getImplementation()) { 17716537f083555f9606c495d05c562878aa49bae987Eric Christopher if (ObjCPropertyImplDecl *PImpD = 17727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ImpD->FindPropertyImplIvarDecl(Field->getIdentifier())) { 17737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ObjCPropertyDecl *PD = PImpD->getPropertyDecl()) { 1774be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher SourceLocation Loc = PD->getLocation(); 1775be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher llvm::DIFile PUnit = getOrCreateFile(Loc); 1776be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher unsigned PLine = getLineNumber(Loc); 17777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Getter = PD->getGetterMethodDecl(); 17787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Setter = PD->getSetterMethodDecl(); 17797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PropertyNode = 17807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createObjCProperty(PD->getName(), 17817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PUnit, PLine, 17825ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl hasDefaultGetterName(PD, Getter) ? "" : 17837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getSelectorName(PD->getGetterName()), 17845ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl hasDefaultSetterName(PD, Setter) ? "" : 17857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getSelectorName(PD->getSetterName()), 17867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PD->getPropertyAttributes(), 17877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(PD->getType(), PUnit)); 17887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldTy = DBuilder.createObjCIVar(FieldName, FieldDefUnit, 17927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldLine, FieldSize, FieldAlign, 17937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset, Flags, FieldTy, 17947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PropertyNode); 17957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(FieldTy); 17967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys); 1799f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher RealDecl.setTypeArray(Elements); 18004919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl 18017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 1802f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher return RealDecl; 18037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const VectorType *Ty, llvm::DIFile Unit) { 18067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType ElementTy = getOrCreateType(Ty->getElementType(), Unit); 18077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei int64_t Count = Ty->getNumElements(); 18087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Count == 0) 18097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If number of elements are not known then this is an unbounded array. 18107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use Count == -1 to express such arrays. 18117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Count = -1; 18127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *Subscript = DBuilder.getOrCreateSubrange(0, Count); 18147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray SubscriptArray = DBuilder.getOrCreateArray(Subscript); 18157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 18177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 18187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createVectorType(Size, Align, ElementTy, SubscriptArray); 18207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ArrayType *Ty, 18237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 18247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size; 18257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align; 18267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: make getTypeAlign() aware of VLAs and incomplete array types 18287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(Ty)) { 18297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = 0; 18307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = 18317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getContext().getTypeAlign(CGM.getContext().getBaseElementType(VAT)); 18327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Ty->isIncompleteArrayType()) { 18337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = 0; 18347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty->getElementType()->isIncompleteType()) 18357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = 0; 18367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 18377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = CGM.getContext().getTypeAlign(Ty->getElementType()); 1838089db2e3af0b6166a8e2253c453eccf551ddfbd8David Blaikie } else if (Ty->isIncompleteType()) { 18397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = 0; 18407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = 0; 18417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 18427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Size and align of the whole array, not the element type. 18437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = CGM.getContext().getTypeSize(Ty); 18447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = CGM.getContext().getTypeAlign(Ty); 18457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add the dimensions of the array. FIXME: This loses CV qualifiers from 18487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // interior arrays, do we care? Why aren't nested arrays represented the 18497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // obvious/recursive way? 18507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 8> Subscripts; 18517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType EltTy(Ty, 0); 18527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while ((Ty = dyn_cast<ArrayType>(EltTy))) { 18537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the number of elements is known, then count is that number. Otherwise, 18547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // it's -1. This allows us to represent a subrange with an array of 0 18557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // elements, like this: 18567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 18577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // struct foo { 18587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // int x[0]; 18597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // }; 18607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei int64_t Count = -1; // Count == -1 is an unbounded array. 18617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(Ty)) 18627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Count = CAT->getSize().getZExtValue(); 18636537f083555f9606c495d05c562878aa49bae987Eric Christopher 18647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Verify this is right for VLAs. 18657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Subscripts.push_back(DBuilder.getOrCreateSubrange(0, Count)); 18667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTy = Ty->getElementType(); 18677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray SubscriptArray = DBuilder.getOrCreateArray(Subscripts); 18707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18716537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIType DbgTy = 18727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createArrayType(Size, Align, getOrCreateType(EltTy, Unit), 18737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubscriptArray); 18747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 18757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18776537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DIType CGDebugInfo::CreateType(const LValueReferenceType *Ty, 18787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 18796537f083555f9606c495d05c562878aa49bae987Eric Christopher return CreatePointerLikeType(llvm::dwarf::DW_TAG_reference_type, 18807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty, Ty->getPointeeType(), Unit); 18817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18836537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DIType CGDebugInfo::CreateType(const RValueReferenceType *Ty, 18847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 18856537f083555f9606c495d05c562878aa49bae987Eric Christopher return CreatePointerLikeType(llvm::dwarf::DW_TAG_rvalue_reference_type, 18867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty, Ty->getPointeeType(), Unit); 18877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18896537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DIType CGDebugInfo::CreateType(const MemberPointerType *Ty, 18907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile U) { 1891e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie llvm::DIType ClassType = getOrCreateType(QualType(Ty->getClass(), 0), U); 1892e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie if (!Ty->getPointeeType()->isFunctionType()) 1893e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie return DBuilder.createMemberPointerType( 189429b8b68c93008317acca212970f2e2c37fa8e874David Blaikie getOrCreateType(Ty->getPointeeType(), U), ClassType); 1895651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1896651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const FunctionProtoType *FPT = 1897651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Ty->getPointeeType()->getAs<FunctionProtoType>(); 1898e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie return DBuilder.createMemberPointerType(getOrCreateInstanceMethodType( 1899651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CGM.getContext().getPointerType(QualType(Ty->getClass(), 1900651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FPT->getTypeQuals())), 1901651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FPT, U), ClassType); 19027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 19037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19046537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DIType CGDebugInfo::CreateType(const AtomicType *Ty, 19057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile U) { 19067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore the atomic wrapping 19077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: What is the correct representation? 19087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(Ty->getValueType(), U); 19097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 19107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateEnumType - get enumeration type. 19120a0be741f21e75556f649e7e4fcd30e905fc6e2eManman Renllvm::DIType CGDebugInfo::CreateEnumType(const EnumType *Ty) { 1913f332733e141905ccefe43e7fe65f9a8a4263a2f6Manman Ren const EnumDecl *ED = Ty->getDecl(); 19147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = 0; 19157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = 0; 19167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ED->getTypeForDecl()->isIncompleteType()) { 19177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = CGM.getContext().getTypeSize(ED->getTypeForDecl()); 19187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = CGM.getContext().getTypeAlign(ED->getTypeForDecl()); 19197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 192183369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren SmallString<256> FullName = getUniqueTagTypeName(Ty, CGM, TheCU); 192283369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren 19237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is just a forward declaration, construct an appropriately 19247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // marked node and just return it. 19257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ED->getDefinition()) { 19267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor EDContext; 19277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EDContext = getContextDescriptor(cast<Decl>(ED->getDeclContext())); 19287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(ED->getLocation()); 19297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(ED->getLocation()); 19307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef EDName = ED->getName(); 19316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::DIType RetTy = DBuilder.createReplaceableForwardDecl( 19326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::dwarf::DW_TAG_enumeration_type, EDName, EDContext, DefUnit, Line, 19336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 0, Size, Align, FullName); 19346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ReplaceMap.push_back(std::make_pair(Ty, static_cast<llvm::Value *>(RetTy))); 19356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return RetTy; 19366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 19376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 19386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return CreateTypeDefinition(Ty); 19396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 19406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 19416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesllvm::DIType CGDebugInfo::CreateTypeDefinition(const EnumType *Ty) { 19426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const EnumDecl *ED = Ty->getDecl(); 19436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines uint64_t Size = 0; 19446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines uint64_t Align = 0; 19456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!ED->getTypeForDecl()->isIncompleteType()) { 19466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Size = CGM.getContext().getTypeSize(ED->getTypeForDecl()); 19476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Align = CGM.getContext().getTypeAlign(ED->getTypeForDecl()); 19487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SmallString<256> FullName = getUniqueTagTypeName(Ty, CGM, TheCU); 19516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 19527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create DIEnumerator elements for each enumerator. 19537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> Enumerators; 19547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ED = ED->getDefinition(); 1955651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *Enum : ED->enumerators()) { 19567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Enumerators.push_back( 19577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createEnumerator(Enum->getName(), 1958ac8f43c9cb71880ed3fa7f56a2a2429eafbd4625David Blaikie Enum->getInitVal().getSExtValue())); 19597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Return a CompositeType for the enum itself. 19627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray EltArray = DBuilder.getOrCreateArray(Enumerators); 19637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(ED->getLocation()); 19657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(ED->getLocation()); 19666537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIDescriptor EnumContext = 19677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(cast<Decl>(ED->getDeclContext())); 196859d6a71d681adfdc7d976492eeb3deae84e8f2e2Adrian Prantl llvm::DIType ClassTy = ED->isFixed() ? 19697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(ED->getIntegerType(), DefUnit) : llvm::DIType(); 19706537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIType DbgTy = 19717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createEnumerationType(EnumContext, ED->getName(), DefUnit, Line, 19727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size, Align, EltArray, 197383369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren ClassTy, FullName); 19747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 19757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 19767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19774b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikiestatic QualType UnwrapTypeForDebugInfo(QualType T, const ASTContext &C) { 19784b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Qualifiers Quals; 19797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei do { 198035969ea5c5a117c1131edee1866e47e2a33f07bbAdrian Prantl Qualifiers InnerQuals = T.getLocalQualifiers(); 198135969ea5c5a117c1131edee1866e47e2a33f07bbAdrian Prantl // Qualifiers::operator+() doesn't like it if you add a Qualifier 198235969ea5c5a117c1131edee1866e47e2a33f07bbAdrian Prantl // that is already there. 198335969ea5c5a117c1131edee1866e47e2a33f07bbAdrian Prantl Quals += Qualifiers::removeCommonQualifiers(Quals, InnerQuals); 198435969ea5c5a117c1131edee1866e47e2a33f07bbAdrian Prantl Quals += InnerQuals; 19857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType LastT = T; 19867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (T->getTypeClass()) { 19877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 19884b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie return C.getQualifiedType(T.getTypePtr(), Quals); 19896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case Type::TemplateSpecialization: { 19906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const auto *Spec = cast<TemplateSpecializationType>(T); 19916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Spec->isTypeAlias()) 19926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return C.getQualifiedType(T.getTypePtr(), Quals); 19936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T = Spec->desugar(); 19946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines break; } 19957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOfExpr: 19967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType(); 19977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 19987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOf: 19997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<TypeOfType>(T)->getUnderlyingType(); 20007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 20017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Decltype: 20027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<DecltypeType>(T)->getUnderlyingType(); 20037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 20047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::UnaryTransform: 20057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<UnaryTransformType>(T)->getUnderlyingType(); 20067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 20077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Attributed: 20087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<AttributedType>(T)->getEquivalentType(); 20097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 20107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Elaborated: 20117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<ElaboratedType>(T)->getNamedType(); 20127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 20137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Paren: 20147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<ParenType>(T)->getInnerType(); 20157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 20164b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie case Type::SubstTemplateTypeParm: 20177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<SubstTemplateTypeParmType>(T)->getReplacementType(); 20187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 20197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Auto: 2020912964863c344dd84976ee281bd213d0485645baDavid Blaikie QualType DT = cast<AutoType>(T)->getDeducedType(); 2021912964863c344dd84976ee281bd213d0485645baDavid Blaikie if (DT.isNull()) 2022912964863c344dd84976ee281bd213d0485645baDavid Blaikie return T; 2023912964863c344dd84976ee281bd213d0485645baDavid Blaikie T = DT; 20247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 20257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 20266537f083555f9606c495d05c562878aa49bae987Eric Christopher 20277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(T != LastT && "Type unwrapping failed to unwrap!"); 2028d24c9ab90b42370bb417f44e001a0347ee1ca87eNAKAMURA Takumi (void)LastT; 20297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } while (true); 20307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2032f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher/// getType - Get the type from the cache or return null type if it doesn't 2033f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher/// exist. 20347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getTypeOrNull(QualType Ty) { 20357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Unwrap the type as needed for debug information. 20374b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext()); 20386537f083555f9606c495d05c562878aa49bae987Eric Christopher 20396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto it = TypeCache.find(Ty.getAsOpaquePtr()); 20407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (it != TypeCache.end()) { 20417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Verify that the debug info still exists. 20427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::Value *V = it->second) 20437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(cast<llvm::MDNode>(V)); 20447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 20457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 20477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2049651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid CGDebugInfo::completeTemplateDefinition( 2050651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const ClassTemplateSpecializationDecl &SD) { 2051651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (DebugKind <= CodeGenOptions::DebugLineTablesOnly) 2052651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return; 2053651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2054651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines completeClassData(&SD); 2055651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // In case this type has no member function definitions being emitted, ensure 2056651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // it is retained 2057651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines RetainedTypes.push_back(CGM.getContext().getRecordType(&SD).getAsOpaquePtr()); 2058651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 2059651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 20607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateType - Get the type from the cache or create a new 20617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// one if necessary. 206229b8b68c93008317acca212970f2e2c37fa8e874David Blaikiellvm::DIType CGDebugInfo::getOrCreateType(QualType Ty, llvm::DIFile Unit) { 20637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty.isNull()) 20647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 20657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Unwrap the type as needed for debug information. 20674b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext()); 20687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (llvm::DIType T = getTypeOrNull(Ty)) 20707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 20717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise create the type. 207329b8b68c93008317acca212970f2e2c37fa8e874David Blaikie llvm::DIType Res = CreateTypeNode(Ty, Unit); 2074ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl void* TyPtr = Ty.getAsOpaquePtr(); 2075ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 2076ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // And update the type cache. 2077ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl TypeCache[TyPtr] = Res; 20787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Res; 20807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2082b5a50075d810002c718711675aae067f92b80670Adrian Prantl/// Currently the checksum of an interface includes the number of 2083b5a50075d810002c718711675aae067f92b80670Adrian Prantl/// ivars and property accessors. 208456b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopherunsigned CGDebugInfo::Checksum(const ObjCInterfaceDecl *ID) { 20854f97f853357e2769db3d7999424e346ac5adb297Adrian Prantl // The assumption is that the number of ivars can only increase 20864f97f853357e2769db3d7999424e346ac5adb297Adrian Prantl // monotonically, so it is safe to just use their current number as 20874f97f853357e2769db3d7999424e346ac5adb297Adrian Prantl // a checksum. 2088b5a50075d810002c718711675aae067f92b80670Adrian Prantl unsigned Sum = 0; 2089b5a50075d810002c718711675aae067f92b80670Adrian Prantl for (const ObjCIvarDecl *Ivar = ID->all_declared_ivar_begin(); 20906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Ivar != nullptr; Ivar = Ivar->getNextIvar()) 2091b5a50075d810002c718711675aae067f92b80670Adrian Prantl ++Sum; 2092b5a50075d810002c718711675aae067f92b80670Adrian Prantl 2093b5a50075d810002c718711675aae067f92b80670Adrian Prantl return Sum; 20944919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl} 20954919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl 20964919de6a53a007487c6d6b173921b5e7152a2004Adrian PrantlObjCInterfaceDecl *CGDebugInfo::getObjCInterfaceDecl(QualType Ty) { 20974919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl switch (Ty->getTypeClass()) { 20984919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl case Type::ObjCObjectPointer: 2099f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher return getObjCInterfaceDecl(cast<ObjCObjectPointerType>(Ty) 2100f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher ->getPointeeType()); 21014919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl case Type::ObjCInterface: 21024919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl return cast<ObjCInterfaceType>(Ty)->getDecl(); 21034919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl default: 21046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 21054919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl } 21064919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl} 21074919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl 21087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateTypeNode - Create a new debug type node. 210929b8b68c93008317acca212970f2e2c37fa8e874David Blaikiellvm::DIType CGDebugInfo::CreateTypeNode(QualType Ty, llvm::DIFile Unit) { 21107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Handle qualifiers, which recursively handles what they refer to. 21117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty.hasLocalQualifiers()) 211229b8b68c93008317acca212970f2e2c37fa8e874David Blaikie return CreateQualifiedType(Ty, Unit); 21137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const char *Diag = nullptr; 21156537f083555f9606c495d05c562878aa49bae987Eric Christopher 21167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Work out details of type. 21177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Ty->getTypeClass()) { 21187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define TYPE(Class, Base) 21197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define ABSTRACT_TYPE(Class, Base) 21207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define NON_CANONICAL_TYPE(Class, Base) 21217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define DEPENDENT_TYPE(Class, Base) case Type::Class: 21227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/TypeNodes.def" 21237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Dependent types cannot show up in debug information"); 21247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ExtVector: 21267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Vector: 21277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<VectorType>(Ty), Unit); 21287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCObjectPointer: 21297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ObjCObjectPointerType>(Ty), Unit); 21307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCObject: 21317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ObjCObjectType>(Ty), Unit); 21327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCInterface: 21337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ObjCInterfaceType>(Ty), Unit); 21347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Builtin: 21357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<BuiltinType>(Ty)); 21367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Complex: 21377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ComplexType>(Ty)); 21387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Pointer: 21397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<PointerType>(Ty), Unit); 2140651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case Type::Adjusted: 214112df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner case Type::Decayed: 2142651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Decayed and adjusted types use the adjusted type in LLVM and DWARF. 214312df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner return CreateType( 2144651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines cast<PointerType>(cast<AdjustedType>(Ty)->getAdjustedType()), Unit); 21457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::BlockPointer: 21467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<BlockPointerType>(Ty), Unit); 21477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Typedef: 214829b8b68c93008317acca212970f2e2c37fa8e874David Blaikie return CreateType(cast<TypedefType>(Ty), Unit); 21497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Record: 215029b8b68c93008317acca212970f2e2c37fa8e874David Blaikie return CreateType(cast<RecordType>(Ty)); 21517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Enum: 2152f332733e141905ccefe43e7fe65f9a8a4263a2f6Manman Ren return CreateEnumType(cast<EnumType>(Ty)); 21537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::FunctionProto: 21547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::FunctionNoProto: 21557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<FunctionType>(Ty), Unit); 21567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ConstantArray: 21577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::VariableArray: 21587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::IncompleteArray: 21597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ArrayType>(Ty), Unit); 21607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::LValueReference: 21627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<LValueReferenceType>(Ty), Unit); 21637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::RValueReference: 21647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<RValueReferenceType>(Ty), Unit); 21657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::MemberPointer: 21677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<MemberPointerType>(Ty), Unit); 21687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Atomic: 21707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<AtomicType>(Ty), Unit); 21717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TemplateSpecialization: 21736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return CreateType(cast<TemplateSpecializationType>(Ty), Unit); 21746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 21756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case Type::Attributed: 21767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Elaborated: 21777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Paren: 21787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::SubstTemplateTypeParm: 21797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOfExpr: 21807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOf: 21817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Decltype: 21827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::UnaryTransform: 2183226399ce18cdcbb1e83af7c5e644bdabb9d4f2f8David Blaikie case Type::PackExpansion: 21847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("type should have been unwrapped!"); 2185912964863c344dd84976ee281bd213d0485645baDavid Blaikie case Type::Auto: 2186912964863c344dd84976ee281bd213d0485645baDavid Blaikie Diag = "auto"; 2187912964863c344dd84976ee281bd213d0485645baDavid Blaikie break; 21887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 21896537f083555f9606c495d05c562878aa49bae987Eric Christopher 21907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Diag && "Fall through without a diagnostic?"); 21917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DiagID = CGM.getDiags().getCustomDiagID(DiagnosticsEngine::Error, 21927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "debug information for %0 is not yet supported"); 21937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getDiags().Report(DiagID) 21947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << Diag; 21957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 21967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateLimitedType - Get the type from the cache or create a new 21997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// limited type if necessary. 22004a0771680ee2fa8e76e1c0d54eaf69f459daf424David Blaikiellvm::DIType CGDebugInfo::getOrCreateLimitedType(const RecordType *Ty, 2201be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher llvm::DIFile Unit) { 22024a0771680ee2fa8e76e1c0d54eaf69f459daf424David Blaikie QualType QTy(Ty, 0); 22037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2204eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie llvm::DICompositeType T(getTypeOrNull(QTy)); 22057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We may have cached a forward decl when we could have created 22077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // a non-forward decl. Go ahead and create a non-forward decl 22087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // now. 2209b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (T && !T.isForwardDecl()) return T; 22107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise create the type. 2212eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie llvm::DICompositeType Res = CreateLimitedType(Ty); 2213eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie 2214eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie // Propagate members from the declaration to the definition 2215eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie // CreateType(const RecordType*) will overwrite this with the members in the 2216eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie // correct order if the full type is needed. 2217eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie Res.setTypeArray(T.getTypeArray()); 22187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // And update the type cache. 22204a0771680ee2fa8e76e1c0d54eaf69f459daf424David Blaikie TypeCache[QTy.getAsOpaquePtr()] = Res; 22217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Res; 22227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 22237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// TODO: Currently used for context chains when limiting debug info. 2225eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikiellvm::DICompositeType CGDebugInfo::CreateLimitedType(const RecordType *Ty) { 22267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordDecl *RD = Ty->getDecl(); 22276537f083555f9606c495d05c562878aa49bae987Eric Christopher 22287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the record type for the debug info. 22297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); 22307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(RD->getLocation()); 22317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef RDName = getClassName(RD); 22327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 223389fecb519558eed4cf9e8375af62c10367ed18baEric Christopher llvm::DIDescriptor RDContext = 223489fecb519558eed4cf9e8375af62c10367ed18baEric Christopher getContextDescriptor(cast<Decl>(RD->getDeclContext())); 22357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2236c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie // If we ended up creating the type during the context chain construction, 2237c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie // just return that. 2238eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie llvm::DICompositeType T(getTypeOrNull(CGM.getContext().getRecordType(RD))); 2239eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie if (T && (!T.isForwardDecl() || !RD->getDefinition())) 2240c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie return T; 2241c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie 2242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If this is just a forward or incomplete declaration, construct an 2243651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // appropriately marked node and just return it. 2244651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const RecordDecl *D = RD->getDefinition(); 2245651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!D || !D->isCompleteDefinition()) 2246f332733e141905ccefe43e7fe65f9a8a4263a2f6Manman Ren return getOrCreateRecordFwdDecl(Ty, RDContext); 22477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 22497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 22502fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie llvm::DICompositeType RealDecl; 22516537f083555f9606c495d05c562878aa49bae987Eric Christopher 225283369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren SmallString<256> FullName = getUniqueTagTypeName(Ty, CGM, TheCU); 225383369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren 22547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RD->isUnion()) 22557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RealDecl = DBuilder.createUnionType(RDContext, RDName, DefUnit, Line, 225683369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren Size, Align, 0, llvm::DIArray(), 0, 225783369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren FullName); 22587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (RD->isClass()) { 22597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: This could be a struct type giving a default visibility different 22607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // than C++ class type, but needs llvm metadata changes first. 22617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RealDecl = DBuilder.createClassType(RDContext, RDName, DefUnit, Line, 2262be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher Size, Align, 0, 0, llvm::DIType(), 2263be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher llvm::DIArray(), llvm::DIType(), 226483369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren llvm::DIArray(), FullName); 22657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else 22667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RealDecl = DBuilder.createStructType(RDContext, RDName, DefUnit, Line, 2267f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher Size, Align, 0, llvm::DIType(), 226896b7bd42f8ffc47a28491d366d60d6d7ca7dccc8David Blaikie llvm::DIArray(), 0, llvm::DIType(), 226996b7bd42f8ffc47a28491d366d60d6d7ca7dccc8David Blaikie FullName); 22707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[Ty->getDecl()] = llvm::WeakVH(RealDecl); 22722fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = RealDecl; 22737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2274498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie if (const ClassTemplateSpecializationDecl *TSpecial = 2275498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie dyn_cast<ClassTemplateSpecializationDecl>(RD)) 2276498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie RealDecl.setTypeArray(llvm::DIArray(), 2277498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie CollectCXXTemplateParams(TSpecial, DefUnit)); 2278fab829d611ed0ef6c93bd2ab1a28c10501beafcbDavid Blaikie return RealDecl; 22797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 22807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2281498298d9d7b20fd67e270711b1a815dc6962d883David Blaikievoid CGDebugInfo::CollectContainingType(const CXXRecordDecl *RD, 2282498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie llvm::DICompositeType RealDecl) { 2283498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie // A class's primary base or the class itself contains the vtable. 2284498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie llvm::DICompositeType ContainingType; 2285498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 2286498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie if (const CXXRecordDecl *PBase = RL.getPrimaryBase()) { 2287651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Seek non-virtual primary base root. 2288498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie while (1) { 2289498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie const ASTRecordLayout &BRL = CGM.getContext().getASTRecordLayout(PBase); 2290498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie const CXXRecordDecl *PBT = BRL.getPrimaryBase(); 2291498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie if (PBT && !BRL.isPrimaryBaseVirtual()) 2292498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie PBase = PBT; 2293498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie else 2294498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie break; 2295498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie } 2296498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie ContainingType = llvm::DICompositeType( 2297498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie getOrCreateType(QualType(PBase->getTypeForDecl(), 0), 2298498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie getOrCreateFile(RD->getLocation()))); 2299498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie } else if (RD->isDynamicClass()) 2300498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie ContainingType = RealDecl; 2301498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie 2302498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie RealDecl.setContainingType(ContainingType); 2303498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie} 2304498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie 23057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateMemberType - Create new member and increase Offset by FType's size. 23067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateMemberType(llvm::DIFile Unit, QualType FType, 23077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name, 23087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t *Offset) { 23097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy = CGDebugInfo::getOrCreateType(FType, Unit); 23107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize = CGM.getContext().getTypeSize(FType); 23117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign = CGM.getContext().getTypeAlign(FType); 23127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty = DBuilder.createMemberType(Unit, Name, Unit, 0, 23137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize, FieldAlign, 23147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *Offset, 0, FieldTy); 23157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *Offset += FieldSize; 23167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Ty; 23177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 23187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2319651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesllvm::DIScope CGDebugInfo::getDeclarationOrDefinition(const Decl *D) { 23209faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // We only need a declaration (not a definition) of the type - so use whatever 23219faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // we would otherwise do to get a type for a pointee. (forward declarations in 23229faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // limited debug info, full definitions (if the type definition is available) 23239faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // in unlimited debug info) 2324b3c2377422e820ab9d95145ab67a2fb9f9f4bf3fDavid Blaikie if (const TypeDecl *TD = dyn_cast<TypeDecl>(D)) 2325b3c2377422e820ab9d95145ab67a2fb9f9f4bf3fDavid Blaikie return getOrCreateType(CGM.getContext().getTypeDeclType(TD), 232629b8b68c93008317acca212970f2e2c37fa8e874David Blaikie getOrCreateFile(TD->getLocation())); 23279faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // Otherwise fall back to a fairly rudimentary cache of existing declarations. 23289faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // This doesn't handle providing declarations (for functions or variables) for 23299faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // entities without definitions in this TU, nor when the definition proceeds 23309faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // the call to this function. 23319faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // FIXME: This should be split out into more specific maps with support for 23329faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // emitting forward declarations and merging definitions with declarations, 23339faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // the same way as we do for types. 23349faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator I = 23359faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie DeclCache.find(D->getCanonicalDecl()); 23369faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (I == DeclCache.end()) 2337651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return llvm::DIScope(); 23389faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie llvm::Value *V = I->second; 2339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return llvm::DIScope(dyn_cast_or_null<llvm::MDNode>(V)); 23409faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie} 23419faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie 23427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getFunctionDeclaration - Return debug info descriptor to describe method 23437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// declaration for the given method definition. 23447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DISubprogram CGDebugInfo::getFunctionDeclaration(const Decl *D) { 2345ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (!D || DebugKind <= CodeGenOptions::DebugLineTablesOnly) 234623e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie return llvm::DISubprogram(); 234723e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie 23487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FunctionDecl *FD = dyn_cast<FunctionDecl>(D); 23497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FD) return llvm::DISubprogram(); 23507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Setup context. 2352d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie llvm::DIScope S = getContextDescriptor(cast<Decl>(D->getDeclContext())); 23537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator 23557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MI = SPCache.find(FD->getCanonicalDecl()); 2356d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie if (MI == SPCache.end()) { 2357ac7c25f0cab42a34d6e6acba7afff729caf0258eEric Christopher if (const CXXMethodDecl *MD = 2358ac7c25f0cab42a34d6e6acba7afff729caf0258eEric Christopher dyn_cast<CXXMethodDecl>(FD->getCanonicalDecl())) { 2359d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie llvm::DICompositeType T(S); 2360ac7c25f0cab42a34d6e6acba7afff729caf0258eEric Christopher llvm::DISubprogram SP = 2361ac7c25f0cab42a34d6e6acba7afff729caf0258eEric Christopher CreateCXXMemberFunction(MD, getOrCreateFile(MD->getLocation()), T); 2362d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie return SP; 2363d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie } 2364d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie } 23657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MI != SPCache.end()) { 23667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = MI->second; 23677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DISubprogram SP(dyn_cast_or_null<llvm::MDNode>(V)); 236823e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie if (SP.isSubprogram() && !SP.isDefinition()) 23697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SP; 23707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2372651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto NextFD : FD->redecls()) { 23737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator 23747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MI = SPCache.find(NextFD->getCanonicalDecl()); 23757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MI != SPCache.end()) { 23767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = MI->second; 23777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DISubprogram SP(dyn_cast_or_null<llvm::MDNode>(V)); 237823e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie if (SP.isSubprogram() && !SP.isDefinition()) 23797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SP; 23807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DISubprogram(); 23837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 23847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// getOrCreateFunctionType - Construct DIType. If it is a c++ method, include 23867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// implicit parameter "this". 23879a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikiellvm::DICompositeType CGDebugInfo::getOrCreateFunctionType(const Decl *D, 23889a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie QualType FnType, 23899a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie llvm::DIFile F) { 2390ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (!D || DebugKind <= CodeGenOptions::DebugLineTablesOnly) 239123e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie // Create fake but valid subroutine type. Otherwise 239223e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie // llvm::DISubprogram::Verify() would return false, and 239323e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie // subprogram DIE will miss DW_AT_decl_file and 239423e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie // DW_AT_decl_line fields. 239523e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie return DBuilder.createSubroutineType(F, DBuilder.getOrCreateArray(None)); 23967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) 23987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateMethodType(Method, F); 23997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const ObjCMethodDecl *OMethod = dyn_cast<ObjCMethodDecl>(D)) { 24007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add "self" and "_cmd" 24017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> Elts; 24027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // First element is always return type. For 'void' functions it is NULL. 2404651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType ResultTy = OMethod->getReturnType(); 24050cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl 24060cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl // Replace the instancetype keyword with the actual type. 24070cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl if (ResultTy == CGM.getContext().getObjCInstanceType()) 24080cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl ResultTy = CGM.getContext().getPointerType( 24090cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl QualType(OMethod->getClassInterface()->getTypeForDecl(), 0)); 24100cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl 2411566a9c3680d9960bb0eb6acf33507251cc13a8d8Adrian Prantl Elts.push_back(getOrCreateType(ResultTy, F)); 24127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // "self" pointer is always first argument. 2413e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl QualType SelfDeclTy = OMethod->getSelfDecl()->getType(); 2414e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl llvm::DIType SelfTy = getOrCreateType(SelfDeclTy, F); 2415e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl Elts.push_back(CreateSelfType(SelfDeclTy, SelfTy)); 24167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // "_cmd" pointer is always second argument. 24177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType CmdTy = getOrCreateType(OMethod->getCmdDecl()->getType(), F); 24187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elts.push_back(DBuilder.createArtificialType(CmdTy)); 24197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get rest of the arguments. 2420651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *PI : OMethod->params()) 2421651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Elts.push_back(getOrCreateType(PI->getType(), F)); 24227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(Elts); 24247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createSubroutineType(F, EltTypeArray); 24257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2426651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2427651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Handle variadic function types; they need an additional 2428651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // unspecified parameter. 2429651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) 2430651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (FD->isVariadic()) { 2431651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SmallVector<llvm::Value *, 16> EltTys; 2432651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EltTys.push_back(getOrCreateType(FD->getReturnType(), F)); 2433651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FnType)) 2434651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (unsigned i = 0, e = FPT->getNumParams(); i != e; ++i) 2435651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EltTys.push_back(getOrCreateType(FPT->getParamType(i), F)); 2436651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EltTys.push_back(DBuilder.createUnspecifiedParameter()); 2437651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(EltTys); 2438651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return DBuilder.createSubroutineType(F, EltTypeArray); 2439651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 2440651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 24419a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie return llvm::DICompositeType(getOrCreateType(FnType, F)); 24427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitFunctionStart - Constructs the debug code for entering a function. 24456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid CGDebugInfo::EmitFunctionStart(GlobalDecl GD, 24466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation Loc, 24476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation ScopeLoc, 24486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines QualType FnType, 24497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Function *Fn, 24507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 24517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name; 24537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef LinkageName; 24547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FnBeginRegionCount.push_back(LexicalBlockStack.size()); 24567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Decl *D = GD.getDecl(); 24586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool HasDecl = (D != nullptr); 2459651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 24607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 24617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(Loc); 24627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor FDContext(Unit); 24637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray TParamsArray; 24647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!HasDecl) { 24657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use llvm function name. 2466c7971a9efdf9880448a69aabb5182c3c27eecf6dDavid Blaikie LinkageName = Fn->getName(); 24677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 24687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there is a DISubprogram for this function available then use it. 24697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator 24707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FI = SPCache.find(FD->getCanonicalDecl()); 24717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FI != SPCache.end()) { 24727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = FI->second; 24737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor SP(dyn_cast_or_null<llvm::MDNode>(V)); 24747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SP.isSubprogram() && llvm::DISubprogram(SP).isDefinition()) { 24757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *SPN = SP; 24767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(SPN); 24777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[D] = llvm::WeakVH(SP); 24787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 24797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = getFunctionName(FD); 2482f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky // Use mangled name as linkage name for C/C++ functions. 24837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FD->hasPrototype()) { 24847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LinkageName = CGM.getMangledName(GD); 24857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrototyped; 24867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2487f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky // No need to replicate the linkage name if it isn't different from the 2488f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky // subprogram name, no need to have it at all unless coverage is enabled or 2489f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky // debug is set to more than just line tables. 24907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LinkageName == Name || 2491f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky (!CGM.getCodeGenOpts().EmitGcovArcs && 2492f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky !CGM.getCodeGenOpts().EmitGcovNotes && 249313c976710415041fca5aba25cc02d3813c74b990Eric Christopher DebugKind <= CodeGenOptions::DebugLineTablesOnly)) 24947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LinkageName = StringRef(); 24957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 249613c976710415041fca5aba25cc02d3813c74b990Eric Christopher if (DebugKind >= CodeGenOptions::LimitedDebugInfo) { 24977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const NamespaceDecl *NSDecl = 24982e3fd942b6ba3539f53512a005270f97e09f1824Eric Christopher dyn_cast_or_null<NamespaceDecl>(FD->getDeclContext())) 24997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FDContext = getOrCreateNameSpace(NSDecl); 25007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (const RecordDecl *RDecl = 25012e3fd942b6ba3539f53512a005270f97e09f1824Eric Christopher dyn_cast_or_null<RecordDecl>(FD->getDeclContext())) 25022e3fd942b6ba3539f53512a005270f97e09f1824Eric Christopher FDContext = getContextDescriptor(cast<Decl>(RDecl)); 25037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Collect template parameters. 25057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TParamsArray = CollectFunctionTemplateParams(FD, Unit); 25067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D)) { 25087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = getObjCMethodName(OMD); 25097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrototyped; 25107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 25117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use llvm function name. 25127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = Fn->getName(); 25137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrototyped; 25147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Name.empty() && Name[0] == '\01') 25167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = Name.substr(1); 25177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!HasDecl || D->isImplicit()) { 25197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagArtificial; 25206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Artificial functions without a location should not silently reuse CurLoc. 25216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Loc.isInvalid()) 25226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CurLoc = SourceLocation(); 25236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 25246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned LineNo = getLineNumber(Loc); 25256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned ScopeLine = getLineNumber(ScopeLoc); 25267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2527651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: The function declaration we're constructing here is mostly reusing 2528651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // declarations from CXXMethodDecl and not constructing new ones for arbitrary 2529651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FunctionDecls. When/if we fix this we can have FDContext be TheCU/null for 2530651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // all subprograms instead of the actual context since subprogram definitions 2531651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // are emitted as CU level entities by the backend. 25322e3fd942b6ba3539f53512a005270f97e09f1824Eric Christopher llvm::DISubprogram SP = 25332e3fd942b6ba3539f53512a005270f97e09f1824Eric Christopher DBuilder.createFunction(FDContext, Name, LinkageName, Unit, LineNo, 25342e3fd942b6ba3539f53512a005270f97e09f1824Eric Christopher getOrCreateFunctionType(D, FnType, Unit), 25352e3fd942b6ba3539f53512a005270f97e09f1824Eric Christopher Fn->hasInternalLinkage(), true /*definition*/, 25366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ScopeLine, Flags, 25372e3fd942b6ba3539f53512a005270f97e09f1824Eric Christopher CGM.getLangOpts().Optimize, Fn, TParamsArray, 25382e3fd942b6ba3539f53512a005270f97e09f1824Eric Christopher getFunctionDeclaration(D)); 25399faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (HasDecl) 25409faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie DeclCache.insert(std::make_pair(D->getCanonicalDecl(), llvm::WeakVH(SP))); 25417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2542651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Push the function onto the lexical block stack. 25437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *SPN = SP; 25447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(SPN); 2545651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 25467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (HasDecl) 25477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[D] = llvm::WeakVH(SP); 25487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 25497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitLocation - Emit metadata to indicate a change in line/column 255118a0cd5ef787db1b6849b962f67a5a8ed3c49be3Adrian Prantl/// information in the source file. If the location is invalid, the 255218a0cd5ef787db1b6849b962f67a5a8ed3c49be3Adrian Prantl/// previous location will be reused. 255300df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantlvoid CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc, 255400df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl bool ForceColumnInfo) { 25557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Update our current location 25567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei setLocation(Loc); 25577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CurLoc.isInvalid() || CurLoc.isMacroID()) return; 25597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Don't bother if things are the same as last time. 25617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 25627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CurLoc == PrevLoc || 25637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SM.getExpansionLoc(CurLoc) == SM.getExpansionLoc(PrevLoc)) 25647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // New Builder may not be in sync with CGDebugInfo. 25650a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikie if (!Builder.getCurrentDebugLocation().isUnknown() && 25660a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikie Builder.getCurrentDebugLocation().getScope(CGM.getLLVMContext()) == 25670a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikie LexicalBlockStack.back()) 25687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 25696537f083555f9606c495d05c562878aa49bae987Eric Christopher 25707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Update last state. 25717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PrevLoc = CurLoc; 25727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *Scope = LexicalBlockStack.back(); 257400df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl Builder.SetCurrentDebugLocation(llvm::DebugLoc::get 257500df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl (getLineNumber(CurLoc), 257600df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl getColumnNumber(CurLoc, ForceColumnInfo), 257700df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl Scope)); 25787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 25797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateLexicalBlock - Creates a new lexical block node and pushes it on 25817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// the stack. 25827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::CreateLexicalBlock(SourceLocation Loc) { 2583ef8225444452a1486bd721f3285301fe84643b00Stephen Hines llvm::DIDescriptor D = DBuilder.createLexicalBlock( 2584ef8225444452a1486bd721f3285301fe84643b00Stephen Hines llvm::DIDescriptor(LexicalBlockStack.empty() ? nullptr 2585ef8225444452a1486bd721f3285301fe84643b00Stephen Hines : LexicalBlockStack.back()), 2586ef8225444452a1486bd721f3285301fe84643b00Stephen Hines getOrCreateFile(CurLoc), getLineNumber(CurLoc), getColumnNumber(CurLoc), 2587ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 0); 25887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *DN = D; 25897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(DN); 25907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 25917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitLexicalBlockStart - Constructs the debug code for entering a declarative 25937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// region - beginning of a DW_TAG_lexical_block. 2594f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christophervoid CGDebugInfo::EmitLexicalBlockStart(CGBuilderTy &Builder, 2595f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher SourceLocation Loc) { 25967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Set our current location. 25977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei setLocation(Loc); 25987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create a new lexical block and push it on the stack. 26007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CreateLexicalBlock(Loc); 26017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Emit a line table change for the current location inside the new scope. 26037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Builder.SetCurrentDebugLocation(llvm::DebugLoc::get(getLineNumber(Loc), 26047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getColumnNumber(Loc), 26057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.back())); 26067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 26077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitLexicalBlockEnd - Constructs the debug code for exiting a declarative 26097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// region - end of a DW_TAG_lexical_block. 2610f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christophervoid CGDebugInfo::EmitLexicalBlockEnd(CGBuilderTy &Builder, 2611f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher SourceLocation Loc) { 26127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 26137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Provide an entry in the line table for the end of the block. 26157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitLocation(Builder, Loc); 26167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 26187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 26197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitFunctionEnd - Constructs the debug code for exiting a function. 26217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitFunctionEnd(CGBuilderTy &Builder) { 26227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 26237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RCount = FnBeginRegionCount.back(); 26247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(RCount <= LexicalBlockStack.size() && "Region stack mismatch"); 26257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Pop all regions for this function. 26277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (LexicalBlockStack.size() != RCount) 26287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitLexicalBlockEnd(Builder, CurLoc); 26297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FnBeginRegionCount.pop_back(); 26307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 26317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26326537f083555f9606c495d05c562878aa49bae987Eric Christopher// EmitTypeForVarWithBlocksAttr - Build up structure info for the byref. 26337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// See BuildByRefType. 26347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::EmitTypeForVarWithBlocksAttr(const VarDecl *VD, 26357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t *XOffset) { 26367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 5> EltTys; 26387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FType; 26397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize, FieldOffset; 26407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign; 26416537f083555f9606c495d05c562878aa49bae987Eric Christopher 26427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 26436537f083555f9606c495d05c562878aa49bae987Eric Christopher QualType Type = VD->getType(); 26447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 26467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 26477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset)); 26487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__forwarding", &FieldOffset)); 26497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().IntTy; 26507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset)); 26517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__size", &FieldOffset)); 26527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool HasCopyAndDispose = CGM.getContext().BlockRequiresCopying(Type, VD); 26547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (HasCopyAndDispose) { 26557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 26567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__copy_helper", 26577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei &FieldOffset)); 26587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__destroy_helper", 26597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei &FieldOffset)); 26607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool HasByrefExtendedLayout; 26627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qualifiers::ObjCLifetime Lifetime; 26637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CGM.getContext().getByrefLifetime(Type, 26647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Lifetime, HasByrefExtendedLayout) 26651f4379184ee07217183d11acf142ea6fe0d487a0Adrian Prantl && HasByrefExtendedLayout) { 26661f4379184ee07217183d11acf142ea6fe0d487a0Adrian Prantl FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 26677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, 26687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "__byref_variable_layout", 26697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei &FieldOffset)); 26701f4379184ee07217183d11acf142ea6fe0d487a0Adrian Prantl } 26716537f083555f9606c495d05c562878aa49bae987Eric Christopher 26727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits Align = CGM.getContext().getDeclAlign(VD); 26737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Align > CGM.getContext().toCharUnitsFromBits( 267464aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall CGM.getTarget().getPointerAlign(0))) { 26756537f083555f9606c495d05c562878aa49bae987Eric Christopher CharUnits FieldOffsetInBytes 26767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = CGM.getContext().toCharUnitsFromBits(FieldOffset); 26777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits AlignedOffsetInBytes 26787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = FieldOffsetInBytes.RoundUpToAlignment(Align); 26797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits NumPaddingBytes 26807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = AlignedOffsetInBytes - FieldOffsetInBytes; 26816537f083555f9606c495d05c562878aa49bae987Eric Christopher 26827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NumPaddingBytes.isPositive()) { 26837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APInt pad(32, NumPaddingBytes.getQuantity()); 26847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getConstantArrayType(CGM.getContext().CharTy, 26857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei pad, ArrayType::Normal, 0); 26867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "", &FieldOffset)); 26877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26896537f083555f9606c495d05c562878aa49bae987Eric Christopher 26907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = Type; 26916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::DIType FieldTy = getOrCreateType(FType, Unit); 26927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize = CGM.getContext().getTypeSize(FType); 26937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldAlign = CGM.getContext().toBits(Align); 26947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26956537f083555f9606c495d05c562878aa49bae987Eric Christopher *XOffset = FieldOffset; 26967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldTy = DBuilder.createMemberType(Unit, VD->getName(), Unit, 26977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 0, FieldSize, FieldAlign, 26987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset, 0, FieldTy); 26997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(FieldTy); 27007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset += FieldSize; 27016537f083555f9606c495d05c562878aa49bae987Eric Christopher 27027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys); 27036537f083555f9606c495d05c562878aa49bae987Eric Christopher 27047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = llvm::DIDescriptor::FlagBlockByrefStruct; 27056537f083555f9606c495d05c562878aa49bae987Eric Christopher 27067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createStructType(Unit, "", Unit, 0, FieldOffset, 0, Flags, 2707c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie llvm::DIType(), Elements); 27087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 27097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitDeclare - Emit local variable declaration debug info. 27116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid CGDebugInfo::EmitDeclare(const VarDecl *VD, llvm::dwarf::LLVMConstants Tag, 27126537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::Value *Storage, 27137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ArgNo, CGBuilderTy &Builder) { 271413c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 27157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 27167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2717fc946271e008544b518321fdecc77ca076663c12David Blaikie bool Unwritten = 2718fc946271e008544b518321fdecc77ca076663c12David Blaikie VD->isImplicit() || (isa<Decl>(VD->getDeclContext()) && 2719fc946271e008544b518321fdecc77ca076663c12David Blaikie cast<Decl>(VD->getDeclContext())->isImplicit()); 2720fc946271e008544b518321fdecc77ca076663c12David Blaikie llvm::DIFile Unit; 2721fc946271e008544b518321fdecc77ca076663c12David Blaikie if (!Unwritten) 2722fc946271e008544b518321fdecc77ca076663c12David Blaikie Unit = getOrCreateFile(VD->getLocation()); 27237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty; 27247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t XOffset = 0; 27257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VD->hasAttr<BlocksAttr>()) 27267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset); 27276537f083555f9606c495d05c562878aa49bae987Eric Christopher else 27287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = getOrCreateType(VD->getType(), Unit); 27297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there is no debug info for this type then do not emit debug info 27317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // for this variable. 27327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Ty) 27337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 27347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get location information. 2736fc946271e008544b518321fdecc77ca076663c12David Blaikie unsigned Line = 0; 2737fc946271e008544b518321fdecc77ca076663c12David Blaikie unsigned Column = 0; 2738fc946271e008544b518321fdecc77ca076663c12David Blaikie if (!Unwritten) { 2739fc946271e008544b518321fdecc77ca076663c12David Blaikie Line = getLineNumber(VD->getLocation()); 2740fc946271e008544b518321fdecc77ca076663c12David Blaikie Column = getColumnNumber(VD->getLocation()); 2741fc946271e008544b518321fdecc77ca076663c12David Blaikie } 27427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 27437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VD->isImplicit()) 27447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagArtificial; 27457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is the first argument and it is implicit then 27467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // give it an object pointer flag. 27477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: There has to be a better way to do this, but for static 27487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // functions there won't be an implicit param at arg1 and 27497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // otherwise it is 'self' or 'this'. 27507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<ImplicitParamDecl>(VD) && ArgNo == 1) 27517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagObjectPointer; 275241c9baed95a1e7974e6cccf7b4120fd1866ff125David Blaikie if (llvm::Argument *Arg = dyn_cast<llvm::Argument>(Storage)) 27537dab97b5af44556453c13cf877e02b8ea4c6c1cfEric Christopher if (Arg->getType()->isPointerTy() && !Arg->hasByValAttr() && 27547dab97b5af44556453c13cf877e02b8ea4c6c1cfEric Christopher !VD->getType()->isPointerType()) 275541c9baed95a1e7974e6cccf7b4120fd1866ff125David Blaikie Flags |= llvm::DIDescriptor::FlagIndirectVariable; 27567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *Scope = LexicalBlockStack.back(); 27587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = VD->getName(); 27607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Name.empty()) { 27617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VD->hasAttr<BlocksAttr>()) { 27627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits offset = CharUnits::fromQuantity(32); 27637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 9> addr; 27647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Type *Int64Ty = CGM.Int64Ty; 27657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 27667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of __forwarding field 27677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext().toCharUnitsFromBits( 276864aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall CGM.getTarget().getPointerWidth(0)); 27697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 27707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpDeref)); 27717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 27727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of x field 27737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext().toCharUnitsFromBits(XOffset); 27747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 27757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the variable. 27777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIVariable D = 27786537f083555f9606c495d05c562878aa49bae987Eric Christopher DBuilder.createComplexVariable(Tag, 27797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor(Scope), 27807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VD->getName(), Unit, Line, Ty, 27817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr, ArgNo); 27826537f083555f9606c495d05c562878aa49bae987Eric Christopher 27837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Insert an llvm.dbg.declare into the current block. 27847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Instruction *Call = 27857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.insertDeclare(Storage, D, Builder.GetInsertBlock()); 27867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); 27877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 278839232cd098f94e9e5e850eb2adb3a97372c6cf38Adrian Prantl } else if (isa<VariableArrayType>(VD->getType())) 278995d3d1a9b2e5177d793f04cebfd1df01a435df44Adrian Prantl Flags |= llvm::DIDescriptor::FlagIndirectVariable; 2790436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie } else if (const RecordType *RT = dyn_cast<RecordType>(VD->getType())) { 2791436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // If VD is an anonymous union then Storage represents value for 2792436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // all union fields. 27937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordDecl *RD = cast<RecordDecl>(RT->getDecl()); 2794d8180cf9877cd793949ae94edbf2ee84341041c5David Blaikie if (RD->isUnion() && RD->isAnonymousStructOrUnion()) { 2795651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *Field : RD->fields()) { 27967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy = getOrCreateType(Field->getType(), Unit); 27977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef FieldName = Field->getName(); 27986537f083555f9606c495d05c562878aa49bae987Eric Christopher 27997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore unnamed fields. Do not ignore unnamed records. 28007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FieldName.empty() && !isa<RecordType>(Field->getType())) 28017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 28026537f083555f9606c495d05c562878aa49bae987Eric Christopher 28037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use VarDecl's Tag, Scope and Line number. 28047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIVariable D = 28057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createLocalVariable(Tag, llvm::DIDescriptor(Scope), 28066537f083555f9606c495d05c562878aa49bae987Eric Christopher FieldName, Unit, Line, FieldTy, 28077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getLangOpts().Optimize, Flags, 28087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArgNo); 28096537f083555f9606c495d05c562878aa49bae987Eric Christopher 28107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Insert an llvm.dbg.declare into the current block. 28117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Instruction *Call = 28127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.insertDeclare(Storage, D, Builder.GetInsertBlock()); 28137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); 28147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2815d8180cf9877cd793949ae94edbf2ee84341041c5David Blaikie return; 28167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2818436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie 2819436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // Create the descriptor for the variable. 2820436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie llvm::DIVariable D = 2821436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie DBuilder.createLocalVariable(Tag, llvm::DIDescriptor(Scope), 2822436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie Name, Unit, Line, Ty, 2823436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie CGM.getLangOpts().Optimize, Flags, ArgNo); 2824436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie 2825436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // Insert an llvm.dbg.declare into the current block. 2826436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie llvm::Instruction *Call = 2827436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie DBuilder.insertDeclare(Storage, D, Builder.GetInsertBlock()); 2828436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); 28297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 28307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfAutoVariable(const VarDecl *VD, 28327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *Storage, 28337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 283413c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 28357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitDeclare(VD, llvm::dwarf::DW_TAG_auto_variable, Storage, 0, Builder); 28367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 28377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2838e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// Look up the completed type for a self pointer in the TypeCache and 2839e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// create a copy of it with the ObjectPointer and Artificial flags 2840e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// set. If the type is not cached, a new one is created. This should 2841e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// never happen though, since creating a type for the implicit self 2842e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// argument implies that we already parsed the interface definition 2843e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// and the ivar declarations in the implementation. 2844f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopherllvm::DIType CGDebugInfo::CreateSelfType(const QualType &QualTy, 2845f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher llvm::DIType Ty) { 2846e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl llvm::DIType CachedTy = getTypeOrNull(QualTy); 2847b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (CachedTy) Ty = CachedTy; 2848e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl return DBuilder.createObjectPointerType(Ty); 2849e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl} 2850e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl 28517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfBlockDeclRefVariable(const VarDecl *VD, 28527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *Storage, 28537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder, 28547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CGBlockInfo &blockInfo) { 285513c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 28567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 28576537f083555f9606c495d05c562878aa49bae987Eric Christopher 28586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Builder.GetInsertBlock() == nullptr) 28597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 28606537f083555f9606c495d05c562878aa49bae987Eric Christopher 28617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool isByRef = VD->hasAttr<BlocksAttr>(); 28626537f083555f9606c495d05c562878aa49bae987Eric Christopher 28637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t XOffset = 0; 28647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 28657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty; 28667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isByRef) 28677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset); 28686537f083555f9606c495d05c562878aa49bae987Eric Christopher else 28697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = getOrCreateType(VD->getType(), Unit); 28707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Self is passed along as an implicit non-arg variable in a 28727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // block. Mark it as the object pointer. 28737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<ImplicitParamDecl>(VD) && VD->getName() == "self") 2874e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl Ty = CreateSelfType(VD->getType(), Ty); 28757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get location information. 28777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(VD->getLocation()); 28787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Column = getColumnNumber(VD->getLocation()); 28797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const llvm::DataLayout &target = CGM.getDataLayout(); 28817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits offset = CharUnits::fromQuantity( 28837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei target.getStructLayout(blockInfo.StructureType) 28847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ->getElementOffset(blockInfo.getCapture(VD).getIndex())); 28857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 9> addr; 28877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Type *Int64Ty = CGM.Int64Ty; 28889b97adfb770c3b55c1a45049d53b624bbc6f62e1Adrian Prantl if (isa<llvm::AllocaInst>(Storage)) 28899b97adfb770c3b55c1a45049d53b624bbc6f62e1Adrian Prantl addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpDeref)); 28907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 28917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 28927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isByRef) { 28937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpDeref)); 28947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 28957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of __forwarding field 28967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext() 28977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei .toCharUnitsFromBits(target.getPointerSizeInBits(0)); 28987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 28997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpDeref)); 29007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 29017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of x field 29027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext().toCharUnitsFromBits(XOffset); 29037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 29047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the variable. 29077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIVariable D = 29086537f083555f9606c495d05c562878aa49bae987Eric Christopher DBuilder.createComplexVariable(llvm::dwarf::DW_TAG_auto_variable, 29097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor(LexicalBlockStack.back()), 29107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VD->getName(), Unit, Line, Ty, addr); 29119b97adfb770c3b55c1a45049d53b624bbc6f62e1Adrian Prantl 29127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Insert an llvm.dbg.declare into the current block. 29137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Instruction *Call = 29147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.insertDeclare(Storage, D, Builder.GetInsertPoint()); 29157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, 29167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.back())); 29177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 29187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitDeclareOfArgVariable - Emit call to llvm.dbg.declare for an argument 29207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// variable declaration. 29217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfArgVariable(const VarDecl *VD, llvm::Value *AI, 29227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ArgNo, 29237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 292413c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 29257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitDeclare(VD, llvm::dwarf::DW_TAG_arg_variable, AI, ArgNo, Builder); 29267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 29277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 29297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei struct BlockLayoutChunk { 29307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t OffsetInBits; 29317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BlockDecl::Capture *Capture; 29327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 29337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool operator<(const BlockLayoutChunk &l, const BlockLayoutChunk &r) { 29347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return l.OffsetInBits < r.OffsetInBits; 29357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 29377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block, 2939836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl llvm::Value *Arg, 2940836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl llvm::Value *LocalAddr, 29417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 294213c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 29437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTContext &C = CGM.getContext(); 29447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BlockDecl *blockDecl = block.getBlockDecl(); 29457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Collect some general information about the block's location. 29477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation loc = blockDecl->getCaretLocation(); 29487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile tunit = getOrCreateFile(loc); 29497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned line = getLineNumber(loc); 29507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned column = getColumnNumber(loc); 29516537f083555f9606c495d05c562878aa49bae987Eric Christopher 29527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Build the debug-info type for the block literal. 29537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(cast<Decl>(blockDecl->getDeclContext())); 29547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const llvm::StructLayout *blockLayout = 29567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getDataLayout().getStructLayout(block.StructureType); 29577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value*, 16> fields; 29597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__isa", C.VoidPtrTy, 0, loc, AS_public, 29607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(0), 29617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 29627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__flags", C.IntTy, 0, loc, AS_public, 29637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(1), 29647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 29657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__reserved", C.IntTy, 0, loc, AS_public, 29667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(2), 29677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 29687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__FuncPtr", C.VoidPtrTy, 0, loc, AS_public, 29697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(3), 29707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 29717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__descriptor", 29727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei C.getPointerType(block.NeedsCopyDispose ? 29737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei C.getBlockDescriptorExtendedType() : 29747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei C.getBlockDescriptorType()), 29757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 0, loc, AS_public, 29767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(4), 29777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 29787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We want to sort the captures by offset, not because DWARF 29807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // requires this, but because we're paranoid about debuggers. 29817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<BlockLayoutChunk, 8> chunks; 29827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 'this' capture. 29847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (blockDecl->capturesCXXThis()) { 29857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BlockLayoutChunk chunk; 29867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.OffsetInBits = 29877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(block.CXXThisIndex); 29886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines chunk.Capture = nullptr; 29897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunks.push_back(chunk); 29907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Variable captures. 2993651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &capture : blockDecl->captures()) { 29947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const VarDecl *variable = capture.getVariable(); 29957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CGBlockInfo::Capture &captureInfo = block.getCapture(variable); 29967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore constant captures. 29987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (captureInfo.isConstant()) 29997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 30007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BlockLayoutChunk chunk; 30027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.OffsetInBits = 30037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(captureInfo.getIndex()); 30047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.Capture = &capture; 30057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunks.push_back(chunk); 30067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Sort by offset. 30097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::array_pod_sort(chunks.begin(), chunks.end()); 30107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (SmallVectorImpl<BlockLayoutChunk>::iterator 30127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei i = chunks.begin(), e = chunks.end(); i != e; ++i) { 30137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t offsetInBits = i->OffsetInBits; 30147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BlockDecl::Capture *capture = i->Capture; 30157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we have a null capture, this must be the C++ 'this' capture. 30177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!capture) { 30187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXMethodDecl *method = 30197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<CXXMethodDecl>(blockDecl->getNonClosureContext()); 30207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType type = method->getThisType(C); 30217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("this", type, 0, loc, AS_public, 30237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offsetInBits, tunit, tunit)); 30247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 30257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const VarDecl *variable = capture->getVariable(); 30287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef name = variable->getName(); 30297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType fieldType; 30317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (capture->isByRef()) { 30327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::pair<uint64_t,unsigned> ptrInfo = C.getTypeInfo(C.VoidPtrTy); 30337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: this creates a second copy of this type! 30357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t xoffset; 30367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fieldType = EmitTypeForVarWithBlocksAttr(variable, &xoffset); 30377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fieldType = DBuilder.createPointerType(fieldType, ptrInfo.first); 30387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fieldType = DBuilder.createMemberType(tunit, name, tunit, line, 30397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ptrInfo.first, ptrInfo.second, 30407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offsetInBits, 0, fieldType); 30417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 30427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fieldType = createFieldType(name, variable->getType(), 0, 30437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei loc, AS_public, offsetInBits, tunit, tunit); 30447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(fieldType); 30467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<36> typeName; 30497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::raw_svector_ostream(typeName) 30507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << "__block_literal_" << CGM.getUniqueBlockCount(); 30517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray fieldsArray = DBuilder.getOrCreateArray(fields); 30537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType type = 30557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createStructType(tunit, typeName.str(), tunit, line, 30567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getContext().toBits(block.BlockSize), 30577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getContext().toBits(block.BlockAlign), 3058c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie 0, llvm::DIType(), fieldsArray); 30597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei type = DBuilder.createPointerType(type, CGM.PointerWidthInBits); 30607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the block. 30627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned flags = llvm::DIDescriptor::FlagArtificial; 30637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *scope = LexicalBlockStack.back(); 30647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the parameter. 30667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIVariable debugVar = 30677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createLocalVariable(llvm::dwarf::DW_TAG_arg_variable, 30686537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIDescriptor(scope), 3069836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl Arg->getName(), tunit, line, type, 30707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getLangOpts().Optimize, flags, 3071836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl cast<llvm::Argument>(Arg)->getArgNo() + 1); 3072836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl 3073bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl if (LocalAddr) { 3074836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl // Insert an llvm.dbg.value into the current block. 3075bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl llvm::Instruction *DbgVal = 3076bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl DBuilder.insertDbgValueIntrinsic(LocalAddr, 0, debugVar, 3077f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher Builder.GetInsertBlock()); 3078bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl DbgVal->setDebugLoc(llvm::DebugLoc::get(line, column, scope)); 3079bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl } 3080836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl 3081bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl // Insert an llvm.dbg.declare into the current block. 3082bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl llvm::Instruction *DbgDecl = 3083bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl DBuilder.insertDeclare(Arg, debugVar, Builder.GetInsertBlock()); 3084bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl DbgDecl->setDebugLoc(llvm::DebugLoc::get(line, column, scope)); 30857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 30867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30875434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie/// If D is an out-of-class definition of a static data member of a class, find 30885434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie/// its corresponding in-class declaration. 30895434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikiellvm::DIDerivedType 30905434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David BlaikieCGDebugInfo::getOrCreateStaticDataMemberDeclarationOrNull(const VarDecl *D) { 30915434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie if (!D->isStaticDataMember()) 30925434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie return llvm::DIDerivedType(); 30935434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator MI = 30945434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie StaticDataMemberCache.find(D->getCanonicalDecl()); 30955434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie if (MI != StaticDataMemberCache.end()) { 30965434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie assert(MI->second && "Static data member declaration should still exist"); 30975434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie return llvm::DIDerivedType(cast<llvm::MDNode>(MI->second)); 30985434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie } 30995e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie 31005e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie // If the member wasn't found in the cache, lazily construct and add it to the 31015e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie // type (used when a limited form of the type is emitted). 31025434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie llvm::DICompositeType Ctxt( 31035434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie getContextDescriptor(cast<Decl>(D->getDeclContext()))); 31045434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie llvm::DIDerivedType T = CreateRecordStaticField(D, Ctxt); 31055434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie return T; 31065434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie} 31075434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie 31086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// Recursively collect all of the member fields of a global anonymous decl and 31096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// create static variables for them. The first time this is called it needs 31106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// to be on a union and then from there we can have additional unnamed fields. 31116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesllvm::DIGlobalVariable 31126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesCGDebugInfo::CollectAnonRecordDecls(const RecordDecl *RD, llvm::DIFile Unit, 31136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned LineNo, StringRef LinkageName, 31146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::GlobalVariable *Var, 31156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::DIDescriptor DContext) { 31166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::DIGlobalVariable GV; 31176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 31186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (const auto *Field : RD->fields()) { 31196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::DIType FieldTy = getOrCreateType(Field->getType(), Unit); 31206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines StringRef FieldName = Field->getName(); 31216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 31226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Ignore unnamed fields, but recurse into anonymous records. 31236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (FieldName.empty()) { 31246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const RecordType *RT = dyn_cast<RecordType>(Field->getType()); 31256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (RT) 31266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines GV = CollectAnonRecordDecls(RT->getDecl(), Unit, LineNo, LinkageName, 31276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Var, DContext); 31286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines continue; 31296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 31306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Use VarDecl's Tag, Scope and Line number. 31316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines GV = DBuilder.createStaticVariable(DContext, FieldName, LinkageName, Unit, 31326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines LineNo, FieldTy, 31336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Var->hasInternalLinkage(), Var, 31346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::DIDerivedType()); 31356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 31366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return GV; 31376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 31386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 31397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitGlobalVariable - Emit information about a global variable. 31403b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gaovoid CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, 31417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const VarDecl *D) { 314213c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 31437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create global variable debug descriptor. 31447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(D->getLocation()); 31457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(D->getLocation()); 31463b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao 31473b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao setLocation(D->getLocation()); 31487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType T = D->getType(); 31507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (T->isIncompleteArrayType()) { 31517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // CodeGen turns int[] into int[1] so we'll do the same here. 31537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APInt ConstVal(32, 1); 31547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ET = CGM.getContext().getAsArrayType(T)->getElementType(); 31557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = CGM.getContext().getConstantArrayType(ET, ConstVal, 31577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayType::Normal, 0); 31587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 31603b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao StringRef DeclName = D->getName(); 31613b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao StringRef LinkageName; 31626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (D->getDeclContext() && !isa<FunctionDecl>(D->getDeclContext()) && 31636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines !isa<ObjCMethodDecl>(D->getDeclContext())) 31643b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao LinkageName = Var->getName(); 31653b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao if (LinkageName == DeclName) 31663b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao LinkageName = StringRef(); 31676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 31686537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIDescriptor DContext = 31697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(dyn_cast<Decl>(D->getDeclContext())); 31706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 31716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Attempt to store one global variable for the declaration - even if we 31726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // emit a lot of fields. 31736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::DIGlobalVariable GV; 31746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 31756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // If this is an anonymous union then we'll want to emit a global 31766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // variable for each member of the anonymous union so that it's possible 31776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // to find the name of any field in the union. 31786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (T->isUnionType() && DeclName.empty()) { 31796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const RecordDecl *RD = cast<RecordType>(T)->getDecl(); 31806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(RD->isAnonymousStructOrUnion() && "unnamed non-anonymous struct or union?"); 31816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines GV = CollectAnonRecordDecls(RD, Unit, LineNo, LinkageName, Var, DContext); 31826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } else { 31836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines GV = DBuilder.createStaticVariable( 31846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DContext, DeclName, LinkageName, Unit, LineNo, getOrCreateType(T, Unit), 31856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Var->hasInternalLinkage(), Var, 31866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getOrCreateStaticDataMemberDeclarationOrNull(D)); 31876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 31889faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie DeclCache.insert(std::make_pair(D->getCanonicalDecl(), llvm::WeakVH(GV))); 31897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 31907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31913b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao/// EmitGlobalVariable - Emit global variable's debug info. 31923b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gaovoid CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, 31933b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao llvm::Constant *Init) { 319413c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 31953b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao // Create the descriptor for the variable. 31963b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 31973b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao StringRef Name = VD->getName(); 31983b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao llvm::DIType Ty = getOrCreateType(VD->getType(), Unit); 31993b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(VD)) { 32003b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao const EnumDecl *ED = cast<EnumDecl>(ECD->getDeclContext()); 32013b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao assert(isa<EnumType>(ED->getTypeForDecl()) && "Enum without EnumType?"); 32023b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao Ty = getOrCreateType(QualType(ED->getTypeForDecl(), 0), Unit); 32033b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao } 32043b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao // Do not use DIGlobalVariable for enums. 32053b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao if (Ty.getTag() == llvm::dwarf::DW_TAG_enumeration_type) 32063b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao return; 32076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Do not emit separate definitions for function local const/statics. 32086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (isa<FunctionDecl>(VD->getDeclContext())) 32096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return; 32106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines VD = cast<ValueDecl>(VD->getCanonicalDecl()); 32116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto pair = DeclCache.insert(std::make_pair(VD, llvm::WeakVH())); 32126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!pair.second) 32136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return; 32146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::DIDescriptor DContext = 32156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getContextDescriptor(dyn_cast<Decl>(VD->getDeclContext())); 32163b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao llvm::DIGlobalVariable GV = DBuilder.createStaticVariable( 32176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DContext, Name, StringRef(), Unit, getLineNumber(VD->getLocation()), Ty, 32186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines true, Init, 32193b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao getOrCreateStaticDataMemberDeclarationOrNull(cast<VarDecl>(VD))); 32206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines pair.first->second = llvm::WeakVH(GV); 32219faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie} 32229faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie 32239faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikiellvm::DIScope CGDebugInfo::getCurrentContextDescriptor(const Decl *D) { 32249faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (!LexicalBlockStack.empty()) 32259faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return llvm::DIScope(LexicalBlockStack.back()); 32269faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return getContextDescriptor(D); 32277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 32287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3229957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikievoid CGDebugInfo::EmitUsingDirective(const UsingDirectiveDecl &UD) { 32309faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (CGM.getCodeGenOpts().getDebugInfo() < CodeGenOptions::LimitedDebugInfo) 32319faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return; 3232957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie DBuilder.createImportedModule( 32339faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie getCurrentContextDescriptor(cast<Decl>(UD.getDeclContext())), 32349faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie getOrCreateNameSpace(UD.getNominatedNamespace()), 3235957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie getLineNumber(UD.getLocation())); 3236957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie} 3237957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie 32389faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikievoid CGDebugInfo::EmitUsingDecl(const UsingDecl &UD) { 32399faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (CGM.getCodeGenOpts().getDebugInfo() < CodeGenOptions::LimitedDebugInfo) 32409faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return; 32419faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie assert(UD.shadow_size() && 32429faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie "We shouldn't be codegening an invalid UsingDecl containing no decls"); 32439faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // Emitting one decl is sufficient - debuggers can detect that this is an 32449faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // overloaded name & provide lookup for all the overloads. 32459faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie const UsingShadowDecl &USD = **UD.shadow_begin(); 3246651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (llvm::DIScope Target = 324756b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher getDeclarationOrDefinition(USD.getUnderlyingDecl())) 32489faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie DBuilder.createImportedDeclaration( 32499faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie getCurrentContextDescriptor(cast<Decl>(USD.getDeclContext())), Target, 32509faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie getLineNumber(USD.getLocation())); 32519faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie} 32529faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie 3253fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikiellvm::DIImportedEntity 3254fc46ebc2b1345723a894ae352cfb206c1d930295David BlaikieCGDebugInfo::EmitNamespaceAlias(const NamespaceAliasDecl &NA) { 3255fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie if (CGM.getCodeGenOpts().getDebugInfo() < CodeGenOptions::LimitedDebugInfo) 32566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return llvm::DIImportedEntity(nullptr); 3257fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie llvm::WeakVH &VH = NamespaceAliasCache[&NA]; 3258fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie if (VH) 3259fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie return llvm::DIImportedEntity(cast<llvm::MDNode>(VH)); 32606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::DIImportedEntity R(nullptr); 3261fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie if (const NamespaceAliasDecl *Underlying = 3262fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie dyn_cast<NamespaceAliasDecl>(NA.getAliasedNamespace())) 3263fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie // This could cache & dedup here rather than relying on metadata deduping. 32646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines R = DBuilder.createImportedDeclaration( 3265fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie getCurrentContextDescriptor(cast<Decl>(NA.getDeclContext())), 3266fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie EmitNamespaceAlias(*Underlying), getLineNumber(NA.getLocation()), 3267fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie NA.getName()); 3268fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie else 32696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines R = DBuilder.createImportedDeclaration( 3270fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie getCurrentContextDescriptor(cast<Decl>(NA.getDeclContext())), 3271fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie getOrCreateNameSpace(cast<NamespaceDecl>(NA.getAliasedNamespace())), 3272fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie getLineNumber(NA.getLocation()), NA.getName()); 3273fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie VH = R; 3274fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie return R; 3275fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie} 3276fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie 32777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateNamesSpace - Return namespace descriptor for the given 32787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// namespace decl. 32796537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DINameSpace 32807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::getOrCreateNameSpace(const NamespaceDecl *NSDecl) { 32818863e6baaa760c2a0f4541fc6c0ca7993979a4b3David Blaikie NSDecl = NSDecl->getCanonicalDecl(); 32826537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DenseMap<const NamespaceDecl *, llvm::WeakVH>::iterator I = 32837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NameSpaceCache.find(NSDecl); 32847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (I != NameSpaceCache.end()) 32857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DINameSpace(cast<llvm::MDNode>(I->second)); 32866537f083555f9606c495d05c562878aa49bae987Eric Christopher 32877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(NSDecl->getLocation()); 32887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile FileD = getOrCreateFile(NSDecl->getLocation()); 32896537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIDescriptor Context = 32907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(dyn_cast<Decl>(NSDecl->getDeclContext())); 32917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DINameSpace NS = 32927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createNameSpace(Context, NSDecl->getName(), FileD, LineNo); 32937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NameSpaceCache[NSDecl] = llvm::WeakVH(NS); 32947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return NS; 32957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 32967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::finalize() { 32986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Creating types might create further types - invalidating the current 32996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // element and the size(), so don't cache/reference them. 33006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (size_t i = 0; i != ObjCInterfaceCache.size(); ++i) { 33016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCInterfaceCacheEntry E = ObjCInterfaceCache[i]; 33026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines E.Decl.replaceAllUsesWith(CGM.getLLVMContext(), 33036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines E.Type->getDecl()->getDefinition() 33046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ? CreateTypeDefinition(E.Type, E.Unit) 33056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : E.Decl); 33066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 33076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 33086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (auto p : ReplaceMap) { 33096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(p.second); 33106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::DIType Ty(cast<llvm::MDNode>(p.second)); 33116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(Ty.isForwardDecl()); 33126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 33136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto it = TypeCache.find(p.first); 33146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(it != TypeCache.end()); 33156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(it->second); 33166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 33176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::DIType RepTy(cast<llvm::MDNode>(it->second)); 33186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Ty.replaceAllUsesWith(CGM.getLLVMContext(), RepTy); 33197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3320ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 3321ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // We keep our own list of retained types, because we need to look 3322ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // up the final type in the type cache. 3323ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl for (std::vector<void *>::const_iterator RI = RetainedTypes.begin(), 3324ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl RE = RetainedTypes.end(); RI != RE; ++RI) 332518760453868e9b831b8575ae64119b07ab4dcdf5Manman Ren DBuilder.retainType(llvm::DIType(cast<llvm::MDNode>(TypeCache[*RI]))); 3326ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 33277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.finalize(); 33287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3329