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" 164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "CGRecordLayout.h" 179dfd24324c079b564dda936c6ae46898b82121e2David Blaikie#include "CGCXXABI.h" 187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CGObjCRuntime.h" 197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CodeGenFunction.h" 207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CodeGenModule.h" 217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/ASTContext.h" 227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/DeclFriend.h" 237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/DeclObjC.h" 247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/DeclTemplate.h" 257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/Expr.h" 267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/RecordLayout.h" 277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/FileManager.h" 287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/SourceManager.h" 297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/Version.h" 307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Frontend/CodeGenOptions.h" 3187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/Lex/HeaderSearchOptions.h" 3287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/Lex/ModuleMap.h" 3387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/Lex/PreprocessorOptions.h" 347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/ADT/SmallVector.h" 357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/ADT/StringExtras.h" 363b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/Constants.h" 373b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/DataLayout.h" 383b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/DerivedTypes.h" 393b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/Instructions.h" 403b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/Intrinsics.h" 413b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/Module.h" 427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/FileSystem.h" 43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/Support/Path.h" 447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang; 457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang::CodeGen; 467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::CGDebugInfo(CodeGenModule &CGM) 48688cf5b05713055d27bf53460f7c20a776440767Eric Christopher : CGM(CGM), DebugKind(CGM.getCodeGenOpts().getDebugInfo()), 4987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DebugTypeExtRefs(CGM.getCodeGenOpts().DebugTypeExtRefs), 50688cf5b05713055d27bf53460f7c20a776440767Eric Christopher DBuilder(CGM.getModule()) { 5187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &KV : CGM.getCodeGenOpts().DebugPrefixMap) 5287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DebugPrefixMap[KV.first] = KV.second; 537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CreateCompileUnit(); 547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::~CGDebugInfo() { 577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(LexicalBlockStack.empty() && 587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Region stack mismatch, stack not empty!"); 597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 610e2c34f92f00628d48968dfea096d36381f494cbStephen HinesApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF, 620e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SourceLocation TemporaryLocation) 6387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : CGF(&CGF) { 640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines init(TemporaryLocation); 650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 670e2c34f92f00628d48968dfea096d36381f494cbStephen HinesApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF, 680e2c34f92f00628d48968dfea096d36381f494cbStephen Hines bool DefaultToEmpty, 690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SourceLocation TemporaryLocation) 7087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : CGF(&CGF) { 710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines init(TemporaryLocation, DefaultToEmpty); 720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 740e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid ApplyDebugLocation::init(SourceLocation TemporaryLocation, 750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines bool DefaultToEmpty) { 7687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *DI = CGF->getDebugInfo(); 7787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!DI) { 7887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CGF = nullptr; 7987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return; 8087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 8187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 8287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar OriginalLocation = CGF->Builder.getCurrentDebugLocation(); 8387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (TemporaryLocation.isValid()) { 8487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DI->EmitLocation(CGF->Builder, TemporaryLocation); 8587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return; 8687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 8787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 8887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (DefaultToEmpty) { 8987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CGF->Builder.SetCurrentDebugLocation(llvm::DebugLoc()); 9087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return; 91ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl } 9287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 9387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Construct a location that has a valid scope, but no line info. 9487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(!DI->LexicalBlockStack.empty()); 9587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CGF->Builder.SetCurrentDebugLocation( 9687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DebugLoc::get(0, 0, DI->LexicalBlockStack.back())); 97ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl} 98ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl 990e2c34f92f00628d48968dfea096d36381f494cbStephen HinesApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF, const Expr *E) 10087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : CGF(&CGF) { 1010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines init(E->getExprLoc()); 102b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl} 103b6cdc96e7679f0344a36395a87c249930fac8a9fAdrian Prantl 1040e2c34f92f00628d48968dfea096d36381f494cbStephen HinesApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF, llvm::DebugLoc Loc) 10587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : CGF(&CGF) { 10687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!CGF.getDebugInfo()) { 10787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar this->CGF = nullptr; 10887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return; 109ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl } 11087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar OriginalLocation = CGF.Builder.getCurrentDebugLocation(); 11187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Loc) 11287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CGF.Builder.SetCurrentDebugLocation(std::move(Loc)); 113ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl} 114ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl 1150e2c34f92f00628d48968dfea096d36381f494cbStephen HinesApplyDebugLocation::~ApplyDebugLocation() { 1160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Query CGF so the location isn't overwritten when location updates are 1170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // temporarily disabled (for C++ default function arguments) 11887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (CGF) 11987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CGF->Builder.SetCurrentDebugLocation(std::move(OriginalLocation)); 120ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl} 121ed6bbe4ab8d06cd09fdfd294e2b2f8ab3808f84aAdrian Prantl 1227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::setLocation(SourceLocation Loc) { 1237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the new location isn't valid return. 124176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Loc.isInvalid()) 125176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return; 1267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurLoc = CGM.getContext().getSourceManager().getExpansionLoc(Loc); 1287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we've changed files in the middle of a lexical scope go ahead 1307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // and create a new lexical scope with file node if it's different 1317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // from the one in the scope. 132176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (LexicalBlockStack.empty()) 133176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return; 1347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 136b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back()); 1377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PCLoc = SM.getPresumedLoc(CurLoc); 1387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (PCLoc.isInvalid() || Scope->getFilename() == PCLoc.getFilename()) 1407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 1417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 142b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (auto *LBF = dyn_cast<llvm::DILexicalBlockFile>(Scope)) { 1437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 144b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar LexicalBlockStack.emplace_back(DBuilder.createLexicalBlockFile( 145b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar LBF->getScope(), getOrCreateFile(CurLoc))); 146b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } else if (isa<llvm::DILexicalBlock>(Scope) || 147b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar isa<llvm::DISubprogram>(Scope)) { 1487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 149b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar LexicalBlockStack.emplace_back( 150b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DBuilder.createLexicalBlockFile(Scope, getOrCreateFile(CurLoc))); 1517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarllvm::DIScope *CGDebugInfo::getDeclContextDescriptor(const Decl *D) { 15587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DIScope *Mod = getParentModuleOrNull(D); 15687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return getContextDescriptor(cast<Decl>(D->getDeclContext()), 15787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Mod ? Mod : TheCU); 15887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 15987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 16087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarllvm::DIScope *CGDebugInfo::getContextDescriptor(const Decl *Context, 16187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DIScope *Default) { 1627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Context) 16387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return Default; 1647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines auto I = RegionMap.find(Context); 1667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (I != RegionMap.end()) { 1670e2c34f92f00628d48968dfea096d36381f494cbStephen Hines llvm::Metadata *V = I->second; 168b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return dyn_cast_or_null<llvm::DIScope>(V); 1697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check namespace. 1727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const NamespaceDecl *NSDecl = dyn_cast<NamespaceDecl>(Context)) 173bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie return getOrCreateNameSpace(NSDecl); 1747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 175bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie if (const RecordDecl *RDecl = dyn_cast<RecordDecl>(Context)) 176bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie if (!RDecl->isDependentType()) 177bb00079d2ca77815efa0ab50cb10f302d1ae69e4David Blaikie return getOrCreateType(CGM.getContext().getTypeDeclType(RDecl), 178176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines getOrCreateMainFile()); 17987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return Default; 1807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getFunctionName(const FunctionDecl *FD) { 183176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(FD && "Invalid FunctionDecl!"); 1847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *FII = FD->getIdentifier(); 185176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FunctionTemplateSpecializationInfo *Info = 186176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FD->getTemplateSpecializationInfo(); 18787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 1884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Emit the unqualified name in normal operation. LLVM and the debugger can 1894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // compute the fully qualified name from the scope chain. If we're only 1904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // emitting line table info, there won't be any scope chains, so emit the 1914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // fully qualified name here so that stack traces are more accurate. 1924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // FIXME: Do this when emitting DWARF as well as when emitting CodeView after 1934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // evaluating the size impact. 1944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool UseQualifiedName = DebugKind == codegenoptions::DebugLineTablesOnly && 1954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CGM.getCodeGenOpts().EmitCodeView; 1964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!Info && FII && !UseQualifiedName) 1987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return FII->getName(); 1997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2005eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer SmallString<128> NS; 2015eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer llvm::raw_svector_ostream OS(NS); 20287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar PrintingPolicy Policy(CGM.getLangOpts()); 2034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Policy.MSVCFormatting = CGM.getCodeGenOpts().EmitCodeView; 2044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!UseQualifiedName) 20587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar FD->printName(OS); 2064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else 2074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FD->printQualifiedName(OS, Policy); 2084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Add any template specialization args. 2104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Info) { 2114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const TemplateArgumentList *TArgs = Info->TemplateArguments; 2124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TemplateSpecializationType::PrintTemplateArgumentList(OS, TArgs->asArray(), 2134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Policy); 2147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Copy this name on the side and use its reference. 2178495379bd6127dac2c39a6dd7840d95bb3a9aaa3Benjamin Kramer return internString(OS.str()); 2187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getObjCMethodName(const ObjCMethodDecl *OMD) { 2217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<256> MethodName; 2227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::raw_svector_ostream OS(MethodName); 2237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << (OMD->isInstanceMethod() ? '-' : '+') << '['; 2247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const DeclContext *DC = OMD->getDeclContext(); 2256537f083555f9606c495d05c562878aa49bae987Eric Christopher if (const ObjCImplementationDecl *OID = 226176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines dyn_cast<const ObjCImplementationDecl>(DC)) { 227176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines OS << OID->getName(); 2286537f083555f9606c495d05c562878aa49bae987Eric Christopher } else if (const ObjCInterfaceDecl *OID = 229176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines dyn_cast<const ObjCInterfaceDecl>(DC)) { 230176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines OS << OID->getName(); 23187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } else if (const ObjCCategoryDecl *OC = dyn_cast<ObjCCategoryDecl>(DC)) { 23287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (OC->IsClassExtension()) { 23387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar OS << OC->getClassInterface()->getName(); 23487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } else { 23587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar OS << ((const NamedDecl *)OC)->getIdentifier()->getNameStart() << '(' 23687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar << OC->getIdentifier()->getNameStart() << ')'; 23787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 2386537f083555f9606c495d05c562878aa49bae987Eric Christopher } else if (const ObjCCategoryImplDecl *OCD = 239176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines dyn_cast<const ObjCCategoryImplDecl>(DC)) { 240176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines OS << ((const NamedDecl *)OCD)->getIdentifier()->getNameStart() << '(' 241176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines << OCD->getIdentifier()->getNameStart() << ')'; 242b509224b28bf7ddb2e4ff1d52855df5b56b44bf4Adrian Prantl } else if (isa<ObjCProtocolDecl>(DC)) { 243687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl // We can extract the type of the class from the self pointer. 244176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (ImplicitParamDecl *SelfDecl = OMD->getSelfDecl()) { 245687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl QualType ClassTy = 246176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines cast<ObjCObjectPointerType>(SelfDecl->getType())->getPointeeType(); 247687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl ClassTy.print(OS, PrintingPolicy(LangOptions())); 248687ecae11966c3cf098dda03d229770b14de53edAdrian Prantl } 2497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OS << ' ' << OMD->getSelector().getAsString() << ']'; 2517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2528495379bd6127dac2c39a6dd7840d95bb3a9aaa3Benjamin Kramer return internString(OS.str()); 2537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getSelectorName(Selector S) { 2568495379bd6127dac2c39a6dd7840d95bb3a9aaa3Benjamin Kramer return internString(S.getAsString()); 2577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 259176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesStringRef CGDebugInfo::getClassName(const RecordDecl *RD) { 2604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (isa<ClassTemplateSpecializationDecl>(RD)) { 2614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SmallString<128> Name; 262651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::raw_svector_ostream OS(Name); 263651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines RD->getNameForDiagnostic(OS, CGM.getContext().getPrintingPolicy(), 264651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /*Qualified*/ false); 2654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Copy this name on the side and use its reference. 2674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return internString(Name); 2685eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer } 2697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // quick optimization to avoid having to intern strings that are already 2714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // stored reliably elsewhere 2724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (const IdentifierInfo *II = RD->getIdentifier()) 2734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return II->getName(); 2744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // The CodeView printer in LLVM wants to see the names of unnamed types: it is 2764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // used to reconstruct the fully qualified type names. 2774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (CGM.getCodeGenOpts().EmitCodeView) { 2784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (const TypedefNameDecl *D = RD->getTypedefNameForAnonDecl()) { 2794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(RD->getDeclContext() == D->getDeclContext() && 2804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar "Typedef should not be in another decl context!"); 2814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(D->getDeclName().getAsIdentifierInfo() && 2824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar "Typedef was not named!"); 2834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return D->getDeclName().getAsIdentifierInfo()->getName(); 2844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 2854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (CGM.getLangOpts().CPlusPlus) { 2874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StringRef Name; 2884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ASTContext &Context = CGM.getContext(); 2904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (const DeclaratorDecl *DD = Context.getDeclaratorForUnnamedTagDecl(RD)) 2914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Anonymous types without a name for linkage purposes have their 2924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // declarator mangled in if they have one. 2934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Name = DD->getName(); 2944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else if (const TypedefNameDecl *TND = 2954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Context.getTypedefNameForUnnamedTagDecl(RD)) 2964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Anonymous types without a name for linkage purposes have their 2974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // associate typedef mangled in if they have one. 2984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Name = TND->getName(); 2994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 3004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!Name.empty()) { 3014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SmallString<256> UnnamedType("<unnamed-type-"); 3024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar UnnamedType += Name; 3034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar UnnamedType += '>'; 3044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return internString(UnnamedType); 3054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 3064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 3074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 3084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 3094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return StringRef(); 3107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 312b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIFile *CGDebugInfo::getOrCreateFile(SourceLocation Loc) { 3137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Loc.isValid()) 3147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If Location is not valid then use main input file. 31587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return DBuilder.createFile(remapDIPath(TheCU->getFilename()), 31687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar remapDIPath(TheCU->getDirectory())); 3177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 3197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PLoc = SM.getPresumedLoc(Loc); 3207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PLoc.isInvalid() || StringRef(PLoc.getFilename()).empty()) 3227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the location is not valid then use main input file. 32387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return DBuilder.createFile(remapDIPath(TheCU->getFilename()), 32487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar remapDIPath(TheCU->getDirectory())); 3257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Cache the results. 3277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const char *fname = PLoc.getFilename(); 3280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines auto it = DIFileCache.find(fname); 3297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (it != DIFileCache.end()) { 3317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Verify that the information still exists. 3320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (llvm::Metadata *V = it->second) 333b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return cast<llvm::DIFile>(V); 3347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DIFile *F = DBuilder.createFile(remapDIPath(PLoc.getFilename()), 33787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar remapDIPath(getCurrentDirname())); 3387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DIFileCache[fname].reset(F); 3407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return F; 3417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 343b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIFile *CGDebugInfo::getOrCreateMainFile() { 34487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return DBuilder.createFile(remapDIPath(TheCU->getFilename()), 34587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar remapDIPath(TheCU->getDirectory())); 34687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 34787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 34887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstd::string CGDebugInfo::remapDIPath(StringRef Path) const { 34987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &Entry : DebugPrefixMap) 35087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Path.startswith(Entry.first)) 35187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return (Twine(Entry.second) + Path.substr(Entry.first.size())).str(); 35287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return Path.str(); 3537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned CGDebugInfo::getLineNumber(SourceLocation Loc) { 3567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Loc.isInvalid() && CurLoc.isInvalid()) 3577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 3587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 3597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc); 360176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return PLoc.isValid() ? PLoc.getLine() : 0; 3617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36300df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantlunsigned CGDebugInfo::getColumnNumber(SourceLocation Loc, bool Force) { 3647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We may not want column information at all. 36500df5eaa9f4f7cc0809fd47c95311b532fbe63c6Adrian Prantl if (!Force && !CGM.getCodeGenOpts().DebugColumnInfo) 3667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 3677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the location is invalid then use the current column. 3697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Loc.isInvalid() && CurLoc.isInvalid()) 3707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 3717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 3727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc); 373176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return PLoc.isValid() ? PLoc.getColumn() : 0; 3747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getCurrentDirname() { 3777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CGM.getCodeGenOpts().DebugCompilationDir.empty()) 3787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CGM.getCodeGenOpts().DebugCompilationDir; 3797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CWDName.empty()) 3817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CWDName; 3827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<256> CWD; 3837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::sys::fs::current_path(CWD); 3848495379bd6127dac2c39a6dd7840d95bb3a9aaa3Benjamin Kramer return CWDName = internString(CWD); 3857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::CreateCompileUnit() { 3887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Should we be asking the SourceManager for the main file name, instead of 3906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // accepting it as an argument? This just causes the main file name to 3916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // mismatch with source locations and create extra lexical scopes or 3926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // mismatched debug info (a CU with a DW_AT_file of "-", because that's what 3936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // the driver passed, but functions/other things have DW_AT_file of "<stdin>" 3946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // because that's what the SourceManager says) 3956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get absolute path name. 3977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = CGM.getContext().getSourceManager(); 3987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string MainFileName = CGM.getCodeGenOpts().MainFileName; 3997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MainFileName.empty()) 4006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines MainFileName = "<stdin>"; 4017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The main file name provided via the "-main-file-name" option contains just 4037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the file name itself with no path information. This file name may have had 4047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // a relative path, so we look into the actual file entry for the main 4057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // file to determine the real absolute path for the file. 4067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string MainFileDir; 4077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID())) { 40887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar MainFileDir = remapDIPath(MainFile->getDir()->getName()); 409921ac4d6dfab47090b167dc092133d747a18c71aYaron Keren if (MainFileDir != ".") { 410651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::SmallString<1024> MainFileDirSS(MainFileDir); 411651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::sys::path::append(MainFileDirSS, MainFileName); 412651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MainFileName = MainFileDirSS.str(); 413921ac4d6dfab47090b167dc092133d747a18c71aYaron Keren } 4147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::dwarf::SourceLanguage LangTag; 4177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const LangOptions &LO = CGM.getLangOpts(); 4187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LO.CPlusPlus) { 4197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LO.ObjC1) 4207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_ObjC_plus_plus; 4217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 4227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_C_plus_plus; 4237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (LO.ObjC1) { 4247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_ObjC; 4254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else if (LO.RenderScript) { 426f6ea021de304a6a0b60004686176db6da3a2d46cEwan Crawford LangTag = llvm::dwarf::DW_LANG_GOOGLE_RenderScript; 4277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (LO.C99) { 4287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_C99; 4297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 4307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangTag = llvm::dwarf::DW_LANG_C89; 4317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Producer = getClangFullVersion(); 4347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Figure out which version of the ObjC runtime we have. 4367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RuntimeVers = 0; 4377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LO.ObjC1) 4387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RuntimeVers = LO.ObjCRuntime.isNonFragile() ? 2 : 1; 4397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::DICompileUnit::DebugEmissionKind EmissionKind; 4414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar switch (DebugKind) { 4424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case codegenoptions::NoDebugInfo: 4434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case codegenoptions::LocTrackingOnly: 4444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar EmissionKind = llvm::DICompileUnit::NoDebug; 4454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 4464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case codegenoptions::DebugLineTablesOnly: 4474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar EmissionKind = llvm::DICompileUnit::LineTablesOnly; 4484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 4494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case codegenoptions::LimitedDebugInfo: 4504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case codegenoptions::FullDebugInfo: 4514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar EmissionKind = llvm::DICompileUnit::FullDebug; 4524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 4534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 4544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 4557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create new compile unit. 4567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME - Eliminate TheCU. 457651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TheCU = DBuilder.createCompileUnit( 45887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LangTag, remapDIPath(MainFileName), remapDIPath(getCurrentDirname()), 45987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Producer, LO.Optimize, CGM.getCodeGenOpts().DwarfDebugFlags, RuntimeVers, 4604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CGM.getCodeGenOpts().SplitDwarfFile, EmissionKind, 0 /* DWOid */); 4617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 4627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 463b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateType(const BuiltinType *BT) { 4646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::dwarf::TypeKind Encoding; 4657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef BTName; 4667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (BT->getKind()) { 4677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define BUILTIN_TYPE(Id, SingletonId) 468176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id: 4697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/BuiltinTypes.def" 4707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Dependent: 4717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Unexpected builtin type"); 4727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::NullPtr: 47324118f5d62f68b18a75db4eb570a0aaf7f4dda97Peter Collingbourne return DBuilder.createNullPtrType(); 4747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Void: 475b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 4767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ObjCClass: 4776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!ClassTy) 4786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ClassTy = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 4796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "objc_class", TheCU, 4806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getOrCreateMainFile(), 0); 4817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ClassTy; 4827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ObjCId: { 4837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // typedef struct objc_class *Class; 4847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // typedef struct objc_object { 4857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Class isa; 4867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // } *id; 4877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 488b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (ObjTy) 4897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ObjTy; 4907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 491b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (!ClassTy) 4927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ClassTy = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 4937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "objc_class", TheCU, 4947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getOrCreateMainFile(), 0); 4957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 4976537f083555f9606c495d05c562878aa49bae987Eric Christopher 498b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto *ISATy = DBuilder.createPointerType(ClassTy, Size); 4997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 500f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher ObjTy = 501c1d0af1f550fdd59e6ce36f25bae6c735de90071David Blaikie DBuilder.createStructType(TheCU, "objc_object", getOrCreateMainFile(), 502b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 0, 0, 0, 0, nullptr, llvm::DINodeArray()); 5037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DBuilder.replaceArrays( 5050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines ObjTy, 5060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DBuilder.getOrCreateArray(&*DBuilder.createMemberType( 5070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines ObjTy, "isa", getOrCreateMainFile(), 0, Size, 0, 0, 0, ISATy))); 5087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ObjTy; 5097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ObjCSel: { 5116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!SelTy) 5126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SelTy = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 5136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "objc_selector", TheCU, 5146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getOrCreateMainFile(), 0); 5157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SelTy; 5167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 517b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei 5184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 5194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case BuiltinType::Id: \ 5204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getOrCreateStructPtrType("opencl_" #ImgType "_" #Suffix "_t", \ 5214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SingletonId); 5224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/Basic/OpenCLImageTypes.def" 52321f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei case BuiltinType::OCLSampler: 524176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return DBuilder.createBasicType( 525176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "opencl_sampler_t", CGM.getContext().getTypeSize(BT), 526176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CGM.getContext().getTypeAlign(BT), llvm::dwarf::DW_ATE_unsigned); 527e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case BuiltinType::OCLEvent: 528176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return getOrCreateStructPtrType("opencl_event_t", OCLEventDITy); 52987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::OCLClkEvent: 53087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return getOrCreateStructPtrType("opencl_clk_event_t", OCLClkEventDITy); 53187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::OCLQueue: 53287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return getOrCreateStructPtrType("opencl_queue_t", OCLQueueDITy); 53387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::OCLNDRange: 53487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return getOrCreateStructPtrType("opencl_ndrange_t", OCLNDRangeDITy); 53587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::OCLReserveID: 53687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return getOrCreateStructPtrType("opencl_reserve_id_t", OCLReserveIDDITy); 537b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei 5387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UChar: 539176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case BuiltinType::Char_U: 540176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Encoding = llvm::dwarf::DW_ATE_unsigned_char; 541176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 5427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char_S: 543176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case BuiltinType::SChar: 544176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Encoding = llvm::dwarf::DW_ATE_signed_char; 545176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 5467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char16: 547176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case BuiltinType::Char32: 548176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Encoding = llvm::dwarf::DW_ATE_UTF; 549176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 5507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UShort: 5517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UInt: 5527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UInt128: 5537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULong: 5547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::WChar_U: 555176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case BuiltinType::ULongLong: 556176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Encoding = llvm::dwarf::DW_ATE_unsigned; 557176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 5587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Short: 5597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Int: 5607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Int128: 5617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Long: 5627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::WChar_S: 563176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case BuiltinType::LongLong: 564176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Encoding = llvm::dwarf::DW_ATE_signed; 565176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 566176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case BuiltinType::Bool: 567176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Encoding = llvm::dwarf::DW_ATE_boolean; 568176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 5697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Half: 5707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Float: 5717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::LongDouble: 5724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case BuiltinType::Float128: 573176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case BuiltinType::Double: 5744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // FIXME: For targets where long double and __float128 have the same size, 5754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // they are currently indistinguishable in the debugger without some 5764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // special treatment. However, there is currently no consensus on encoding 5774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // and this should be updated once a DWARF encoding exists for distinct 5784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // floating point types of the same size. 579176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Encoding = llvm::dwarf::DW_ATE_float; 580176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 5817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (BT->getKind()) { 584176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case BuiltinType::Long: 585176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines BTName = "long int"; 586176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 587176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case BuiltinType::LongLong: 588176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines BTName = "long long int"; 589176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 590176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case BuiltinType::ULong: 591176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines BTName = "long unsigned int"; 592176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 593176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case BuiltinType::ULongLong: 594176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines BTName = "long long unsigned int"; 595176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 5967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 5977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BTName = BT->getName(CGM.getLangOpts()); 5987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 5997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 6017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(BT); 6027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(BT); 603b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return DBuilder.createBasicType(BTName, Size, Align, Encoding); 6047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 606b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateType(const ComplexType *Ty) { 6077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 6086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::dwarf::TypeKind Encoding = llvm::dwarf::DW_ATE_complex_float; 6097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty->isComplexIntegerType()) 6107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Encoding = llvm::dwarf::DW_ATE_lo_user; 6117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 6137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 614b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return DBuilder.createBasicType("complex", Size, Align, Encoding); 6157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 617b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateQualifiedType(QualType Ty, 618b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit) { 6197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualifierCollector Qc; 6207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Type *T = Qc.strip(Ty); 6217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore these qualifiers for now. 6237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeObjCGCAttr(); 6247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeAddressSpace(); 6257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeObjCLifetime(); 6267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We will create one Derived type for one qualifier and recurse to handle any 6287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // additional ones. 6296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::dwarf::Tag Tag; 6307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Qc.hasConst()) { 6317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_const_type; 6327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeConst(); 6337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Qc.hasVolatile()) { 6347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_volatile_type; 6357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeVolatile(); 6367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Qc.hasRestrict()) { 6377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tag = llvm::dwarf::DW_TAG_restrict_type; 6387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qc.removeRestrict(); 6397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 6407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Qc.empty() && "Unknown type qualifier for debug info"); 6417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(QualType(T, 0), Unit); 6427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 644b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto *FromTy = getOrCreateType(Qc.apply(CGM.getContext(), T), Unit); 6457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // No need to fill in the Name, Line, Size, Alignment, Offset in case of 6477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // CVR derived types. 648b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return DBuilder.createQualifiedType(Tag, FromTy); 6497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 651b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateType(const ObjCObjectPointerType *Ty, 652b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit) { 65305f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian 65405f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian // The frontend treats 'id' as a typedef to an ObjCObjectType, 65505f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian // whereas 'id<protocol>' is treated as an ObjCPointerType. For the 65605f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian // debug info, we want to emit 'id' in both cases. 65705f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian if (Ty->isObjCQualifiedIdType()) 658176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return getOrCreateType(CGM.getContext().getObjCIdType(), Unit); 65905f8ff134d5f270bd7bfe4aaef491bd3febddea1Fariborz Jahanian 660b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty, 661b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Ty->getPointeeType(), Unit); 6627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 664b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateType(const PointerType *Ty, 665b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit) { 6666537f083555f9606c495d05c562878aa49bae987Eric Christopher return CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty, 6677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty->getPointeeType(), Unit); 6687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 67087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \return whether a C++ mangling exists for the type defined by TD. 67187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic bool hasCXXMangling(const TagDecl *TD, llvm::DICompileUnit *TheCU) { 67287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar switch (TheCU->getSourceLanguage()) { 67387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case llvm::dwarf::DW_LANG_C_plus_plus: 67487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return true; 67587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case llvm::dwarf::DW_LANG_ObjC_plus_plus: 67687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return isa<CXXRecordDecl>(TD) || isa<EnumDecl>(TD); 67787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar default: 67887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return false; 67987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 68087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 68187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 68283369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren/// In C++ mode, types have linkage, so we can rely on the ODR and 68383369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren/// on their mangled names, if they're external. 684176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstatic SmallString<256> getUniqueTagTypeName(const TagType *Ty, 685176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CodeGenModule &CGM, 686b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DICompileUnit *TheCU) { 68783369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren SmallString<256> FullName; 68883369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren const TagDecl *TD = Ty->getDecl(); 68987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 69087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!hasCXXMangling(TD, TheCU) || !TD->isExternallyVisible()) 69183369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren return FullName; 69287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 69383369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren // TODO: This is using the RTTI name. Is there a better way to get 69483369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren // a unique string for a type? 69583369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren llvm::raw_svector_ostream Out(FullName); 69683369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(QualType(Ty, 0), Out); 69783369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren return FullName; 69883369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren} 69983369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren 70087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \return the approproate DWARF tag for a composite type. 7010e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic llvm::dwarf::Tag getTagForRecord(const RecordDecl *RD) { 7020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines llvm::dwarf::Tag Tag; 7030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (RD->isStruct() || RD->isInterface()) 7040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Tag = llvm::dwarf::DW_TAG_structure_type; 7050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines else if (RD->isUnion()) 7060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Tag = llvm::dwarf::DW_TAG_union_type; 7070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines else { 7080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // FIXME: This could be a struct type giving a default visibility different 7090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // than C++ class type, but needs llvm metadata changes first. 7100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines assert(RD->isClass()); 7110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Tag = llvm::dwarf::DW_TAG_class_type; 7120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 7130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return Tag; 7140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 7150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 716b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DICompositeType * 717f332733e141905ccefe43e7fe65f9a8a4263a2f6Manman RenCGDebugInfo::getOrCreateRecordFwdDecl(const RecordType *Ty, 718b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIScope *Ctx) { 719f332733e141905ccefe43e7fe65f9a8a4263a2f6Manman Ren const RecordDecl *RD = Ty->getDecl(); 720b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (llvm::DIType *T = getTypeOrNull(CGM.getContext().getRecordType(RD))) 721b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return cast<llvm::DICompositeType>(T); 722b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *DefUnit = getOrCreateFile(RD->getLocation()); 7237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(RD->getLocation()); 7247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef RDName = getClassName(RD); 7257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar uint64_t Size = 0; 7273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar uint64_t Align = 0; 7283ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 7293ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar const RecordDecl *D = RD->getDefinition(); 7303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (D && D->isCompleteDefinition()) { 7313ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Size = CGM.getContext().getTypeSize(Ty); 7323ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Align = CGM.getContext().getTypeAlign(Ty); 7333ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 7347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the type. 73683369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren SmallString<256> FullName = getUniqueTagTypeName(Ty, CGM, TheCU); 737b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DICompositeType *RetTy = DBuilder.createReplaceableCompositeType( 7383ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar getTagForRecord(RD), RDName, Ctx, DefUnit, Line, 0, Size, Align, 739b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DINode::FlagFwdDecl, FullName); 7400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines ReplaceMap.emplace_back( 7410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines std::piecewise_construct, std::make_tuple(Ty), 7420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines std::make_tuple(static_cast<llvm::Metadata *>(RetTy))); 7436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return RetTy; 7447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 746b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreatePointerLikeType(llvm::dwarf::Tag Tag, 747b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar const Type *Ty, 748b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar QualType PointeeTy, 749b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit) { 7507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 7517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Size is always the size of a pointer. We can't use getTypeSize here 7527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // because that does not return the correct value for references. 7537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned AS = CGM.getContext().getTargetAddressSpace(PointeeTy); 75464aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall uint64_t Size = CGM.getTarget().getPointerWidth(AS); 7557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 7567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 75787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Tag == llvm::dwarf::DW_TAG_reference_type || 75887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Tag == llvm::dwarf::DW_TAG_rvalue_reference_type) 75987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return DBuilder.createReferenceType(Tag, getOrCreateType(PointeeTy, Unit), 76087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Size, Align); 76187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar else 76287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return DBuilder.createPointerType(getOrCreateType(PointeeTy, Unit), Size, 76387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Align); 7647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 766b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::getOrCreateStructPtrType(StringRef Name, 767b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *&Cache) { 768b2d139257d8e6d546622627b6d0b48ef7953230fEric Christopher if (Cache) 769b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return Cache; 7701e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie Cache = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, Name, 7711e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie TheCU, getOrCreateMainFile(), 0); 7721e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 7731e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie Cache = DBuilder.createPointerType(Cache, Size); 7741e97c1e978cd71cb1fda14d7954045dd3da4924dDavid Blaikie return Cache; 775b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei} 776b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei 777b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateType(const BlockPointerType *Ty, 778b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit) { 7790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallVector<llvm::Metadata *, 8> EltTys; 7807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FType; 7817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize, FieldOffset; 7827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign; 783b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DINodeArray Elements; 7847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 7867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().UnsignedLongTy; 7877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "reserved", &FieldOffset)); 7887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "Size", &FieldOffset)); 7897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elements = DBuilder.getOrCreateArray(EltTys); 7917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.clear(); 7927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 793b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar unsigned Flags = llvm::DINode::FlagAppleBlock; 79487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned LineNo = 0; 7957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 796b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto *EltTy = 79787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DBuilder.createStructType(Unit, "__block_descriptor", nullptr, LineNo, 798b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar FieldOffset, 0, Flags, nullptr, Elements); 7997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 8017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 8027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 803b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto *DescTy = DBuilder.createPointerType(EltTy, Size); 8047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 8067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 8077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset)); 8087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().IntTy; 8097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset)); 8107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__reserved", &FieldOffset)); 811176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FType = CGM.getContext().getPointerType(Ty->getPointeeType()); 8127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__FuncPtr", &FieldOffset)); 8137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 8157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize = CGM.getContext().getTypeSize(Ty); 8167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldAlign = CGM.getContext().getTypeAlign(Ty); 81787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar EltTys.push_back(DBuilder.createMemberType(Unit, "__descriptor", nullptr, LineNo, 818b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar FieldSize, FieldAlign, FieldOffset, 819b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 0, DescTy)); 8207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset += FieldSize; 8227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Elements = DBuilder.getOrCreateArray(EltTys); 8237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 82487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // The __block_literal_generic structs are marked with a special 82587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // DW_AT_APPLE_BLOCK attribute and are an implementation detail only 82687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // the debugger needs to know about. To allow type uniquing, emit 82787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // them without a name or a location. 828b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar EltTy = 82987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DBuilder.createStructType(Unit, "", nullptr, LineNo, 830b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar FieldOffset, 0, Flags, nullptr, Elements); 8317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 83287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return DBuilder.createPointerType(EltTy, Size); 8337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 8347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 835b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateType(const TemplateSpecializationType *Ty, 836b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit) { 8376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(Ty->isTypeAlias()); 838b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *Src = getOrCreateType(Ty->getAliasedType(), Unit); 8396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 8406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SmallString<128> NS; 8416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::raw_svector_ostream OS(NS); 842176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Ty->getTemplateName().print(OS, CGM.getContext().getPrintingPolicy(), 843176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /*qualified*/ false); 8446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 8456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TemplateSpecializationType::PrintTemplateArgumentList( 8464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar OS, Ty->template_arguments(), 8476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CGM.getContext().getPrintingPolicy()); 8486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 849176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines TypeAliasDecl *AliasDecl = cast<TypeAliasTemplateDecl>( 850176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Ty->getTemplateName().getAsTemplateDecl())->getTemplatedDecl(); 8516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 8526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation Loc = AliasDecl->getLocation(); 85387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return DBuilder.createTypedef(Src, OS.str(), getOrCreateFile(Loc), 85487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getLineNumber(Loc), 85587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getDeclContextDescriptor(AliasDecl)); 8566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 8576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 858b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateType(const TypedefType *Ty, 859b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit) { 8607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We don't set size information, but do specify where the typedef was 8617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // declared. 862651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation Loc = Ty->getDecl()->getLocation(); 8636537f083555f9606c495d05c562878aa49bae987Eric Christopher 86458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar // Typedefs are derived from some other type. 86558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return DBuilder.createTypedef( 86658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar getOrCreateType(Ty->getDecl()->getUnderlyingType(), Unit), 86758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar Ty->getDecl()->getName(), getOrCreateFile(Loc), getLineNumber(Loc), 86887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getDeclContextDescriptor(Ty->getDecl())); 8697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 8707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic unsigned getDwarfCC(CallingConv CC) { 8724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar switch (CC) { 8734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case CC_C: 8744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Avoid emitting DW_AT_calling_convention if the C convention was used. 8754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return 0; 8764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 8774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case CC_X86StdCall: 8784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return llvm::dwarf::DW_CC_BORLAND_stdcall; 8794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case CC_X86FastCall: 8804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return llvm::dwarf::DW_CC_BORLAND_msfastcall; 8814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case CC_X86ThisCall: 8824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return llvm::dwarf::DW_CC_BORLAND_thiscall; 8834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case CC_X86VectorCall: 8844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return llvm::dwarf::DW_CC_LLVM_vectorcall; 8854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case CC_X86Pascal: 8864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return llvm::dwarf::DW_CC_BORLAND_pascal; 8874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 8884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // FIXME: Create new DW_CC_ codes for these calling conventions. 8894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case CC_X86_64Win64: 8904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case CC_X86_64SysV: 8914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case CC_AAPCS: 8924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case CC_AAPCS_VFP: 8934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case CC_IntelOclBicc: 8944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case CC_SpirFunction: 8954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case CC_OpenCLKernel: 8964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case CC_Swift: 8974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case CC_PreserveMost: 8984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case CC_PreserveAll: 8994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return 0; 9004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 9014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return 0; 9024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 9034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 904b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateType(const FunctionType *Ty, 905b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit) { 9060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallVector<llvm::Metadata *, 16> EltTys; 9077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add the result type at least. 909651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EltTys.push_back(getOrCreateType(Ty->getReturnType(), Unit)); 9107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Set up remainder of arguments if there is a prototype. 912651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // otherwise emit it as a variadic function. 9137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<FunctionNoProtoType>(Ty)) 9147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(DBuilder.createUnspecifiedParameter()); 9157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(Ty)) { 916651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (unsigned i = 0, e = FPT->getNumParams(); i != e; ++i) 917651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EltTys.push_back(getOrCreateType(FPT->getParamType(i), Unit)); 918651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (FPT->isVariadic()) 919651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EltTys.push_back(DBuilder.createUnspecifiedParameter()); 9207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 922b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DITypeRefArray EltTypeArray = DBuilder.getOrCreateTypeArray(EltTys); 9234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return DBuilder.createSubroutineType(EltTypeArray, 0, 9244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar getDwarfCC(Ty->getCallConv())); 9257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 9267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 927b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar/// Convert an AccessSpecifier into the corresponding DINode flag. 928176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// As an optimization, return 0 if the access specifier equals the 929176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// default for the containing type. 930176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstatic unsigned getAccessFlag(AccessSpecifier Access, const RecordDecl *RD) { 931176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines AccessSpecifier Default = clang::AS_none; 932176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (RD && RD->isClass()) 933176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Default = clang::AS_private; 934176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines else if (RD && (RD->isStruct() || RD->isUnion())) 935176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Default = clang::AS_public; 9367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 937176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Access == Default) 938176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return 0; 939176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 940176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines switch (Access) { 941176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case clang::AS_private: 942b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return llvm::DINode::FlagPrivate; 943176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case clang::AS_protected: 944b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return llvm::DINode::FlagProtected; 945176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case clang::AS_public: 946b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return llvm::DINode::FlagPublic; 947176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case clang::AS_none: 948176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return 0; 949176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 950176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm_unreachable("unexpected access enumerator"); 951176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 952176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 9534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarllvm::DIType *CGDebugInfo::createBitFieldType(const FieldDecl *BitFieldDecl, 9544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::DIScope *RecordTy, 9554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const RecordDecl *RD) { 9564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StringRef Name = BitFieldDecl->getName(); 9574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType Ty = BitFieldDecl->getType(); 9584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceLocation Loc = BitFieldDecl->getLocation(); 9594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::DIFile *VUnit = getOrCreateFile(Loc); 9604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::DIType *DebugType = getOrCreateType(Ty, VUnit); 9614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 9624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Get the location for the field. 9634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::DIFile *File = getOrCreateFile(Loc); 9644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned Line = getLineNumber(Loc); 9654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 9664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const CGBitFieldInfo &BitFieldInfo = 9674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CGM.getTypes().getCGRecordLayout(RD).getBitFieldInfo(BitFieldDecl); 9684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar uint64_t SizeInBits = BitFieldInfo.Size; 9694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(SizeInBits > 0 && "found named 0-width bitfield"); 9704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned AlignInBits = CGM.getContext().getTypeAlign(Ty); 9714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar uint64_t StorageOffsetInBits = 9724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CGM.getContext().toBits(BitFieldInfo.StorageOffset); 9734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar uint64_t OffsetInBits = StorageOffsetInBits + BitFieldInfo.Offset; 9744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned Flags = getAccessFlag(BitFieldDecl->getAccess(), RD); 9754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return DBuilder.createBitFieldMemberType( 9764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RecordTy, Name, File, Line, SizeInBits, AlignInBits, OffsetInBits, 9774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StorageOffsetInBits, Flags, DebugType); 9784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 9794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 9804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarllvm::DIType * 9814967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarCGDebugInfo::createFieldType(StringRef name, QualType type, SourceLocation loc, 9824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AccessSpecifier AS, uint64_t offsetInBits, 9834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::DIFile *tunit, llvm::DIScope *scope, 9844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const RecordDecl *RD) { 985b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *debugType = getOrCreateType(type, tunit); 9867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the location for the field. 988b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *file = getOrCreateFile(loc); 9897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned line = getLineNumber(loc); 9907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 991176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines uint64_t SizeInBits = 0; 992176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines unsigned AlignInBits = 0; 9937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!type->isIncompleteArrayType()) { 994176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines TypeInfo TI = CGM.getContext().getTypeInfo(type); 995176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SizeInBits = TI.Width; 996176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines AlignInBits = TI.Align; 9977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 999176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines unsigned flags = getAccessFlag(AS, RD); 1000176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return DBuilder.createMemberType(scope, name, file, line, SizeInBits, 1001176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines AlignInBits, offsetInBits, flags, debugType); 10027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10040e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid CGDebugInfo::CollectRecordLambdaFields( 10050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines const CXXRecordDecl *CXXDecl, SmallVectorImpl<llvm::Metadata *> &elements, 1006b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *RecordTy) { 10070395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // For C++11 Lambdas a Field will be the same as a Capture, but the Capture 10080395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // has the name and the location of the variable so we should iterate over 10090395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // both concurrently. 10100395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(CXXDecl); 10110395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher RecordDecl::field_iterator Field = CXXDecl->field_begin(); 10120395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher unsigned fieldno = 0; 10130395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher for (CXXRecordDecl::capture_const_iterator I = CXXDecl->captures_begin(), 1014176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines E = CXXDecl->captures_end(); 1015176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines I != E; ++I, ++Field, ++fieldno) { 10166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const LambdaCapture &C = *I; 10170395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (C.capturesVariable()) { 10184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceLocation Loc = C.getLocation(); 10194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(!Field->isBitField() && "lambdas don't have bitfield members!"); 10200395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher VarDecl *V = C.getCapturedVar(); 10210395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StringRef VName = V->getName(); 10224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::DIFile *VUnit = getOrCreateFile(Loc); 10234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::DIType *FieldType = createFieldType( 10244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar VName, Field->getType(), Loc, Field->getAccess(), 10254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar layout.getFieldOffset(fieldno), VUnit, RecordTy, CXXDecl); 10264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar elements.push_back(FieldType); 1027176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else if (C.capturesThis()) { 10280395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // TODO: Need to handle 'this' in some way by probably renaming the 10290395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // this of the lambda class and having a field member of 'this' or 10300395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // by using AT_object_pointer for the function and having that be 10310395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // used as 'this' for semantic references. 10320395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher FieldDecl *f = *Field; 1033b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *VUnit = getOrCreateFile(f->getLocation()); 10340395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher QualType type = f->getType(); 1035b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *fieldType = createFieldType( 10364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar "this", type, f->getLocation(), f->getAccess(), 1037176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines layout.getFieldOffset(fieldno), VUnit, RecordTy, CXXDecl); 10380395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 10390395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher elements.push_back(fieldType); 10400395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 10410395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 10420395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher} 10430395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 1044b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIDerivedType * 1045b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarCGDebugInfo::CreateRecordStaticField(const VarDecl *Var, llvm::DIType *RecordTy, 1046b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar const RecordDecl *RD) { 10470395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Create the descriptor for the static variable, with or without 10480395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // constant initializers. 1049176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Var = Var->getCanonicalDecl(); 1050b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *VUnit = getOrCreateFile(Var->getLocation()); 1051b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *VTy = getOrCreateType(Var->getType(), VUnit); 10520395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 10530395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher unsigned LineNumber = getLineNumber(Var->getLocation()); 10540395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StringRef VName = Var->getName(); 10556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::Constant *C = nullptr; 10560395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (Var->getInit()) { 10570395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const APValue *Value = Var->evaluateValue(); 1058a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie if (Value) { 1059a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie if (Value->isInt()) 1060a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie C = llvm::ConstantInt::get(CGM.getLLVMContext(), Value->getInt()); 1061a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie if (Value->isFloat()) 1062a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie C = llvm::ConstantFP::get(CGM.getLLVMContext(), Value->getFloat()); 1063a89701bb49601235b8dabafccf10ca4b2efed0e2David Blaikie } 10640395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 10650395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 1066176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines unsigned Flags = getAccessFlag(Var->getAccess(), RD); 1067b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIDerivedType *GV = DBuilder.createStaticMemberType( 1068cbcb030ab33d23c5f7e2e76e2e36843cb5295d50David Blaikie RecordTy, VName, VUnit, LineNumber, VTy, Flags, C); 10690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines StaticDataMemberCache[Var->getCanonicalDecl()].reset(GV); 1070cbcb030ab33d23c5f7e2e76e2e36843cb5295d50David Blaikie return GV; 10710395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher} 10720395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 1073176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid CGDebugInfo::CollectRecordNormalField( 1074b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar const FieldDecl *field, uint64_t OffsetInBits, llvm::DIFile *tunit, 1075b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SmallVectorImpl<llvm::Metadata *> &elements, llvm::DIType *RecordTy, 1076176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const RecordDecl *RD) { 10770395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher StringRef name = field->getName(); 10780395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher QualType type = field->getType(); 10790395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 10800395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Ignore unnamed fields unless they're anonymous structs/unions. 10810395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (name.empty() && !type->isRecordType()) 10820395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher return; 10830395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 10844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::DIType *FieldType; 10850395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (field->isBitField()) { 10864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FieldType = createBitFieldType(field, RecordTy, RD); 10874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else { 10884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FieldType = 10894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar createFieldType(name, type, field->getLocation(), field->getAccess(), 10904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar OffsetInBits, tunit, RecordTy, RD); 10910395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher } 10920395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 10934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar elements.push_back(FieldType); 10940395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher} 10950395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 10960e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid CGDebugInfo::CollectRecordFields( 1097b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar const RecordDecl *record, llvm::DIFile *tunit, 10980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallVectorImpl<llvm::Metadata *> &elements, 1099b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DICompositeType *RecordTy) { 11007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(record); 11017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11020395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher if (CXXDecl && CXXDecl->isLambda()) 11030395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher CollectRecordLambdaFields(CXXDecl, elements, RecordTy); 11040395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher else { 11050395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(record); 11060395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 11070395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Field number for non-static fields. 1108fd5ac0d75abd6ead8dd39bf526b34eeaff81cef6Eric Christopher unsigned fieldNo = 0; 11090395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher 11100395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Static and non-static members should appear in the same order as 11110395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // the corresponding declarations in the source program. 1112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *I : record->decls()) 1113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (const auto *V = dyn_cast<VarDecl>(I)) { 11144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (V->hasAttr<NoDebugAttr>()) 11154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar continue; 11165e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie // Reuse the existing static member declaration if one exists 11170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines auto MI = StaticDataMemberCache.find(V->getCanonicalDecl()); 11185e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie if (MI != StaticDataMemberCache.end()) { 11195e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie assert(MI->second && 11205e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie "Static data member declaration should still exist"); 112187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar elements.push_back(MI->second); 1122176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else { 1123176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines auto Field = CreateRecordStaticField(V, RecordTy, record); 1124176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines elements.push_back(Field); 1125176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (const auto *field = dyn_cast<FieldDecl>(I)) { 1127176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CollectRecordNormalField(field, layout.getFieldOffset(fieldNo), tunit, 1128176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines elements, RecordTy, record); 11297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11300395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Bump field number for next field. 11310395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher ++fieldNo; 11327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 11357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1136b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DISubroutineType * 11377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::getOrCreateMethodType(const CXXMethodDecl *Method, 1138b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit) { 11399c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie const FunctionProtoType *Func = Method->getType()->getAs<FunctionProtoType>(); 114067f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie if (Method->isStatic()) 1141b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return cast_or_null<llvm::DISubroutineType>( 114258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar getOrCreateType(QualType(Func, 0), Unit)); 11439c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie return getOrCreateInstanceMethodType(Method->getThisType(CGM.getContext()), 11449c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie Func, Unit); 11459c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie} 114667f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie 1147b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DISubroutineType *CGDebugInfo::getOrCreateInstanceMethodType( 1148b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar QualType ThisPtr, const FunctionProtoType *Func, llvm::DIFile *Unit) { 11497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add "this" pointer. 1150b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DITypeRefArray Args( 1151b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar cast<llvm::DISubroutineType>(getOrCreateType(QualType(Func, 0), Unit)) 115258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar ->getTypeArray()); 115358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar assert(Args.size() && "Invalid number of arguments!"); 11547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallVector<llvm::Metadata *, 16> Elts; 11567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // First element is always return type. For 'void' functions it is NULL. 115858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar Elts.push_back(Args[0]); 11597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 116067f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // "this" pointer is always first argument. 11619c78f9bddc42dbdeb05a7183b4770d33b0bda7d3David Blaikie const CXXRecordDecl *RD = ThisPtr->getPointeeCXXRecordDecl(); 116267f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie if (isa<ClassTemplateSpecializationDecl>(RD)) { 116367f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // Create pointer type directly in this case. 116467f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie const PointerType *ThisPtrTy = cast<PointerType>(ThisPtr); 116567f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie QualType PointeeTy = ThisPtrTy->getPointeeType(); 116667f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie unsigned AS = CGM.getContext().getTargetAddressSpace(PointeeTy); 116764aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall uint64_t Size = CGM.getTarget().getPointerWidth(AS); 116867f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie uint64_t Align = CGM.getContext().getTypeAlign(ThisPtrTy); 1169b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *PointeeType = getOrCreateType(PointeeTy, Unit); 1170b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *ThisPtrType = 1171176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DBuilder.createPointerType(PointeeType, Size, Align); 11720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines TypeCache[ThisPtr.getAsOpaquePtr()].reset(ThisPtrType); 117367f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // TODO: This and the artificial type below are misleading, the 117467f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // types aren't artificial the argument is, but the current 117567f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie // metadata doesn't represent that. 117667f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType); 117767f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie Elts.push_back(ThisPtrType); 117867f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie } else { 1179b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *ThisPtrType = getOrCreateType(ThisPtr, Unit); 11800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines TypeCache[ThisPtr.getAsOpaquePtr()].reset(ThisPtrType); 118167f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType); 118267f8b5ef212eee155f69b6f90968fe18c8052122David Blaikie Elts.push_back(ThisPtrType); 11837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Copy rest of the arguments. 118658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar for (unsigned i = 1, e = Args.size(); i != e; ++i) 118758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar Elts.push_back(Args[i]); 11887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1189b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DITypeRefArray EltTypeArray = DBuilder.getOrCreateTypeArray(Elts); 11907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned Flags = 0; 1192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Func->getExtProtoInfo().RefQualifier == RQ_LValue) 1193b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Flags |= llvm::DINode::FlagLValueReference; 1194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Func->getExtProtoInfo().RefQualifier == RQ_RValue) 1195b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Flags |= llvm::DINode::FlagRValueReference; 1196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 11974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return DBuilder.createSubroutineType(EltTypeArray, Flags, 11984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar getDwarfCC(Func->getCallConv())); 11997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 12007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12016537f083555f9606c495d05c562878aa49bae987Eric Christopher/// isFunctionLocalClass - Return true if CXXRecordDecl is defined 12027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// inside a function. 12037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool isFunctionLocalClass(const CXXRecordDecl *RD) { 12047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXRecordDecl *NRD = dyn_cast<CXXRecordDecl>(RD->getDeclContext())) 12057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return isFunctionLocalClass(NRD); 12067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<FunctionDecl>(RD->getDeclContext())) 12077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 12087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 12097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 12107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1211b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DISubprogram *CGDebugInfo::CreateCXXMemberFunction( 1212b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar const CXXMethodDecl *Method, llvm::DIFile *Unit, llvm::DIType *RecordTy) { 12136537f083555f9606c495d05c562878aa49bae987Eric Christopher bool IsCtorOrDtor = 1214176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines isa<CXXConstructorDecl>(Method) || isa<CXXDestructorDecl>(Method); 12156537f083555f9606c495d05c562878aa49bae987Eric Christopher 12167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef MethodName = getFunctionName(Method); 1217b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DISubroutineType *MethodTy = getOrCreateMethodType(Method, Unit); 12187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Since a single ctor/dtor corresponds to multiple functions, it doesn't 12207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // make sense to give a single ctor/dtor a linkage name. 12217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef MethodLinkageName; 12224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // FIXME: 'isFunctionLocalClass' seems like an arbitrary/unintentional 12234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // property to use here. It may've been intended to model "is non-external 12244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // type" but misses cases of non-function-local but non-external classes such 12254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // as those in anonymous namespaces as well as the reverse - external types 12264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // that are function local, such as those in (non-local) inline functions. 12277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!IsCtorOrDtor && !isFunctionLocalClass(Method->getParent())) 12287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MethodLinkageName = CGM.getMangledName(Method); 12297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the location for the method. 1231b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *MethodDefUnit = nullptr; 1232fc946271e008544b518321fdecc77ca076663c12David Blaikie unsigned MethodLine = 0; 1233fc946271e008544b518321fdecc77ca076663c12David Blaikie if (!Method->isImplicit()) { 1234fc946271e008544b518321fdecc77ca076663c12David Blaikie MethodDefUnit = getOrCreateFile(Method->getLocation()); 1235fc946271e008544b518321fdecc77ca076663c12David Blaikie MethodLine = getLineNumber(Method->getLocation()); 1236fc946271e008544b518321fdecc77ca076663c12David Blaikie } 12377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Collect virtual method info. 1239b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *ContainingType = nullptr; 12406537f083555f9606c495d05c562878aa49bae987Eric Christopher unsigned Virtuality = 0; 12417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned VIndex = 0; 12424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned Flags = 0; 12434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar int ThisAdjustment = 0; 12446537f083555f9606c495d05c562878aa49bae987Eric Christopher 12457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->isVirtual()) { 12467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->isPure()) 12477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Virtuality = llvm::dwarf::DW_VIRTUALITY_pure_virtual; 12487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 12497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Virtuality = llvm::dwarf::DW_VIRTUALITY_virtual; 12506537f083555f9606c495d05c562878aa49bae987Eric Christopher 12514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (CGM.getTarget().getCXXABI().isItaniumFamily()) { 12524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // It doesn't make sense to give a virtual destructor a vtable index, 12534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // since a single destructor has two entries in the vtable. 12544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!isa<CXXDestructorDecl>(Method)) 12554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar VIndex = CGM.getItaniumVTableContext().getMethodVTableIndex(Method); 12564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else { 12574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Emit MS ABI vftable information. There is only one entry for the 12584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // deleting dtor. 12594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const auto *DD = dyn_cast<CXXDestructorDecl>(Method); 12604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar GlobalDecl GD = DD ? GlobalDecl(DD, Dtor_Deleting) : GlobalDecl(Method); 12614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar MicrosoftVTableContext::MethodVFTableLocation ML = 12624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CGM.getMicrosoftVTableContext().getMethodVFTableLocation(GD); 12634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar VIndex = ML.Index; 12644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 12654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CodeView only records the vftable offset in the class that introduces 12664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // the virtual method. This is possible because, unlike Itanium, the MS 12674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // C++ ABI does not include all virtual methods from non-primary bases in 12684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // the vtable for the most derived class. For example, if C inherits from 12694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // A and B, C's primary vftable will not include B's virtual methods. 12704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Method->begin_overridden_methods() == Method->end_overridden_methods()) 12714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Flags |= llvm::DINode::FlagIntroducedVirtual; 12724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 12734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // The 'this' adjustment accounts for both the virtual and non-virtual 12744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // portions of the adjustment. Presumably the debugger only uses it when 12754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // it knows the dynamic type of an object. 12764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ThisAdjustment = CGM.getCXXABI() 12774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .getVirtualFunctionPrologueThisAdjustment(GD) 12784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar .getQuantity(); 12794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 12807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContainingType = RecordTy; 12817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->isImplicit()) 1284b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Flags |= llvm::DINode::FlagArtificial; 1285176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Flags |= getAccessFlag(Method->getAccess(), Method->getParent()); 12867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXConstructorDecl *CXXC = dyn_cast<CXXConstructorDecl>(Method)) { 12877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXC->isExplicit()) 1288b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Flags |= llvm::DINode::FlagExplicit; 12896537f083555f9606c495d05c562878aa49bae987Eric Christopher } else if (const CXXConversionDecl *CXXC = 1290176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines dyn_cast<CXXConversionDecl>(Method)) { 12917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXC->isExplicit()) 1292b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Flags |= llvm::DINode::FlagExplicit; 12937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Method->hasPrototype()) 1295b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Flags |= llvm::DINode::FlagPrototyped; 1296651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Method->getRefQualifier() == RQ_LValue) 1297b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Flags |= llvm::DINode::FlagLValueReference; 1298651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Method->getRefQualifier() == RQ_RValue) 1299b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Flags |= llvm::DINode::FlagRValueReference; 13007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1301b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DINodeArray TParamsArray = CollectFunctionTemplateParams(Method, Unit); 1302b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DISubprogram *SP = DBuilder.createMethod( 1303176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RecordTy, MethodName, MethodLinkageName, MethodDefUnit, MethodLine, 13044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar MethodTy, /*isLocalToUnit=*/false, /*isDefinition=*/false, Virtuality, 13054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar VIndex, ThisAdjustment, ContainingType, Flags, CGM.getLangOpts().Optimize, 13064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TParamsArray.get()); 13076537f083555f9606c495d05c562878aa49bae987Eric Christopher 13080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SPCache[Method->getCanonicalDecl()].reset(SP); 13097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SP; 13117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1313176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid CGDebugInfo::CollectCXXMemberFunctions( 1314b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar const CXXRecordDecl *RD, llvm::DIFile *Unit, 1315b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SmallVectorImpl<llvm::Metadata *> &EltTys, llvm::DIType *RecordTy) { 13167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Since we want more than just the individual member decls if we 13187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // have templated functions iterate over every declaration to gather 13197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the functions. 1320176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (const auto *I : RD->decls()) { 1321176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const auto *Method = dyn_cast<CXXMethodDecl>(I); 1322176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // If the member is implicit, don't add it to the member list. This avoids 1323176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // the member being added to type units by LLVM, while still allowing it 1324176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // to be emitted into the type declaration/reference inside the compile 1325176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // unit. 132687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Ditto 'nodebug' methods, for consistency with CodeGenFunction.cpp. 1327176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // FIXME: Handle Using(Shadow?)Decls here to create 1328176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // DW_TAG_imported_declarations inside the class for base decls brought into 1329176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // derived classes. GDB doesn't seem to notice/leverage these when I tried 1330176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // it, so I'm not rushing to fix this. (GCC seems to produce them, if 1331176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // referenced) 133287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!Method || Method->isImplicit() || Method->hasAttr<NoDebugAttr>()) 1333176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines continue; 1334176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1335176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Method->getType()->getAs<FunctionProtoType>()->getContainedAutoType()) 1336176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines continue; 1337176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1338176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Reuse the existing member function declaration if it exists. 1339176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // It may be associated with the declaration of the type & should be 1340176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // reused as we're building the definition. 1341176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // 1342176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // This situation can arise in the vtable-based debug info reduction where 1343176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // implicit members are emitted in a non-vtable TU. 1344176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines auto MI = SPCache.find(Method->getCanonicalDecl()); 1345176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines EltTys.push_back(MI == SPCache.end() 1346176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ? CreateCXXMemberFunction(Method, Unit, RecordTy) 13470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines : static_cast<llvm::Metadata *>(MI->second)); 13487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13496537f083555f9606c495d05c562878aa49bae987Eric Christopher} 13507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1351b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarvoid CGDebugInfo::CollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile *Unit, 13520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallVectorImpl<llvm::Metadata *> &EltTys, 1353b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *RecordTy) { 13547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 1355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &BI : RD->bases()) { 13567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned BFlags = 0; 13577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t BaseOffset; 13586537f083555f9606c495d05c562878aa49bae987Eric Christopher 13597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *Base = 1360176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines cast<CXXRecordDecl>(BI.getType()->getAs<RecordType>()->getDecl()); 13616537f083555f9606c495d05c562878aa49bae987Eric Christopher 1362651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (BI.isVirtual()) { 1363176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (CGM.getTarget().getCXXABI().isItaniumFamily()) { 1364176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // virtual base offset offset is -ve. The code generator emits dwarf 1365176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // expression where it expects +ve number. 1366176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines BaseOffset = 0 - CGM.getItaniumVTableContext() 1367176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines .getVirtualBaseOffsetOffset(RD, Base) 1368176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines .getQuantity(); 1369176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else { 1370176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // In the MS ABI, store the vbtable offset, which is analogous to the 1371176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // vbase offset offset in Itanium. 1372176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines BaseOffset = 1373176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 4 * CGM.getMicrosoftVTableContext().getVBTableIndex(RD, Base); 1374176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1375b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar BFlags = llvm::DINode::FlagVirtual; 13767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else 13777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BaseOffset = CGM.getContext().toBits(RL.getBaseClassOffset(Base)); 13787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Inconsistent units for BaseOffset. It is in bytes when 13797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // BI->isVirtual() and bits when not. 13806537f083555f9606c495d05c562878aa49bae987Eric Christopher 1381176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines BFlags |= getAccessFlag(BI.getAccessSpecifier(), RD); 1382b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *DTy = DBuilder.createInheritance( 1383176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RecordTy, getOrCreateType(BI.getType(), Unit), BaseOffset, BFlags); 13847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(DTy); 13857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1388b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DINodeArray 1389176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesCGDebugInfo::CollectTemplateParams(const TemplateParameterList *TPList, 1390176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ArrayRef<TemplateArgument> TAList, 1391b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit) { 13920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallVector<llvm::Metadata *, 16> TemplateParams; 13937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0, e = TAList.size(); i != e; ++i) { 13947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgument &TA = TAList[i]; 139535178dc09d97bb2e0612813def09833866e3ad82David Blaikie StringRef Name; 139635178dc09d97bb2e0612813def09833866e3ad82David Blaikie if (TPList) 139735178dc09d97bb2e0612813def09833866e3ad82David Blaikie Name = TPList->getParam(i)->getName(); 13989dfd24324c079b564dda936c6ae46898b82121e2David Blaikie switch (TA.getKind()) { 13999dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Type: { 1400b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *TTy = getOrCreateType(TA.getAsType(), Unit); 1401b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar TemplateParams.push_back( 1402b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DBuilder.createTemplateTypeParameter(TheCU, Name, TTy)); 14039dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 14049dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Integral: { 1405b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *TTy = getOrCreateType(TA.getIntegralType(), Unit); 1406b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar TemplateParams.push_back(DBuilder.createTemplateValueParameter( 1407b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar TheCU, Name, TTy, 1408b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::ConstantInt::get(CGM.getLLVMContext(), TA.getAsIntegral()))); 14099dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 14109dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Declaration: { 14119dfd24324c079b564dda936c6ae46898b82121e2David Blaikie const ValueDecl *D = TA.getAsDecl(); 1412176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines QualType T = TA.getParamTypeForDecl().getDesugaredType(CGM.getContext()); 1413b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *TTy = getOrCreateType(T, Unit); 14140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines llvm::Constant *V = nullptr; 1415176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const CXXMethodDecl *MD; 14169dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Variable pointer template parameters have a value that is the address 14179dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // of the variable. 1418176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (const auto *VD = dyn_cast<VarDecl>(D)) 14199dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.GetAddrOfGlobalVar(VD); 14209dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Member function pointers have special support for building them, though 14219dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // this is currently unsupported in LLVM CodeGen. 1422176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines else if ((MD = dyn_cast<CXXMethodDecl>(D)) && MD->isInstance()) 142387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar V = CGM.getCXXABI().EmitMemberFunctionPointer(MD); 1424176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines else if (const auto *FD = dyn_cast<FunctionDecl>(D)) 1425f8aa155e40bc98844f46ecbfdbe430696c36ce24David Blaikie V = CGM.GetAddrOfFunction(FD); 14269dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Member data pointers have special handling too to compute the fixed 14279dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // offset within the object. 1428176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines else if (const auto *MPT = dyn_cast<MemberPointerType>(T.getTypePtr())) { 14299dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // These five lines (& possibly the above member function pointer 14309dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // handling) might be able to be refactored to use similar code in 14319dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // CodeGenModule::getMemberPointerConstant 14329dfd24324c079b564dda936c6ae46898b82121e2David Blaikie uint64_t fieldOffset = CGM.getContext().getFieldOffset(D); 14339dfd24324c079b564dda936c6ae46898b82121e2David Blaikie CharUnits chars = 1434176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CGM.getContext().toCharUnitsFromBits((int64_t)fieldOffset); 1435176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines V = CGM.getCXXABI().EmitMemberDataPointer(MPT, chars); 14369dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } 1437b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar TemplateParams.push_back(DBuilder.createTemplateValueParameter( 1438b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar TheCU, Name, TTy, 1439b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar cast_or_null<llvm::Constant>(V->stripPointerCasts()))); 14409dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 14419dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::NullPtr: { 14429dfd24324c079b564dda936c6ae46898b82121e2David Blaikie QualType T = TA.getNullPtrType(); 1443b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *TTy = getOrCreateType(T, Unit); 14440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines llvm::Constant *V = nullptr; 14459dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // Special case member data pointer null values since they're actually -1 14469dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // instead of zero. 14479dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (const MemberPointerType *MPT = 14489dfd24324c079b564dda936c6ae46898b82121e2David Blaikie dyn_cast<MemberPointerType>(T.getTypePtr())) 14499dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // But treat member function pointers as simple zero integers because 14509dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // it's easier than having a special case in LLVM's CodeGen. If LLVM 14519dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // CodeGen grows handling for values of non-null member function 14529dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // pointers then perhaps we could remove this special case and rely on 14539dfd24324c079b564dda936c6ae46898b82121e2David Blaikie // EmitNullMemberPointer for member function pointers. 14549dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (MPT->isMemberDataPointer()) 14559dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = CGM.getCXXABI().EmitNullMemberPointer(MPT); 14569dfd24324c079b564dda936c6ae46898b82121e2David Blaikie if (!V) 14579dfd24324c079b564dda936c6ae46898b82121e2David Blaikie V = llvm::ConstantInt::get(CGM.Int8Ty, 0); 1458b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar TemplateParams.push_back(DBuilder.createTemplateValueParameter( 1459b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar TheCU, Name, TTy, cast<llvm::Constant>(V))); 14609dfd24324c079b564dda936c6ae46898b82121e2David Blaikie } break; 1461b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar case TemplateArgument::Template: 1462b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar TemplateParams.push_back(DBuilder.createTemplateTemplateParameter( 1463b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar TheCU, Name, nullptr, 1464b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar TA.getAsTemplate().getAsTemplateDecl()->getQualifiedNameAsString())); 1465b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar break; 1466b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar case TemplateArgument::Pack: 1467b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar TemplateParams.push_back(DBuilder.createTemplateParameterPack( 1468b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar TheCU, Name, nullptr, 1469b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar CollectTemplateParams(nullptr, TA.getPackAsArray(), Unit))); 1470b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar break; 147187b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer case TemplateArgument::Expression: { 147287b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer const Expr *E = TA.getAsExpr(); 147387b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer QualType T = E->getType(); 1474176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (E->isGLValue()) 1475176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines T = CGM.getContext().getLValueReferenceType(T); 14760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines llvm::Constant *V = CGM.EmitConstantExpr(E, T); 147787b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer assert(V && "Expression in template argument isn't constant"); 1478b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *TTy = getOrCreateType(T, Unit); 1479b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar TemplateParams.push_back(DBuilder.createTemplateValueParameter( 1480b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar TheCU, Name, TTy, cast<llvm::Constant>(V->stripPointerCasts()))); 148187b1f6d1901036602bcbccaeea341d175e7f900dDavid Majnemer } break; 1482e8065128777e13322aa2b4de86a362326e0c7686David Blaikie // And the following should never occur: 14839dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::TemplateExpansion: 14849dfd24324c079b564dda936c6ae46898b82121e2David Blaikie case TemplateArgument::Null: 14859dfd24324c079b564dda936c6ae46898b82121e2David Blaikie llvm_unreachable( 14869dfd24324c079b564dda936c6ae46898b82121e2David Blaikie "These argument types shouldn't exist in concrete types"); 14877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 14887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 14897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.getOrCreateArray(TemplateParams); 14907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1492b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DINodeArray 1493b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarCGDebugInfo::CollectFunctionTemplateParams(const FunctionDecl *FD, 1494b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit) { 14957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FD->getTemplatedKind() == 14967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionDecl::TK_FunctionTemplateSpecialization) { 1497176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const TemplateParameterList *TList = FD->getTemplateSpecializationInfo() 1498176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ->getTemplate() 1499176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ->getTemplateParameters(); 150035178dc09d97bb2e0612813def09833866e3ad82David Blaikie return CollectTemplateParams( 150135178dc09d97bb2e0612813def09833866e3ad82David Blaikie TList, FD->getTemplateSpecializationArgs()->asArray(), Unit); 15027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1503b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return llvm::DINodeArray(); 15047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 15057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1506b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DINodeArray CGDebugInfo::CollectCXXTemplateParams( 1507b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar const ClassTemplateSpecializationDecl *TSpecial, llvm::DIFile *Unit) { 15086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Always get the full list of parameters, not just the ones from 15096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // the specialization. 15106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TemplateParameterList *TPList = 1511176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines TSpecial->getSpecializedTemplate()->getTemplateParameters(); 15126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const TemplateArgumentList &TAList = TSpecial->getTemplateArgs(); 151335178dc09d97bb2e0612813def09833866e3ad82David Blaikie return CollectTemplateParams(TPList, TAList.asArray(), Unit); 15147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 15157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1516b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::getOrCreateVTablePtrType(llvm::DIFile *Unit) { 151758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (VTablePtrType) 15187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VTablePtrType; 15197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTContext &Context = CGM.getContext(); 15217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /* Function type */ 15230e2c34f92f00628d48968dfea096d36381f494cbStephen Hines llvm::Metadata *STy = getOrCreateType(Context.IntTy, Unit); 1524b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DITypeRefArray SElements = DBuilder.getOrCreateTypeArray(STy); 152587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DIType *SubTy = DBuilder.createSubroutineType(SElements); 15267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Size = Context.getTypeSize(Context.VoidPtrTy); 1527b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *vtbl_ptr_type = 1528176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DBuilder.createPointerType(SubTy, Size, 0, "__vtbl_ptr_type"); 15297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTablePtrType = DBuilder.createPointerType(vtbl_ptr_type, Size); 15307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VTablePtrType; 15317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 15327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef CGDebugInfo::getVTableName(const CXXRecordDecl *RD) { 15348495379bd6127dac2c39a6dd7840d95bb3a9aaa3Benjamin Kramer // Copy the gdb compatible name on the side and use its reference. 15358495379bd6127dac2c39a6dd7840d95bb3a9aaa3Benjamin Kramer return internString("_vptr$", RD->getNameAsString()); 15367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 15377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1538b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarvoid CGDebugInfo::CollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile *Unit, 15390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallVectorImpl<llvm::Metadata *> &EltTys) { 15407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 15417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there is a primary base then it will hold vtable info. 15437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RL.getPrimaryBase()) 15447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 15457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this class is not dynamic then there is not any vtable info to collect. 15477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!RD->isDynamicClass()) 15487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 15497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy); 1551b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *VPTR = DBuilder.createMemberType( 1552176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Unit, getVTableName(RD), Unit, 0, Size, 0, 0, 1553b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DINode::FlagArtificial, getOrCreateVTablePtrType(Unit)); 15547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(VPTR); 15557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 15567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1557b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::getOrCreateRecordType(QualType RTy, 1558b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation Loc) { 15594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(DebugKind >= codegenoptions::LimitedDebugInfo); 1560b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *T = getOrCreateType(RTy, getOrCreateFile(Loc)); 15617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 15627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 15637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1564b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::getOrCreateInterfaceType(QualType D, 1565b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation Loc) { 156687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return getOrCreateStandaloneType(D, Loc); 156787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 156887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 156987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarllvm::DIType *CGDebugInfo::getOrCreateStandaloneType(QualType D, 157087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation Loc) { 15714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(DebugKind >= codegenoptions::LimitedDebugInfo); 157287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(!D.isNull() && "null type"); 1573b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *T = getOrCreateType(D, getOrCreateFile(Loc)); 157487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(T && "could not create debug info for type"); 157587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 1576ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl RetainedTypes.push_back(D.getAsOpaquePtr()); 15777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 15787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 15797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid CGDebugInfo::completeType(const EnumDecl *ED) { 15814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (DebugKind <= codegenoptions::DebugLineTablesOnly) 15826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return; 15836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines QualType Ty = CGM.getContext().getEnumType(ED); 1584176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines void *TyPtr = Ty.getAsOpaquePtr(); 15856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto I = TypeCache.find(TyPtr); 1586b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (I == TypeCache.end() || !cast<llvm::DIType>(I->second)->isForwardDecl()) 15876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return; 1588b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *Res = CreateTypeDefinition(Ty->castAs<EnumType>()); 158958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar assert(!Res->isForwardDecl()); 15900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines TypeCache[TyPtr].reset(Res); 15916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 15926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1593278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikievoid CGDebugInfo::completeType(const RecordDecl *RD) { 15944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (DebugKind > codegenoptions::LimitedDebugInfo || 1595278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie !CGM.getLangOpts().CPlusPlus) 1596278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie completeRequiredType(RD); 1597278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie} 1598278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie 1599278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikievoid CGDebugInfo::completeRequiredType(const RecordDecl *RD) { 16004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (DebugKind <= codegenoptions::DebugLineTablesOnly) 1601651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return; 1602651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 16035434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie if (const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD)) 16045434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie if (CXXDecl->isDynamicClass()) 16055434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie return; 16065434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie 160787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (DebugTypeExtRefs && RD->isFromASTFile()) 160887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return; 160987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 1610278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie QualType Ty = CGM.getContext().getRecordType(RD); 1611b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *T = getTypeOrNull(Ty); 161258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (T && T->isForwardDecl()) 16135434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie completeClassData(RD); 16145434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie} 16155434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie 16165434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikievoid CGDebugInfo::completeClassData(const RecordDecl *RD) { 16174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (DebugKind <= codegenoptions::DebugLineTablesOnly) 161890e5523e4cd2230b86c6921b34affdcd35e0c4c0Michael Gottesman return; 16195434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie QualType Ty = CGM.getContext().getRecordType(RD); 1620176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines void *TyPtr = Ty.getAsOpaquePtr(); 16216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto I = TypeCache.find(TyPtr); 1622b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (I != TypeCache.end() && !cast<llvm::DIType>(I->second)->isForwardDecl()) 1623278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie return; 1624b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *Res = CreateTypeDefinition(Ty->castAs<RecordType>()); 162558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar assert(!Res->isForwardDecl()); 16260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines TypeCache[TyPtr].reset(Res); 1627278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie} 1628278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie 1629651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic bool hasExplicitMemberDefinition(CXXRecordDecl::method_iterator I, 1630651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CXXRecordDecl::method_iterator End) { 1631651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (; I != End; ++I) 1632651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (FunctionDecl *Tmpl = I->getInstantiatedFromMemberFunction()) 1633651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Tmpl->isImplicit() && Tmpl->isThisDeclarationADefinition() && 1634651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines !I->getMemberSpecializationInfo()->isExplicitSpecialization()) 1635651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 1636651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 1637651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1638651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 16394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// Does a type definition exist in an imported clang module? 16404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic bool isDefinedInClangModule(const RecordDecl *RD) { 16414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!RD || !RD->isFromASTFile()) 16424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return false; 16434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!RD->isExternallyVisible() && RD->getName().empty()) 16444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return false; 16454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD)) { 16464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(CXXDecl->isCompleteDefinition() && "incomplete record definition"); 16474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (CXXDecl->getTemplateSpecializationKind() != TSK_Undeclared) 16484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Make sure the instantiation is actually in a module. 16494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (CXXDecl->field_begin() != CXXDecl->field_end()) 16504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return CXXDecl->field_begin()->isFromASTFile(); 16514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 16524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 16534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return true; 16544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 16554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 16564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic bool shouldOmitDefinition(codegenoptions::DebugInfoKind DebugKind, 16574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool DebugTypeExtRefs, const RecordDecl *RD, 1658651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const LangOptions &LangOpts) { 16594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (DebugTypeExtRefs && isDefinedInClangModule(RD->getDefinition())) 16604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return true; 166187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 16624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (DebugKind > codegenoptions::LimitedDebugInfo) 1663651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 1664651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1665651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!LangOpts.CPlusPlus) 1666651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 1667651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1668651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!RD->isCompleteDefinitionRequired()) 1669651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 1670651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1671651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD); 1672651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1673651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!CXXDecl) 1674651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 1675651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1676651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (CXXDecl->hasDefinition() && CXXDecl->isDynamicClass()) 1677651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 1678651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1679651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TemplateSpecializationKind Spec = TSK_Undeclared; 1680651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (const ClassTemplateSpecializationDecl *SD = 1681651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines dyn_cast<ClassTemplateSpecializationDecl>(RD)) 1682651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Spec = SD->getSpecializationKind(); 1683651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1684651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Spec == TSK_ExplicitInstantiationDeclaration && 1685651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines hasExplicitMemberDefinition(CXXDecl->method_begin(), 1686651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CXXDecl->method_end())) 1687651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 1688651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1689651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 1690651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1691651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1692b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateType(const RecordType *Ty) { 16937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordDecl *RD = Ty->getDecl(); 1694b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *T = cast_or_null<llvm::DIType>(getTypeOrNull(QualType(Ty, 0))); 169587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (T || shouldOmitDefinition(DebugKind, DebugTypeExtRefs, RD, 169687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CGM.getLangOpts())) { 169774341d8fd49db382e83008ecea5c0d8ff9d8b6cbDavid Blaikie if (!T) 169887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar T = getOrCreateRecordFwdDecl(Ty, getDeclContextDescriptor(RD)); 169974341d8fd49db382e83008ecea5c0d8ff9d8b6cbDavid Blaikie return T; 17005f6e2f4010e1ebbc07231eff7c92e474e8912350David Blaikie } 17017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1702278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie return CreateTypeDefinition(Ty); 1703278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie} 1704278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie 1705b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateTypeDefinition(const RecordType *Ty) { 1706278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie RecordDecl *RD = Ty->getDecl(); 1707278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie 17087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the record type for the debug info. 1709b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *DefUnit = getOrCreateFile(RD->getLocation()); 17107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Records and classes and unions can all be recursive. To handle them, we 17127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // first generate a debug descriptor for the struct as a forward declaration. 17137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Then (if it is a definition) we go through and get debug info for all of 17147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // its members. Finally, we create a descriptor for the complete type (which 17157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // may refer to the forward decl if the struct is recursive) and replace all 17167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // uses of the forward declaration with the final definition. 171787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DICompositeType *FwdDecl = getOrCreateLimitedType(Ty, DefUnit); 17187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines const RecordDecl *D = RD->getDefinition(); 17200e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (!D || !D->isCompleteDefinition()) 17217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return FwdDecl; 17227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1723498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie if (const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD)) 1724498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie CollectContainingType(CXXDecl, FwdDecl); 1725498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie 17267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Push the struct on region stack. 17270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines LexicalBlockStack.emplace_back(&*FwdDecl); 17280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines RegionMap[Ty->getDecl()].reset(FwdDecl); 17297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Convert all the elements. 17310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallVector<llvm::Metadata *, 16> EltTys; 17325434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie // what about nested types? 17337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Note: The split of CXXDecl information here is intentional, the 17357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // gdb tests will depend on a certain ordering at printout. The debug 17367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // information offsets are still correct if we merge them all together 17377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // though. 17387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD); 17397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXDecl) { 17407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectCXXBases(CXXDecl, DefUnit, EltTys, FwdDecl); 17417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectVTableInfo(CXXDecl, DefUnit, EltTys); 17427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17440395de36004a718e265cc256b1bbee3bd3a791dcEric Christopher // Collect data fields (including static variables and any initializers). 17457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectRecordFields(RD, DefUnit, EltTys, FwdDecl); 1746d6b52974a74b1819f62a034a6a4939e8d00a04bdEric Christopher if (CXXDecl) 17477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CollectCXXMemberFunctions(CXXDecl, DefUnit, EltTys, FwdDecl); 17487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 17507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RegionMap.erase(Ty->getDecl()); 17517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1752b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys); 17530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DBuilder.replaceArrays(FwdDecl, Elements); 17540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 17550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (FwdDecl->isTemporary()) 175658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar FwdDecl = 1757b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::MDNode::replaceWithPermanent(llvm::TempDICompositeType(FwdDecl)); 1758bd0152fb251e84c6f335c66322b83a9af09fed0cNico Weber 17590e2c34f92f00628d48968dfea096d36381f494cbStephen Hines RegionMap[Ty->getDecl()].reset(FwdDecl); 1760f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher return FwdDecl; 17617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1763b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateType(const ObjCObjectType *Ty, 1764b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit) { 17657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore protocols. 17667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(Ty->getBaseType(), Unit); 17677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17695ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl/// \return true if Getter has the default name for the property PD. 17705ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantlstatic bool hasDefaultGetterName(const ObjCPropertyDecl *PD, 17715ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl const ObjCMethodDecl *Getter) { 17725ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl assert(PD); 17735ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl if (!Getter) 17745ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl return true; 17755ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 17765ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl assert(Getter->getDeclName().isObjCZeroArgSelector()); 17775ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl return PD->getName() == 1778176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Getter->getDeclName().getObjCSelector().getNameForSlot(0); 17795ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl} 17805ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 17815ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl/// \return true if Setter has the default name for the property PD. 17825ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantlstatic bool hasDefaultSetterName(const ObjCPropertyDecl *PD, 17835ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl const ObjCMethodDecl *Setter) { 17845ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl assert(PD); 17855ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl if (!Setter) 17865ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl return true; 17875ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 17885ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl assert(Setter->getDeclName().isObjCOneArgSelector()); 178980e8ea92d6dcaa05165dcb4730485db82dcd4629Adrian Prantl return SelectorTable::constructSetterName(PD->getName()) == 1790176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Setter->getDeclName().getObjCSelector().getNameForSlot(0); 17915ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl} 17925ae17a17709acaf005e0c22839ef83c5e21f7db5Adrian Prantl 1793b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, 1794b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit) { 17957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *ID = Ty->getDecl(); 17967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ID) 1797b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 17987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Return a forward declaration if this type was imported from a clang module, 18004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // and this is not the compile unit with the implementation of the type (which 18014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // may contain hidden ivars). 18024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (DebugTypeExtRefs && ID->isFromASTFile() && ID->getDefinition() && 18034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar !ID->getImplementation()) 180487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type, 180587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID->getName(), 180687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getDeclContextDescriptor(ID), Unit, 0); 180787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 18087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the record type for the debug info. 1809b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *DefUnit = getOrCreateFile(ID->getLocation()); 18107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(ID->getLocation()); 181158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar auto RuntimeLang = 181258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar static_cast<llvm::dwarf::SourceLanguage>(TheCU->getSourceLanguage()); 18137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is just a forward declaration return a special forward-declaration 18157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // debug type since we won't be able to lay out the entire type. 18167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *Def = ID->getDefinition(); 18176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!Def || !Def->getImplementation()) { 181887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DIScope *Mod = getParentModuleOrNull(ID); 1819b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *FwdDecl = DBuilder.createReplaceableCompositeType( 182087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::dwarf::DW_TAG_structure_type, ID->getName(), Mod ? Mod : TheCU, 182187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DefUnit, Line, RuntimeLang); 18226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCInterfaceCache.push_back(ObjCInterfaceCacheEntry(Ty, FwdDecl, Unit)); 18237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return FwdDecl; 18247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return CreateTypeDefinition(Ty, Unit); 18276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 18286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 182987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarllvm::DIModule * 183087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarCGDebugInfo::getOrCreateModuleRef(ExternalASTSource::ASTSourceDescriptor Mod, 183187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool CreateSkeletonCU) { 183287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Use the Module pointer as the key into the cache. This is a 183387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // nullptr if the "Module" is a PCH, which is safe because we don't 183487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // support chained PCH debug info, so there can only be a single PCH. 183587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const Module *M = Mod.getModuleOrNull(); 183687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto ModRef = ModuleCache.find(M); 183787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (ModRef != ModuleCache.end()) 183887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return cast<llvm::DIModule>(ModRef->second); 183987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 184087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Macro definitions that were defined with "-D" on the command line. 184187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SmallString<128> ConfigMacros; 184287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar { 184387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::raw_svector_ostream OS(ConfigMacros); 184487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const auto &PPOpts = CGM.getPreprocessorOpts(); 184587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned I = 0; 184687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Translate the macro definitions back into a commmand line. 184787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto &M : PPOpts.Macros) { 184887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (++I > 1) 184987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar OS << " "; 185087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const std::string &Macro = M.first; 185187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool Undef = M.second; 185287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar OS << "\"-" << (Undef ? 'U' : 'D'); 185387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (char c : Macro) 185487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar switch (c) { 185587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case '\\' : OS << "\\\\"; break; 185687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case '"' : OS << "\\\""; break; 185787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar default: OS << c; 185887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 185987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar OS << '\"'; 186087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 186187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 186287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 186387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool IsRootModule = M ? !M->Parent : true; 186487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (CreateSkeletonCU && IsRootModule) { 18654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // PCH files don't have a signature field in the control block, 18664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // but LLVM detects skeleton CUs by looking for a non-zero DWO id. 18674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar uint64_t Signature = Mod.getSignature() ? Mod.getSignature() : ~1ULL; 186887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DIBuilder DIB(CGM.getModule()); 186987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DIB.createCompileUnit(TheCU->getSourceLanguage(), Mod.getModuleName(), 187087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Mod.getPath(), TheCU->getProducer(), true, 187187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar StringRef(), 0, Mod.getASTFile(), 18724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::DICompileUnit::FullDebug, Signature); 187387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DIB.finalize(); 187487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 187587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DIModule *Parent = 187687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar IsRootModule ? nullptr 187787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : getOrCreateModuleRef( 187887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ExternalASTSource::ASTSourceDescriptor(*M->Parent), 187987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CreateSkeletonCU); 188087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DIModule *DIMod = 188187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DBuilder.createModule(Parent, Mod.getModuleName(), ConfigMacros, 188287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Mod.getPath(), CGM.getHeaderSearchOpts().Sysroot); 188387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ModuleCache[M].reset(DIMod); 188487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return DIMod; 188587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 188687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 1887b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateTypeDefinition(const ObjCInterfaceType *Ty, 1888b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit) { 18896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCInterfaceDecl *ID = Ty->getDecl(); 1890b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *DefUnit = getOrCreateFile(ID->getLocation()); 18916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned Line = getLineNumber(ID->getLocation()); 189258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar unsigned RuntimeLang = TheCU->getSourceLanguage(); 18937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 18957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 18967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 18977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 18997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID->getImplementation()) 1900b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Flags |= llvm::DINode::FlagObjcClassComplete; 19017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 190287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DIScope *Mod = getParentModuleOrNull(ID); 1903b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DICompositeType *RealDecl = DBuilder.createStructType( 190487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Mod ? Mod : Unit, ID->getName(), DefUnit, Line, Size, Align, Flags, 190587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar nullptr, llvm::DINodeArray(), RuntimeLang); 19067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines QualType QTy(Ty, 0); 19080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines TypeCache[QTy.getAsOpaquePtr()].reset(RealDecl); 19097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1910d3003dc68535e94fe2501265d68a10aec429d7d0Eric Christopher // Push the struct on region stack. 191158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar LexicalBlockStack.emplace_back(RealDecl); 19120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines RegionMap[Ty->getDecl()].reset(RealDecl); 19137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Convert all the elements. 19150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallVector<llvm::Metadata *, 16> EltTys; 19167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *SClass = ID->getSuperClass(); 19187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SClass) { 1919b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *SClassTy = 1920176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines getOrCreateType(CGM.getContext().getObjCInterfaceType(SClass), Unit); 192158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (!SClassTy) 1922b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 19236537f083555f9606c495d05c562878aa49bae987Eric Christopher 1924b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *InhTag = DBuilder.createInheritance(RealDecl, SClassTy, 0, 0); 19257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(InhTag); 19267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1928d3003dc68535e94fe2501265d68a10aec429d7d0Eric Christopher // Create entries for all of the properties. 192987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto AddProperty = [&](const ObjCPropertyDecl *PD) { 19307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc = PD->getLocation(); 1931b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *PUnit = getOrCreateFile(Loc); 19327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned PLine = getLineNumber(Loc); 19337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Getter = PD->getGetterMethodDecl(); 19347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Setter = PD->getSetterMethodDecl(); 1935176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::MDNode *PropertyNode = DBuilder.createObjCProperty( 1936176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines PD->getName(), PUnit, PLine, 1937176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines hasDefaultGetterName(PD, Getter) ? "" 1938176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines : getSelectorName(PD->getGetterName()), 1939176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines hasDefaultSetterName(PD, Setter) ? "" 1940176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines : getSelectorName(PD->getSetterName()), 1941176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines PD->getPropertyAttributes(), getOrCreateType(PD->getType(), PUnit)); 19427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(PropertyNode); 194387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar }; 194487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar { 194587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::SmallPtrSet<const IdentifierInfo*, 16> PropertySet; 194687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const ObjCCategoryDecl *ClassExt : ID->known_extensions()) 194787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto *PD : ClassExt->properties()) { 194887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar PropertySet.insert(PD->getIdentifier()); 194987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AddProperty(PD); 195087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 195187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto *PD : ID->properties()) { 195287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Don't emit duplicate metadata for properties that were already in a 195387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // class extension. 195487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!PropertySet.insert(PD->getIdentifier()).second) 195587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar continue; 195687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AddProperty(PD); 195787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 19587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &RL = CGM.getContext().getASTObjCInterfaceLayout(ID); 19617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldNo = 0; 19627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ObjCIvarDecl *Field = ID->all_declared_ivar_begin(); Field; 19637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Field = Field->getNextIvar(), ++FieldNo) { 1964b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *FieldTy = getOrCreateType(Field->getType(), Unit); 196558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (!FieldTy) 1966b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 19676537f083555f9606c495d05c562878aa49bae987Eric Christopher 19687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef FieldName = Field->getName(); 19697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore unnamed fields. 19717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FieldName.empty()) 19727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 19737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the location for the field. 1975b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *FieldDefUnit = getOrCreateFile(Field->getLocation()); 19767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldLine = getLineNumber(Field->getLocation()); 19777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FType = Field->getType(); 19787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize = 0; 19797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign = 0; 19807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FType->isIncompleteArrayType()) { 19827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bit size, align and offset of the type. 19847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize = Field->isBitField() 1985d3003dc68535e94fe2501265d68a10aec429d7d0Eric Christopher ? Field->getBitWidthValue(CGM.getContext()) 1986d3003dc68535e94fe2501265d68a10aec429d7d0Eric Christopher : CGM.getContext().getTypeSize(FType); 19877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldAlign = CGM.getContext().getTypeAlign(FType); 19887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldOffset; 19917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CGM.getLangOpts().ObjCRuntime.isNonFragile()) { 19927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We don't know the runtime offset of an ivar if we're using the 19937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // non-fragile ABI. For bitfields, use the bit offset into the first 19947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // byte of storage of the bitfield. For other fields, use zero. 19957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Field->isBitField()) { 1996176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FieldOffset = 1997176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CGM.getObjCRuntime().ComputeBitfieldBitOffset(CGM, ID, Field); 19987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset %= CGM.getContext().getCharWidth(); 19997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 20007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 20017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 20027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 20037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = RL.getFieldOffset(FieldNo); 20047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 20057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 20077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Field->getAccessControl() == ObjCIvarDecl::Protected) 2008b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Flags = llvm::DINode::FlagProtected; 20097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (Field->getAccessControl() == ObjCIvarDecl::Private) 2010b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Flags = llvm::DINode::FlagPrivate; 2011176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines else if (Field->getAccessControl() == ObjCIvarDecl::Public) 2012b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Flags = llvm::DINode::FlagPublic; 20137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::MDNode *PropertyNode = nullptr; 20157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ObjCImplementationDecl *ImpD = ID->getImplementation()) { 20166537f083555f9606c495d05c562878aa49bae987Eric Christopher if (ObjCPropertyImplDecl *PImpD = 2017176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ImpD->FindPropertyImplIvarDecl(Field->getIdentifier())) { 20187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ObjCPropertyDecl *PD = PImpD->getPropertyDecl()) { 2019be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher SourceLocation Loc = PD->getLocation(); 2020b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *PUnit = getOrCreateFile(Loc); 2021be5f1be4cf8bab6b571d54a2e18cb9e83d7be2fcEric Christopher unsigned PLine = getLineNumber(Loc); 20227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Getter = PD->getGetterMethodDecl(); 20237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *Setter = PD->getSetterMethodDecl(); 2024176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines PropertyNode = DBuilder.createObjCProperty( 2025176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines PD->getName(), PUnit, PLine, 2026176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines hasDefaultGetterName(PD, Getter) ? "" : getSelectorName( 2027176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines PD->getGetterName()), 2028176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines hasDefaultSetterName(PD, Setter) ? "" : getSelectorName( 2029176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines PD->getSetterName()), 2030176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines PD->getPropertyAttributes(), 2031176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines getOrCreateType(PD->getType(), PUnit)); 20327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 20337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 20347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2035176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FieldTy = DBuilder.createObjCIVar(FieldName, FieldDefUnit, FieldLine, 2036176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FieldSize, FieldAlign, FieldOffset, Flags, 2037176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FieldTy, PropertyNode); 20387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(FieldTy); 20397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 20407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2041b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys); 20420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DBuilder.replaceArrays(RealDecl, Elements); 20434919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl 20447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 2045f068c92f22cc5c42433f5bd37b000a714a56670fEric Christopher return RealDecl; 20467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2048b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateType(const VectorType *Ty, 2049b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit) { 2050b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *ElementTy = getOrCreateType(Ty->getElementType(), Unit); 20517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei int64_t Count = Ty->getNumElements(); 20527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Count == 0) 20537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If number of elements are not known then this is an unbounded array. 20547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use Count == -1 to express such arrays. 20557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Count = -1; 20567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines llvm::Metadata *Subscript = DBuilder.getOrCreateSubrange(0, Count); 2058b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscript); 20597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 20617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 20627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createVectorType(Size, Align, ElementTy, SubscriptArray); 20647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2066b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateType(const ArrayType *Ty, llvm::DIFile *Unit) { 20677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size; 20687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align; 20697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: make getTypeAlign() aware of VLAs and incomplete array types 20717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(Ty)) { 20727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = 0; 20737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = 2074176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CGM.getContext().getTypeAlign(CGM.getContext().getBaseElementType(VAT)); 20757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Ty->isIncompleteArrayType()) { 20767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = 0; 20777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty->getElementType()->isIncompleteType()) 20787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = 0; 20797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 20807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = CGM.getContext().getTypeAlign(Ty->getElementType()); 2081089db2e3af0b6166a8e2253c453eccf551ddfbd8David Blaikie } else if (Ty->isIncompleteType()) { 20827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = 0; 20837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = 0; 20847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 20857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Size and align of the whole array, not the element type. 20867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = CGM.getContext().getTypeSize(Ty); 20877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = CGM.getContext().getTypeAlign(Ty); 20887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 20897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add the dimensions of the array. FIXME: This loses CV qualifiers from 20917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // interior arrays, do we care? Why aren't nested arrays represented the 20927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // obvious/recursive way? 20930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallVector<llvm::Metadata *, 8> Subscripts; 20947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType EltTy(Ty, 0); 20957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while ((Ty = dyn_cast<ArrayType>(EltTy))) { 20967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the number of elements is known, then count is that number. Otherwise, 20977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // it's -1. This allows us to represent a subrange with an array of 0 20987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // elements, like this: 20997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 21007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // struct foo { 21017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // int x[0]; 21027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // }; 2103176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines int64_t Count = -1; // Count == -1 is an unbounded array. 21047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(Ty)) 21057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Count = CAT->getSize().getZExtValue(); 21066537f083555f9606c495d05c562878aa49bae987Eric Christopher 21077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Verify this is right for VLAs. 21087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Subscripts.push_back(DBuilder.getOrCreateSubrange(0, Count)); 21097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTy = Ty->getElementType(); 21107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 21117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2112b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DINodeArray SubscriptArray = DBuilder.getOrCreateArray(Subscripts); 21137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2114b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return DBuilder.createArrayType(Size, Align, getOrCreateType(EltTy, Unit), 2115b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SubscriptArray); 21167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2118b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateType(const LValueReferenceType *Ty, 2119b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit) { 2120176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return CreatePointerLikeType(llvm::dwarf::DW_TAG_reference_type, Ty, 2121176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Ty->getPointeeType(), Unit); 21227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2124b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateType(const RValueReferenceType *Ty, 2125b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit) { 2126176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return CreatePointerLikeType(llvm::dwarf::DW_TAG_rvalue_reference_type, Ty, 2127176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Ty->getPointeeType(), Unit); 21287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2130b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateType(const MemberPointerType *Ty, 2131b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *U) { 21324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned Flags = 0; 21334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar uint64_t Size = 0; 21344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 21354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!Ty->isIncompleteType()) { 21364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Size = CGM.getContext().getTypeSize(Ty); 21374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 21384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Set the MS inheritance model. There is no flag for the unspecified model. 21394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (CGM.getTarget().getCXXABI().isMicrosoft()) { 21404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar switch (Ty->getMostRecentCXXRecordDecl()->getMSInheritanceModel()) { 21414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case MSInheritanceAttr::Keyword_single_inheritance: 21424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Flags |= llvm::DINode::FlagSingleInheritance; 21434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 21444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case MSInheritanceAttr::Keyword_multiple_inheritance: 21454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Flags |= llvm::DINode::FlagMultipleInheritance; 21464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 21474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case MSInheritanceAttr::Keyword_virtual_inheritance: 21484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Flags |= llvm::DINode::FlagVirtualInheritance; 21494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 21504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case MSInheritanceAttr::Keyword_unspecified_inheritance: 21514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 21524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 21534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 21544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 21554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2156b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *ClassType = getOrCreateType(QualType(Ty->getClass(), 0), U); 2157b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (Ty->isMemberDataPointerType()) 2158e8d7514d6adc149126d5cd47df95600389f0cb70David Blaikie return DBuilder.createMemberPointerType( 21594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar getOrCreateType(Ty->getPointeeType(), U), ClassType, Size, /*Align=*/0, 21604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Flags); 2161651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2162651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const FunctionProtoType *FPT = 2163176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Ty->getPointeeType()->getAs<FunctionProtoType>(); 2164176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return DBuilder.createMemberPointerType( 2165176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines getOrCreateInstanceMethodType(CGM.getContext().getPointerType(QualType( 2166176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Ty->getClass(), FPT->getTypeQuals())), 2167176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FPT, U), 21684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ClassType, Size, /*Align=*/0, Flags); 21697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2171b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateType(const AtomicType *Ty, llvm::DIFile *U) { 21727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore the atomic wrapping 21737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: What is the correct representation? 21747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateType(Ty->getValueType(), U); 21757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarllvm::DIType* CGDebugInfo::CreateType(const PipeType *Ty, 21784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::DIFile *U) { 21794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getOrCreateType(Ty->getElementType(), U); 21804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 21814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2182b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateEnumType(const EnumType *Ty) { 2183f332733e141905ccefe43e7fe65f9a8a4263a2f6Manman Ren const EnumDecl *ED = Ty->getDecl(); 218487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 21857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = 0; 21867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = 0; 21877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ED->getTypeForDecl()->isIncompleteType()) { 21887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Size = CGM.getContext().getTypeSize(ED->getTypeForDecl()); 21897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Align = CGM.getContext().getTypeAlign(ED->getTypeForDecl()); 21907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 21917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 219283369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren SmallString<256> FullName = getUniqueTagTypeName(Ty, CGM, TheCU); 219383369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren 219487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool isImportedFromModule = 219587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DebugTypeExtRefs && ED->isFromASTFile() && ED->getDefinition(); 219687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 21977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is just a forward declaration, construct an appropriately 21987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // marked node and just return it. 219987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (isImportedFromModule || !ED->getDefinition()) { 22004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Note that it is possible for enums to be created as part of 22014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // their own declcontext. In this case a FwdDecl will be created 22024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // twice. This doesn't cause a problem because both FwdDecls are 22034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // entered into the ReplaceMap: finalize() will replace the first 22044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // FwdDecl with the second and then replace the second with 22054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // complete type. 220687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DIScope *EDContext = getDeclContextDescriptor(ED); 2207b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *DefUnit = getOrCreateFile(ED->getLocation()); 22084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::TempDIScope TmpContext(DBuilder.createReplaceableCompositeType( 22094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::dwarf::DW_TAG_enumeration_type, "", TheCU, DefUnit, 0)); 22104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 22117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(ED->getLocation()); 22127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef EDName = ED->getName(); 2213b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *RetTy = DBuilder.createReplaceableCompositeType( 22146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::dwarf::DW_TAG_enumeration_type, EDName, EDContext, DefUnit, Line, 2215b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 0, Size, Align, llvm::DINode::FlagFwdDecl, FullName); 22164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 22170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines ReplaceMap.emplace_back( 22180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines std::piecewise_construct, std::make_tuple(Ty), 22190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines std::make_tuple(static_cast<llvm::Metadata *>(RetTy))); 22206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return RetTy; 22216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 22226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 22236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return CreateTypeDefinition(Ty); 22246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 22256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2226b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateTypeDefinition(const EnumType *Ty) { 22276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const EnumDecl *ED = Ty->getDecl(); 22286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines uint64_t Size = 0; 22296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines uint64_t Align = 0; 22306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!ED->getTypeForDecl()->isIncompleteType()) { 22316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Size = CGM.getContext().getTypeSize(ED->getTypeForDecl()); 22326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Align = CGM.getContext().getTypeAlign(ED->getTypeForDecl()); 22337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SmallString<256> FullName = getUniqueTagTypeName(Ty, CGM, TheCU); 22366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2237b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // Create elements for each enumerator. 22380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallVector<llvm::Metadata *, 16> Enumerators; 22397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ED = ED->getDefinition(); 2240651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *Enum : ED->enumerators()) { 2241176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Enumerators.push_back(DBuilder.createEnumerator( 2242176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Enum->getName(), Enum->getInitVal().getSExtValue())); 22437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Return a CompositeType for the enum itself. 2246b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DINodeArray EltArray = DBuilder.getOrCreateArray(Enumerators); 22477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2248b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *DefUnit = getOrCreateFile(ED->getLocation()); 22497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(ED->getLocation()); 225087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DIScope *EnumContext = getDeclContextDescriptor(ED); 2251b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *ClassTy = 2252b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ED->isFixed() ? getOrCreateType(ED->getIntegerType(), DefUnit) : nullptr; 2253b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return DBuilder.createEnumerationType(EnumContext, ED->getName(), DefUnit, 2254b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Line, Size, Align, EltArray, ClassTy, 2255b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar FullName); 22567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 22577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22584b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikiestatic QualType UnwrapTypeForDebugInfo(QualType T, const ASTContext &C) { 22594b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Qualifiers Quals; 22607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei do { 226135969ea5c5a117c1131edee1866e47e2a33f07bbAdrian Prantl Qualifiers InnerQuals = T.getLocalQualifiers(); 226235969ea5c5a117c1131edee1866e47e2a33f07bbAdrian Prantl // Qualifiers::operator+() doesn't like it if you add a Qualifier 226335969ea5c5a117c1131edee1866e47e2a33f07bbAdrian Prantl // that is already there. 226435969ea5c5a117c1131edee1866e47e2a33f07bbAdrian Prantl Quals += Qualifiers::removeCommonQualifiers(Quals, InnerQuals); 226535969ea5c5a117c1131edee1866e47e2a33f07bbAdrian Prantl Quals += InnerQuals; 22667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType LastT = T; 22677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (T->getTypeClass()) { 22687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 22694b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie return C.getQualifiedType(T.getTypePtr(), Quals); 22706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case Type::TemplateSpecialization: { 22716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const auto *Spec = cast<TemplateSpecializationType>(T); 22726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Spec->isTypeAlias()) 22736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return C.getQualifiedType(T.getTypePtr(), Quals); 22746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T = Spec->desugar(); 2275176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 2276176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 22777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOfExpr: 22787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType(); 22797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 22807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOf: 22817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<TypeOfType>(T)->getUnderlyingType(); 22827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 22837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Decltype: 22847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<DecltypeType>(T)->getUnderlyingType(); 22857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 22867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::UnaryTransform: 22877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<UnaryTransformType>(T)->getUnderlyingType(); 22887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 22897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Attributed: 22907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<AttributedType>(T)->getEquivalentType(); 22917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 22927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Elaborated: 22937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<ElaboratedType>(T)->getNamedType(); 22947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 22957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Paren: 22967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<ParenType>(T)->getInnerType(); 22977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 22984b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie case Type::SubstTemplateTypeParm: 22997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = cast<SubstTemplateTypeParmType>(T)->getReplacementType(); 23007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 23017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Auto: 2302912964863c344dd84976ee281bd213d0485645baDavid Blaikie QualType DT = cast<AutoType>(T)->getDeducedType(); 2303176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(!DT.isNull() && "Undeduced types shouldn't reach here."); 2304912964863c344dd84976ee281bd213d0485645baDavid Blaikie T = DT; 23057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 23067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23076537f083555f9606c495d05c562878aa49bae987Eric Christopher 23087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(T != LastT && "Type unwrapping failed to unwrap!"); 2309d24c9ab90b42370bb417f44e001a0347ee1ca87eNAKAMURA Takumi (void)LastT; 23107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } while (true); 23117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 23127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2313b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::getTypeOrNull(QualType Ty) { 23147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Unwrap the type as needed for debug information. 23164b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext()); 23176537f083555f9606c495d05c562878aa49bae987Eric Christopher 23186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto it = TypeCache.find(Ty.getAsOpaquePtr()); 23197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (it != TypeCache.end()) { 23207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Verify that the debug info still exists. 23210e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (llvm::Metadata *V = it->second) 2322b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return cast<llvm::DIType>(V); 23237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 232558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return nullptr; 23267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 23277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2328651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid CGDebugInfo::completeTemplateDefinition( 2329651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const ClassTemplateSpecializationDecl &SD) { 23304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (DebugKind <= codegenoptions::DebugLineTablesOnly) 2331651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return; 2332651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2333651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines completeClassData(&SD); 2334651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // In case this type has no member function definitions being emitted, ensure 2335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // it is retained 2336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines RetainedTypes.push_back(CGM.getContext().getRecordType(&SD).getAsOpaquePtr()); 2337651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 2338651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2339b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::getOrCreateType(QualType Ty, llvm::DIFile *Unit) { 23407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty.isNull()) 2341b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 23427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Unwrap the type as needed for debug information. 23444b12be6a354fcad670ed440ce6c1c0583ee28186David Blaikie Ty = UnwrapTypeForDebugInfo(Ty, CGM.getContext()); 23457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2346b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (auto *T = getTypeOrNull(Ty)) 23477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 23487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2349b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *Res = CreateTypeNode(Ty, Unit); 235087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void* TyPtr = Ty.getAsOpaquePtr(); 2351ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 2352ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // And update the type cache. 23530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines TypeCache[TyPtr].reset(Res); 23547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Res; 23567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 23577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 235887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarllvm::DIModule *CGDebugInfo::getParentModuleOrNull(const Decl *D) { 235987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // A forward declaration inside a module header does not belong to the module. 236087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (isa<RecordDecl>(D) && !cast<RecordDecl>(D)->getDefinition()) 23616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 236287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (DebugTypeExtRefs && D->isFromASTFile()) { 236387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Record a reference to an imported clang module or precompiled header. 236487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Reader = CGM.getContext().getExternalSource(); 236587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto Idx = D->getOwningModuleID(); 236687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto Info = Reader->getSourceDescriptor(Idx); 236787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Info) 236887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return getOrCreateModuleRef(*Info, /*SkeletonCU=*/true); 236987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } else if (ClangModuleMap) { 237087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // We are building a clang module or a precompiled header. 237187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // 237287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // TODO: When D is a CXXRecordDecl or a C++ Enum, the ODR applies 237387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // and it wouldn't be necessary to specify the parent scope 237487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // because the type is already unique by definition (it would look 237587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // like the output of -fno-standalone-debug). On the other hand, 237687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // the parent scope helps a consumer to quickly locate the object 237787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // file where the type's definition is located, so it might be 237887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // best to make this behavior a command line or debugger tuning 237987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // option. 238087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar FullSourceLoc Loc(D->getLocation(), CGM.getContext().getSourceManager()); 238187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Module *M = ClangModuleMap->inferModuleFromLocation(Loc)) { 23824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // This is a (sub-)module. 238387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto Info = ExternalASTSource::ASTSourceDescriptor(*M); 238487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return getOrCreateModuleRef(Info, /*SkeletonCU=*/false); 23854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else { 23864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // This the precompiled header being built. 23874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getOrCreateModuleRef(PCHDescriptor, /*SkeletonCU=*/false); 238887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 23894919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl } 239087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 239187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return nullptr; 23924919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl} 23934919de6a53a007487c6d6b173921b5e7152a2004Adrian Prantl 2394b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateTypeNode(QualType Ty, llvm::DIFile *Unit) { 23957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Handle qualifiers, which recursively handles what they refer to. 23967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ty.hasLocalQualifiers()) 239729b8b68c93008317acca212970f2e2c37fa8e874David Blaikie return CreateQualifiedType(Ty, Unit); 23987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Work out details of type. 24007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Ty->getTypeClass()) { 24017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define TYPE(Class, Base) 24027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define ABSTRACT_TYPE(Class, Base) 24037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define NON_CANONICAL_TYPE(Class, Base) 24047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define DEPENDENT_TYPE(Class, Base) case Type::Class: 24057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/TypeNodes.def" 24067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Dependent types cannot show up in debug information"); 24077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ExtVector: 24097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Vector: 24107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<VectorType>(Ty), Unit); 24117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCObjectPointer: 24127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ObjCObjectPointerType>(Ty), Unit); 24137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCObject: 24147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ObjCObjectType>(Ty), Unit); 24157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCInterface: 24167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ObjCInterfaceType>(Ty), Unit); 24177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Builtin: 24187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<BuiltinType>(Ty)); 24197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Complex: 24207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ComplexType>(Ty)); 24217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Pointer: 24227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<PointerType>(Ty), Unit); 2423651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case Type::Adjusted: 242412df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner case Type::Decayed: 2425651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Decayed and adjusted types use the adjusted type in LLVM and DWARF. 242612df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner return CreateType( 2427651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines cast<PointerType>(cast<AdjustedType>(Ty)->getAdjustedType()), Unit); 24287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::BlockPointer: 24297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<BlockPointerType>(Ty), Unit); 24307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Typedef: 243129b8b68c93008317acca212970f2e2c37fa8e874David Blaikie return CreateType(cast<TypedefType>(Ty), Unit); 24327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Record: 243329b8b68c93008317acca212970f2e2c37fa8e874David Blaikie return CreateType(cast<RecordType>(Ty)); 24347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Enum: 2435f332733e141905ccefe43e7fe65f9a8a4263a2f6Manman Ren return CreateEnumType(cast<EnumType>(Ty)); 24367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::FunctionProto: 24377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::FunctionNoProto: 24387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<FunctionType>(Ty), Unit); 24397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ConstantArray: 24407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::VariableArray: 24417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::IncompleteArray: 24427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<ArrayType>(Ty), Unit); 24437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::LValueReference: 24457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<LValueReferenceType>(Ty), Unit); 24467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::RValueReference: 24477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<RValueReferenceType>(Ty), Unit); 24487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::MemberPointer: 24507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<MemberPointerType>(Ty), Unit); 24517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Atomic: 24537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CreateType(cast<AtomicType>(Ty), Unit); 24547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case Type::Pipe: 24564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return CreateType(cast<PipeType>(Ty), Unit); 24574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 24587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TemplateSpecialization: 24596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return CreateType(cast<TemplateSpecializationType>(Ty), Unit); 24606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2461176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case Type::Auto: 24626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case Type::Attributed: 24637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Elaborated: 24647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Paren: 24657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::SubstTemplateTypeParm: 24667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOfExpr: 24677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOf: 24687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Decltype: 24697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::UnaryTransform: 2470226399ce18cdcbb1e83af7c5e644bdabb9d4f2f8David Blaikie case Type::PackExpansion: 2471912964863c344dd84976ee281bd213d0485645baDavid Blaikie break; 24727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24736537f083555f9606c495d05c562878aa49bae987Eric Christopher 2474176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm_unreachable("type should have been unwrapped!"); 24757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 247787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarllvm::DICompositeType *CGDebugInfo::getOrCreateLimitedType(const RecordType *Ty, 247887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DIFile *Unit) { 24794a0771680ee2fa8e76e1c0d54eaf69f459daf424David Blaikie QualType QTy(Ty, 0); 24807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 248187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *T = cast_or_null<llvm::DICompositeType>(getTypeOrNull(QTy)); 24827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We may have cached a forward decl when we could have created 24847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // a non-forward decl. Go ahead and create a non-forward decl 24857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // now. 248658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (T && !T->isForwardDecl()) 2487176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return T; 24887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise create the type. 2490b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DICompositeType *Res = CreateLimitedType(Ty); 2491eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie 2492eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie // Propagate members from the declaration to the definition 2493eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie // CreateType(const RecordType*) will overwrite this with the members in the 2494eaacc885deefea195c5cc29b5b4d01996b9a335dDavid Blaikie // correct order if the full type is needed. 2495b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DBuilder.replaceArrays(Res, T ? T->getElements() : llvm::DINodeArray()); 24967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // And update the type cache. 24980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines TypeCache[QTy.getAsOpaquePtr()].reset(Res); 24997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Res; 25007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 25017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// TODO: Currently used for context chains when limiting debug info. 2503b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DICompositeType *CGDebugInfo::CreateLimitedType(const RecordType *Ty) { 25047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordDecl *RD = Ty->getDecl(); 25056537f083555f9606c495d05c562878aa49bae987Eric Christopher 25067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the record type for the debug info. 2507b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *DefUnit = getOrCreateFile(RD->getLocation()); 25087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(RD->getLocation()); 25097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef RDName = getClassName(RD); 25107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 251187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DIScope *RDContext = getDeclContextDescriptor(RD); 25127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2513c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie // If we ended up creating the type during the context chain construction, 2514c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie // just return that. 2515b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto *T = cast_or_null<llvm::DICompositeType>( 251658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar getTypeOrNull(CGM.getContext().getRecordType(RD))); 251758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (T && (!T->isForwardDecl() || !RD->getDefinition())) 2518176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return T; 2519c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie 2520651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If this is just a forward or incomplete declaration, construct an 2521651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // appropriately marked node and just return it. 2522651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const RecordDecl *D = RD->getDefinition(); 2523651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!D || !D->isCompleteDefinition()) 2524f332733e141905ccefe43e7fe65f9a8a4263a2f6Manman Ren return getOrCreateRecordFwdDecl(Ty, RDContext); 25257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Size = CGM.getContext().getTypeSize(Ty); 25277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Align = CGM.getContext().getTypeAlign(Ty); 25286537f083555f9606c495d05c562878aa49bae987Eric Christopher 252983369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren SmallString<256> FullName = getUniqueTagTypeName(Ty, CGM, TheCU); 253083369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren 2531b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DICompositeType *RealDecl = DBuilder.createReplaceableCompositeType( 253258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar getTagForRecord(RD), RDName, RDContext, DefUnit, Line, 0, Size, Align, 0, 253358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar FullName); 25347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Elements of composite types usually have back to the type, creating 25364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // uniquing cycles. Distinct nodes are more efficient. 25374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar switch (RealDecl->getTag()) { 25384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar default: 25394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm_unreachable("invalid composite type tag"); 25404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 25414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case llvm::dwarf::DW_TAG_array_type: 25424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case llvm::dwarf::DW_TAG_enumeration_type: 25434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Array elements and most enumeration elements don't have back references, 25444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // so they don't tend to be involved in uniquing cycles and there is some 25454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // chance of merging them when linking together two modules. Only make 25464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // them distinct if they are ODR-uniqued. 25474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (FullName.empty()) 25484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 25494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 25504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case llvm::dwarf::DW_TAG_structure_type: 25514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case llvm::dwarf::DW_TAG_union_type: 25524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case llvm::dwarf::DW_TAG_class_type: 25534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Immediatley resolve to a distinct node. 25544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RealDecl = 25554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::MDNode::replaceWithDistinct(llvm::TempDICompositeType(RealDecl)); 25564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 25574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 25584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 25590e2c34f92f00628d48968dfea096d36381f494cbStephen Hines RegionMap[Ty->getDecl()].reset(RealDecl); 25600e2c34f92f00628d48968dfea096d36381f494cbStephen Hines TypeCache[QualType(Ty, 0).getAsOpaquePtr()].reset(RealDecl); 25617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2562498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie if (const ClassTemplateSpecializationDecl *TSpecial = 2563498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie dyn_cast<ClassTemplateSpecializationDecl>(RD)) 2564b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DBuilder.replaceArrays(RealDecl, llvm::DINodeArray(), 25650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines CollectCXXTemplateParams(TSpecial, DefUnit)); 2566fab829d611ed0ef6c93bd2ab1a28c10501beafcbDavid Blaikie return RealDecl; 25677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 25687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2569498298d9d7b20fd67e270711b1a815dc6962d883David Blaikievoid CGDebugInfo::CollectContainingType(const CXXRecordDecl *RD, 2570b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DICompositeType *RealDecl) { 2571498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie // A class's primary base or the class itself contains the vtable. 2572b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DICompositeType *ContainingType = nullptr; 2573498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 2574498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie if (const CXXRecordDecl *PBase = RL.getPrimaryBase()) { 2575651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Seek non-virtual primary base root. 2576498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie while (1) { 2577498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie const ASTRecordLayout &BRL = CGM.getContext().getASTRecordLayout(PBase); 2578498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie const CXXRecordDecl *PBT = BRL.getPrimaryBase(); 2579498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie if (PBT && !BRL.isPrimaryBaseVirtual()) 2580498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie PBase = PBT; 2581498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie else 2582498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie break; 2583498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie } 2584b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ContainingType = cast<llvm::DICompositeType>( 2585498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie getOrCreateType(QualType(PBase->getTypeForDecl(), 0), 2586498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie getOrCreateFile(RD->getLocation()))); 2587498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie } else if (RD->isDynamicClass()) 2588498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie ContainingType = RealDecl; 2589498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie 25900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DBuilder.replaceVTableHolder(RealDecl, ContainingType); 2591498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie} 2592498298d9d7b20fd67e270711b1a815dc6962d883David Blaikie 2593b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateMemberType(llvm::DIFile *Unit, QualType FType, 2594b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar StringRef Name, uint64_t *Offset) { 2595b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *FieldTy = CGDebugInfo::getOrCreateType(FType, Unit); 25967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize = CGM.getContext().getTypeSize(FType); 25977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign = CGM.getContext().getTypeAlign(FType); 2598b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *Ty = DBuilder.createMemberType(Unit, Name, Unit, 0, FieldSize, 2599b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar FieldAlign, *Offset, 0, FieldTy); 26007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *Offset += FieldSize; 26017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Ty; 26027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 26037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2604b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarvoid CGDebugInfo::collectFunctionDeclProps(GlobalDecl GD, llvm::DIFile *Unit, 2605b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar StringRef &Name, 2606b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar StringRef &LinkageName, 2607b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIScope *&FDContext, 2608b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DINodeArray &TParamsArray, 2609b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar unsigned &Flags) { 2610176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const FunctionDecl *FD = cast<FunctionDecl>(GD.getDecl()); 2611176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Name = getFunctionName(FD); 2612176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Use mangled name as linkage name for C/C++ functions. 2613176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (FD->hasPrototype()) { 2614176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines LinkageName = CGM.getMangledName(GD); 2615b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Flags |= llvm::DINode::FlagPrototyped; 2616176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 2617176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // No need to replicate the linkage name if it isn't different from the 2618176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // subprogram name, no need to have it at all unless coverage is enabled or 2619176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // debug is set to more than just line tables. 26204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (LinkageName == Name || (!CGM.getCodeGenOpts().EmitGcovArcs && 26214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar !CGM.getCodeGenOpts().EmitGcovNotes && 26224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DebugKind <= codegenoptions::DebugLineTablesOnly)) 2623176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines LinkageName = StringRef(); 2624176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 26254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (DebugKind >= codegenoptions::LimitedDebugInfo) { 2626176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (const NamespaceDecl *NSDecl = 2627176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines dyn_cast_or_null<NamespaceDecl>(FD->getDeclContext())) 2628176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FDContext = getOrCreateNameSpace(NSDecl); 2629176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines else if (const RecordDecl *RDecl = 263087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar dyn_cast_or_null<RecordDecl>(FD->getDeclContext())) { 263187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DIScope *Mod = getParentModuleOrNull(RDecl); 263287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar FDContext = getContextDescriptor(RDecl, Mod ? Mod : TheCU); 263387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 2634176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Collect template parameters. 2635176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines TParamsArray = CollectFunctionTemplateParams(FD, Unit); 2636176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 2637176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 2638176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2639b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarvoid CGDebugInfo::collectVarDeclProps(const VarDecl *VD, llvm::DIFile *&Unit, 2640176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines unsigned &LineNo, QualType &T, 2641176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines StringRef &Name, StringRef &LinkageName, 2642b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIScope *&VDContext) { 2643176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Unit = getOrCreateFile(VD->getLocation()); 2644176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines LineNo = getLineNumber(VD->getLocation()); 2645176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2646176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines setLocation(VD->getLocation()); 2647176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2648176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines T = VD->getType(); 2649176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (T->isIncompleteArrayType()) { 2650176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CodeGen turns int[] into int[1] so we'll do the same here. 2651176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::APInt ConstVal(32, 1); 2652176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines QualType ET = CGM.getContext().getAsArrayType(T)->getElementType(); 2653176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2654176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines T = CGM.getContext().getConstantArrayType(ET, ConstVal, 2655176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ArrayType::Normal, 0); 2656176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 2657176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2658176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Name = VD->getName(); 2659176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (VD->getDeclContext() && !isa<FunctionDecl>(VD->getDeclContext()) && 2660176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines !isa<ObjCMethodDecl>(VD->getDeclContext())) 2661176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines LinkageName = CGM.getMangledName(VD); 2662176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (LinkageName == Name) 2663176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines LinkageName = StringRef(); 2664176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2665176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Since we emit declarations (DW_AT_members) for static members, place the 2666176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // definition of those static members in the namespace they were declared in 2667176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // in the source code (the lexical decl context). 2668176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // FIXME: Generalize this for even non-member global variables where the 2669176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // declaration and definition may have different lexical decl contexts, once 2670176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // we have support for emitting declarations of (non-member) global variables. 26713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar const DeclContext *DC = VD->isStaticDataMember() ? VD->getLexicalDeclContext() 26723ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar : VD->getDeclContext(); 26733ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // When a record type contains an in-line initialization of a static data 26743ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // member, and the record type is marked as __declspec(dllexport), an implicit 26753ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // definition of the member will be created in the record context. DWARF 26763ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // doesn't seem to have a nice way to describe this in a form that consumers 26773ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // are likely to understand, so fake the "normal" situation of a definition 26783ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // outside the class by putting it in the global scope. 26793ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (DC->isRecord()) 26803ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar DC = CGM.getContext().getTranslationUnitDecl(); 268187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 268287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DIScope *Mod = getParentModuleOrNull(VD); 268387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar VDContext = getContextDescriptor(cast<Decl>(DC), Mod ? Mod : TheCU); 2684176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 2685176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2686b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DISubprogram * 2687176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesCGDebugInfo::getFunctionForwardDeclaration(const FunctionDecl *FD) { 2688b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DINodeArray TParamsArray; 2689176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines StringRef Name, LinkageName; 2690176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines unsigned Flags = 0; 2691176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceLocation Loc = FD->getLocation(); 2692b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit = getOrCreateFile(Loc); 2693b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIScope *DContext = Unit; 2694176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines unsigned Line = getLineNumber(Loc); 2695176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2696176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines collectFunctionDeclProps(FD, Unit, Name, LinkageName, DContext, 2697176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines TParamsArray, Flags); 2698176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Build function type. 2699176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SmallVector<QualType, 16> ArgTypes; 2700176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (const ParmVarDecl *Parm: FD->parameters()) 2701176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ArgTypes.push_back(Parm->getType()); 27024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CallingConv CC = FD->getType()->castAs<FunctionType>()->getCallConv(); 27034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType FnType = CGM.getContext().getFunctionType( 27044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FD->getReturnType(), ArgTypes, FunctionProtoType::ExtProtoInfo(CC)); 2705b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DISubprogram *SP = DBuilder.createTempFunctionFwdDecl( 270658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar DContext, Name, LinkageName, Unit, Line, 270758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar getOrCreateFunctionType(FD, FnType, Unit), !FD->isExternallyVisible(), 270887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /* isDefinition = */ false, 0, Flags, CGM.getLangOpts().Optimize, 270958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar TParamsArray.get(), getFunctionDeclaration(FD)); 2710176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const FunctionDecl *CanonDecl = cast<FunctionDecl>(FD->getCanonicalDecl()); 271158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar FwdDeclReplaceMap.emplace_back(std::piecewise_construct, 271258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar std::make_tuple(CanonDecl), 271358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar std::make_tuple(SP)); 2714176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return SP; 2715176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 2716176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2717b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIGlobalVariable * 2718176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesCGDebugInfo::getGlobalVariableForwardDeclaration(const VarDecl *VD) { 2719176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines QualType T; 2720176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines StringRef Name, LinkageName; 2721176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceLocation Loc = VD->getLocation(); 2722b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit = getOrCreateFile(Loc); 2723b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIScope *DContext = Unit; 2724176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines unsigned Line = getLineNumber(Loc); 2725176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2726176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines collectVarDeclProps(VD, Unit, Line, T, Name, LinkageName, DContext); 2727b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto *GV = DBuilder.createTempGlobalVariableFwdDecl( 2728b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DContext, Name, LinkageName, Unit, Line, getOrCreateType(T, Unit), 2729b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar !VD->isExternallyVisible(), nullptr, nullptr); 27300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines FwdDeclReplaceMap.emplace_back( 27310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines std::piecewise_construct, 27320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines std::make_tuple(cast<VarDecl>(VD->getCanonicalDecl())), 27330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines std::make_tuple(static_cast<llvm::Metadata *>(GV))); 2734176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return GV; 2735176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 2736176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2737b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DINode *CGDebugInfo::getDeclarationOrDefinition(const Decl *D) { 27389faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // We only need a declaration (not a definition) of the type - so use whatever 27399faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // we would otherwise do to get a type for a pointee. (forward declarations in 27409faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // limited debug info, full definitions (if the type definition is available) 27419faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // in unlimited debug info) 2742b3c2377422e820ab9d95145ab67a2fb9f9f4bf3fDavid Blaikie if (const TypeDecl *TD = dyn_cast<TypeDecl>(D)) 2743b3c2377422e820ab9d95145ab67a2fb9f9f4bf3fDavid Blaikie return getOrCreateType(CGM.getContext().getTypeDeclType(TD), 274429b8b68c93008317acca212970f2e2c37fa8e874David Blaikie getOrCreateFile(TD->getLocation())); 27450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines auto I = DeclCache.find(D->getCanonicalDecl()); 2746176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 27470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (I != DeclCache.end()) 2748b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return dyn_cast_or_null<llvm::DINode>(I->second); 2749176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2750176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // No definition for now. Emit a forward definition that might be 2751176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // merged with a potential upcoming definition. 2752176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) 2753176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return getFunctionForwardDeclaration(FD); 2754176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines else if (const auto *VD = dyn_cast<VarDecl>(D)) 2755176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return getGlobalVariableForwardDeclaration(VD); 2756176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 275758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return nullptr; 27589faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie} 27599faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie 2760b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DISubprogram *CGDebugInfo::getFunctionDeclaration(const Decl *D) { 27614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!D || DebugKind <= codegenoptions::DebugLineTablesOnly) 2762b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 276323e66db769a708f4f5eed34779548d99d5665abdDavid Blaikie 27647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FunctionDecl *FD = dyn_cast<FunctionDecl>(D); 2765176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!FD) 2766b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 27677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Setup context. 276987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *S = getDeclContextDescriptor(D); 27707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines auto MI = SPCache.find(FD->getCanonicalDecl()); 2772d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie if (MI == SPCache.end()) { 2773ac7c25f0cab42a34d6e6acba7afff729caf0258eEric Christopher if (const CXXMethodDecl *MD = 2774ac7c25f0cab42a34d6e6acba7afff729caf0258eEric Christopher dyn_cast<CXXMethodDecl>(FD->getCanonicalDecl())) { 2775b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return CreateCXXMemberFunction(MD, getOrCreateFile(MD->getLocation()), 2776b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar cast<llvm::DICompositeType>(S)); 2777d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie } 2778d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie } 27797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MI != SPCache.end()) { 2780b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto *SP = dyn_cast_or_null<llvm::DISubprogram>(MI->second); 278158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (SP && !SP->isDefinition()) 27827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SP; 27837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2785651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto NextFD : FD->redecls()) { 27860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines auto MI = SPCache.find(NextFD->getCanonicalDecl()); 27877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MI != SPCache.end()) { 2788b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto *SP = dyn_cast_or_null<llvm::DISubprogram>(MI->second); 278958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (SP && !SP->isDefinition()) 27907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SP; 27917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2793b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 27947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 27957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2796b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// getOrCreateFunctionType - Construct type. If it is a c++ method, include 27977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// implicit parameter "this". 2798b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DISubroutineType *CGDebugInfo::getOrCreateFunctionType(const Decl *D, 279958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar QualType FnType, 2800b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *F) { 28014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!D || DebugKind <= codegenoptions::DebugLineTablesOnly) 2802b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // Create fake but valid subroutine type. Otherwise -verify would fail, and 2803b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // subprogram DIE will miss DW_AT_decl_file and DW_AT_decl_line fields. 280487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return DBuilder.createSubroutineType(DBuilder.getOrCreateTypeArray(None)); 28057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) 28077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getOrCreateMethodType(Method, F); 28084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 28094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const auto *FTy = FnType->getAs<FunctionType>(); 28104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CallingConv CC = FTy ? FTy->getCallConv() : CallingConv::CC_C; 28114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 28127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const ObjCMethodDecl *OMethod = dyn_cast<ObjCMethodDecl>(D)) { 28137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add "self" and "_cmd" 28140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallVector<llvm::Metadata *, 16> Elts; 28157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // First element is always return type. For 'void' functions it is NULL. 2817651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType ResultTy = OMethod->getReturnType(); 28180cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl 28190cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl // Replace the instancetype keyword with the actual type. 28200cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl if (ResultTy == CGM.getContext().getObjCInstanceType()) 28210cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl ResultTy = CGM.getContext().getPointerType( 2822176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines QualType(OMethod->getClassInterface()->getTypeForDecl(), 0)); 28230cb0002332dff5b7bc957c6746a20b78ab3ab0c2Adrian Prantl 2824566a9c3680d9960bb0eb6acf33507251cc13a8d8Adrian Prantl Elts.push_back(getOrCreateType(ResultTy, F)); 28257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // "self" pointer is always first argument. 282687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar QualType SelfDeclTy; 282787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (auto *SelfDecl = OMethod->getSelfDecl()) 282887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SelfDeclTy = SelfDecl->getType(); 282987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar else if (auto *FPT = dyn_cast<FunctionProtoType>(FnType)) 283087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (FPT->getNumParams() > 1) 283187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SelfDeclTy = FPT->getParamType(0); 283287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!SelfDeclTy.isNull()) 283387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Elts.push_back(CreateSelfType(SelfDeclTy, getOrCreateType(SelfDeclTy, F))); 28347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // "_cmd" pointer is always second argument. 2835b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Elts.push_back(DBuilder.createArtificialType( 283687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getOrCreateType(CGM.getContext().getObjCSelType(), F))); 28377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get rest of the arguments. 28384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (const auto *PI : OMethod->parameters()) 2839651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Elts.push_back(getOrCreateType(PI->getType(), F)); 2840176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Variadic methods need a special marker at the end of the type list. 2841176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (OMethod->isVariadic()) 2842176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Elts.push_back(DBuilder.createUnspecifiedParameter()); 28437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2844b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DITypeRefArray EltTypeArray = DBuilder.getOrCreateTypeArray(Elts); 28454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return DBuilder.createSubroutineType(EltTypeArray, 0, getDwarfCC(CC)); 28467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2847651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2848651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Handle variadic function types; they need an additional 2849651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // unspecified parameter. 2850651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) 2851651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (FD->isVariadic()) { 28520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallVector<llvm::Metadata *, 16> EltTys; 2853651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EltTys.push_back(getOrCreateType(FD->getReturnType(), F)); 2854651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FnType)) 2855651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (unsigned i = 0, e = FPT->getNumParams(); i != e; ++i) 2856651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EltTys.push_back(getOrCreateType(FPT->getParamType(i), F)); 2857651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EltTys.push_back(DBuilder.createUnspecifiedParameter()); 2858b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DITypeRefArray EltTypeArray = DBuilder.getOrCreateTypeArray(EltTys); 28594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return DBuilder.createSubroutineType(EltTypeArray, 0, getDwarfCC(CC)); 2860651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 2861651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2862b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return cast<llvm::DISubroutineType>(getOrCreateType(FnType, F)); 28637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 28647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2865176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid CGDebugInfo::EmitFunctionStart(GlobalDecl GD, SourceLocation Loc, 2866176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceLocation ScopeLoc, QualType FnType, 2867176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::Function *Fn, CGBuilderTy &Builder) { 28687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name; 28707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef LinkageName; 28717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FnBeginRegionCount.push_back(LexicalBlockStack.size()); 28737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Decl *D = GD.getDecl(); 28756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool HasDecl = (D != nullptr); 2876651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 28777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 2878b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit = getOrCreateFile(Loc); 2879b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIScope *FDContext = Unit; 2880b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DINodeArray TParamsArray; 28817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!HasDecl) { 28827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use llvm function name. 2883c7971a9efdf9880448a69aabb5182c3c27eecf6dDavid Blaikie LinkageName = Fn->getName(); 28847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 2885b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // If there is a subprogram for this function available then use it. 28860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines auto FI = SPCache.find(FD->getCanonicalDecl()); 28877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FI != SPCache.end()) { 2888b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto *SP = dyn_cast_or_null<llvm::DISubprogram>(FI->second); 288958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (SP && SP->isDefinition()) { 2890b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar LexicalBlockStack.emplace_back(SP); 28910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines RegionMap[D].reset(SP); 28927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 28937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2895176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines collectFunctionDeclProps(GD, Unit, Name, LinkageName, FDContext, 2896176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines TParamsArray, Flags); 28977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D)) { 28987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = getObjCMethodName(OMD); 2899b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Flags |= llvm::DINode::FlagPrototyped; 29007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 29017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use llvm function name. 29027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = Fn->getName(); 2903b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Flags |= llvm::DINode::FlagPrototyped; 29047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Name.empty() && Name[0] == '\01') 29067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = Name.substr(1); 29077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!HasDecl || D->isImplicit()) { 2909b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Flags |= llvm::DINode::FlagArtificial; 29106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Artificial functions without a location should not silently reuse CurLoc. 29116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Loc.isInvalid()) 29126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CurLoc = SourceLocation(); 29136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 29146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned LineNo = getLineNumber(Loc); 29156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned ScopeLine = getLineNumber(ScopeLoc); 29167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2917651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: The function declaration we're constructing here is mostly reusing 2918651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // declarations from CXXMethodDecl and not constructing new ones for arbitrary 2919651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FunctionDecls. When/if we fix this we can have FDContext be TheCU/null for 2920651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // all subprograms instead of the actual context since subprogram definitions 2921651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // are emitted as CU level entities by the backend. 2922b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DISubprogram *SP = DBuilder.createFunction( 2923176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FDContext, Name, LinkageName, Unit, LineNo, 29244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar getOrCreateFunctionType(D, FnType, Unit), Fn->hasLocalLinkage(), 292587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar true /*definition*/, ScopeLine, Flags, CGM.getLangOpts().Optimize, 292658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar TParamsArray.get(), getFunctionDeclaration(D)); 292787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Fn->setSubprogram(SP); 2928176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // We might get here with a VarDecl in the case we're generating 2929176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // code for the initialization of globals. Do not record these decls 2930176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // as they will overwrite the actual VarDecl Decl in the cache. 2931176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (HasDecl && isa<FunctionDecl>(D)) 29320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DeclCache[D->getCanonicalDecl()].reset(static_cast<llvm::Metadata *>(SP)); 29337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2934651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Push the function onto the lexical block stack. 2935b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar LexicalBlockStack.emplace_back(SP); 2936651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 29377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (HasDecl) 29380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines RegionMap[D].reset(SP); 29397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 29407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 294187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid CGDebugInfo::EmitFunctionDecl(GlobalDecl GD, SourceLocation Loc, 294287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar QualType FnType) { 294387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar StringRef Name; 294487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar StringRef LinkageName; 294587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 294687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const Decl *D = GD.getDecl(); 294787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!D) 294887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return; 294987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 295087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned Flags = 0; 295187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DIFile *Unit = getOrCreateFile(Loc); 295287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DIScope *FDContext = getDeclContextDescriptor(D); 295387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DINodeArray TParamsArray; 295487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (isa<FunctionDecl>(D)) { 295587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // If there is a DISubprogram for this function available then use it. 295687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar collectFunctionDeclProps(GD, Unit, Name, LinkageName, FDContext, 295787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar TParamsArray, Flags); 295887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } else if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D)) { 295987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Name = getObjCMethodName(OMD); 296087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Flags |= llvm::DINode::FlagPrototyped; 296187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } else { 296287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm_unreachable("not a function or ObjC method"); 296387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 296487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!Name.empty() && Name[0] == '\01') 296587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Name = Name.substr(1); 296687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 296787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (D->isImplicit()) { 296887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Flags |= llvm::DINode::FlagArtificial; 296987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Artificial functions without a location should not silently reuse CurLoc. 297087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Loc.isInvalid()) 297187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CurLoc = SourceLocation(); 297287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 297387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned LineNo = getLineNumber(Loc); 297487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned ScopeLine = 0; 297587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 29764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DBuilder.retainType(DBuilder.createFunction( 29774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FDContext, Name, LinkageName, Unit, LineNo, 29784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar getOrCreateFunctionType(D, FnType, Unit), false /*internalLinkage*/, 29794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar false /*definition*/, ScopeLine, Flags, CGM.getLangOpts().Optimize, 29804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TParamsArray.get(), getFunctionDeclaration(D))); 298187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 298287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 29830e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc) { 29847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Update our current location 29857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei setLocation(Loc); 29867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2987176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (CurLoc.isInvalid() || CurLoc.isMacroID()) 2988176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return; 29897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MDNode *Scope = LexicalBlockStack.back(); 2991176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Builder.SetCurrentDebugLocation(llvm::DebugLoc::get( 29920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines getLineNumber(CurLoc), getColumnNumber(CurLoc), Scope)); 29937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 29947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::CreateLexicalBlock(SourceLocation Loc) { 29960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines llvm::MDNode *Back = nullptr; 29970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (!LexicalBlockStack.empty()) 29980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Back = LexicalBlockStack.back().get(); 2999b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar LexicalBlockStack.emplace_back(DBuilder.createLexicalBlock( 3000b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar cast<llvm::DIScope>(Back), getOrCreateFile(CurLoc), getLineNumber(CurLoc), 3001b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar getColumnNumber(CurLoc))); 30027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 30037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3004f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christophervoid CGDebugInfo::EmitLexicalBlockStart(CGBuilderTy &Builder, 3005f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher SourceLocation Loc) { 30067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Set our current location. 30077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei setLocation(Loc); 30087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3009176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Emit a line table change for the current location inside the new scope. 3010176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Builder.SetCurrentDebugLocation(llvm::DebugLoc::get( 3011176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines getLineNumber(Loc), getColumnNumber(Loc), LexicalBlockStack.back())); 3012176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 30134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (DebugKind <= codegenoptions::DebugLineTablesOnly) 3014176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return; 3015176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 30167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create a new lexical block and push it on the stack. 30177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CreateLexicalBlock(Loc); 30187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 30197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3020f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christophervoid CGDebugInfo::EmitLexicalBlockEnd(CGBuilderTy &Builder, 3021f0890c420bd9c4a614160882d4d163cddf77ed26Eric Christopher SourceLocation Loc) { 30227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 30237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Provide an entry in the line table for the end of the block. 30257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitLocation(Builder, Loc); 30267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (DebugKind <= codegenoptions::DebugLineTablesOnly) 3028176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return; 3029176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 30307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LexicalBlockStack.pop_back(); 30317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 30327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitFunctionEnd(CGBuilderTy &Builder) { 30347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 30357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RCount = FnBeginRegionCount.back(); 30367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(RCount <= LexicalBlockStack.size() && "Region stack mismatch"); 30377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Pop all regions for this function. 3039176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines while (LexicalBlockStack.size() != RCount) { 3040176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Provide an entry in the line table for the end of the block. 3041176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines EmitLocation(Builder, CurLoc); 3042176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines LexicalBlockStack.pop_back(); 3043176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 30447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FnBeginRegionCount.pop_back(); 30457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 30467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3047b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::EmitTypeForVarWithBlocksAttr(const VarDecl *VD, 3048b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar uint64_t *XOffset) { 30497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallVector<llvm::Metadata *, 5> EltTys; 30517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FType; 30527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t FieldSize, FieldOffset; 30537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FieldAlign; 30546537f083555f9606c495d05c562878aa49bae987Eric Christopher 3055b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit = getOrCreateFile(VD->getLocation()); 30566537f083555f9606c495d05c562878aa49bae987Eric Christopher QualType Type = VD->getType(); 30577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset = 0; 30597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 30607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__isa", &FieldOffset)); 30617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__forwarding", &FieldOffset)); 30627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().IntTy; 30637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__flags", &FieldOffset)); 30647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "__size", &FieldOffset)); 30657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool HasCopyAndDispose = CGM.getContext().BlockRequiresCopying(Type, VD); 30677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (HasCopyAndDispose) { 30687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 3069176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines EltTys.push_back( 3070176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CreateMemberType(Unit, FType, "__copy_helper", &FieldOffset)); 3071176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines EltTys.push_back( 3072176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CreateMemberType(Unit, FType, "__destroy_helper", &FieldOffset)); 30737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool HasByrefExtendedLayout; 30757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qualifiers::ObjCLifetime Lifetime; 3076176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (CGM.getContext().getByrefLifetime(Type, Lifetime, 3077176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines HasByrefExtendedLayout) && 3078176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines HasByrefExtendedLayout) { 30791f4379184ee07217183d11acf142ea6fe0d487a0Adrian Prantl FType = CGM.getContext().getPointerType(CGM.getContext().VoidTy); 3080176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines EltTys.push_back( 3081176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CreateMemberType(Unit, FType, "__byref_variable_layout", &FieldOffset)); 30821f4379184ee07217183d11acf142ea6fe0d487a0Adrian Prantl } 30836537f083555f9606c495d05c562878aa49bae987Eric Christopher 30847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits Align = CGM.getContext().getDeclAlign(VD); 30857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Align > CGM.getContext().toCharUnitsFromBits( 3086176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CGM.getTarget().getPointerAlign(0))) { 3087176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CharUnits FieldOffsetInBytes = 3088176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CGM.getContext().toCharUnitsFromBits(FieldOffset); 30894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CharUnits AlignedOffsetInBytes = FieldOffsetInBytes.alignTo(Align); 3090176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CharUnits NumPaddingBytes = AlignedOffsetInBytes - FieldOffsetInBytes; 30916537f083555f9606c495d05c562878aa49bae987Eric Christopher 30927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NumPaddingBytes.isPositive()) { 30937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APInt pad(32, NumPaddingBytes.getQuantity()); 30947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = CGM.getContext().getConstantArrayType(CGM.getContext().CharTy, 30957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei pad, ArrayType::Normal, 0); 30967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(CreateMemberType(Unit, FType, "", &FieldOffset)); 30977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30996537f083555f9606c495d05c562878aa49bae987Eric Christopher 31007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FType = Type; 3101b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *FieldTy = getOrCreateType(FType, Unit); 31027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldSize = CGM.getContext().getTypeSize(FType); 31037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldAlign = CGM.getContext().toBits(Align); 31047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31056537f083555f9606c495d05c562878aa49bae987Eric Christopher *XOffset = FieldOffset; 3106176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FieldTy = DBuilder.createMemberType(Unit, VD->getName(), Unit, 0, FieldSize, 3107176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FieldAlign, FieldOffset, 0, FieldTy); 31087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EltTys.push_back(FieldTy); 31097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldOffset += FieldSize; 31106537f083555f9606c495d05c562878aa49bae987Eric Christopher 3111b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys); 31126537f083555f9606c495d05c562878aa49bae987Eric Christopher 3113b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar unsigned Flags = llvm::DINode::FlagBlockByrefStruct; 31146537f083555f9606c495d05c562878aa49bae987Eric Christopher 31157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DBuilder.createStructType(Unit, "", Unit, 0, FieldOffset, 0, Flags, 3116b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar nullptr, Elements); 31177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 31187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 311987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid CGDebugInfo::EmitDeclare(const VarDecl *VD, llvm::Value *Storage, 312087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::Optional<unsigned> ArgNo, 3121176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CGBuilderTy &Builder) { 31224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(DebugKind >= codegenoptions::LimitedDebugInfo); 31237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 31244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (VD->hasAttr<NoDebugAttr>()) 31254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 31267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3127fc946271e008544b518321fdecc77ca076663c12David Blaikie bool Unwritten = 3128fc946271e008544b518321fdecc77ca076663c12David Blaikie VD->isImplicit() || (isa<Decl>(VD->getDeclContext()) && 3129fc946271e008544b518321fdecc77ca076663c12David Blaikie cast<Decl>(VD->getDeclContext())->isImplicit()); 3130b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit = nullptr; 3131fc946271e008544b518321fdecc77ca076663c12David Blaikie if (!Unwritten) 3132fc946271e008544b518321fdecc77ca076663c12David Blaikie Unit = getOrCreateFile(VD->getLocation()); 3133b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *Ty; 31347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t XOffset = 0; 31357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VD->hasAttr<BlocksAttr>()) 31367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset); 31376537f083555f9606c495d05c562878aa49bae987Eric Christopher else 31387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = getOrCreateType(VD->getType(), Unit); 31397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there is no debug info for this type then do not emit debug info 31417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // for this variable. 31427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Ty) 31437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 31447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get location information. 3146fc946271e008544b518321fdecc77ca076663c12David Blaikie unsigned Line = 0; 3147fc946271e008544b518321fdecc77ca076663c12David Blaikie unsigned Column = 0; 3148fc946271e008544b518321fdecc77ca076663c12David Blaikie if (!Unwritten) { 3149fc946271e008544b518321fdecc77ca076663c12David Blaikie Line = getLineNumber(VD->getLocation()); 3150fc946271e008544b518321fdecc77ca076663c12David Blaikie Column = getColumnNumber(VD->getLocation()); 3151fc946271e008544b518321fdecc77ca076663c12David Blaikie } 31520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallVector<int64_t, 9> Expr; 31537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 31547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VD->isImplicit()) 3155b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Flags |= llvm::DINode::FlagArtificial; 31567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is the first argument and it is implicit then 31577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // give it an object pointer flag. 31587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: There has to be a better way to do this, but for static 31597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // functions there won't be an implicit param at arg1 and 31607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // otherwise it is 'self' or 'this'. 316187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (isa<ImplicitParamDecl>(VD) && ArgNo && *ArgNo == 1) 3162b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Flags |= llvm::DINode::FlagObjectPointer; 316341c9baed95a1e7974e6cccf7b4120fd1866ff125David Blaikie if (llvm::Argument *Arg = dyn_cast<llvm::Argument>(Storage)) 31647dab97b5af44556453c13cf877e02b8ea4c6c1cfEric Christopher if (Arg->getType()->isPointerTy() && !Arg->hasByValAttr() && 31657dab97b5af44556453c13cf877e02b8ea4c6c1cfEric Christopher !VD->getType()->isPointerType()) 31660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Expr.push_back(llvm::dwarf::DW_OP_deref); 31677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3168b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back()); 31697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = VD->getName(); 31717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Name.empty()) { 31727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (VD->hasAttr<BlocksAttr>()) { 31737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits offset = CharUnits::fromQuantity(32); 31740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Expr.push_back(llvm::dwarf::DW_OP_plus); 31757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of __forwarding field 31767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext().toCharUnitsFromBits( 3177176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CGM.getTarget().getPointerWidth(0)); 31780e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Expr.push_back(offset.getQuantity()); 31790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Expr.push_back(llvm::dwarf::DW_OP_deref); 31800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Expr.push_back(llvm::dwarf::DW_OP_plus); 31817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of x field 31827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext().toCharUnitsFromBits(XOffset); 31830e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Expr.push_back(offset.getQuantity()); 31847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the variable. 318687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *D = ArgNo 318787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ? DBuilder.createParameterVariable(Scope, VD->getName(), 318887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar *ArgNo, Unit, Line, Ty) 318987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : DBuilder.createAutoVariable(Scope, VD->getName(), Unit, 319087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Line, Ty); 31916537f083555f9606c495d05c562878aa49bae987Eric Christopher 31927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Insert an llvm.dbg.declare into the current block. 319358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(Expr), 319458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar llvm::DebugLoc::get(Line, Column, Scope), 319558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar Builder.GetInsertBlock()); 31967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 319739232cd098f94e9e5e850eb2adb3a97372c6cf38Adrian Prantl } else if (isa<VariableArrayType>(VD->getType())) 31980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Expr.push_back(llvm::dwarf::DW_OP_deref); 3199436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie } else if (const RecordType *RT = dyn_cast<RecordType>(VD->getType())) { 3200436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // If VD is an anonymous union then Storage represents value for 3201436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // all union fields. 32027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordDecl *RD = cast<RecordDecl>(RT->getDecl()); 3203d8180cf9877cd793949ae94edbf2ee84341041c5David Blaikie if (RD->isUnion() && RD->isAnonymousStructOrUnion()) { 3204b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // GDB has trouble finding local variables in anonymous unions, so we emit 3205b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // artifical local variables for each of the members. 3206b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // 3207b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // FIXME: Remove this code as soon as GDB supports this. 3208b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // The debug info verifier in LLVM operates based on the assumption that a 3209b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // variable has the same size as its storage and we had to disable the check 3210b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // for artificial variables. 3211651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *Field : RD->fields()) { 3212b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *FieldTy = getOrCreateType(Field->getType(), Unit); 32137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef FieldName = Field->getName(); 32146537f083555f9606c495d05c562878aa49bae987Eric Christopher 32157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore unnamed fields. Do not ignore unnamed records. 32167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FieldName.empty() && !isa<RecordType>(Field->getType())) 32177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 32186537f083555f9606c495d05c562878aa49bae987Eric Christopher 32197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use VarDecl's Tag, Scope and Line number. 322087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *D = DBuilder.createAutoVariable( 322187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Scope, FieldName, Unit, Line, FieldTy, CGM.getLangOpts().Optimize, 322287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Flags | llvm::DINode::FlagArtificial); 32236537f083555f9606c495d05c562878aa49bae987Eric Christopher 32247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Insert an llvm.dbg.declare into the current block. 322558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(Expr), 322658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar llvm::DebugLoc::get(Line, Column, Scope), 322758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar Builder.GetInsertBlock()); 32287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3231436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie 3232436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // Create the descriptor for the variable. 3233b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto *D = 323487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ArgNo 323587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ? DBuilder.createParameterVariable(Scope, Name, *ArgNo, Unit, Line, 323687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Ty, CGM.getLangOpts().Optimize, 323787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Flags) 323887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : DBuilder.createAutoVariable(Scope, Name, Unit, Line, Ty, 323987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CGM.getLangOpts().Optimize, Flags); 3240436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie 3241436653be0ca4eb696b31315a83a44390cc8bc0b3David Blaikie // Insert an llvm.dbg.declare into the current block. 324258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(Expr), 324358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar llvm::DebugLoc::get(Line, Column, Scope), 324458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar Builder.GetInsertBlock()); 32457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 32467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfAutoVariable(const VarDecl *VD, 32487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Value *Storage, 32497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 32504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(DebugKind >= codegenoptions::LimitedDebugInfo); 325187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar EmitDeclare(VD, Storage, llvm::None, Builder); 32527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 32537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3254b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIType *CGDebugInfo::CreateSelfType(const QualType &QualTy, 3255b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *Ty) { 3256b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *CachedTy = getTypeOrNull(QualTy); 3257176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (CachedTy) 3258176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Ty = CachedTy; 3259e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl return DBuilder.createObjectPointerType(Ty); 3260e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl} 3261e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl 3262176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid CGDebugInfo::EmitDeclareOfBlockDeclRefVariable( 3263176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const VarDecl *VD, llvm::Value *Storage, CGBuilderTy &Builder, 3264176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const CGBlockInfo &blockInfo, llvm::Instruction *InsertPoint) { 32654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(DebugKind >= codegenoptions::LimitedDebugInfo); 32667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); 32676537f083555f9606c495d05c562878aa49bae987Eric Christopher 32686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Builder.GetInsertBlock() == nullptr) 32697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 32704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (VD->hasAttr<NoDebugAttr>()) 32714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 32726537f083555f9606c495d05c562878aa49bae987Eric Christopher 32737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool isByRef = VD->hasAttr<BlocksAttr>(); 32746537f083555f9606c495d05c562878aa49bae987Eric Christopher 32757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t XOffset = 0; 3276b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit = getOrCreateFile(VD->getLocation()); 3277b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *Ty; 32787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isByRef) 32797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset); 32806537f083555f9606c495d05c562878aa49bae987Eric Christopher else 32817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = getOrCreateType(VD->getType(), Unit); 32827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Self is passed along as an implicit non-arg variable in a 32847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // block. Mark it as the object pointer. 32857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<ImplicitParamDecl>(VD) && VD->getName() == "self") 3286e86fcc46f560b8e0e13e13a7a1854658b231b2eaAdrian Prantl Ty = CreateSelfType(VD->getType(), Ty); 32877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get location information. 32897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Line = getLineNumber(VD->getLocation()); 32907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Column = getColumnNumber(VD->getLocation()); 32917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const llvm::DataLayout &target = CGM.getDataLayout(); 32937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits offset = CharUnits::fromQuantity( 3295176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines target.getStructLayout(blockInfo.StructureType) 32967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ->getElementOffset(blockInfo.getCapture(VD).getIndex())); 32977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3298176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SmallVector<int64_t, 9> addr; 32999b97adfb770c3b55c1a45049d53b624bbc6f62e1Adrian Prantl if (isa<llvm::AllocaInst>(Storage)) 3300176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines addr.push_back(llvm::dwarf::DW_OP_deref); 3301176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines addr.push_back(llvm::dwarf::DW_OP_plus); 3302176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines addr.push_back(offset.getQuantity()); 33037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isByRef) { 3304176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines addr.push_back(llvm::dwarf::DW_OP_deref); 3305176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines addr.push_back(llvm::dwarf::DW_OP_plus); 33067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of __forwarding field 3307176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines offset = 3308176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CGM.getContext().toCharUnitsFromBits(target.getPointerSizeInBits(0)); 3309176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines addr.push_back(offset.getQuantity()); 3310176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines addr.push_back(llvm::dwarf::DW_OP_deref); 3311176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines addr.push_back(llvm::dwarf::DW_OP_plus); 33127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offset of x field 33137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offset = CGM.getContext().toCharUnitsFromBits(XOffset); 3314176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines addr.push_back(offset.getQuantity()); 33157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 33167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the variable. 331887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *D = DBuilder.createAutoVariable( 3319b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar cast<llvm::DILocalScope>(LexicalBlockStack.back()), VD->getName(), Unit, 332058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar Line, Ty); 33219b97adfb770c3b55c1a45049d53b624bbc6f62e1Adrian Prantl 33227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Insert an llvm.dbg.declare into the current block. 332358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar auto DL = llvm::DebugLoc::get(Line, Column, LexicalBlockStack.back()); 332458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (InsertPoint) 332558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(addr), DL, 332658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar InsertPoint); 332758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar else 332858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(addr), DL, 332958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar Builder.GetInsertBlock()); 33307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 33317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfArgVariable(const VarDecl *VD, llvm::Value *AI, 33337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ArgNo, 33347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 33354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(DebugKind >= codegenoptions::LimitedDebugInfo); 333687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar EmitDeclare(VD, AI, ArgNo, Builder); 33377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 33387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 3340176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct BlockLayoutChunk { 3341176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines uint64_t OffsetInBits; 3342176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const BlockDecl::Capture *Capture; 3343176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}; 3344176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool operator<(const BlockLayoutChunk &l, const BlockLayoutChunk &r) { 3345176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return l.OffsetInBits < r.OffsetInBits; 3346176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 33477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 33487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block, 3350836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl llvm::Value *Arg, 3351176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines unsigned ArgNo, 3352836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl llvm::Value *LocalAddr, 33537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGBuilderTy &Builder) { 33544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(DebugKind >= codegenoptions::LimitedDebugInfo); 33557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTContext &C = CGM.getContext(); 33567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BlockDecl *blockDecl = block.getBlockDecl(); 33577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Collect some general information about the block's location. 33597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation loc = blockDecl->getCaretLocation(); 3360b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *tunit = getOrCreateFile(loc); 33617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned line = getLineNumber(loc); 33627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned column = getColumnNumber(loc); 33636537f083555f9606c495d05c562878aa49bae987Eric Christopher 33647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Build the debug-info type for the block literal. 336587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getDeclContextDescriptor(blockDecl); 33667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const llvm::StructLayout *blockLayout = 3368176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CGM.getDataLayout().getStructLayout(block.StructureType); 33697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallVector<llvm::Metadata *, 16> fields; 33714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar fields.push_back(createFieldType("__isa", C.VoidPtrTy, loc, AS_public, 33727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(0), 33737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 33744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar fields.push_back(createFieldType("__flags", C.IntTy, loc, AS_public, 33757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(1), 33767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 33774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar fields.push_back(createFieldType("__reserved", C.IntTy, loc, AS_public, 33787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(2), 33797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 3380176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines auto *FnTy = block.getBlockExpr()->getFunctionType(); 3381176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines auto FnPtrType = CGM.getContext().getPointerType(FnTy->desugar()); 33824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar fields.push_back(createFieldType("__FuncPtr", FnPtrType, loc, AS_public, 33837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei blockLayout->getElementOffsetInBits(3), 33847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei tunit, tunit)); 3385176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines fields.push_back(createFieldType( 3386176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "__descriptor", C.getPointerType(block.NeedsCopyDispose 3387176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ? C.getBlockDescriptorExtendedType() 3388176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines : C.getBlockDescriptorType()), 33894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar loc, AS_public, blockLayout->getElementOffsetInBits(4), tunit, tunit)); 33907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We want to sort the captures by offset, not because DWARF 33927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // requires this, but because we're paranoid about debuggers. 33937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<BlockLayoutChunk, 8> chunks; 33947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 'this' capture. 33967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (blockDecl->capturesCXXThis()) { 33977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BlockLayoutChunk chunk; 33987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.OffsetInBits = 3399176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines blockLayout->getElementOffsetInBits(block.CXXThisIndex); 34006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines chunk.Capture = nullptr; 34017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunks.push_back(chunk); 34027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 34037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Variable captures. 3405651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &capture : blockDecl->captures()) { 34067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const VarDecl *variable = capture.getVariable(); 34077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CGBlockInfo::Capture &captureInfo = block.getCapture(variable); 34087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore constant captures. 34107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (captureInfo.isConstant()) 34117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 34127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BlockLayoutChunk chunk; 34147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.OffsetInBits = 3415176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines blockLayout->getElementOffsetInBits(captureInfo.getIndex()); 34167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunk.Capture = &capture; 34177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei chunks.push_back(chunk); 34187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 34197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Sort by offset. 34217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::array_pod_sort(chunks.begin(), chunks.end()); 34227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3423176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (SmallVectorImpl<BlockLayoutChunk>::iterator i = chunks.begin(), 3424176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines e = chunks.end(); 3425176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines i != e; ++i) { 34267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t offsetInBits = i->OffsetInBits; 34277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BlockDecl::Capture *capture = i->Capture; 34287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we have a null capture, this must be the C++ 'this' capture. 34307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!capture) { 34314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType type; 34324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (auto *Method = 34334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar cast_or_null<CXXMethodDecl>(blockDecl->getNonClosureContext())) 34344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar type = Method->getThisType(C); 34354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else if (auto *RDecl = dyn_cast<CXXRecordDecl>(blockDecl->getParent())) 34364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar type = QualType(RDecl->getTypeForDecl(), 0); 34374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else 34384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm_unreachable("unexpected block declcontext"); 34397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar fields.push_back(createFieldType("this", type, loc, AS_public, 34417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei offsetInBits, tunit, tunit)); 34427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 34437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 34447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const VarDecl *variable = capture->getVariable(); 34467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef name = variable->getName(); 34477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3448b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *fieldType; 34497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (capture->isByRef()) { 3450176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines TypeInfo PtrInfo = C.getTypeInfo(C.VoidPtrTy); 34517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: this creates a second copy of this type! 34537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t xoffset; 34547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fieldType = EmitTypeForVarWithBlocksAttr(variable, &xoffset); 3455176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines fieldType = DBuilder.createPointerType(fieldType, PtrInfo.Width); 3456176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines fieldType = 3457176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DBuilder.createMemberType(tunit, name, tunit, line, PtrInfo.Width, 3458176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines PtrInfo.Align, offsetInBits, 0, fieldType); 34597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 34604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar fieldType = createFieldType(name, variable->getType(), loc, AS_public, 3461176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines offsetInBits, tunit, tunit); 34627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 34637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fields.push_back(fieldType); 34647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 34657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<36> typeName; 3467176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::raw_svector_ostream(typeName) << "__block_literal_" 3468176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines << CGM.getUniqueBlockCount(); 34697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3470b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DINodeArray fieldsArray = DBuilder.getOrCreateArray(fields); 34717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3472b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *type = DBuilder.createStructType( 3473b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar tunit, typeName.str(), tunit, line, 3474b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar CGM.getContext().toBits(block.BlockSize), 3475b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar CGM.getContext().toBits(block.BlockAlign), 0, nullptr, fieldsArray); 34767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei type = DBuilder.createPointerType(type, CGM.PointerWidthInBits); 34777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get overall information about the block. 3479b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar unsigned flags = llvm::DINode::FlagArtificial; 3480b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto *scope = cast<llvm::DILocalScope>(LexicalBlockStack.back()); 34817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create the descriptor for the parameter. 348387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *debugVar = DBuilder.createParameterVariable( 348487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar scope, Arg->getName(), ArgNo, tunit, line, type, 348587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CGM.getLangOpts().Optimize, flags); 3486836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl 3487bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl if (LocalAddr) { 3488836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl // Insert an llvm.dbg.value into the current block. 348958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar DBuilder.insertDbgValueIntrinsic( 3490176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines LocalAddr, 0, debugVar, DBuilder.createExpression(), 349158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar llvm::DebugLoc::get(line, column, scope), Builder.GetInsertBlock()); 3492bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl } 3493836e7c9357b312fd1ee5c90898ce2c81bb384997Adrian Prantl 3494bea407c92780ded6ef9aabc9d8ebbe60d233f381Adrian Prantl // Insert an llvm.dbg.declare into the current block. 349558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar DBuilder.insertDeclare(Arg, debugVar, DBuilder.createExpression(), 349658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar llvm::DebugLoc::get(line, column, scope), 349758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar Builder.GetInsertBlock()); 34987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 34997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3500b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIDerivedType * 35015434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David BlaikieCGDebugInfo::getOrCreateStaticDataMemberDeclarationOrNull(const VarDecl *D) { 35025434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie if (!D->isStaticDataMember()) 3503b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 35043ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 35050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines auto MI = StaticDataMemberCache.find(D->getCanonicalDecl()); 35065434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie if (MI != StaticDataMemberCache.end()) { 35075434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie assert(MI->second && "Static data member declaration should still exist"); 350887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return MI->second; 35095434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie } 35105e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie 35115e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie // If the member wasn't found in the cache, lazily construct and add it to the 35125e6937bf3513d3081d149f3c84c862ca9f49762cDavid Blaikie // type (used when a limited form of the type is emitted). 3513176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines auto DC = D->getDeclContext(); 351487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Ctxt = cast<llvm::DICompositeType>(getDeclContextDescriptor(D)); 3515176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return CreateRecordStaticField(D, Ctxt, cast<RecordDecl>(DC)); 35165434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie} 35175434fc29cb3ddbd0466b10a40ac0485f4cd7bc74David Blaikie 3518b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIGlobalVariable *CGDebugInfo::CollectAnonRecordDecls( 3519b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar const RecordDecl *RD, llvm::DIFile *Unit, unsigned LineNo, 3520b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar StringRef LinkageName, llvm::GlobalVariable *Var, llvm::DIScope *DContext) { 3521b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIGlobalVariable *GV = nullptr; 35226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 35236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (const auto *Field : RD->fields()) { 3524b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *FieldTy = getOrCreateType(Field->getType(), Unit); 35256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines StringRef FieldName = Field->getName(); 35266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 35276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Ignore unnamed fields, but recurse into anonymous records. 35286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (FieldName.empty()) { 35296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const RecordType *RT = dyn_cast<RecordType>(Field->getType()); 35306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (RT) 35316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines GV = CollectAnonRecordDecls(RT->getDecl(), Unit, LineNo, LinkageName, 35326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Var, DContext); 35336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines continue; 35346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 35356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Use VarDecl's Tag, Scope and Line number. 3536b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar GV = DBuilder.createGlobalVariable(DContext, FieldName, LinkageName, Unit, 3537b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar LineNo, FieldTy, 35384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Var->hasLocalLinkage(), Var, nullptr); 35396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 35406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return GV; 35416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 35426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 35433b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gaovoid CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, 35447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const VarDecl *D) { 35454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(DebugKind >= codegenoptions::LimitedDebugInfo); 35464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (D->hasAttr<NoDebugAttr>()) 35474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 35487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create global variable debug descriptor. 3549b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit = nullptr; 3550b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIScope *DContext = nullptr; 3551176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines unsigned LineNo; 3552176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines StringRef DeclName, LinkageName; 3553176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines QualType T; 3554176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines collectVarDeclProps(D, Unit, LineNo, T, DeclName, LinkageName, DContext); 35556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 35566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Attempt to store one global variable for the declaration - even if we 35576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // emit a lot of fields. 3558b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIGlobalVariable *GV = nullptr; 35596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 35606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // If this is an anonymous union then we'll want to emit a global 35616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // variable for each member of the anonymous union so that it's possible 35626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // to find the name of any field in the union. 35636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (T->isUnionType() && DeclName.empty()) { 356487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const RecordDecl *RD = T->castAs<RecordType>()->getDecl(); 3565176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(RD->isAnonymousStructOrUnion() && 3566176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "unnamed non-anonymous struct or union?"); 35676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines GV = CollectAnonRecordDecls(RD, Unit, LineNo, LinkageName, Var, DContext); 35686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } else { 3569176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines GV = DBuilder.createGlobalVariable( 35706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DContext, DeclName, LinkageName, Unit, LineNo, getOrCreateType(T, Unit), 35714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Var->hasLocalLinkage(), Var, 35726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getOrCreateStaticDataMemberDeclarationOrNull(D)); 35736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 35740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DeclCache[D->getCanonicalDecl()].reset(static_cast<llvm::Metadata *>(GV)); 35757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 35767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35773b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gaovoid CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, 35783b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao llvm::Constant *Init) { 35794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(DebugKind >= codegenoptions::LimitedDebugInfo); 35804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (VD->hasAttr<NoDebugAttr>()) 35814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 35823b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao // Create the descriptor for the variable. 3583b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *Unit = getOrCreateFile(VD->getLocation()); 35843b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao StringRef Name = VD->getName(); 3585b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *Ty = getOrCreateType(VD->getType(), Unit); 35863b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(VD)) { 35873b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao const EnumDecl *ED = cast<EnumDecl>(ECD->getDeclContext()); 35883b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao assert(isa<EnumType>(ED->getTypeForDecl()) && "Enum without EnumType?"); 35893b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao Ty = getOrCreateType(QualType(ED->getTypeForDecl(), 0), Unit); 35903b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao } 3591b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // Do not use global variables for enums. 3592b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // 3593b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // FIXME: why not? 359458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (Ty->getTag() == llvm::dwarf::DW_TAG_enumeration_type) 35953b8e0b7f96164e8c49d2a833da26edd960f5da1fYunzhong Gao return; 35966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Do not emit separate definitions for function local const/statics. 35976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (isa<FunctionDecl>(VD->getDeclContext())) 35986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return; 35996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines VD = cast<ValueDecl>(VD->getCanonicalDecl()); 3600176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines auto *VarD = cast<VarDecl>(VD); 3601176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (VarD->isStaticDataMember()) { 3602176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines auto *RD = cast<RecordDecl>(VarD->getDeclContext()); 360387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getDeclContextDescriptor(VarD); 3604176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Ensure that the type is retained even though it's otherwise unreferenced. 36054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // 36064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // FIXME: This is probably unnecessary, since Ty should reference RD 36074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // through its scope. 3608176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RetainedTypes.push_back( 3609176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CGM.getContext().getRecordType(RD).getAsOpaquePtr()); 36106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return; 3611176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 3612176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 361387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DIScope *DContext = getDeclContextDescriptor(VD); 3614176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 36150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines auto &GV = DeclCache[VD]; 36160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (GV) 3617176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return; 36180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines GV.reset(DBuilder.createGlobalVariable( 36196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DContext, Name, StringRef(), Unit, getLineNumber(VD->getLocation()), Ty, 36200e2c34f92f00628d48968dfea096d36381f494cbStephen Hines true, Init, getOrCreateStaticDataMemberDeclarationOrNull(VarD))); 36219faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie} 36229faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie 3623b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIScope *CGDebugInfo::getCurrentContextDescriptor(const Decl *D) { 36249faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie if (!LexicalBlockStack.empty()) 3625b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return LexicalBlockStack.back(); 362687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DIScope *Mod = getParentModuleOrNull(D); 362787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return getContextDescriptor(D, Mod ? Mod : TheCU); 36287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 36297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3630957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikievoid CGDebugInfo::EmitUsingDirective(const UsingDirectiveDecl &UD) { 36314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (CGM.getCodeGenOpts().getDebugInfo() < codegenoptions::LimitedDebugInfo) 36329faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return; 363387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const NamespaceDecl *NSDecl = UD.getNominatedNamespace(); 363487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!NSDecl->isAnonymousNamespace() || 363587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CGM.getCodeGenOpts().DebugExplicitImport) { 363687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DBuilder.createImportedModule( 363787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getCurrentContextDescriptor(cast<Decl>(UD.getDeclContext())), 363887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getOrCreateNameSpace(NSDecl), 363987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getLineNumber(UD.getLocation())); 364087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 3641957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie} 3642957dac5b6d826bc0c10011c8b5c3f1b8007fda41David Blaikie 36439faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikievoid CGDebugInfo::EmitUsingDecl(const UsingDecl &UD) { 36444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (CGM.getCodeGenOpts().getDebugInfo() < codegenoptions::LimitedDebugInfo) 36459faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie return; 36469faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie assert(UD.shadow_size() && 36479faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie "We shouldn't be codegening an invalid UsingDecl containing no decls"); 36489faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // Emitting one decl is sufficient - debuggers can detect that this is an 36499faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie // overloaded name & provide lookup for all the overloads. 36509faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie const UsingShadowDecl &USD = **UD.shadow_begin(); 3651b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (llvm::DINode *Target = 365256b108ad2b44659b3b4c3815145d226e8540c8e2Eric Christopher getDeclarationOrDefinition(USD.getUnderlyingDecl())) 36539faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie DBuilder.createImportedDeclaration( 36549faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie getCurrentContextDescriptor(cast<Decl>(USD.getDeclContext())), Target, 36559faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie getLineNumber(USD.getLocation())); 36569faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie} 36579faebd23fd69ac1591520e811dfa5b25f73012f3David Blaikie 365887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid CGDebugInfo::EmitImportDecl(const ImportDecl &ID) { 36594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (CGM.getCodeGenOpts().getDebuggerTuning() != llvm::DebuggerKind::LLDB) 36604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 366187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Module *M = ID.getImportedModule()) { 366287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto Info = ExternalASTSource::ASTSourceDescriptor(*M); 366387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DBuilder.createImportedDeclaration( 366487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getCurrentContextDescriptor(cast<Decl>(ID.getDeclContext())), 366587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getOrCreateModuleRef(Info, DebugTypeExtRefs), 366687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getLineNumber(ID.getLocation())); 366787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 366887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 366987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 3670b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DIImportedEntity * 3671fc46ebc2b1345723a894ae352cfb206c1d930295David BlaikieCGDebugInfo::EmitNamespaceAlias(const NamespaceAliasDecl &NA) { 36724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (CGM.getCodeGenOpts().getDebugInfo() < codegenoptions::LimitedDebugInfo) 3673b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 36740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines auto &VH = NamespaceAliasCache[&NA]; 3675fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie if (VH) 3676b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return cast<llvm::DIImportedEntity>(VH); 3677b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIImportedEntity *R; 3678fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie if (const NamespaceAliasDecl *Underlying = 3679fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie dyn_cast<NamespaceAliasDecl>(NA.getAliasedNamespace())) 3680fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie // This could cache & dedup here rather than relying on metadata deduping. 36816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines R = DBuilder.createImportedDeclaration( 3682fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie getCurrentContextDescriptor(cast<Decl>(NA.getDeclContext())), 3683fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie EmitNamespaceAlias(*Underlying), getLineNumber(NA.getLocation()), 3684fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie NA.getName()); 3685fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie else 36866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines R = DBuilder.createImportedDeclaration( 3687fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie getCurrentContextDescriptor(cast<Decl>(NA.getDeclContext())), 3688fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie getOrCreateNameSpace(cast<NamespaceDecl>(NA.getAliasedNamespace())), 3689fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie getLineNumber(NA.getLocation()), NA.getName()); 36900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines VH.reset(R); 3691fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie return R; 3692fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie} 3693fc46ebc2b1345723a894ae352cfb206c1d930295David Blaikie 3694b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarllvm::DINamespace * 36957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGDebugInfo::getOrCreateNameSpace(const NamespaceDecl *NSDecl) { 36968863e6baaa760c2a0f4541fc6c0ca7993979a4b3David Blaikie NSDecl = NSDecl->getCanonicalDecl(); 36970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines auto I = NameSpaceCache.find(NSDecl); 36987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (I != NameSpaceCache.end()) 3699b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return cast<llvm::DINamespace>(I->second); 37006537f083555f9606c495d05c562878aa49bae987Eric Christopher 37017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = getLineNumber(NSDecl->getLocation()); 3702b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIFile *FileD = getOrCreateFile(NSDecl->getLocation()); 370387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DIScope *Context = getDeclContextDescriptor(NSDecl); 3704b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DINamespace *NS = 3705b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DBuilder.createNameSpace(Context, NSDecl->getName(), FileD, LineNo); 37060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines NameSpaceCache[NSDecl].reset(NS); 37077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return NS; 37087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 37097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 371087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid CGDebugInfo::setDwoId(uint64_t Signature) { 371187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(TheCU && "no main compile unit"); 371287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar TheCU->setDWOId(Signature); 371387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 371487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 371587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 37167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGDebugInfo::finalize() { 37176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Creating types might create further types - invalidating the current 37186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // element and the size(), so don't cache/reference them. 37196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (size_t i = 0; i != ObjCInterfaceCache.size(); ++i) { 37206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCInterfaceCacheEntry E = ObjCInterfaceCache[i]; 3721b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DIType *Ty = E.Type->getDecl()->getDefinition() 372258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar ? CreateTypeDefinition(E.Type, E.Unit) 372358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar : E.Decl; 3724b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DBuilder.replaceTemporary(llvm::TempDIType(E.Decl), Ty); 37256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 37266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 37276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (auto p : ReplaceMap) { 37286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(p.second); 3729b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto *Ty = cast<llvm::DIType>(p.second); 373058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar assert(Ty->isForwardDecl()); 37316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 37326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto it = TypeCache.find(p.first); 37336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(it != TypeCache.end()); 37346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(it->second); 37356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3736b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DBuilder.replaceTemporary(llvm::TempDIType(Ty), 3737b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar cast<llvm::DIType>(it->second)); 37387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3739ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 3740176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (const auto &p : FwdDeclReplaceMap) { 3741176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(p.second); 3742b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::TempMDNode FwdDecl(cast<llvm::MDNode>(p.second)); 37430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines llvm::Metadata *Repl; 3744176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 3745176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines auto it = DeclCache.find(p.first); 37460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // If there has been no definition for the declaration, call RAUW 3747176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // with ourselves, that will destroy the temporary MDNode and 3748176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // replace it with a standard one, avoiding leaking memory. 3749176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (it == DeclCache.end()) 37500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Repl = p.second; 3751176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines else 37520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Repl = it->second; 3753176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 3754b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DBuilder.replaceTemporary(std::move(FwdDecl), cast<llvm::MDNode>(Repl)); 3755176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 3756176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 3757ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // We keep our own list of retained types, because we need to look 3758ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl // up the final type in the type cache. 375987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto &RT : RetainedTypes) 376087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (auto MD = TypeCache[RT]) 376187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DBuilder.retainType(cast<llvm::DIType>(MD)); 3762ebbd7e07aa0f22722da6ed8dd3a55beed9699171Adrian Prantl 37637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DBuilder.finalize(); 37647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3765176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 3766176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid CGDebugInfo::EmitExplicitCastType(QualType Ty) { 37674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (CGM.getCodeGenOpts().getDebugInfo() < codegenoptions::LimitedDebugInfo) 3768176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return; 376958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 3770b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (auto *DieTy = getOrCreateType(Ty, getOrCreateMainFile())) 377158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar // Don't ignore in case of explicit cast where it is referenced indirectly. 377258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar DBuilder.retainType(DieTy); 3773176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 3774