CGDebugInfo.cpp revision 776a36453a48f3d1f305b83fbdf1632dde808ab5
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) 447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : CGM(CGM), DBuilder(CGM.getModule()), 457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BlockLiteralGenericSet(false) { 467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CreateCompileUnit(); 477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::~CGDebugInfo() { 507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(LexicalBlockStack.empty() && 517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Region stack mismatch, stack not empty!"); 527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::setLocation(SourceLocation Loc) { 557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the new location isn't valid return. 567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Loc.isValid()) return; 577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurLoc = CGM.getContext().getSourceManager().getExpansionLoc(Loc); 597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we've changed files in the middle of a lexical scope go ahead 617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // and create a new lexical scope with file node if it's different 627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // from the one in the scope. 637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LexicalBlockStack.empty()) return; 647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PCLoc = SM.getPresumedLoc(CurLoc); 677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PPLoc = SM.getPresumedLoc(PrevLoc); 687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PCLoc.isInvalid() || PPLoc.isInvalid() || 707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei !strcmp(PPLoc.getFilename(), PCLoc.getFilename())) 717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *LB = LexicalBlockStack.back(); 747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIScope Scope = llvm::DIScope(LB); 757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Scope.isLexicalBlockFile()) { 767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DILexicalBlockFile LBF = llvm::DILexicalBlockFile(LB); 777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor D 787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = DBuilder.createLexicalBlockFile(LBF.getScope(), 797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateFile(CurLoc)); 807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *N = D; 817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(N); 83a6504853d297c30cfa271f4710af5a3d5db59449David Blaikie } else if (Scope.isLexicalBlock() || Scope.isSubprogram()) { 847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor D 857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = DBuilder.createLexicalBlockFile(Scope, getOrCreateFile(CurLoc)); 867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *N = D; 877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(N); 897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getContextDescriptor - Get context info for the decl. 93bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikiellvm::DIScope CGDebugInfo::getContextDescriptor(const Decl *Context) { 947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Context) 957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TheCU; 967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator 987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I = RegionMap.find(Context); 997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (I != RegionMap.end()) { 1007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = I->second; 101bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie return llvm::DIScope(dyn_cast_or_null<llvm::MDNode>(V)); 1027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check namespace. 1057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const NamespaceDecl *NSDecl = dyn_cast<NamespaceDecl>(Context)) 106bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie return getOrCreateNameSpace(NSDecl); 1077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 108bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie if (const RecordDecl *RDecl = dyn_cast<RecordDecl>(Context)) 109bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie if (!RDecl->isDependentType()) 110bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie return getOrCreateType(CGM.getContext().getTypeDeclType(RDecl), 1117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateMainFile()); 1127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TheCU; 1137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getFunctionName - Get function name for the given FunctionDecl. If the 1167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// name is constructred on demand (e.g. C++ destructor) then the name 1177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// is stored on the side. 1187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getFunctionName(const FunctionDecl *FD) { 1197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert (FD && "Invalid FunctionDecl!"); 1207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *FII = FD->getIdentifier(); 1217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionTemplateSpecializationInfo *Info 1227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = FD->getTemplateSpecializationInfo(); 1237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Info && FII) 1247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return FII->getName(); 1257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise construct human readable name for debug info. 1275eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer SmallString<128> NS; 1285eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer llvm::raw_svector_ostream OS(NS); 1295eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer FD->printName(OS); 1307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add any template specialization args. 1327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Info) { 1337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgumentList *TArgs = Info->TemplateArguments; 1347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgument *Args = TArgs->data(); 1357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumArgs = TArgs->size(); 1367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PrintingPolicy Policy(CGM.getLangOpts()); 1375eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer TemplateSpecializationType::PrintTemplateArgumentList(OS, Args, NumArgs, 1385eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer Policy); 1397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Copy this name on the side and use its reference. 1425eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer OS.flush(); 1435eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer char *StrPtr = DebugInfoNames.Allocate<char>(NS.size()); 1445eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer memcpy(StrPtr, NS.data(), NS.size()); 1455eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer return StringRef(StrPtr, NS.size()); 1467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getObjCMethodName(const ObjCMethodDecl *OMD) { 1497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<256> MethodName; 1507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::raw_svector_ostream OS(MethodName); 1517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << (OMD->isInstanceMethod() ? '-' : '+') << '['; 1527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const DeclContext *DC = OMD->getDeclContext(); 1537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const ObjCImplementationDecl *OID = 1547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<const ObjCImplementationDecl>(DC)) { 1557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << OID->getName(); 1567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (const ObjCInterfaceDecl *OID = 1577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<const ObjCInterfaceDecl>(DC)) { 1587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << OID->getName(); 1597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (const ObjCCategoryImplDecl *OCD = 1607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<const ObjCCategoryImplDecl>(DC)){ 1617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << ((const NamedDecl *)OCD)->getIdentifier()->getNameStart() << '(' << 1627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OCD->getIdentifier()->getNameStart() << ')'; 1637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << ' ' << OMD->getSelector().getAsString() << ']'; 1657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei char *StrPtr = DebugInfoNames.Allocate<char>(OS.tell()); 1677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(StrPtr, MethodName.begin(), OS.tell()); 1687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return StringRef(StrPtr, OS.tell()); 1697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getSelectorName - Return selector name. This is used for debugging 1727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// info. 1737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getSelectorName(Selector S) { 1747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const std::string &SName = S.getAsString(); 1757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei char *StrPtr = DebugInfoNames.Allocate<char>(SName.size()); 1767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(StrPtr, SName.data(), SName.size()); 1777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return StringRef(StrPtr, SName.size()); 1787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getClassName - Get class name including template argument list. 1817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef 1827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::getClassName(const RecordDecl *RD) { 1837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ClassTemplateSpecializationDecl *Spec 1847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast<ClassTemplateSpecializationDecl>(RD); 1857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Spec) 1867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return RD->getName(); 1877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgument *Args; 1897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumArgs; 1907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TypeSourceInfo *TAW = Spec->getTypeAsWritten()) { 1917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateSpecializationType *TST = 1927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<TemplateSpecializationType>(TAW->getType()); 1937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Args = TST->getArgs(); 1947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumArgs = TST->getNumArgs(); 1957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 1967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs(); 1977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Args = TemplateArgs.data(); 1987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumArgs = TemplateArgs.size(); 1997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = RD->getIdentifier()->getName(); 2017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PrintingPolicy Policy(CGM.getLangOpts()); 2025eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer SmallString<128> TemplateArgList; 2035eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer { 2045eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer llvm::raw_svector_ostream OS(TemplateArgList); 2055eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer TemplateSpecializationType::PrintTemplateArgumentList(OS, Args, NumArgs, 2065eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer Policy); 2075eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer } 2087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Copy this name on the side and use its reference. 2107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei size_t Length = Name.size() + TemplateArgList.size(); 2117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei char *StrPtr = DebugInfoNames.Allocate<char>(Length); 2127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(StrPtr, Name.data(), Name.size()); 2137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(StrPtr + Name.size(), TemplateArgList.data(), TemplateArgList.size()); 2147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return StringRef(StrPtr, Length); 2157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateFile - Get the file debug info descriptor for the input location. 2187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIFile CGDebugInfo::getOrCreateFile(SourceLocation Loc) { 2197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Loc.isValid()) 2207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If Location is not valid then use main input file. 2217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createFile(TheCU.getFilename(), TheCU.getDirectory()); 2227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 2247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PLoc = SM.getPresumedLoc(Loc); 2257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PLoc.isInvalid() || StringRef(PLoc.getFilename()).empty()) 2277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the location is not valid then use main input file. 2287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createFile(TheCU.getFilename(), TheCU.getDirectory()); 2297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Cache the results. 2317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const char *fname = PLoc.getFilename(); 2327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const char *, llvm::WeakVH>::iterator it = 2337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DIFileCache.find(fname); 2347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (it != DIFileCache.end()) { 2367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Verify that the information still exists. 2377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::Value *V = it->second) 2387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIFile(cast<llvm::MDNode>(V)); 2397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile F = DBuilder.createFile(PLoc.getFilename(), getCurrentDirname()); 2427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DIFileCache[fname] = F; 2447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return F; 2457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateMainFile - Get the file info for main compile unit. 2487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIFile CGDebugInfo::getOrCreateMainFile() { 2497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createFile(TheCU.getFilename(), TheCU.getDirectory()); 2507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getLineNumber - Get line number for the location. If location is invalid 2537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// then use current location. 2547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned CGDebugInfo::getLineNumber(SourceLocation Loc) { 2557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Loc.isInvalid() && CurLoc.isInvalid()) 2567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 2577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 2587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc); 2597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return PLoc.isValid()? PLoc.getLine() : 0; 2607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getColumnNumber - Get column number for the location. 26300df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantlunsigned CGDebugInfo::getColumnNumber(SourceLocation Loc, bool Force) { 2647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We may not want column information at all. 26500df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl if (!Force && !CGM.getCodeGenOpts().DebugColumnInfo) 2667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 2677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the location is invalid then use the current column. 2697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Loc.isInvalid() && CurLoc.isInvalid()) 2707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 2717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 2727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc); 2737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return PLoc.isValid()? PLoc.getColumn() : 0; 2747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getCurrentDirname() { 2777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CGM.getCodeGenOpts().DebugCompilationDir.empty()) 2787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CGM.getCodeGenOpts().DebugCompilationDir; 2797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CWDName.empty()) 2817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CWDName; 2827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<256> CWD; 2837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::sys::fs::current_path(CWD); 2847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei char *CompDirnamePtr = DebugInfoNames.Allocate<char>(CWD.size()); 2857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(CompDirnamePtr, CWD.data(), CWD.size()); 2867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CWDName = StringRef(CompDirnamePtr, CWD.size()); 2877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateCompileUnit - Create new compile unit. 2907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::CreateCompileUnit() { 2917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get absolute path name. 2937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 2947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string MainFileName = CGM.getCodeGenOpts().MainFileName; 2957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MainFileName.empty()) 2967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MainFileName = "<unknown>"; 2977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The main file name provided via the "-main-file-name" option contains just 2997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the file name itself with no path information. This file name may have had 3007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // a relative path, so we look into the actual file entry for the main 3017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // file to determine the real absolute path for the file. 3027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string MainFileDir; 3037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID())) { 3047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MainFileDir = MainFile->getDir()->getName(); 3057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MainFileDir != ".") 3067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MainFileName = MainFileDir + "/" + MainFileName; 3077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Save filename string. 3107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei char *FilenamePtr = DebugInfoNames.Allocate<char>(MainFileName.length()); 3117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(FilenamePtr, MainFileName.c_str(), MainFileName.length()); 3127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Filename(FilenamePtr, MainFileName.length()); 313ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher 314ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher // Save split dwarf file string. 315ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher std::string SplitDwarfFile = CGM.getCodeGenOpts().SplitDwarfFile; 316ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher char *SplitDwarfPtr = DebugInfoNames.Allocate<char>(SplitDwarfFile.length()); 317ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher memcpy(SplitDwarfPtr, SplitDwarfFile.c_str(), SplitDwarfFile.length()); 318ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher StringRef SplitDwarfFilename(SplitDwarfPtr, SplitDwarfFile.length()); 3197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LangTag; 3217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const LangOptions &LO = CGM.getLangOpts(); 3227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LO.CPlusPlus) { 3237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LO.ObjC1) 3247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_ObjC_plus_plus; 3257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 3267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_C_plus_plus; 3277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (LO.ObjC1) { 3287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_ObjC; 3297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (LO.C99) { 3307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_C99; 3317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 3327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_C89; 3337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Producer = getClangFullVersion(); 3367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Figure out which version of the ObjC runtime we have. 3387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RuntimeVers = 0; 3397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LO.ObjC1) 3407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RuntimeVers = LO.ObjCRuntime.isNonFragile() ? 2 : 1; 3417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create new compile unit. 343be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher DBuilder.createCompileUnit(LangTag, Filename, getCurrentDirname(), 344be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher Producer, LO.Optimize, 345ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher CGM.getCodeGenOpts().DwarfDebugFlags, 346ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher RuntimeVers, SplitDwarfFilename); 3477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME - Eliminate TheCU. 3487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TheCU = llvm::DICompileUnit(DBuilder.getCU()); 3497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateType - Get the Basic type from the cache or create a new 3527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// one if necessary. 3537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const BuiltinType *BT) { 3547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Encoding = 0; 3557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef BTName; 3567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (BT->getKind()) { 3577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define BUILTIN_TYPE(Id, SingletonId) 3587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define PLACEHOLDER_TYPE(Id, SingletonId) \ 3597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Id: 3607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/BuiltinTypes.def" 3617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Dependent: 3627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Unexpected builtin type"); 3637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::NullPtr: 3647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder. 3657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei createNullPtrType(BT->getName(CGM.getLangOpts())); 3667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Void: 3677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 3687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ObjCClass: 3697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ClassTy.Verify()) 3707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ClassTy; 3717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ClassTy = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 3727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "objc_class", TheCU, 3737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateMainFile(), 0); 3747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ClassTy; 3757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ObjCId: { 3767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // typedef struct objc_class *Class; 3777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // typedef struct objc_object { 3787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Class isa; 3797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // } *id; 3807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ObjTy.Verify()) 3827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ObjTy; 3837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ClassTy.Verify()) 3857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ClassTy = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 3867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "objc_class", TheCU, 3877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateMainFile(), 0); 3887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 3907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType ISATy = DBuilder.createPointerType(ClassTy, Size); 3927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 393f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher ObjTy = 394c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie DBuilder.createStructType(TheCU, "objc_object", getOrCreateMainFile(), 395c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie 0, 0, 0, 0, llvm::DIType(), llvm::DIArray()); 3967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 397f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher ObjTy.setTypeArray(DBuilder.getOrCreateArray(&*DBuilder.createMemberType( 398f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher ObjTy, "isa", getOrCreateMainFile(), 0, Size, 0, 0, 0, ISATy))); 3997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ObjTy; 4007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ObjCSel: { 4027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SelTy.Verify()) 4037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SelTy; 4047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SelTy = 4057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 4067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "objc_selector", TheCU, getOrCreateMainFile(), 4077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 0); 4087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SelTy; 4097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 410b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei 411b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage1d: 412b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return getOrCreateStructPtrType("opencl_image1d_t", 413b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage1dDITy); 414b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage1dArray: 415b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return getOrCreateStructPtrType("opencl_image1d_array_t", 416b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage1dArrayDITy); 417b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage1dBuffer: 418b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return getOrCreateStructPtrType("opencl_image1d_buffer_t", 419b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage1dBufferDITy); 420b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage2d: 421b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return getOrCreateStructPtrType("opencl_image2d_t", 422b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage2dDITy); 423b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage2dArray: 424b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return getOrCreateStructPtrType("opencl_image2d_array_t", 425b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage2dArrayDITy); 426b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage3d: 427b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return getOrCreateStructPtrType("opencl_image3d_t", 428b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei OCLImage3dDITy); 42921f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei case BuiltinType::OCLSampler: 43021f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei return DBuilder.createBasicType("opencl_sampler_t", 43121f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei CGM.getContext().getTypeSize(BT), 43221f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei CGM.getContext().getTypeAlign(BT), 43321f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei llvm::dwarf::DW_ATE_unsigned); 434e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case BuiltinType::OCLEvent: 435e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei return getOrCreateStructPtrType("opencl_event_t", 436e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei OCLEventDITy); 437b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei 4387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UChar: 4397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char_U: Encoding = llvm::dwarf::DW_ATE_unsigned_char; break; 4407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char_S: 4417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::SChar: Encoding = llvm::dwarf::DW_ATE_signed_char; break; 4427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char16: 4437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char32: Encoding = llvm::dwarf::DW_ATE_UTF; break; 4447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UShort: 4457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UInt: 4467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UInt128: 4477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULong: 4487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::WChar_U: 4497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULongLong: Encoding = llvm::dwarf::DW_ATE_unsigned; break; 4507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Short: 4517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Int: 4527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Int128: 4537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Long: 4547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::WChar_S: 4557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::LongLong: Encoding = llvm::dwarf::DW_ATE_signed; break; 4567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Bool: Encoding = llvm::dwarf::DW_ATE_boolean; break; 4577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Half: 4587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Float: 4597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::LongDouble: 4607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Double: Encoding = llvm::dwarf::DW_ATE_float; break; 4617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (BT->getKind()) { 4647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Long: BTName = "long int"; break; 4657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::LongLong: BTName = "long long int"; break; 4667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULong: BTName = "long unsigned int"; break; 4677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULongLong: BTName = "long long unsigned int"; break; 4687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 4697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BTName = BT->getName(CGM.getLangOpts()); 4707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 4717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 4737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(BT); 4747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(BT); 4757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType DbgTy = 4767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createBasicType(BTName, Size, Align, Encoding); 4777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 4787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 4797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ComplexType *Ty) { 4817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 4827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Encoding = llvm::dwarf::DW_ATE_complex_float; 4837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty->isComplexIntegerType()) 4847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Encoding = llvm::dwarf::DW_ATE_lo_user; 4857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 4877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 4887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType DbgTy = 4897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createBasicType("complex", Size, Align, Encoding); 4907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 4927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 4937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateCVRType - Get the qualified type from the cache or create 4957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a new one if necessary. 4967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateQualifiedType(QualType Ty, llvm::DIFile Unit) { 4977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualifierCollector Qc; 4987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Type *T = Qc.strip(Ty); 4997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore these qualifiers for now. 5017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeObjCGCAttr(); 5027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeAddressSpace(); 5037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeObjCLifetime(); 5047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We will create one Derived type for one qualifier and recurse to handle any 5067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // additional ones. 5077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Tag; 5087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Qc.hasConst()) { 5097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_const_type; 5107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeConst(); 5117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Qc.hasVolatile()) { 5127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_volatile_type; 5137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeVolatile(); 5147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Qc.hasRestrict()) { 5157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_restrict_type; 5167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeRestrict(); 5177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 5187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Qc.empty() && "Unknown type qualifier for debug info"); 5197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(QualType(T, 0), Unit); 5207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FromTy = getOrCreateType(Qc.apply(CGM.getContext(), T), Unit); 5237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // No need to fill in the Name, Line, Size, Alignment, Offset in case of 5257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // CVR derived types. 5267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType DbgTy = DBuilder.createQualifiedType(Tag, FromTy); 5277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 5297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ObjCObjectPointerType *Ty, 5327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 53305f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian 53405f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian // The frontend treats 'id' as a typedef to an ObjCObjectType, 53505f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian // whereas 'id<protocol>' is treated as an ObjCPointerType. For the 53605f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian // debug info, we want to emit 'id' in both cases. 53705f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian if (Ty->isObjCQualifiedIdType()) 53805f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian return getOrCreateType(CGM.getContext().getObjCIdType(), Unit); 53905f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian 5407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType DbgTy = 5417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty, 5427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty->getPointeeType(), Unit); 5437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 5447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const PointerType *Ty, 5477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 5487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty, 5497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty->getPointeeType(), Unit); 5507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Creates a forward declaration for a RecordDecl in the given context. 5537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::createRecordFwdDecl(const RecordDecl *RD, 5547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor Ctx) { 5557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); 5567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(RD->getLocation()); 5577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef RDName = getClassName(RD); 5587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Tag = 0; 5607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RD->isStruct() || RD->isInterface()) 5617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_structure_type; 5627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (RD->isUnion()) 5637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_union_type; 5647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 5657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(RD->isClass()); 5667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_class_type; 5677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the type. 5707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createForwardDecl(Tag, RDName, Ctx, DefUnit, Line); 5717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Walk up the context chain and create forward decls for record decls, 5747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// and normal descriptors for namespaces. 5757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIDescriptor CGDebugInfo::createContextChain(const Decl *Context) { 5767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Context) 5777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TheCU; 5787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // See if we already have the parent. 5807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator 5817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I = RegionMap.find(Context); 5827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (I != RegionMap.end()) { 5837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = I->second; 5847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIDescriptor(dyn_cast_or_null<llvm::MDNode>(V)); 5857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check namespace. 5887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const NamespaceDecl *NSDecl = dyn_cast<NamespaceDecl>(Context)) 5897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIDescriptor(getOrCreateNameSpace(NSDecl)); 5907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const RecordDecl *RD = dyn_cast<RecordDecl>(Context)) { 5927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!RD->isDependentType()) { 5937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty = getOrCreateLimitedType(CGM.getContext().getTypeDeclType(RD), 594be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher getOrCreateMainFile()); 5957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIDescriptor(Ty); 5967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TheCU; 5997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreatePointeeType - Create Pointee type. If Pointee is a record 6027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// then emit record's fwd if debug info size reduction is enabled. 6037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreatePointeeType(QualType PointeeTy, 6047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 6057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CGM.getCodeGenOpts().getDebugInfo() != CodeGenOptions::LimitedDebugInfo) 6067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(PointeeTy, Unit); 6077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Limit debug info for the pointee type. 6097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we have an existing type, use that, it's still smaller than creating 6117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // a new type. 6127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty = getTypeOrNull(PointeeTy); 6137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty.Verify()) return Ty; 6147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Handle qualifiers. 6167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PointeeTy.hasLocalQualifiers()) 6177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateQualifiedType(PointeeTy, Unit); 6187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const RecordType *RTy = dyn_cast<RecordType>(PointeeTy)) { 6207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordDecl *RD = RTy->getDecl(); 6217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor FDContext = 6227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(cast<Decl>(RD->getDeclContext())); 6237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RetTy = createRecordFwdDecl(RD, FDContext); 6247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeCache[QualType(RTy, 0).getAsOpaquePtr()] = RetTy; 6257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return RetTy; 6267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(PointeeTy, Unit); 6287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreatePointerLikeType(unsigned Tag, 6317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Type *Ty, 6327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType PointeeTy, 6337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 6347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Tag == llvm::dwarf::DW_TAG_reference_type || 6357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag == llvm::dwarf::DW_TAG_rvalue_reference_type) 6367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createReferenceType(Tag, 6377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CreatePointeeType(PointeeTy, Unit)); 63805f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian 6397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 6407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Size is always the size of a pointer. We can't use getTypeSize here 6417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // because that does not return the correct value for references. 6427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned AS = CGM.getContext().getTargetAddressSpace(PointeeTy); 64364aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall uint64_t Size = CGM.getTarget().getPointerWidth(AS); 6447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 6457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createPointerType(CreatePointeeType(PointeeTy, Unit), 6477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size, Align); 6487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 650b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyeillvm::DIType CGDebugInfo::getOrCreateStructPtrType(StringRef Name, llvm::DIType &Cache) { 651b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei if (Cache.Verify()) 652b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return Cache; 653b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei Cache = 654b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 655b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei Name, TheCU, getOrCreateMainFile(), 656b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei 0); 657b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 658b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei Cache = DBuilder.createPointerType(Cache, Size); 659b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return Cache; 660b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei} 661b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei 6627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const BlockPointerType *Ty, 6637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 6647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (BlockLiteralGenericSet) 6657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return BlockLiteralGeneric; 6667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 8> EltTys; 6687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy; 6697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FType; 6707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize, FieldOffset; 6717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign; 6727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray Elements; 6737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType EltTy, DescTy; 6747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 6767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().UnsignedLongTy; 6777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "reserved", &FieldOffset)); 6787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "Size", &FieldOffset)); 6797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elements = DBuilder.getOrCreateArray(EltTys); 6817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.clear(); 6827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = llvm::DIDescriptor::FlagAppleBlock; 6847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(CurLoc); 6857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTy = DBuilder.createStructType(Unit, "__block_descriptor", 6877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unit, LineNo, FieldOffset, 0, 688c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie Flags, llvm::DIType(), Elements); 6897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 6917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 6927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DescTy = DBuilder.createPointerType(EltTy, Size); 6947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 6967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 6977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset)); 6987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().IntTy; 6997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset)); 7007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__reserved", &FieldOffset)); 7017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 7027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__FuncPtr", &FieldOffset)); 7037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 7057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldTy = DescTy; 7067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize = CGM.getContext().getTypeSize(Ty); 7077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldAlign = CGM.getContext().getTypeAlign(Ty); 7087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldTy = DBuilder.createMemberType(Unit, "__descriptor", Unit, 7097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LineNo, FieldSize, FieldAlign, 7107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset, 0, FieldTy); 7117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(FieldTy); 7127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset += FieldSize; 7147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elements = DBuilder.getOrCreateArray(EltTys); 7157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTy = DBuilder.createStructType(Unit, "__block_literal_generic", 7177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unit, LineNo, FieldOffset, 0, 718c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie Flags, llvm::DIType(), Elements); 7197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BlockLiteralGenericSet = true; 7217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BlockLiteralGeneric = DBuilder.createPointerType(EltTy, Size); 7227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return BlockLiteralGeneric; 7237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const TypedefType *Ty, llvm::DIFile Unit) { 7267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Typedefs are derived from some other type. If we have a typedef of a 7277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // typedef, make sure to emit the whole chain. 7287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Src = getOrCreateType(Ty->getDecl()->getUnderlyingType(), Unit); 7297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Src.Verify()) 7307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 7317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We don't set size information, but do specify where the typedef was 7327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // declared. 7337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(Ty->getDecl()->getLocation()); 7347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TypedefNameDecl *TyDecl = Ty->getDecl(); 7357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor TypedefContext = 7377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(cast<Decl>(Ty->getDecl()->getDeclContext())); 7387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 7407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createTypedef(Src, TyDecl->getName(), Unit, Line, TypedefContext); 7417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const FunctionType *Ty, 7447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 7457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> EltTys; 7467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add the result type at least. 7487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(getOrCreateType(Ty->getResultType(), Unit)); 7497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Set up remainder of arguments if there is a prototype. 7517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: IF NOT, HOW IS THIS REPRESENTED? llvm-gcc doesn't represent '...'! 7527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<FunctionNoProtoType>(Ty)) 7537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(DBuilder.createUnspecifiedParameter()); 7547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(Ty)) { 7557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0, e = FPT->getNumArgs(); i != e; ++i) 7567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(getOrCreateType(FPT->getArgType(i), Unit)); 7577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(EltTys); 7607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createSubroutineType(Unit, EltTypeArray); 7617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::createFieldType(StringRef name, 7657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType type, 7667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t sizeInBitsOverride, 7677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation loc, 7687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei AccessSpecifier AS, 7697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t offsetInBits, 7707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile tunit, 7717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor scope) { 7727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType debugType = getOrCreateType(type, tunit); 7737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the location for the field. 7757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile file = getOrCreateFile(loc); 7767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned line = getLineNumber(loc); 7777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t sizeInBits = 0; 7797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned alignInBits = 0; 7807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!type->isIncompleteArrayType()) { 7817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::tie(sizeInBits, alignInBits) = CGM.getContext().getTypeInfo(type); 7827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (sizeInBitsOverride) 7847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei sizeInBits = sizeInBitsOverride; 7857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned flags = 0; 7887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (AS == clang::AS_private) 7897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei flags |= llvm::DIDescriptor::FlagPrivate; 7907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (AS == clang::AS_protected) 7917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei flags |= llvm::DIDescriptor::FlagProtected; 7927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createMemberType(scope, name, file, line, sizeInBits, 7947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei alignInBits, offsetInBits, flags, debugType); 7957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7970395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// CollectRecordLambdaFields - Helper for CollectRecordFields. 7980395de36004a718e265cc256b1bbee3bd3a791dcEric Christophervoid CGDebugInfo:: 7990395de36004a718e265cc256b1bbee3bd3a791dcEric ChristopherCollectRecordLambdaFields(const CXXRecordDecl *CXXDecl, 8000395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SmallVectorImpl<llvm::Value *> &elements, 8010395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType RecordTy) { 8020395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // For C++11 Lambdas a Field will be the same as a Capture, but the Capture 8030395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // has the name and the location of the variable so we should iterate over 8040395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // both concurrently. 8050395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(CXXDecl); 8060395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher RecordDecl::field_iterator Field = CXXDecl->field_begin(); 8070395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher unsigned fieldno = 0; 8080395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher for (CXXRecordDecl::capture_const_iterator I = CXXDecl->captures_begin(), 8090395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher E = CXXDecl->captures_end(); I != E; ++I, ++Field, ++fieldno) { 8100395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const LambdaExpr::Capture C = *I; 8110395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (C.capturesVariable()) { 8120395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher VarDecl *V = C.getCapturedVar(); 8130395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIFile VUnit = getOrCreateFile(C.getLocation()); 8140395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StringRef VName = V->getName(); 8150395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher uint64_t SizeInBitsOverride = 0; 8160395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (Field->isBitField()) { 8170395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SizeInBitsOverride = Field->getBitWidthValue(CGM.getContext()); 8180395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher assert(SizeInBitsOverride && "found named 0-width bitfield"); 8190395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 8200395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType fieldType 8210395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher = createFieldType(VName, Field->getType(), SizeInBitsOverride, 8220395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher C.getLocation(), Field->getAccess(), 8230395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher layout.getFieldOffset(fieldno), VUnit, RecordTy); 8240395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher elements.push_back(fieldType); 8250395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } else { 8260395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // TODO: Need to handle 'this' in some way by probably renaming the 8270395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // this of the lambda class and having a field member of 'this' or 8280395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // by using AT_object_pointer for the function and having that be 8290395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // used as 'this' for semantic references. 8300395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher assert(C.capturesThis() && "Field that isn't captured and isn't this?"); 8310395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher FieldDecl *f = *Field; 8320395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIFile VUnit = getOrCreateFile(f->getLocation()); 8330395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher QualType type = f->getType(); 8340395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType fieldType 8350395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher = createFieldType("this", type, 0, f->getLocation(), f->getAccess(), 8360395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher layout.getFieldOffset(fieldno), VUnit, RecordTy); 8370395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8380395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher elements.push_back(fieldType); 8390395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 8400395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 8410395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher} 8420395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8430395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// CollectRecordStaticField - Helper for CollectRecordFields. 8440395de36004a718e265cc256b1bbee3bd3a791dcEric Christophervoid CGDebugInfo:: 8450395de36004a718e265cc256b1bbee3bd3a791dcEric ChristopherCollectRecordStaticField(const VarDecl *Var, 8460395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SmallVectorImpl<llvm::Value *> &elements, 8470395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType RecordTy) { 8480395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Create the descriptor for the static variable, with or without 8490395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // constant initializers. 8500395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIFile VUnit = getOrCreateFile(Var->getLocation()); 8510395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType VTy = getOrCreateType(Var->getType(), VUnit); 8520395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8530395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Do not describe enums as static members. 8540395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (VTy.getTag() == llvm::dwarf::DW_TAG_enumeration_type) 8550395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher return; 8560395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8570395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher unsigned LineNumber = getLineNumber(Var->getLocation()); 8580395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StringRef VName = Var->getName(); 859a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie llvm::Constant *C = NULL; 8600395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (Var->getInit()) { 8610395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const APValue *Value = Var->evaluateValue(); 862a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie if (Value) { 863a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie if (Value->isInt()) 864a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie C = llvm::ConstantInt::get(CGM.getLLVMContext(), Value->getInt()); 865a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie if (Value->isFloat()) 866a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie C = llvm::ConstantFP::get(CGM.getLLVMContext(), Value->getFloat()); 867a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie } 8680395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 8690395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8700395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher unsigned Flags = 0; 8710395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher AccessSpecifier Access = Var->getAccess(); 8720395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (Access == clang::AS_private) 8730395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher Flags |= llvm::DIDescriptor::FlagPrivate; 8740395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher else if (Access == clang::AS_protected) 8750395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher Flags |= llvm::DIDescriptor::FlagProtected; 8760395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8770395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType GV = DBuilder.createStaticMemberType(RecordTy, VName, VUnit, 878a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie LineNumber, VTy, Flags, C); 8790395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher elements.push_back(GV); 8800395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StaticDataMemberCache[Var->getCanonicalDecl()] = llvm::WeakVH(GV); 8810395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher} 8820395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8830395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// CollectRecordNormalField - Helper for CollectRecordFields. 8840395de36004a718e265cc256b1bbee3bd3a791dcEric Christophervoid CGDebugInfo:: 8850395de36004a718e265cc256b1bbee3bd3a791dcEric ChristopherCollectRecordNormalField(const FieldDecl *field, uint64_t OffsetInBits, 8860395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIFile tunit, 8870395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SmallVectorImpl<llvm::Value *> &elements, 8880395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType RecordTy) { 8890395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StringRef name = field->getName(); 8900395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher QualType type = field->getType(); 8910395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8920395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Ignore unnamed fields unless they're anonymous structs/unions. 8930395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (name.empty() && !type->isRecordType()) 8940395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher return; 8950395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 8960395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher uint64_t SizeInBitsOverride = 0; 8970395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (field->isBitField()) { 8980395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher SizeInBitsOverride = field->getBitWidthValue(CGM.getContext()); 8990395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher assert(SizeInBitsOverride && "found named 0-width bitfield"); 9000395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 9010395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9020395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DIType fieldType 9030395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher = createFieldType(name, type, SizeInBitsOverride, 9040395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher field->getLocation(), field->getAccess(), 9050395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher OffsetInBits, tunit, RecordTy); 9060395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9070395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher elements.push_back(fieldType); 9080395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher} 9090395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectRecordFields - A helper function to collect debug info for 9117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// record fields. This is used while creating debug info entry for a Record. 9127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 9137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectRecordFields(const RecordDecl *record, llvm::DIFile tunit, 9147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &elements, 9157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 9167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(record); 9177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9180395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (CXXDecl && CXXDecl->isLambda()) 9190395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher CollectRecordLambdaFields(CXXDecl, elements, RecordTy); 9200395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher else { 9210395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(record); 9220395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9230395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Field number for non-static fields. 924fd5ac0d75abd6ead8dd39bf526b34eeaff81cef6Eric Christopher unsigned fieldNo = 0; 9250395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 9260395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Bookkeeping for an ms struct, which ignores certain fields. 9277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsMsStruct = record->isMsStruct(CGM.getContext()); 9287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FieldDecl *LastFD = 0; 9297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9300395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Static and non-static members should appear in the same order as 9310395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // the corresponding declarations in the source program. 9320395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher for (RecordDecl::decl_iterator I = record->decls_begin(), 9330395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher E = record->decls_end(); I != E; ++I) 9340395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (const VarDecl *V = dyn_cast<VarDecl>(*I)) 9350395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher CollectRecordStaticField(V, elements, RecordTy); 9360395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher else if (FieldDecl *field = dyn_cast<FieldDecl>(*I)) { 9370395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (IsMsStruct) { 9380395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Zero-length bitfields following non-bitfield members are 9390395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // completely ignored; we don't even count them. 9400395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (CGM.getContext().ZeroBitfieldFollowsNonBitfield((field), LastFD)) 9410395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher continue; 9420395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher LastFD = field; 9430395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 9440395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher CollectRecordNormalField(field, layout.getFieldOffset(fieldNo), 9450395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher tunit, elements, RecordTy); 9467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9470395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Bump field number for next field. 9480395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher ++fieldNo; 9497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 9527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateMethodType - CXXMethodDecl's type is a FunctionType. This 9547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// function type is not updated to include implicit "this" pointer. Use this 9557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// routine to get a method type which includes "this" pointer. 9567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType 9577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::getOrCreateMethodType(const CXXMethodDecl *Method, 9587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 9599c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie const FunctionProtoType *Func = Method->getType()->getAs<FunctionProtoType>(); 96067f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie if (Method->isStatic()) 9619c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie return getOrCreateType(QualType(Func, 0), Unit); 9629c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie return getOrCreateInstanceMethodType(Method->getThisType(CGM.getContext()), 9639c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie Func, Unit); 9649c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie} 96567f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie 9669c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikiellvm::DIType CGDebugInfo::getOrCreateInstanceMethodType( 9679c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie QualType ThisPtr, const FunctionProtoType *Func, llvm::DIFile Unit) { 9687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add "this" pointer. 9699c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie llvm::DIArray Args = llvm::DICompositeType( 9709c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie getOrCreateType(QualType(Func, 0), Unit)).getTypeArray(); 9717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert (Args.getNumElements() && "Invalid number of arguments!"); 9727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> Elts; 9747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // First element is always return type. For 'void' functions it is NULL. 9767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elts.push_back(Args.getElement(0)); 9777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 97867f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // "this" pointer is always first argument. 9799c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie const CXXRecordDecl *RD = ThisPtr->getPointeeCXXRecordDecl(); 98067f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie if (isa<ClassTemplateSpecializationDecl>(RD)) { 98167f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // Create pointer type directly in this case. 98267f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie const PointerType *ThisPtrTy = cast<PointerType>(ThisPtr); 98367f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie QualType PointeeTy = ThisPtrTy->getPointeeType(); 98467f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie unsigned AS = CGM.getContext().getTargetAddressSpace(PointeeTy); 98564aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall uint64_t Size = CGM.getTarget().getPointerWidth(AS); 98667f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie uint64_t Align = CGM.getContext().getTypeAlign(ThisPtrTy); 98767f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie llvm::DIType PointeeType = getOrCreateType(PointeeTy, Unit); 98867f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie llvm::DIType ThisPtrType = DBuilder.createPointerType(PointeeType, Size, Align); 98967f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie TypeCache[ThisPtr.getAsOpaquePtr()] = ThisPtrType; 99067f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // TODO: This and the artificial type below are misleading, the 99167f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // types aren't artificial the argument is, but the current 99267f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // metadata doesn't represent that. 99367f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType); 99467f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie Elts.push_back(ThisPtrType); 99567f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie } else { 99667f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie llvm::DIType ThisPtrType = getOrCreateType(ThisPtr, Unit); 99767f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie TypeCache[ThisPtr.getAsOpaquePtr()] = ThisPtrType; 99867f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType); 99967f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie Elts.push_back(ThisPtrType); 10007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Copy rest of the arguments. 10037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 1, e = Args.getNumElements(); i != e; ++i) 10047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elts.push_back(Args.getElement(i)); 10057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(Elts); 10077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createSubroutineType(Unit, EltTypeArray); 10097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// isFunctionLocalClass - Return true if CXXRecordDecl is defined 10127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// inside a function. 10137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool isFunctionLocalClass(const CXXRecordDecl *RD) { 10147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXRecordDecl *NRD = dyn_cast<CXXRecordDecl>(RD->getDeclContext())) 10157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return isFunctionLocalClass(NRD); 10167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<FunctionDecl>(RD->getDeclContext())) 10177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 10187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 10197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateCXXMemberFunction - A helper function to create a DISubprogram for 10227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a single member function GlobalDecl. 10237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DISubprogram 10247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::CreateCXXMemberFunction(const CXXMethodDecl *Method, 10257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit, 10267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 10277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsCtorOrDtor = 10287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei isa<CXXConstructorDecl>(Method) || isa<CXXDestructorDecl>(Method); 10297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef MethodName = getFunctionName(Method); 10317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType MethodTy = getOrCreateMethodType(Method, Unit); 10327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Since a single ctor/dtor corresponds to multiple functions, it doesn't 10347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // make sense to give a single ctor/dtor a linkage name. 10357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef MethodLinkageName; 10367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!IsCtorOrDtor && !isFunctionLocalClass(Method->getParent())) 10377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MethodLinkageName = CGM.getMangledName(Method); 10387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the location for the method. 10407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile MethodDefUnit = getOrCreateFile(Method->getLocation()); 10417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned MethodLine = getLineNumber(Method->getLocation()); 10427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Collect virtual method info. 10447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType ContainingType; 10457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Virtuality = 0; 10467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned VIndex = 0; 10477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->isVirtual()) { 10497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->isPure()) 10507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Virtuality = llvm::dwarf::DW_VIRTUALITY_pure_virtual; 10517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 10527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Virtuality = llvm::dwarf::DW_VIRTUALITY_virtual; 10537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // It doesn't make sense to give a virtual destructor a vtable index, 10557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // since a single destructor has two entries in the vtable. 10567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!isa<CXXDestructorDecl>(Method)) 10577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VIndex = CGM.getVTableContext().getMethodVTableIndex(Method); 10587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContainingType = RecordTy; 10597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 10627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->isImplicit()) 10637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagArtificial; 10647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei AccessSpecifier Access = Method->getAccess(); 10657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Access == clang::AS_private) 10667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrivate; 10677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (Access == clang::AS_protected) 10687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagProtected; 10697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXConstructorDecl *CXXC = dyn_cast<CXXConstructorDecl>(Method)) { 10707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXC->isExplicit()) 10717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagExplicit; 10727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (const CXXConversionDecl *CXXC = 10737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<CXXConversionDecl>(Method)) { 10747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXC->isExplicit()) 10757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagExplicit; 10767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->hasPrototype()) 10787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrototyped; 10797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray TParamsArray = CollectFunctionTemplateParams(Method, Unit); 10817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DISubprogram SP = 10827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createMethod(RecordTy, MethodName, MethodLinkageName, 10837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MethodDefUnit, MethodLine, 10847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MethodTy, /*isLocalToUnit=*/false, 10857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /* isDefinition=*/ false, 10867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Virtuality, VIndex, ContainingType, 10877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags, CGM.getLangOpts().Optimize, NULL, 10887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TParamsArray); 10897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SPCache[Method->getCanonicalDecl()] = llvm::WeakVH(SP); 10917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SP; 10937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectCXXMemberFunctions - A helper function to collect debug info for 10967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// C++ member functions. This is used while creating debug info entry for 10977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a Record. 10987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 10997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectCXXMemberFunctions(const CXXRecordDecl *RD, llvm::DIFile Unit, 11007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &EltTys, 11017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 11027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Since we want more than just the individual member decls if we 11047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // have templated functions iterate over every declaration to gather 11057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the functions. 11067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for(DeclContext::decl_iterator I = RD->decls_begin(), 11077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = RD->decls_end(); I != E; ++I) { 11087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decl *D = *I; 11097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (D->isImplicit() && !D->isUsed()) 11107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 11117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) 11137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateCXXMemberFunction(Method, Unit, RecordTy)); 11147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (FunctionTemplateDecl *FTD = dyn_cast<FunctionTemplateDecl>(D)) 11157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (FunctionTemplateDecl::spec_iterator SI = FTD->spec_begin(), 11167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SE = FTD->spec_end(); SI != SE; ++SI) 11177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateCXXMemberFunction(cast<CXXMethodDecl>(*SI), Unit, 11187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordTy)); 11197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 11217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectCXXFriends - A helper function to collect debug info for 11237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// C++ base classes. This is used while creating debug info entry for 11247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a Record. 11257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 11267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectCXXFriends(const CXXRecordDecl *RD, llvm::DIFile Unit, 11277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &EltTys, 11287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 11297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (CXXRecordDecl::friend_iterator BI = RD->friend_begin(), 11307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BE = RD->friend_end(); BI != BE; ++BI) { 11317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if ((*BI)->isUnsupportedFriend()) 11327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 11337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TypeSourceInfo *TInfo = (*BI)->getFriendType()) 11347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(DBuilder.createFriend(RecordTy, 11357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(TInfo->getType(), 11367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unit))); 11377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 11397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectCXXBases - A helper function to collect debug info for 11417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// C++ base classes. This is used while creating debug info entry for 11427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// a Record. 11437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 11447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile Unit, 11457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &EltTys, 11467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType RecordTy) { 11477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 11497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (CXXRecordDecl::base_class_const_iterator BI = RD->bases_begin(), 11507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BE = RD->bases_end(); BI != BE; ++BI) { 11517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned BFlags = 0; 11527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t BaseOffset; 11537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *Base = 11557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<CXXRecordDecl>(BI->getType()->getAs<RecordType>()->getDecl()); 11567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (BI->isVirtual()) { 11587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // virtual base offset offset is -ve. The code generator emits dwarf 11597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // expression where it expects +ve number. 11607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BaseOffset = 11617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 0 - CGM.getVTableContext() 11627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei .getVirtualBaseOffsetOffset(RD, Base).getQuantity(); 11637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BFlags = llvm::DIDescriptor::FlagVirtual; 11647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else 11657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BaseOffset = CGM.getContext().toBits(RL.getBaseClassOffset(Base)); 11667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Inconsistent units for BaseOffset. It is in bytes when 11677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // BI->isVirtual() and bits when not. 11687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei AccessSpecifier Access = BI->getAccessSpecifier(); 11707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Access == clang::AS_private) 11717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BFlags |= llvm::DIDescriptor::FlagPrivate; 11727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (Access == clang::AS_protected) 11737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BFlags |= llvm::DIDescriptor::FlagProtected; 11747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType DTy = 11767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createInheritance(RecordTy, 11777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(BI->getType(), Unit), 11787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BaseOffset, BFlags); 11797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(DTy); 11807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 11827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectTemplateParams - A helper function to collect template parameters. 11847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIArray CGDebugInfo:: 11857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectTemplateParams(const TemplateParameterList *TPList, 11867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgumentList &TAList, 11877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 11887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> TemplateParams; 11897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0, e = TAList.size(); i != e; ++i) { 11907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgument &TA = TAList[i]; 11917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const NamedDecl *ND = TPList->getParam(i); 11929dfd24324c079b564dda936c6ae46898b82121e2David Blaikie switch (TA.getKind()) { 11939dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Type: { 11947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType TTy = getOrCreateType(TA.getAsType(), Unit); 11957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DITemplateTypeParameter TTP = 11967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createTemplateTypeParameter(TheCU, ND->getName(), TTy); 11977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateParams.push_back(TTP); 11989dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 11999dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Integral: { 12007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType TTy = getOrCreateType(TA.getIntegralType(), Unit); 12017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DITemplateValueParameter TVP = 12029dfd24324c079b564dda936c6ae46898b82121e2David Blaikie DBuilder.createTemplateValueParameter( 12039dfd24324c079b564dda936c6ae46898b82121e2David Blaikie TheCU, ND->getName(), TTy, 12049dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::ConstantInt::get(CGM.getLLVMContext(), TA.getAsIntegral())); 12059dfd24324c079b564dda936c6ae46898b82121e2David Blaikie TemplateParams.push_back(TVP); 12069dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 12079dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Declaration: { 12089dfd24324c079b564dda936c6ae46898b82121e2David Blaikie const ValueDecl *D = TA.getAsDecl(); 12099dfd24324c079b564dda936c6ae46898b82121e2David Blaikie bool InstanceMember = D->isCXXInstanceMember(); 12109dfd24324c079b564dda936c6ae46898b82121e2David Blaikie QualType T = InstanceMember 12119dfd24324c079b564dda936c6ae46898b82121e2David Blaikie ? CGM.getContext().getMemberPointerType( 12129dfd24324c079b564dda936c6ae46898b82121e2David Blaikie D->getType(), cast<RecordDecl>(D->getDeclContext()) 12139dfd24324c079b564dda936c6ae46898b82121e2David Blaikie ->getTypeForDecl()) 12149dfd24324c079b564dda936c6ae46898b82121e2David Blaikie : CGM.getContext().getPointerType(D->getType()); 12159dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::DIType TTy = getOrCreateType(T, Unit); 12169dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::Value *V = 0; 12179dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Variable pointer template parameters have a value that is the address 12189dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // of the variable. 12199dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (const VarDecl *VD = dyn_cast<VarDecl>(D)) 12209dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.GetAddrOfGlobalVar(VD); 12219dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Member function pointers have special support for building them, though 12229dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // this is currently unsupported in LLVM CodeGen. 12239dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (InstanceMember) 12249dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (const CXXMethodDecl *method = dyn_cast<CXXMethodDecl>(D)) 12259dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.getCXXABI().EmitMemberPointer(method); 12269dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Member data pointers have special handling too to compute the fixed 12279dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // offset within the object. 12289dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (isa<FieldDecl>(D)) { 12299dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // These five lines (& possibly the above member function pointer 12309dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // handling) might be able to be refactored to use similar code in 12319dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // CodeGenModule::getMemberPointerConstant 12329dfd24324c079b564dda936c6ae46898b82121e2David Blaikie uint64_t fieldOffset = CGM.getContext().getFieldOffset(D); 12339dfd24324c079b564dda936c6ae46898b82121e2David Blaikie CharUnits chars = 12349dfd24324c079b564dda936c6ae46898b82121e2David Blaikie CGM.getContext().toCharUnitsFromBits((int64_t) fieldOffset); 12359dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.getCXXABI().EmitMemberDataPointer( 12369dfd24324c079b564dda936c6ae46898b82121e2David Blaikie cast<MemberPointerType>(T.getTypePtr()), chars); 12379dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } 12389dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::DITemplateValueParameter TVP = 12399dfd24324c079b564dda936c6ae46898b82121e2David Blaikie DBuilder.createTemplateValueParameter(TheCU, ND->getName(), TTy, V); 12409dfd24324c079b564dda936c6ae46898b82121e2David Blaikie TemplateParams.push_back(TVP); 12419dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 12429dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::NullPtr: { 12439dfd24324c079b564dda936c6ae46898b82121e2David Blaikie QualType T = TA.getNullPtrType(); 12449dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::DIType TTy = getOrCreateType(T, Unit); 12459dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::Value *V = 0; 12469dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Special case member data pointer null values since they're actually -1 12479dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // instead of zero. 12489dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (const MemberPointerType *MPT = 12499dfd24324c079b564dda936c6ae46898b82121e2David Blaikie dyn_cast<MemberPointerType>(T.getTypePtr())) 12509dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // But treat member function pointers as simple zero integers because 12519dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // it's easier than having a special case in LLVM's CodeGen. If LLVM 12529dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // CodeGen grows handling for values of non-null member function 12539dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // pointers then perhaps we could remove this special case and rely on 12549dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // EmitNullMemberPointer for member function pointers. 12559dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (MPT->isMemberDataPointer()) 12569dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.getCXXABI().EmitNullMemberPointer(MPT); 12579dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (!V) 12589dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = llvm::ConstantInt::get(CGM.Int8Ty, 0); 12599dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm::DITemplateValueParameter TVP = 12609dfd24324c079b564dda936c6ae46898b82121e2David Blaikie DBuilder.createTemplateValueParameter(TheCU, ND->getName(), TTy, V); 12619dfd24324c079b564dda936c6ae46898b82121e2David Blaikie TemplateParams.push_back(TVP); 12629dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 12639dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Template: 12649dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // We could support this with the GCC extension 12659dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // DW_TAG_GNU_template_template_param 12669dfd24324c079b564dda936c6ae46898b82121e2David Blaikie break; 1267776a36453a48f3d1f305b83fbdf1632dde808ab5David Blaikie case TemplateArgument::Pack: 1268776a36453a48f3d1f305b83fbdf1632dde808ab5David Blaikie // And this with DW_TAG_GNU_template_parameter_pack 1269776a36453a48f3d1f305b83fbdf1632dde808ab5David Blaikie break; 12709dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // these next 4 should never occur 12719dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Expression: 12729dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::TemplateExpansion: 12739dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Null: 12749dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm_unreachable( 12759dfd24324c079b564dda936c6ae46898b82121e2David Blaikie "These argument types shouldn't exist in concrete types"); 12767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.getOrCreateArray(TemplateParams); 12797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 12807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectFunctionTemplateParams - A helper function to collect debug 12827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// info for function template parameters. 12837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIArray CGDebugInfo:: 12847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectFunctionTemplateParams(const FunctionDecl *FD, llvm::DIFile Unit) { 12857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FD->getTemplatedKind() == 12867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionDecl::TK_FunctionTemplateSpecialization) { 12877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateParameterList *TList = 12887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FD->getTemplateSpecializationInfo()->getTemplate() 12897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ->getTemplateParameters(); 12907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 12917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectTemplateParams(TList, *FD->getTemplateSpecializationArgs(), Unit); 12927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIArray(); 12947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 12957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectCXXTemplateParams - A helper function to collect debug info for 12977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// template parameters. 12987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIArray CGDebugInfo:: 12997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectCXXTemplateParams(const ClassTemplateSpecializationDecl *TSpecial, 13007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 13017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::PointerUnion<ClassTemplateDecl *, 13027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ClassTemplatePartialSpecializationDecl *> 13037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PU = TSpecial->getSpecializedTemplateOrPartial(); 13047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateParameterList *TPList = PU.is<ClassTemplateDecl *>() ? 13067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PU.get<ClassTemplateDecl *>()->getTemplateParameters() : 13077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PU.get<ClassTemplatePartialSpecializationDecl *>()->getTemplateParameters(); 13087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgumentList &TAList = TSpecial->getTemplateInstantiationArgs(); 13097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CollectTemplateParams(TPList, TAList, Unit); 13107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateVTablePtrType - Return debug info descriptor for vtable. 13137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getOrCreateVTablePtrType(llvm::DIFile Unit) { 13147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VTablePtrType.isValid()) 13157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VTablePtrType; 13167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTContext &Context = CGM.getContext(); 13187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /* Function type */ 13207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *STy = getOrCreateType(Context.IntTy, Unit); 13217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray SElements = DBuilder.getOrCreateArray(STy); 13227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType SubTy = DBuilder.createSubroutineType(Unit, SElements); 13237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Size = Context.getTypeSize(Context.VoidPtrTy); 13247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType vtbl_ptr_type = DBuilder.createPointerType(SubTy, Size, 0, 13257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "__vtbl_ptr_type"); 13267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTablePtrType = DBuilder.createPointerType(vtbl_ptr_type, Size); 13277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VTablePtrType; 13287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getVTableName - Get vtable name for the given Class. 13317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getVTableName(const CXXRecordDecl *RD) { 13327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Construct gdb compatible name name. 13337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Name = "_vptr$" + RD->getNameAsString(); 13347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Copy this name on the side and use its reference. 13367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei char *StrPtr = DebugInfoNames.Allocate<char>(Name.length()); 13377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei memcpy(StrPtr, Name.data(), Name.length()); 13387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return StringRef(StrPtr, Name.length()); 13397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CollectVTableInfo - If the C++ class has vtable info then insert appropriate 13437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// debug info entry in EltTys vector. 13447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo:: 13457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile Unit, 13467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<llvm::Value *> &EltTys) { 13477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 13487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there is a primary base then it will hold vtable info. 13507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RL.getPrimaryBase()) 13517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 13527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this class is not dynamic then there is not any vtable info to collect. 13547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!RD->isDynamicClass()) 13557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 13567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 13587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType VPTR 13597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = DBuilder.createMemberType(Unit, getVTableName(RD), Unit, 13607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 0, Size, 0, 0, llvm::DIDescriptor::FlagArtificial, 13617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateVTablePtrType(Unit)); 13627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(VPTR); 13637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateRecordType - Emit record type's standalone debug info. 13667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getOrCreateRecordType(QualType RTy, 13677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc) { 13687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo); 13697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType T = getOrCreateType(RTy, getOrCreateFile(Loc)); 13707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 13717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateInterfaceType - Emit an objective c interface type standalone 13747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// debug info. 13757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getOrCreateInterfaceType(QualType D, 1376be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher SourceLocation Loc) { 13777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo); 13787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType T = getOrCreateType(D, getOrCreateFile(Loc)); 1379ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl RetainedTypes.push_back(D.getAsOpaquePtr()); 13807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 13817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateType - get structure or union type. 13847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const RecordType *Ty) { 13857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordDecl *RD = Ty->getDecl(); 13867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the record type for the debug info. 13887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); 13897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Records and classes and unions can all be recursive. To handle them, we 13917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // first generate a debug descriptor for the struct as a forward declaration. 13927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Then (if it is a definition) we go through and get debug info for all of 13937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // its members. Finally, we create a descriptor for the complete type (which 13947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // may refer to the forward decl if the struct is recursive) and replace all 13957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // uses of the forward declaration with the final definition. 13967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1397f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher llvm::DICompositeType FwdDecl( 1398f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher getOrCreateLimitedType(QualType(Ty, 0), DefUnit)); 1399f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher assert(FwdDecl.Verify() && 1400f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher "The debug type of a RecordType should be a DICompositeType"); 14017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FwdDecl.isForwardDecl()) 14037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return FwdDecl; 14047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Push the struct on region stack. 1406f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher LexicalBlockStack.push_back(&*FwdDecl); 14077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl); 14087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14094919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl // Add this to the completed-type cache while we're completing it recursively. 14107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CompletedTypeCache[QualType(Ty, 0).getAsOpaquePtr()] = FwdDecl; 14117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Convert all the elements. 14137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> EltTys; 14147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Note: The split of CXXDecl information here is intentional, the 14167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // gdb tests will depend on a certain ordering at printout. The debug 14177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // information offsets are still correct if we merge them all together 14187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // though. 14197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD); 14207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXDecl) { 14217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectCXXBases(CXXDecl, DefUnit, EltTys, FwdDecl); 14227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectVTableInfo(CXXDecl, DefUnit, EltTys); 14237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 14247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14250395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Collect data fields (including static variables and any initializers). 14267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectRecordFields(RD, DefUnit, EltTys, FwdDecl); 14277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray TParamsArray; 14287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXDecl) { 14297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectCXXMemberFunctions(CXXDecl, DefUnit, EltTys, FwdDecl); 14307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectCXXFriends(CXXDecl, DefUnit, EltTys, FwdDecl); 14317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const ClassTemplateSpecializationDecl *TSpecial 14327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast<ClassTemplateSpecializationDecl>(RD)) 14337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TParamsArray = CollectCXXTemplateParams(TSpecial, DefUnit); 14347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 14357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 14377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap.erase(Ty->getDecl()); 14387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys); 1440f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher FwdDecl.setTypeArray(Elements, TParamsArray); 1441bd0152fb251e84c6f335c66322b83a9af09fed0cNico Weber 1442f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl); 1443f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher return FwdDecl; 14447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateType - get objective-c object type. 14477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ObjCObjectType *Ty, 14487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 14497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore protocols. 14507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(Ty->getBaseType(), Unit); 14517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateType - get objective-c interface type. 14547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, 14557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 14567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *ID = Ty->getDecl(); 14577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ID) 14587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 14597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the record type for the debug info. 14617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(ID->getLocation()); 14627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(ID->getLocation()); 14637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RuntimeLang = TheCU.getLanguage(); 14647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is just a forward declaration return a special forward-declaration 14667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // debug type since we won't be able to lay out the entire type. 14677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *Def = ID->getDefinition(); 14687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Def) { 14697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FwdDecl = 14707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 1471be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher ID->getName(), TheCU, DefUnit, Line, 1472be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher RuntimeLang); 14737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return FwdDecl; 14747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 14757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID = Def; 14777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 14797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 14807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 14817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 14837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID->getImplementation()) 14847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagObjcClassComplete; 14857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1486f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher llvm::DICompositeType RealDecl = 14877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createStructType(Unit, ID->getName(), DefUnit, 14887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Line, Size, Align, Flags, 1489c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie llvm::DIType(), llvm::DIArray(), RuntimeLang); 14907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise, insert it into the CompletedTypeCache so that recursive uses 14927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // will find it and we're emitting the complete type. 14934919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl QualType QualTy = QualType(Ty, 0); 14944919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl CompletedTypeCache[QualTy.getAsOpaquePtr()] = RealDecl; 14957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Push the struct on region stack. 14967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1497f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher LexicalBlockStack.push_back(static_cast<llvm::MDNode*>(RealDecl)); 14987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[Ty->getDecl()] = llvm::WeakVH(RealDecl); 14997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Convert all the elements. 15017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> EltTys; 15027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *SClass = ID->getSuperClass(); 15047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SClass) { 15057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType SClassTy = 15067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(CGM.getContext().getObjCInterfaceType(SClass), Unit); 15077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!SClassTy.isValid()) 15087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 15097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType InhTag = 15117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createInheritance(RealDecl, SClassTy, 0, 0); 15127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(InhTag); 15137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ObjCContainerDecl::prop_iterator I = ID->prop_begin(), 15167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = ID->prop_end(); I != E; ++I) { 15177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ObjCPropertyDecl *PD = *I; 15187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc = PD->getLocation(); 15197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile PUnit = getOrCreateFile(Loc); 15207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned PLine = getLineNumber(Loc); 15217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Getter = PD->getGetterMethodDecl(); 15227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Setter = PD->getSetterMethodDecl(); 15237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *PropertyNode = 15247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createObjCProperty(PD->getName(), 1525be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher PUnit, PLine, 15267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (Getter && Getter->isImplicit()) ? "" : 15277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getSelectorName(PD->getGetterName()), 15287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (Setter && Setter->isImplicit()) ? "" : 15297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getSelectorName(PD->getSetterName()), 15307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PD->getPropertyAttributes(), 1531be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher getOrCreateType(PD->getType(), PUnit)); 15327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(PropertyNode); 15337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &RL = CGM.getContext().getASTObjCInterfaceLayout(ID); 15367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldNo = 0; 15377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ObjCIvarDecl *Field = ID->all_declared_ivar_begin(); Field; 15387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Field = Field->getNextIvar(), ++FieldNo) { 15397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy = getOrCreateType(Field->getType(), Unit); 15407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FieldTy.isValid()) 15417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 15427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef FieldName = Field->getName(); 15447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore unnamed fields. 15467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FieldName.empty()) 15477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 15487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the location for the field. 15507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile FieldDefUnit = getOrCreateFile(Field->getLocation()); 15517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldLine = getLineNumber(Field->getLocation()); 15527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FType = Field->getType(); 15537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize = 0; 15547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign = 0; 15557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FType->isIncompleteArrayType()) { 15577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 15597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize = Field->isBitField() 15607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ? Field->getBitWidthValue(CGM.getContext()) 15617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : CGM.getContext().getTypeSize(FType); 15627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldAlign = CGM.getContext().getTypeAlign(FType); 15637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldOffset; 15667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CGM.getLangOpts().ObjCRuntime.isNonFragile()) { 15677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We don't know the runtime offset of an ivar if we're using the 15687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // non-fragile ABI. For bitfields, use the bit offset into the first 15697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // byte of storage of the bitfield. For other fields, use zero. 15707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Field->isBitField()) { 15717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = CGM.getObjCRuntime().ComputeBitfieldBitOffset( 15727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM, ID, Field); 15737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset %= CGM.getContext().getCharWidth(); 15747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 15757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 15767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 15787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = RL.getFieldOffset(FieldNo); 15797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 15827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Field->getAccessControl() == ObjCIvarDecl::Protected) 15837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags = llvm::DIDescriptor::FlagProtected; 15847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (Field->getAccessControl() == ObjCIvarDecl::Private) 15857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags = llvm::DIDescriptor::FlagPrivate; 15867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *PropertyNode = NULL; 15887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ObjCImplementationDecl *ImpD = ID->getImplementation()) { 15897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ObjCPropertyImplDecl *PImpD = 15907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ImpD->FindPropertyImplIvarDecl(Field->getIdentifier())) { 15917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ObjCPropertyDecl *PD = PImpD->getPropertyDecl()) { 1592be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher SourceLocation Loc = PD->getLocation(); 1593be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher llvm::DIFile PUnit = getOrCreateFile(Loc); 1594be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher unsigned PLine = getLineNumber(Loc); 15957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Getter = PD->getGetterMethodDecl(); 15967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Setter = PD->getSetterMethodDecl(); 15977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PropertyNode = 15987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createObjCProperty(PD->getName(), 15997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PUnit, PLine, 16007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (Getter && Getter->isImplicit()) ? "" : 16017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getSelectorName(PD->getGetterName()), 16027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (Setter && Setter->isImplicit()) ? "" : 16037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getSelectorName(PD->getSetterName()), 16047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PD->getPropertyAttributes(), 16057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(PD->getType(), PUnit)); 16067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldTy = DBuilder.createObjCIVar(FieldName, FieldDefUnit, 16107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldLine, FieldSize, FieldAlign, 16117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset, Flags, FieldTy, 16127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PropertyNode); 16137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(FieldTy); 16147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys); 1617f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher RealDecl.setTypeArray(Elements); 16184919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl 16194919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl // If the implementation is not yet set, we do not want to mark it 16204919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl // as complete. An implementation may declare additional 16214919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl // private ivars that we would miss otherwise. 16224919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl if (ID->getImplementation() == 0) 16234919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl CompletedTypeCache.erase(QualTy.getAsOpaquePtr()); 16247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 1626f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher return RealDecl; 16277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 16287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const VectorType *Ty, llvm::DIFile Unit) { 16307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType ElementTy = getOrCreateType(Ty->getElementType(), Unit); 16317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei int64_t Count = Ty->getNumElements(); 16327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Count == 0) 16337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If number of elements are not known then this is an unbounded array. 16347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use Count == -1 to express such arrays. 16357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Count = -1; 16367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *Subscript = DBuilder.getOrCreateSubrange(0, Count); 16387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray SubscriptArray = DBuilder.getOrCreateArray(Subscript); 16397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 16417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 16427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createVectorType(Size, Align, ElementTy, SubscriptArray); 16447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 16457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const ArrayType *Ty, 16477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 16487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size; 16497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align; 16507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: make getTypeAlign() aware of VLAs and incomplete array types 16527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(Ty)) { 16537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = 0; 16547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = 16557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getContext().getTypeAlign(CGM.getContext().getBaseElementType(VAT)); 16567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Ty->isIncompleteArrayType()) { 16577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = 0; 16587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty->getElementType()->isIncompleteType()) 16597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = 0; 16607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 16617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = CGM.getContext().getTypeAlign(Ty->getElementType()); 1662089db2e3af0b6166a8e2253c453eccf551ddfbd8David Blaikie } else if (Ty->isIncompleteType()) { 16637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = 0; 16647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = 0; 16657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 16667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Size and align of the whole array, not the element type. 16677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = CGM.getContext().getTypeSize(Ty); 16687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = CGM.getContext().getTypeAlign(Ty); 16697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add the dimensions of the array. FIXME: This loses CV qualifiers from 16727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // interior arrays, do we care? Why aren't nested arrays represented the 16737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // obvious/recursive way? 16747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 8> Subscripts; 16757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType EltTy(Ty, 0); 16767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while ((Ty = dyn_cast<ArrayType>(EltTy))) { 16777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the number of elements is known, then count is that number. Otherwise, 16787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // it's -1. This allows us to represent a subrange with an array of 0 16797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // elements, like this: 16807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 16817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // struct foo { 16827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // int x[0]; 16837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // }; 16847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei int64_t Count = -1; // Count == -1 is an unbounded array. 16857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(Ty)) 16867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Count = CAT->getSize().getZExtValue(); 16877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Verify this is right for VLAs. 16897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Subscripts.push_back(DBuilder.getOrCreateSubrange(0, Count)); 16907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTy = Ty->getElementType(); 16917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray SubscriptArray = DBuilder.getOrCreateArray(Subscripts); 16947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType DbgTy = 16967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createArrayType(Size, Align, getOrCreateType(EltTy, Unit), 16977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubscriptArray); 16987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 16997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const LValueReferenceType *Ty, 17027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 17037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreatePointerLikeType(llvm::dwarf::DW_TAG_reference_type, 17047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty, Ty->getPointeeType(), Unit); 17057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const RValueReferenceType *Ty, 17087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit) { 17097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreatePointerLikeType(llvm::dwarf::DW_TAG_rvalue_reference_type, 17107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty, Ty->getPointeeType(), Unit); 17117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const MemberPointerType *Ty, 17147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile U) { 1715e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie llvm::DIType ClassType = getOrCreateType(QualType(Ty->getClass(), 0), U); 1716e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie if (!Ty->getPointeeType()->isFunctionType()) 1717e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie return DBuilder.createMemberPointerType( 1718e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie CreatePointeeType(Ty->getPointeeType(), U), ClassType); 1719e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie return DBuilder.createMemberPointerType(getOrCreateInstanceMethodType( 1720e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie CGM.getContext().getPointerType( 1721e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie QualType(Ty->getClass(), Ty->getPointeeType().getCVRQualifiers())), 1722e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie Ty->getPointeeType()->getAs<FunctionProtoType>(), U), 1723e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie ClassType); 17247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateType(const AtomicType *Ty, 17277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile U) { 17287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore the atomic wrapping 17297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: What is the correct representation? 17307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(Ty->getValueType(), U); 17317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateEnumType - get enumeration type. 17347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateEnumType(const EnumDecl *ED) { 17357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = 0; 17367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = 0; 17377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ED->getTypeForDecl()->isIncompleteType()) { 17387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = CGM.getContext().getTypeSize(ED->getTypeForDecl()); 17397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = CGM.getContext().getTypeAlign(ED->getTypeForDecl()); 17407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is just a forward declaration, construct an appropriately 17437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // marked node and just return it. 17447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ED->getDefinition()) { 17457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor EDContext; 17467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EDContext = getContextDescriptor(cast<Decl>(ED->getDeclContext())); 17477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(ED->getLocation()); 17487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(ED->getLocation()); 17497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef EDName = ED->getName(); 17507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_enumeration_type, 17517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EDName, EDContext, DefUnit, Line, 0, 17527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size, Align); 17537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create DIEnumerator elements for each enumerator. 17567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> Enumerators; 17577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ED = ED->getDefinition(); 17587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (EnumDecl::enumerator_iterator 17597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Enum = ED->enumerator_begin(), EnumEnd = ED->enumerator_end(); 17607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Enum != EnumEnd; ++Enum) { 17617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Enumerators.push_back( 17627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createEnumerator(Enum->getName(), 17637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Enum->getInitVal().getZExtValue())); 17647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Return a CompositeType for the enum itself. 17677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray EltArray = DBuilder.getOrCreateArray(Enumerators); 17687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(ED->getLocation()); 17707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(ED->getLocation()); 17717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor EnumContext = 17727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(cast<Decl>(ED->getDeclContext())); 177359d6a71d681adfdc7d976492eeb3deae84e8f2e2Adrian Prantl llvm::DIType ClassTy = ED->isFixed() ? 17747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(ED->getIntegerType(), DefUnit) : llvm::DIType(); 17757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType DbgTy = 17767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createEnumerationType(EnumContext, ED->getName(), DefUnit, Line, 17777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size, Align, EltArray, 17787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ClassTy); 17797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DbgTy; 17807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17824b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikiestatic QualType UnwrapTypeForDebugInfo(QualType T, const ASTContext &C) { 17834b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Qualifiers Quals; 17847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei do { 17854b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Quals += T.getLocalQualifiers(); 17867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType LastT = T; 17877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (T->getTypeClass()) { 17887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 17894b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie return C.getQualifiedType(T.getTypePtr(), Quals); 17907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TemplateSpecialization: 17917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<TemplateSpecializationType>(T)->desugar(); 17927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 17937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOfExpr: 17947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType(); 17957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 17967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOf: 17977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<TypeOfType>(T)->getUnderlyingType(); 17987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 17997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Decltype: 18007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<DecltypeType>(T)->getUnderlyingType(); 18017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::UnaryTransform: 18037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<UnaryTransformType>(T)->getUnderlyingType(); 18047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Attributed: 18067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<AttributedType>(T)->getEquivalentType(); 18077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Elaborated: 18097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<ElaboratedType>(T)->getNamedType(); 18107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Paren: 18127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<ParenType>(T)->getInnerType(); 18137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18144b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie case Type::SubstTemplateTypeParm: 18157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<SubstTemplateTypeParmType>(T)->getReplacementType(); 18167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Auto: 18187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<AutoType>(T)->getDeducedType(); 18197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(T != LastT && "Type unwrapping failed to unwrap!"); 1823d24c9ab90b42370bb417f44e001a0347ee1ca87eNAKAMURA Takumi (void)LastT; 18247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } while (true); 18257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getType - Get the type from the cache or return null type if it doesn't exist. 18287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getTypeOrNull(QualType Ty) { 18297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Unwrap the type as needed for debug information. 18314b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext()); 18327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check for existing entry. 1834ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl if (Ty->getTypeClass() == Type::ObjCInterface) { 1835ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl llvm::Value *V = getCachedInterfaceTypeOrNull(Ty); 1836ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl if (V) 1837ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl return llvm::DIType(cast<llvm::MDNode>(V)); 1838ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl else return llvm::DIType(); 1839ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl } 1840ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 18417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<void *, llvm::WeakVH>::iterator it = 18427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeCache.find(Ty.getAsOpaquePtr()); 18437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (it != TypeCache.end()) { 18447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Verify that the debug info still exists. 18457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::Value *V = it->second) 18467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(cast<llvm::MDNode>(V)); 18477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 18507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getCompletedTypeOrNull - Get the type from the cache or return null if it 18537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// doesn't exist. 18547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getCompletedTypeOrNull(QualType Ty) { 18557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Unwrap the type as needed for debug information. 18574b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext()); 18587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check for existing entry. 18604919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl llvm::Value *V = 0; 18617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<void *, llvm::WeakVH>::iterator it = 18627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CompletedTypeCache.find(Ty.getAsOpaquePtr()); 18634919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl if (it != CompletedTypeCache.end()) 18644919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl V = it->second; 18654919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl else { 1866ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl V = getCachedInterfaceTypeOrNull(Ty); 18677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18694919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl // Verify that any cached debug info still exists. 18704919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl if (V != 0) 18714919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl return llvm::DIType(cast<llvm::MDNode>(V)); 18724919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl 18737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 18747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1876ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl/// getCachedInterfaceTypeOrNull - Get the type from the interface 1877ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl/// cache, unless it needs to regenerated. Otherwise return null. 1878ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantlllvm::Value *CGDebugInfo::getCachedInterfaceTypeOrNull(QualType Ty) { 1879ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // Is there a cached interface that hasn't changed? 1880ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl llvm::DenseMap<void *, std::pair<llvm::WeakVH, unsigned > > 1881ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl ::iterator it1 = ObjCInterfaceCache.find(Ty.getAsOpaquePtr()); 1882ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 1883ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl if (it1 != ObjCInterfaceCache.end()) 1884ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl if (ObjCInterfaceDecl* Decl = getObjCInterfaceDecl(Ty)) 1885ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl if (Checksum(Decl) == it1->second.second) 1886ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // Return cached forward declaration. 1887ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl return it1->second.first; 1888ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 1889ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl return 0; 1890ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl} 18917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateType - Get the type from the cache or create a new 18937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// one if necessary. 18947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getOrCreateType(QualType Ty, llvm::DIFile Unit) { 18957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty.isNull()) 18967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 18977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Unwrap the type as needed for debug information. 18994b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext()); 19007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType T = getCompletedTypeOrNull(Ty); 19027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (T.Verify()) 19047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 19057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise create the type. 19077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Res = CreateTypeNode(Ty, Unit); 1908ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl void* TyPtr = Ty.getAsOpaquePtr(); 1909ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 1910ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // And update the type cache. 1911ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl TypeCache[TyPtr] = Res; 19127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType TC = getTypeOrNull(Ty); 19147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TC.Verify() && TC.isForwardDecl()) 1915ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl ReplaceMap.push_back(std::make_pair(TyPtr, static_cast<llvm::Value*>(TC))); 1916ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl else if (ObjCInterfaceDecl* Decl = getObjCInterfaceDecl(Ty)) { 1917ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // Interface types may have elements added to them by a 1918ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // subsequent implementation or extension, so we keep them in 1919ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // the ObjCInterfaceCache together with a checksum. Instead of 1920f06989b9f360e2b43cb1d94c317cc6e1826f7611Adrian Prantl // the (possibly) incomplete interface type, we return a forward 1921ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // declaration that gets RAUW'd in CGDebugInfo::finalize(). 1922ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl llvm::DenseMap<void *, std::pair<llvm::WeakVH, unsigned > > 1923ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl ::iterator it = ObjCInterfaceCache.find(TyPtr); 1924ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl if (it != ObjCInterfaceCache.end()) 1925ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl TC = llvm::DIType(cast<llvm::MDNode>(it->second.first)); 1926ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl else 1927ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl TC = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 192800df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl Decl->getName(), TheCU, Unit, 192900df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl getLineNumber(Decl->getLocation()), 193000df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl TheCU.getLanguage()); 1931ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // Store the forward declaration in the cache. 1932ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl ObjCInterfaceCache[TyPtr] = std::make_pair(TC, Checksum(Decl)); 19334919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl 1934ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // Register the type for replacement in finalize(). 1935ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl ReplaceMap.push_back(std::make_pair(TyPtr, static_cast<llvm::Value*>(TC))); 1936ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl return TC; 1937ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl } 19387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Res.isForwardDecl()) 1940ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl CompletedTypeCache[TyPtr] = Res; 19417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Res; 19437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 19447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19454919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl/// Currently the checksum merely consists of the number of ivars. 19464919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantlunsigned CGDebugInfo::Checksum(const ObjCInterfaceDecl 194700df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl *InterfaceDecl) { 19484919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl unsigned IvarNo = 0; 19494919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl for (const ObjCIvarDecl *Ivar = InterfaceDecl->all_declared_ivar_begin(); 19504919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl Ivar != 0; Ivar = Ivar->getNextIvar()) ++IvarNo; 19514919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl return IvarNo; 19524919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl} 19534919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl 19544919de6a53a007487c6d6b173921b5e7152a2004Adrian PrantlObjCInterfaceDecl *CGDebugInfo::getObjCInterfaceDecl(QualType Ty) { 19554919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl switch (Ty->getTypeClass()) { 19564919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl case Type::ObjCObjectPointer: 19574919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl return getObjCInterfaceDecl(cast<ObjCObjectPointerType>(Ty)->getPointeeType()); 19584919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl case Type::ObjCInterface: 19594919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl return cast<ObjCInterfaceType>(Ty)->getDecl(); 19604919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl default: 19614919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl return 0; 19624919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl } 19634919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl} 19644919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl 19657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateTypeNode - Create a new debug type node. 19667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateTypeNode(QualType Ty, llvm::DIFile Unit) { 19677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Handle qualifiers, which recursively handles what they refer to. 19687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty.hasLocalQualifiers()) 19697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateQualifiedType(Ty, Unit); 19707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const char *Diag = 0; 19727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Work out details of type. 19747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Ty->getTypeClass()) { 19757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define TYPE(Class, Base) 19767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define ABSTRACT_TYPE(Class, Base) 19777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define NON_CANONICAL_TYPE(Class, Base) 19787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define DEPENDENT_TYPE(Class, Base) case Type::Class: 19797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/TypeNodes.def" 19807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Dependent types cannot show up in debug information"); 19817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ExtVector: 19837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Vector: 19847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<VectorType>(Ty), Unit); 19857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCObjectPointer: 19867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ObjCObjectPointerType>(Ty), Unit); 19877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCObject: 19887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ObjCObjectType>(Ty), Unit); 19897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCInterface: 19907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ObjCInterfaceType>(Ty), Unit); 19917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Builtin: 19927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<BuiltinType>(Ty)); 19937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Complex: 19947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ComplexType>(Ty)); 19957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Pointer: 19967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<PointerType>(Ty), Unit); 19977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::BlockPointer: 19987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<BlockPointerType>(Ty), Unit); 19997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Typedef: 20007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<TypedefType>(Ty), Unit); 20017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Record: 20027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<RecordType>(Ty)); 20037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Enum: 20047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateEnumType(cast<EnumType>(Ty)->getDecl()); 20057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::FunctionProto: 20067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::FunctionNoProto: 20077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<FunctionType>(Ty), Unit); 20087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ConstantArray: 20097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::VariableArray: 20107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::IncompleteArray: 20117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ArrayType>(Ty), Unit); 20127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::LValueReference: 20147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<LValueReferenceType>(Ty), Unit); 20157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::RValueReference: 20167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<RValueReferenceType>(Ty), Unit); 20177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::MemberPointer: 20197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<MemberPointerType>(Ty), Unit); 20207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Atomic: 20227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<AtomicType>(Ty), Unit); 20237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Attributed: 20257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TemplateSpecialization: 20267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Elaborated: 20277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Paren: 20287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::SubstTemplateTypeParm: 20297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOfExpr: 20307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOf: 20317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Decltype: 20327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::UnaryTransform: 20337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Auto: 20347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("type should have been unwrapped!"); 20357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 20367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Diag && "Fall through without a diagnostic?"); 20387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DiagID = CGM.getDiags().getCustomDiagID(DiagnosticsEngine::Error, 20397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "debug information for %0 is not yet supported"); 20407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getDiags().Report(DiagID) 20417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << Diag; 20427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 20437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateLimitedType - Get the type from the cache or create a new 20467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// limited type if necessary. 20477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getOrCreateLimitedType(QualType Ty, 2048be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher llvm::DIFile Unit) { 20497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty.isNull()) 20507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(); 20517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Unwrap the type as needed for debug information. 20534b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext()); 20547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType T = getTypeOrNull(Ty); 20567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We may have cached a forward decl when we could have created 20587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // a non-forward decl. Go ahead and create a non-forward decl 20597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // now. 20607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (T.Verify() && !T.isForwardDecl()) return T; 20617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise create the type. 20637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Res = CreateLimitedTypeNode(Ty, Unit); 20647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (T.Verify() && T.isForwardDecl()) 20667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReplaceMap.push_back(std::make_pair(Ty.getAsOpaquePtr(), 20677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static_cast<llvm::Value*>(T))); 20687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // And update the type cache. 20707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeCache[Ty.getAsOpaquePtr()] = Res; 20717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Res; 20727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// TODO: Currently used for context chains when limiting debug info. 20757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateLimitedType(const RecordType *Ty) { 20767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordDecl *RD = Ty->getDecl(); 20777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the record type for the debug info. 20797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); 20807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(RD->getLocation()); 20817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef RDName = getClassName(RD); 20827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor RDContext; 20847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CGM.getCodeGenOpts().getDebugInfo() == CodeGenOptions::LimitedDebugInfo) 20857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RDContext = createContextChain(cast<Decl>(RD->getDeclContext())); 20867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 20877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RDContext = getContextDescriptor(cast<Decl>(RD->getDeclContext())); 20887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is just a forward declaration, construct an appropriately 20907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // marked node and just return it. 20917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!RD->getDefinition()) 20927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return createRecordFwdDecl(RD, RDContext); 20937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 20957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 20967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD); 20972fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie llvm::DICompositeType RealDecl; 20987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RD->isUnion()) 21007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RealDecl = DBuilder.createUnionType(RDContext, RDName, DefUnit, Line, 2101be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher Size, Align, 0, llvm::DIArray()); 21027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (RD->isClass()) { 21037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: This could be a struct type giving a default visibility different 21047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // than C++ class type, but needs llvm metadata changes first. 21057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RealDecl = DBuilder.createClassType(RDContext, RDName, DefUnit, Line, 2106be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher Size, Align, 0, 0, llvm::DIType(), 2107be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher llvm::DIArray(), llvm::DIType(), 2108be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher llvm::DIArray()); 21097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else 21107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RealDecl = DBuilder.createStructType(RDContext, RDName, DefUnit, Line, 211100df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl Size, Align, 0, llvm::DIType(), llvm::DIArray()); 21127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[Ty->getDecl()] = llvm::WeakVH(RealDecl); 21142fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = RealDecl; 21157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXDecl) { 21177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // A class's primary base or the class itself contains the vtable. 21182fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie llvm::DICompositeType ContainingType; 21197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 21207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXRecordDecl *PBase = RL.getPrimaryBase()) { 21217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Seek non virtual primary base root. 21227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (1) { 2123be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher const ASTRecordLayout &BRL = CGM.getContext().getASTRecordLayout(PBase); 2124be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher const CXXRecordDecl *PBT = BRL.getPrimaryBase(); 2125be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher if (PBT && !BRL.isPrimaryBaseVirtual()) 2126be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher PBase = PBT; 2127be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher else 2128be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher break; 21297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 21302fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie ContainingType = llvm::DICompositeType( 21312fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie getOrCreateType(QualType(PBase->getTypeForDecl(), 0), DefUnit)); 21322fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie } else if (CXXDecl->isDynamicClass()) 21337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContainingType = RealDecl; 21347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21352fcadbeecbbc0b48dc92b9ce778e5c7a53292505David Blaikie RealDecl.setContainingType(ContainingType); 21367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 21377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DIType(RealDecl); 21387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateLimitedTypeNode - Create a new debug type node, but only forward 21417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// declare composite types that haven't been processed yet. 21427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateLimitedTypeNode(QualType Ty,llvm::DIFile Unit) { 21437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Work out details of type. 21457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Ty->getTypeClass()) { 21467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define TYPE(Class, Base) 21477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define ABSTRACT_TYPE(Class, Base) 21487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define NON_CANONICAL_TYPE(Class, Base) 21497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define DEPENDENT_TYPE(Class, Base) case Type::Class: 21507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei #include "clang/AST/TypeNodes.def" 21517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Dependent types cannot show up in debug information"); 21527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Record: 21547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateLimitedType(cast<RecordType>(Ty)); 21557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 21567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateTypeNode(Ty, Unit); 21577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 21587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateMemberType - Create new member and increase Offset by FType's size. 21617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::CreateMemberType(llvm::DIFile Unit, QualType FType, 21627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name, 21637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t *Offset) { 21647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy = CGDebugInfo::getOrCreateType(FType, Unit); 21657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize = CGM.getContext().getTypeSize(FType); 21667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign = CGM.getContext().getTypeAlign(FType); 21677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty = DBuilder.createMemberType(Unit, Name, Unit, 0, 21687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize, FieldAlign, 21697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *Offset, 0, FieldTy); 21707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *Offset += FieldSize; 21717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Ty; 21727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21743923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikiellvm::DIDescriptor CGDebugInfo::getDeclarationOrDefinition(const Decl *D) { 21753923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie if (const TypeDecl *RD = dyn_cast<TypeDecl>(D)) 21763923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie return CreatePointeeType(QualType(RD->getTypeForDecl(), 0), llvm::DIFile()); 21773923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator I = 21783923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie DeclCache.find(D->getCanonicalDecl()); 21793923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie if (I == DeclCache.end()) 21803923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie return llvm::DIDescriptor(); 21813923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie llvm::Value *V = I->second; 21823923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie return llvm::DIDescriptor(dyn_cast_or_null<llvm::MDNode>(V)); 21833923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie} 21843923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie 21857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getFunctionDeclaration - Return debug info descriptor to describe method 21867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// declaration for the given method definition. 21877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DISubprogram CGDebugInfo::getFunctionDeclaration(const Decl *D) { 21887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FunctionDecl *FD = dyn_cast<FunctionDecl>(D); 21897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FD) return llvm::DISubprogram(); 21907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Setup context. 21927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(cast<Decl>(D->getDeclContext())); 21937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator 21957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MI = SPCache.find(FD->getCanonicalDecl()); 21967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MI != SPCache.end()) { 21977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = MI->second; 21987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DISubprogram SP(dyn_cast_or_null<llvm::MDNode>(V)); 21997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SP.isSubprogram() && !llvm::DISubprogram(SP).isDefinition()) 22007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SP; 22017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (FunctionDecl::redecl_iterator I = FD->redecls_begin(), 22047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = FD->redecls_end(); I != E; ++I) { 22057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FunctionDecl *NextFD = *I; 22067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator 22077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MI = SPCache.find(NextFD->getCanonicalDecl()); 22087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MI != SPCache.end()) { 22097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = MI->second; 22107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DISubprogram SP(dyn_cast_or_null<llvm::MDNode>(V)); 22117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SP.isSubprogram() && !llvm::DISubprogram(SP).isDefinition()) 22127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SP; 22137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DISubprogram(); 22167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 22177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// getOrCreateFunctionType - Construct DIType. If it is a c++ method, include 22197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// implicit parameter "this". 22207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::getOrCreateFunctionType(const Decl *D, 22217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FnType, 22227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile F) { 22237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) 22257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateMethodType(Method, F); 22267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const ObjCMethodDecl *OMethod = dyn_cast<ObjCMethodDecl>(D)) { 22277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add "self" and "_cmd" 22287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 16> Elts; 22297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // First element is always return type. For 'void' functions it is NULL. 2231566a9c3680d9960bb0eb6acf33507251cc13a8d8Adrian Prantl QualType ResultTy = OMethod->hasRelatedResultType() 2232566a9c3680d9960bb0eb6acf33507251cc13a8d8Adrian Prantl ? QualType(OMethod->getClassInterface()->getTypeForDecl(), 0) 2233566a9c3680d9960bb0eb6acf33507251cc13a8d8Adrian Prantl : OMethod->getResultType(); 2234566a9c3680d9960bb0eb6acf33507251cc13a8d8Adrian Prantl Elts.push_back(getOrCreateType(ResultTy, F)); 22357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // "self" pointer is always first argument. 2236e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl QualType SelfDeclTy = OMethod->getSelfDecl()->getType(); 2237e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl llvm::DIType SelfTy = getOrCreateType(SelfDeclTy, F); 2238e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl Elts.push_back(CreateSelfType(SelfDeclTy, SelfTy)); 22397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // "_cmd" pointer is always second argument. 22407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType CmdTy = getOrCreateType(OMethod->getCmdDecl()->getType(), F); 22417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elts.push_back(DBuilder.createArtificialType(CmdTy)); 22427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get rest of the arguments. 22437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ObjCMethodDecl::param_const_iterator PI = OMethod->param_begin(), 22447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PE = OMethod->param_end(); PI != PE; ++PI) 22457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elts.push_back(getOrCreateType((*PI)->getType(), F)); 22467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(Elts); 22487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createSubroutineType(F, EltTypeArray); 22497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(FnType, F); 22517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 22527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitFunctionStart - Constructs the debug code for entering a function. 22547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitFunctionStart(GlobalDecl GD, QualType FnType, 22557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Function *Fn, 22567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 22577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name; 22597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef LinkageName; 22607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FnBeginRegionCount.push_back(LexicalBlockStack.size()); 22627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Decl *D = GD.getDecl(); 22647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Function may lack declaration in source code if it is created by Clang 22657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // CodeGen (examples: _GLOBAL__I_a, __cxx_global_array_dtor, thunk). 22667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool HasDecl = (D != 0); 22677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use the location of the declaration. 22687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc; 22697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (HasDecl) 22707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Loc = D->getLocation(); 22717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 22737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(Loc); 22747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor FDContext(Unit); 22757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray TParamsArray; 22767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!HasDecl) { 22777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use llvm function name. 22787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = Fn->getName(); 22797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 22807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there is a DISubprogram for this function available then use it. 22817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator 22827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FI = SPCache.find(FD->getCanonicalDecl()); 22837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FI != SPCache.end()) { 22847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *V = FI->second; 22857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor SP(dyn_cast_or_null<llvm::MDNode>(V)); 22867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SP.isSubprogram() && llvm::DISubprogram(SP).isDefinition()) { 22877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *SPN = SP; 22887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(SPN); 22897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[D] = llvm::WeakVH(SP); 22907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 22917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = getFunctionName(FD); 2294f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky // Use mangled name as linkage name for C/C++ functions. 22957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FD->hasPrototype()) { 22967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LinkageName = CGM.getMangledName(GD); 22977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrototyped; 22987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2299f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky // No need to replicate the linkage name if it isn't different from the 2300f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky // subprogram name, no need to have it at all unless coverage is enabled or 2301f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky // debug is set to more than just line tables. 23027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LinkageName == Name || 2303f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky (!CGM.getCodeGenOpts().EmitGcovArcs && 2304f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky !CGM.getCodeGenOpts().EmitGcovNotes && 2305f2b5e0707229e1149828ebc8d01d9308a997d6dfNick Lewycky CGM.getCodeGenOpts().getDebugInfo() <= CodeGenOptions::DebugLineTablesOnly)) 23067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LinkageName = StringRef(); 23077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) { 23097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const NamespaceDecl *NSDecl = 23107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast_or_null<NamespaceDecl>(FD->getDeclContext())) 23117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FDContext = getOrCreateNameSpace(NSDecl); 23127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (const RecordDecl *RDecl = 23137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast_or_null<RecordDecl>(FD->getDeclContext())) 23147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FDContext = getContextDescriptor(cast<Decl>(RDecl->getDeclContext())); 23157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Collect template parameters. 23177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TParamsArray = CollectFunctionTemplateParams(FD, Unit); 23187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D)) { 23207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = getObjCMethodName(OMD); 23217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrototyped; 23227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 23237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use llvm function name. 23247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = Fn->getName(); 23257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagPrototyped; 23267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Name.empty() && Name[0] == '\01') 23287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = Name.substr(1); 23297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(Loc); 23317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!HasDecl || D->isImplicit()) 23327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagArtificial; 23337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType DIFnType; 23357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DISubprogram SPDecl; 23367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (HasDecl && 23377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) { 23387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DIFnType = getOrCreateFunctionType(D, FnType, Unit); 23397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SPDecl = getFunctionDeclaration(D); 23407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 23417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create fake but valid subroutine type. Otherwise 23427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // llvm::DISubprogram::Verify() would return false, and 23437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // subprogram DIE will miss DW_AT_decl_file and 23447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // DW_AT_decl_line fields. 23457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value*, 16> Elts; 23467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(Elts); 23477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DIFnType = DBuilder.createSubroutineType(Unit, EltTypeArray); 23487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DISubprogram SP; 23507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SP = DBuilder.createFunction(FDContext, Name, LinkageName, Unit, 23517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LineNo, DIFnType, 23527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Fn->hasInternalLinkage(), true/*definition*/, 23537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getLineNumber(CurLoc), Flags, 23547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getLangOpts().Optimize, 23557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Fn, TParamsArray, SPDecl); 23563923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie if (HasDecl) 23573923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie DeclCache.insert(std::make_pair(D->getCanonicalDecl(), llvm::WeakVH(SP))); 23587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Push function on region stack. 23607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *SPN = SP; 23617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(SPN); 23627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (HasDecl) 23637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap[D] = llvm::WeakVH(SP); 23647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 23657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitLocation - Emit metadata to indicate a change in line/column 23677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// information in the source file. 236800df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantlvoid CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc, 236900df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl bool ForceColumnInfo) { 23707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Update our current location 23727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei setLocation(Loc); 23737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CurLoc.isInvalid() || CurLoc.isMacroID()) return; 23757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Don't bother if things are the same as last time. 23777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 23787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CurLoc == PrevLoc || 23797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SM.getExpansionLoc(CurLoc) == SM.getExpansionLoc(PrevLoc)) 23807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // New Builder may not be in sync with CGDebugInfo. 23810a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikie if (!Builder.getCurrentDebugLocation().isUnknown() && 23820a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikie Builder.getCurrentDebugLocation().getScope(CGM.getLLVMContext()) == 23830a0f93c90fd397a1aa9f97283c55f8ba0062bf55David Blaikie LexicalBlockStack.back()) 23847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 23857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Update last state. 23877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PrevLoc = CurLoc; 23887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *Scope = LexicalBlockStack.back(); 239000df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl Builder.SetCurrentDebugLocation(llvm::DebugLoc::get 239100df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl (getLineNumber(CurLoc), 239200df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl getColumnNumber(CurLoc, ForceColumnInfo), 239300df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl Scope)); 23947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 23957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CreateLexicalBlock - Creates a new lexical block node and pushes it on 23977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// the stack. 23987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::CreateLexicalBlock(SourceLocation Loc) { 23997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor D = 24007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createLexicalBlock(LexicalBlockStack.empty() ? 24017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor() : 24027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor(LexicalBlockStack.back()), 24037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateFile(CurLoc), 24047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getLineNumber(CurLoc), 24057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getColumnNumber(CurLoc)); 24067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *DN = D; 24077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.push_back(DN); 24087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitLexicalBlockStart - Constructs the debug code for entering a declarative 24117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// region - beginning of a DW_TAG_lexical_block. 24127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitLexicalBlockStart(CGBuilderTy &Builder, SourceLocation Loc) { 24137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Set our current location. 24147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei setLocation(Loc); 24157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create a new lexical block and push it on the stack. 24177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CreateLexicalBlock(Loc); 24187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Emit a line table change for the current location inside the new scope. 24207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Builder.SetCurrentDebugLocation(llvm::DebugLoc::get(getLineNumber(Loc), 24217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getColumnNumber(Loc), 24227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.back())); 24237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitLexicalBlockEnd - Constructs the debug code for exiting a declarative 24267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// region - end of a DW_TAG_lexical_block. 24277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitLexicalBlockEnd(CGBuilderTy &Builder, SourceLocation Loc) { 24287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 24297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Provide an entry in the line table for the end of the block. 24317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitLocation(Builder, Loc); 24327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 24347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitFunctionEnd - Constructs the debug code for exiting a function. 24377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitFunctionEnd(CGBuilderTy &Builder) { 24387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 24397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RCount = FnBeginRegionCount.back(); 24407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(RCount <= LexicalBlockStack.size() && "Region stack mismatch"); 24417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Pop all regions for this function. 24437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (LexicalBlockStack.size() != RCount) 24447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitLexicalBlockEnd(Builder, CurLoc); 24457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FnBeginRegionCount.pop_back(); 24467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// EmitTypeForVarWithBlocksAttr - Build up structure info for the byref. 24497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// See BuildByRefType. 24507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DIType CGDebugInfo::EmitTypeForVarWithBlocksAttr(const VarDecl *VD, 24517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t *XOffset) { 24527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 5> EltTys; 24547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FType; 24557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize, FieldOffset; 24567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign; 24577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 24597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Type = VD->getType(); 24607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 24627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 24637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset)); 24647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__forwarding", &FieldOffset)); 24657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().IntTy; 24667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset)); 24677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__size", &FieldOffset)); 24687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool HasCopyAndDispose = CGM.getContext().BlockRequiresCopying(Type, VD); 24707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (HasCopyAndDispose) { 24717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 24727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__copy_helper", 24737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei &FieldOffset)); 24747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__destroy_helper", 24757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei &FieldOffset)); 24767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool HasByrefExtendedLayout; 24787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qualifiers::ObjCLifetime Lifetime; 24797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CGM.getContext().getByrefLifetime(Type, 24807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Lifetime, HasByrefExtendedLayout) 24817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei && HasByrefExtendedLayout) 24827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, 24837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "__byref_variable_layout", 24847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei &FieldOffset)); 24857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits Align = CGM.getContext().getDeclAlign(VD); 24877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Align > CGM.getContext().toCharUnitsFromBits( 248864aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall CGM.getTarget().getPointerAlign(0))) { 24897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits FieldOffsetInBytes 24907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = CGM.getContext().toCharUnitsFromBits(FieldOffset); 24917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits AlignedOffsetInBytes 24927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = FieldOffsetInBytes.RoundUpToAlignment(Align); 24937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits NumPaddingBytes 24947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = AlignedOffsetInBytes - FieldOffsetInBytes; 24957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NumPaddingBytes.isPositive()) { 24977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APInt pad(32, NumPaddingBytes.getQuantity()); 24987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getConstantArrayType(CGM.getContext().CharTy, 24997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei pad, ArrayType::Normal, 0); 25007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "", &FieldOffset)); 25017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = Type; 25057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy = CGDebugInfo::getOrCreateType(FType, Unit); 25067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize = CGM.getContext().getTypeSize(FType); 25077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldAlign = CGM.getContext().toBits(Align); 25087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *XOffset = FieldOffset; 25107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldTy = DBuilder.createMemberType(Unit, VD->getName(), Unit, 25117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 0, FieldSize, FieldAlign, 25127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset, 0, FieldTy); 25137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(FieldTy); 25147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset += FieldSize; 25157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys); 25177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = llvm::DIDescriptor::FlagBlockByrefStruct; 25197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createStructType(Unit, "", Unit, 0, FieldOffset, 0, Flags, 2521c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie llvm::DIType(), Elements); 25227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 25237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitDeclare - Emit local variable declaration debug info. 25257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclare(const VarDecl *VD, unsigned Tag, 25267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *Storage, 25277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ArgNo, CGBuilderTy &Builder) { 25287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo); 25297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 25307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 25327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty; 25337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t XOffset = 0; 25347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VD->hasAttr<BlocksAttr>()) 25357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset); 25367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 25377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = getOrCreateType(VD->getType(), Unit); 25387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there is no debug info for this type then do not emit debug info 25407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // for this variable. 25417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Ty) 25427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 25437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::Argument *Arg = dyn_cast<llvm::Argument>(Storage)) { 25457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If Storage is an aggregate returned as 'sret' then let debugger know 25467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // about this. 25477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Arg->hasStructRetAttr()) 25487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = DBuilder.createReferenceType(llvm::dwarf::DW_TAG_reference_type, Ty); 25497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (CXXRecordDecl *Record = VD->getType()->getAsCXXRecordDecl()) { 25507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If an aggregate variable has non trivial destructor or non trivial copy 25517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // constructor than it is pass indirectly. Let debug info know about this 25527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // by using reference of the aggregate type as a argument type. 25537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record->hasNonTrivialCopyConstructor() || 25547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei !Record->hasTrivialDestructor()) 25557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = DBuilder.createReferenceType(llvm::dwarf::DW_TAG_reference_type, Ty); 25567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get location information. 25607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(VD->getLocation()); 25617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Column = getColumnNumber(VD->getLocation()); 25627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 25637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VD->isImplicit()) 25647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagArtificial; 25657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is the first argument and it is implicit then 25667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // give it an object pointer flag. 25677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: There has to be a better way to do this, but for static 25687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // functions there won't be an implicit param at arg1 and 25697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // otherwise it is 'self' or 'this'. 25707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<ImplicitParamDecl>(VD) && ArgNo == 1) 25717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= llvm::DIDescriptor::FlagObjectPointer; 25727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *Scope = LexicalBlockStack.back(); 25747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = VD->getName(); 25767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Name.empty()) { 25777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VD->hasAttr<BlocksAttr>()) { 25787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits offset = CharUnits::fromQuantity(32); 25797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 9> addr; 25807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Type *Int64Ty = CGM.Int64Ty; 25817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 25827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of __forwarding field 25837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext().toCharUnitsFromBits( 258464aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall CGM.getTarget().getPointerWidth(0)); 25857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 25867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpDeref)); 25877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 25887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of x field 25897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext().toCharUnitsFromBits(XOffset); 25907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 25917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the variable. 25937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIVariable D = 25947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createComplexVariable(Tag, 25957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor(Scope), 25967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VD->getName(), Unit, Line, Ty, 25977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr, ArgNo); 25987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Insert an llvm.dbg.declare into the current block. 26007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Instruction *Call = 26017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.insertDeclare(Storage, D, Builder.GetInsertBlock()); 2602230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); 2603230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl return; 2604230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl } else if (isa<VariableArrayType>(VD->getType())) { 2605230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl // These are "complex" variables in that they need an op_deref. 2606230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl // Create the descriptor for the variable. 2607230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl llvm::Value *Addr = llvm::ConstantInt::get(CGM.Int64Ty, 2608230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl llvm::DIBuilder::OpDeref); 2609230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl llvm::DIVariable D = 2610230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl DBuilder.createComplexVariable(Tag, 2611230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl llvm::DIDescriptor(Scope), 2612230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl Name, Unit, Line, Ty, 2613230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl Addr, ArgNo); 2614230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl 2615230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl // Insert an llvm.dbg.declare into the current block. 2616230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl llvm::Instruction *Call = 2617230ea4179a4684ec0d89954b7a93731b176546e9Adrian Prantl DBuilder.insertDeclare(Storage, D, Builder.GetInsertBlock()); 26187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); 26197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 26207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2621436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie } else if (const RecordType *RT = dyn_cast<RecordType>(VD->getType())) { 2622436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // If VD is an anonymous union then Storage represents value for 2623436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // all union fields. 26247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordDecl *RD = cast<RecordDecl>(RT->getDecl()); 2625d8180cf9877cd793949ae94edbf2ee84341041c5David Blaikie if (RD->isUnion() && RD->isAnonymousStructOrUnion()) { 26267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (RecordDecl::field_iterator I = RD->field_begin(), 26277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = RD->field_end(); 26287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I != E; ++I) { 26297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldDecl *Field = *I; 26307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType FieldTy = getOrCreateType(Field->getType(), Unit); 26317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef FieldName = Field->getName(); 26327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore unnamed fields. Do not ignore unnamed records. 26347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FieldName.empty() && !isa<RecordType>(Field->getType())) 26357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 26367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use VarDecl's Tag, Scope and Line number. 26387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIVariable D = 26397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createLocalVariable(Tag, llvm::DIDescriptor(Scope), 26407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldName, Unit, Line, FieldTy, 26417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getLangOpts().Optimize, Flags, 26427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArgNo); 26437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Insert an llvm.dbg.declare into the current block. 26457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Instruction *Call = 26467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.insertDeclare(Storage, D, Builder.GetInsertBlock()); 26477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); 26487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2649d8180cf9877cd793949ae94edbf2ee84341041c5David Blaikie return; 26507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2652436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie 2653436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // Create the descriptor for the variable. 2654436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie llvm::DIVariable D = 2655436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie DBuilder.createLocalVariable(Tag, llvm::DIDescriptor(Scope), 2656436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie Name, Unit, Line, Ty, 2657436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie CGM.getLangOpts().Optimize, Flags, ArgNo); 2658436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie 2659436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // Insert an llvm.dbg.declare into the current block. 2660436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie llvm::Instruction *Call = 2661436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie DBuilder.insertDeclare(Storage, D, Builder.GetInsertBlock()); 2662436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); 26637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 26647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfAutoVariable(const VarDecl *VD, 26667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *Storage, 26677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 26687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo); 26697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitDeclare(VD, llvm::dwarf::DW_TAG_auto_variable, Storage, 0, Builder); 26707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 26717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2672e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// Look up the completed type for a self pointer in the TypeCache and 2673e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// create a copy of it with the ObjectPointer and Artificial flags 2674e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// set. If the type is not cached, a new one is created. This should 2675e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// never happen though, since creating a type for the implicit self 2676e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// argument implies that we already parsed the interface definition 2677e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl/// and the ivar declarations in the implementation. 2678e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantlllvm::DIType CGDebugInfo::CreateSelfType(const QualType &QualTy, llvm::DIType Ty) { 2679e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl llvm::DIType CachedTy = getTypeOrNull(QualTy); 2680e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl if (CachedTy.Verify()) Ty = CachedTy; 2681e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl else DEBUG(llvm::dbgs() << "No cached type for self."); 2682e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl return DBuilder.createObjectPointerType(Ty); 2683e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl} 2684e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl 26857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfBlockDeclRefVariable(const VarDecl *VD, 26867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *Storage, 26877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder, 26887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CGBlockInfo &blockInfo) { 26897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo); 26907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 26917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Builder.GetInsertBlock() == 0) 26937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 26947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool isByRef = VD->hasAttr<BlocksAttr>(); 26967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t XOffset = 0; 26987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 26997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty; 27007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isByRef) 27017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset); 27027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 27037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = getOrCreateType(VD->getType(), Unit); 27047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Self is passed along as an implicit non-arg variable in a 27067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // block. Mark it as the object pointer. 27077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<ImplicitParamDecl>(VD) && VD->getName() == "self") 2708e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl Ty = CreateSelfType(VD->getType(), Ty); 27097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get location information. 27117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(VD->getLocation()); 27127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Column = getColumnNumber(VD->getLocation()); 27137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const llvm::DataLayout &target = CGM.getDataLayout(); 27157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits offset = CharUnits::fromQuantity( 27177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei target.getStructLayout(blockInfo.StructureType) 27187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ->getElementOffset(blockInfo.getCapture(VD).getIndex())); 27197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value *, 9> addr; 27217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Type *Int64Ty = CGM.Int64Ty; 27229b97adfb770c3b55c1a45049d53b624bbc6f62e1Adrian Prantl if (isa<llvm::AllocaInst>(Storage)) 27239b97adfb770c3b55c1a45049d53b624bbc6f62e1Adrian Prantl addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpDeref)); 27247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 27257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 27267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isByRef) { 27277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpDeref)); 27287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 27297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of __forwarding field 27307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext() 27317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei .toCharUnitsFromBits(target.getPointerSizeInBits(0)); 27327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 27337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpDeref)); 27347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, llvm::DIBuilder::OpPlus)); 27357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of x field 27367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext().toCharUnitsFromBits(XOffset); 27377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addr.push_back(llvm::ConstantInt::get(Int64Ty, offset.getQuantity())); 27387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the variable. 27417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIVariable D = 27427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createComplexVariable(llvm::dwarf::DW_TAG_auto_variable, 27437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor(LexicalBlockStack.back()), 27447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VD->getName(), Unit, Line, Ty, addr); 27459b97adfb770c3b55c1a45049d53b624bbc6f62e1Adrian Prantl 27467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Insert an llvm.dbg.declare into the current block. 27477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Instruction *Call = 27487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.insertDeclare(Storage, D, Builder.GetInsertPoint()); 27497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, 27507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.back())); 27517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 27527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitDeclareOfArgVariable - Emit call to llvm.dbg.declare for an argument 27547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// variable declaration. 27557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfArgVariable(const VarDecl *VD, llvm::Value *AI, 27567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ArgNo, 27577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 27587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo); 27597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitDeclare(VD, llvm::dwarf::DW_TAG_arg_variable, AI, ArgNo, Builder); 27607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 27617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 27637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei struct BlockLayoutChunk { 27647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t OffsetInBits; 27657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BlockDecl::Capture *Capture; 27667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 27677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool operator<(const BlockLayoutChunk &l, const BlockLayoutChunk &r) { 27687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return l.OffsetInBits < r.OffsetInBits; 27697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 27717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block, 2773836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl llvm::Value *Arg, 2774836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl llvm::Value *LocalAddr, 27757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 27767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo); 27777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTContext &C = CGM.getContext(); 27787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BlockDecl *blockDecl = block.getBlockDecl(); 27797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Collect some general information about the block's location. 27817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation loc = blockDecl->getCaretLocation(); 27827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile tunit = getOrCreateFile(loc); 27837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned line = getLineNumber(loc); 27847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned column = getColumnNumber(loc); 27857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Build the debug-info type for the block literal. 27877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(cast<Decl>(blockDecl->getDeclContext())); 27887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const llvm::StructLayout *blockLayout = 27907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getDataLayout().getStructLayout(block.StructureType); 27917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Value*, 16> fields; 27937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__isa", C.VoidPtrTy, 0, loc, AS_public, 27947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(0), 27957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 27967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__flags", C.IntTy, 0, loc, AS_public, 27977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(1), 27987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 27997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__reserved", C.IntTy, 0, loc, AS_public, 28007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(2), 28017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 28027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__FuncPtr", C.VoidPtrTy, 0, loc, AS_public, 28037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(3), 28047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 28057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("__descriptor", 28067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei C.getPointerType(block.NeedsCopyDispose ? 28077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei C.getBlockDescriptorExtendedType() : 28087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei C.getBlockDescriptorType()), 28097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 0, loc, AS_public, 28107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(4), 28117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 28127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We want to sort the captures by offset, not because DWARF 28147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // requires this, but because we're paranoid about debuggers. 28157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<BlockLayoutChunk, 8> chunks; 28167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 'this' capture. 28187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (blockDecl->capturesCXXThis()) { 28197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BlockLayoutChunk chunk; 28207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.OffsetInBits = 28217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(block.CXXThisIndex); 28227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.Capture = 0; 28237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunks.push_back(chunk); 28247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Variable captures. 28277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (BlockDecl::capture_const_iterator 28287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei i = blockDecl->capture_begin(), e = blockDecl->capture_end(); 28297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei i != e; ++i) { 28307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BlockDecl::Capture &capture = *i; 28317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const VarDecl *variable = capture.getVariable(); 28327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CGBlockInfo::Capture &captureInfo = block.getCapture(variable); 28337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore constant captures. 28357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (captureInfo.isConstant()) 28367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 28377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BlockLayoutChunk chunk; 28397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.OffsetInBits = 28407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(captureInfo.getIndex()); 28417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.Capture = &capture; 28427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunks.push_back(chunk); 28437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Sort by offset. 28467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::array_pod_sort(chunks.begin(), chunks.end()); 28477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (SmallVectorImpl<BlockLayoutChunk>::iterator 28497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei i = chunks.begin(), e = chunks.end(); i != e; ++i) { 28507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t offsetInBits = i->OffsetInBits; 28517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BlockDecl::Capture *capture = i->Capture; 28527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we have a null capture, this must be the C++ 'this' capture. 28547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!capture) { 28557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXMethodDecl *method = 28567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<CXXMethodDecl>(blockDecl->getNonClosureContext()); 28577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType type = method->getThisType(C); 28587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(createFieldType("this", type, 0, loc, AS_public, 28607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offsetInBits, tunit, tunit)); 28617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 28627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const VarDecl *variable = capture->getVariable(); 28657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef name = variable->getName(); 28667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType fieldType; 28687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (capture->isByRef()) { 28697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::pair<uint64_t,unsigned> ptrInfo = C.getTypeInfo(C.VoidPtrTy); 28707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: this creates a second copy of this type! 28727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t xoffset; 28737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fieldType = EmitTypeForVarWithBlocksAttr(variable, &xoffset); 28747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fieldType = DBuilder.createPointerType(fieldType, ptrInfo.first); 28757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fieldType = DBuilder.createMemberType(tunit, name, tunit, line, 28767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ptrInfo.first, ptrInfo.second, 28777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offsetInBits, 0, fieldType); 28787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 28797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fieldType = createFieldType(name, variable->getType(), 0, 28807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei loc, AS_public, offsetInBits, tunit, tunit); 28817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(fieldType); 28837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<36> typeName; 28867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::raw_svector_ostream(typeName) 28877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << "__block_literal_" << CGM.getUniqueBlockCount(); 28887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIArray fieldsArray = DBuilder.getOrCreateArray(fields); 28907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType type = 28927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createStructType(tunit, typeName.str(), tunit, line, 28937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getContext().toBits(block.BlockSize), 28947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getContext().toBits(block.BlockAlign), 2895c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie 0, llvm::DIType(), fieldsArray); 28967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei type = DBuilder.createPointerType(type, CGM.PointerWidthInBits); 28977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the block. 28997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned flags = llvm::DIDescriptor::FlagArtificial; 29007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *scope = LexicalBlockStack.back(); 29017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the parameter. 29037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIVariable debugVar = 29047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createLocalVariable(llvm::dwarf::DW_TAG_arg_variable, 29057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor(scope), 2906836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl Arg->getName(), tunit, line, type, 29077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getLangOpts().Optimize, flags, 2908836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl cast<llvm::Argument>(Arg)->getArgNo() + 1); 2909836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl 2910bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl if (LocalAddr) { 2911836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl // Insert an llvm.dbg.value into the current block. 2912bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl llvm::Instruction *DbgVal = 2913bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl DBuilder.insertDbgValueIntrinsic(LocalAddr, 0, debugVar, 2914f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher Builder.GetInsertBlock()); 2915bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl DbgVal->setDebugLoc(llvm::DebugLoc::get(line, column, scope)); 2916bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl } 2917836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl 2918bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl // Insert an llvm.dbg.declare into the current block. 2919bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl llvm::Instruction *DbgDecl = 2920bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl DBuilder.insertDeclare(Arg, debugVar, Builder.GetInsertBlock()); 2921bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl DbgDecl->setDebugLoc(llvm::DebugLoc::get(line, column, scope)); 29227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 29237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29240395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// getStaticDataMemberDeclaration - If D is an out-of-class definition of 29250395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// a static data member of a class, find its corresponding in-class 29260395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher/// declaration. 29270395de36004a718e265cc256b1bbee3bd3a791dcEric Christopherllvm::DIDerivedType CGDebugInfo::getStaticDataMemberDeclaration(const Decl *D) { 29280395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (cast<VarDecl>(D)->isStaticDataMember()) { 29290395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator 29300395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher MI = StaticDataMemberCache.find(D->getCanonicalDecl()); 29310395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (MI != StaticDataMemberCache.end()) 29320395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Verify the info still exists. 29330395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (llvm::Value *V = MI->second) 29340395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher return llvm::DIDerivedType(cast<llvm::MDNode>(V)); 29350395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 29360395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher return llvm::DIDerivedType(); 29370395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher} 29380395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 29397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitGlobalVariable - Emit information about a global variable. 29407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, 29417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const VarDecl *D) { 29427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo); 29437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create global variable debug descriptor. 29447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(D->getLocation()); 29457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(D->getLocation()); 29467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei setLocation(D->getLocation()); 29487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType T = D->getType(); 29507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (T->isIncompleteArrayType()) { 29517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // CodeGen turns int[] into int[1] so we'll do the same here. 29537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APInt ConstVal(32, 1); 29547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ET = CGM.getContext().getAsArrayType(T)->getElementType(); 29557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = CGM.getContext().getConstantArrayType(ET, ConstVal, 29577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayType::Normal, 0); 29587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef DeclName = D->getName(); 29607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef LinkageName; 29617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (D->getDeclContext() && !isa<FunctionDecl>(D->getDeclContext()) 29627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei && !isa<ObjCMethodDecl>(D->getDeclContext())) 29637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LinkageName = Var->getName(); 29647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LinkageName == DeclName) 29657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LinkageName = StringRef(); 29667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor DContext = 29677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(dyn_cast<Decl>(D->getDeclContext())); 29683923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie llvm::DIGlobalVariable GV = DBuilder.createStaticVariable(DContext, DeclName, LinkageName, 29697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unit, LineNo, getOrCreateType(T, Unit), 29700395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher Var->hasInternalLinkage(), Var, 29710395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher getStaticDataMemberDeclaration(D)); 29723923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie DeclCache.insert(std::make_pair(D->getCanonicalDecl(), llvm::WeakVH(GV))); 29737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 29747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitGlobalVariable - Emit information about an objective-c interface. 29767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, 29777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *ID) { 29787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo); 29797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create global variable debug descriptor. 29807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(ID->getLocation()); 29817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(ID->getLocation()); 29827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = ID->getName(); 29847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType T = CGM.getContext().getObjCInterfaceType(ID); 29867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (T->isIncompleteArrayType()) { 29877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // CodeGen turns int[] into int[1] so we'll do the same here. 29897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APInt ConstVal(32, 1); 29907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ET = CGM.getContext().getAsArrayType(T)->getElementType(); 29917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = CGM.getContext().getConstantArrayType(ET, ConstVal, 29937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayType::Normal, 0); 29947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createGlobalVariable(Name, Unit, LineNo, 29977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateType(T, Unit), 29987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Var->hasInternalLinkage(), Var); 29997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 30007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// EmitGlobalVariable - Emit global variable's debug info. 30027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, 30037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Constant *Init) { 30047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo); 30057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the variable. 30067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); 30077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = VD->getName(); 30087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty = getOrCreateType(VD->getType(), Unit); 30097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(VD)) { 30107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const EnumDecl *ED = cast<EnumDecl>(ECD->getDeclContext()); 30117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(isa<EnumType>(ED->getTypeForDecl()) && "Enum without EnumType?"); 30127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = getOrCreateType(QualType(ED->getTypeForDecl(), 0), Unit); 30137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Do not use DIGlobalVariable for enums. 30157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty.getTag() == llvm::dwarf::DW_TAG_enumeration_type) 30167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 30173923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie llvm::DIGlobalVariable GV = DBuilder.createStaticVariable(Unit, Name, Name, Unit, 30187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getLineNumber(VD->getLocation()), 30190395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher Ty, true, Init, 30200395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher getStaticDataMemberDeclaration(VD)); 30213923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie DeclCache.insert(std::make_pair(VD->getCanonicalDecl(), llvm::WeakVH(GV))); 30223923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie} 30233923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie 30243923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikiellvm::DIScope CGDebugInfo::getCurrentContextDescriptor(const Decl *D) { 30253923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie if (!LexicalBlockStack.empty()) 30263923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie return llvm::DIScope(LexicalBlockStack.back()); 30273923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie return getContextDescriptor(D); 30287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 30297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3030957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikievoid CGDebugInfo::EmitUsingDirective(const UsingDirectiveDecl &UD) { 3031957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie DBuilder.createImportedModule( 30323923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie getCurrentContextDescriptor(cast<Decl>(UD.getDeclContext())), 30333923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie getOrCreateNameSpace(UD.getNominatedNamespace()), 3034957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie getLineNumber(UD.getLocation())); 3035957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie} 3036957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie 30373923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikievoid CGDebugInfo::EmitUsingDecl(const UsingDecl &UD) { 30383923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie assert(UD.shadow_size() && 30393923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie "We shouldn't be codegening an invalid UsingDecl containing no decls"); 30403923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie // Emitting one decl is sufficient - debuggers can detect that this is an 30413923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie // overloaded name & provide lookup for all the overloads. 30423923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie const UsingShadowDecl &USD = **UD.shadow_begin(); 30433923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie if (llvm::DIDescriptor Target = getDeclarationOrDefinition(USD.getUnderlyingDecl())) 30443923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie DBuilder.createImportedDeclaration( 30453923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie getCurrentContextDescriptor(cast<Decl>(USD.getDeclContext())), Target, 30463923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie getLineNumber(USD.getLocation())); 30473923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie} 30483923d6a87fe7b2c91cc4a7dbd90c4ec7e2316bcdDavid Blaikie 30497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getOrCreateNamesSpace - Return namespace descriptor for the given 30507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// namespace decl. 30517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::DINameSpace 30527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::getOrCreateNameSpace(const NamespaceDecl *NSDecl) { 30537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const NamespaceDecl *, llvm::WeakVH>::iterator I = 30547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NameSpaceCache.find(NSDecl); 30557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (I != NameSpaceCache.end()) 30567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::DINameSpace(cast<llvm::MDNode>(I->second)); 30577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(NSDecl->getLocation()); 30597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIFile FileD = getOrCreateFile(NSDecl->getLocation()); 30607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIDescriptor Context = 30617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getContextDescriptor(dyn_cast<Decl>(NSDecl->getDeclContext())); 30627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DINameSpace NS = 30637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.createNameSpace(Context, NSDecl->getName(), FileD, LineNo); 30647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NameSpaceCache[NSDecl] = llvm::WeakVH(NS); 30657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return NS; 30667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 30677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::finalize() { 30697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (std::vector<std::pair<void *, llvm::WeakVH> >::const_iterator VI 30707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ReplaceMap.begin(), VE = ReplaceMap.end(); VI != VE; ++VI) { 30717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DIType Ty, RepTy; 30727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Verify that the debug info still exists. 30737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::Value *V = VI->second) 30747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = llvm::DIType(cast<llvm::MDNode>(V)); 30757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<void *, llvm::WeakVH>::iterator it = 30777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeCache.find(VI->first); 30787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (it != TypeCache.end()) { 30797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Verify that the debug info still exists. 30807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::Value *V = it->second) 30817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RepTy = llvm::DIType(cast<llvm::MDNode>(V)); 30827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3083ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 30849b97adfb770c3b55c1a45049d53b624bbc6f62e1Adrian Prantl if (Ty.Verify() && Ty.isForwardDecl() && RepTy.Verify()) 30857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty.replaceAllUsesWith(RepTy); 30867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3087ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 3088ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // We keep our own list of retained types, because we need to look 3089ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // up the final type in the type cache. 3090ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl for (std::vector<void *>::const_iterator RI = RetainedTypes.begin(), 3091ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl RE = RetainedTypes.end(); RI != RE; ++RI) 3092ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl DBuilder.retainType(llvm::DIType(cast<llvm::MDNode>(TypeCache[*RI]))); 3093ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 30947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.finalize(); 30957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3096