135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel//===--- DIBuilder.cpp - Debug Information Builder ------------------------===// 235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel// 335fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel// The LLVM Compiler Infrastructure 435fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel// 535fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel// This file is distributed under the University of Illinois Open Source 635fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel// License. See LICENSE.TXT for details. 735fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel// 835fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel//===----------------------------------------------------------------------===// 935fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel// 1035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel// This file implements the DIBuilder. 1135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel// 1235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel//===----------------------------------------------------------------------===// 1335fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 1416eeb6f5ebc978b03745177b9ac82684ab1c6932Bill Wendling#include "llvm/DIBuilder.h" 15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/STLExtras.h" 160bcbd1df7a204e1e512f1a27066d725309de1b13Bill Wendling#include "llvm/DebugInfo.h" 170b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h" 180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/IntrinsicInst.h" 190b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h" 206126a1e1894f346fae02a514a20aa56b879aeb99Eric Christopher#include "llvm/Support/Debug.h" 2135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel#include "llvm/Support/Dwarf.h" 2235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 2335fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patelusing namespace llvm; 2435fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patelusing namespace llvm::dwarf; 2535fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 2635fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patelstatic Constant *GetTagConstant(LLVMContext &VMContext, unsigned Tag) { 2735fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel assert((Tag & LLVMDebugVersionMask) == 0 && 2835fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel "Tag too large for debug encoding!"); 2935fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel return ConstantInt::get(Type::getInt32Ty(VMContext), Tag | LLVMDebugVersion); 3035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 3148f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel 3235fcd6557f53aab69c2990b80fed4653fbaa3473Devang PatelDIBuilder::DIBuilder(Module &m) 331fe3f9af7ff385c28b96cc46ee1ed3737c813c3aEric Christopher : M(m), VMContext(M.getContext()), TempEnumTypes(0), 346c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher TempRetainTypes(0), TempSubprograms(0), TempGVs(0), DeclareFn(0), 356c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher ValueFn(0) 3694c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel{} 3735fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 386326a4238df05dafd7547cfa2cd71111cd6702a6Devang Patel/// finalize - Construct any deferred debug info descriptors. 396326a4238df05dafd7547cfa2cd71111cd6702a6Devang Patelvoid DIBuilder::finalize() { 4094c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel DIArray Enums = getOrCreateArray(AllEnumTypes); 4194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel DIType(TempEnumTypes).replaceAllUsesWith(Enums); 4294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel 4394c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel DIArray RetainTypes = getOrCreateArray(AllRetainTypes); 4494c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel DIType(TempRetainTypes).replaceAllUsesWith(RetainTypes); 4594c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel 4694c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel DIArray SPs = getOrCreateArray(AllSubprograms); 4794c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel DIType(TempSubprograms).replaceAllUsesWith(SPs); 4893d39be5300702d8c9892ec04a492a6056926462Devang Patel for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) { 4993d39be5300702d8c9892ec04a492a6056926462Devang Patel DISubprogram SP(SPs.getElement(i)); 50216432df5ac897327a0cb6323f08811910481038Eric Christopher SmallVector<Value *, 4> Variables; 5193d39be5300702d8c9892ec04a492a6056926462Devang Patel if (NamedMDNode *NMD = getFnSpecificMDNode(M, SP)) { 5293d39be5300702d8c9892ec04a492a6056926462Devang Patel for (unsigned ii = 0, ee = NMD->getNumOperands(); ii != ee; ++ii) 5393d39be5300702d8c9892ec04a492a6056926462Devang Patel Variables.push_back(NMD->getOperand(ii)); 5493d39be5300702d8c9892ec04a492a6056926462Devang Patel NMD->eraseFromParent(); 5593d39be5300702d8c9892ec04a492a6056926462Devang Patel } 56216432df5ac897327a0cb6323f08811910481038Eric Christopher if (MDNode *Temp = SP.getVariablesNodes()) { 57216432df5ac897327a0cb6323f08811910481038Eric Christopher DIArray AV = getOrCreateArray(Variables); 58216432df5ac897327a0cb6323f08811910481038Eric Christopher DIType(Temp).replaceAllUsesWith(AV); 59216432df5ac897327a0cb6323f08811910481038Eric Christopher } 6093d39be5300702d8c9892ec04a492a6056926462Devang Patel } 6194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel 6294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel DIArray GVs = getOrCreateArray(AllGVs); 6394c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel DIType(TempGVs).replaceAllUsesWith(GVs); 64c462db6d66e683fb837c03d661483106a869a407David Blaikie 65c462db6d66e683fb837c03d661483106a869a407David Blaikie DIArray IMs = getOrCreateArray(AllImportedModules); 66c462db6d66e683fb837c03d661483106a869a407David Blaikie DIType(TempImportedModules).replaceAllUsesWith(IMs); 6794c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel} 6894c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel 696c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher/// getNonCompileUnitScope - If N is compile unit return NULL otherwise return 706c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher/// N. 7194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patelstatic MDNode *getNonCompileUnitScope(MDNode *N) { 7294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel if (DIDescriptor(N).isCompileUnit()) 7394c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel return NULL; 7494c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel return N; 756326a4238df05dafd7547cfa2cd71111cd6702a6Devang Patel} 766326a4238df05dafd7547cfa2cd71111cd6702a6Devang Patel 7700c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikiestatic MDNode *createFilePathPair(LLVMContext &VMContext, StringRef Filename, 7800c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikie StringRef Directory) { 7900c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikie assert(!Filename.empty() && "Unable to create file without name"); 8000c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikie Value *Pair[] = { 8100c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikie MDString::get(VMContext, Filename), 8200c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikie MDString::get(VMContext, Directory), 8300c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikie }; 8400c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikie return MDNode::get(VMContext, Pair); 8500c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikie} 8600c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikie 8750d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createCompileUnit - A CompileUnit provides an anchor for all debugging 8835fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel/// information generated during this instance of compilation. 891fe3f9af7ff385c28b96cc46ee1ed3737c813c3aEric ChristopherDICompileUnit DIBuilder::createCompileUnit(unsigned Lang, StringRef Filename, 901fe3f9af7ff385c28b96cc46ee1ed3737c813c3aEric Christopher StringRef Directory, 911fe3f9af7ff385c28b96cc46ee1ed3737c813c3aEric Christopher StringRef Producer, bool isOptimized, 921fe3f9af7ff385c28b96cc46ee1ed3737c813c3aEric Christopher StringRef Flags, unsigned RunTimeVer, 931fe3f9af7ff385c28b96cc46ee1ed3737c813c3aEric Christopher StringRef SplitName) { 94b0dc4d995cbb09e762ce56d7ae754dd042bafab0Chandler Carruth assert(((Lang <= dwarf::DW_LANG_Python && Lang >= dwarf::DW_LANG_C89) || 95b0dc4d995cbb09e762ce56d7ae754dd042bafab0Chandler Carruth (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) && 96b0dc4d995cbb09e762ce56d7ae754dd042bafab0Chandler Carruth "Invalid Language tag"); 97b0dc4d995cbb09e762ce56d7ae754dd042bafab0Chandler Carruth assert(!Filename.empty() && 98b0dc4d995cbb09e762ce56d7ae754dd042bafab0Chandler Carruth "Unable to create compile unit without filename"); 9994c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) }; 10094c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel TempEnumTypes = MDNode::getTemporary(VMContext, TElts); 10194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel 10294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel TempRetainTypes = MDNode::getTemporary(VMContext, TElts); 10394c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel 10494c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel TempSubprograms = MDNode::getTemporary(VMContext, TElts); 10594c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel 10694c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel TempGVs = MDNode::getTemporary(VMContext, TElts); 10794c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel 108c462db6d66e683fb837c03d661483106a869a407David Blaikie TempImportedModules = MDNode::getTemporary(VMContext, TElts); 109c462db6d66e683fb837c03d661483106a869a407David Blaikie 11042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 11142c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_compile_unit), 11200c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikie createFilePathPair(VMContext, Filename, Directory), 113162c800384353b639aa5bc94242e6307dcfae2d3David Blaikie ConstantInt::get(Type::getInt32Ty(VMContext), Lang), 11442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Producer), 11542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized), 11642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Flags), 11794c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeVer), 118a8eefc7cc7c6e8be06d570fff76dc42b43a23392David Blaikie TempEnumTypes, 119a8eefc7cc7c6e8be06d570fff76dc42b43a23392David Blaikie TempRetainTypes, 120a8eefc7cc7c6e8be06d570fff76dc42b43a23392David Blaikie TempSubprograms, 121e4b67906d3cc5ea365359f9b034189aaa51ca1e9Eric Christopher TempGVs, 122c462db6d66e683fb837c03d661483106a869a407David Blaikie TempImportedModules, 123e4b67906d3cc5ea365359f9b034189aaa51ca1e9Eric Christopher MDString::get(VMContext, SplitName) 12442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 1251fe3f9af7ff385c28b96cc46ee1ed3737c813c3aEric Christopher 1261fe3f9af7ff385c28b96cc46ee1ed3737c813c3aEric Christopher MDNode *CUNode = MDNode::get(VMContext, Elts); 127464f4ef2bdb47a44ffa2c4208296da641db7358dDevang Patel 128464f4ef2bdb47a44ffa2c4208296da641db7358dDevang Patel // Create a named metadata so that it is easier to find cu in a module. 129464f4ef2bdb47a44ffa2c4208296da641db7358dDevang Patel NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu"); 1301fe3f9af7ff385c28b96cc46ee1ed3737c813c3aEric Christopher NMD->addOperand(CUNode); 1311fe3f9af7ff385c28b96cc46ee1ed3737c813c3aEric Christopher 1321fe3f9af7ff385c28b96cc46ee1ed3737c813c3aEric Christopher return DICompileUnit(CUNode); 13335fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 13435fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 1357b72cc7782716f469eb1b0963423a5b414215705David Blaikiestatic DIImportedEntity 1367b72cc7782716f469eb1b0963423a5b414215705David BlaikiecreateImportedModule(LLVMContext &C, DIScope Context, DIDescriptor NS, 1377b72cc7782716f469eb1b0963423a5b414215705David Blaikie unsigned Line, StringRef Name, 1387b72cc7782716f469eb1b0963423a5b414215705David Blaikie SmallVectorImpl<Value *> &AllImportedModules) { 1397b72cc7782716f469eb1b0963423a5b414215705David Blaikie const MDNode *R; 1407b72cc7782716f469eb1b0963423a5b414215705David Blaikie if (Name.empty()) { 1417b72cc7782716f469eb1b0963423a5b414215705David Blaikie Value *Elts[] = { 1427b72cc7782716f469eb1b0963423a5b414215705David Blaikie GetTagConstant(C, dwarf::DW_TAG_imported_module), 1437b72cc7782716f469eb1b0963423a5b414215705David Blaikie Context, 1447b72cc7782716f469eb1b0963423a5b414215705David Blaikie NS, 1457b72cc7782716f469eb1b0963423a5b414215705David Blaikie ConstantInt::get(Type::getInt32Ty(C), Line), 1467b72cc7782716f469eb1b0963423a5b414215705David Blaikie }; 1477b72cc7782716f469eb1b0963423a5b414215705David Blaikie R = MDNode::get(C, Elts); 1487b72cc7782716f469eb1b0963423a5b414215705David Blaikie } else { 1497b72cc7782716f469eb1b0963423a5b414215705David Blaikie Value *Elts[] = { 1507b72cc7782716f469eb1b0963423a5b414215705David Blaikie GetTagConstant(C, dwarf::DW_TAG_imported_module), 1517b72cc7782716f469eb1b0963423a5b414215705David Blaikie Context, 1527b72cc7782716f469eb1b0963423a5b414215705David Blaikie NS, 1537b72cc7782716f469eb1b0963423a5b414215705David Blaikie ConstantInt::get(Type::getInt32Ty(C), Line), 1547b72cc7782716f469eb1b0963423a5b414215705David Blaikie MDString::get(C, Name) 1557b72cc7782716f469eb1b0963423a5b414215705David Blaikie }; 1567b72cc7782716f469eb1b0963423a5b414215705David Blaikie R = MDNode::get(C, Elts); 1577b72cc7782716f469eb1b0963423a5b414215705David Blaikie } 1587b72cc7782716f469eb1b0963423a5b414215705David Blaikie DIImportedEntity M(R); 15920d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie assert(M.Verify() && "Imported module should be valid"); 16020d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie AllImportedModules.push_back(M); 16120d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie return M; 16220d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie} 16320d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie 1647b72cc7782716f469eb1b0963423a5b414215705David BlaikieDIImportedEntity DIBuilder::createImportedModule(DIScope Context, 1657b72cc7782716f469eb1b0963423a5b414215705David Blaikie DINameSpace NS, unsigned Line, 1667b72cc7782716f469eb1b0963423a5b414215705David Blaikie StringRef Name) { 1677b72cc7782716f469eb1b0963423a5b414215705David Blaikie return ::createImportedModule(VMContext, Context, NS, Line, Name, 1687b72cc7782716f469eb1b0963423a5b414215705David Blaikie AllImportedModules); 1697b72cc7782716f469eb1b0963423a5b414215705David Blaikie} 1707b72cc7782716f469eb1b0963423a5b414215705David Blaikie 1717b72cc7782716f469eb1b0963423a5b414215705David BlaikieDIImportedEntity DIBuilder::createImportedModule(DIScope Context, 1727b72cc7782716f469eb1b0963423a5b414215705David Blaikie DIImportedEntity NS, 1737b72cc7782716f469eb1b0963423a5b414215705David Blaikie unsigned Line, 1747b72cc7782716f469eb1b0963423a5b414215705David Blaikie StringRef Name) { 1757b72cc7782716f469eb1b0963423a5b414215705David Blaikie return ::createImportedModule(VMContext, Context, NS, Line, Name, 1767b72cc7782716f469eb1b0963423a5b414215705David Blaikie AllImportedModules); 1777b72cc7782716f469eb1b0963423a5b414215705David Blaikie} 1787b72cc7782716f469eb1b0963423a5b414215705David Blaikie 17920d9e41ddb3f531267680819b5cac4cac1c6b231David BlaikieDIImportedEntity DIBuilder::createImportedDeclaration(DIScope Context, 18020d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie DIDescriptor Decl, 18120d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie unsigned Line) { 18220d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie Value *Elts[] = { 18320d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie GetTagConstant(VMContext, dwarf::DW_TAG_imported_declaration), 18420d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie Context, 18520d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie Decl, 18620d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie ConstantInt::get(Type::getInt32Ty(VMContext), Line), 18720d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie }; 18820d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie DIImportedEntity M(MDNode::get(VMContext, Elts)); 189c462db6d66e683fb837c03d661483106a869a407David Blaikie assert(M.Verify() && "Imported module should be valid"); 190c462db6d66e683fb837c03d661483106a869a407David Blaikie AllImportedModules.push_back(M); 191c462db6d66e683fb837c03d661483106a869a407David Blaikie return M; 192c462db6d66e683fb837c03d661483106a869a407David Blaikie} 193c462db6d66e683fb837c03d661483106a869a407David Blaikie 19450d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createFile - Create a file descriptor to hold debugging information 19535fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel/// for a file. 19650d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIFile DIBuilder::createFile(StringRef Filename, StringRef Directory) { 197b4cf0ab22b5a3ebb720f0b7287fdccfb465b6b7cDavid Blaikie Value *Elts[] = { 198b4cf0ab22b5a3ebb720f0b7287fdccfb465b6b7cDavid Blaikie GetTagConstant(VMContext, dwarf::DW_TAG_file_type), 19972dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie createFilePathPair(VMContext, Filename, Directory) 200b4cf0ab22b5a3ebb720f0b7287fdccfb465b6b7cDavid Blaikie }; 20172dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIFile(MDNode::get(VMContext, Elts)); 20235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 20335fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 20450d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createEnumerator - Create a single enumerator value. 2058de0a465b832052d975dc9fdced1adcf3336fabcDavid BlaikieDIEnumerator DIBuilder::createEnumerator(StringRef Name, int64_t Val) { 206811ae5b09cc2727e9a7a8748c6124d5bbd30707fDevang Patel assert(!Name.empty() && "Unable to create enumerator without name"); 20742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 20842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_enumerator), 20942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Name), 21042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), Val) 21142c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 21272dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIEnumerator(MDNode::get(VMContext, Elts)); 21335fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 21435fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 21503ccdb5b1dbb95714f2fd86540292567c8442a6bPeter Collingbourne/// \brief Create a DWARF unspecified type. 21603ccdb5b1dbb95714f2fd86540292567c8442a6bPeter CollingbourneDIBasicType DIBuilder::createUnspecifiedType(StringRef Name) { 217734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel assert(!Name.empty() && "Unable to create type without name"); 21803ccdb5b1dbb95714f2fd86540292567c8442a6bPeter Collingbourne // Unspecified types are encoded in DIBasicType format. Line number, filename, 21903ccdb5b1dbb95714f2fd86540292567c8442a6bPeter Collingbourne // size, alignment, offset and flags are always empty here. 220734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel Value *Elts[] = { 221734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_type), 222a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie NULL, // Filename 2231fe3f9af7ff385c28b96cc46ee1ed3737c813c3aEric Christopher NULL, // Unused 224734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel MDString::get(VMContext, Name), 225734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 226734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 227734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 228734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 229734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags; 2309fdb7c085312b01924dd2d990b457cd58df2e63bBill Wendling ConstantInt::get(Type::getInt32Ty(VMContext), 0) // Encoding 231734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel }; 232576d49a775043931d81bba172b9b11f40d858cb6Manman Ren return DIBasicType(MDNode::get(VMContext, Elts)); 233734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel} 234734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel 23503ccdb5b1dbb95714f2fd86540292567c8442a6bPeter Collingbourne/// \brief Create C++11 nullptr type. 23603ccdb5b1dbb95714f2fd86540292567c8442a6bPeter CollingbourneDIBasicType DIBuilder::createNullPtrType() { 23703ccdb5b1dbb95714f2fd86540292567c8442a6bPeter Collingbourne return createUnspecifiedType("decltype(nullptr)"); 23803ccdb5b1dbb95714f2fd86540292567c8442a6bPeter Collingbourne} 23903ccdb5b1dbb95714f2fd86540292567c8442a6bPeter Collingbourne 2406c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher/// createBasicType - Create debugging information entry for a basic 24135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel/// type, e.g 'char'. 2422ce067a9fb5b2d046c92519428cafa71fae81ed4David BlaikieDIBasicType 2432ce067a9fb5b2d046c92519428cafa71fae81ed4David BlaikieDIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits, 2442ce067a9fb5b2d046c92519428cafa71fae81ed4David Blaikie uint64_t AlignInBits, unsigned Encoding) { 245811ae5b09cc2727e9a7a8748c6124d5bbd30707fDevang Patel assert(!Name.empty() && "Unable to create type without name"); 24635fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel // Basic types are encoded in DIBasicType format. Line number, filename, 24735fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel // offset and flags are always empty here. 24842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 24942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_base_type), 250a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie NULL, // File/directory name 2511fe3f9af7ff385c28b96cc46ee1ed3737c813c3aEric Christopher NULL, // Unused 25242c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Name), 25342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 25442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 25542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 25642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 25742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags; 25842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), Encoding) 25942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 26072dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIBasicType(MDNode::get(VMContext, Elts)); 26135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 26235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 263ffab7d0c4f581297e8bc1515eeb34e1b12b650c4Nick Lewycky/// createQualifiedType - Create debugging information entry for a qualified 26435fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel/// type, e.g. 'const int'. 265d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIDerivedType DIBuilder::createQualifiedType(unsigned Tag, DIType FromTy) { 26642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer // Qualified types are encoded in DIDerivedType format. 26742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 26842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, Tag), 269a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie NULL, // Filename 2701fe3f9af7ff385c28b96cc46ee1ed3737c813c3aEric Christopher NULL, // Unused 27142c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, StringRef()), // Empty name. 27242c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 27342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 27442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 27542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 27642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 27742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer FromTy 27842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 27972dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIDerivedType(MDNode::get(VMContext, Elts)); 28035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 28135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 28250d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createPointerType - Create debugging information entry for a pointer. 283d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIDerivedType 284d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIBuilder::createPointerType(DIType PointeeTy, uint64_t SizeInBits, 285d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie uint64_t AlignInBits, StringRef Name) { 28642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer // Pointer types are encoded in DIDerivedType format. 28742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 28842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_pointer_type), 289a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie NULL, // Filename 2901fe3f9af7ff385c28b96cc46ee1ed3737c813c3aEric Christopher NULL, // Unused 29142c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Name), 29242c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 29342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 29442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 29542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 29642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 29742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer PointeeTy 29842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 29972dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIDerivedType(MDNode::get(VMContext, Elts)); 30035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 30135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 30209b798180340487e4397069e9fa22568099fd9b6Eric ChristopherDIDerivedType DIBuilder::createMemberPointerType(DIType PointeeTy, 30309b798180340487e4397069e9fa22568099fd9b6Eric Christopher DIType Base) { 30462fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie // Pointer types are encoded in DIDerivedType format. 30562fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie Value *Elts[] = { 30662fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie GetTagConstant(VMContext, dwarf::DW_TAG_ptr_to_member_type), 307a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie NULL, // Filename 3081fe3f9af7ff385c28b96cc46ee1ed3737c813c3aEric Christopher NULL, // Unused 30962fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie NULL, 31062fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 31162fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie ConstantInt::get(Type::getInt64Ty(VMContext), 0), 31262fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie ConstantInt::get(Type::getInt64Ty(VMContext), 0), 31362fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 31462fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 31562fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie PointeeTy, 31662fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie Base 31762fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie }; 31872dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIDerivedType(MDNode::get(VMContext, Elts)); 31962fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie} 32062fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie 321791e629deef7e4a410e67527da26405916415d3aEric Christopher/// createReferenceType - Create debugging information entry for a reference 322791e629deef7e4a410e67527da26405916415d3aEric Christopher/// type. 323d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIDerivedType DIBuilder::createReferenceType(unsigned Tag, DIType RTy) { 32489c83b76329ad8eb383a72f14e03dd13b5d780b7Manman Ren assert(RTy.isType() && "Unable to create reference type"); 32542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer // References are encoded in DIDerivedType format. 32642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 327791e629deef7e4a410e67527da26405916415d3aEric Christopher GetTagConstant(VMContext, Tag), 328a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie NULL, // Filename 3296c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher NULL, // TheCU, 33042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer NULL, // Name 33142c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 33242c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 33342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 33442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 33542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 33642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer RTy 33742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 33872dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIDerivedType(MDNode::get(VMContext, Elts)); 33935fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 34035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 34150d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createTypedef - Create debugging information entry for a typedef. 342d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIDerivedType DIBuilder::createTypedef(DIType Ty, StringRef Name, DIFile File, 343d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie unsigned LineNo, DIDescriptor Context) { 34442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer // typedefs are encoded in DIDerivedType format. 34589c83b76329ad8eb383a72f14e03dd13b5d780b7Manman Ren assert(Ty.isType() && "Invalid typedef type!"); 34642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 34742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_typedef), 3484776bce28cb7d669329222c3d9cf6a97d6881c96David Blaikie File.getFileNode(), 34994c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Context), 35042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Name), 35142c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 35242c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 35342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 35442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 35542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 35642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Ty 35742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 35872dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIDerivedType(MDNode::get(VMContext, Elts)); 35935fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 36035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 36150d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createFriend - Create debugging information entry for a 'friend'. 362576d49a775043931d81bba172b9b11f40d858cb6Manman RenDIDerivedType DIBuilder::createFriend(DIType Ty, DIType FriendTy) { 36342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer // typedefs are encoded in DIDerivedType format. 36489c83b76329ad8eb383a72f14e03dd13b5d780b7Manman Ren assert(Ty.isType() && "Invalid type!"); 36589c83b76329ad8eb383a72f14e03dd13b5d780b7Manman Ren assert(FriendTy.isType() && "Invalid friend type!"); 36642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 36742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_friend), 368a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie NULL, 36942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Ty, 37042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer NULL, // Name 37142c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 37242c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 37342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 37442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 37542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 37642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer FriendTy 37742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 378576d49a775043931d81bba172b9b11f40d858cb6Manman Ren return DIDerivedType(MDNode::get(VMContext, Elts)); 37935fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 38035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 38150d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createInheritance - Create debugging information entry to establish 382c27c7342aa5ce43c700364f1ce72272b3649aa6eEric Christopher/// inheritance relationship between two types. 383d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIDerivedType DIBuilder::createInheritance( 384d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie DIType Ty, DIType BaseTy, uint64_t BaseOffset, unsigned Flags) { 38589c83b76329ad8eb383a72f14e03dd13b5d780b7Manman Ren assert(Ty.isType() && "Unable to create inheritance"); 38642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer // TAG_inheritance is encoded in DIDerivedType format. 38742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 38842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_inheritance), 389a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie NULL, 39042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Ty, 39142c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer NULL, // Name 39242c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 39342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 39442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 39542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), BaseOffset), 39642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 39742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer BaseTy 39842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 39972dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIDerivedType(MDNode::get(VMContext, Elts)); 40035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 40135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 40250d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createMemberType - Create debugging information entry for a member. 403d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIDerivedType DIBuilder::createMemberType( 404d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber, 405d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie uint64_t SizeInBits, uint64_t AlignInBits, uint64_t OffsetInBits, 406d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie unsigned Flags, DIType Ty) { 40742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer // TAG_member is encoded in DIDerivedType format. 40842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 40942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_member), 4104776bce28cb7d669329222c3d9cf6a97d6881c96David Blaikie File.getFileNode(), 41194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Scope), 41242c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Name), 41342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 41442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 41542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 41642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits), 41742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 41842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Ty 41942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 42072dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIDerivedType(MDNode::get(VMContext, Elts)); 42135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 42235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 4236b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher/// createStaticMemberType - Create debugging information entry for a 4246b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher/// C++ static data member. 425576d49a775043931d81bba172b9b11f40d858cb6Manman RenDIDerivedType 426576d49a775043931d81bba172b9b11f40d858cb6Manman RenDIBuilder::createStaticMemberType(DIDescriptor Scope, StringRef Name, 427576d49a775043931d81bba172b9b11f40d858cb6Manman Ren DIFile File, unsigned LineNumber, 428576d49a775043931d81bba172b9b11f40d858cb6Manman Ren DIType Ty, unsigned Flags, 429576d49a775043931d81bba172b9b11f40d858cb6Manman Ren llvm::Value *Val) { 4306b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher // TAG_member is encoded in DIDerivedType format. 4316b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher Flags |= DIDescriptor::FlagStaticMember; 4326b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher Value *Elts[] = { 4336b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher GetTagConstant(VMContext, dwarf::DW_TAG_member), 4344776bce28cb7d669329222c3d9cf6a97d6881c96David Blaikie File.getFileNode(), 4356b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher getNonCompileUnitScope(Scope), 4366b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher MDString::get(VMContext, Name), 4376b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 4386b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher ConstantInt::get(Type::getInt64Ty(VMContext), 0/*SizeInBits*/), 4396b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher ConstantInt::get(Type::getInt64Ty(VMContext), 0/*AlignInBits*/), 4406b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher ConstantInt::get(Type::getInt64Ty(VMContext), 0/*OffsetInBits*/), 4416b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 4426b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher Ty, 4436b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher Val 4446b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher }; 445576d49a775043931d81bba172b9b11f40d858cb6Manman Ren return DIDerivedType(MDNode::get(VMContext, Elts)); 4466b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher} 4476b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher 448e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel/// createObjCIVar - Create debugging information entry for Objective-C 449e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel/// instance variable. 450576d49a775043931d81bba172b9b11f40d858cb6Manman RenDIDerivedType 451576d49a775043931d81bba172b9b11f40d858cb6Manman RenDIBuilder::createObjCIVar(StringRef Name, 452576d49a775043931d81bba172b9b11f40d858cb6Manman Ren DIFile File, unsigned LineNumber, 453576d49a775043931d81bba172b9b11f40d858cb6Manman Ren uint64_t SizeInBits, uint64_t AlignInBits, 454576d49a775043931d81bba172b9b11f40d858cb6Manman Ren uint64_t OffsetInBits, unsigned Flags, 455576d49a775043931d81bba172b9b11f40d858cb6Manman Ren DIType Ty, StringRef PropertyName, 456576d49a775043931d81bba172b9b11f40d858cb6Manman Ren StringRef GetterName, StringRef SetterName, 457576d49a775043931d81bba172b9b11f40d858cb6Manman Ren unsigned PropertyAttributes) { 458e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel // TAG_member is encoded in DIDerivedType format. 459e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel Value *Elts[] = { 460e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_member), 4614776bce28cb7d669329222c3d9cf6a97d6881c96David Blaikie File.getFileNode(), 46294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(File), 463e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel MDString::get(VMContext, Name), 464e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 465e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 466e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 467e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits), 468e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 469e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel Ty, 470e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel MDString::get(VMContext, PropertyName), 471e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel MDString::get(VMContext, GetterName), 472e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel MDString::get(VMContext, SetterName), 473e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes) 474e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel }; 475576d49a775043931d81bba172b9b11f40d858cb6Manman Ren return DIDerivedType(MDNode::get(VMContext, Elts)); 4766588abf377b7381274236e651462ec83052f6013Devang Patel} 4776588abf377b7381274236e651462ec83052f6013Devang Patel 4786588abf377b7381274236e651462ec83052f6013Devang Patel/// createObjCIVar - Create debugging information entry for Objective-C 4796588abf377b7381274236e651462ec83052f6013Devang Patel/// instance variable. 480576d49a775043931d81bba172b9b11f40d858cb6Manman RenDIDerivedType 481576d49a775043931d81bba172b9b11f40d858cb6Manman RenDIBuilder::createObjCIVar(StringRef Name, 482576d49a775043931d81bba172b9b11f40d858cb6Manman Ren DIFile File, unsigned LineNumber, 483576d49a775043931d81bba172b9b11f40d858cb6Manman Ren uint64_t SizeInBits, uint64_t AlignInBits, 484576d49a775043931d81bba172b9b11f40d858cb6Manman Ren uint64_t OffsetInBits, unsigned Flags, 485576d49a775043931d81bba172b9b11f40d858cb6Manman Ren DIType Ty, MDNode *PropertyNode) { 4866588abf377b7381274236e651462ec83052f6013Devang Patel // TAG_member is encoded in DIDerivedType format. 4876588abf377b7381274236e651462ec83052f6013Devang Patel Value *Elts[] = { 4886588abf377b7381274236e651462ec83052f6013Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_member), 4894776bce28cb7d669329222c3d9cf6a97d6881c96David Blaikie File.getFileNode(), 4906588abf377b7381274236e651462ec83052f6013Devang Patel getNonCompileUnitScope(File), 4916588abf377b7381274236e651462ec83052f6013Devang Patel MDString::get(VMContext, Name), 4926588abf377b7381274236e651462ec83052f6013Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 4936588abf377b7381274236e651462ec83052f6013Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 4946588abf377b7381274236e651462ec83052f6013Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 4956588abf377b7381274236e651462ec83052f6013Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits), 4966588abf377b7381274236e651462ec83052f6013Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 4976588abf377b7381274236e651462ec83052f6013Devang Patel Ty, 4986588abf377b7381274236e651462ec83052f6013Devang Patel PropertyNode 4996588abf377b7381274236e651462ec83052f6013Devang Patel }; 500576d49a775043931d81bba172b9b11f40d858cb6Manman Ren return DIDerivedType(MDNode::get(VMContext, Elts)); 501e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel} 502e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel 5031ea02d467a311b4846b942377d0b00fde987be65Devang Patel/// createObjCProperty - Create debugging information entry for Objective-C 5041ea02d467a311b4846b942377d0b00fde987be65Devang Patel/// property. 505b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric ChristopherDIObjCProperty DIBuilder::createObjCProperty(StringRef Name, 50687c06a843c279adf6750a044a5c54108397490fbEric Christopher DIFile File, unsigned LineNumber, 5071ea02d467a311b4846b942377d0b00fde987be65Devang Patel StringRef GetterName, 5082f445be5a75b4d1a907dd694c9e5c518229df48eAdrian Prantl StringRef SetterName, 509b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher unsigned PropertyAttributes, 51087c06a843c279adf6750a044a5c54108397490fbEric Christopher DIType Ty) { 5111ea02d467a311b4846b942377d0b00fde987be65Devang Patel Value *Elts[] = { 5126c31ee2b10827583a0fbcb39623fdfb440c917efEric Christopher GetTagConstant(VMContext, dwarf::DW_TAG_APPLE_property), 5131ea02d467a311b4846b942377d0b00fde987be65Devang Patel MDString::get(VMContext, Name), 514b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher File, 515b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 5161ea02d467a311b4846b942377d0b00fde987be65Devang Patel MDString::get(VMContext, GetterName), 5171ea02d467a311b4846b942377d0b00fde987be65Devang Patel MDString::get(VMContext, SetterName), 518b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes), 519b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher Ty 5201ea02d467a311b4846b942377d0b00fde987be65Devang Patel }; 52172dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIObjCProperty(MDNode::get(VMContext, Elts)); 5221ea02d467a311b4846b942377d0b00fde987be65Devang Patel} 5231ea02d467a311b4846b942377d0b00fde987be65Devang Patel 52450d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createTemplateTypeParameter - Create debugging information for template 5257e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel/// type parameter. 5266c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric ChristopherDITemplateTypeParameter 52750d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIBuilder::createTemplateTypeParameter(DIDescriptor Context, StringRef Name, 5287e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel DIType Ty, MDNode *File, unsigned LineNo, 5297e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel unsigned ColumnNo) { 5307e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel Value *Elts[] = { 5317e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_template_type_parameter), 53294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Context), 5337e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel MDString::get(VMContext, Name), 5347e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel Ty, 5357e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel File, 5367e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 5377e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo) 5387e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel }; 53972dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DITemplateTypeParameter(MDNode::get(VMContext, Elts)); 5407e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel} 5417e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel 5426c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric ChristopherDITemplateValueParameter 543e88939cfebbc98133553c6fc03a52b8fb1adbb70David BlaikieDIBuilder::createTemplateValueParameter(unsigned Tag, DIDescriptor Context, 544e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie StringRef Name, DIType Ty, 545e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie Value *Val, MDNode *File, 546e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie unsigned LineNo, 547e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel unsigned ColumnNo) { 548e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel Value *Elts[] = { 549e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie GetTagConstant(VMContext, Tag), 55094c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Context), 551e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel MDString::get(VMContext, Name), 552e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel Ty, 5534de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie Val, 554e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel File, 555e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 556e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo) 557e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel }; 55872dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DITemplateValueParameter(MDNode::get(VMContext, Elts)); 559e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel} 560e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel 561e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie/// createTemplateValueParameter - Create debugging information for template 562e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie/// value parameter. 563e88939cfebbc98133553c6fc03a52b8fb1adbb70David BlaikieDITemplateValueParameter 564e88939cfebbc98133553c6fc03a52b8fb1adbb70David BlaikieDIBuilder::createTemplateValueParameter(DIDescriptor Context, StringRef Name, 565e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie DIType Ty, Value *Val, 566e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie MDNode *File, unsigned LineNo, 567e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie unsigned ColumnNo) { 568e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie return createTemplateValueParameter(dwarf::DW_TAG_template_value_parameter, 569e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie Context, Name, Ty, Val, File, LineNo, 570e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie ColumnNo); 571e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie} 572e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie 573e88939cfebbc98133553c6fc03a52b8fb1adbb70David BlaikieDITemplateValueParameter 574e88939cfebbc98133553c6fc03a52b8fb1adbb70David BlaikieDIBuilder::createTemplateTemplateParameter(DIDescriptor Context, StringRef Name, 575e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie DIType Ty, StringRef Val, 576e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie MDNode *File, unsigned LineNo, 577e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie unsigned ColumnNo) { 578e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie return createTemplateValueParameter( 579e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie dwarf::DW_TAG_GNU_template_template_param, Context, Name, Ty, 580e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie MDString::get(VMContext, Val), File, LineNo, ColumnNo); 581e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie} 582e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie 583e88939cfebbc98133553c6fc03a52b8fb1adbb70David BlaikieDITemplateValueParameter 584e88939cfebbc98133553c6fc03a52b8fb1adbb70David BlaikieDIBuilder::createTemplateParameterPack(DIDescriptor Context, StringRef Name, 585e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie DIType Ty, DIArray Val, 586e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie MDNode *File, unsigned LineNo, 587e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie unsigned ColumnNo) { 588e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie return createTemplateValueParameter(dwarf::DW_TAG_GNU_template_parameter_pack, 589e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie Context, Name, Ty, Val, File, LineNo, 590e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie ColumnNo); 591e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie} 592e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie 59387c06a843c279adf6750a044a5c54108397490fbEric Christopher/// createClassType - Create debugging information entry for a class. 594ca442a4a1aabf6199e5aee09ec604e79916d9b92David BlaikieDICompositeType DIBuilder::createClassType(DIDescriptor Context, StringRef Name, 595ca442a4a1aabf6199e5aee09ec604e79916d9b92David Blaikie DIFile File, unsigned LineNumber, 596ca442a4a1aabf6199e5aee09ec604e79916d9b92David Blaikie uint64_t SizeInBits, 597ca442a4a1aabf6199e5aee09ec604e79916d9b92David Blaikie uint64_t AlignInBits, 598ca442a4a1aabf6199e5aee09ec604e79916d9b92David Blaikie uint64_t OffsetInBits, 599ca442a4a1aabf6199e5aee09ec604e79916d9b92David Blaikie unsigned Flags, DIType DerivedFrom, 600ca442a4a1aabf6199e5aee09ec604e79916d9b92David Blaikie DIArray Elements, 601ca442a4a1aabf6199e5aee09ec604e79916d9b92David Blaikie MDNode *VTableHolder, 602ca442a4a1aabf6199e5aee09ec604e79916d9b92David Blaikie MDNode *TemplateParams) { 60389c83b76329ad8eb383a72f14e03dd13b5d780b7Manman Ren assert((!Context || Context.isScope() || Context.isType()) && 6046643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createClassType should be called with a valid Context"); 6056643868498043d373384e0befaff3b5a8a8574f7David Blaikie // TAG_class_type is encoded in DICompositeType format. 60687c06a843c279adf6750a044a5c54108397490fbEric Christopher Value *Elts[] = { 60787c06a843c279adf6750a044a5c54108397490fbEric Christopher GetTagConstant(VMContext, dwarf::DW_TAG_class_type), 6084776bce28cb7d669329222c3d9cf6a97d6881c96David Blaikie File.getFileNode(), 60987c06a843c279adf6750a044a5c54108397490fbEric Christopher getNonCompileUnitScope(Context), 61087c06a843c279adf6750a044a5c54108397490fbEric Christopher MDString::get(VMContext, Name), 61187c06a843c279adf6750a044a5c54108397490fbEric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 61287c06a843c279adf6750a044a5c54108397490fbEric Christopher ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 61387c06a843c279adf6750a044a5c54108397490fbEric Christopher ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 61487c06a843c279adf6750a044a5c54108397490fbEric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), OffsetInBits), 61587c06a843c279adf6750a044a5c54108397490fbEric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 61687c06a843c279adf6750a044a5c54108397490fbEric Christopher DerivedFrom, 61787c06a843c279adf6750a044a5c54108397490fbEric Christopher Elements, 61887c06a843c279adf6750a044a5c54108397490fbEric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), 0), 61987c06a843c279adf6750a044a5c54108397490fbEric Christopher VTableHolder, 62087c06a843c279adf6750a044a5c54108397490fbEric Christopher TemplateParams 62187c06a843c279adf6750a044a5c54108397490fbEric Christopher }; 622ca442a4a1aabf6199e5aee09ec604e79916d9b92David Blaikie DICompositeType R(MDNode::get(VMContext, Elts)); 62389c83b76329ad8eb383a72f14e03dd13b5d780b7Manman Ren assert(R.isCompositeType() && 62489c83b76329ad8eb383a72f14e03dd13b5d780b7Manman Ren "createClassType should return a DICompositeType"); 6256643868498043d373384e0befaff3b5a8a8574f7David Blaikie return R; 62687c06a843c279adf6750a044a5c54108397490fbEric Christopher} 62787c06a843c279adf6750a044a5c54108397490fbEric Christopher 62850d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createStructType - Create debugging information entry for a struct. 6296172f0298391e00cb669cc246e70ae2531f2cdecDavid BlaikieDICompositeType DIBuilder::createStructType(DIDescriptor Context, 6306172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie StringRef Name, DIFile File, 6316172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie unsigned LineNumber, 6326172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie uint64_t SizeInBits, 6336172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie uint64_t AlignInBits, 6346172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie unsigned Flags, DIType DerivedFrom, 6356172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie DIArray Elements, 6366172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie unsigned RunTimeLang, 6376172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie MDNode *VTableHolder) { 638fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel // TAG_structure_type is encoded in DICompositeType format. 639fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Value *Elts[] = { 640fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_structure_type), 6414776bce28cb7d669329222c3d9cf6a97d6881c96David Blaikie File.getFileNode(), 64294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Context), 643fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel MDString::get(VMContext, Name), 644fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 645fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 646fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 64743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 648fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 6496172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie DerivedFrom, 650fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Elements, 651fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang), 6526172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie VTableHolder, 653d4f92fd0d1f22af553db08416b476241e4372d9aDavid Blaikie NULL, 654fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel }; 6556643868498043d373384e0befaff3b5a8a8574f7David Blaikie DICompositeType R(MDNode::get(VMContext, Elts)); 65689c83b76329ad8eb383a72f14e03dd13b5d780b7Manman Ren assert(R.isCompositeType() && 65789c83b76329ad8eb383a72f14e03dd13b5d780b7Manman Ren "createStructType should return a DICompositeType"); 6586643868498043d373384e0befaff3b5a8a8574f7David Blaikie return R; 659fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 660fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 66150d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createUnionType - Create debugging information entry for an union. 662cf0623bba4abb8612a61229e672ac8ea8ed20c4eEric ChristopherDICompositeType DIBuilder::createUnionType(DIDescriptor Scope, StringRef Name, 663cf0623bba4abb8612a61229e672ac8ea8ed20c4eEric Christopher DIFile File, unsigned LineNumber, 664cf0623bba4abb8612a61229e672ac8ea8ed20c4eEric Christopher uint64_t SizeInBits, 665cf0623bba4abb8612a61229e672ac8ea8ed20c4eEric Christopher uint64_t AlignInBits, unsigned Flags, 666cf0623bba4abb8612a61229e672ac8ea8ed20c4eEric Christopher DIArray Elements, 667cf0623bba4abb8612a61229e672ac8ea8ed20c4eEric Christopher unsigned RunTimeLang) { 66843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel // TAG_union_type is encoded in DICompositeType format. 66943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Value *Elts[] = { 67043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_union_type), 6714776bce28cb7d669329222c3d9cf6a97d6881c96David Blaikie File.getFileNode(), 67294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Scope), 67343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel MDString::get(VMContext, Name), 67443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 67543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 67643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 67743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), 0), 67843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 679c104cf20028078e012a97b523a0dff6ab432bff7Devang Patel NULL, 68043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Elements, 68143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang), 682c656fda3aeba9fd8b09d98ed72e75b6c25a1ad49Eric Christopher Constant::getNullValue(Type::getInt32Ty(VMContext)), 683c656fda3aeba9fd8b09d98ed72e75b6c25a1ad49Eric Christopher NULL 68443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 68572dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DICompositeType(MDNode::get(VMContext, Elts)); 68643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 68743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 68850d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createSubroutineType - Create subroutine type. 689d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDICompositeType 690d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIBuilder::createSubroutineType(DIFile File, DIArray ParameterTypes) { 69143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel // TAG_subroutine_type is encoded in DICompositeType format. 69243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Value *Elts[] = { 69343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_subroutine_type), 694f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)), 695f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)), 696a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie MDString::get(VMContext, ""), 69743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 69843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), 0), 69943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), 0), 700c104cf20028078e012a97b523a0dff6ab432bff7Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), 0), 70143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 702c104cf20028078e012a97b523a0dff6ab432bff7Devang Patel NULL, 70343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ParameterTypes, 70443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 7059fdb7c085312b01924dd2d990b457cd58df2e63bBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)) 70643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 70772dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DICompositeType(MDNode::get(VMContext, Elts)); 70843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 70943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 7106c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher/// createEnumerationType - Create debugging information entry for an 71143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel/// enumeration. 712d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDICompositeType DIBuilder::createEnumerationType( 713d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber, 714d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie uint64_t SizeInBits, uint64_t AlignInBits, DIArray Elements, 7152f445be5a75b4d1a907dd694c9e5c518229df48eAdrian Prantl DIType UnderlyingType) { 71643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel // TAG_enumeration_type is encoded in DICompositeType format. 71743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Value *Elts[] = { 71843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_enumeration_type), 7194776bce28cb7d669329222c3d9cf6a97d6881c96David Blaikie File.getFileNode(), 72094c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Scope), 72143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel MDString::get(VMContext, Name), 72243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 72343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 72443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 72543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 726ce3da6f1d532c909238c14fa67cf955a404a6bc2Eli Friedman ConstantInt::get(Type::getInt32Ty(VMContext), 0), 7272f445be5a75b4d1a907dd694c9e5c518229df48eAdrian Prantl UnderlyingType, 72843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Elements, 72943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 7309fdb7c085312b01924dd2d990b457cd58df2e63bBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)) 73143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 7321f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel MDNode *Node = MDNode::get(VMContext, Elts); 73394c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel AllEnumTypes.push_back(Node); 73472dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DICompositeType(Node); 73543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 73643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 73750d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createArrayType - Create debugging information entry for an array. 738d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDICompositeType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits, 739d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie DIType Ty, DIArray Subscripts) { 74043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel // TAG_array_type is encoded in DICompositeType format. 74143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Value *Elts[] = { 74243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_array_type), 743a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie NULL, // Filename/Directory, 7441fe3f9af7ff385c28b96cc46ee1ed3737c813c3aEric Christopher NULL, // Unused 74543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel MDString::get(VMContext, ""), 74643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 74743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), Size), 74843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 74943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 75043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 75143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Ty, 75243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Subscripts, 75343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 7549fdb7c085312b01924dd2d990b457cd58df2e63bBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)) 75543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 75672dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DICompositeType(MDNode::get(VMContext, Elts)); 75743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 75843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 75950d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createVectorType - Create debugging information entry for a vector. 76037bfb18f8f0557611fbdf238abe200813f07d298Manman RenDICompositeType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits, 76137bfb18f8f0557611fbdf238abe200813f07d298Manman Ren DIType Ty, DIArray Subscripts) { 7629a1e0e252a7ede548acaac98cf304d4bb135fb97Eric Christopher 7639a1e0e252a7ede548acaac98cf304d4bb135fb97Eric Christopher // A vector is an array type with the FlagVector flag applied. 76443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Value *Elts[] = { 7659a1e0e252a7ede548acaac98cf304d4bb135fb97Eric Christopher GetTagConstant(VMContext, dwarf::DW_TAG_array_type), 766a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie NULL, // Filename/Directory, 7671fe3f9af7ff385c28b96cc46ee1ed3737c813c3aEric Christopher NULL, // Unused 76843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel MDString::get(VMContext, ""), 76943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 77043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), Size), 77143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 77243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 7739a1e0e252a7ede548acaac98cf304d4bb135fb97Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), DIType::FlagVector), 77443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Ty, 77543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Subscripts, 77643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 7779fdb7c085312b01924dd2d990b457cd58df2e63bBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)) 77843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 77937bfb18f8f0557611fbdf238abe200813f07d298Manman Ren return DICompositeType(MDNode::get(VMContext, Elts)); 78043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 781fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 78250d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createArtificialType - Create a new DIType with "artificial" flag set. 78350d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIType DIBuilder::createArtificialType(DIType Ty) { 78435fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel if (Ty.isArtificial()) 78535fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel return Ty; 78635fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 78735fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel SmallVector<Value *, 9> Elts; 78835fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel MDNode *N = Ty; 78935fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel assert (N && "Unexpected input DIType!"); 79035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { 79135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel if (Value *V = N->getOperand(i)) 79235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel Elts.push_back(V); 79335fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel else 79435fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); 79535fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel } 79635fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 79735fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel unsigned CurFlags = Ty.getFlags(); 79835fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel CurFlags = CurFlags | DIType::FlagArtificial; 79935fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 80035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel // Flags are stored at this slot. 80172dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags); 80235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 80372dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIType(MDNode::get(VMContext, Elts)); 80435fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 805fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 8061f55eb4c5766fd6a6fa53c17f7bb9e7d4ea03500Eric Christopher/// createObjectPointerType - Create a new type with both the object pointer 8071f55eb4c5766fd6a6fa53c17f7bb9e7d4ea03500Eric Christopher/// and artificial flags set. 808e521278f00cf5f4ea0cc4aac126df30924d3e705Eric ChristopherDIType DIBuilder::createObjectPointerType(DIType Ty) { 809e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher if (Ty.isObjectPointer()) 810e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher return Ty; 811e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher 812e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher SmallVector<Value *, 9> Elts; 813e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher MDNode *N = Ty; 814e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher assert (N && "Unexpected input DIType!"); 815e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { 816e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher if (Value *V = N->getOperand(i)) 817e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher Elts.push_back(V); 818e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher else 819e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); 820e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher } 821e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher 822e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher unsigned CurFlags = Ty.getFlags(); 823e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher CurFlags = CurFlags | (DIType::FlagObjectPointer | DIType::FlagArtificial); 824e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher 825e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher // Flags are stored at this slot. 82672dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags); 827e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher 82872dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIType(MDNode::get(VMContext, Elts)); 829e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher} 830e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher 8316c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher/// retainType - Retain DIType in a module even if it is not referenced 83243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel/// through debug info anchors. 83350d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patelvoid DIBuilder::retainType(DIType T) { 83494c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel AllRetainTypes.push_back(T); 83543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 83643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 83750d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createUnspecifiedParameter - Create unspeicified type descriptor 83843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel/// for the subroutine type. 83950d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIDescriptor DIBuilder::createUnspecifiedParameter() { 8406c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher Value *Elts[] = { 8416c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_parameters) 84243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 8431f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel return DIDescriptor(MDNode::get(VMContext, Elts)); 84443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 84543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 8464fe345729285ae634c657ab854057464d03220f7Eric Christopher/// createForwardDecl - Create a temporary forward-declared type that 8474fe345729285ae634c657ab854057464d03220f7Eric Christopher/// can be RAUW'd if the full type is seen. 848216432df5ac897327a0cb6323f08811910481038Eric ChristopherDIType DIBuilder::createForwardDecl(unsigned Tag, StringRef Name, 849216432df5ac897327a0cb6323f08811910481038Eric Christopher DIDescriptor Scope, DIFile F, 850ce3da6f1d532c909238c14fa67cf955a404a6bc2Eli Friedman unsigned Line, unsigned RuntimeLang, 851ce3da6f1d532c909238c14fa67cf955a404a6bc2Eli Friedman uint64_t SizeInBits, 852ce3da6f1d532c909238c14fa67cf955a404a6bc2Eli Friedman uint64_t AlignInBits) { 8534fe345729285ae634c657ab854057464d03220f7Eric Christopher // Create a temporary MDNode. 8544fe345729285ae634c657ab854057464d03220f7Eric Christopher Value *Elts[] = { 8554fe345729285ae634c657ab854057464d03220f7Eric Christopher GetTagConstant(VMContext, Tag), 8564776bce28cb7d669329222c3d9cf6a97d6881c96David Blaikie F.getFileNode(), 857216432df5ac897327a0cb6323f08811910481038Eric Christopher getNonCompileUnitScope(Scope), 8584fe345729285ae634c657ab854057464d03220f7Eric Christopher MDString::get(VMContext, Name), 8594fe345729285ae634c657ab854057464d03220f7Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), Line), 860ce3da6f1d532c909238c14fa67cf955a404a6bc2Eli Friedman ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 861ce3da6f1d532c909238c14fa67cf955a404a6bc2Eli Friedman ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 8624fe345729285ae634c657ab854057464d03220f7Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), 0), 8634fe345729285ae634c657ab854057464d03220f7Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), 8649f90e8760fda131db8311f976c6bbeb66abbaa05Eric Christopher DIDescriptor::FlagFwdDecl), 8659f90e8760fda131db8311f976c6bbeb66abbaa05Eric Christopher NULL, 8669f90e8760fda131db8311f976c6bbeb66abbaa05Eric Christopher DIArray(), 8679f90e8760fda131db8311f976c6bbeb66abbaa05Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang) 8684fe345729285ae634c657ab854057464d03220f7Eric Christopher }; 8694fe345729285ae634c657ab854057464d03220f7Eric Christopher MDNode *Node = MDNode::getTemporary(VMContext, Elts); 87088328d2ff47670314a1007a4c81c42adf026ee9fManman Ren DIType RetTy(Node); 87188328d2ff47670314a1007a4c81c42adf026ee9fManman Ren assert(RetTy.isType() && 87289c83b76329ad8eb383a72f14e03dd13b5d780b7Manman Ren "createForwardDecl result should be a DIType"); 87388328d2ff47670314a1007a4c81c42adf026ee9fManman Ren return RetTy; 8744fe345729285ae634c657ab854057464d03220f7Eric Christopher} 8754fe345729285ae634c657ab854057464d03220f7Eric Christopher 87650d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// getOrCreateArray - Get a DIArray, create one if required. 877685501836bc60f53892854253b5bbea6c48b6d7fJay FoadDIArray DIBuilder::getOrCreateArray(ArrayRef<Value *> Elements) { 878685501836bc60f53892854253b5bbea6c48b6d7fJay Foad if (Elements.empty()) { 879f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Value *Null = Constant::getNullValue(Type::getInt32Ty(VMContext)); 880ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad return DIArray(MDNode::get(VMContext, Null)); 881fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel } 882685501836bc60f53892854253b5bbea6c48b6d7fJay Foad return DIArray(MDNode::get(VMContext, Elements)); 883fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 884fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 88550d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// getOrCreateSubrange - Create a descriptor for a value range. This 88643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel/// implicitly uniques the values returned. 8879493dae613847b01b79914502f337814fe3e00acBill WendlingDISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) { 88843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Value *Elts[] = { 88943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_subrange_type), 89043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), Lo), 891a7645a3c66668da5e2bc772a8e5ab03dc301610cBill Wendling ConstantInt::get(Type::getInt64Ty(VMContext), Count) 89243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 89343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 8941f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel return DISubrange(MDNode::get(VMContext, Elts)); 89543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 89643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 8973fac43d8b4111feca59d77941ac2ebd1f858dd33David Blaikie/// \brief Create a new descriptor for the specified global. 898fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang PatelDIGlobalVariable DIBuilder:: 8993fac43d8b4111feca59d77941ac2ebd1f858dd33David BlaikiecreateGlobalVariable(StringRef Name, StringRef LinkageName, DIFile F, 9003fac43d8b4111feca59d77941ac2ebd1f858dd33David Blaikie unsigned LineNumber, DIType Ty, bool isLocalToUnit, 9013fac43d8b4111feca59d77941ac2ebd1f858dd33David Blaikie Value *Val) { 902fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Value *Elts[] = { 903fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_variable), 904f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)), 90594c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel NULL, // TheCU, 906fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel MDString::get(VMContext, Name), 907fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel MDString::get(VMContext, Name), 9083fac43d8b4111feca59d77941ac2ebd1f858dd33David Blaikie MDString::get(VMContext, LinkageName), 909fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel F, 910fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 911fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Ty, 912fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit), 913fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/ 9146b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher Val, 9156b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher DIDescriptor() 916fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel }; 9171f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel MDNode *Node = MDNode::get(VMContext, Elts); 91894c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel AllGVs.push_back(Node); 919fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel return DIGlobalVariable(Node); 920fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 921fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 9223fac43d8b4111feca59d77941ac2ebd1f858dd33David Blaikie/// \brief Create a new descriptor for the specified global. 9233fac43d8b4111feca59d77941ac2ebd1f858dd33David BlaikieDIGlobalVariable DIBuilder:: 9243fac43d8b4111feca59d77941ac2ebd1f858dd33David BlaikiecreateGlobalVariable(StringRef Name, DIFile F, unsigned LineNumber, 9253fac43d8b4111feca59d77941ac2ebd1f858dd33David Blaikie DIType Ty, bool isLocalToUnit, Value *Val) { 9263fac43d8b4111feca59d77941ac2ebd1f858dd33David Blaikie return createGlobalVariable(Name, Name, F, LineNumber, Ty, isLocalToUnit, 9273fac43d8b4111feca59d77941ac2ebd1f858dd33David Blaikie Val); 9283fac43d8b4111feca59d77941ac2ebd1f858dd33David Blaikie} 9293fac43d8b4111feca59d77941ac2ebd1f858dd33David Blaikie 93050d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createStaticVariable - Create a new descriptor for the specified static 931fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel/// variable. 932fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang PatelDIGlobalVariable DIBuilder:: 9336c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric ChristophercreateStaticVariable(DIDescriptor Context, StringRef Name, 9346c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher StringRef LinkageName, DIFile F, unsigned LineNumber, 9356b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher DIType Ty, bool isLocalToUnit, Value *Val, MDNode *Decl) { 936fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Value *Elts[] = { 937fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_variable), 938f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)), 93994c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Context), 940fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel MDString::get(VMContext, Name), 941fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel MDString::get(VMContext, Name), 942fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel MDString::get(VMContext, LinkageName), 943fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel F, 944fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 945fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Ty, 946fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit), 947fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/ 9486b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher Val, 9496b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher DIDescriptor(Decl) 950fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel }; 9511f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel MDNode *Node = MDNode::get(VMContext, Elts); 95294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel AllGVs.push_back(Node); 953fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel return DIGlobalVariable(Node); 954fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 955fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 95650d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createVariable - Create a new descriptor for the specified variable. 95750d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope, 95848f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel StringRef Name, DIFile File, 9596c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher unsigned LineNo, DIType Ty, 960e9e16c5f52c4a093f4de234d448cdebedab8938eDevang Patel bool AlwaysPreserve, unsigned Flags, 961e9e16c5f52c4a093f4de234d448cdebedab8938eDevang Patel unsigned ArgNo) { 9626643868498043d373384e0befaff3b5a8a8574f7David Blaikie DIDescriptor Context(getNonCompileUnitScope(Scope)); 96389c83b76329ad8eb383a72f14e03dd13b5d780b7Manman Ren assert((!Context || Context.isScope()) && 9646643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createLocalVariable should be called with a valid Context"); 96589c83b76329ad8eb383a72f14e03dd13b5d780b7Manman Ren assert(Ty.isType() && 9666643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createLocalVariable should be called with a valid type"); 96748f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel Value *Elts[] = { 96848f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel GetTagConstant(VMContext, Tag), 96994c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Scope), 97048f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel MDString::get(VMContext, Name), 97148f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel File, 972e9e16c5f52c4a093f4de234d448cdebedab8938eDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), (LineNo | (ArgNo << 24))), 97348f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel Ty, 97423336b449eee301f4c4dcabbd75dedf3c75c30fcDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 9759fdb7c085312b01924dd2d990b457cd58df2e63bBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)) 97648f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel }; 9771f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel MDNode *Node = MDNode::get(VMContext, Elts); 97848f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel if (AlwaysPreserve) { 97948f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel // The optimizer may remove local variable. If there is an interest 98048f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel // to preserve variable info in such situation then stash it in a 98148f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel // named mdnode. 98248f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel DISubprogram Fn(getDISubprogram(Scope)); 98393d39be5300702d8c9892ec04a492a6056926462Devang Patel NamedMDNode *FnLocals = getOrInsertFnSpecificMDNode(M, Fn); 98448f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel FnLocals->addOperand(Node); 98548f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel } 98688328d2ff47670314a1007a4c81c42adf026ee9fManman Ren DIVariable RetVar(Node); 98788328d2ff47670314a1007a4c81c42adf026ee9fManman Ren assert(RetVar.isVariable() && 98889c83b76329ad8eb383a72f14e03dd13b5d780b7Manman Ren "createLocalVariable should return a valid DIVariable"); 98988328d2ff47670314a1007a4c81c42adf026ee9fManman Ren return RetVar; 99048f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel} 99148f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel 99250d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createComplexVariable - Create a new descriptor for the specified variable 993fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel/// which has a complex address expression for its address. 99450d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIVariable DIBuilder::createComplexVariable(unsigned Tag, DIDescriptor Scope, 995fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel StringRef Name, DIFile F, 996fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel unsigned LineNo, 997685501836bc60f53892854253b5bbea6c48b6d7fJay Foad DIType Ty, ArrayRef<Value *> Addr, 998685501836bc60f53892854253b5bbea6c48b6d7fJay Foad unsigned ArgNo) { 999fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel SmallVector<Value *, 15> Elts; 1000fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Elts.push_back(GetTagConstant(VMContext, Tag)); 100194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel Elts.push_back(getNonCompileUnitScope(Scope)), 1002fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Elts.push_back(MDString::get(VMContext, Name)); 1003fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Elts.push_back(F); 10046c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher Elts.push_back(ConstantInt::get(Type::getInt32Ty(VMContext), 10059f99721a1882cdef9f7cca25de7ea43627d23958Devang Patel (LineNo | (ArgNo << 24)))); 1006fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Elts.push_back(Ty); 1007f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); 1008f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); 1009685501836bc60f53892854253b5bbea6c48b6d7fJay Foad Elts.append(Addr.begin(), Addr.end()); 1010fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 10111f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel return DIVariable(MDNode::get(VMContext, Elts)); 1012fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 1013fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 101450d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createFunction - Create a new descriptor for the specified function. 101550d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDISubprogram DIBuilder::createFunction(DIDescriptor Context, 101644498a640daa827220bc4758770190318f0ec69fDevang Patel StringRef Name, 101744498a640daa827220bc4758770190318f0ec69fDevang Patel StringRef LinkageName, 101844498a640daa827220bc4758770190318f0ec69fDevang Patel DIFile File, unsigned LineNo, 10193d33184d9da02fb699827249e0631106252f72faDavid Blaikie DICompositeType Ty, 102044498a640daa827220bc4758770190318f0ec69fDevang Patel bool isLocalToUnit, bool isDefinition, 10216126a1e1894f346fae02a514a20aa56b879aeb99Eric Christopher unsigned ScopeLine, 102244498a640daa827220bc4758770190318f0ec69fDevang Patel unsigned Flags, bool isOptimized, 1023da19475328ece3da19437a2e9eef035dcafa2814Devang Patel Function *Fn, 10245e06bb83f4d7b1b86659ad851324350afb04f5b0Devang Patel MDNode *TParams, 10255e06bb83f4d7b1b86659ad851324350afb04f5b0Devang Patel MDNode *Decl) { 10263d33184d9da02fb699827249e0631106252f72faDavid Blaikie assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type && 10273d33184d9da02fb699827249e0631106252f72faDavid Blaikie "function types should be subroutines"); 102893d39be5300702d8c9892ec04a492a6056926462Devang Patel Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) }; 102944498a640daa827220bc4758770190318f0ec69fDevang Patel Value *Elts[] = { 103044498a640daa827220bc4758770190318f0ec69fDevang Patel GetTagConstant(VMContext, dwarf::DW_TAG_subprogram), 1031bb4e619cd9ff34708e3baaf0aac70275a917e0baDavid Blaikie File.getFileNode(), 103294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Context), 103344498a640daa827220bc4758770190318f0ec69fDevang Patel MDString::get(VMContext, Name), 103444498a640daa827220bc4758770190318f0ec69fDevang Patel MDString::get(VMContext, Name), 103544498a640daa827220bc4758770190318f0ec69fDevang Patel MDString::get(VMContext, LinkageName), 103644498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 103744498a640daa827220bc4758770190318f0ec69fDevang Patel Ty, 103844498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit), 103944498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition), 104044498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 104144498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 10429642c57ac5a6991cbd06d02f790c478eb3071ad3Devang Patel NULL, 104344498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 104444498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized), 1045da19475328ece3da19437a2e9eef035dcafa2814Devang Patel Fn, 10465e06bb83f4d7b1b86659ad851324350afb04f5b0Devang Patel TParams, 104793d39be5300702d8c9892ec04a492a6056926462Devang Patel Decl, 1048f839eed5ea2bfd395256d60e15d1e31dbad6ca8bDavid Blaikie MDNode::getTemporary(VMContext, TElts), 10496126a1e1894f346fae02a514a20aa56b879aeb99Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), ScopeLine) 105044498a640daa827220bc4758770190318f0ec69fDevang Patel }; 10511f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel MDNode *Node = MDNode::get(VMContext, Elts); 105244498a640daa827220bc4758770190318f0ec69fDevang Patel 105344498a640daa827220bc4758770190318f0ec69fDevang Patel // Create a named metadata so that we do not lose this mdnode. 1054139f7e50688ce120b275ae368f563d03d9c18184David Blaikie if (isDefinition) 1055139f7e50688ce120b275ae368f563d03d9c18184David Blaikie AllSubprograms.push_back(Node); 1056ebb5183a2f16abc7c88241bb42412465f52c2a61David Blaikie DISubprogram S(Node); 105789c83b76329ad8eb383a72f14e03dd13b5d780b7Manman Ren assert(S.isSubprogram() && "createFunction should return a valid DISubprogram"); 1058ebb5183a2f16abc7c88241bb42412465f52c2a61David Blaikie return S; 105944498a640daa827220bc4758770190318f0ec69fDevang Patel} 106044498a640daa827220bc4758770190318f0ec69fDevang Patel 106150d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createMethod - Create a new descriptor for the specified C++ method. 106250d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDISubprogram DIBuilder::createMethod(DIDescriptor Context, 106344498a640daa827220bc4758770190318f0ec69fDevang Patel StringRef Name, 106444498a640daa827220bc4758770190318f0ec69fDevang Patel StringRef LinkageName, 106544498a640daa827220bc4758770190318f0ec69fDevang Patel DIFile F, 10663d33184d9da02fb699827249e0631106252f72faDavid Blaikie unsigned LineNo, DICompositeType Ty, 106744498a640daa827220bc4758770190318f0ec69fDevang Patel bool isLocalToUnit, 106844498a640daa827220bc4758770190318f0ec69fDevang Patel bool isDefinition, 106944498a640daa827220bc4758770190318f0ec69fDevang Patel unsigned VK, unsigned VIndex, 107044498a640daa827220bc4758770190318f0ec69fDevang Patel MDNode *VTableHolder, 107144498a640daa827220bc4758770190318f0ec69fDevang Patel unsigned Flags, 107244498a640daa827220bc4758770190318f0ec69fDevang Patel bool isOptimized, 1073da19475328ece3da19437a2e9eef035dcafa2814Devang Patel Function *Fn, 1074da19475328ece3da19437a2e9eef035dcafa2814Devang Patel MDNode *TParam) { 10753d33184d9da02fb699827249e0631106252f72faDavid Blaikie assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type && 10763d33184d9da02fb699827249e0631106252f72faDavid Blaikie "function types should be subroutines"); 107793d39be5300702d8c9892ec04a492a6056926462Devang Patel Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) }; 107844498a640daa827220bc4758770190318f0ec69fDevang Patel Value *Elts[] = { 107944498a640daa827220bc4758770190318f0ec69fDevang Patel GetTagConstant(VMContext, dwarf::DW_TAG_subprogram), 1080bb4e619cd9ff34708e3baaf0aac70275a917e0baDavid Blaikie F.getFileNode(), 108194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Context), 108244498a640daa827220bc4758770190318f0ec69fDevang Patel MDString::get(VMContext, Name), 108344498a640daa827220bc4758770190318f0ec69fDevang Patel MDString::get(VMContext, Name), 108444498a640daa827220bc4758770190318f0ec69fDevang Patel MDString::get(VMContext, LinkageName), 108544498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 108644498a640daa827220bc4758770190318f0ec69fDevang Patel Ty, 108744498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit), 108844498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition), 108944498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), (unsigned)VK), 109044498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), VIndex), 109144498a640daa827220bc4758770190318f0ec69fDevang Patel VTableHolder, 109244498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 109344498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized), 1094da19475328ece3da19437a2e9eef035dcafa2814Devang Patel Fn, 1095da19475328ece3da19437a2e9eef035dcafa2814Devang Patel TParam, 1096f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)), 1097f839eed5ea2bfd395256d60e15d1e31dbad6ca8bDavid Blaikie MDNode::getTemporary(VMContext, TElts), 109825016527f96a759c125d71025d23718fa2cc55caEric Christopher // FIXME: Do we want to use different scope/lines? 10996126a1e1894f346fae02a514a20aa56b879aeb99Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), LineNo) 110044498a640daa827220bc4758770190318f0ec69fDevang Patel }; 11011f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel MDNode *Node = MDNode::get(VMContext, Elts); 1102139f7e50688ce120b275ae368f563d03d9c18184David Blaikie if (isDefinition) 1103139f7e50688ce120b275ae368f563d03d9c18184David Blaikie AllSubprograms.push_back(Node); 1104ebb5183a2f16abc7c88241bb42412465f52c2a61David Blaikie DISubprogram S(Node); 110589c83b76329ad8eb383a72f14e03dd13b5d780b7Manman Ren assert(S.isSubprogram() && "createMethod should return a valid DISubprogram"); 1106ebb5183a2f16abc7c88241bb42412465f52c2a61David Blaikie return S; 110744498a640daa827220bc4758770190318f0ec69fDevang Patel} 110844498a640daa827220bc4758770190318f0ec69fDevang Patel 110950d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createNameSpace - This creates new descriptor for a namespace 1110fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel/// with the specified parent scope. 111150d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name, 1112fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel DIFile File, unsigned LineNo) { 1113fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Value *Elts[] = { 1114fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_namespace), 11156115ed0e4347f17504f72e4d37545b4230b2cb50David Blaikie File.getFileNode(), 111694c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Scope), 1117fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel MDString::get(VMContext, Name), 1118fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNo) 1119fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel }; 11206643868498043d373384e0befaff3b5a8a8574f7David Blaikie DINameSpace R(MDNode::get(VMContext, Elts)); 11216643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert(R.Verify() && 11226643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createNameSpace should return a verifiable DINameSpace"); 11236643868498043d373384e0befaff3b5a8a8574f7David Blaikie return R; 1124fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 1125fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 11266618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher/// createLexicalBlockFile - This creates a new MDNode that encapsulates 11276618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher/// an existing scope with a new filename. 11286618a241f7ba2571a1a55b3733c4441d467baf42Eric ChristopherDILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope, 11299f99721a1882cdef9f7cca25de7ea43627d23958Devang Patel DIFile File) { 11306618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher Value *Elts[] = { 11316618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block), 11328faed2745c849fb35f6edf411263dfa564ef3643David Blaikie File.getFileNode(), 11337b246860bdf4c6b3ea4e09f6437537941cc0d1d4David Blaikie Scope 11346618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher }; 11356643868498043d373384e0befaff3b5a8a8574f7David Blaikie DILexicalBlockFile R(MDNode::get(VMContext, Elts)); 11366643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert( 11376643868498043d373384e0befaff3b5a8a8574f7David Blaikie R.Verify() && 11386643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createLexicalBlockFile should return a verifiable DILexicalBlockFile"); 11396643868498043d373384e0befaff3b5a8a8574f7David Blaikie return R; 11406618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher} 11416618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher 114250d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File, 114343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel unsigned Line, unsigned Col) { 1144e06db0c6f83c284814a89d5b9792cba7209977d9Adrian Prantl // Defeat MDNode uniquing for lexical blocks by using unique id. 114543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel static unsigned int unique_id = 0; 114643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Value *Elts[] = { 114743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block), 11484b52a88e90b341ff2a3d1dbad6eb5ea731228156David Blaikie File.getFileNode(), 114994c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Scope), 115043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Line), 115143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Col), 115243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++) 115343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 11546643868498043d373384e0befaff3b5a8a8574f7David Blaikie DILexicalBlock R(MDNode::get(VMContext, Elts)); 11556643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert(R.Verify() && 11566643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createLexicalBlock should return a verifiable DILexicalBlock"); 11576643868498043d373384e0befaff3b5a8a8574f7David Blaikie return R; 115843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 115943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 116050d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call. 116150d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelInstruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo, 1162fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Instruction *InsertBefore) { 1163fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel assert(Storage && "no storage passed to dbg.declare"); 1164da91817d40dad85a15e0f2a7e11d4d302949586bManman Ren assert(VarInfo.isVariable() && 1165da91817d40dad85a15e0f2a7e11d4d302949586bManman Ren "empty or invalid DIVariable passed to dbg.declare"); 1166fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel if (!DeclareFn) 1167fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare); 1168fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 1169ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo }; 1170a3efbb15ddd5aa9006564cd79086723640084878Jay Foad return CallInst::Create(DeclareFn, Args, "", InsertBefore); 1171fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 1172fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 117350d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call. 117450d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelInstruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo, 1175fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel BasicBlock *InsertAtEnd) { 1176fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel assert(Storage && "no storage passed to dbg.declare"); 1177da91817d40dad85a15e0f2a7e11d4d302949586bManman Ren assert(VarInfo.isVariable() && 1178da91817d40dad85a15e0f2a7e11d4d302949586bManman Ren "empty or invalid DIVariable passed to dbg.declare"); 1179fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel if (!DeclareFn) 1180fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare); 1181fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 1182ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo }; 1183fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 1184fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel // If this block already has a terminator then insert this intrinsic 1185fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel // before the terminator. 1186fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel if (TerminatorInst *T = InsertAtEnd->getTerminator()) 1187a3efbb15ddd5aa9006564cd79086723640084878Jay Foad return CallInst::Create(DeclareFn, Args, "", T); 1188fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel else 1189a3efbb15ddd5aa9006564cd79086723640084878Jay Foad return CallInst::Create(DeclareFn, Args, "", InsertAtEnd); 1190fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 1191fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 119250d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call. 119350d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelInstruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset, 1194fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel DIVariable VarInfo, 1195fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Instruction *InsertBefore) { 1196fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel assert(V && "no value passed to dbg.value"); 1197da91817d40dad85a15e0f2a7e11d4d302949586bManman Ren assert(VarInfo.isVariable() && 1198da91817d40dad85a15e0f2a7e11d4d302949586bManman Ren "empty or invalid DIVariable passed to dbg.value"); 1199fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel if (!ValueFn) 1200fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value); 1201fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 1202ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad Value *Args[] = { MDNode::get(V->getContext(), V), 1203fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset), 1204fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel VarInfo }; 1205a3efbb15ddd5aa9006564cd79086723640084878Jay Foad return CallInst::Create(ValueFn, Args, "", InsertBefore); 1206fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 1207fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 120850d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call. 120950d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelInstruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset, 1210fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel DIVariable VarInfo, 1211fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel BasicBlock *InsertAtEnd) { 1212fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel assert(V && "no value passed to dbg.value"); 1213da91817d40dad85a15e0f2a7e11d4d302949586bManman Ren assert(VarInfo.isVariable() && 1214da91817d40dad85a15e0f2a7e11d4d302949586bManman Ren "empty or invalid DIVariable passed to dbg.value"); 1215fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel if (!ValueFn) 1216fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value); 1217fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 1218ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad Value *Args[] = { MDNode::get(V->getContext(), V), 1219fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset), 1220fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel VarInfo }; 1221a3efbb15ddd5aa9006564cd79086723640084878Jay Foad return CallInst::Create(ValueFn, Args, "", InsertAtEnd); 1222fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 1223