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) 336c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher : M(m), VMContext(M.getContext()), TheCU(0), 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); 6494c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel} 6594c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel 666c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher/// getNonCompileUnitScope - If N is compile unit return NULL otherwise return 676c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher/// N. 6894c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patelstatic MDNode *getNonCompileUnitScope(MDNode *N) { 6994c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel if (DIDescriptor(N).isCompileUnit()) 7094c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel return NULL; 7194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel return N; 726326a4238df05dafd7547cfa2cd71111cd6702a6Devang Patel} 736326a4238df05dafd7547cfa2cd71111cd6702a6Devang Patel 7450d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createCompileUnit - A CompileUnit provides an anchor for all debugging 7535fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel/// information generated during this instance of compilation. 766c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christophervoid DIBuilder::createCompileUnit(unsigned Lang, StringRef Filename, 776c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher StringRef Directory, StringRef Producer, 786c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher bool isOptimized, StringRef Flags, 79e4b67906d3cc5ea365359f9b034189aaa51ca1e9Eric Christopher unsigned RunTimeVer, StringRef SplitName) { 80b0dc4d995cbb09e762ce56d7ae754dd042bafab0Chandler Carruth assert(((Lang <= dwarf::DW_LANG_Python && Lang >= dwarf::DW_LANG_C89) || 81b0dc4d995cbb09e762ce56d7ae754dd042bafab0Chandler Carruth (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) && 82b0dc4d995cbb09e762ce56d7ae754dd042bafab0Chandler Carruth "Invalid Language tag"); 83b0dc4d995cbb09e762ce56d7ae754dd042bafab0Chandler Carruth assert(!Filename.empty() && 84b0dc4d995cbb09e762ce56d7ae754dd042bafab0Chandler Carruth "Unable to create compile unit without filename"); 8594c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) }; 8694c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel TempEnumTypes = MDNode::getTemporary(VMContext, TElts); 8794c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel 8894c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel TempRetainTypes = MDNode::getTemporary(VMContext, TElts); 8994c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel 9094c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel TempSubprograms = MDNode::getTemporary(VMContext, TElts); 9194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel 9294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel TempGVs = MDNode::getTemporary(VMContext, TElts); 9394c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel 9442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 9542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_compile_unit), 96f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)), 9742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), Lang), 98de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie createFile(Filename, Directory), 9942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Producer), 10042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized), 10142c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Flags), 10294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeVer), 103a8eefc7cc7c6e8be06d570fff76dc42b43a23392David Blaikie TempEnumTypes, 104a8eefc7cc7c6e8be06d570fff76dc42b43a23392David Blaikie TempRetainTypes, 105a8eefc7cc7c6e8be06d570fff76dc42b43a23392David Blaikie TempSubprograms, 106e4b67906d3cc5ea365359f9b034189aaa51ca1e9Eric Christopher TempGVs, 107e4b67906d3cc5ea365359f9b034189aaa51ca1e9Eric Christopher MDString::get(VMContext, SplitName) 10842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 1091f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel TheCU = DICompileUnit(MDNode::get(VMContext, Elts)); 110464f4ef2bdb47a44ffa2c4208296da641db7358dDevang Patel 111464f4ef2bdb47a44ffa2c4208296da641db7358dDevang Patel // Create a named metadata so that it is easier to find cu in a module. 112464f4ef2bdb47a44ffa2c4208296da641db7358dDevang Patel NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu"); 113464f4ef2bdb47a44ffa2c4208296da641db7358dDevang Patel NMD->addOperand(TheCU); 11435fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 11535fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 11650d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createFile - Create a file descriptor to hold debugging information 11735fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel/// for a file. 11850d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIFile DIBuilder::createFile(StringRef Filename, StringRef Directory) { 119811ae5b09cc2727e9a7a8748c6124d5bbd30707fDevang Patel assert(!Filename.empty() && "Unable to create file without name"); 1204d0cdca6f6e73c38115cfd1e9770cb78006077d6David Blaikie Value *Pair[] = { 12142c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Filename), 12242c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Directory), 12342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 124b4cf0ab22b5a3ebb720f0b7287fdccfb465b6b7cDavid Blaikie Value *Elts[] = { 125b4cf0ab22b5a3ebb720f0b7287fdccfb465b6b7cDavid Blaikie GetTagConstant(VMContext, dwarf::DW_TAG_file_type), 126b4cf0ab22b5a3ebb720f0b7287fdccfb465b6b7cDavid Blaikie MDNode::get(VMContext, Pair) 127b4cf0ab22b5a3ebb720f0b7287fdccfb465b6b7cDavid Blaikie }; 1281f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel return DIFile(MDNode::get(VMContext, Elts)); 12935fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 13035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 13150d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createEnumerator - Create a single enumerator value. 13250d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIEnumerator DIBuilder::createEnumerator(StringRef Name, uint64_t Val) { 133811ae5b09cc2727e9a7a8748c6124d5bbd30707fDevang Patel assert(!Name.empty() && "Unable to create enumerator without name"); 13442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 13542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_enumerator), 13642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Name), 13742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), Val) 13842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 1391f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel return DIEnumerator(MDNode::get(VMContext, Elts)); 14035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 14135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 142734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel/// createNullPtrType - Create C++0x nullptr type. 143734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang PatelDIType DIBuilder::createNullPtrType(StringRef Name) { 144734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel assert(!Name.empty() && "Unable to create type without name"); 145734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel // nullptr is encoded in DIBasicType format. Line number, filename, 146734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel // ,size, alignment, offset and flags are always empty here. 147734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel Value *Elts[] = { 148734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_type), 149734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel NULL, //TheCU, 150734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel MDString::get(VMContext, Name), 151734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel NULL, // Filename 152734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 153734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 154734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 155734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 156734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags; 1579fdb7c085312b01924dd2d990b457cd58df2e63bBill Wendling ConstantInt::get(Type::getInt32Ty(VMContext), 0) // Encoding 158734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel }; 159734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel return DIType(MDNode::get(VMContext, Elts)); 160734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel} 161734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel 1626c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher/// createBasicType - Create debugging information entry for a basic 16335fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel/// type, e.g 'char'. 1642ce067a9fb5b2d046c92519428cafa71fae81ed4David BlaikieDIBasicType 1652ce067a9fb5b2d046c92519428cafa71fae81ed4David BlaikieDIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits, 1662ce067a9fb5b2d046c92519428cafa71fae81ed4David Blaikie uint64_t AlignInBits, unsigned Encoding) { 167811ae5b09cc2727e9a7a8748c6124d5bbd30707fDevang Patel assert(!Name.empty() && "Unable to create type without name"); 16835fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel // Basic types are encoded in DIBasicType format. Line number, filename, 16935fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel // offset and flags are always empty here. 17042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 17142c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_base_type), 17294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel NULL, //TheCU, 17342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Name), 17442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer NULL, // Filename 17542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 17642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 17742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 17842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 17942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags; 18042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), Encoding) 18142c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 1822ce067a9fb5b2d046c92519428cafa71fae81ed4David Blaikie return DIBasicType(MDNode::get(VMContext, Elts)); 18335fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 18435fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 185ffab7d0c4f581297e8bc1515eeb34e1b12b650c4Nick Lewycky/// createQualifiedType - Create debugging information entry for a qualified 18635fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel/// type, e.g. 'const int'. 187d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIDerivedType DIBuilder::createQualifiedType(unsigned Tag, DIType FromTy) { 18842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer // Qualified types are encoded in DIDerivedType format. 18942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 19042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, Tag), 19194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel NULL, //TheCU, 19242c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, StringRef()), // Empty name. 19342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer NULL, // Filename 19442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 19542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 19642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 19742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 19842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 19942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer FromTy 20042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 201d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie return DIDerivedType(MDNode::get(VMContext, Elts)); 20235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 20335fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 20450d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createPointerType - Create debugging information entry for a pointer. 205d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIDerivedType 206d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIBuilder::createPointerType(DIType PointeeTy, uint64_t SizeInBits, 207d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie uint64_t AlignInBits, StringRef Name) { 20842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer // Pointer types are encoded in DIDerivedType format. 20942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 21042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_pointer_type), 21194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel NULL, //TheCU, 21242c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Name), 21342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer NULL, // Filename 21442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 21542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 21642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 21742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 21842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 21942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer PointeeTy 22042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 221d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie return DIDerivedType(MDNode::get(VMContext, Elts)); 22235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 22335fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 224d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIDerivedType DIBuilder::createMemberPointerType(DIType PointeeTy, DIType Base) { 22562fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie // Pointer types are encoded in DIDerivedType format. 22662fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie Value *Elts[] = { 22762fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie GetTagConstant(VMContext, dwarf::DW_TAG_ptr_to_member_type), 22862fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie NULL, //TheCU, 22962fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie NULL, 23062fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie NULL, // Filename 23162fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 23262fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie ConstantInt::get(Type::getInt64Ty(VMContext), 0), 23362fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie ConstantInt::get(Type::getInt64Ty(VMContext), 0), 23462fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 23562fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 23662fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie PointeeTy, 23762fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie Base 23862fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie }; 239d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie return DIDerivedType(MDNode::get(VMContext, Elts)); 24062fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie} 24162fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie 242791e629deef7e4a410e67527da26405916415d3aEric Christopher/// createReferenceType - Create debugging information entry for a reference 243791e629deef7e4a410e67527da26405916415d3aEric Christopher/// type. 244d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIDerivedType DIBuilder::createReferenceType(unsigned Tag, DIType RTy) { 245811ae5b09cc2727e9a7a8748c6124d5bbd30707fDevang Patel assert(RTy.Verify() && "Unable to create reference type"); 24642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer // References are encoded in DIDerivedType format. 24742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 248791e629deef7e4a410e67527da26405916415d3aEric Christopher GetTagConstant(VMContext, Tag), 2496c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher NULL, // TheCU, 25042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer NULL, // Name 25142c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer NULL, // Filename 25242c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 25342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 25442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 25542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 25642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 25742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer RTy 25842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 259d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie return DIDerivedType(MDNode::get(VMContext, Elts)); 26035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 26135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 26250d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createTypedef - Create debugging information entry for a typedef. 263d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIDerivedType DIBuilder::createTypedef(DIType Ty, StringRef Name, DIFile File, 264d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie unsigned LineNo, DIDescriptor Context) { 26542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer // typedefs are encoded in DIDerivedType format. 26642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer assert(Ty.Verify() && "Invalid typedef type!"); 26742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 26842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_typedef), 26994c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Context), 27042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Name), 27142c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer File, 27242c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 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 Ty 27842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 279d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie return DIDerivedType(MDNode::get(VMContext, Elts)); 28035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 28135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 28250d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createFriend - Create debugging information entry for a 'friend'. 28350d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIType DIBuilder::createFriend(DIType Ty, DIType FriendTy) { 28442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer // typedefs are encoded in DIDerivedType format. 28542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer assert(Ty.Verify() && "Invalid type!"); 28642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer assert(FriendTy.Verify() && "Invalid friend type!"); 28742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 28842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_friend), 28942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Ty, 29042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer NULL, // Name 29142c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Ty.getFile(), 29242c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 29342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 29442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 29542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 29642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 29742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer FriendTy 29842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 2991f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel return DIType(MDNode::get(VMContext, Elts)); 30035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 30135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 30250d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createInheritance - Create debugging information entry to establish 303c27c7342aa5ce43c700364f1ce72272b3649aa6eEric Christopher/// inheritance relationship between two types. 304d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIDerivedType DIBuilder::createInheritance( 305d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie DIType Ty, DIType BaseTy, uint64_t BaseOffset, unsigned Flags) { 306811ae5b09cc2727e9a7a8748c6124d5bbd30707fDevang Patel assert(Ty.Verify() && "Unable to create inheritance"); 30742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer // TAG_inheritance is encoded in DIDerivedType format. 30842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 30942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_inheritance), 31042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Ty, 31142c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer NULL, // Name 312b351ebf7fc94887f997aa3f08bdfd3750f0c8af5Devang Patel Ty.getFile(), 31342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 31442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 31542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 31642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), BaseOffset), 31742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 31842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer BaseTy 31942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 320d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie return DIDerivedType(MDNode::get(VMContext, Elts)); 32135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 32235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 32350d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createMemberType - Create debugging information entry for a member. 324d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIDerivedType DIBuilder::createMemberType( 325d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber, 326d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie uint64_t SizeInBits, uint64_t AlignInBits, uint64_t OffsetInBits, 327d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie unsigned Flags, DIType Ty) { 32842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer // TAG_member is encoded in DIDerivedType format. 32942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 33042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_member), 33194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Scope), 33242c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Name), 333fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel File, 33442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 33542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 33642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 33742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits), 33842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 33942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Ty 34042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 341d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie return DIDerivedType(MDNode::get(VMContext, Elts)); 34235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 34335fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 3446b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher/// createStaticMemberType - Create debugging information entry for a 3456b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher/// C++ static data member. 3466b6061f01171bd3d4e32022efa45428d4f9941eeEric ChristopherDIType DIBuilder::createStaticMemberType(DIDescriptor Scope, StringRef Name, 3476b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher DIFile File, unsigned LineNumber, 3486b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher DIType Ty, unsigned Flags, 3496b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher llvm::Value *Val) { 3506b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher // TAG_member is encoded in DIDerivedType format. 3516b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher Flags |= DIDescriptor::FlagStaticMember; 3526b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher Value *Elts[] = { 3536b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher GetTagConstant(VMContext, dwarf::DW_TAG_member), 3546b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher getNonCompileUnitScope(Scope), 3556b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher MDString::get(VMContext, Name), 3566b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher File, 3576b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 3586b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher ConstantInt::get(Type::getInt64Ty(VMContext), 0/*SizeInBits*/), 3596b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher ConstantInt::get(Type::getInt64Ty(VMContext), 0/*AlignInBits*/), 3606b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher ConstantInt::get(Type::getInt64Ty(VMContext), 0/*OffsetInBits*/), 3616b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 3626b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher Ty, 3636b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher Val 3646b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher }; 3656b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher return DIType(MDNode::get(VMContext, Elts)); 3666b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher} 3676b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher 368e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel/// createObjCIVar - Create debugging information entry for Objective-C 369e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel/// instance variable. 3706c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric ChristopherDIType DIBuilder::createObjCIVar(StringRef Name, 3716c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher DIFile File, unsigned LineNumber, 372e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel uint64_t SizeInBits, uint64_t AlignInBits, 3736c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher uint64_t OffsetInBits, unsigned Flags, 374e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel DIType Ty, StringRef PropertyName, 375e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel StringRef GetterName, StringRef SetterName, 376e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel unsigned PropertyAttributes) { 377e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel // TAG_member is encoded in DIDerivedType format. 378e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel Value *Elts[] = { 379e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_member), 38094c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(File), 381e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel MDString::get(VMContext, Name), 382e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel File, 383e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 384e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 385e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 386e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits), 387e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 388e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel Ty, 389e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel MDString::get(VMContext, PropertyName), 390e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel MDString::get(VMContext, GetterName), 391e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel MDString::get(VMContext, SetterName), 392e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes) 393e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel }; 3941f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel return DIType(MDNode::get(VMContext, Elts)); 3956588abf377b7381274236e651462ec83052f6013Devang Patel} 3966588abf377b7381274236e651462ec83052f6013Devang Patel 3976588abf377b7381274236e651462ec83052f6013Devang Patel/// createObjCIVar - Create debugging information entry for Objective-C 3986588abf377b7381274236e651462ec83052f6013Devang Patel/// instance variable. 3996588abf377b7381274236e651462ec83052f6013Devang PatelDIType DIBuilder::createObjCIVar(StringRef Name, 4006588abf377b7381274236e651462ec83052f6013Devang Patel DIFile File, unsigned LineNumber, 4016588abf377b7381274236e651462ec83052f6013Devang Patel uint64_t SizeInBits, uint64_t AlignInBits, 4026588abf377b7381274236e651462ec83052f6013Devang Patel uint64_t OffsetInBits, unsigned Flags, 4036588abf377b7381274236e651462ec83052f6013Devang Patel DIType Ty, MDNode *PropertyNode) { 4046588abf377b7381274236e651462ec83052f6013Devang Patel // TAG_member is encoded in DIDerivedType format. 4056588abf377b7381274236e651462ec83052f6013Devang Patel Value *Elts[] = { 4066588abf377b7381274236e651462ec83052f6013Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_member), 4076588abf377b7381274236e651462ec83052f6013Devang Patel getNonCompileUnitScope(File), 4086588abf377b7381274236e651462ec83052f6013Devang Patel MDString::get(VMContext, Name), 4096588abf377b7381274236e651462ec83052f6013Devang Patel File, 4106588abf377b7381274236e651462ec83052f6013Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 4116588abf377b7381274236e651462ec83052f6013Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 4126588abf377b7381274236e651462ec83052f6013Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 4136588abf377b7381274236e651462ec83052f6013Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits), 4146588abf377b7381274236e651462ec83052f6013Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 4156588abf377b7381274236e651462ec83052f6013Devang Patel Ty, 4166588abf377b7381274236e651462ec83052f6013Devang Patel PropertyNode 4176588abf377b7381274236e651462ec83052f6013Devang Patel }; 4186588abf377b7381274236e651462ec83052f6013Devang Patel return DIType(MDNode::get(VMContext, Elts)); 419e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel} 420e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel 4211ea02d467a311b4846b942377d0b00fde987be65Devang Patel/// createObjCProperty - Create debugging information entry for Objective-C 4221ea02d467a311b4846b942377d0b00fde987be65Devang Patel/// property. 423b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric ChristopherDIObjCProperty DIBuilder::createObjCProperty(StringRef Name, 42487c06a843c279adf6750a044a5c54108397490fbEric Christopher DIFile File, unsigned LineNumber, 4251ea02d467a311b4846b942377d0b00fde987be65Devang Patel StringRef GetterName, 4261ea02d467a311b4846b942377d0b00fde987be65Devang Patel StringRef SetterName, 427b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher unsigned PropertyAttributes, 42887c06a843c279adf6750a044a5c54108397490fbEric Christopher DIType Ty) { 4291ea02d467a311b4846b942377d0b00fde987be65Devang Patel Value *Elts[] = { 4306c31ee2b10827583a0fbcb39623fdfb440c917efEric Christopher GetTagConstant(VMContext, dwarf::DW_TAG_APPLE_property), 4311ea02d467a311b4846b942377d0b00fde987be65Devang Patel MDString::get(VMContext, Name), 432b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher File, 433b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 4341ea02d467a311b4846b942377d0b00fde987be65Devang Patel MDString::get(VMContext, GetterName), 4351ea02d467a311b4846b942377d0b00fde987be65Devang Patel MDString::get(VMContext, SetterName), 436b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes), 437b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher Ty 4381ea02d467a311b4846b942377d0b00fde987be65Devang Patel }; 4391ea02d467a311b4846b942377d0b00fde987be65Devang Patel return DIObjCProperty(MDNode::get(VMContext, Elts)); 4401ea02d467a311b4846b942377d0b00fde987be65Devang Patel} 4411ea02d467a311b4846b942377d0b00fde987be65Devang Patel 44250d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createTemplateTypeParameter - Create debugging information for template 4437e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel/// type parameter. 4446c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric ChristopherDITemplateTypeParameter 44550d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIBuilder::createTemplateTypeParameter(DIDescriptor Context, StringRef Name, 4467e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel DIType Ty, MDNode *File, unsigned LineNo, 4477e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel unsigned ColumnNo) { 4487e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel Value *Elts[] = { 4497e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_template_type_parameter), 45094c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Context), 4517e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel MDString::get(VMContext, Name), 4527e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel Ty, 4537e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel File, 4547e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 4557e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo) 4567e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel }; 4571f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel return DITemplateTypeParameter(MDNode::get(VMContext, Elts)); 4587e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel} 4597e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel 46050d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createTemplateValueParameter - Create debugging information for template 461e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel/// value parameter. 4626c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric ChristopherDITemplateValueParameter 46350d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIBuilder::createTemplateValueParameter(DIDescriptor Context, StringRef Name, 464e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel DIType Ty, uint64_t Val, 465e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel MDNode *File, unsigned LineNo, 466e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel unsigned ColumnNo) { 467e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel Value *Elts[] = { 468e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_template_value_parameter), 46994c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Context), 470e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel MDString::get(VMContext, Name), 471e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel Ty, 472e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), Val), 473e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel File, 474e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 475e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo) 476e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel }; 4771f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel return DITemplateValueParameter(MDNode::get(VMContext, Elts)); 478e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel} 479e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel 48087c06a843c279adf6750a044a5c54108397490fbEric Christopher/// createClassType - Create debugging information entry for a class. 48187c06a843c279adf6750a044a5c54108397490fbEric ChristopherDIType DIBuilder::createClassType(DIDescriptor Context, StringRef Name, 48287c06a843c279adf6750a044a5c54108397490fbEric Christopher DIFile File, unsigned LineNumber, 48387c06a843c279adf6750a044a5c54108397490fbEric Christopher uint64_t SizeInBits, uint64_t AlignInBits, 48487c06a843c279adf6750a044a5c54108397490fbEric Christopher uint64_t OffsetInBits, unsigned Flags, 48587c06a843c279adf6750a044a5c54108397490fbEric Christopher DIType DerivedFrom, DIArray Elements, 48687c06a843c279adf6750a044a5c54108397490fbEric Christopher MDNode *VTableHolder, 48787c06a843c279adf6750a044a5c54108397490fbEric Christopher MDNode *TemplateParams) { 4886643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert((!Context || Context.Verify()) && 4896643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createClassType should be called with a valid Context"); 4906643868498043d373384e0befaff3b5a8a8574f7David Blaikie // TAG_class_type is encoded in DICompositeType format. 49187c06a843c279adf6750a044a5c54108397490fbEric Christopher Value *Elts[] = { 49287c06a843c279adf6750a044a5c54108397490fbEric Christopher GetTagConstant(VMContext, dwarf::DW_TAG_class_type), 49387c06a843c279adf6750a044a5c54108397490fbEric Christopher getNonCompileUnitScope(Context), 49487c06a843c279adf6750a044a5c54108397490fbEric Christopher MDString::get(VMContext, Name), 49587c06a843c279adf6750a044a5c54108397490fbEric Christopher File, 49687c06a843c279adf6750a044a5c54108397490fbEric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 49787c06a843c279adf6750a044a5c54108397490fbEric Christopher ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 49887c06a843c279adf6750a044a5c54108397490fbEric Christopher ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 49987c06a843c279adf6750a044a5c54108397490fbEric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), OffsetInBits), 50087c06a843c279adf6750a044a5c54108397490fbEric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 50187c06a843c279adf6750a044a5c54108397490fbEric Christopher DerivedFrom, 50287c06a843c279adf6750a044a5c54108397490fbEric Christopher Elements, 50387c06a843c279adf6750a044a5c54108397490fbEric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), 0), 50487c06a843c279adf6750a044a5c54108397490fbEric Christopher VTableHolder, 50587c06a843c279adf6750a044a5c54108397490fbEric Christopher TemplateParams 50687c06a843c279adf6750a044a5c54108397490fbEric Christopher }; 5076643868498043d373384e0befaff3b5a8a8574f7David Blaikie DIType R(MDNode::get(VMContext, Elts)); 5086643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert(R.Verify() && "createClassType should return a verifiable DIType"); 5096643868498043d373384e0befaff3b5a8a8574f7David Blaikie return R; 51087c06a843c279adf6750a044a5c54108397490fbEric Christopher} 51187c06a843c279adf6750a044a5c54108397490fbEric Christopher 51250d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createStructType - Create debugging information entry for a struct. 5136172f0298391e00cb669cc246e70ae2531f2cdecDavid BlaikieDICompositeType DIBuilder::createStructType(DIDescriptor Context, 5146172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie StringRef Name, DIFile File, 5156172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie unsigned LineNumber, 5166172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie uint64_t SizeInBits, 5176172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie uint64_t AlignInBits, 5186172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie unsigned Flags, DIType DerivedFrom, 5196172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie DIArray Elements, 5206172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie unsigned RunTimeLang, 5216172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie MDNode *VTableHolder) { 522fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel // TAG_structure_type is encoded in DICompositeType format. 523fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Value *Elts[] = { 524fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_structure_type), 52594c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Context), 526fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel MDString::get(VMContext, Name), 52743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel File, 528fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 529fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 530fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 53143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 532fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 5336172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie DerivedFrom, 534fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Elements, 535fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang), 5366172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie VTableHolder, 537d4f92fd0d1f22af553db08416b476241e4372d9aDavid Blaikie NULL, 538fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel }; 5396643868498043d373384e0befaff3b5a8a8574f7David Blaikie DICompositeType R(MDNode::get(VMContext, Elts)); 5406643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert(R.Verify() && "createStructType should return a verifiable DIType"); 5416643868498043d373384e0befaff3b5a8a8574f7David Blaikie return R; 542fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 543fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 54450d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createUnionType - Create debugging information entry for an union. 545d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDICompositeType DIBuilder::createUnionType( 546d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber, 547d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie uint64_t SizeInBits, uint64_t AlignInBits, unsigned Flags, DIArray Elements, 548d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie unsigned RunTimeLang) { 54943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel // TAG_union_type is encoded in DICompositeType format. 55043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Value *Elts[] = { 55143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_union_type), 55294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Scope), 55343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel MDString::get(VMContext, Name), 55443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel File, 55543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 55643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 55743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 55843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), 0), 55943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 560c104cf20028078e012a97b523a0dff6ab432bff7Devang Patel NULL, 56143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Elements, 56243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang), 5639fdb7c085312b01924dd2d990b457cd58df2e63bBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)) 56443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 565d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie return DICompositeType(MDNode::get(VMContext, Elts)); 56643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 56743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 56850d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createSubroutineType - Create subroutine type. 569d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDICompositeType 570d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIBuilder::createSubroutineType(DIFile File, DIArray ParameterTypes) { 57143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel // TAG_subroutine_type is encoded in DICompositeType format. 57243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Value *Elts[] = { 57343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_subroutine_type), 574f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)), 57543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel MDString::get(VMContext, ""), 576f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)), 57743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 57843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), 0), 57943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), 0), 580c104cf20028078e012a97b523a0dff6ab432bff7Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), 0), 58143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 582c104cf20028078e012a97b523a0dff6ab432bff7Devang Patel NULL, 58343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ParameterTypes, 58443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 5859fdb7c085312b01924dd2d990b457cd58df2e63bBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)) 58643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 587d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie return DICompositeType(MDNode::get(VMContext, Elts)); 58843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 58943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 5906c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher/// createEnumerationType - Create debugging information entry for an 59143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel/// enumeration. 592d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDICompositeType DIBuilder::createEnumerationType( 593d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber, 594d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie uint64_t SizeInBits, uint64_t AlignInBits, DIArray Elements, 595d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie DIType ClassType) { 59643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel // TAG_enumeration_type is encoded in DICompositeType format. 59743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Value *Elts[] = { 59843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_enumeration_type), 59994c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Scope), 60043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel MDString::get(VMContext, Name), 60143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel File, 60243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 60343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 60443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 60543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 606ce3da6f1d532c909238c14fa67cf955a404a6bc2Eli Friedman ConstantInt::get(Type::getInt32Ty(VMContext), 0), 607bb0f6eac1f2d04e485607f0726c31a84ce9b8cedEric Christopher ClassType, 60843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Elements, 60943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 6109fdb7c085312b01924dd2d990b457cd58df2e63bBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)) 61143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 6121f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel MDNode *Node = MDNode::get(VMContext, Elts); 61394c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel AllEnumTypes.push_back(Node); 614d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie return DICompositeType(Node); 61543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 61643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 61750d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createArrayType - Create debugging information entry for an array. 618d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDICompositeType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits, 619d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie DIType Ty, DIArray Subscripts) { 62043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel // TAG_array_type is encoded in DICompositeType format. 62143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Value *Elts[] = { 62243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_array_type), 62394c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel NULL, //TheCU, 62443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel MDString::get(VMContext, ""), 62594c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel NULL, //TheCU, 62643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 62743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), Size), 62843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 62943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 63043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 63143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Ty, 63243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Subscripts, 63343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 6349fdb7c085312b01924dd2d990b457cd58df2e63bBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)) 63543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 636d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie return DICompositeType(MDNode::get(VMContext, Elts)); 63743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 63843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 63950d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createVectorType - Create debugging information entry for a vector. 6406c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric ChristopherDIType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits, 64143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel DIType Ty, DIArray Subscripts) { 6429a1e0e252a7ede548acaac98cf304d4bb135fb97Eric Christopher 6439a1e0e252a7ede548acaac98cf304d4bb135fb97Eric Christopher // A vector is an array type with the FlagVector flag applied. 64443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Value *Elts[] = { 6459a1e0e252a7ede548acaac98cf304d4bb135fb97Eric Christopher GetTagConstant(VMContext, dwarf::DW_TAG_array_type), 64694c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel NULL, //TheCU, 64743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel MDString::get(VMContext, ""), 64894c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel NULL, //TheCU, 64943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 65043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), Size), 65143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 65243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 6539a1e0e252a7ede548acaac98cf304d4bb135fb97Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), DIType::FlagVector), 65443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Ty, 65543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Subscripts, 65643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 6579fdb7c085312b01924dd2d990b457cd58df2e63bBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)) 65843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 6591f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel return DIType(MDNode::get(VMContext, Elts)); 66043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 661fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 66250d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createArtificialType - Create a new DIType with "artificial" flag set. 66350d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIType DIBuilder::createArtificialType(DIType Ty) { 66435fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel if (Ty.isArtificial()) 66535fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel return Ty; 66635fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 66735fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel SmallVector<Value *, 9> Elts; 66835fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel MDNode *N = Ty; 66935fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel assert (N && "Unexpected input DIType!"); 67035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { 67135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel if (Value *V = N->getOperand(i)) 67235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel Elts.push_back(V); 67335fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel else 67435fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); 67535fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel } 67635fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 67735fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel unsigned CurFlags = Ty.getFlags(); 67835fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel CurFlags = CurFlags | DIType::FlagArtificial; 67935fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 68035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel // Flags are stored at this slot. 68135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags); 68235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 6831f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel return DIType(MDNode::get(VMContext, Elts)); 68435fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 685fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 6861f55eb4c5766fd6a6fa53c17f7bb9e7d4ea03500Eric Christopher/// createObjectPointerType - Create a new type with both the object pointer 6871f55eb4c5766fd6a6fa53c17f7bb9e7d4ea03500Eric Christopher/// and artificial flags set. 688e521278f00cf5f4ea0cc4aac126df30924d3e705Eric ChristopherDIType DIBuilder::createObjectPointerType(DIType Ty) { 689e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher if (Ty.isObjectPointer()) 690e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher return Ty; 691e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher 692e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher SmallVector<Value *, 9> Elts; 693e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher MDNode *N = Ty; 694e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher assert (N && "Unexpected input DIType!"); 695e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { 696e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher if (Value *V = N->getOperand(i)) 697e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher Elts.push_back(V); 698e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher else 699e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); 700e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher } 701e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher 702e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher unsigned CurFlags = Ty.getFlags(); 703e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher CurFlags = CurFlags | (DIType::FlagObjectPointer | DIType::FlagArtificial); 704e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher 705e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher // Flags are stored at this slot. 706e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags); 707e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher 708e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher return DIType(MDNode::get(VMContext, Elts)); 709e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher} 710e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher 7116c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher/// retainType - Retain DIType in a module even if it is not referenced 71243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel/// through debug info anchors. 71350d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patelvoid DIBuilder::retainType(DIType T) { 71494c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel AllRetainTypes.push_back(T); 71543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 71643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 71750d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createUnspecifiedParameter - Create unspeicified type descriptor 71843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel/// for the subroutine type. 71950d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIDescriptor DIBuilder::createUnspecifiedParameter() { 7206c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher Value *Elts[] = { 7216c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_parameters) 72243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 7231f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel return DIDescriptor(MDNode::get(VMContext, Elts)); 72443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 72543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 72650d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createTemporaryType - Create a temporary forward-declared type. 72750d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIType DIBuilder::createTemporaryType() { 728fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel // Give the temporary MDNode a tag. It doesn't matter what tag we 729fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel // use here as long as DIType accepts it. 730fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Value *Elts[] = { GetTagConstant(VMContext, DW_TAG_base_type) }; 731ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad MDNode *Node = MDNode::getTemporary(VMContext, Elts); 732fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel return DIType(Node); 733fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 734fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 73550d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createTemporaryType - Create a temporary forward-declared type. 73650d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIType DIBuilder::createTemporaryType(DIFile F) { 737fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel // Give the temporary MDNode a tag. It doesn't matter what tag we 738fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel // use here as long as DIType accepts it. 739fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Value *Elts[] = { 740fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel GetTagConstant(VMContext, DW_TAG_base_type), 74194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel TheCU, 742fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel NULL, 743fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel F 744fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel }; 745ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad MDNode *Node = MDNode::getTemporary(VMContext, Elts); 746fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel return DIType(Node); 747fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 748fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 7494fe345729285ae634c657ab854057464d03220f7Eric Christopher/// createForwardDecl - Create a temporary forward-declared type that 7504fe345729285ae634c657ab854057464d03220f7Eric Christopher/// can be RAUW'd if the full type is seen. 751216432df5ac897327a0cb6323f08811910481038Eric ChristopherDIType DIBuilder::createForwardDecl(unsigned Tag, StringRef Name, 752216432df5ac897327a0cb6323f08811910481038Eric Christopher DIDescriptor Scope, DIFile F, 753ce3da6f1d532c909238c14fa67cf955a404a6bc2Eli Friedman unsigned Line, unsigned RuntimeLang, 754ce3da6f1d532c909238c14fa67cf955a404a6bc2Eli Friedman uint64_t SizeInBits, 755ce3da6f1d532c909238c14fa67cf955a404a6bc2Eli Friedman uint64_t AlignInBits) { 7564fe345729285ae634c657ab854057464d03220f7Eric Christopher // Create a temporary MDNode. 7574fe345729285ae634c657ab854057464d03220f7Eric Christopher Value *Elts[] = { 7584fe345729285ae634c657ab854057464d03220f7Eric Christopher GetTagConstant(VMContext, Tag), 759216432df5ac897327a0cb6323f08811910481038Eric Christopher getNonCompileUnitScope(Scope), 7604fe345729285ae634c657ab854057464d03220f7Eric Christopher MDString::get(VMContext, Name), 7614fe345729285ae634c657ab854057464d03220f7Eric Christopher F, 7624fe345729285ae634c657ab854057464d03220f7Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), Line), 763ce3da6f1d532c909238c14fa67cf955a404a6bc2Eli Friedman ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 764ce3da6f1d532c909238c14fa67cf955a404a6bc2Eli Friedman ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 7654fe345729285ae634c657ab854057464d03220f7Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), 0), 7664fe345729285ae634c657ab854057464d03220f7Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), 7679f90e8760fda131db8311f976c6bbeb66abbaa05Eric Christopher DIDescriptor::FlagFwdDecl), 7689f90e8760fda131db8311f976c6bbeb66abbaa05Eric Christopher NULL, 7699f90e8760fda131db8311f976c6bbeb66abbaa05Eric Christopher DIArray(), 7709f90e8760fda131db8311f976c6bbeb66abbaa05Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang) 7714fe345729285ae634c657ab854057464d03220f7Eric Christopher }; 7724fe345729285ae634c657ab854057464d03220f7Eric Christopher MDNode *Node = MDNode::getTemporary(VMContext, Elts); 7736643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert(DIType(Node).Verify() && 7746643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createForwardDecl result should be verifiable"); 7754fe345729285ae634c657ab854057464d03220f7Eric Christopher return DIType(Node); 7764fe345729285ae634c657ab854057464d03220f7Eric Christopher} 7774fe345729285ae634c657ab854057464d03220f7Eric Christopher 77850d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// getOrCreateArray - Get a DIArray, create one if required. 779685501836bc60f53892854253b5bbea6c48b6d7fJay FoadDIArray DIBuilder::getOrCreateArray(ArrayRef<Value *> Elements) { 780685501836bc60f53892854253b5bbea6c48b6d7fJay Foad if (Elements.empty()) { 781f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Value *Null = Constant::getNullValue(Type::getInt32Ty(VMContext)); 782ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad return DIArray(MDNode::get(VMContext, Null)); 783fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel } 784685501836bc60f53892854253b5bbea6c48b6d7fJay Foad return DIArray(MDNode::get(VMContext, Elements)); 785fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 786fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 78750d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// getOrCreateSubrange - Create a descriptor for a value range. This 78843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel/// implicitly uniques the values returned. 7899493dae613847b01b79914502f337814fe3e00acBill WendlingDISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) { 79043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Value *Elts[] = { 79143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_subrange_type), 79243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), Lo), 793a7645a3c66668da5e2bc772a8e5ab03dc301610cBill Wendling ConstantInt::get(Type::getInt64Ty(VMContext), Count) 79443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 79543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 7961f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel return DISubrange(MDNode::get(VMContext, Elts)); 79743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 79843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 79950d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createGlobalVariable - Create a new descriptor for the specified global. 800fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang PatelDIGlobalVariable DIBuilder:: 8016c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric ChristophercreateGlobalVariable(StringRef Name, DIFile F, unsigned LineNumber, 802f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling DIType Ty, bool isLocalToUnit, Value *Val) { 803fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Value *Elts[] = { 804fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_variable), 805f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)), 80694c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel NULL, // TheCU, 807fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel MDString::get(VMContext, Name), 808fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel MDString::get(VMContext, Name), 80994541efd9238ee0ab615d22dcd6182199490ae61Devang Patel MDString::get(VMContext, Name), 810fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel F, 811fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 812fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Ty, 813fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit), 814fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/ 8156b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher Val, 8166b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher DIDescriptor() 817fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel }; 8181f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel MDNode *Node = MDNode::get(VMContext, Elts); 81994c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel AllGVs.push_back(Node); 820fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel return DIGlobalVariable(Node); 821fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 822fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 82350d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createStaticVariable - Create a new descriptor for the specified static 824fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel/// variable. 825fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang PatelDIGlobalVariable DIBuilder:: 8266c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric ChristophercreateStaticVariable(DIDescriptor Context, StringRef Name, 8276c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher StringRef LinkageName, DIFile F, unsigned LineNumber, 8286b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher DIType Ty, bool isLocalToUnit, Value *Val, MDNode *Decl) { 829fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Value *Elts[] = { 830fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_variable), 831f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)), 83294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Context), 833fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel MDString::get(VMContext, Name), 834fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel MDString::get(VMContext, Name), 835fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel MDString::get(VMContext, LinkageName), 836fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel F, 837fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 838fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Ty, 839fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit), 840fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/ 8416b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher Val, 8426b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher DIDescriptor(Decl) 843fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel }; 8441f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel MDNode *Node = MDNode::get(VMContext, Elts); 84594c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel AllGVs.push_back(Node); 846fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel return DIGlobalVariable(Node); 847fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 848fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 84950d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createVariable - Create a new descriptor for the specified variable. 85050d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope, 85148f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel StringRef Name, DIFile File, 8526c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher unsigned LineNo, DIType Ty, 853e9e16c5f52c4a093f4de234d448cdebedab8938eDevang Patel bool AlwaysPreserve, unsigned Flags, 854e9e16c5f52c4a093f4de234d448cdebedab8938eDevang Patel unsigned ArgNo) { 8556643868498043d373384e0befaff3b5a8a8574f7David Blaikie DIDescriptor Context(getNonCompileUnitScope(Scope)); 8566643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert((!Context || Context.Verify()) && 8576643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createLocalVariable should be called with a valid Context"); 8586643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert(Ty.Verify() && 8596643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createLocalVariable should be called with a valid type"); 86048f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel Value *Elts[] = { 86148f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel GetTagConstant(VMContext, Tag), 86294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Scope), 86348f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel MDString::get(VMContext, Name), 86448f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel File, 865e9e16c5f52c4a093f4de234d448cdebedab8938eDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), (LineNo | (ArgNo << 24))), 86648f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel Ty, 86723336b449eee301f4c4dcabbd75dedf3c75c30fcDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 8689fdb7c085312b01924dd2d990b457cd58df2e63bBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)) 86948f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel }; 8701f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel MDNode *Node = MDNode::get(VMContext, Elts); 87148f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel if (AlwaysPreserve) { 87248f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel // The optimizer may remove local variable. If there is an interest 87348f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel // to preserve variable info in such situation then stash it in a 87448f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel // named mdnode. 87548f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel DISubprogram Fn(getDISubprogram(Scope)); 87693d39be5300702d8c9892ec04a492a6056926462Devang Patel NamedMDNode *FnLocals = getOrInsertFnSpecificMDNode(M, Fn); 87748f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel FnLocals->addOperand(Node); 87848f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel } 8796643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert(DIVariable(Node).Verify() && 8806643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createLocalVariable should return a verifiable DIVariable"); 88148f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel return DIVariable(Node); 88248f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel} 88348f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel 88450d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createComplexVariable - Create a new descriptor for the specified variable 885fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel/// which has a complex address expression for its address. 88650d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIVariable DIBuilder::createComplexVariable(unsigned Tag, DIDescriptor Scope, 887fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel StringRef Name, DIFile F, 888fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel unsigned LineNo, 889685501836bc60f53892854253b5bbea6c48b6d7fJay Foad DIType Ty, ArrayRef<Value *> Addr, 890685501836bc60f53892854253b5bbea6c48b6d7fJay Foad unsigned ArgNo) { 891fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel SmallVector<Value *, 15> Elts; 892fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Elts.push_back(GetTagConstant(VMContext, Tag)); 89394c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel Elts.push_back(getNonCompileUnitScope(Scope)), 894fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Elts.push_back(MDString::get(VMContext, Name)); 895fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Elts.push_back(F); 8966c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher Elts.push_back(ConstantInt::get(Type::getInt32Ty(VMContext), 8979f99721a1882cdef9f7cca25de7ea43627d23958Devang Patel (LineNo | (ArgNo << 24)))); 898fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Elts.push_back(Ty); 899f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); 900f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); 901685501836bc60f53892854253b5bbea6c48b6d7fJay Foad Elts.append(Addr.begin(), Addr.end()); 902fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 9031f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel return DIVariable(MDNode::get(VMContext, Elts)); 904fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 905fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 90650d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createFunction - Create a new descriptor for the specified function. 90750d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDISubprogram DIBuilder::createFunction(DIDescriptor Context, 90844498a640daa827220bc4758770190318f0ec69fDevang Patel StringRef Name, 90944498a640daa827220bc4758770190318f0ec69fDevang Patel StringRef LinkageName, 91044498a640daa827220bc4758770190318f0ec69fDevang Patel DIFile File, unsigned LineNo, 91144498a640daa827220bc4758770190318f0ec69fDevang Patel DIType Ty, 91244498a640daa827220bc4758770190318f0ec69fDevang Patel bool isLocalToUnit, bool isDefinition, 9136126a1e1894f346fae02a514a20aa56b879aeb99Eric Christopher unsigned ScopeLine, 91444498a640daa827220bc4758770190318f0ec69fDevang Patel unsigned Flags, bool isOptimized, 915da19475328ece3da19437a2e9eef035dcafa2814Devang Patel Function *Fn, 9165e06bb83f4d7b1b86659ad851324350afb04f5b0Devang Patel MDNode *TParams, 9175e06bb83f4d7b1b86659ad851324350afb04f5b0Devang Patel MDNode *Decl) { 91893d39be5300702d8c9892ec04a492a6056926462Devang Patel Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) }; 91944498a640daa827220bc4758770190318f0ec69fDevang Patel Value *Elts[] = { 92044498a640daa827220bc4758770190318f0ec69fDevang Patel GetTagConstant(VMContext, dwarf::DW_TAG_subprogram), 921f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)), 92294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Context), 92344498a640daa827220bc4758770190318f0ec69fDevang Patel MDString::get(VMContext, Name), 92444498a640daa827220bc4758770190318f0ec69fDevang Patel MDString::get(VMContext, Name), 92544498a640daa827220bc4758770190318f0ec69fDevang Patel MDString::get(VMContext, LinkageName), 92644498a640daa827220bc4758770190318f0ec69fDevang Patel File, 92744498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 92844498a640daa827220bc4758770190318f0ec69fDevang Patel Ty, 92944498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit), 93044498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition), 93144498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 93244498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 9339642c57ac5a6991cbd06d02f790c478eb3071ad3Devang Patel NULL, 93444498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 93544498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized), 936da19475328ece3da19437a2e9eef035dcafa2814Devang Patel Fn, 9375e06bb83f4d7b1b86659ad851324350afb04f5b0Devang Patel TParams, 93893d39be5300702d8c9892ec04a492a6056926462Devang Patel Decl, 939f839eed5ea2bfd395256d60e15d1e31dbad6ca8bDavid Blaikie MDNode::getTemporary(VMContext, TElts), 9406126a1e1894f346fae02a514a20aa56b879aeb99Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), ScopeLine) 94144498a640daa827220bc4758770190318f0ec69fDevang Patel }; 9421f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel MDNode *Node = MDNode::get(VMContext, Elts); 94344498a640daa827220bc4758770190318f0ec69fDevang Patel 94444498a640daa827220bc4758770190318f0ec69fDevang Patel // Create a named metadata so that we do not lose this mdnode. 945139f7e50688ce120b275ae368f563d03d9c18184David Blaikie if (isDefinition) 946139f7e50688ce120b275ae368f563d03d9c18184David Blaikie AllSubprograms.push_back(Node); 94744498a640daa827220bc4758770190318f0ec69fDevang Patel return DISubprogram(Node); 94844498a640daa827220bc4758770190318f0ec69fDevang Patel} 94944498a640daa827220bc4758770190318f0ec69fDevang Patel 95050d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createMethod - Create a new descriptor for the specified C++ method. 95150d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDISubprogram DIBuilder::createMethod(DIDescriptor Context, 95244498a640daa827220bc4758770190318f0ec69fDevang Patel StringRef Name, 95344498a640daa827220bc4758770190318f0ec69fDevang Patel StringRef LinkageName, 95444498a640daa827220bc4758770190318f0ec69fDevang Patel DIFile F, 95544498a640daa827220bc4758770190318f0ec69fDevang Patel unsigned LineNo, DIType Ty, 95644498a640daa827220bc4758770190318f0ec69fDevang Patel bool isLocalToUnit, 95744498a640daa827220bc4758770190318f0ec69fDevang Patel bool isDefinition, 95844498a640daa827220bc4758770190318f0ec69fDevang Patel unsigned VK, unsigned VIndex, 95944498a640daa827220bc4758770190318f0ec69fDevang Patel MDNode *VTableHolder, 96044498a640daa827220bc4758770190318f0ec69fDevang Patel unsigned Flags, 96144498a640daa827220bc4758770190318f0ec69fDevang Patel bool isOptimized, 962da19475328ece3da19437a2e9eef035dcafa2814Devang Patel Function *Fn, 963da19475328ece3da19437a2e9eef035dcafa2814Devang Patel MDNode *TParam) { 96493d39be5300702d8c9892ec04a492a6056926462Devang Patel Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) }; 96544498a640daa827220bc4758770190318f0ec69fDevang Patel Value *Elts[] = { 96644498a640daa827220bc4758770190318f0ec69fDevang Patel GetTagConstant(VMContext, dwarf::DW_TAG_subprogram), 967f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)), 96894c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Context), 96944498a640daa827220bc4758770190318f0ec69fDevang Patel MDString::get(VMContext, Name), 97044498a640daa827220bc4758770190318f0ec69fDevang Patel MDString::get(VMContext, Name), 97144498a640daa827220bc4758770190318f0ec69fDevang Patel MDString::get(VMContext, LinkageName), 97244498a640daa827220bc4758770190318f0ec69fDevang Patel F, 97344498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 97444498a640daa827220bc4758770190318f0ec69fDevang Patel Ty, 97544498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit), 97644498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition), 97744498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), (unsigned)VK), 97844498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), VIndex), 97944498a640daa827220bc4758770190318f0ec69fDevang Patel VTableHolder, 98044498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 98144498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized), 982da19475328ece3da19437a2e9eef035dcafa2814Devang Patel Fn, 983da19475328ece3da19437a2e9eef035dcafa2814Devang Patel TParam, 984f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)), 985f839eed5ea2bfd395256d60e15d1e31dbad6ca8bDavid Blaikie MDNode::getTemporary(VMContext, TElts), 98625016527f96a759c125d71025d23718fa2cc55caEric Christopher // FIXME: Do we want to use different scope/lines? 9876126a1e1894f346fae02a514a20aa56b879aeb99Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), LineNo) 98844498a640daa827220bc4758770190318f0ec69fDevang Patel }; 9891f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel MDNode *Node = MDNode::get(VMContext, Elts); 990139f7e50688ce120b275ae368f563d03d9c18184David Blaikie if (isDefinition) 991139f7e50688ce120b275ae368f563d03d9c18184David Blaikie AllSubprograms.push_back(Node); 99244498a640daa827220bc4758770190318f0ec69fDevang Patel return DISubprogram(Node); 99344498a640daa827220bc4758770190318f0ec69fDevang Patel} 99444498a640daa827220bc4758770190318f0ec69fDevang Patel 99550d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createNameSpace - This creates new descriptor for a namespace 996fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel/// with the specified parent scope. 99750d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name, 998fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel DIFile File, unsigned LineNo) { 999fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Value *Elts[] = { 1000fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_namespace), 100194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Scope), 1002fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel MDString::get(VMContext, Name), 1003fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel File, 1004fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNo) 1005fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel }; 10066643868498043d373384e0befaff3b5a8a8574f7David Blaikie DINameSpace R(MDNode::get(VMContext, Elts)); 10076643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert(R.Verify() && 10086643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createNameSpace should return a verifiable DINameSpace"); 10096643868498043d373384e0befaff3b5a8a8574f7David Blaikie return R; 1010fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 1011fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 10126618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher/// createLexicalBlockFile - This creates a new MDNode that encapsulates 10136618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher/// an existing scope with a new filename. 10146618a241f7ba2571a1a55b3733c4441d467baf42Eric ChristopherDILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope, 10159f99721a1882cdef9f7cca25de7ea43627d23958Devang Patel DIFile File) { 10166618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher Value *Elts[] = { 10176618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block), 10186618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher Scope, 10196618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher File 10206618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher }; 10216643868498043d373384e0befaff3b5a8a8574f7David Blaikie DILexicalBlockFile R(MDNode::get(VMContext, Elts)); 10226643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert( 10236643868498043d373384e0befaff3b5a8a8574f7David Blaikie R.Verify() && 10246643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createLexicalBlockFile should return a verifiable DILexicalBlockFile"); 10256643868498043d373384e0befaff3b5a8a8574f7David Blaikie return R; 10266618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher} 10276618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher 102850d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File, 102943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel unsigned Line, unsigned Col) { 103043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel // Defeat MDNode uniqing for lexical blocks by using unique id. 103143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel static unsigned int unique_id = 0; 103243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Value *Elts[] = { 103343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block), 103494c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Scope), 103543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Line), 103643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Col), 103743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel File, 103843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++) 103943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 10406643868498043d373384e0befaff3b5a8a8574f7David Blaikie DILexicalBlock R(MDNode::get(VMContext, Elts)); 10416643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert(R.Verify() && 10426643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createLexicalBlock should return a verifiable DILexicalBlock"); 10436643868498043d373384e0befaff3b5a8a8574f7David Blaikie return R; 104443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 104543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 104650d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call. 104750d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelInstruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo, 1048fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Instruction *InsertBefore) { 1049fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel assert(Storage && "no storage passed to dbg.declare"); 1050fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel assert(VarInfo.Verify() && "empty DIVariable passed to dbg.declare"); 1051fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel if (!DeclareFn) 1052fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare); 1053fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 1054ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo }; 1055a3efbb15ddd5aa9006564cd79086723640084878Jay Foad return CallInst::Create(DeclareFn, Args, "", InsertBefore); 1056fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 1057fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 105850d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call. 105950d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelInstruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo, 1060fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel BasicBlock *InsertAtEnd) { 1061fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel assert(Storage && "no storage passed to dbg.declare"); 1062fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.declare"); 1063fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel if (!DeclareFn) 1064fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare); 1065fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 1066ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo }; 1067fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 1068fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel // If this block already has a terminator then insert this intrinsic 1069fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel // before the terminator. 1070fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel if (TerminatorInst *T = InsertAtEnd->getTerminator()) 1071a3efbb15ddd5aa9006564cd79086723640084878Jay Foad return CallInst::Create(DeclareFn, Args, "", T); 1072fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel else 1073a3efbb15ddd5aa9006564cd79086723640084878Jay Foad return CallInst::Create(DeclareFn, Args, "", InsertAtEnd); 1074fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 1075fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 107650d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call. 107750d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelInstruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset, 1078fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel DIVariable VarInfo, 1079fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Instruction *InsertBefore) { 1080fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel assert(V && "no value passed to dbg.value"); 1081fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.value"); 1082fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel if (!ValueFn) 1083fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value); 1084fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 1085ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad Value *Args[] = { MDNode::get(V->getContext(), V), 1086fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset), 1087fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel VarInfo }; 1088a3efbb15ddd5aa9006564cd79086723640084878Jay Foad return CallInst::Create(ValueFn, Args, "", InsertBefore); 1089fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 1090fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 109150d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call. 109250d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelInstruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset, 1093fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel DIVariable VarInfo, 1094fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel BasicBlock *InsertAtEnd) { 1095fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel assert(V && "no value passed to dbg.value"); 1096fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.value"); 1097fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel if (!ValueFn) 1098fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value); 1099fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 1100ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad Value *Args[] = { MDNode::get(V->getContext(), V), 1101fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset), 1102fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel VarInfo }; 1103a3efbb15ddd5aa9006564cd79086723640084878Jay Foad return CallInst::Create(ValueFn, Args, "", InsertAtEnd); 1104fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 1105