CGDebugInfo.cpp revision 24118f5d62f68b18a75db4eb570a0aaf7f4dda97
17f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===--- CGDebugInfo.cpp - Emit Debug Information for a Module ------------===// 27f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 37f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// The LLVM Compiler Infrastructure 47f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 57f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// This file is distributed under the University of Illinois Open Source 67f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// License. See LICENSE.TXT for details. 77f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 87f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 97f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// This coordinates the debug information generation while generating code. 117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CGDebugInfo.h" 157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CGBlocks.h" 169dfd24324c079b564dda936c6ae46898b82121e2David Blaikie#include "CGCXXABI.h" 177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CGObjCRuntime.h" 187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CodeGenFunction.h" 197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CodeGenModule.h" 207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/ASTContext.h" 217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/DeclFriend.h" 227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/DeclObjC.h" 237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/DeclTemplate.h" 247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/Expr.h" 257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/RecordLayout.h" 267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/FileManager.h" 277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/SourceManager.h" 287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/Version.h" 297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Frontend/CodeGenOptions.h" 307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/ADT/SmallVector.h" 317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/ADT/StringExtras.h" 323b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/Constants.h" 333b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/DataLayout.h" 343b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/DerivedTypes.h" 353b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/Instructions.h" 363b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/Intrinsics.h" 373b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/Module.h" 387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/Dwarf.h" 397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/FileSystem.h" 407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang; 417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang::CodeGen; 427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::CGDebugInfo(CodeGenModule &CGM) 4413c976710415041fca5aba25cc02d3813c74b990Eric Christopher : CGM(CGM), DebugKind(CGM.getCodeGenOpts().getDebugInfo()), 4513c976710415041fca5aba25cc02d3813c74b990Eric Christopher DBuilder(CGM.getModule()), 467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BlockLiteralGenericSet(false) { 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 557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::setLocation(SourceLocation Loc) { 567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the new location isn't valid return. 577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Loc.isValid()) return; 587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurLoc = CGM.getContext().getSourceManager().getExpansionLoc(Loc); 607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we've changed files in the middle of a lexical scope go ahead 627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // and create a new lexical scope with file node if it's different 637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // from the one in the scope. 647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LexicalBlockStack.empty()) return; 657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PCLoc = SM.getPresumedLoc(CurLoc); 687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PPLoc = SM.getPresumedLoc(PrevLoc); 697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PCLoc.isInvalid() || PPLoc.isInvalid() || 717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei !strcmp(PPLoc.getFilename(), PCLoc.getFilename())) 727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *LB = LexicalBlockStack.back(); 757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIScope Scope = llvm::DIScope(LB); 767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Scope.isLexicalBlockFile()) { 777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DILexicalBlockFile LBF = llvm::DILexicalBlockFile(LB); 787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor D 797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = DBuilder.createLexicalBlockFile(LBF.getScope(), 807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateFile(CurLoc)); 817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *N = D; 827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(N); 84a6504853d297c30cfa271f4710af5a3d5db59449David Blaikie } else if (Scope.isLexicalBlock() || Scope.isSubprogram()) { 857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor D 867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = DBuilder.createLexicalBlockFile(Scope, getOrCreateFile(CurLoc)); 877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *N = D; 887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(N); 907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getContextDescriptor - Get context info for the decl. 94bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikiellvm::DIScope CGDebugInfo::getContextDescriptor(const Decl *Context) { 957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Context) 967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TheCU; 977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator 997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I = RegionMap.find(Context); 1007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (I != RegionMap.end()) { 1017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = I->second; 102bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie return llvm::DIScope(dyn_cast_or_null<llvm::MDNode>(V)); 1037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check namespace. 1067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const NamespaceDecl *NSDecl = dyn_cast<NamespaceDecl>(Context)) 107bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie return getOrCreateNameSpace(NSDecl); 1087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 109bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie if (const RecordDecl *RDecl = dyn_cast<RecordDecl>(Context)) 110bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie if (!RDecl->isDependentType()) 111bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie return getOrCreateType(CGM.getContext().getTypeDeclType(RDecl), 1127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateMainFile()); 1137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TheCU; 1147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getFunctionName - Get function name for the given FunctionDecl. If the 1177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// name is constructred on demand (e.g. C++ destructor) then the name 1187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// is stored on the side. 1197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getFunctionName(const FunctionDecl *FD) { 1207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert (FD && "Invalid FunctionDecl!"); 1217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *FII = FD->getIdentifier(); 1227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionTemplateSpecializationInfo *Info 1237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = FD->getTemplateSpecializationInfo(); 1247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Info && FII) 1257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return FII->getName(); 1267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise construct human readable name for debug info. 1285eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer SmallString<128> NS; 1295eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer llvm::raw_svector_ostream OS(NS); 1305eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer FD->printName(OS); 1317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add any template specialization args. 1337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Info) { 1347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgumentList *TArgs = Info->TemplateArguments; 1357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgument *Args = TArgs->data(); 1367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumArgs = TArgs->size(); 1377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PrintingPolicy Policy(CGM.getLangOpts()); 1385eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer TemplateSpecializationType::PrintTemplateArgumentList(OS, Args, NumArgs, 1395eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer Policy); 1407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Copy this name on the side and use its reference. 1435eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer OS.flush(); 1445eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer char *StrPtr = DebugInfoNames.Allocate<char>(NS.size()); 1455eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer memcpy(StrPtr, NS.data(), NS.size()); 1465eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer return StringRef(StrPtr, NS.size()); 1477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getObjCMethodName(const ObjCMethodDecl *OMD) { 1507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<256> MethodName; 1517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::raw_svector_ostream OS(MethodName); 1527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << (OMD->isInstanceMethod() ? '-' : '+') << '['; 1537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const DeclContext *DC = OMD->getDeclContext(); 1546537f083555f9606c495d05c562878aa49bae987Eric Christopher if (const ObjCImplementationDecl *OID = 1557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<const ObjCImplementationDecl>(DC)) { 1567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << OID->getName(); 1576537f083555f9606c495d05c562878aa49bae987Eric Christopher } else if (const ObjCInterfaceDecl *OID = 1587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<const ObjCInterfaceDecl>(DC)) { 1597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << OID->getName(); 1606537f083555f9606c495d05c562878aa49bae987Eric Christopher } else if (const ObjCCategoryImplDecl *OCD = 1617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<const ObjCCategoryImplDecl>(DC)){ 1627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << ((const NamedDecl *)OCD)->getIdentifier()->getNameStart() << '(' << 1637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OCD->getIdentifier()->getNameStart() << ')'; 164b509224b28bf7ddb2e4ff1d52855df5b56b44bf4Adrian Prantl } else if (isa<ObjCProtocolDecl>(DC)) { 165687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl // We can extract the type of the class from the self pointer. 166687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl if (ImplicitParamDecl* SelfDecl = OMD->getSelfDecl()) { 167687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl QualType ClassTy = 168687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl cast<ObjCObjectPointerType>(SelfDecl->getType())->getPointeeType(); 169687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl ClassTy.print(OS, PrintingPolicy(LangOptions())); 170687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl } 1717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << ' ' << OMD->getSelector().getAsString() << ']'; 1737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei char *StrPtr = DebugInfoNames.Allocate<char>(OS.tell()); 1757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(StrPtr, MethodName.begin(), OS.tell()); 1767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return StringRef(StrPtr, OS.tell()); 1777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getSelectorName - Return selector name. This is used for debugging 1807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// info. 1817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getSelectorName(Selector S) { 1827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const std::string &SName = S.getAsString(); 1837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei char *StrPtr = DebugInfoNames.Allocate<char>(SName.size()); 1847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(StrPtr, SName.data(), SName.size()); 1857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return StringRef(StrPtr, SName.size()); 1867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getClassName - Get class name including template argument list. 1896537f083555f9606c495d05c562878aa49bae987Eric ChristopherStringRef 1907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::getClassName(const RecordDecl *RD) { 1917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ClassTemplateSpecializationDecl *Spec 1927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast<ClassTemplateSpecializationDecl>(RD); 1937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Spec) 1947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return RD->getName(); 1957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgument *Args; 1977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumArgs; 1987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TypeSourceInfo *TAW = Spec->getTypeAsWritten()) { 1997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateSpecializationType *TST = 2007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<TemplateSpecializationType>(TAW->getType()); 2017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Args = TST->getArgs(); 2027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumArgs = TST->getNumArgs(); 2037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 2047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs(); 2057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Args = TemplateArgs.data(); 2067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumArgs = TemplateArgs.size(); 2077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = RD->getIdentifier()->getName(); 2097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PrintingPolicy Policy(CGM.getLangOpts()); 2105eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer SmallString<128> TemplateArgList; 2115eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer { 2125eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer llvm::raw_svector_ostream OS(TemplateArgList); 2135eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer TemplateSpecializationType::PrintTemplateArgumentList(OS, Args, NumArgs, 2145eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer Policy); 2155eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer } 2167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Copy this name on the side and use its reference. 2187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei size_t Length = Name.size() + TemplateArgList.size(); 2197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei char *StrPtr = DebugInfoNames.Allocate<char>(Length); 2207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(StrPtr, Name.data(), Name.size()); 2217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(StrPtr + Name.size(), TemplateArgList.data(), TemplateArgList.size()); 2227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return StringRef(StrPtr, Length); 2237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateFile - Get the file debug info descriptor for the input location. 2267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIFile CGDebugInfo::getOrCreateFile(SourceLocation Loc) { 2277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Loc.isValid()) 2287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If Location is not valid then use main input file. 2297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createFile(TheCU.getFilename(), TheCU.getDirectory()); 2307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 2327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PLoc = SM.getPresumedLoc(Loc); 2337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PLoc.isInvalid() || StringRef(PLoc.getFilename()).empty()) 2357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the location is not valid then use main input file. 2367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createFile(TheCU.getFilename(), TheCU.getDirectory()); 2377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Cache the results. 2397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const char *fname = PLoc.getFilename(); 2407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const char *, llvm::WeakVH>::iterator it = 2417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DIFileCache.find(fname); 2427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (it != DIFileCache.end()) { 2447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Verify that the information still exists. 2457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::Value *V = it->second) 2467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIFile(cast<llvm::MDNode>(V)); 2477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile F = DBuilder.createFile(PLoc.getFilename(), getCurrentDirname()); 2507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DIFileCache[fname] = F; 2527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return F; 2537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateMainFile - Get the file info for main compile unit. 2567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIFile CGDebugInfo::getOrCreateMainFile() { 2577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createFile(TheCU.getFilename(), TheCU.getDirectory()); 2587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getLineNumber - Get line number for the location. If location is invalid 2617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// then use current location. 2627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned CGDebugInfo::getLineNumber(SourceLocation Loc) { 2637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Loc.isInvalid() && CurLoc.isInvalid()) 2647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 2657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 2667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc); 2677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return PLoc.isValid()? PLoc.getLine() : 0; 2687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getColumnNumber - Get column number for the location. 27100df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantlunsigned CGDebugInfo::getColumnNumber(SourceLocation Loc, bool Force) { 2727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We may not want column information at all. 27300df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl if (!Force && !CGM.getCodeGenOpts().DebugColumnInfo) 2747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 2757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the location is invalid then use the current column. 2777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Loc.isInvalid() && CurLoc.isInvalid()) 2787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 2797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 2807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc); 2817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return PLoc.isValid()? PLoc.getColumn() : 0; 2827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getCurrentDirname() { 2857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CGM.getCodeGenOpts().DebugCompilationDir.empty()) 2867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CGM.getCodeGenOpts().DebugCompilationDir; 2877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CWDName.empty()) 2897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CWDName; 2907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<256> CWD; 2917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::sys::fs::current_path(CWD); 2927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei char *CompDirnamePtr = DebugInfoNames.Allocate<char>(CWD.size()); 2937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(CompDirnamePtr, CWD.data(), CWD.size()); 2947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CWDName = StringRef(CompDirnamePtr, CWD.size()); 2957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateCompileUnit - Create new compile unit. 2987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::CreateCompileUnit() { 2997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get absolute path name. 3017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 3027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string MainFileName = CGM.getCodeGenOpts().MainFileName; 3037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MainFileName.empty()) 3047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MainFileName = "<unknown>"; 3057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The main file name provided via the "-main-file-name" option contains just 3077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the file name itself with no path information. This file name may have had 3087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // a relative path, so we look into the actual file entry for the main 3097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // file to determine the real absolute path for the file. 3107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string MainFileDir; 3117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID())) { 3127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MainFileDir = MainFile->getDir()->getName(); 3137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MainFileDir != ".") 3147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MainFileName = MainFileDir + "/" + MainFileName; 3157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Save filename string. 3187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei char *FilenamePtr = DebugInfoNames.Allocate<char>(MainFileName.length()); 3197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(FilenamePtr, MainFileName.c_str(), MainFileName.length()); 3207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Filename(FilenamePtr, MainFileName.length()); 321ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher 322ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher // Save split dwarf file string. 323ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher std::string SplitDwarfFile = CGM.getCodeGenOpts().SplitDwarfFile; 324ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher char *SplitDwarfPtr = DebugInfoNames.Allocate<char>(SplitDwarfFile.length()); 325ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher memcpy(SplitDwarfPtr, SplitDwarfFile.c_str(), SplitDwarfFile.length()); 326ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher StringRef SplitDwarfFilename(SplitDwarfPtr, SplitDwarfFile.length()); 3276537f083555f9606c495d05c562878aa49bae987Eric Christopher 3287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LangTag; 3297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const LangOptions &LO = CGM.getLangOpts(); 3307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LO.CPlusPlus) { 3317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LO.ObjC1) 3327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_ObjC_plus_plus; 3337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 3347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_C_plus_plus; 3357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (LO.ObjC1) { 3367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_ObjC; 3377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (LO.C99) { 3387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_C99; 3397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 3407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_C89; 3417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Producer = getClangFullVersion(); 3447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Figure out which version of the ObjC runtime we have. 3467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RuntimeVers = 0; 3477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LO.ObjC1) 3487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RuntimeVers = LO.ObjCRuntime.isNonFragile() ? 2 : 1; 3497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create new compile unit. 351be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher DBuilder.createCompileUnit(LangTag, Filename, getCurrentDirname(), 352be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher Producer, LO.Optimize, 353ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher CGM.getCodeGenOpts().DwarfDebugFlags, 354ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher RuntimeVers, SplitDwarfFilename); 3557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME - Eliminate TheCU. 3567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TheCU = llvm::DICompileUnit(DBuilder.getCU()); 3577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateType - Get the Basic type from the cache or create a new 3607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// one if necessary. 3617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const BuiltinType *BT) { 3627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Encoding = 0; 3637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef BTName; 3647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (BT->getKind()) { 3657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define BUILTIN_TYPE(Id, SingletonId) 3667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define PLACEHOLDER_TYPE(Id, SingletonId) \ 3677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Id: 3687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/BuiltinTypes.def" 3697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Dependent: 3707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Unexpected builtin type"); 3717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::NullPtr: 37224118f5d62f68b18a75db4eb570a0aaf7f4dda97Peter Collingbourne return DBuilder.createNullPtrType(); 3737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Void: 3747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 3757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ObjCClass: 3767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ClassTy.Verify()) 3777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ClassTy; 3787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ClassTy = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 3797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "objc_class", TheCU, 3807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateMainFile(), 0); 3817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ClassTy; 3827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ObjCId: { 3837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // typedef struct objc_class *Class; 3847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // typedef struct objc_object { 3857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Class isa; 3867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // } *id; 3877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ObjTy.Verify()) 3897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ObjTy; 3907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ClassTy.Verify()) 3927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ClassTy = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 3937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "objc_class", TheCU, 3947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateMainFile(), 0); 3957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 3976537f083555f9606c495d05c562878aa49bae987Eric Christopher 3987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType ISATy = DBuilder.createPointerType(ClassTy, Size); 3997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 400f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher ObjTy = 401c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie DBuilder.createStructType(TheCU, "objc_object", getOrCreateMainFile(), 402c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie 0, 0, 0, 0, llvm::DIType(), llvm::DIArray()); 4037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 404f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher ObjTy.setTypeArray(DBuilder.getOrCreateArray(&*DBuilder.createMemberType( 405f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher ObjTy, "isa", getOrCreateMainFile(), 0, Size, 0, 0, 0, ISATy))); 4067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ObjTy; 4077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ObjCSel: { 4097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SelTy.Verify()) 4107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SelTy; 4117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SelTy = 4127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 4137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "objc_selector", TheCU, getOrCreateMainFile(), 4147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 0); 4157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SelTy; 4167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 417b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei 418b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage1d: 419b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return getOrCreateStructPtrType("opencl_image1d_t", 420b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage1dDITy); 421b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage1dArray: 4226537f083555f9606c495d05c562878aa49bae987Eric Christopher return getOrCreateStructPtrType("opencl_image1d_array_t", 423b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage1dArrayDITy); 424b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage1dBuffer: 425b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return getOrCreateStructPtrType("opencl_image1d_buffer_t", 426b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage1dBufferDITy); 427b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage2d: 428b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return getOrCreateStructPtrType("opencl_image2d_t", 429b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage2dDITy); 430b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage2dArray: 431b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return getOrCreateStructPtrType("opencl_image2d_array_t", 432b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage2dArrayDITy); 433b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage3d: 434b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return getOrCreateStructPtrType("opencl_image3d_t", 435b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage3dDITy); 43621f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei case BuiltinType::OCLSampler: 43721f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei return DBuilder.createBasicType("opencl_sampler_t", 43821f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei CGM.getContext().getTypeSize(BT), 43921f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei CGM.getContext().getTypeAlign(BT), 44021f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei llvm::dwarf::DW_ATE_unsigned); 441e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case BuiltinType::OCLEvent: 442e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei return getOrCreateStructPtrType("opencl_event_t", 443e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei OCLEventDITy); 444b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei 4457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UChar: 4467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char_U: Encoding = llvm::dwarf::DW_ATE_unsigned_char; break; 4477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char_S: 4487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::SChar: Encoding = llvm::dwarf::DW_ATE_signed_char; break; 4497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char16: 4507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char32: Encoding = llvm::dwarf::DW_ATE_UTF; break; 4517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UShort: 4527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UInt: 4537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UInt128: 4547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULong: 4557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::WChar_U: 4567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULongLong: Encoding = llvm::dwarf::DW_ATE_unsigned; break; 4577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Short: 4587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Int: 4597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Int128: 4607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Long: 4617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::WChar_S: 4627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::LongLong: Encoding = llvm::dwarf::DW_ATE_signed; break; 4637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Bool: Encoding = llvm::dwarf::DW_ATE_boolean; break; 4647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Half: 4657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Float: 4667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::LongDouble: 4677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Double: Encoding = llvm::dwarf::DW_ATE_float; break; 4687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (BT->getKind()) { 4717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Long: BTName = "long int"; break; 4727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::LongLong: BTName = "long long int"; break; 4737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULong: BTName = "long unsigned int"; break; 4747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULongLong: BTName = "long long unsigned int"; break; 4757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 4767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BTName = BT->getName(CGM.getLangOpts()); 4777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 4787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 4807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(BT); 4817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(BT); 4826537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIType DbgTy = 4837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createBasicType(BTName, Size, Align, Encoding); 4847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 4857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 4867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ComplexType *Ty) { 4887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 4897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Encoding = llvm::dwarf::DW_ATE_complex_float; 4907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty->isComplexIntegerType()) 4917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Encoding = llvm::dwarf::DW_ATE_lo_user; 4927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 4947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 4956537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIType DbgTy = 4967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createBasicType("complex", Size, Align, Encoding); 4977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 4997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateCVRType - Get the qualified type from the cache or create 5027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a new one if necessary. 50356b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopherllvm::DIType CGDebugInfo::CreateQualifiedType(QualType Ty, llvm::DIFile Unit, 50456b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher bool Declaration) { 5057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualifierCollector Qc; 5067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Type *T = Qc.strip(Ty); 5077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore these qualifiers for now. 5097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeObjCGCAttr(); 5107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeAddressSpace(); 5117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeObjCLifetime(); 5127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We will create one Derived type for one qualifier and recurse to handle any 5147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // additional ones. 5157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Tag; 5167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Qc.hasConst()) { 5177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_const_type; 5187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeConst(); 5197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Qc.hasVolatile()) { 5207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_volatile_type; 5217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeVolatile(); 5227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Qc.hasRestrict()) { 5237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_restrict_type; 5247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeRestrict(); 5257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 5267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Qc.empty() && "Unknown type qualifier for debug info"); 5277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(QualType(T, 0), Unit); 5287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53056b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher llvm::DIType FromTy = 53156b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher getOrCreateType(Qc.apply(CGM.getContext(), T), Unit, Declaration); 5327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // No need to fill in the Name, Line, Size, Alignment, Offset in case of 5347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // CVR derived types. 5357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType DbgTy = DBuilder.createQualifiedType(Tag, FromTy); 5366537f083555f9606c495d05c562878aa49bae987Eric Christopher 5377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 5387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ObjCObjectPointerType *Ty, 5417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 54205f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian 54305f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian // The frontend treats 'id' as a typedef to an ObjCObjectType, 54405f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian // whereas 'id<protocol>' is treated as an ObjCPointerType. For the 54505f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian // debug info, we want to emit 'id' in both cases. 54605f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian if (Ty->isObjCQualifiedIdType()) 54705f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian return getOrCreateType(CGM.getContext().getObjCIdType(), Unit); 54805f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian 5497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType DbgTy = 5506537f083555f9606c495d05c562878aa49bae987Eric Christopher CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty, 5517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty->getPointeeType(), Unit); 5527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 5537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const PointerType *Ty, 5567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 5576537f083555f9606c495d05c562878aa49bae987Eric Christopher return CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty, 5587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty->getPointeeType(), Unit); 5597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Creates a forward declaration for a RecordDecl in the given context. 5627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::createRecordFwdDecl(const RecordDecl *RD, 5637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor Ctx) { 5647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); 5657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(RD->getLocation()); 5667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef RDName = getClassName(RD); 5677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Tag = 0; 5697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RD->isStruct() || RD->isInterface()) 5707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_structure_type; 5717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (RD->isUnion()) 5727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_union_type; 5737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 5747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(RD->isClass()); 5757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_class_type; 5767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the type. 5797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createForwardDecl(Tag, RDName, Ctx, DefUnit, Line); 5807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Walk up the context chain and create forward decls for record decls, 5837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// and normal descriptors for namespaces. 5847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIDescriptor CGDebugInfo::createContextChain(const Decl *Context) { 5857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Context) 5867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TheCU; 5877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // See if we already have the parent. 5897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator 5907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I = RegionMap.find(Context); 5917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (I != RegionMap.end()) { 5927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = I->second; 5937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIDescriptor(dyn_cast_or_null<llvm::MDNode>(V)); 5947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5956537f083555f9606c495d05c562878aa49bae987Eric Christopher 5967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check namespace. 5977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const NamespaceDecl *NSDecl = dyn_cast<NamespaceDecl>(Context)) 5987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIDescriptor(getOrCreateNameSpace(NSDecl)); 5997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const RecordDecl *RD = dyn_cast<RecordDecl>(Context)) { 6017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!RD->isDependentType()) { 602f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher llvm::DIType Ty = 603f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher getOrCreateLimitedType(CGM.getContext().getTypeDeclType(RD), 604f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher getOrCreateMainFile()); 6057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIDescriptor(Ty); 6067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TheCU; 6097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 611b0f77b065761670921fdf9c56029856cb5d9c306David Blaikie/// getOrCreateTypeDeclaration - Create Pointee type. If Pointee is a record 6127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// then emit record's fwd if debug info size reduction is enabled. 613b0f77b065761670921fdf9c56029856cb5d9c306David Blaikiellvm::DIType CGDebugInfo::getOrCreateTypeDeclaration(QualType PointeeTy, 614b0f77b065761670921fdf9c56029856cb5d9c306David Blaikie llvm::DIFile Unit) { 6159faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (DebugKind > CodeGenOptions::LimitedDebugInfo) 6167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(PointeeTy, Unit); 6175f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie return getOrCreateType(PointeeTy, Unit, true); 6187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreatePointerLikeType(unsigned Tag, 6216537f083555f9606c495d05c562878aa49bae987Eric Christopher const Type *Ty, 6227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType PointeeTy, 6237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 6247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Tag == llvm::dwarf::DW_TAG_reference_type || 6257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag == llvm::dwarf::DW_TAG_rvalue_reference_type) 626b0f77b065761670921fdf9c56029856cb5d9c306David Blaikie return DBuilder.createReferenceType( 627b0f77b065761670921fdf9c56029856cb5d9c306David Blaikie Tag, getOrCreateTypeDeclaration(PointeeTy, Unit)); 62805f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian 6297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 6307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Size is always the size of a pointer. We can't use getTypeSize here 6317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // because that does not return the correct value for references. 6327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned AS = CGM.getContext().getTargetAddressSpace(PointeeTy); 63364aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall uint64_t Size = CGM.getTarget().getPointerWidth(AS); 6347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 6357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 636b0f77b065761670921fdf9c56029856cb5d9c306David Blaikie return DBuilder.createPointerType(getOrCreateTypeDeclaration(PointeeTy, Unit), 6377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size, Align); 6387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 640f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopherllvm::DIType CGDebugInfo::getOrCreateStructPtrType(StringRef Name, 641f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher llvm::DIType &Cache) { 6421e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie if (Cache.Verify()) 643b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return Cache; 6441e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie Cache = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, Name, 6451e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie TheCU, getOrCreateMainFile(), 0); 6461e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 6471e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie Cache = DBuilder.createPointerType(Cache, Size); 6481e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie return Cache; 649b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei} 650b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei 6517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const BlockPointerType *Ty, 6527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 6537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (BlockLiteralGenericSet) 6547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return BlockLiteralGeneric; 6557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 8> EltTys; 6577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy; 6587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FType; 6597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize, FieldOffset; 6607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign; 6617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray Elements; 6627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType EltTy, DescTy; 6637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 6657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().UnsignedLongTy; 6667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "reserved", &FieldOffset)); 6677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "Size", &FieldOffset)); 6687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elements = DBuilder.getOrCreateArray(EltTys); 6707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.clear(); 6717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = llvm::DIDescriptor::FlagAppleBlock; 6737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(CurLoc); 6747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTy = DBuilder.createStructType(Unit, "__block_descriptor", 6767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unit, LineNo, FieldOffset, 0, 677c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie Flags, llvm::DIType(), Elements); 6787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 6807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 6817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DescTy = DBuilder.createPointerType(EltTy, Size); 6837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 6857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 6867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset)); 6877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().IntTy; 6887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset)); 6897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__reserved", &FieldOffset)); 6907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 6917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__FuncPtr", &FieldOffset)); 6927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 6947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldTy = DescTy; 6957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize = CGM.getContext().getTypeSize(Ty); 6967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldAlign = CGM.getContext().getTypeAlign(Ty); 6977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldTy = DBuilder.createMemberType(Unit, "__descriptor", Unit, 6987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LineNo, FieldSize, FieldAlign, 6997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset, 0, FieldTy); 7007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(FieldTy); 7017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset += FieldSize; 7037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elements = DBuilder.getOrCreateArray(EltTys); 7047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTy = DBuilder.createStructType(Unit, "__block_literal_generic", 7067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unit, LineNo, FieldOffset, 0, 707c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie Flags, llvm::DIType(), Elements); 7087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BlockLiteralGenericSet = true; 7107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BlockLiteralGeneric = DBuilder.createPointerType(EltTy, Size); 7117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return BlockLiteralGeneric; 7127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7145f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikiellvm::DIType CGDebugInfo::CreateType(const TypedefType *Ty, llvm::DIFile Unit, 7155f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie bool Declaration) { 7167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Typedefs are derived from some other type. If we have a typedef of a 7177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // typedef, make sure to emit the whole chain. 718b0f77b065761670921fdf9c56029856cb5d9c306David Blaikie llvm::DIType Src = 7195f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie getOrCreateType(Ty->getDecl()->getUnderlyingType(), Unit, Declaration); 7207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Src.Verify()) 7217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 7227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We don't set size information, but do specify where the typedef was 7237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // declared. 7247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(Ty->getDecl()->getLocation()); 7257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TypedefNameDecl *TyDecl = Ty->getDecl(); 7266537f083555f9606c495d05c562878aa49bae987Eric Christopher 7277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor TypedefContext = 7287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(cast<Decl>(Ty->getDecl()->getDeclContext())); 7296537f083555f9606c495d05c562878aa49bae987Eric Christopher 7307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 7317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createTypedef(Src, TyDecl->getName(), Unit, Line, TypedefContext); 7327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const FunctionType *Ty, 7357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 7367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> EltTys; 7377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add the result type at least. 7397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(getOrCreateType(Ty->getResultType(), Unit)); 7407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Set up remainder of arguments if there is a prototype. 7427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: IF NOT, HOW IS THIS REPRESENTED? llvm-gcc doesn't represent '...'! 7437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<FunctionNoProtoType>(Ty)) 7447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(DBuilder.createUnspecifiedParameter()); 7457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(Ty)) { 7467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0, e = FPT->getNumArgs(); i != e; ++i) 7477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(getOrCreateType(FPT->getArgType(i), Unit)); 7487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(EltTys); 7517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createSubroutineType(Unit, EltTypeArray); 7527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::createFieldType(StringRef name, 7567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType type, 7577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t sizeInBitsOverride, 7587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation loc, 7597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei AccessSpecifier AS, 7607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t offsetInBits, 7617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile tunit, 7627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor scope) { 7637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType debugType = getOrCreateType(type, tunit); 7647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the location for the field. 7667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile file = getOrCreateFile(loc); 7677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned line = getLineNumber(loc); 7687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t sizeInBits = 0; 7707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned alignInBits = 0; 7717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!type->isIncompleteArrayType()) { 7727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::tie(sizeInBits, alignInBits) = CGM.getContext().getTypeInfo(type); 7737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (sizeInBitsOverride) 7757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei sizeInBits = sizeInBitsOverride; 7767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned flags = 0; 7797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (AS == clang::AS_private) 7807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei flags |= llvm::DIDescriptor::FlagPrivate; 7817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (AS == clang::AS_protected) 7827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei flags |= llvm::DIDescriptor::FlagProtected; 7837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createMemberType(scope, name, file, line, sizeInBits, 7857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei alignInBits, offsetInBits, flags, debugType); 7867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7880395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// CollectRecordLambdaFields - Helper for CollectRecordFields. 7890395de36004a718e265cc256b1bbee3bd3a791dcEric Christophervoid CGDebugInfo:: 7900395de36004a718e265cc256b1bbee3bd3a791dcEric ChristopherCollectRecordLambdaFields(const CXXRecordDecl *CXXDecl, 7910395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SmallVectorImpl<llvm::Value *> &elements, 7920395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType RecordTy) { 7930395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // For C++11 Lambdas a Field will be the same as a Capture, but the Capture 7940395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // has the name and the location of the variable so we should iterate over 7950395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // both concurrently. 7960395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(CXXDecl); 7970395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher RecordDecl::field_iterator Field = CXXDecl->field_begin(); 7980395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher unsigned fieldno = 0; 7990395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher for (CXXRecordDecl::capture_const_iterator I = CXXDecl->captures_begin(), 8000395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher E = CXXDecl->captures_end(); I != E; ++I, ++Field, ++fieldno) { 8010395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const LambdaExpr::Capture C = *I; 8020395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (C.capturesVariable()) { 8030395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher VarDecl *V = C.getCapturedVar(); 8040395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIFile VUnit = getOrCreateFile(C.getLocation()); 8050395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StringRef VName = V->getName(); 8060395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher uint64_t SizeInBitsOverride = 0; 8070395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (Field->isBitField()) { 8080395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SizeInBitsOverride = Field->getBitWidthValue(CGM.getContext()); 8090395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher assert(SizeInBitsOverride && "found named 0-width bitfield"); 8100395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 8110395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType fieldType 8120395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher = createFieldType(VName, Field->getType(), SizeInBitsOverride, 8130395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher C.getLocation(), Field->getAccess(), 8140395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher layout.getFieldOffset(fieldno), VUnit, RecordTy); 8150395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher elements.push_back(fieldType); 8160395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } else { 8170395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // TODO: Need to handle 'this' in some way by probably renaming the 8180395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // this of the lambda class and having a field member of 'this' or 8190395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // by using AT_object_pointer for the function and having that be 8200395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // used as 'this' for semantic references. 8210395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher assert(C.capturesThis() && "Field that isn't captured and isn't this?"); 8220395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher FieldDecl *f = *Field; 8230395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIFile VUnit = getOrCreateFile(f->getLocation()); 8240395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher QualType type = f->getType(); 8250395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType fieldType 8260395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher = createFieldType("this", type, 0, f->getLocation(), f->getAccess(), 8270395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher layout.getFieldOffset(fieldno), VUnit, RecordTy); 8280395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8290395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher elements.push_back(fieldType); 8300395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 8310395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 8320395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher} 8330395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8340395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// CollectRecordStaticField - Helper for CollectRecordFields. 8350395de36004a718e265cc256b1bbee3bd3a791dcEric Christophervoid CGDebugInfo:: 8360395de36004a718e265cc256b1bbee3bd3a791dcEric ChristopherCollectRecordStaticField(const VarDecl *Var, 8370395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SmallVectorImpl<llvm::Value *> &elements, 8380395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType RecordTy) { 8390395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Create the descriptor for the static variable, with or without 8400395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // constant initializers. 8410395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIFile VUnit = getOrCreateFile(Var->getLocation()); 8420395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType VTy = getOrCreateType(Var->getType(), VUnit); 8430395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8440395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Do not describe enums as static members. 8450395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (VTy.getTag() == llvm::dwarf::DW_TAG_enumeration_type) 8460395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher return; 8470395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8480395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher unsigned LineNumber = getLineNumber(Var->getLocation()); 8490395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StringRef VName = Var->getName(); 850a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie llvm::Constant *C = NULL; 8510395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (Var->getInit()) { 8520395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const APValue *Value = Var->evaluateValue(); 853a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie if (Value) { 854a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie if (Value->isInt()) 855a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie C = llvm::ConstantInt::get(CGM.getLLVMContext(), Value->getInt()); 856a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie if (Value->isFloat()) 857a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie C = llvm::ConstantFP::get(CGM.getLLVMContext(), Value->getFloat()); 858a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie } 8590395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 8600395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8610395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher unsigned Flags = 0; 8620395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher AccessSpecifier Access = Var->getAccess(); 8630395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (Access == clang::AS_private) 8640395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher Flags |= llvm::DIDescriptor::FlagPrivate; 8650395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher else if (Access == clang::AS_protected) 8660395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher Flags |= llvm::DIDescriptor::FlagProtected; 8670395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8680395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType GV = DBuilder.createStaticMemberType(RecordTy, VName, VUnit, 869a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie LineNumber, VTy, Flags, C); 8700395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher elements.push_back(GV); 8710395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StaticDataMemberCache[Var->getCanonicalDecl()] = llvm::WeakVH(GV); 8720395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher} 8730395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8740395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// CollectRecordNormalField - Helper for CollectRecordFields. 8750395de36004a718e265cc256b1bbee3bd3a791dcEric Christophervoid CGDebugInfo:: 8760395de36004a718e265cc256b1bbee3bd3a791dcEric ChristopherCollectRecordNormalField(const FieldDecl *field, uint64_t OffsetInBits, 8770395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIFile tunit, 8780395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SmallVectorImpl<llvm::Value *> &elements, 8790395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType RecordTy) { 8800395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StringRef name = field->getName(); 8810395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher QualType type = field->getType(); 8820395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8830395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Ignore unnamed fields unless they're anonymous structs/unions. 8840395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (name.empty() && !type->isRecordType()) 8850395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher return; 8860395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8870395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher uint64_t SizeInBitsOverride = 0; 8880395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (field->isBitField()) { 8890395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SizeInBitsOverride = field->getBitWidthValue(CGM.getContext()); 8900395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher assert(SizeInBitsOverride && "found named 0-width bitfield"); 8910395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 8920395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8930395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType fieldType 8940395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher = createFieldType(name, type, SizeInBitsOverride, 8950395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher field->getLocation(), field->getAccess(), 8960395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher OffsetInBits, tunit, RecordTy); 8970395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8980395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher elements.push_back(fieldType); 8990395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher} 9000395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectRecordFields - A helper function to collect debug info for 9027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// record fields. This is used while creating debug info entry for a Record. 9037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 9047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectRecordFields(const RecordDecl *record, llvm::DIFile tunit, 9057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &elements, 9067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 9077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(record); 9087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9090395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (CXXDecl && CXXDecl->isLambda()) 9100395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher CollectRecordLambdaFields(CXXDecl, elements, RecordTy); 9110395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher else { 9120395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(record); 9130395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9140395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Field number for non-static fields. 915fd5ac0d75abd6ead8dd39bf526b34eeaff81cef6Eric Christopher unsigned fieldNo = 0; 9160395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9170395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Static and non-static members should appear in the same order as 9180395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // the corresponding declarations in the source program. 9190395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher for (RecordDecl::decl_iterator I = record->decls_begin(), 9200395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher E = record->decls_end(); I != E; ++I) 9210395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (const VarDecl *V = dyn_cast<VarDecl>(*I)) 9220395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher CollectRecordStaticField(V, elements, RecordTy); 9230395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher else if (FieldDecl *field = dyn_cast<FieldDecl>(*I)) { 9240395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher CollectRecordNormalField(field, layout.getFieldOffset(fieldNo), 9250395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher tunit, elements, RecordTy); 9267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9270395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Bump field number for next field. 9280395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher ++fieldNo; 9297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 9327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateMethodType - CXXMethodDecl's type is a FunctionType. This 9347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// function type is not updated to include implicit "this" pointer. Use this 9357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// routine to get a method type which includes "this" pointer. 9369a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikiellvm::DICompositeType 9377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::getOrCreateMethodType(const CXXMethodDecl *Method, 9387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 9399c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie const FunctionProtoType *Func = Method->getType()->getAs<FunctionProtoType>(); 94067f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie if (Method->isStatic()) 9419a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie return llvm::DICompositeType(getOrCreateType(QualType(Func, 0), Unit)); 9429c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie return getOrCreateInstanceMethodType(Method->getThisType(CGM.getContext()), 9439c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie Func, Unit); 9449c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie} 94567f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie 9469a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikiellvm::DICompositeType CGDebugInfo::getOrCreateInstanceMethodType( 9479c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie QualType ThisPtr, const FunctionProtoType *Func, llvm::DIFile Unit) { 9487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add "this" pointer. 9499c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie llvm::DIArray Args = llvm::DICompositeType( 9509c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie getOrCreateType(QualType(Func, 0), Unit)).getTypeArray(); 9517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert (Args.getNumElements() && "Invalid number of arguments!"); 9527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> Elts; 9547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // First element is always return type. For 'void' functions it is NULL. 9567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elts.push_back(Args.getElement(0)); 9577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 95867f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // "this" pointer is always first argument. 9599c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie const CXXRecordDecl *RD = ThisPtr->getPointeeCXXRecordDecl(); 96067f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie if (isa<ClassTemplateSpecializationDecl>(RD)) { 96167f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // Create pointer type directly in this case. 96267f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie const PointerType *ThisPtrTy = cast<PointerType>(ThisPtr); 96367f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie QualType PointeeTy = ThisPtrTy->getPointeeType(); 96467f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie unsigned AS = CGM.getContext().getTargetAddressSpace(PointeeTy); 96564aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall uint64_t Size = CGM.getTarget().getPointerWidth(AS); 96667f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie uint64_t Align = CGM.getContext().getTypeAlign(ThisPtrTy); 96767f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie llvm::DIType PointeeType = getOrCreateType(PointeeTy, Unit); 968f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher llvm::DIType ThisPtrType = 969f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher DBuilder.createPointerType(PointeeType, Size, Align); 97067f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie TypeCache[ThisPtr.getAsOpaquePtr()] = ThisPtrType; 97167f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // TODO: This and the artificial type below are misleading, the 97267f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // types aren't artificial the argument is, but the current 97367f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // metadata doesn't represent that. 97467f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType); 97567f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie Elts.push_back(ThisPtrType); 97667f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie } else { 97767f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie llvm::DIType ThisPtrType = getOrCreateType(ThisPtr, Unit); 97867f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie TypeCache[ThisPtr.getAsOpaquePtr()] = ThisPtrType; 97967f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType); 98067f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie Elts.push_back(ThisPtrType); 9817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Copy rest of the arguments. 9847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 1, e = Args.getNumElements(); i != e; ++i) 9857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elts.push_back(Args.getElement(i)); 9867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(Elts); 9887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createSubroutineType(Unit, EltTypeArray); 9907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 9917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9926537f083555f9606c495d05c562878aa49bae987Eric Christopher/// isFunctionLocalClass - Return true if CXXRecordDecl is defined 9937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// inside a function. 9947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool isFunctionLocalClass(const CXXRecordDecl *RD) { 9957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXRecordDecl *NRD = dyn_cast<CXXRecordDecl>(RD->getDeclContext())) 9967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return isFunctionLocalClass(NRD); 9977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<FunctionDecl>(RD->getDeclContext())) 9987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 9997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 10007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateCXXMemberFunction - A helper function to create a DISubprogram for 10037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a single member function GlobalDecl. 10047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DISubprogram 10057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::CreateCXXMemberFunction(const CXXMethodDecl *Method, 10067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit, 10077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 10086537f083555f9606c495d05c562878aa49bae987Eric Christopher bool IsCtorOrDtor = 10097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei isa<CXXConstructorDecl>(Method) || isa<CXXDestructorDecl>(Method); 10106537f083555f9606c495d05c562878aa49bae987Eric Christopher 10117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef MethodName = getFunctionName(Method); 10129a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie llvm::DICompositeType MethodTy = getOrCreateMethodType(Method, Unit); 10137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Since a single ctor/dtor corresponds to multiple functions, it doesn't 10157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // make sense to give a single ctor/dtor a linkage name. 10167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef MethodLinkageName; 10177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!IsCtorOrDtor && !isFunctionLocalClass(Method->getParent())) 10187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MethodLinkageName = CGM.getMangledName(Method); 10197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the location for the method. 10217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile MethodDefUnit = getOrCreateFile(Method->getLocation()); 10227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned MethodLine = getLineNumber(Method->getLocation()); 10237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Collect virtual method info. 10257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType ContainingType; 10266537f083555f9606c495d05c562878aa49bae987Eric Christopher unsigned Virtuality = 0; 10277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned VIndex = 0; 10286537f083555f9606c495d05c562878aa49bae987Eric Christopher 10297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->isVirtual()) { 10307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->isPure()) 10317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Virtuality = llvm::dwarf::DW_VIRTUALITY_pure_virtual; 10327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 10337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Virtuality = llvm::dwarf::DW_VIRTUALITY_virtual; 10346537f083555f9606c495d05c562878aa49bae987Eric Christopher 10357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // It doesn't make sense to give a virtual destructor a vtable index, 10367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // since a single destructor has two entries in the vtable. 10377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!isa<CXXDestructorDecl>(Method)) 10387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VIndex = CGM.getVTableContext().getMethodVTableIndex(Method); 10397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContainingType = RecordTy; 10407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 10437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->isImplicit()) 10447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagArtificial; 10457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei AccessSpecifier Access = Method->getAccess(); 10467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Access == clang::AS_private) 10477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrivate; 10487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (Access == clang::AS_protected) 10497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagProtected; 10507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXConstructorDecl *CXXC = dyn_cast<CXXConstructorDecl>(Method)) { 10517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXC->isExplicit()) 10527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagExplicit; 10536537f083555f9606c495d05c562878aa49bae987Eric Christopher } else if (const CXXConversionDecl *CXXC = 10547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<CXXConversionDecl>(Method)) { 10557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXC->isExplicit()) 10567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagExplicit; 10577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->hasPrototype()) 10597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrototyped; 10607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray TParamsArray = CollectFunctionTemplateParams(Method, Unit); 10627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DISubprogram SP = 10636537f083555f9606c495d05c562878aa49bae987Eric Christopher DBuilder.createMethod(RecordTy, MethodName, MethodLinkageName, 10647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MethodDefUnit, MethodLine, 10656537f083555f9606c495d05c562878aa49bae987Eric Christopher MethodTy, /*isLocalToUnit=*/false, 10667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /* isDefinition=*/ false, 10677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Virtuality, VIndex, ContainingType, 10687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags, CGM.getLangOpts().Optimize, NULL, 10697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TParamsArray); 10706537f083555f9606c495d05c562878aa49bae987Eric Christopher 10717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SPCache[Method->getCanonicalDecl()] = llvm::WeakVH(SP); 10727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SP; 10747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectCXXMemberFunctions - A helper function to collect debug info for 10776537f083555f9606c495d05c562878aa49bae987Eric Christopher/// C++ member functions. This is used while creating debug info entry for 10787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a Record. 10797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 10807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectCXXMemberFunctions(const CXXRecordDecl *RD, llvm::DIFile Unit, 10817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &EltTys, 10827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 10837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Since we want more than just the individual member decls if we 10857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // have templated functions iterate over every declaration to gather 10867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the functions. 10877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for(DeclContext::decl_iterator I = RD->decls_begin(), 10887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = RD->decls_end(); I != E; ++I) { 10897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decl *D = *I; 10907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (D->isImplicit() && !D->isUsed()) 10917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 10927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) 10947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateCXXMemberFunction(Method, Unit, RecordTy)); 10957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (FunctionTemplateDecl *FTD = dyn_cast<FunctionTemplateDecl>(D)) 10967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (FunctionTemplateDecl::spec_iterator SI = FTD->spec_begin(), 10977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SE = FTD->spec_end(); SI != SE; ++SI) 10987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateCXXMemberFunction(cast<CXXMethodDecl>(*SI), Unit, 10997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordTy)); 11007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11016537f083555f9606c495d05c562878aa49bae987Eric Christopher} 11027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectCXXFriends - A helper function to collect debug info for 11047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// C++ base classes. This is used while creating debug info entry for 11057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a Record. 11067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 11077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectCXXFriends(const CXXRecordDecl *RD, llvm::DIFile Unit, 11087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &EltTys, 11097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 11107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (CXXRecordDecl::friend_iterator BI = RD->friend_begin(), 11117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BE = RD->friend_end(); BI != BE; ++BI) { 11127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if ((*BI)->isUnsupportedFriend()) 11137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 11147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TypeSourceInfo *TInfo = (*BI)->getFriendType()) 11156537f083555f9606c495d05c562878aa49bae987Eric Christopher EltTys.push_back(DBuilder.createFriend(RecordTy, 11166537f083555f9606c495d05c562878aa49bae987Eric Christopher getOrCreateType(TInfo->getType(), 11177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unit))); 11187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 11207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectCXXBases - A helper function to collect debug info for 11226537f083555f9606c495d05c562878aa49bae987Eric Christopher/// C++ base classes. This is used while creating debug info entry for 11237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a Record. 11247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 11257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile Unit, 11267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &EltTys, 11277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 11287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 11307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (CXXRecordDecl::base_class_const_iterator BI = RD->bases_begin(), 11317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BE = RD->bases_end(); BI != BE; ++BI) { 11327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned BFlags = 0; 11337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t BaseOffset; 11346537f083555f9606c495d05c562878aa49bae987Eric Christopher 11357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *Base = 11367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<CXXRecordDecl>(BI->getType()->getAs<RecordType>()->getDecl()); 11376537f083555f9606c495d05c562878aa49bae987Eric Christopher 11387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (BI->isVirtual()) { 11397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // virtual base offset offset is -ve. The code generator emits dwarf 11407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // expression where it expects +ve number. 11416537f083555f9606c495d05c562878aa49bae987Eric Christopher BaseOffset = 11427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 0 - CGM.getVTableContext() 11437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei .getVirtualBaseOffsetOffset(RD, Base).getQuantity(); 11447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BFlags = llvm::DIDescriptor::FlagVirtual; 11457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else 11467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BaseOffset = CGM.getContext().toBits(RL.getBaseClassOffset(Base)); 11477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Inconsistent units for BaseOffset. It is in bytes when 11487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // BI->isVirtual() and bits when not. 11496537f083555f9606c495d05c562878aa49bae987Eric Christopher 11507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei AccessSpecifier Access = BI->getAccessSpecifier(); 11517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Access == clang::AS_private) 11527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BFlags |= llvm::DIDescriptor::FlagPrivate; 11537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (Access == clang::AS_protected) 11547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BFlags |= llvm::DIDescriptor::FlagProtected; 11556537f083555f9606c495d05c562878aa49bae987Eric Christopher 11566537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIType DTy = 11576537f083555f9606c495d05c562878aa49bae987Eric Christopher DBuilder.createInheritance(RecordTy, 11587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(BI->getType(), Unit), 11597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BaseOffset, BFlags); 11607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(DTy); 11617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 11637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectTemplateParams - A helper function to collect template parameters. 11657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIArray CGDebugInfo:: 11667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectTemplateParams(const TemplateParameterList *TPList, 116735178dc09d97bb2e0612813def09833866e3ad82David Blaikie ArrayRef<TemplateArgument> TAList, 11687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 11696537f083555f9606c495d05c562878aa49bae987Eric Christopher SmallVector<llvm::Value *, 16> TemplateParams; 11707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0, e = TAList.size(); i != e; ++i) { 11717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgument &TA = TAList[i]; 117235178dc09d97bb2e0612813def09833866e3ad82David Blaikie StringRef Name; 117335178dc09d97bb2e0612813def09833866e3ad82David Blaikie if (TPList) 117435178dc09d97bb2e0612813def09833866e3ad82David Blaikie Name = TPList->getParam(i)->getName(); 11759dfd24324c079b564dda936c6ae46898b82121e2David Blaikie switch (TA.getKind()) { 11769dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Type: { 11777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType TTy = getOrCreateType(TA.getAsType(), Unit); 11787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DITemplateTypeParameter TTP = 117935178dc09d97bb2e0612813def09833866e3ad82David Blaikie DBuilder.createTemplateTypeParameter(TheCU, Name, TTy); 11807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateParams.push_back(TTP); 11819dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 11829dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Integral: { 11837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType TTy = getOrCreateType(TA.getIntegralType(), Unit); 11847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DITemplateValueParameter TVP = 11859dfd24324c079b564dda936c6ae46898b82121e2David Blaikie DBuilder.createTemplateValueParameter( 118635178dc09d97bb2e0612813def09833866e3ad82David Blaikie TheCU, Name, TTy, 11879dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::ConstantInt::get(CGM.getLLVMContext(), TA.getAsIntegral())); 11889dfd24324c079b564dda936c6ae46898b82121e2David Blaikie TemplateParams.push_back(TVP); 11899dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 11909dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Declaration: { 11919dfd24324c079b564dda936c6ae46898b82121e2David Blaikie const ValueDecl *D = TA.getAsDecl(); 11929dfd24324c079b564dda936c6ae46898b82121e2David Blaikie bool InstanceMember = D->isCXXInstanceMember(); 11939dfd24324c079b564dda936c6ae46898b82121e2David Blaikie QualType T = InstanceMember 11949dfd24324c079b564dda936c6ae46898b82121e2David Blaikie ? CGM.getContext().getMemberPointerType( 11959dfd24324c079b564dda936c6ae46898b82121e2David Blaikie D->getType(), cast<RecordDecl>(D->getDeclContext()) 11969dfd24324c079b564dda936c6ae46898b82121e2David Blaikie ->getTypeForDecl()) 11979dfd24324c079b564dda936c6ae46898b82121e2David Blaikie : CGM.getContext().getPointerType(D->getType()); 11989dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::DIType TTy = getOrCreateType(T, Unit); 11999dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::Value *V = 0; 12009dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Variable pointer template parameters have a value that is the address 12019dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // of the variable. 12029dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (const VarDecl *VD = dyn_cast<VarDecl>(D)) 12039dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.GetAddrOfGlobalVar(VD); 12049dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Member function pointers have special support for building them, though 12059dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // this is currently unsupported in LLVM CodeGen. 1206f8aa155e40bc98844f46ecbfdbe430696c36ce24David Blaikie if (InstanceMember) { 12079dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (const CXXMethodDecl *method = dyn_cast<CXXMethodDecl>(D)) 12089dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.getCXXABI().EmitMemberPointer(method); 1209f8aa155e40bc98844f46ecbfdbe430696c36ce24David Blaikie } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) 1210f8aa155e40bc98844f46ecbfdbe430696c36ce24David Blaikie V = CGM.GetAddrOfFunction(FD); 12119dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Member data pointers have special handling too to compute the fixed 12129dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // offset within the object. 12139dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (isa<FieldDecl>(D)) { 12149dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // These five lines (& possibly the above member function pointer 12159dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // handling) might be able to be refactored to use similar code in 12169dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // CodeGenModule::getMemberPointerConstant 12179dfd24324c079b564dda936c6ae46898b82121e2David Blaikie uint64_t fieldOffset = CGM.getContext().getFieldOffset(D); 12189dfd24324c079b564dda936c6ae46898b82121e2David Blaikie CharUnits chars = 12199dfd24324c079b564dda936c6ae46898b82121e2David Blaikie CGM.getContext().toCharUnitsFromBits((int64_t) fieldOffset); 12209dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.getCXXABI().EmitMemberDataPointer( 12219dfd24324c079b564dda936c6ae46898b82121e2David Blaikie cast<MemberPointerType>(T.getTypePtr()), chars); 12229dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } 12239dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::DITemplateValueParameter TVP = 122435178dc09d97bb2e0612813def09833866e3ad82David Blaikie DBuilder.createTemplateValueParameter(TheCU, Name, TTy, V); 12259dfd24324c079b564dda936c6ae46898b82121e2David Blaikie TemplateParams.push_back(TVP); 12269dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 12279dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::NullPtr: { 12289dfd24324c079b564dda936c6ae46898b82121e2David Blaikie QualType T = TA.getNullPtrType(); 12299dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::DIType TTy = getOrCreateType(T, Unit); 12309dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::Value *V = 0; 12319dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Special case member data pointer null values since they're actually -1 12329dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // instead of zero. 12339dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (const MemberPointerType *MPT = 12349dfd24324c079b564dda936c6ae46898b82121e2David Blaikie dyn_cast<MemberPointerType>(T.getTypePtr())) 12359dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // But treat member function pointers as simple zero integers because 12369dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // it's easier than having a special case in LLVM's CodeGen. If LLVM 12379dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // CodeGen grows handling for values of non-null member function 12389dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // pointers then perhaps we could remove this special case and rely on 12399dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // EmitNullMemberPointer for member function pointers. 12409dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (MPT->isMemberDataPointer()) 12419dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.getCXXABI().EmitNullMemberPointer(MPT); 12429dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (!V) 12439dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = llvm::ConstantInt::get(CGM.Int8Ty, 0); 12449dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::DITemplateValueParameter TVP = 124535178dc09d97bb2e0612813def09833866e3ad82David Blaikie DBuilder.createTemplateValueParameter(TheCU, Name, TTy, V); 124635178dc09d97bb2e0612813def09833866e3ad82David Blaikie TemplateParams.push_back(TVP); 124735178dc09d97bb2e0612813def09833866e3ad82David Blaikie } break; 124835178dc09d97bb2e0612813def09833866e3ad82David Blaikie case TemplateArgument::Template: { 124935178dc09d97bb2e0612813def09833866e3ad82David Blaikie llvm::DITemplateValueParameter TVP = 125035178dc09d97bb2e0612813def09833866e3ad82David Blaikie DBuilder.createTemplateTemplateParameter( 125135178dc09d97bb2e0612813def09833866e3ad82David Blaikie TheCU, Name, llvm::DIType(), 125235178dc09d97bb2e0612813def09833866e3ad82David Blaikie TA.getAsTemplate().getAsTemplateDecl() 125335178dc09d97bb2e0612813def09833866e3ad82David Blaikie ->getQualifiedNameAsString()); 125435178dc09d97bb2e0612813def09833866e3ad82David Blaikie TemplateParams.push_back(TVP); 125535178dc09d97bb2e0612813def09833866e3ad82David Blaikie } break; 125635178dc09d97bb2e0612813def09833866e3ad82David Blaikie case TemplateArgument::Pack: { 125735178dc09d97bb2e0612813def09833866e3ad82David Blaikie llvm::DITemplateValueParameter TVP = 125835178dc09d97bb2e0612813def09833866e3ad82David Blaikie DBuilder.createTemplateParameterPack( 125935178dc09d97bb2e0612813def09833866e3ad82David Blaikie TheCU, Name, llvm::DIType(), 126035178dc09d97bb2e0612813def09833866e3ad82David Blaikie CollectTemplateParams(NULL, TA.getPackAsArray(), Unit)); 12619dfd24324c079b564dda936c6ae46898b82121e2David Blaikie TemplateParams.push_back(TVP); 12629dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 1263e8065128777e13322aa2b4de86a362326e0c7686David Blaikie // And the following should never occur: 12649dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Expression: 12659dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::TemplateExpansion: 12669dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Null: 12679dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm_unreachable( 12689dfd24324c079b564dda936c6ae46898b82121e2David Blaikie "These argument types shouldn't exist in concrete types"); 12697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.getOrCreateArray(TemplateParams); 12727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 12737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectFunctionTemplateParams - A helper function to collect debug 12757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// info for function template parameters. 12767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIArray CGDebugInfo:: 12777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectFunctionTemplateParams(const FunctionDecl *FD, llvm::DIFile Unit) { 12787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FD->getTemplatedKind() == 12797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionDecl::TK_FunctionTemplateSpecialization) { 12807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateParameterList *TList = 12817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FD->getTemplateSpecializationInfo()->getTemplate() 12827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ->getTemplateParameters(); 128335178dc09d97bb2e0612813def09833866e3ad82David Blaikie return CollectTemplateParams( 128435178dc09d97bb2e0612813def09833866e3ad82David Blaikie TList, FD->getTemplateSpecializationArgs()->asArray(), Unit); 12857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIArray(); 12877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 12887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectCXXTemplateParams - A helper function to collect debug info for 12907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// template parameters. 12917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIArray CGDebugInfo:: 12927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectCXXTemplateParams(const ClassTemplateSpecializationDecl *TSpecial, 12937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 12947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::PointerUnion<ClassTemplateDecl *, 12957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ClassTemplatePartialSpecializationDecl *> 12967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PU = TSpecial->getSpecializedTemplateOrPartial(); 12976537f083555f9606c495d05c562878aa49bae987Eric Christopher 12987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateParameterList *TPList = PU.is<ClassTemplateDecl *>() ? 12997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PU.get<ClassTemplateDecl *>()->getTemplateParameters() : 13007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PU.get<ClassTemplatePartialSpecializationDecl *>()->getTemplateParameters(); 13017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgumentList &TAList = TSpecial->getTemplateInstantiationArgs(); 130235178dc09d97bb2e0612813def09833866e3ad82David Blaikie return CollectTemplateParams(TPList, TAList.asArray(), Unit); 13037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateVTablePtrType - Return debug info descriptor for vtable. 13067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getOrCreateVTablePtrType(llvm::DIFile Unit) { 13077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VTablePtrType.isValid()) 13087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VTablePtrType; 13097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTContext &Context = CGM.getContext(); 13117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /* Function type */ 13137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *STy = getOrCreateType(Context.IntTy, Unit); 13147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray SElements = DBuilder.getOrCreateArray(STy); 13157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType SubTy = DBuilder.createSubroutineType(Unit, SElements); 13167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Size = Context.getTypeSize(Context.VoidPtrTy); 13177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType vtbl_ptr_type = DBuilder.createPointerType(SubTy, Size, 0, 13187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "__vtbl_ptr_type"); 13197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTablePtrType = DBuilder.createPointerType(vtbl_ptr_type, Size); 13207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VTablePtrType; 13217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getVTableName - Get vtable name for the given Class. 13247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getVTableName(const CXXRecordDecl *RD) { 13257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Construct gdb compatible name name. 13267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Name = "_vptr$" + RD->getNameAsString(); 13277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Copy this name on the side and use its reference. 13297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei char *StrPtr = DebugInfoNames.Allocate<char>(Name.length()); 13307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(StrPtr, Name.data(), Name.length()); 13317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return StringRef(StrPtr, Name.length()); 13327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectVTableInfo - If the C++ class has vtable info then insert appropriate 13367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// debug info entry in EltTys vector. 13377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 13387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile Unit, 13397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &EltTys) { 13407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 13417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there is a primary base then it will hold vtable info. 13437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RL.getPrimaryBase()) 13447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 13457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this class is not dynamic then there is not any vtable info to collect. 13477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!RD->isDynamicClass()) 13487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 13497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 13517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType VPTR 13527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = DBuilder.createMemberType(Unit, getVTableName(RD), Unit, 1353f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher 0, Size, 0, 0, 1354f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher llvm::DIDescriptor::FlagArtificial, 13557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateVTablePtrType(Unit)); 13567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(VPTR); 13577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13596537f083555f9606c495d05c562878aa49bae987Eric Christopher/// getOrCreateRecordType - Emit record type's standalone debug info. 13606537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DIType CGDebugInfo::getOrCreateRecordType(QualType RTy, 13617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc) { 136213c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 13637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType T = getOrCreateType(RTy, getOrCreateFile(Loc)); 13647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 13657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateInterfaceType - Emit an objective c interface type standalone 13687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// debug info. 13697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getOrCreateInterfaceType(QualType D, 1370be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher SourceLocation Loc) { 137113c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 13727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType T = getOrCreateType(D, getOrCreateFile(Loc)); 1373ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl RetainedTypes.push_back(D.getAsOpaquePtr()); 13747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 13757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateType - get structure or union type. 13785f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikiellvm::DIType CGDebugInfo::CreateType(const RecordType *Ty, bool Declaration) { 13797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordDecl *RD = Ty->getDecl(); 1380776bfa16c96d501c7fd51beb14f929fa4736caacAdrian Prantl // Limited debug info should only remove struct definitions that can 1381776bfa16c96d501c7fd51beb14f929fa4736caacAdrian Prantl // safely be replaced by a forward declaration in the source code. 138214c1a13e64808ccd2c39155793194ce499d82ca3Adrian Prantl if (DebugKind <= CodeGenOptions::LimitedDebugInfo && Declaration) { 1383776bfa16c96d501c7fd51beb14f929fa4736caacAdrian Prantl // FIXME: This implementation is problematic; there are some test 1384776bfa16c96d501c7fd51beb14f929fa4736caacAdrian Prantl // cases where we violate the above principle, such as 1385776bfa16c96d501c7fd51beb14f929fa4736caacAdrian Prantl // test/CodeGen/debug-info-records.c . 13865f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie llvm::DIDescriptor FDContext = 13875f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie getContextDescriptor(cast<Decl>(RD->getDeclContext())); 13885f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie llvm::DIType RetTy = createRecordFwdDecl(RD, FDContext); 13895f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = RetTy; 13905f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie return RetTy; 13915f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie } 13927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the record type for the debug info. 13947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); 13957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Records and classes and unions can all be recursive. To handle them, we 13977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // first generate a debug descriptor for the struct as a forward declaration. 13987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Then (if it is a definition) we go through and get debug info for all of 13997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // its members. Finally, we create a descriptor for the complete type (which 14007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // may refer to the forward decl if the struct is recursive) and replace all 14017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // uses of the forward declaration with the final definition. 14027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1403f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher llvm::DICompositeType FwdDecl( 1404f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher getOrCreateLimitedType(QualType(Ty, 0), DefUnit)); 1405f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher assert(FwdDecl.Verify() && 14069a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie "The debug type of a RecordType should be a llvm::DICompositeType"); 14077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FwdDecl.isForwardDecl()) 14097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return FwdDecl; 14107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Push the struct on region stack. 1412f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher LexicalBlockStack.push_back(&*FwdDecl); 14137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl); 14147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14154919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl // Add this to the completed-type cache while we're completing it recursively. 14167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CompletedTypeCache[QualType(Ty, 0).getAsOpaquePtr()] = FwdDecl; 14177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Convert all the elements. 14197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> EltTys; 14207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Note: The split of CXXDecl information here is intentional, the 14227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // gdb tests will depend on a certain ordering at printout. The debug 14237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // information offsets are still correct if we merge them all together 14247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // though. 14257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD); 14267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXDecl) { 14277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectCXXBases(CXXDecl, DefUnit, EltTys, FwdDecl); 14287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectVTableInfo(CXXDecl, DefUnit, EltTys); 14297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 14307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14310395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Collect data fields (including static variables and any initializers). 14327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectRecordFields(RD, DefUnit, EltTys, FwdDecl); 14337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray TParamsArray; 14347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXDecl) { 14357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectCXXMemberFunctions(CXXDecl, DefUnit, EltTys, FwdDecl); 14367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectCXXFriends(CXXDecl, DefUnit, EltTys, FwdDecl); 14377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const ClassTemplateSpecializationDecl *TSpecial 14387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast<ClassTemplateSpecializationDecl>(RD)) 14397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TParamsArray = CollectCXXTemplateParams(TSpecial, DefUnit); 14407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 14417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 14437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap.erase(Ty->getDecl()); 14447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys); 1446f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher FwdDecl.setTypeArray(Elements, TParamsArray); 1447bd0152fb251e84c6f335c66322b83a9af09fed0cNico Weber 1448f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl); 1449f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher return FwdDecl; 14507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateType - get objective-c object type. 14537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ObjCObjectType *Ty, 14547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 14557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore protocols. 14567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(Ty->getBaseType(), Unit); 14577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14595ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 14605ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl/// \return true if Getter has the default name for the property PD. 14615ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantlstatic bool hasDefaultGetterName(const ObjCPropertyDecl *PD, 14625ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl const ObjCMethodDecl *Getter) { 14635ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl assert(PD); 14645ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl if (!Getter) 14655ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl return true; 14665ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 14675ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl assert(Getter->getDeclName().isObjCZeroArgSelector()); 14685ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl return PD->getName() == 14695ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl Getter->getDeclName().getObjCSelector().getNameForSlot(0); 14705ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl} 14715ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 14725ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl/// \return true if Setter has the default name for the property PD. 14735ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantlstatic bool hasDefaultSetterName(const ObjCPropertyDecl *PD, 14745ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl const ObjCMethodDecl *Setter) { 14755ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl assert(PD); 14765ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl if (!Setter) 14775ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl return true; 14785ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 14795ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl assert(Setter->getDeclName().isObjCOneArgSelector()); 148080e8ea92d6dcaa05165dcb4730485db82dcd4629Adrian Prantl return SelectorTable::constructSetterName(PD->getName()) == 14815ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl Setter->getDeclName().getObjCSelector().getNameForSlot(0); 14825ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl} 14835ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 14847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateType - get objective-c interface type. 14857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, 14867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 14877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *ID = Ty->getDecl(); 14887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ID) 14897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 14907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the record type for the debug info. 14927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(ID->getLocation()); 14937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(ID->getLocation()); 14947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RuntimeLang = TheCU.getLanguage(); 14957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is just a forward declaration return a special forward-declaration 14977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // debug type since we won't be able to lay out the entire type. 14987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *Def = ID->getDefinition(); 14997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Def) { 15007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FwdDecl = 15017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 1502be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher ID->getName(), TheCU, DefUnit, Line, 1503be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher RuntimeLang); 15047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return FwdDecl; 15057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID = Def; 15087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 15107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 15117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 15127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 15147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID->getImplementation()) 15157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagObjcClassComplete; 15167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1517f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher llvm::DICompositeType RealDecl = 15187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createStructType(Unit, ID->getName(), DefUnit, 15197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Line, Size, Align, Flags, 1520c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie llvm::DIType(), llvm::DIArray(), RuntimeLang); 15217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise, insert it into the CompletedTypeCache so that recursive uses 15237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // will find it and we're emitting the complete type. 15244919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl QualType QualTy = QualType(Ty, 0); 15254919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl CompletedTypeCache[QualTy.getAsOpaquePtr()] = RealDecl; 15267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Push the struct on region stack. 15277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1528f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher LexicalBlockStack.push_back(static_cast<llvm::MDNode*>(RealDecl)); 15297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[Ty->getDecl()] = llvm::WeakVH(RealDecl); 15307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Convert all the elements. 15327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> EltTys; 15337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *SClass = ID->getSuperClass(); 15357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SClass) { 15367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType SClassTy = 15377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(CGM.getContext().getObjCInterfaceType(SClass), Unit); 15387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!SClassTy.isValid()) 15397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 15406537f083555f9606c495d05c562878aa49bae987Eric Christopher 15417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType InhTag = 15427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createInheritance(RealDecl, SClassTy, 0, 0); 15437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(InhTag); 15447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ObjCContainerDecl::prop_iterator I = ID->prop_begin(), 15477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = ID->prop_end(); I != E; ++I) { 15487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ObjCPropertyDecl *PD = *I; 15497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc = PD->getLocation(); 15507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile PUnit = getOrCreateFile(Loc); 15517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned PLine = getLineNumber(Loc); 15527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Getter = PD->getGetterMethodDecl(); 15537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Setter = PD->getSetterMethodDecl(); 15547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *PropertyNode = 15557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createObjCProperty(PD->getName(), 1556be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher PUnit, PLine, 15575ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl hasDefaultGetterName(PD, Getter) ? "" : 15587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getSelectorName(PD->getGetterName()), 15595ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl hasDefaultSetterName(PD, Setter) ? "" : 15607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getSelectorName(PD->getSetterName()), 15617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PD->getPropertyAttributes(), 1562be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher getOrCreateType(PD->getType(), PUnit)); 15637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(PropertyNode); 15647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &RL = CGM.getContext().getASTObjCInterfaceLayout(ID); 15677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldNo = 0; 15687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ObjCIvarDecl *Field = ID->all_declared_ivar_begin(); Field; 15697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Field = Field->getNextIvar(), ++FieldNo) { 15707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy = getOrCreateType(Field->getType(), Unit); 15717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FieldTy.isValid()) 15727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 15736537f083555f9606c495d05c562878aa49bae987Eric Christopher 15747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef FieldName = Field->getName(); 15757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore unnamed fields. 15777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FieldName.empty()) 15787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 15797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the location for the field. 15817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile FieldDefUnit = getOrCreateFile(Field->getLocation()); 15827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldLine = getLineNumber(Field->getLocation()); 15837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FType = Field->getType(); 15847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize = 0; 15857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign = 0; 15867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FType->isIncompleteArrayType()) { 15887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 15907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize = Field->isBitField() 15917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ? Field->getBitWidthValue(CGM.getContext()) 15927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : CGM.getContext().getTypeSize(FType); 15937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldAlign = CGM.getContext().getTypeAlign(FType); 15947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldOffset; 15977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CGM.getLangOpts().ObjCRuntime.isNonFragile()) { 15987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We don't know the runtime offset of an ivar if we're using the 15997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // non-fragile ABI. For bitfields, use the bit offset into the first 16007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // byte of storage of the bitfield. For other fields, use zero. 16017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Field->isBitField()) { 16027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = CGM.getObjCRuntime().ComputeBitfieldBitOffset( 16037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM, ID, Field); 16047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset %= CGM.getContext().getCharWidth(); 16057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 16067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 16077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 16097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = RL.getFieldOffset(FieldNo); 16107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 16137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Field->getAccessControl() == ObjCIvarDecl::Protected) 16147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags = llvm::DIDescriptor::FlagProtected; 16157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (Field->getAccessControl() == ObjCIvarDecl::Private) 16167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags = llvm::DIDescriptor::FlagPrivate; 16177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *PropertyNode = NULL; 16197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ObjCImplementationDecl *ImpD = ID->getImplementation()) { 16206537f083555f9606c495d05c562878aa49bae987Eric Christopher if (ObjCPropertyImplDecl *PImpD = 16217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ImpD->FindPropertyImplIvarDecl(Field->getIdentifier())) { 16227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ObjCPropertyDecl *PD = PImpD->getPropertyDecl()) { 1623be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher SourceLocation Loc = PD->getLocation(); 1624be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher llvm::DIFile PUnit = getOrCreateFile(Loc); 1625be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher unsigned PLine = getLineNumber(Loc); 16267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Getter = PD->getGetterMethodDecl(); 16277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Setter = PD->getSetterMethodDecl(); 16287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PropertyNode = 16297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createObjCProperty(PD->getName(), 16307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PUnit, PLine, 16315ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl hasDefaultGetterName(PD, Getter) ? "" : 16327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getSelectorName(PD->getGetterName()), 16335ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl hasDefaultSetterName(PD, Setter) ? "" : 16347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getSelectorName(PD->getSetterName()), 16357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PD->getPropertyAttributes(), 16367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(PD->getType(), PUnit)); 16377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldTy = DBuilder.createObjCIVar(FieldName, FieldDefUnit, 16417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldLine, FieldSize, FieldAlign, 16427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset, Flags, FieldTy, 16437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PropertyNode); 16447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(FieldTy); 16457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys); 1648f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher RealDecl.setTypeArray(Elements); 16494919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl 16504919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl // If the implementation is not yet set, we do not want to mark it 16514919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl // as complete. An implementation may declare additional 16524919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl // private ivars that we would miss otherwise. 16534919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl if (ID->getImplementation() == 0) 16544919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl CompletedTypeCache.erase(QualTy.getAsOpaquePtr()); 16556537f083555f9606c495d05c562878aa49bae987Eric Christopher 16567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 1657f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher return RealDecl; 16587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 16597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const VectorType *Ty, llvm::DIFile Unit) { 16617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType ElementTy = getOrCreateType(Ty->getElementType(), Unit); 16627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei int64_t Count = Ty->getNumElements(); 16637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Count == 0) 16647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If number of elements are not known then this is an unbounded array. 16657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use Count == -1 to express such arrays. 16667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Count = -1; 16677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *Subscript = DBuilder.getOrCreateSubrange(0, Count); 16697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray SubscriptArray = DBuilder.getOrCreateArray(Subscript); 16707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 16727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 16737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createVectorType(Size, Align, ElementTy, SubscriptArray); 16757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 16767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ArrayType *Ty, 16787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 16797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size; 16807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align; 16817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: make getTypeAlign() aware of VLAs and incomplete array types 16837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(Ty)) { 16847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = 0; 16857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = 16867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getContext().getTypeAlign(CGM.getContext().getBaseElementType(VAT)); 16877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Ty->isIncompleteArrayType()) { 16887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = 0; 16897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty->getElementType()->isIncompleteType()) 16907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = 0; 16917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 16927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = CGM.getContext().getTypeAlign(Ty->getElementType()); 1693089db2e3af0b6166a8e2253c453eccf551ddfbd8David Blaikie } else if (Ty->isIncompleteType()) { 16947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = 0; 16957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = 0; 16967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 16977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Size and align of the whole array, not the element type. 16987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = CGM.getContext().getTypeSize(Ty); 16997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = CGM.getContext().getTypeAlign(Ty); 17007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add the dimensions of the array. FIXME: This loses CV qualifiers from 17037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // interior arrays, do we care? Why aren't nested arrays represented the 17047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // obvious/recursive way? 17057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 8> Subscripts; 17067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType EltTy(Ty, 0); 17077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while ((Ty = dyn_cast<ArrayType>(EltTy))) { 17087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the number of elements is known, then count is that number. Otherwise, 17097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // it's -1. This allows us to represent a subrange with an array of 0 17107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // elements, like this: 17117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 17127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // struct foo { 17137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // int x[0]; 17147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // }; 17157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei int64_t Count = -1; // Count == -1 is an unbounded array. 17167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(Ty)) 17177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Count = CAT->getSize().getZExtValue(); 17186537f083555f9606c495d05c562878aa49bae987Eric Christopher 17197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Verify this is right for VLAs. 17207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Subscripts.push_back(DBuilder.getOrCreateSubrange(0, Count)); 17217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTy = Ty->getElementType(); 17227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray SubscriptArray = DBuilder.getOrCreateArray(Subscripts); 17257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17266537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIType DbgTy = 17277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createArrayType(Size, Align, getOrCreateType(EltTy, Unit), 17287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubscriptArray); 17297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 17307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17326537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DIType CGDebugInfo::CreateType(const LValueReferenceType *Ty, 17337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 17346537f083555f9606c495d05c562878aa49bae987Eric Christopher return CreatePointerLikeType(llvm::dwarf::DW_TAG_reference_type, 17357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty, Ty->getPointeeType(), Unit); 17367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17386537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DIType CGDebugInfo::CreateType(const RValueReferenceType *Ty, 17397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 17406537f083555f9606c495d05c562878aa49bae987Eric Christopher return CreatePointerLikeType(llvm::dwarf::DW_TAG_rvalue_reference_type, 17417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty, Ty->getPointeeType(), Unit); 17427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17446537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DIType CGDebugInfo::CreateType(const MemberPointerType *Ty, 17457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile U) { 1746e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie llvm::DIType ClassType = getOrCreateType(QualType(Ty->getClass(), 0), U); 1747e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie if (!Ty->getPointeeType()->isFunctionType()) 1748e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie return DBuilder.createMemberPointerType( 1749b0f77b065761670921fdf9c56029856cb5d9c306David Blaikie getOrCreateTypeDeclaration(Ty->getPointeeType(), U), ClassType); 1750e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie return DBuilder.createMemberPointerType(getOrCreateInstanceMethodType( 1751e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie CGM.getContext().getPointerType( 1752e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie QualType(Ty->getClass(), Ty->getPointeeType().getCVRQualifiers())), 1753e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie Ty->getPointeeType()->getAs<FunctionProtoType>(), U), 1754e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie ClassType); 17557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17576537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DIType CGDebugInfo::CreateType(const AtomicType *Ty, 17587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile U) { 17597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore the atomic wrapping 17607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: What is the correct representation? 17617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(Ty->getValueType(), U); 17627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateEnumType - get enumeration type. 17657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateEnumType(const EnumDecl *ED) { 17667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = 0; 17677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = 0; 17687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ED->getTypeForDecl()->isIncompleteType()) { 17697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = CGM.getContext().getTypeSize(ED->getTypeForDecl()); 17707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = CGM.getContext().getTypeAlign(ED->getTypeForDecl()); 17717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is just a forward declaration, construct an appropriately 17747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // marked node and just return it. 17757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ED->getDefinition()) { 17767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor EDContext; 17777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EDContext = getContextDescriptor(cast<Decl>(ED->getDeclContext())); 17787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(ED->getLocation()); 17797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(ED->getLocation()); 17807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef EDName = ED->getName(); 17817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_enumeration_type, 17827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EDName, EDContext, DefUnit, Line, 0, 17837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size, Align); 17847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create DIEnumerator elements for each enumerator. 17877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> Enumerators; 17887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ED = ED->getDefinition(); 17897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (EnumDecl::enumerator_iterator 17907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Enum = ED->enumerator_begin(), EnumEnd = ED->enumerator_end(); 17917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Enum != EnumEnd; ++Enum) { 17927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Enumerators.push_back( 17937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createEnumerator(Enum->getName(), 1794ac8f43c9cb71880ed3fa7f56a2a2429eafbd4625David Blaikie Enum->getInitVal().getSExtValue())); 17957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Return a CompositeType for the enum itself. 17987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray EltArray = DBuilder.getOrCreateArray(Enumerators); 17997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(ED->getLocation()); 18017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(ED->getLocation()); 18026537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIDescriptor EnumContext = 18037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(cast<Decl>(ED->getDeclContext())); 180459d6a71d681adfdc7d976492eeb3deae84e8f2e2Adrian Prantl llvm::DIType ClassTy = ED->isFixed() ? 18057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(ED->getIntegerType(), DefUnit) : llvm::DIType(); 18066537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIType DbgTy = 18077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createEnumerationType(EnumContext, ED->getName(), DefUnit, Line, 18087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size, Align, EltArray, 18097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ClassTy); 18107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 18117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18134b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikiestatic QualType UnwrapTypeForDebugInfo(QualType T, const ASTContext &C) { 18144b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Qualifiers Quals; 18157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei do { 18164b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Quals += T.getLocalQualifiers(); 18177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType LastT = T; 18187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (T->getTypeClass()) { 18197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 18204b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie return C.getQualifiedType(T.getTypePtr(), Quals); 18217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TemplateSpecialization: 18227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<TemplateSpecializationType>(T)->desugar(); 18237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOfExpr: 18257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType(); 18267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOf: 18287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<TypeOfType>(T)->getUnderlyingType(); 18297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Decltype: 18317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<DecltypeType>(T)->getUnderlyingType(); 18327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::UnaryTransform: 18347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<UnaryTransformType>(T)->getUnderlyingType(); 18357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Attributed: 18377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<AttributedType>(T)->getEquivalentType(); 18387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Elaborated: 18407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<ElaboratedType>(T)->getNamedType(); 18417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Paren: 18437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<ParenType>(T)->getInnerType(); 18447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18454b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie case Type::SubstTemplateTypeParm: 18467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<SubstTemplateTypeParmType>(T)->getReplacementType(); 18477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Auto: 1849912964863c344dd84976ee281bd213d0485645baDavid Blaikie QualType DT = cast<AutoType>(T)->getDeducedType(); 1850912964863c344dd84976ee281bd213d0485645baDavid Blaikie if (DT.isNull()) 1851912964863c344dd84976ee281bd213d0485645baDavid Blaikie return T; 1852912964863c344dd84976ee281bd213d0485645baDavid Blaikie T = DT; 18537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18556537f083555f9606c495d05c562878aa49bae987Eric Christopher 18567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(T != LastT && "Type unwrapping failed to unwrap!"); 1857d24c9ab90b42370bb417f44e001a0347ee1ca87eNAKAMURA Takumi (void)LastT; 18587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } while (true); 18597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1861f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher/// getType - Get the type from the cache or return null type if it doesn't 1862f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher/// exist. 18637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getTypeOrNull(QualType Ty) { 18647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Unwrap the type as needed for debug information. 18664b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext()); 18676537f083555f9606c495d05c562878aa49bae987Eric Christopher 18687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check for existing entry. 1869ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl if (Ty->getTypeClass() == Type::ObjCInterface) { 1870ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl llvm::Value *V = getCachedInterfaceTypeOrNull(Ty); 1871ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl if (V) 1872ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl return llvm::DIType(cast<llvm::MDNode>(V)); 1873ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl else return llvm::DIType(); 1874ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl } 1875ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 18767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<void *, llvm::WeakVH>::iterator it = 18777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeCache.find(Ty.getAsOpaquePtr()); 18787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (it != TypeCache.end()) { 18797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Verify that the debug info still exists. 18807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::Value *V = it->second) 18817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(cast<llvm::MDNode>(V)); 18827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 18857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getCompletedTypeOrNull - Get the type from the cache or return null if it 18887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// doesn't exist. 18897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getCompletedTypeOrNull(QualType Ty) { 18907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Unwrap the type as needed for debug information. 18924b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext()); 18937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check for existing entry. 18954919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl llvm::Value *V = 0; 18967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<void *, llvm::WeakVH>::iterator it = 18977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CompletedTypeCache.find(Ty.getAsOpaquePtr()); 18984919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl if (it != CompletedTypeCache.end()) 18994919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl V = it->second; 19004919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl else { 1901ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl V = getCachedInterfaceTypeOrNull(Ty); 19027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19044919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl // Verify that any cached debug info still exists. 1905eab6a36cf1eed9a7fec0babd2206048e28dedd02David Blaikie if (V != 0) 1906eab6a36cf1eed9a7fec0babd2206048e28dedd02David Blaikie return llvm::DIType(cast<llvm::MDNode>(V)); 19076bb110292c4e33a6ee2856cf91e0774107aa7d9cAdrian Prantl 1908eab6a36cf1eed9a7fec0babd2206048e28dedd02David Blaikie return llvm::DIType(); 1909eab6a36cf1eed9a7fec0babd2206048e28dedd02David Blaikie} 19106bb110292c4e33a6ee2856cf91e0774107aa7d9cAdrian Prantl 1911eab6a36cf1eed9a7fec0babd2206048e28dedd02David Blaikievoid CGDebugInfo::completeFwdDecl(const RecordDecl &RD) { 1912eab6a36cf1eed9a7fec0babd2206048e28dedd02David Blaikie // In limited debug info we only want to do this if the complete type was 1913eab6a36cf1eed9a7fec0babd2206048e28dedd02David Blaikie // required. 1914eab6a36cf1eed9a7fec0babd2206048e28dedd02David Blaikie if (DebugKind <= CodeGenOptions::LimitedDebugInfo) 1915eab6a36cf1eed9a7fec0babd2206048e28dedd02David Blaikie return; 19164919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl 1917076f51fd1f306cafc3b1f1d323d25ac81bf7d4f7David Blaikie QualType QTy = CGM.getContext().getRecordType(&RD); 1918076f51fd1f306cafc3b1f1d323d25ac81bf7d4f7David Blaikie llvm::DIType T = getTypeOrNull(QTy); 1919eab6a36cf1eed9a7fec0babd2206048e28dedd02David Blaikie 1920eab6a36cf1eed9a7fec0babd2206048e28dedd02David Blaikie if (T.Verify() && T.isForwardDecl()) 1921076f51fd1f306cafc3b1f1d323d25ac81bf7d4f7David Blaikie getOrCreateType(QTy, getOrCreateFile(RD.getLocation())); 19227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 19237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1924ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl/// getCachedInterfaceTypeOrNull - Get the type from the interface 1925ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl/// cache, unless it needs to regenerated. Otherwise return null. 1926ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantlllvm::Value *CGDebugInfo::getCachedInterfaceTypeOrNull(QualType Ty) { 1927ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // Is there a cached interface that hasn't changed? 1928ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl llvm::DenseMap<void *, std::pair<llvm::WeakVH, unsigned > > 1929ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl ::iterator it1 = ObjCInterfaceCache.find(Ty.getAsOpaquePtr()); 1930ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 1931ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl if (it1 != ObjCInterfaceCache.end()) 1932ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl if (ObjCInterfaceDecl* Decl = getObjCInterfaceDecl(Ty)) 1933ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl if (Checksum(Decl) == it1->second.second) 1934ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // Return cached forward declaration. 1935ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl return it1->second.first; 1936ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 1937ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl return 0; 1938ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl} 19397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateType - Get the type from the cache or create a new 19417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// one if necessary. 194256b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopherllvm::DIType CGDebugInfo::getOrCreateType(QualType Ty, llvm::DIFile Unit, 194356b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher bool Declaration) { 19447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty.isNull()) 19457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 19467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Unwrap the type as needed for debug information. 19484b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext()); 19497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType T = getCompletedTypeOrNull(Ty); 19517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1952f0c31d98d3db8ed76077999d10ac45ed23f7e75eDavid Blaikie if (T.Verify()) { 1953f0c31d98d3db8ed76077999d10ac45ed23f7e75eDavid Blaikie // If we're looking for a definition, make sure we have definitions of any 1954f0c31d98d3db8ed76077999d10ac45ed23f7e75eDavid Blaikie // underlying types. 1955f0c31d98d3db8ed76077999d10ac45ed23f7e75eDavid Blaikie if (const TypedefType* TTy = dyn_cast<TypedefType>(Ty)) 1956f0c31d98d3db8ed76077999d10ac45ed23f7e75eDavid Blaikie getOrCreateType(TTy->getDecl()->getUnderlyingType(), Unit, Declaration); 1957f0c31d98d3db8ed76077999d10ac45ed23f7e75eDavid Blaikie if (Ty.hasLocalQualifiers()) 1958f0c31d98d3db8ed76077999d10ac45ed23f7e75eDavid Blaikie getOrCreateType(QualType(Ty.getTypePtr(), 0), Unit, Declaration); 19597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 1960f0c31d98d3db8ed76077999d10ac45ed23f7e75eDavid Blaikie } 19617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise create the type. 19635f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie llvm::DIType Res = CreateTypeNode(Ty, Unit, Declaration); 1964ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl void* TyPtr = Ty.getAsOpaquePtr(); 1965ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 1966ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // And update the type cache. 1967ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl TypeCache[TyPtr] = Res; 19687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType TC = getTypeOrNull(Ty); 19707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TC.Verify() && TC.isForwardDecl()) 1971ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl ReplaceMap.push_back(std::make_pair(TyPtr, static_cast<llvm::Value*>(TC))); 1972ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl else if (ObjCInterfaceDecl* Decl = getObjCInterfaceDecl(Ty)) { 1973ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // Interface types may have elements added to them by a 1974ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // subsequent implementation or extension, so we keep them in 1975ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // the ObjCInterfaceCache together with a checksum. Instead of 1976f06989b9f360e2b43cb1d94c317cc6e1826f7611Adrian Prantl // the (possibly) incomplete interface type, we return a forward 1977ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // declaration that gets RAUW'd in CGDebugInfo::finalize(). 1978e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie std::pair<llvm::WeakVH, unsigned> &V = ObjCInterfaceCache[TyPtr]; 1979e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie if (V.first) 1980e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie return llvm::DIType(cast<llvm::MDNode>(V.first)); 1981e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie TC = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 1982e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie Decl->getName(), TheCU, Unit, 1983e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie getLineNumber(Decl->getLocation()), 1984e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie TheCU.getLanguage()); 1985e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie // Store the forward declaration in the cache. 1986e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie V.first = TC; 1987e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie V.second = Checksum(Decl); 1988e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie 1989e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie // Register the type for replacement in finalize(). 1990e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie ReplaceMap.push_back(std::make_pair(TyPtr, static_cast<llvm::Value*>(TC))); 1991e2eb89a8fb8644bf9d89575f9cf2227699ed2fa7David Blaikie 1992ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl return TC; 1993ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl } 19947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Res.isForwardDecl()) 1996ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl CompletedTypeCache[TyPtr] = Res; 19977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Res; 19997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2001b5a50075d810002c718711675aae067f92b80670Adrian Prantl/// Currently the checksum of an interface includes the number of 2002b5a50075d810002c718711675aae067f92b80670Adrian Prantl/// ivars and property accessors. 200356b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopherunsigned CGDebugInfo::Checksum(const ObjCInterfaceDecl *ID) { 20044f97f853357e2769db3d7999424e346ac5adb297Adrian Prantl // The assumption is that the number of ivars can only increase 20054f97f853357e2769db3d7999424e346ac5adb297Adrian Prantl // monotonically, so it is safe to just use their current number as 20064f97f853357e2769db3d7999424e346ac5adb297Adrian Prantl // a checksum. 2007b5a50075d810002c718711675aae067f92b80670Adrian Prantl unsigned Sum = 0; 2008b5a50075d810002c718711675aae067f92b80670Adrian Prantl for (const ObjCIvarDecl *Ivar = ID->all_declared_ivar_begin(); 2009b5a50075d810002c718711675aae067f92b80670Adrian Prantl Ivar != 0; Ivar = Ivar->getNextIvar()) 2010b5a50075d810002c718711675aae067f92b80670Adrian Prantl ++Sum; 2011b5a50075d810002c718711675aae067f92b80670Adrian Prantl 2012b5a50075d810002c718711675aae067f92b80670Adrian Prantl return Sum; 20134919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl} 20144919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl 20154919de6a53a007487c6d6b173921b5e7152a2004Adrian PrantlObjCInterfaceDecl *CGDebugInfo::getObjCInterfaceDecl(QualType Ty) { 20164919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl switch (Ty->getTypeClass()) { 20174919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl case Type::ObjCObjectPointer: 2018f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher return getObjCInterfaceDecl(cast<ObjCObjectPointerType>(Ty) 2019f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher ->getPointeeType()); 20204919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl case Type::ObjCInterface: 20214919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl return cast<ObjCInterfaceType>(Ty)->getDecl(); 20224919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl default: 20234919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl return 0; 20244919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl } 20254919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl} 20264919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl 20277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateTypeNode - Create a new debug type node. 202856b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopherllvm::DIType CGDebugInfo::CreateTypeNode(QualType Ty, llvm::DIFile Unit, 202956b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher bool Declaration) { 20307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Handle qualifiers, which recursively handles what they refer to. 20317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty.hasLocalQualifiers()) 20325f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie return CreateQualifiedType(Ty, Unit, Declaration); 20337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const char *Diag = 0; 20356537f083555f9606c495d05c562878aa49bae987Eric Christopher 20367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Work out details of type. 20377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Ty->getTypeClass()) { 20387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define TYPE(Class, Base) 20397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define ABSTRACT_TYPE(Class, Base) 20407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define NON_CANONICAL_TYPE(Class, Base) 20417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define DEPENDENT_TYPE(Class, Base) case Type::Class: 20427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/TypeNodes.def" 20437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Dependent types cannot show up in debug information"); 20447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ExtVector: 20467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Vector: 20477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<VectorType>(Ty), Unit); 20487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCObjectPointer: 20497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ObjCObjectPointerType>(Ty), Unit); 20507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCObject: 20517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ObjCObjectType>(Ty), Unit); 20527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCInterface: 20537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ObjCInterfaceType>(Ty), Unit); 20547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Builtin: 20557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<BuiltinType>(Ty)); 20567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Complex: 20577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ComplexType>(Ty)); 20587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Pointer: 20597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<PointerType>(Ty), Unit); 206012df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner case Type::Decayed: 206112df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner // Decayed types are just pointers in LLVM and DWARF. 206212df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner return CreateType( 206312df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner cast<PointerType>(cast<DecayedType>(Ty)->getDecayedType()), Unit); 20647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::BlockPointer: 20657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<BlockPointerType>(Ty), Unit); 20667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Typedef: 20675f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie return CreateType(cast<TypedefType>(Ty), Unit, Declaration); 20687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Record: 20695f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie return CreateType(cast<RecordType>(Ty), Declaration); 20707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Enum: 20717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateEnumType(cast<EnumType>(Ty)->getDecl()); 20727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::FunctionProto: 20737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::FunctionNoProto: 20747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<FunctionType>(Ty), Unit); 20757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ConstantArray: 20767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::VariableArray: 20777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::IncompleteArray: 20787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ArrayType>(Ty), Unit); 20797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::LValueReference: 20817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<LValueReferenceType>(Ty), Unit); 20827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::RValueReference: 20837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<RValueReferenceType>(Ty), Unit); 20847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::MemberPointer: 20867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<MemberPointerType>(Ty), Unit); 20877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Atomic: 20897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<AtomicType>(Ty), Unit); 20907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Attributed: 20927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TemplateSpecialization: 20937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Elaborated: 20947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Paren: 20957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::SubstTemplateTypeParm: 20967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOfExpr: 20977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOf: 20987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Decltype: 20997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::UnaryTransform: 21007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("type should have been unwrapped!"); 2101912964863c344dd84976ee281bd213d0485645baDavid Blaikie case Type::Auto: 2102912964863c344dd84976ee281bd213d0485645baDavid Blaikie Diag = "auto"; 2103912964863c344dd84976ee281bd213d0485645baDavid Blaikie break; 21047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 21056537f083555f9606c495d05c562878aa49bae987Eric Christopher 21067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Diag && "Fall through without a diagnostic?"); 21077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DiagID = CGM.getDiags().getCustomDiagID(DiagnosticsEngine::Error, 21087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "debug information for %0 is not yet supported"); 21097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getDiags().Report(DiagID) 21107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << Diag; 21117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 21127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateLimitedType - Get the type from the cache or create a new 21157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// limited type if necessary. 21167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getOrCreateLimitedType(QualType Ty, 2117be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher llvm::DIFile Unit) { 21187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty.isNull()) 21197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 21207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Unwrap the type as needed for debug information. 21224b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext()); 21237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType T = getTypeOrNull(Ty); 21257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We may have cached a forward decl when we could have created 21277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // a non-forward decl. Go ahead and create a non-forward decl 21287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // now. 21297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (T.Verify() && !T.isForwardDecl()) return T; 21307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise create the type. 21327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Res = CreateLimitedTypeNode(Ty, Unit); 21337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (T.Verify() && T.isForwardDecl()) 21357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReplaceMap.push_back(std::make_pair(Ty.getAsOpaquePtr(), 21367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static_cast<llvm::Value*>(T))); 21377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // And update the type cache. 21397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeCache[Ty.getAsOpaquePtr()] = Res; 21407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Res; 21417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// TODO: Currently used for context chains when limiting debug info. 21447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateLimitedType(const RecordType *Ty) { 21457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordDecl *RD = Ty->getDecl(); 21466537f083555f9606c495d05c562878aa49bae987Eric Christopher 21477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the record type for the debug info. 21487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); 21497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(RD->getLocation()); 21507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef RDName = getClassName(RD); 21517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor RDContext; 215313c976710415041fca5aba25cc02d3813c74b990Eric Christopher if (DebugKind == CodeGenOptions::LimitedDebugInfo) 21547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RDContext = createContextChain(cast<Decl>(RD->getDeclContext())); 21557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 21567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RDContext = getContextDescriptor(cast<Decl>(RD->getDeclContext())); 21577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is just a forward declaration, construct an appropriately 21597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // marked node and just return it. 21607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!RD->getDefinition()) 21617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return createRecordFwdDecl(RD, RDContext); 21627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 21647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 21657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD); 21662fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie llvm::DICompositeType RealDecl; 21676537f083555f9606c495d05c562878aa49bae987Eric Christopher 21687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RD->isUnion()) 21697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RealDecl = DBuilder.createUnionType(RDContext, RDName, DefUnit, Line, 2170be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher Size, Align, 0, llvm::DIArray()); 21717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (RD->isClass()) { 21727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: This could be a struct type giving a default visibility different 21737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // than C++ class type, but needs llvm metadata changes first. 21747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RealDecl = DBuilder.createClassType(RDContext, RDName, DefUnit, Line, 2175be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher Size, Align, 0, 0, llvm::DIType(), 2176be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher llvm::DIArray(), llvm::DIType(), 2177be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher llvm::DIArray()); 21787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else 21797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RealDecl = DBuilder.createStructType(RDContext, RDName, DefUnit, Line, 2180f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher Size, Align, 0, llvm::DIType(), 2181f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher llvm::DIArray()); 21827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[Ty->getDecl()] = llvm::WeakVH(RealDecl); 21842fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = RealDecl; 21857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXDecl) { 21877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // A class's primary base or the class itself contains the vtable. 21882fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie llvm::DICompositeType ContainingType; 21897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 21907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXRecordDecl *PBase = RL.getPrimaryBase()) { 21917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Seek non virtual primary base root. 21927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (1) { 2193be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher const ASTRecordLayout &BRL = CGM.getContext().getASTRecordLayout(PBase); 2194be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher const CXXRecordDecl *PBT = BRL.getPrimaryBase(); 2195be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher if (PBT && !BRL.isPrimaryBaseVirtual()) 2196be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher PBase = PBT; 2197be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher else 2198be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher break; 21997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22002fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie ContainingType = llvm::DICompositeType( 22012fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie getOrCreateType(QualType(PBase->getTypeForDecl(), 0), DefUnit)); 22022fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie } else if (CXXDecl->isDynamicClass()) 22037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContainingType = RealDecl; 22047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22052fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie RealDecl.setContainingType(ContainingType); 22067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(RealDecl); 22087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 22097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateLimitedTypeNode - Create a new debug type node, but only forward 22117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// declare composite types that haven't been processed yet. 22127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateLimitedTypeNode(QualType Ty,llvm::DIFile Unit) { 22137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Work out details of type. 22157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Ty->getTypeClass()) { 22167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define TYPE(Class, Base) 22177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define ABSTRACT_TYPE(Class, Base) 22187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define NON_CANONICAL_TYPE(Class, Base) 22197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define DEPENDENT_TYPE(Class, Base) case Type::Class: 22207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei #include "clang/AST/TypeNodes.def" 22217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Dependent types cannot show up in debug information"); 22227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Record: 22247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateLimitedType(cast<RecordType>(Ty)); 22257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 22265f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie return CreateTypeNode(Ty, Unit, false); 22277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 22297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateMemberType - Create new member and increase Offset by FType's size. 22317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateMemberType(llvm::DIFile Unit, QualType FType, 22327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name, 22337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t *Offset) { 22347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy = CGDebugInfo::getOrCreateType(FType, Unit); 22357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize = CGM.getContext().getTypeSize(FType); 22367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign = CGM.getContext().getTypeAlign(FType); 22377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty = DBuilder.createMemberType(Unit, Name, Unit, 0, 22387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize, FieldAlign, 22397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *Offset, 0, FieldTy); 22407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *Offset += FieldSize; 22417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Ty; 22427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 22437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22449faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikiellvm::DIDescriptor CGDebugInfo::getDeclarationOrDefinition(const Decl *D) { 22459faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // We only need a declaration (not a definition) of the type - so use whatever 22469faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // we would otherwise do to get a type for a pointee. (forward declarations in 22479faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // limited debug info, full definitions (if the type definition is available) 22489faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // in unlimited debug info) 22499faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (const TypeDecl *TD = dyn_cast<TypeDecl>(D)) { 22509faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie llvm::DIFile DefUnit = getOrCreateFile(TD->getLocation()); 2251b0f77b065761670921fdf9c56029856cb5d9c306David Blaikie return getOrCreateTypeDeclaration(CGM.getContext().getTypeDeclType(TD), 2252b0f77b065761670921fdf9c56029856cb5d9c306David Blaikie DefUnit); 22539faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie } 22549faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // Otherwise fall back to a fairly rudimentary cache of existing declarations. 22559faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // This doesn't handle providing declarations (for functions or variables) for 22569faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // entities without definitions in this TU, nor when the definition proceeds 22579faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // the call to this function. 22589faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // FIXME: This should be split out into more specific maps with support for 22599faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // emitting forward declarations and merging definitions with declarations, 22609faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // the same way as we do for types. 22619faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator I = 22629faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie DeclCache.find(D->getCanonicalDecl()); 22639faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (I == DeclCache.end()) 22649faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return llvm::DIDescriptor(); 22659faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie llvm::Value *V = I->second; 22669faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return llvm::DIDescriptor(dyn_cast_or_null<llvm::MDNode>(V)); 22679faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie} 22689faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie 22697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getFunctionDeclaration - Return debug info descriptor to describe method 22707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// declaration for the given method definition. 22717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DISubprogram CGDebugInfo::getFunctionDeclaration(const Decl *D) { 227223e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie if (!D || DebugKind == CodeGenOptions::DebugLineTablesOnly) 227323e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie return llvm::DISubprogram(); 227423e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie 22757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FunctionDecl *FD = dyn_cast<FunctionDecl>(D); 22767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FD) return llvm::DISubprogram(); 22777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Setup context. 22797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(cast<Decl>(D->getDeclContext())); 22807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator 22827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MI = SPCache.find(FD->getCanonicalDecl()); 22837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MI != SPCache.end()) { 22847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = MI->second; 22857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DISubprogram SP(dyn_cast_or_null<llvm::MDNode>(V)); 228623e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie if (SP.isSubprogram() && !SP.isDefinition()) 22877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SP; 22887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (FunctionDecl::redecl_iterator I = FD->redecls_begin(), 22917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = FD->redecls_end(); I != E; ++I) { 22927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FunctionDecl *NextFD = *I; 22937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator 22947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MI = SPCache.find(NextFD->getCanonicalDecl()); 22957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MI != SPCache.end()) { 22967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = MI->second; 22977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DISubprogram SP(dyn_cast_or_null<llvm::MDNode>(V)); 229823e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie if (SP.isSubprogram() && !SP.isDefinition()) 22997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SP; 23007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DISubprogram(); 23037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 23047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// getOrCreateFunctionType - Construct DIType. If it is a c++ method, include 23067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// implicit parameter "this". 23079a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikiellvm::DICompositeType CGDebugInfo::getOrCreateFunctionType(const Decl *D, 23089a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie QualType FnType, 23099a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie llvm::DIFile F) { 231023e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie if (!D || DebugKind == CodeGenOptions::DebugLineTablesOnly) 231123e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie // Create fake but valid subroutine type. Otherwise 231223e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie // llvm::DISubprogram::Verify() would return false, and 231323e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie // subprogram DIE will miss DW_AT_decl_file and 231423e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie // DW_AT_decl_line fields. 231523e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie return DBuilder.createSubroutineType(F, DBuilder.getOrCreateArray(None)); 23167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) 23187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateMethodType(Method, F); 23197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const ObjCMethodDecl *OMethod = dyn_cast<ObjCMethodDecl>(D)) { 23207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add "self" and "_cmd" 23217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> Elts; 23227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // First element is always return type. For 'void' functions it is NULL. 23240cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl QualType ResultTy = OMethod->getResultType(); 23250cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl 23260cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl // Replace the instancetype keyword with the actual type. 23270cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl if (ResultTy == CGM.getContext().getObjCInstanceType()) 23280cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl ResultTy = CGM.getContext().getPointerType( 23290cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl QualType(OMethod->getClassInterface()->getTypeForDecl(), 0)); 23300cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl 2331566a9c3680d9960bb0eb6acf33507251cc13a8d8Adrian Prantl Elts.push_back(getOrCreateType(ResultTy, F)); 23327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // "self" pointer is always first argument. 2333e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl QualType SelfDeclTy = OMethod->getSelfDecl()->getType(); 2334e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl llvm::DIType SelfTy = getOrCreateType(SelfDeclTy, F); 2335e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl Elts.push_back(CreateSelfType(SelfDeclTy, SelfTy)); 23367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // "_cmd" pointer is always second argument. 23377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType CmdTy = getOrCreateType(OMethod->getCmdDecl()->getType(), F); 23387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elts.push_back(DBuilder.createArtificialType(CmdTy)); 23397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get rest of the arguments. 23406537f083555f9606c495d05c562878aa49bae987Eric Christopher for (ObjCMethodDecl::param_const_iterator PI = OMethod->param_begin(), 23417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PE = OMethod->param_end(); PI != PE; ++PI) 23427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elts.push_back(getOrCreateType((*PI)->getType(), F)); 23437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(Elts); 23457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createSubroutineType(F, EltTypeArray); 23467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23479a84529ed075d8047bb93f278a9da5e417fd71f3David Blaikie return llvm::DICompositeType(getOrCreateType(FnType, F)); 23487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 23497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitFunctionStart - Constructs the debug code for entering a function. 23517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitFunctionStart(GlobalDecl GD, QualType FnType, 23527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Function *Fn, 23537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 23547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name; 23567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef LinkageName; 23577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FnBeginRegionCount.push_back(LexicalBlockStack.size()); 23597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Decl *D = GD.getDecl(); 23617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Function may lack declaration in source code if it is created by Clang 23627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // CodeGen (examples: _GLOBAL__I_a, __cxx_global_array_dtor, thunk). 23637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool HasDecl = (D != 0); 23647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use the location of the declaration. 23657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc; 23667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (HasDecl) 23677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Loc = D->getLocation(); 23687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 23707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(Loc); 23717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor FDContext(Unit); 23727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray TParamsArray; 23737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!HasDecl) { 23747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use llvm function name. 23757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = Fn->getName(); 23767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 23777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there is a DISubprogram for this function available then use it. 23787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator 23797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FI = SPCache.find(FD->getCanonicalDecl()); 23807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FI != SPCache.end()) { 23817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = FI->second; 23827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor SP(dyn_cast_or_null<llvm::MDNode>(V)); 23837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SP.isSubprogram() && llvm::DISubprogram(SP).isDefinition()) { 23847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *SPN = SP; 23857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(SPN); 23867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[D] = llvm::WeakVH(SP); 23877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 23887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = getFunctionName(FD); 2391f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky // Use mangled name as linkage name for C/C++ functions. 23927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FD->hasPrototype()) { 23937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LinkageName = CGM.getMangledName(GD); 23947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrototyped; 23957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2396f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky // No need to replicate the linkage name if it isn't different from the 2397f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky // subprogram name, no need to have it at all unless coverage is enabled or 2398f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky // debug is set to more than just line tables. 23997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LinkageName == Name || 2400f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky (!CGM.getCodeGenOpts().EmitGcovArcs && 2401f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky !CGM.getCodeGenOpts().EmitGcovNotes && 240213c976710415041fca5aba25cc02d3813c74b990Eric Christopher DebugKind <= CodeGenOptions::DebugLineTablesOnly)) 24037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LinkageName = StringRef(); 24047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 240513c976710415041fca5aba25cc02d3813c74b990Eric Christopher if (DebugKind >= CodeGenOptions::LimitedDebugInfo) { 24067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const NamespaceDecl *NSDecl = 24077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast_or_null<NamespaceDecl>(FD->getDeclContext())) 24087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FDContext = getOrCreateNameSpace(NSDecl); 24097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (const RecordDecl *RDecl = 24107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast_or_null<RecordDecl>(FD->getDeclContext())) 24117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FDContext = getContextDescriptor(cast<Decl>(RDecl->getDeclContext())); 24127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Collect template parameters. 24147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TParamsArray = CollectFunctionTemplateParams(FD, Unit); 24157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D)) { 24177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = getObjCMethodName(OMD); 24187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrototyped; 24197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 24207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use llvm function name. 24217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = Fn->getName(); 24227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrototyped; 24237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Name.empty() && Name[0] == '\01') 24257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = Name.substr(1); 24267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(Loc); 24287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!HasDecl || D->isImplicit()) 24297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagArtificial; 24307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 243123e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie llvm::DISubprogram SP = DBuilder.createFunction( 243223e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie FDContext, Name, LinkageName, Unit, LineNo, 243323e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie getOrCreateFunctionType(D, FnType, Unit), Fn->hasInternalLinkage(), 243423e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie true /*definition*/, getLineNumber(CurLoc), Flags, 243523e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie CGM.getLangOpts().Optimize, Fn, TParamsArray, getFunctionDeclaration(D)); 24369faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (HasDecl) 24379faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie DeclCache.insert(std::make_pair(D->getCanonicalDecl(), llvm::WeakVH(SP))); 24387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Push function on region stack. 24407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *SPN = SP; 24417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(SPN); 24427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (HasDecl) 24437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[D] = llvm::WeakVH(SP); 24447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitLocation - Emit metadata to indicate a change in line/column 24477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// information in the source file. 244800df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantlvoid CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc, 244900df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl bool ForceColumnInfo) { 24506537f083555f9606c495d05c562878aa49bae987Eric Christopher 24517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Update our current location 24527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei setLocation(Loc); 24537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CurLoc.isInvalid() || CurLoc.isMacroID()) return; 24557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Don't bother if things are the same as last time. 24577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 24587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CurLoc == PrevLoc || 24597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SM.getExpansionLoc(CurLoc) == SM.getExpansionLoc(PrevLoc)) 24607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // New Builder may not be in sync with CGDebugInfo. 24610a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikie if (!Builder.getCurrentDebugLocation().isUnknown() && 24620a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikie Builder.getCurrentDebugLocation().getScope(CGM.getLLVMContext()) == 24630a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikie LexicalBlockStack.back()) 24647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 24656537f083555f9606c495d05c562878aa49bae987Eric Christopher 24667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Update last state. 24677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PrevLoc = CurLoc; 24687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *Scope = LexicalBlockStack.back(); 247000df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl Builder.SetCurrentDebugLocation(llvm::DebugLoc::get 247100df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl (getLineNumber(CurLoc), 247200df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl getColumnNumber(CurLoc, ForceColumnInfo), 247300df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl Scope)); 24747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateLexicalBlock - Creates a new lexical block node and pushes it on 24777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// the stack. 24787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::CreateLexicalBlock(SourceLocation Loc) { 24797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor D = 24807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createLexicalBlock(LexicalBlockStack.empty() ? 24817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor() : 24827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor(LexicalBlockStack.back()), 24837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateFile(CurLoc), 24847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getLineNumber(CurLoc), 24857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getColumnNumber(CurLoc)); 24867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *DN = D; 24877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(DN); 24887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitLexicalBlockStart - Constructs the debug code for entering a declarative 24917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// region - beginning of a DW_TAG_lexical_block. 2492f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christophervoid CGDebugInfo::EmitLexicalBlockStart(CGBuilderTy &Builder, 2493f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher SourceLocation Loc) { 24947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Set our current location. 24957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei setLocation(Loc); 24967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create a new lexical block and push it on the stack. 24987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CreateLexicalBlock(Loc); 24997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Emit a line table change for the current location inside the new scope. 25017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Builder.SetCurrentDebugLocation(llvm::DebugLoc::get(getLineNumber(Loc), 25027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getColumnNumber(Loc), 25037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.back())); 25047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 25057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitLexicalBlockEnd - Constructs the debug code for exiting a declarative 25077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// region - end of a DW_TAG_lexical_block. 2508f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christophervoid CGDebugInfo::EmitLexicalBlockEnd(CGBuilderTy &Builder, 2509f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher SourceLocation Loc) { 25107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 25117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Provide an entry in the line table for the end of the block. 25137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitLocation(Builder, Loc); 25147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 25167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 25177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitFunctionEnd - Constructs the debug code for exiting a function. 25197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitFunctionEnd(CGBuilderTy &Builder) { 25207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 25217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RCount = FnBeginRegionCount.back(); 25227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(RCount <= LexicalBlockStack.size() && "Region stack mismatch"); 25237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Pop all regions for this function. 25257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (LexicalBlockStack.size() != RCount) 25267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitLexicalBlockEnd(Builder, CurLoc); 25277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FnBeginRegionCount.pop_back(); 25287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 25297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25306537f083555f9606c495d05c562878aa49bae987Eric Christopher// EmitTypeForVarWithBlocksAttr - Build up structure info for the byref. 25317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// See BuildByRefType. 25327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::EmitTypeForVarWithBlocksAttr(const VarDecl *VD, 25337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t *XOffset) { 25347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 5> EltTys; 25367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FType; 25377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize, FieldOffset; 25387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign; 25396537f083555f9606c495d05c562878aa49bae987Eric Christopher 25407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 25416537f083555f9606c495d05c562878aa49bae987Eric Christopher QualType Type = VD->getType(); 25427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 25447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 25457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset)); 25467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__forwarding", &FieldOffset)); 25477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().IntTy; 25487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset)); 25497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__size", &FieldOffset)); 25507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool HasCopyAndDispose = CGM.getContext().BlockRequiresCopying(Type, VD); 25527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (HasCopyAndDispose) { 25537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 25547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__copy_helper", 25557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei &FieldOffset)); 25567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__destroy_helper", 25577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei &FieldOffset)); 25587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool HasByrefExtendedLayout; 25607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qualifiers::ObjCLifetime Lifetime; 25617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CGM.getContext().getByrefLifetime(Type, 25627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Lifetime, HasByrefExtendedLayout) 25637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei && HasByrefExtendedLayout) 25647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, 25657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "__byref_variable_layout", 25667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei &FieldOffset)); 25676537f083555f9606c495d05c562878aa49bae987Eric Christopher 25687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits Align = CGM.getContext().getDeclAlign(VD); 25697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Align > CGM.getContext().toCharUnitsFromBits( 257064aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall CGM.getTarget().getPointerAlign(0))) { 25716537f083555f9606c495d05c562878aa49bae987Eric Christopher CharUnits FieldOffsetInBytes 25727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = CGM.getContext().toCharUnitsFromBits(FieldOffset); 25737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits AlignedOffsetInBytes 25747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = FieldOffsetInBytes.RoundUpToAlignment(Align); 25757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits NumPaddingBytes 25767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = AlignedOffsetInBytes - FieldOffsetInBytes; 25776537f083555f9606c495d05c562878aa49bae987Eric Christopher 25787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NumPaddingBytes.isPositive()) { 25797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APInt pad(32, NumPaddingBytes.getQuantity()); 25807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getConstantArrayType(CGM.getContext().CharTy, 25817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei pad, ArrayType::Normal, 0); 25827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "", &FieldOffset)); 25837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25856537f083555f9606c495d05c562878aa49bae987Eric Christopher 25867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = Type; 25877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy = CGDebugInfo::getOrCreateType(FType, Unit); 25887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize = CGM.getContext().getTypeSize(FType); 25897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldAlign = CGM.getContext().toBits(Align); 25907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25916537f083555f9606c495d05c562878aa49bae987Eric Christopher *XOffset = FieldOffset; 25927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldTy = DBuilder.createMemberType(Unit, VD->getName(), Unit, 25937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 0, FieldSize, FieldAlign, 25947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset, 0, FieldTy); 25957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(FieldTy); 25967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset += FieldSize; 25976537f083555f9606c495d05c562878aa49bae987Eric Christopher 25987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys); 25996537f083555f9606c495d05c562878aa49bae987Eric Christopher 26007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = llvm::DIDescriptor::FlagBlockByrefStruct; 26016537f083555f9606c495d05c562878aa49bae987Eric Christopher 26027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createStructType(Unit, "", Unit, 0, FieldOffset, 0, Flags, 2603c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie llvm::DIType(), Elements); 26047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 26057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitDeclare - Emit local variable declaration debug info. 26077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclare(const VarDecl *VD, unsigned Tag, 26086537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::Value *Storage, 26097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ArgNo, CGBuilderTy &Builder) { 261013c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 26117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 26127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 26147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty; 26157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t XOffset = 0; 26167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VD->hasAttr<BlocksAttr>()) 26177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset); 26186537f083555f9606c495d05c562878aa49bae987Eric Christopher else 26197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = getOrCreateType(VD->getType(), Unit); 26207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there is no debug info for this type then do not emit debug info 26227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // for this variable. 26237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Ty) 26247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 26257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get location information. 26277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(VD->getLocation()); 26287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Column = getColumnNumber(VD->getLocation()); 26297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 26307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VD->isImplicit()) 26317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagArtificial; 26327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is the first argument and it is implicit then 26337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // give it an object pointer flag. 26347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: There has to be a better way to do this, but for static 26357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // functions there won't be an implicit param at arg1 and 26367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // otherwise it is 'self' or 'this'. 26377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<ImplicitParamDecl>(VD) && ArgNo == 1) 26387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagObjectPointer; 263941c9baed95a1e7974e6cccf7b4120fd1866ff125David Blaikie if (llvm::Argument *Arg = dyn_cast<llvm::Argument>(Storage)) 264041c9baed95a1e7974e6cccf7b4120fd1866ff125David Blaikie if (Arg->getType()->isPointerTy() && !Arg->hasByValAttr() && !VD->getType()->isPointerType()) 264141c9baed95a1e7974e6cccf7b4120fd1866ff125David Blaikie Flags |= llvm::DIDescriptor::FlagIndirectVariable; 26427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *Scope = LexicalBlockStack.back(); 26447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = VD->getName(); 26467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Name.empty()) { 26477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VD->hasAttr<BlocksAttr>()) { 26487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits offset = CharUnits::fromQuantity(32); 26497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 9> addr; 26507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Type *Int64Ty = CGM.Int64Ty; 26517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 26527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of __forwarding field 26537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext().toCharUnitsFromBits( 265464aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall CGM.getTarget().getPointerWidth(0)); 26557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 26567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpDeref)); 26577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 26587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of x field 26597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext().toCharUnitsFromBits(XOffset); 26607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 26617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the variable. 26637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIVariable D = 26646537f083555f9606c495d05c562878aa49bae987Eric Christopher DBuilder.createComplexVariable(Tag, 26657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor(Scope), 26667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VD->getName(), Unit, Line, Ty, 26677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr, ArgNo); 26686537f083555f9606c495d05c562878aa49bae987Eric Christopher 26697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Insert an llvm.dbg.declare into the current block. 26707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Instruction *Call = 26717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.insertDeclare(Storage, D, Builder.GetInsertBlock()); 2672230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); 2673230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl return; 2674230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl } else if (isa<VariableArrayType>(VD->getType())) { 2675230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl // These are "complex" variables in that they need an op_deref. 2676230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl // Create the descriptor for the variable. 2677230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl llvm::Value *Addr = llvm::ConstantInt::get(CGM.Int64Ty, 2678230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl llvm::DIBuilder::OpDeref); 2679230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl llvm::DIVariable D = 2680230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl DBuilder.createComplexVariable(Tag, 2681230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl llvm::DIDescriptor(Scope), 2682230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl Name, Unit, Line, Ty, 2683230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl Addr, ArgNo); 2684230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl 2685230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl // Insert an llvm.dbg.declare into the current block. 2686230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl llvm::Instruction *Call = 2687230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl DBuilder.insertDeclare(Storage, D, Builder.GetInsertBlock()); 26887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); 26897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 26907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2691436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie } else if (const RecordType *RT = dyn_cast<RecordType>(VD->getType())) { 2692436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // If VD is an anonymous union then Storage represents value for 2693436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // all union fields. 26947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordDecl *RD = cast<RecordDecl>(RT->getDecl()); 2695d8180cf9877cd793949ae94edbf2ee84341041c5David Blaikie if (RD->isUnion() && RD->isAnonymousStructOrUnion()) { 26967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (RecordDecl::field_iterator I = RD->field_begin(), 26977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = RD->field_end(); 26987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I != E; ++I) { 26997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldDecl *Field = *I; 27007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy = getOrCreateType(Field->getType(), Unit); 27017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef FieldName = Field->getName(); 27026537f083555f9606c495d05c562878aa49bae987Eric Christopher 27037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore unnamed fields. Do not ignore unnamed records. 27047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FieldName.empty() && !isa<RecordType>(Field->getType())) 27057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 27066537f083555f9606c495d05c562878aa49bae987Eric Christopher 27077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use VarDecl's Tag, Scope and Line number. 27087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIVariable D = 27097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createLocalVariable(Tag, llvm::DIDescriptor(Scope), 27106537f083555f9606c495d05c562878aa49bae987Eric Christopher FieldName, Unit, Line, FieldTy, 27117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getLangOpts().Optimize, Flags, 27127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArgNo); 27136537f083555f9606c495d05c562878aa49bae987Eric Christopher 27147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Insert an llvm.dbg.declare into the current block. 27157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Instruction *Call = 27167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.insertDeclare(Storage, D, Builder.GetInsertBlock()); 27177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); 27187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2719d8180cf9877cd793949ae94edbf2ee84341041c5David Blaikie return; 27207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2722436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie 2723436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // Create the descriptor for the variable. 2724436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie llvm::DIVariable D = 2725436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie DBuilder.createLocalVariable(Tag, llvm::DIDescriptor(Scope), 2726436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie Name, Unit, Line, Ty, 2727436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie CGM.getLangOpts().Optimize, Flags, ArgNo); 2728436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie 2729436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // Insert an llvm.dbg.declare into the current block. 2730436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie llvm::Instruction *Call = 2731436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie DBuilder.insertDeclare(Storage, D, Builder.GetInsertBlock()); 2732436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); 27337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 27347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfAutoVariable(const VarDecl *VD, 27367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *Storage, 27377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 273813c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 27397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitDeclare(VD, llvm::dwarf::DW_TAG_auto_variable, Storage, 0, Builder); 27407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 27417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2742e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// Look up the completed type for a self pointer in the TypeCache and 2743e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// create a copy of it with the ObjectPointer and Artificial flags 2744e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// set. If the type is not cached, a new one is created. This should 2745e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// never happen though, since creating a type for the implicit self 2746e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// argument implies that we already parsed the interface definition 2747e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// and the ivar declarations in the implementation. 2748f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopherllvm::DIType CGDebugInfo::CreateSelfType(const QualType &QualTy, 2749f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher llvm::DIType Ty) { 2750e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl llvm::DIType CachedTy = getTypeOrNull(QualTy); 2751e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl if (CachedTy.Verify()) Ty = CachedTy; 2752e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl else DEBUG(llvm::dbgs() << "No cached type for self."); 2753e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl return DBuilder.createObjectPointerType(Ty); 2754e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl} 2755e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl 27567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfBlockDeclRefVariable(const VarDecl *VD, 27577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *Storage, 27587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder, 27597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CGBlockInfo &blockInfo) { 276013c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 27617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 27626537f083555f9606c495d05c562878aa49bae987Eric Christopher 27637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Builder.GetInsertBlock() == 0) 27647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 27656537f083555f9606c495d05c562878aa49bae987Eric Christopher 27667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool isByRef = VD->hasAttr<BlocksAttr>(); 27676537f083555f9606c495d05c562878aa49bae987Eric Christopher 27687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t XOffset = 0; 27697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 27707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty; 27717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isByRef) 27727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset); 27736537f083555f9606c495d05c562878aa49bae987Eric Christopher else 27747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = getOrCreateType(VD->getType(), Unit); 27757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Self is passed along as an implicit non-arg variable in a 27777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // block. Mark it as the object pointer. 27787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<ImplicitParamDecl>(VD) && VD->getName() == "self") 2779e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl Ty = CreateSelfType(VD->getType(), Ty); 27807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get location information. 27827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(VD->getLocation()); 27837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Column = getColumnNumber(VD->getLocation()); 27847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const llvm::DataLayout &target = CGM.getDataLayout(); 27867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits offset = CharUnits::fromQuantity( 27887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei target.getStructLayout(blockInfo.StructureType) 27897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ->getElementOffset(blockInfo.getCapture(VD).getIndex())); 27907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 9> addr; 27927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Type *Int64Ty = CGM.Int64Ty; 27939b97adfb770c3b55c1a45049d53b624bbc6f62e1Adrian Prantl if (isa<llvm::AllocaInst>(Storage)) 27949b97adfb770c3b55c1a45049d53b624bbc6f62e1Adrian Prantl addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpDeref)); 27957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 27967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 27977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isByRef) { 27987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpDeref)); 27997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 28007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of __forwarding field 28017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext() 28027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei .toCharUnitsFromBits(target.getPointerSizeInBits(0)); 28037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 28047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpDeref)); 28057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 28067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of x field 28077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext().toCharUnitsFromBits(XOffset); 28087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 28097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the variable. 28127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIVariable D = 28136537f083555f9606c495d05c562878aa49bae987Eric Christopher DBuilder.createComplexVariable(llvm::dwarf::DW_TAG_auto_variable, 28147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor(LexicalBlockStack.back()), 28157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VD->getName(), Unit, Line, Ty, addr); 28169b97adfb770c3b55c1a45049d53b624bbc6f62e1Adrian Prantl 28177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Insert an llvm.dbg.declare into the current block. 28187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Instruction *Call = 28197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.insertDeclare(Storage, D, Builder.GetInsertPoint()); 28207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, 28217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.back())); 28227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 28237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitDeclareOfArgVariable - Emit call to llvm.dbg.declare for an argument 28257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// variable declaration. 28267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfArgVariable(const VarDecl *VD, llvm::Value *AI, 28277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ArgNo, 28287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 282913c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 28307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitDeclare(VD, llvm::dwarf::DW_TAG_arg_variable, AI, ArgNo, Builder); 28317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 28327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 28347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei struct BlockLayoutChunk { 28357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t OffsetInBits; 28367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BlockDecl::Capture *Capture; 28377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 28387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool operator<(const BlockLayoutChunk &l, const BlockLayoutChunk &r) { 28397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return l.OffsetInBits < r.OffsetInBits; 28407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 28427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block, 2844836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl llvm::Value *Arg, 2845836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl llvm::Value *LocalAddr, 28467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 284713c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 28487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTContext &C = CGM.getContext(); 28497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BlockDecl *blockDecl = block.getBlockDecl(); 28507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Collect some general information about the block's location. 28527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation loc = blockDecl->getCaretLocation(); 28537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile tunit = getOrCreateFile(loc); 28547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned line = getLineNumber(loc); 28557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned column = getColumnNumber(loc); 28566537f083555f9606c495d05c562878aa49bae987Eric Christopher 28577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Build the debug-info type for the block literal. 28587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(cast<Decl>(blockDecl->getDeclContext())); 28597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const llvm::StructLayout *blockLayout = 28617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getDataLayout().getStructLayout(block.StructureType); 28627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value*, 16> fields; 28647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__isa", C.VoidPtrTy, 0, loc, AS_public, 28657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(0), 28667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 28677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__flags", C.IntTy, 0, loc, AS_public, 28687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(1), 28697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 28707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__reserved", C.IntTy, 0, loc, AS_public, 28717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(2), 28727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 28737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__FuncPtr", C.VoidPtrTy, 0, loc, AS_public, 28747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(3), 28757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 28767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__descriptor", 28777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei C.getPointerType(block.NeedsCopyDispose ? 28787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei C.getBlockDescriptorExtendedType() : 28797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei C.getBlockDescriptorType()), 28807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 0, loc, AS_public, 28817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(4), 28827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 28837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We want to sort the captures by offset, not because DWARF 28857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // requires this, but because we're paranoid about debuggers. 28867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<BlockLayoutChunk, 8> chunks; 28877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 'this' capture. 28897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (blockDecl->capturesCXXThis()) { 28907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BlockLayoutChunk chunk; 28917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.OffsetInBits = 28927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(block.CXXThisIndex); 28937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.Capture = 0; 28947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunks.push_back(chunk); 28957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Variable captures. 28987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (BlockDecl::capture_const_iterator 28997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei i = blockDecl->capture_begin(), e = blockDecl->capture_end(); 29007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei i != e; ++i) { 29017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BlockDecl::Capture &capture = *i; 29027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const VarDecl *variable = capture.getVariable(); 29037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CGBlockInfo::Capture &captureInfo = block.getCapture(variable); 29047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore constant captures. 29067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (captureInfo.isConstant()) 29077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 29087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BlockLayoutChunk chunk; 29107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.OffsetInBits = 29117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(captureInfo.getIndex()); 29127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.Capture = &capture; 29137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunks.push_back(chunk); 29147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Sort by offset. 29177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::array_pod_sort(chunks.begin(), chunks.end()); 29187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (SmallVectorImpl<BlockLayoutChunk>::iterator 29207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei i = chunks.begin(), e = chunks.end(); i != e; ++i) { 29217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t offsetInBits = i->OffsetInBits; 29227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BlockDecl::Capture *capture = i->Capture; 29237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we have a null capture, this must be the C++ 'this' capture. 29257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!capture) { 29267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXMethodDecl *method = 29277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<CXXMethodDecl>(blockDecl->getNonClosureContext()); 29287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType type = method->getThisType(C); 29297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("this", type, 0, loc, AS_public, 29317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offsetInBits, tunit, tunit)); 29327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 29337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const VarDecl *variable = capture->getVariable(); 29367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef name = variable->getName(); 29377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType fieldType; 29397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (capture->isByRef()) { 29407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::pair<uint64_t,unsigned> ptrInfo = C.getTypeInfo(C.VoidPtrTy); 29417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: this creates a second copy of this type! 29437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t xoffset; 29447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fieldType = EmitTypeForVarWithBlocksAttr(variable, &xoffset); 29457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fieldType = DBuilder.createPointerType(fieldType, ptrInfo.first); 29467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fieldType = DBuilder.createMemberType(tunit, name, tunit, line, 29477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ptrInfo.first, ptrInfo.second, 29487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offsetInBits, 0, fieldType); 29497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 29507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fieldType = createFieldType(name, variable->getType(), 0, 29517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei loc, AS_public, offsetInBits, tunit, tunit); 29527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(fieldType); 29547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<36> typeName; 29577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::raw_svector_ostream(typeName) 29587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << "__block_literal_" << CGM.getUniqueBlockCount(); 29597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray fieldsArray = DBuilder.getOrCreateArray(fields); 29617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType type = 29637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createStructType(tunit, typeName.str(), tunit, line, 29647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getContext().toBits(block.BlockSize), 29657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getContext().toBits(block.BlockAlign), 2966c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie 0, llvm::DIType(), fieldsArray); 29677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei type = DBuilder.createPointerType(type, CGM.PointerWidthInBits); 29687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the block. 29707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned flags = llvm::DIDescriptor::FlagArtificial; 29717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *scope = LexicalBlockStack.back(); 29727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the parameter. 29747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIVariable debugVar = 29757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createLocalVariable(llvm::dwarf::DW_TAG_arg_variable, 29766537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIDescriptor(scope), 2977836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl Arg->getName(), tunit, line, type, 29787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getLangOpts().Optimize, flags, 2979836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl cast<llvm::Argument>(Arg)->getArgNo() + 1); 2980836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl 2981bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl if (LocalAddr) { 2982836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl // Insert an llvm.dbg.value into the current block. 2983bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl llvm::Instruction *DbgVal = 2984bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl DBuilder.insertDbgValueIntrinsic(LocalAddr, 0, debugVar, 2985f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher Builder.GetInsertBlock()); 2986bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl DbgVal->setDebugLoc(llvm::DebugLoc::get(line, column, scope)); 2987bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl } 2988836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl 2989bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl // Insert an llvm.dbg.declare into the current block. 2990bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl llvm::Instruction *DbgDecl = 2991bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl DBuilder.insertDeclare(Arg, debugVar, Builder.GetInsertBlock()); 2992bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl DbgDecl->setDebugLoc(llvm::DebugLoc::get(line, column, scope)); 29937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 29947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29950395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// getStaticDataMemberDeclaration - If D is an out-of-class definition of 29960395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// a static data member of a class, find its corresponding in-class 29970395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// declaration. 29980395de36004a718e265cc256b1bbee3bd3a791dcEric Christopherllvm::DIDerivedType CGDebugInfo::getStaticDataMemberDeclaration(const Decl *D) { 29990395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (cast<VarDecl>(D)->isStaticDataMember()) { 30000395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator 30010395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher MI = StaticDataMemberCache.find(D->getCanonicalDecl()); 30020395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (MI != StaticDataMemberCache.end()) 30030395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Verify the info still exists. 30040395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (llvm::Value *V = MI->second) 30050395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher return llvm::DIDerivedType(cast<llvm::MDNode>(V)); 30060395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 30070395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher return llvm::DIDerivedType(); 30080395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher} 30090395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 30107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitGlobalVariable - Emit information about a global variable. 30117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, 30127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const VarDecl *D) { 301313c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 30147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create global variable debug descriptor. 30157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(D->getLocation()); 30167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(D->getLocation()); 30177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei setLocation(D->getLocation()); 30197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType T = D->getType(); 30217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (T->isIncompleteArrayType()) { 30227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // CodeGen turns int[] into int[1] so we'll do the same here. 30247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APInt ConstVal(32, 1); 30257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ET = CGM.getContext().getAsArrayType(T)->getElementType(); 30267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = CGM.getContext().getConstantArrayType(ET, ConstVal, 30287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayType::Normal, 0); 30297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef DeclName = D->getName(); 30317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef LinkageName; 30327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (D->getDeclContext() && !isa<FunctionDecl>(D->getDeclContext()) 30337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei && !isa<ObjCMethodDecl>(D->getDeclContext())) 30347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LinkageName = Var->getName(); 30357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LinkageName == DeclName) 30367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LinkageName = StringRef(); 30376537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIDescriptor DContext = 30387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(dyn_cast<Decl>(D->getDeclContext())); 303956b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher llvm::DIGlobalVariable GV = 304056b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher DBuilder.createStaticVariable(DContext, DeclName, LinkageName, Unit, 304156b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher LineNo, getOrCreateType(T, Unit), 304256b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher Var->hasInternalLinkage(), Var, 304356b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher getStaticDataMemberDeclaration(D)); 30449faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie DeclCache.insert(std::make_pair(D->getCanonicalDecl(), llvm::WeakVH(GV))); 30457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 30467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitGlobalVariable - Emit information about an objective-c interface. 30487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, 30497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *ID) { 305013c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 30517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create global variable debug descriptor. 30527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(ID->getLocation()); 30537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(ID->getLocation()); 30547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = ID->getName(); 30567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType T = CGM.getContext().getObjCInterfaceType(ID); 30587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (T->isIncompleteArrayType()) { 30597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // CodeGen turns int[] into int[1] so we'll do the same here. 30617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APInt ConstVal(32, 1); 30627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ET = CGM.getContext().getAsArrayType(T)->getElementType(); 30637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = CGM.getContext().getConstantArrayType(ET, ConstVal, 30657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayType::Normal, 0); 30667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createGlobalVariable(Name, Unit, LineNo, 30697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(T, Unit), 30707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Var->hasInternalLinkage(), Var); 30717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 30727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitGlobalVariable - Emit global variable's debug info. 30746537f083555f9606c495d05c562878aa49bae987Eric Christophervoid CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, 30757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Constant *Init) { 307613c976710415041fca5aba25cc02d3813c74b990Eric Christopher assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); 30777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the variable. 30787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 30797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = VD->getName(); 30807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty = getOrCreateType(VD->getType(), Unit); 30817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(VD)) { 30827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const EnumDecl *ED = cast<EnumDecl>(ECD->getDeclContext()); 30837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(isa<EnumType>(ED->getTypeForDecl()) && "Enum without EnumType?"); 30847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = getOrCreateType(QualType(ED->getTypeForDecl(), 0), Unit); 30857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Do not use DIGlobalVariable for enums. 30877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty.getTag() == llvm::dwarf::DW_TAG_enumeration_type) 30887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 308956b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher llvm::DIGlobalVariable GV = 309056b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher DBuilder.createStaticVariable(Unit, Name, Name, Unit, 309156b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher getLineNumber(VD->getLocation()), Ty, true, 309256b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher Init, getStaticDataMemberDeclaration(VD)); 30939faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie DeclCache.insert(std::make_pair(VD->getCanonicalDecl(), llvm::WeakVH(GV))); 30949faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie} 30959faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie 30969faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikiellvm::DIScope CGDebugInfo::getCurrentContextDescriptor(const Decl *D) { 30979faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (!LexicalBlockStack.empty()) 30989faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return llvm::DIScope(LexicalBlockStack.back()); 30999faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return getContextDescriptor(D); 31007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 31017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3102957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikievoid CGDebugInfo::EmitUsingDirective(const UsingDirectiveDecl &UD) { 31039faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (CGM.getCodeGenOpts().getDebugInfo() < CodeGenOptions::LimitedDebugInfo) 31049faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return; 3105957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie DBuilder.createImportedModule( 31069faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie getCurrentContextDescriptor(cast<Decl>(UD.getDeclContext())), 31079faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie getOrCreateNameSpace(UD.getNominatedNamespace()), 3108957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie getLineNumber(UD.getLocation())); 3109957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie} 3110957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie 31119faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikievoid CGDebugInfo::EmitUsingDecl(const UsingDecl &UD) { 31129faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (CGM.getCodeGenOpts().getDebugInfo() < CodeGenOptions::LimitedDebugInfo) 31139faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return; 31149faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie assert(UD.shadow_size() && 31159faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie "We shouldn't be codegening an invalid UsingDecl containing no decls"); 31169faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // Emitting one decl is sufficient - debuggers can detect that this is an 31179faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // overloaded name & provide lookup for all the overloads. 31189faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie const UsingShadowDecl &USD = **UD.shadow_begin(); 311956b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher if (llvm::DIDescriptor Target = 312056b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher getDeclarationOrDefinition(USD.getUnderlyingDecl())) 31219faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie DBuilder.createImportedDeclaration( 31229faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie getCurrentContextDescriptor(cast<Decl>(USD.getDeclContext())), Target, 31239faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie getLineNumber(USD.getLocation())); 31249faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie} 31259faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie 3126fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikiellvm::DIImportedEntity 3127fc46ebc2b1345723a894ae352cfb206c1d930295David BlaikieCGDebugInfo::EmitNamespaceAlias(const NamespaceAliasDecl &NA) { 3128fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie if (CGM.getCodeGenOpts().getDebugInfo() < CodeGenOptions::LimitedDebugInfo) 3129fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie return llvm::DIImportedEntity(0); 3130fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie llvm::WeakVH &VH = NamespaceAliasCache[&NA]; 3131fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie if (VH) 3132fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie return llvm::DIImportedEntity(cast<llvm::MDNode>(VH)); 3133fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie llvm::DIImportedEntity R(0); 3134fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie if (const NamespaceAliasDecl *Underlying = 3135fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie dyn_cast<NamespaceAliasDecl>(NA.getAliasedNamespace())) 3136fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie // This could cache & dedup here rather than relying on metadata deduping. 3137fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie R = DBuilder.createImportedModule( 3138fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie getCurrentContextDescriptor(cast<Decl>(NA.getDeclContext())), 3139fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie EmitNamespaceAlias(*Underlying), getLineNumber(NA.getLocation()), 3140fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie NA.getName()); 3141fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie else 3142fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie R = DBuilder.createImportedModule( 3143fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie getCurrentContextDescriptor(cast<Decl>(NA.getDeclContext())), 3144fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie getOrCreateNameSpace(cast<NamespaceDecl>(NA.getAliasedNamespace())), 3145fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie getLineNumber(NA.getLocation()), NA.getName()); 3146fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie VH = R; 3147fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie return R; 3148fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie} 3149fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie 31507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateNamesSpace - Return namespace descriptor for the given 31517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// namespace decl. 31526537f083555f9606c495d05c562878aa49bae987Eric Christopherllvm::DINameSpace 31537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::getOrCreateNameSpace(const NamespaceDecl *NSDecl) { 31546537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DenseMap<const NamespaceDecl *, llvm::WeakVH>::iterator I = 31557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NameSpaceCache.find(NSDecl); 31567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (I != NameSpaceCache.end()) 31577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DINameSpace(cast<llvm::MDNode>(I->second)); 31586537f083555f9606c495d05c562878aa49bae987Eric Christopher 31597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(NSDecl->getLocation()); 31607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile FileD = getOrCreateFile(NSDecl->getLocation()); 31616537f083555f9606c495d05c562878aa49bae987Eric Christopher llvm::DIDescriptor Context = 31627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(dyn_cast<Decl>(NSDecl->getDeclContext())); 31637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DINameSpace NS = 31647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createNameSpace(Context, NSDecl->getName(), FileD, LineNo); 31657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NameSpaceCache[NSDecl] = llvm::WeakVH(NS); 31667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return NS; 31677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 31687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::finalize() { 31707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (std::vector<std::pair<void *, llvm::WeakVH> >::const_iterator VI 31717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ReplaceMap.begin(), VE = ReplaceMap.end(); VI != VE; ++VI) { 31727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty, RepTy; 31737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Verify that the debug info still exists. 31747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::Value *V = VI->second) 31757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = llvm::DIType(cast<llvm::MDNode>(V)); 31766537f083555f9606c495d05c562878aa49bae987Eric Christopher 31777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<void *, llvm::WeakVH>::iterator it = 31787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeCache.find(VI->first); 31797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (it != TypeCache.end()) { 31807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Verify that the debug info still exists. 31817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::Value *V = it->second) 31827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RepTy = llvm::DIType(cast<llvm::MDNode>(V)); 31837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3184ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 31859b97adfb770c3b55c1a45049d53b624bbc6f62e1Adrian Prantl if (Ty.Verify() && Ty.isForwardDecl() && RepTy.Verify()) 31867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty.replaceAllUsesWith(RepTy); 31877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3188ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 3189ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // We keep our own list of retained types, because we need to look 3190ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // up the final type in the type cache. 3191ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl for (std::vector<void *>::const_iterator RI = RetainedTypes.begin(), 3192ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl RE = RetainedTypes.end(); RI != RE; ++RI) 3193ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl DBuilder.retainType(llvm::DIType(cast<llvm::MDNode>(TypeCache[*RI]))); 3194ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 31957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.finalize(); 31967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3197