DIBuilder.cpp revision 20d9e41ddb3f531267680819b5cac4cac1c6b231
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); 64c462db6d66e683fb837c03d661483106a869a407David Blaikie 65c462db6d66e683fb837c03d661483106a869a407David Blaikie DIArray IMs = getOrCreateArray(AllImportedModules); 66c462db6d66e683fb837c03d661483106a869a407David Blaikie DIType(TempImportedModules).replaceAllUsesWith(IMs); 6794c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel} 6894c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel 696c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher/// getNonCompileUnitScope - If N is compile unit return NULL otherwise return 706c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher/// N. 7194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patelstatic MDNode *getNonCompileUnitScope(MDNode *N) { 7294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel if (DIDescriptor(N).isCompileUnit()) 7394c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel return NULL; 7494c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel return N; 756326a4238df05dafd7547cfa2cd71111cd6702a6Devang Patel} 766326a4238df05dafd7547cfa2cd71111cd6702a6Devang Patel 7700c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikiestatic MDNode *createFilePathPair(LLVMContext &VMContext, StringRef Filename, 7800c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikie StringRef Directory) { 7900c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikie assert(!Filename.empty() && "Unable to create file without name"); 8000c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikie Value *Pair[] = { 8100c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikie MDString::get(VMContext, Filename), 8200c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikie MDString::get(VMContext, Directory), 8300c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikie }; 8400c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikie return MDNode::get(VMContext, Pair); 8500c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikie} 8600c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikie 8750d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createCompileUnit - A CompileUnit provides an anchor for all debugging 8835fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel/// information generated during this instance of compilation. 896c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christophervoid DIBuilder::createCompileUnit(unsigned Lang, StringRef Filename, 906c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher StringRef Directory, StringRef Producer, 916c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher bool isOptimized, StringRef Flags, 92e4b67906d3cc5ea365359f9b034189aaa51ca1e9Eric Christopher unsigned RunTimeVer, StringRef SplitName) { 93b0dc4d995cbb09e762ce56d7ae754dd042bafab0Chandler Carruth assert(((Lang <= dwarf::DW_LANG_Python && Lang >= dwarf::DW_LANG_C89) || 94b0dc4d995cbb09e762ce56d7ae754dd042bafab0Chandler Carruth (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) && 95b0dc4d995cbb09e762ce56d7ae754dd042bafab0Chandler Carruth "Invalid Language tag"); 96b0dc4d995cbb09e762ce56d7ae754dd042bafab0Chandler Carruth assert(!Filename.empty() && 97b0dc4d995cbb09e762ce56d7ae754dd042bafab0Chandler Carruth "Unable to create compile unit without filename"); 9894c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) }; 9994c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel TempEnumTypes = MDNode::getTemporary(VMContext, TElts); 10094c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel 10194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel TempRetainTypes = MDNode::getTemporary(VMContext, TElts); 10294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel 10394c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel TempSubprograms = MDNode::getTemporary(VMContext, TElts); 10494c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel 10594c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel TempGVs = MDNode::getTemporary(VMContext, TElts); 10694c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel 107c462db6d66e683fb837c03d661483106a869a407David Blaikie TempImportedModules = MDNode::getTemporary(VMContext, TElts); 108c462db6d66e683fb837c03d661483106a869a407David Blaikie 10942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 11042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_compile_unit), 11100c5c5d46731834caa0ca3280e0dcc43202dd3c8David Blaikie createFilePathPair(VMContext, Filename, Directory), 112162c800384353b639aa5bc94242e6307dcfae2d3David Blaikie ConstantInt::get(Type::getInt32Ty(VMContext), Lang), 11342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Producer), 11442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized), 11542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Flags), 11694c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeVer), 117a8eefc7cc7c6e8be06d570fff76dc42b43a23392David Blaikie TempEnumTypes, 118a8eefc7cc7c6e8be06d570fff76dc42b43a23392David Blaikie TempRetainTypes, 119a8eefc7cc7c6e8be06d570fff76dc42b43a23392David Blaikie TempSubprograms, 120e4b67906d3cc5ea365359f9b034189aaa51ca1e9Eric Christopher TempGVs, 121c462db6d66e683fb837c03d661483106a869a407David Blaikie TempImportedModules, 122e4b67906d3cc5ea365359f9b034189aaa51ca1e9Eric Christopher MDString::get(VMContext, SplitName) 12342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 12472dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie TheCU = DICompileUnit(MDNode::get(VMContext, Elts)); 125464f4ef2bdb47a44ffa2c4208296da641db7358dDevang Patel 126464f4ef2bdb47a44ffa2c4208296da641db7358dDevang Patel // Create a named metadata so that it is easier to find cu in a module. 127464f4ef2bdb47a44ffa2c4208296da641db7358dDevang Patel NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu"); 128464f4ef2bdb47a44ffa2c4208296da641db7358dDevang Patel NMD->addOperand(TheCU); 12935fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 13035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 13120d9e41ddb3f531267680819b5cac4cac1c6b231David BlaikieDIImportedEntity DIBuilder::createImportedModule(DIScope Context, 132c462db6d66e683fb837c03d661483106a869a407David Blaikie DINameSpace NS, 133c462db6d66e683fb837c03d661483106a869a407David Blaikie unsigned Line) { 134c462db6d66e683fb837c03d661483106a869a407David Blaikie Value *Elts[] = { 135c462db6d66e683fb837c03d661483106a869a407David Blaikie GetTagConstant(VMContext, dwarf::DW_TAG_imported_module), 136c462db6d66e683fb837c03d661483106a869a407David Blaikie Context, 137c462db6d66e683fb837c03d661483106a869a407David Blaikie NS, 138c462db6d66e683fb837c03d661483106a869a407David Blaikie ConstantInt::get(Type::getInt32Ty(VMContext), Line), 139c462db6d66e683fb837c03d661483106a869a407David Blaikie }; 14020d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie DIImportedEntity M(MDNode::get(VMContext, Elts)); 14120d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie assert(M.Verify() && "Imported module should be valid"); 14220d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie AllImportedModules.push_back(M); 14320d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie return M; 14420d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie} 14520d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie 14620d9e41ddb3f531267680819b5cac4cac1c6b231David BlaikieDIImportedEntity DIBuilder::createImportedDeclaration(DIScope Context, 14720d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie DIDescriptor Decl, 14820d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie unsigned Line) { 14920d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie Value *Elts[] = { 15020d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie GetTagConstant(VMContext, dwarf::DW_TAG_imported_declaration), 15120d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie Context, 15220d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie Decl, 15320d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie ConstantInt::get(Type::getInt32Ty(VMContext), Line), 15420d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie }; 15520d9e41ddb3f531267680819b5cac4cac1c6b231David Blaikie DIImportedEntity M(MDNode::get(VMContext, Elts)); 156c462db6d66e683fb837c03d661483106a869a407David Blaikie assert(M.Verify() && "Imported module should be valid"); 157c462db6d66e683fb837c03d661483106a869a407David Blaikie AllImportedModules.push_back(M); 158c462db6d66e683fb837c03d661483106a869a407David Blaikie return M; 159c462db6d66e683fb837c03d661483106a869a407David Blaikie} 160c462db6d66e683fb837c03d661483106a869a407David Blaikie 16150d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createFile - Create a file descriptor to hold debugging information 16235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel/// for a file. 16350d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIFile DIBuilder::createFile(StringRef Filename, StringRef Directory) { 164b4cf0ab22b5a3ebb720f0b7287fdccfb465b6b7cDavid Blaikie Value *Elts[] = { 165b4cf0ab22b5a3ebb720f0b7287fdccfb465b6b7cDavid Blaikie GetTagConstant(VMContext, dwarf::DW_TAG_file_type), 16672dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie createFilePathPair(VMContext, Filename, Directory) 167b4cf0ab22b5a3ebb720f0b7287fdccfb465b6b7cDavid Blaikie }; 16872dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIFile(MDNode::get(VMContext, Elts)); 16935fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 17035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 17150d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createEnumerator - Create a single enumerator value. 17250d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIEnumerator DIBuilder::createEnumerator(StringRef Name, uint64_t Val) { 173811ae5b09cc2727e9a7a8748c6124d5bbd30707fDevang Patel assert(!Name.empty() && "Unable to create enumerator without name"); 17442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 17542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_enumerator), 17642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Name), 17742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), Val) 17842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 17972dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIEnumerator(MDNode::get(VMContext, Elts)); 18035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 18135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 182734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel/// createNullPtrType - Create C++0x nullptr type. 183734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang PatelDIType DIBuilder::createNullPtrType(StringRef Name) { 184734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel assert(!Name.empty() && "Unable to create type without name"); 185734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel // nullptr is encoded in DIBasicType format. Line number, filename, 186734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel // ,size, alignment, offset and flags are always empty here. 187734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel Value *Elts[] = { 188734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_type), 189a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie NULL, // Filename 190734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel NULL, //TheCU, 191734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel MDString::get(VMContext, Name), 192734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 193734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 194734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 195734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 196734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags; 1979fdb7c085312b01924dd2d990b457cd58df2e63bBill Wendling ConstantInt::get(Type::getInt32Ty(VMContext), 0) // Encoding 198734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel }; 19972dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIType(MDNode::get(VMContext, Elts)); 200734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel} 201734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel 2026c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher/// createBasicType - Create debugging information entry for a basic 20335fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel/// type, e.g 'char'. 2042ce067a9fb5b2d046c92519428cafa71fae81ed4David BlaikieDIBasicType 2052ce067a9fb5b2d046c92519428cafa71fae81ed4David BlaikieDIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits, 2062ce067a9fb5b2d046c92519428cafa71fae81ed4David Blaikie uint64_t AlignInBits, unsigned Encoding) { 207811ae5b09cc2727e9a7a8748c6124d5bbd30707fDevang Patel assert(!Name.empty() && "Unable to create type without name"); 20835fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel // Basic types are encoded in DIBasicType format. Line number, filename, 20935fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel // offset and flags are always empty here. 21042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 21142c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_base_type), 212a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie NULL, // File/directory name 21394c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel NULL, //TheCU, 21442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Name), 21542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 21642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 21742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 21842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 21942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags; 22042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), Encoding) 22142c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 22272dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIBasicType(MDNode::get(VMContext, Elts)); 22335fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 22435fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 225ffab7d0c4f581297e8bc1515eeb34e1b12b650c4Nick Lewycky/// createQualifiedType - Create debugging information entry for a qualified 22635fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel/// type, e.g. 'const int'. 227d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIDerivedType DIBuilder::createQualifiedType(unsigned Tag, DIType FromTy) { 22842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer // Qualified types are encoded in DIDerivedType format. 22942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 23042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, Tag), 231a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie NULL, // Filename 23294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel NULL, //TheCU, 23342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, StringRef()), // Empty name. 23442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 23542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 23642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 23742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 23842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 23942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer FromTy 24042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 24172dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIDerivedType(MDNode::get(VMContext, Elts)); 24235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 24335fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 24450d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createPointerType - Create debugging information entry for a pointer. 245d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIDerivedType 246d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIBuilder::createPointerType(DIType PointeeTy, uint64_t SizeInBits, 247d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie uint64_t AlignInBits, StringRef Name) { 24842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer // Pointer types are encoded in DIDerivedType format. 24942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 25042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_pointer_type), 251a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie NULL, // Filename 25294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel NULL, //TheCU, 25342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Name), 25442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 25542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 25642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 25742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 25842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 25942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer PointeeTy 26042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 26172dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIDerivedType(MDNode::get(VMContext, Elts)); 26235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 26335fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 26409b798180340487e4397069e9fa22568099fd9b6Eric ChristopherDIDerivedType DIBuilder::createMemberPointerType(DIType PointeeTy, 26509b798180340487e4397069e9fa22568099fd9b6Eric Christopher DIType Base) { 26662fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie // Pointer types are encoded in DIDerivedType format. 26762fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie Value *Elts[] = { 26862fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie GetTagConstant(VMContext, dwarf::DW_TAG_ptr_to_member_type), 269a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie NULL, // Filename 27062fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie NULL, //TheCU, 27162fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie NULL, 27262fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 27362fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie ConstantInt::get(Type::getInt64Ty(VMContext), 0), 27462fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie ConstantInt::get(Type::getInt64Ty(VMContext), 0), 27562fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 27662fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 27762fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie PointeeTy, 27862fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie Base 27962fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie }; 28072dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIDerivedType(MDNode::get(VMContext, Elts)); 28162fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie} 28262fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie 283791e629deef7e4a410e67527da26405916415d3aEric Christopher/// createReferenceType - Create debugging information entry for a reference 284791e629deef7e4a410e67527da26405916415d3aEric Christopher/// type. 285d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIDerivedType DIBuilder::createReferenceType(unsigned Tag, DIType RTy) { 286811ae5b09cc2727e9a7a8748c6124d5bbd30707fDevang Patel assert(RTy.Verify() && "Unable to create reference type"); 28742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer // References are encoded in DIDerivedType format. 28842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 289791e629deef7e4a410e67527da26405916415d3aEric Christopher GetTagConstant(VMContext, Tag), 290a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie NULL, // Filename 2916c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher NULL, // TheCU, 29242c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer NULL, // Name 29342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 29442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 29542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 29642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 29742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 29842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer RTy 29942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 30072dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIDerivedType(MDNode::get(VMContext, Elts)); 30135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 30235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 30350d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createTypedef - Create debugging information entry for a typedef. 304d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIDerivedType DIBuilder::createTypedef(DIType Ty, StringRef Name, DIFile File, 305d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie unsigned LineNo, DIDescriptor Context) { 30642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer // typedefs are encoded in DIDerivedType format. 30742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer assert(Ty.Verify() && "Invalid typedef type!"); 30842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 30942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_typedef), 3104776bce28cb7d669329222c3d9cf6a97d6881c96David Blaikie File.getFileNode(), 31194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Context), 31242c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Name), 31342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 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), 0), // Offset 31742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 31842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Ty 31942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 32072dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIDerivedType(MDNode::get(VMContext, Elts)); 32135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 32235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 32350d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createFriend - Create debugging information entry for a 'friend'. 32450d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIType DIBuilder::createFriend(DIType Ty, DIType FriendTy) { 32542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer // typedefs are encoded in DIDerivedType format. 32642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer assert(Ty.Verify() && "Invalid type!"); 32742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer assert(FriendTy.Verify() && "Invalid friend type!"); 32842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 32942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_friend), 330a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie NULL, 33142c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Ty, 33242c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer NULL, // Name 33342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 33442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 33542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 33642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 33742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 33842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer FriendTy 33942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 34072dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIType(MDNode::get(VMContext, Elts)); 34135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 34235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 34350d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createInheritance - Create debugging information entry to establish 344c27c7342aa5ce43c700364f1ce72272b3649aa6eEric Christopher/// inheritance relationship between two types. 345d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIDerivedType DIBuilder::createInheritance( 346d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie DIType Ty, DIType BaseTy, uint64_t BaseOffset, unsigned Flags) { 347811ae5b09cc2727e9a7a8748c6124d5bbd30707fDevang Patel assert(Ty.Verify() && "Unable to create inheritance"); 34842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer // TAG_inheritance is encoded in DIDerivedType format. 34942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 35042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_inheritance), 351a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie NULL, 35242c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Ty, 35342c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer NULL, // Name 35442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 35542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 35642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 35742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), BaseOffset), 35842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 35942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer BaseTy 36042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 36172dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIDerivedType(MDNode::get(VMContext, Elts)); 36235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 36335fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 36450d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createMemberType - Create debugging information entry for a member. 365d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIDerivedType DIBuilder::createMemberType( 366d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber, 367d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie uint64_t SizeInBits, uint64_t AlignInBits, uint64_t OffsetInBits, 368d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie unsigned Flags, DIType Ty) { 36942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer // TAG_member is encoded in DIDerivedType format. 37042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Value *Elts[] = { 37142c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer GetTagConstant(VMContext, dwarf::DW_TAG_member), 3724776bce28cb7d669329222c3d9cf6a97d6881c96David Blaikie File.getFileNode(), 37394c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Scope), 37442c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer MDString::get(VMContext, Name), 37542c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 37642c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 37742c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 37842c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits), 37942c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 38042c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer Ty 38142c9b2555407a8aae2d81bf820dc95d16f4993c5Benjamin Kramer }; 38272dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIDerivedType(MDNode::get(VMContext, Elts)); 38335fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 38435fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 3856b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher/// createStaticMemberType - Create debugging information entry for a 3866b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher/// C++ static data member. 3876b6061f01171bd3d4e32022efa45428d4f9941eeEric ChristopherDIType DIBuilder::createStaticMemberType(DIDescriptor Scope, StringRef Name, 3886b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher DIFile File, unsigned LineNumber, 3896b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher DIType Ty, unsigned Flags, 3906b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher llvm::Value *Val) { 3916b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher // TAG_member is encoded in DIDerivedType format. 3926b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher Flags |= DIDescriptor::FlagStaticMember; 3936b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher Value *Elts[] = { 3946b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher GetTagConstant(VMContext, dwarf::DW_TAG_member), 3954776bce28cb7d669329222c3d9cf6a97d6881c96David Blaikie File.getFileNode(), 3966b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher getNonCompileUnitScope(Scope), 3976b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher MDString::get(VMContext, Name), 3986b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 3996b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher ConstantInt::get(Type::getInt64Ty(VMContext), 0/*SizeInBits*/), 4006b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher ConstantInt::get(Type::getInt64Ty(VMContext), 0/*AlignInBits*/), 4016b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher ConstantInt::get(Type::getInt64Ty(VMContext), 0/*OffsetInBits*/), 4026b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 4036b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher Ty, 4046b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher Val 4056b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher }; 40672dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIType(MDNode::get(VMContext, Elts)); 4076b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher} 4086b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher 409e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel/// createObjCIVar - Create debugging information entry for Objective-C 410e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel/// instance variable. 4116c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric ChristopherDIType DIBuilder::createObjCIVar(StringRef Name, 4126c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher DIFile File, unsigned LineNumber, 413e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel uint64_t SizeInBits, uint64_t AlignInBits, 4146c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher uint64_t OffsetInBits, unsigned Flags, 415e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel DIType Ty, StringRef PropertyName, 416e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel StringRef GetterName, StringRef SetterName, 417e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel unsigned PropertyAttributes) { 418e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel // TAG_member is encoded in DIDerivedType format. 419e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel Value *Elts[] = { 420e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_member), 4214776bce28cb7d669329222c3d9cf6a97d6881c96David Blaikie File.getFileNode(), 42294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(File), 423e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel MDString::get(VMContext, Name), 424e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 425e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 426e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 427e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits), 428e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 429e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel Ty, 430e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel MDString::get(VMContext, PropertyName), 431e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel MDString::get(VMContext, GetterName), 432e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel MDString::get(VMContext, SetterName), 433e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes) 434e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel }; 43572dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIType(MDNode::get(VMContext, Elts)); 4366588abf377b7381274236e651462ec83052f6013Devang Patel} 4376588abf377b7381274236e651462ec83052f6013Devang Patel 4386588abf377b7381274236e651462ec83052f6013Devang Patel/// createObjCIVar - Create debugging information entry for Objective-C 4396588abf377b7381274236e651462ec83052f6013Devang Patel/// instance variable. 4406588abf377b7381274236e651462ec83052f6013Devang PatelDIType DIBuilder::createObjCIVar(StringRef Name, 4416588abf377b7381274236e651462ec83052f6013Devang Patel DIFile File, unsigned LineNumber, 4426588abf377b7381274236e651462ec83052f6013Devang Patel uint64_t SizeInBits, uint64_t AlignInBits, 4436588abf377b7381274236e651462ec83052f6013Devang Patel uint64_t OffsetInBits, unsigned Flags, 4446588abf377b7381274236e651462ec83052f6013Devang Patel DIType Ty, MDNode *PropertyNode) { 4456588abf377b7381274236e651462ec83052f6013Devang Patel // TAG_member is encoded in DIDerivedType format. 4466588abf377b7381274236e651462ec83052f6013Devang Patel Value *Elts[] = { 4476588abf377b7381274236e651462ec83052f6013Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_member), 4484776bce28cb7d669329222c3d9cf6a97d6881c96David Blaikie File.getFileNode(), 4496588abf377b7381274236e651462ec83052f6013Devang Patel getNonCompileUnitScope(File), 4506588abf377b7381274236e651462ec83052f6013Devang Patel MDString::get(VMContext, Name), 4516588abf377b7381274236e651462ec83052f6013Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 4526588abf377b7381274236e651462ec83052f6013Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 4536588abf377b7381274236e651462ec83052f6013Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 4546588abf377b7381274236e651462ec83052f6013Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits), 4556588abf377b7381274236e651462ec83052f6013Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 4566588abf377b7381274236e651462ec83052f6013Devang Patel Ty, 4576588abf377b7381274236e651462ec83052f6013Devang Patel PropertyNode 4586588abf377b7381274236e651462ec83052f6013Devang Patel }; 45972dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIType(MDNode::get(VMContext, Elts)); 460e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel} 461e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel 4621ea02d467a311b4846b942377d0b00fde987be65Devang Patel/// createObjCProperty - Create debugging information entry for Objective-C 4631ea02d467a311b4846b942377d0b00fde987be65Devang Patel/// property. 464b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric ChristopherDIObjCProperty DIBuilder::createObjCProperty(StringRef Name, 46587c06a843c279adf6750a044a5c54108397490fbEric Christopher DIFile File, unsigned LineNumber, 4661ea02d467a311b4846b942377d0b00fde987be65Devang Patel StringRef GetterName, 4672f445be5a75b4d1a907dd694c9e5c518229df48eAdrian Prantl StringRef SetterName, 468b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher unsigned PropertyAttributes, 46987c06a843c279adf6750a044a5c54108397490fbEric Christopher DIType Ty) { 4701ea02d467a311b4846b942377d0b00fde987be65Devang Patel Value *Elts[] = { 4716c31ee2b10827583a0fbcb39623fdfb440c917efEric Christopher GetTagConstant(VMContext, dwarf::DW_TAG_APPLE_property), 4721ea02d467a311b4846b942377d0b00fde987be65Devang Patel MDString::get(VMContext, Name), 473b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher File, 474b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 4751ea02d467a311b4846b942377d0b00fde987be65Devang Patel MDString::get(VMContext, GetterName), 4761ea02d467a311b4846b942377d0b00fde987be65Devang Patel MDString::get(VMContext, SetterName), 477b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes), 478b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher Ty 4791ea02d467a311b4846b942377d0b00fde987be65Devang Patel }; 48072dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIObjCProperty(MDNode::get(VMContext, Elts)); 4811ea02d467a311b4846b942377d0b00fde987be65Devang Patel} 4821ea02d467a311b4846b942377d0b00fde987be65Devang Patel 48350d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createTemplateTypeParameter - Create debugging information for template 4847e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel/// type parameter. 4856c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric ChristopherDITemplateTypeParameter 48650d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIBuilder::createTemplateTypeParameter(DIDescriptor Context, StringRef Name, 4877e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel DIType Ty, MDNode *File, unsigned LineNo, 4887e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel unsigned ColumnNo) { 4897e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel Value *Elts[] = { 4907e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_template_type_parameter), 49194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Context), 4927e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel MDString::get(VMContext, Name), 4937e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel Ty, 4947e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel File, 4957e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 4967e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo) 4977e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel }; 49872dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DITemplateTypeParameter(MDNode::get(VMContext, Elts)); 4997e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel} 5007e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel 50150d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createTemplateValueParameter - Create debugging information for template 502e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel/// value parameter. 5036c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric ChristopherDITemplateValueParameter 50450d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIBuilder::createTemplateValueParameter(DIDescriptor Context, StringRef Name, 505e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel DIType Ty, uint64_t Val, 506e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel MDNode *File, unsigned LineNo, 507e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel unsigned ColumnNo) { 508e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel Value *Elts[] = { 509e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_template_value_parameter), 51094c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Context), 511e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel MDString::get(VMContext, Name), 512e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel Ty, 513e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), Val), 514e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel File, 515e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 516e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo) 517e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel }; 51872dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DITemplateValueParameter(MDNode::get(VMContext, Elts)); 519e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel} 520e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel 52187c06a843c279adf6750a044a5c54108397490fbEric Christopher/// createClassType - Create debugging information entry for a class. 522ca442a4a1aabf6199e5aee09ec604e79916d9b92David BlaikieDICompositeType DIBuilder::createClassType(DIDescriptor Context, StringRef Name, 523ca442a4a1aabf6199e5aee09ec604e79916d9b92David Blaikie DIFile File, unsigned LineNumber, 524ca442a4a1aabf6199e5aee09ec604e79916d9b92David Blaikie uint64_t SizeInBits, 525ca442a4a1aabf6199e5aee09ec604e79916d9b92David Blaikie uint64_t AlignInBits, 526ca442a4a1aabf6199e5aee09ec604e79916d9b92David Blaikie uint64_t OffsetInBits, 527ca442a4a1aabf6199e5aee09ec604e79916d9b92David Blaikie unsigned Flags, DIType DerivedFrom, 528ca442a4a1aabf6199e5aee09ec604e79916d9b92David Blaikie DIArray Elements, 529ca442a4a1aabf6199e5aee09ec604e79916d9b92David Blaikie MDNode *VTableHolder, 530ca442a4a1aabf6199e5aee09ec604e79916d9b92David Blaikie MDNode *TemplateParams) { 5316643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert((!Context || Context.Verify()) && 5326643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createClassType should be called with a valid Context"); 5336643868498043d373384e0befaff3b5a8a8574f7David Blaikie // TAG_class_type is encoded in DICompositeType format. 53487c06a843c279adf6750a044a5c54108397490fbEric Christopher Value *Elts[] = { 53587c06a843c279adf6750a044a5c54108397490fbEric Christopher GetTagConstant(VMContext, dwarf::DW_TAG_class_type), 5364776bce28cb7d669329222c3d9cf6a97d6881c96David Blaikie File.getFileNode(), 53787c06a843c279adf6750a044a5c54108397490fbEric Christopher getNonCompileUnitScope(Context), 53887c06a843c279adf6750a044a5c54108397490fbEric Christopher MDString::get(VMContext, Name), 53987c06a843c279adf6750a044a5c54108397490fbEric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 54087c06a843c279adf6750a044a5c54108397490fbEric Christopher ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 54187c06a843c279adf6750a044a5c54108397490fbEric Christopher ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 54287c06a843c279adf6750a044a5c54108397490fbEric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), OffsetInBits), 54387c06a843c279adf6750a044a5c54108397490fbEric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 54487c06a843c279adf6750a044a5c54108397490fbEric Christopher DerivedFrom, 54587c06a843c279adf6750a044a5c54108397490fbEric Christopher Elements, 54687c06a843c279adf6750a044a5c54108397490fbEric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), 0), 54787c06a843c279adf6750a044a5c54108397490fbEric Christopher VTableHolder, 54887c06a843c279adf6750a044a5c54108397490fbEric Christopher TemplateParams 54987c06a843c279adf6750a044a5c54108397490fbEric Christopher }; 550ca442a4a1aabf6199e5aee09ec604e79916d9b92David Blaikie DICompositeType R(MDNode::get(VMContext, Elts)); 5516643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert(R.Verify() && "createClassType should return a verifiable DIType"); 5526643868498043d373384e0befaff3b5a8a8574f7David Blaikie return R; 55387c06a843c279adf6750a044a5c54108397490fbEric Christopher} 55487c06a843c279adf6750a044a5c54108397490fbEric Christopher 55550d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createStructType - Create debugging information entry for a struct. 5566172f0298391e00cb669cc246e70ae2531f2cdecDavid BlaikieDICompositeType DIBuilder::createStructType(DIDescriptor Context, 5576172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie StringRef Name, DIFile File, 5586172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie unsigned LineNumber, 5596172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie uint64_t SizeInBits, 5606172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie uint64_t AlignInBits, 5616172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie unsigned Flags, DIType DerivedFrom, 5626172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie DIArray Elements, 5636172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie unsigned RunTimeLang, 5646172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie MDNode *VTableHolder) { 565fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel // TAG_structure_type is encoded in DICompositeType format. 566fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Value *Elts[] = { 567fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_structure_type), 5684776bce28cb7d669329222c3d9cf6a97d6881c96David Blaikie File.getFileNode(), 56994c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Context), 570fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel MDString::get(VMContext, Name), 571fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 572fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 573fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 57443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 575fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 5766172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie DerivedFrom, 577fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Elements, 578fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang), 5796172f0298391e00cb669cc246e70ae2531f2cdecDavid Blaikie VTableHolder, 580d4f92fd0d1f22af553db08416b476241e4372d9aDavid Blaikie NULL, 581fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel }; 5826643868498043d373384e0befaff3b5a8a8574f7David Blaikie DICompositeType R(MDNode::get(VMContext, Elts)); 5836643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert(R.Verify() && "createStructType should return a verifiable DIType"); 5846643868498043d373384e0befaff3b5a8a8574f7David Blaikie return R; 585fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 586fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 58750d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createUnionType - Create debugging information entry for an union. 588cf0623bba4abb8612a61229e672ac8ea8ed20c4eEric ChristopherDICompositeType DIBuilder::createUnionType(DIDescriptor Scope, StringRef Name, 589cf0623bba4abb8612a61229e672ac8ea8ed20c4eEric Christopher DIFile File, unsigned LineNumber, 590cf0623bba4abb8612a61229e672ac8ea8ed20c4eEric Christopher uint64_t SizeInBits, 591cf0623bba4abb8612a61229e672ac8ea8ed20c4eEric Christopher uint64_t AlignInBits, unsigned Flags, 592cf0623bba4abb8612a61229e672ac8ea8ed20c4eEric Christopher DIArray Elements, 593cf0623bba4abb8612a61229e672ac8ea8ed20c4eEric Christopher unsigned RunTimeLang) { 59443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel // TAG_union_type is encoded in DICompositeType format. 59543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Value *Elts[] = { 59643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_union_type), 5974776bce28cb7d669329222c3d9cf6a97d6881c96David Blaikie File.getFileNode(), 59894c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Scope), 59943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel MDString::get(VMContext, Name), 60043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 60143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 60243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 60343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), 0), 60443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 605c104cf20028078e012a97b523a0dff6ab432bff7Devang Patel NULL, 60643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Elements, 60743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang), 608c656fda3aeba9fd8b09d98ed72e75b6c25a1ad49Eric Christopher Constant::getNullValue(Type::getInt32Ty(VMContext)), 609c656fda3aeba9fd8b09d98ed72e75b6c25a1ad49Eric Christopher NULL 61043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 61172dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DICompositeType(MDNode::get(VMContext, Elts)); 61243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 61343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 61450d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createSubroutineType - Create subroutine type. 615d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDICompositeType 616d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDIBuilder::createSubroutineType(DIFile File, DIArray ParameterTypes) { 61743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel // TAG_subroutine_type is encoded in DICompositeType format. 61843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Value *Elts[] = { 61943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_subroutine_type), 620f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)), 621f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)), 622a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie MDString::get(VMContext, ""), 62343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 62443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), 0), 62543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), 0), 626c104cf20028078e012a97b523a0dff6ab432bff7Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), 0), 62743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 628c104cf20028078e012a97b523a0dff6ab432bff7Devang Patel NULL, 62943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ParameterTypes, 63043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 6319fdb7c085312b01924dd2d990b457cd58df2e63bBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)) 63243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 63372dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DICompositeType(MDNode::get(VMContext, Elts)); 63443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 63543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 6366c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher/// createEnumerationType - Create debugging information entry for an 63743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel/// enumeration. 638d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDICompositeType DIBuilder::createEnumerationType( 639d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber, 640d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie uint64_t SizeInBits, uint64_t AlignInBits, DIArray Elements, 6412f445be5a75b4d1a907dd694c9e5c518229df48eAdrian Prantl DIType UnderlyingType) { 64243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel // TAG_enumeration_type is encoded in DICompositeType format. 64343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Value *Elts[] = { 64443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_enumeration_type), 6454776bce28cb7d669329222c3d9cf6a97d6881c96David Blaikie File.getFileNode(), 64694c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Scope), 64743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel MDString::get(VMContext, Name), 64843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 64943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 65043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 65143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 652ce3da6f1d532c909238c14fa67cf955a404a6bc2Eli Friedman ConstantInt::get(Type::getInt32Ty(VMContext), 0), 6532f445be5a75b4d1a907dd694c9e5c518229df48eAdrian Prantl UnderlyingType, 65443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Elements, 65543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 6569fdb7c085312b01924dd2d990b457cd58df2e63bBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)) 65743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 6581f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel MDNode *Node = MDNode::get(VMContext, Elts); 65994c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel AllEnumTypes.push_back(Node); 66072dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DICompositeType(Node); 66143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 66243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 66350d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createArrayType - Create debugging information entry for an array. 664d67c5cab3b770b0709dcb05256aef51b35f3f113David BlaikieDICompositeType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits, 665d67c5cab3b770b0709dcb05256aef51b35f3f113David Blaikie DIType Ty, DIArray Subscripts) { 66643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel // TAG_array_type is encoded in DICompositeType format. 66743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Value *Elts[] = { 66843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_array_type), 669a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie NULL, // Filename/Directory, 67094c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel NULL, //TheCU, 67143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel MDString::get(VMContext, ""), 67243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 67343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), Size), 67443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 67543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 67643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 67743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Ty, 67843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Subscripts, 67943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 6809fdb7c085312b01924dd2d990b457cd58df2e63bBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)) 68143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 68272dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DICompositeType(MDNode::get(VMContext, Elts)); 68343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 68443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 68550d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createVectorType - Create debugging information entry for a vector. 6866c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric ChristopherDIType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits, 68743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel DIType Ty, DIArray Subscripts) { 6889a1e0e252a7ede548acaac98cf304d4bb135fb97Eric Christopher 6899a1e0e252a7ede548acaac98cf304d4bb135fb97Eric Christopher // A vector is an array type with the FlagVector flag applied. 69043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Value *Elts[] = { 6919a1e0e252a7ede548acaac98cf304d4bb135fb97Eric Christopher GetTagConstant(VMContext, dwarf::DW_TAG_array_type), 692a13f3cdb01c4900528018eebfe1b6c98dc607f99David Blaikie NULL, // Filename/Directory, 69394c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel NULL, //TheCU, 69443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel MDString::get(VMContext, ""), 69543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 69643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), Size), 69743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 69843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 6999a1e0e252a7ede548acaac98cf304d4bb135fb97Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), DIType::FlagVector), 70043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Ty, 70143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Subscripts, 70243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 7039fdb7c085312b01924dd2d990b457cd58df2e63bBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)) 70443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 70572dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIType(MDNode::get(VMContext, Elts)); 70643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 707fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 70850d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createArtificialType - Create a new DIType with "artificial" flag set. 70950d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIType DIBuilder::createArtificialType(DIType Ty) { 71035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel if (Ty.isArtificial()) 71135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel return Ty; 71235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 71335fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel SmallVector<Value *, 9> Elts; 71435fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel MDNode *N = Ty; 71535fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel assert (N && "Unexpected input DIType!"); 71635fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { 71735fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel if (Value *V = N->getOperand(i)) 71835fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel Elts.push_back(V); 71935fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel else 72035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); 72135fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel } 72235fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 72335fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel unsigned CurFlags = Ty.getFlags(); 72435fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel CurFlags = CurFlags | DIType::FlagArtificial; 72535fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 72635fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel // Flags are stored at this slot. 72772dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags); 72835fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel 72972dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIType(MDNode::get(VMContext, Elts)); 73035fcd6557f53aab69c2990b80fed4653fbaa3473Devang Patel} 731fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 7321f55eb4c5766fd6a6fa53c17f7bb9e7d4ea03500Eric Christopher/// createObjectPointerType - Create a new type with both the object pointer 7331f55eb4c5766fd6a6fa53c17f7bb9e7d4ea03500Eric Christopher/// and artificial flags set. 734e521278f00cf5f4ea0cc4aac126df30924d3e705Eric ChristopherDIType DIBuilder::createObjectPointerType(DIType Ty) { 735e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher if (Ty.isObjectPointer()) 736e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher return Ty; 737e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher 738e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher SmallVector<Value *, 9> Elts; 739e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher MDNode *N = Ty; 740e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher assert (N && "Unexpected input DIType!"); 741e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { 742e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher if (Value *V = N->getOperand(i)) 743e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher Elts.push_back(V); 744e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher else 745e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); 746e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher } 747e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher 748e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher unsigned CurFlags = Ty.getFlags(); 749e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher CurFlags = CurFlags | (DIType::FlagObjectPointer | DIType::FlagArtificial); 750e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher 751e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher // Flags are stored at this slot. 75272dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags); 753e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher 75472dfb052ab74a9e642256212a50c9b805ce5c943David Blaikie return DIType(MDNode::get(VMContext, Elts)); 755e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher} 756e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher 7576c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher/// retainType - Retain DIType in a module even if it is not referenced 75843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel/// through debug info anchors. 75950d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patelvoid DIBuilder::retainType(DIType T) { 76094c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel AllRetainTypes.push_back(T); 76143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 76243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 76350d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createUnspecifiedParameter - Create unspeicified type descriptor 76443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel/// for the subroutine type. 76550d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIDescriptor DIBuilder::createUnspecifiedParameter() { 7666c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher Value *Elts[] = { 7676c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_parameters) 76843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 7691f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel return DIDescriptor(MDNode::get(VMContext, Elts)); 77043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 77143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 7724fe345729285ae634c657ab854057464d03220f7Eric Christopher/// createForwardDecl - Create a temporary forward-declared type that 7734fe345729285ae634c657ab854057464d03220f7Eric Christopher/// can be RAUW'd if the full type is seen. 774216432df5ac897327a0cb6323f08811910481038Eric ChristopherDIType DIBuilder::createForwardDecl(unsigned Tag, StringRef Name, 775216432df5ac897327a0cb6323f08811910481038Eric Christopher DIDescriptor Scope, DIFile F, 776ce3da6f1d532c909238c14fa67cf955a404a6bc2Eli Friedman unsigned Line, unsigned RuntimeLang, 777ce3da6f1d532c909238c14fa67cf955a404a6bc2Eli Friedman uint64_t SizeInBits, 778ce3da6f1d532c909238c14fa67cf955a404a6bc2Eli Friedman uint64_t AlignInBits) { 7794fe345729285ae634c657ab854057464d03220f7Eric Christopher // Create a temporary MDNode. 7804fe345729285ae634c657ab854057464d03220f7Eric Christopher Value *Elts[] = { 7814fe345729285ae634c657ab854057464d03220f7Eric Christopher GetTagConstant(VMContext, Tag), 7824776bce28cb7d669329222c3d9cf6a97d6881c96David Blaikie F.getFileNode(), 783216432df5ac897327a0cb6323f08811910481038Eric Christopher getNonCompileUnitScope(Scope), 7844fe345729285ae634c657ab854057464d03220f7Eric Christopher MDString::get(VMContext, Name), 7854fe345729285ae634c657ab854057464d03220f7Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), Line), 786ce3da6f1d532c909238c14fa67cf955a404a6bc2Eli Friedman ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 787ce3da6f1d532c909238c14fa67cf955a404a6bc2Eli Friedman ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 7884fe345729285ae634c657ab854057464d03220f7Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), 0), 7894fe345729285ae634c657ab854057464d03220f7Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), 7909f90e8760fda131db8311f976c6bbeb66abbaa05Eric Christopher DIDescriptor::FlagFwdDecl), 7919f90e8760fda131db8311f976c6bbeb66abbaa05Eric Christopher NULL, 7929f90e8760fda131db8311f976c6bbeb66abbaa05Eric Christopher DIArray(), 7939f90e8760fda131db8311f976c6bbeb66abbaa05Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang) 7944fe345729285ae634c657ab854057464d03220f7Eric Christopher }; 7954fe345729285ae634c657ab854057464d03220f7Eric Christopher MDNode *Node = MDNode::getTemporary(VMContext, Elts); 7966643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert(DIType(Node).Verify() && 7976643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createForwardDecl result should be verifiable"); 7984fe345729285ae634c657ab854057464d03220f7Eric Christopher return DIType(Node); 7994fe345729285ae634c657ab854057464d03220f7Eric Christopher} 8004fe345729285ae634c657ab854057464d03220f7Eric Christopher 80150d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// getOrCreateArray - Get a DIArray, create one if required. 802685501836bc60f53892854253b5bbea6c48b6d7fJay FoadDIArray DIBuilder::getOrCreateArray(ArrayRef<Value *> Elements) { 803685501836bc60f53892854253b5bbea6c48b6d7fJay Foad if (Elements.empty()) { 804f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Value *Null = Constant::getNullValue(Type::getInt32Ty(VMContext)); 805ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad return DIArray(MDNode::get(VMContext, Null)); 806fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel } 807685501836bc60f53892854253b5bbea6c48b6d7fJay Foad return DIArray(MDNode::get(VMContext, Elements)); 808fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 809fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 81050d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// getOrCreateSubrange - Create a descriptor for a value range. This 81143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel/// implicitly uniques the values returned. 8129493dae613847b01b79914502f337814fe3e00acBill WendlingDISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) { 81343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Value *Elts[] = { 81443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_subrange_type), 81543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt64Ty(VMContext), Lo), 816a7645a3c66668da5e2bc772a8e5ab03dc301610cBill Wendling ConstantInt::get(Type::getInt64Ty(VMContext), Count) 81743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 81843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 8191f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel return DISubrange(MDNode::get(VMContext, Elts)); 82043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 82143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 8223fac43d8b4111feca59d77941ac2ebd1f858dd33David Blaikie/// \brief Create a new descriptor for the specified global. 823fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang PatelDIGlobalVariable DIBuilder:: 8243fac43d8b4111feca59d77941ac2ebd1f858dd33David BlaikiecreateGlobalVariable(StringRef Name, StringRef LinkageName, DIFile F, 8253fac43d8b4111feca59d77941ac2ebd1f858dd33David Blaikie unsigned LineNumber, DIType Ty, bool isLocalToUnit, 8263fac43d8b4111feca59d77941ac2ebd1f858dd33David Blaikie Value *Val) { 827fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Value *Elts[] = { 828fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_variable), 829f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)), 83094c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel NULL, // TheCU, 831fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel MDString::get(VMContext, Name), 832fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel MDString::get(VMContext, Name), 8333fac43d8b4111feca59d77941ac2ebd1f858dd33David Blaikie MDString::get(VMContext, LinkageName), 834fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel F, 835fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 836fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Ty, 837fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit), 838fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/ 8396b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher Val, 8406b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher DIDescriptor() 841fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel }; 8421f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel MDNode *Node = MDNode::get(VMContext, Elts); 84394c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel AllGVs.push_back(Node); 844fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel return DIGlobalVariable(Node); 845fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 846fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 8473fac43d8b4111feca59d77941ac2ebd1f858dd33David Blaikie/// \brief Create a new descriptor for the specified global. 8483fac43d8b4111feca59d77941ac2ebd1f858dd33David BlaikieDIGlobalVariable DIBuilder:: 8493fac43d8b4111feca59d77941ac2ebd1f858dd33David BlaikiecreateGlobalVariable(StringRef Name, DIFile F, unsigned LineNumber, 8503fac43d8b4111feca59d77941ac2ebd1f858dd33David Blaikie DIType Ty, bool isLocalToUnit, Value *Val) { 8513fac43d8b4111feca59d77941ac2ebd1f858dd33David Blaikie return createGlobalVariable(Name, Name, F, LineNumber, Ty, isLocalToUnit, 8523fac43d8b4111feca59d77941ac2ebd1f858dd33David Blaikie Val); 8533fac43d8b4111feca59d77941ac2ebd1f858dd33David Blaikie} 8543fac43d8b4111feca59d77941ac2ebd1f858dd33David Blaikie 85550d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createStaticVariable - Create a new descriptor for the specified static 856fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel/// variable. 857fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang PatelDIGlobalVariable DIBuilder:: 8586c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric ChristophercreateStaticVariable(DIDescriptor Context, StringRef Name, 8596c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher StringRef LinkageName, DIFile F, unsigned LineNumber, 8606b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher DIType Ty, bool isLocalToUnit, Value *Val, MDNode *Decl) { 861fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Value *Elts[] = { 862fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_variable), 863f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)), 86494c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Context), 865fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel MDString::get(VMContext, Name), 866fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel MDString::get(VMContext, Name), 867fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel MDString::get(VMContext, LinkageName), 868fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel F, 869fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 870fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Ty, 871fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit), 872fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/ 8736b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher Val, 8746b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher DIDescriptor(Decl) 875fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel }; 8761f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel MDNode *Node = MDNode::get(VMContext, Elts); 87794c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel AllGVs.push_back(Node); 878fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel return DIGlobalVariable(Node); 879fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 880fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 88150d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createVariable - Create a new descriptor for the specified variable. 88250d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope, 88348f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel StringRef Name, DIFile File, 8846c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher unsigned LineNo, DIType Ty, 885e9e16c5f52c4a093f4de234d448cdebedab8938eDevang Patel bool AlwaysPreserve, unsigned Flags, 886e9e16c5f52c4a093f4de234d448cdebedab8938eDevang Patel unsigned ArgNo) { 8876643868498043d373384e0befaff3b5a8a8574f7David Blaikie DIDescriptor Context(getNonCompileUnitScope(Scope)); 8886643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert((!Context || Context.Verify()) && 8896643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createLocalVariable should be called with a valid Context"); 8906643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert(Ty.Verify() && 8916643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createLocalVariable should be called with a valid type"); 89248f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel Value *Elts[] = { 89348f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel GetTagConstant(VMContext, Tag), 89494c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Scope), 89548f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel MDString::get(VMContext, Name), 89648f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel File, 897e9e16c5f52c4a093f4de234d448cdebedab8938eDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), (LineNo | (ArgNo << 24))), 89848f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel Ty, 89923336b449eee301f4c4dcabbd75dedf3c75c30fcDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 9009fdb7c085312b01924dd2d990b457cd58df2e63bBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)) 90148f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel }; 9021f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel MDNode *Node = MDNode::get(VMContext, Elts); 90348f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel if (AlwaysPreserve) { 90448f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel // The optimizer may remove local variable. If there is an interest 90548f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel // to preserve variable info in such situation then stash it in a 90648f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel // named mdnode. 90748f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel DISubprogram Fn(getDISubprogram(Scope)); 90893d39be5300702d8c9892ec04a492a6056926462Devang Patel NamedMDNode *FnLocals = getOrInsertFnSpecificMDNode(M, Fn); 90948f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel FnLocals->addOperand(Node); 91048f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel } 9116643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert(DIVariable(Node).Verify() && 9126643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createLocalVariable should return a verifiable DIVariable"); 91348f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel return DIVariable(Node); 91448f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel} 91548f17ba2a611d197082d4de730b646a4ecf68df4Devang Patel 91650d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createComplexVariable - Create a new descriptor for the specified variable 917fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel/// which has a complex address expression for its address. 91850d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDIVariable DIBuilder::createComplexVariable(unsigned Tag, DIDescriptor Scope, 919fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel StringRef Name, DIFile F, 920fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel unsigned LineNo, 921685501836bc60f53892854253b5bbea6c48b6d7fJay Foad DIType Ty, ArrayRef<Value *> Addr, 922685501836bc60f53892854253b5bbea6c48b6d7fJay Foad unsigned ArgNo) { 923fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel SmallVector<Value *, 15> Elts; 924fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Elts.push_back(GetTagConstant(VMContext, Tag)); 92594c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel Elts.push_back(getNonCompileUnitScope(Scope)), 926fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Elts.push_back(MDString::get(VMContext, Name)); 927fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Elts.push_back(F); 9286c0046f5d45d230a338c0cfe09b5b4b2d00f1cedEric Christopher Elts.push_back(ConstantInt::get(Type::getInt32Ty(VMContext), 9299f99721a1882cdef9f7cca25de7ea43627d23958Devang Patel (LineNo | (ArgNo << 24)))); 930fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Elts.push_back(Ty); 931f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); 932f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); 933685501836bc60f53892854253b5bbea6c48b6d7fJay Foad Elts.append(Addr.begin(), Addr.end()); 934fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 9351f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel return DIVariable(MDNode::get(VMContext, Elts)); 936fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 937fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 93850d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createFunction - Create a new descriptor for the specified function. 93950d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDISubprogram DIBuilder::createFunction(DIDescriptor Context, 94044498a640daa827220bc4758770190318f0ec69fDevang Patel StringRef Name, 94144498a640daa827220bc4758770190318f0ec69fDevang Patel StringRef LinkageName, 94244498a640daa827220bc4758770190318f0ec69fDevang Patel DIFile File, unsigned LineNo, 94344498a640daa827220bc4758770190318f0ec69fDevang Patel DIType Ty, 94444498a640daa827220bc4758770190318f0ec69fDevang Patel bool isLocalToUnit, bool isDefinition, 9456126a1e1894f346fae02a514a20aa56b879aeb99Eric Christopher unsigned ScopeLine, 94644498a640daa827220bc4758770190318f0ec69fDevang Patel unsigned Flags, bool isOptimized, 947da19475328ece3da19437a2e9eef035dcafa2814Devang Patel Function *Fn, 9485e06bb83f4d7b1b86659ad851324350afb04f5b0Devang Patel MDNode *TParams, 9495e06bb83f4d7b1b86659ad851324350afb04f5b0Devang Patel MDNode *Decl) { 95093d39be5300702d8c9892ec04a492a6056926462Devang Patel Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) }; 95144498a640daa827220bc4758770190318f0ec69fDevang Patel Value *Elts[] = { 95244498a640daa827220bc4758770190318f0ec69fDevang Patel GetTagConstant(VMContext, dwarf::DW_TAG_subprogram), 953bb4e619cd9ff34708e3baaf0aac70275a917e0baDavid Blaikie File.getFileNode(), 95494c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Context), 95544498a640daa827220bc4758770190318f0ec69fDevang Patel MDString::get(VMContext, Name), 95644498a640daa827220bc4758770190318f0ec69fDevang Patel MDString::get(VMContext, Name), 95744498a640daa827220bc4758770190318f0ec69fDevang Patel MDString::get(VMContext, LinkageName), 95844498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 95944498a640daa827220bc4758770190318f0ec69fDevang Patel Ty, 96044498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit), 96144498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition), 96244498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 96344498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), 0), 9649642c57ac5a6991cbd06d02f790c478eb3071ad3Devang Patel NULL, 96544498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 96644498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized), 967da19475328ece3da19437a2e9eef035dcafa2814Devang Patel Fn, 9685e06bb83f4d7b1b86659ad851324350afb04f5b0Devang Patel TParams, 96993d39be5300702d8c9892ec04a492a6056926462Devang Patel Decl, 970f839eed5ea2bfd395256d60e15d1e31dbad6ca8bDavid Blaikie MDNode::getTemporary(VMContext, TElts), 9716126a1e1894f346fae02a514a20aa56b879aeb99Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), ScopeLine) 97244498a640daa827220bc4758770190318f0ec69fDevang Patel }; 9731f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel MDNode *Node = MDNode::get(VMContext, Elts); 97444498a640daa827220bc4758770190318f0ec69fDevang Patel 97544498a640daa827220bc4758770190318f0ec69fDevang Patel // Create a named metadata so that we do not lose this mdnode. 976139f7e50688ce120b275ae368f563d03d9c18184David Blaikie if (isDefinition) 977139f7e50688ce120b275ae368f563d03d9c18184David Blaikie AllSubprograms.push_back(Node); 978ebb5183a2f16abc7c88241bb42412465f52c2a61David Blaikie DISubprogram S(Node); 979ebb5183a2f16abc7c88241bb42412465f52c2a61David Blaikie assert(S.Verify() && "createFunction should return a valid DISubprogram"); 980ebb5183a2f16abc7c88241bb42412465f52c2a61David Blaikie return S; 98144498a640daa827220bc4758770190318f0ec69fDevang Patel} 98244498a640daa827220bc4758770190318f0ec69fDevang Patel 98350d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createMethod - Create a new descriptor for the specified C++ method. 98450d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDISubprogram DIBuilder::createMethod(DIDescriptor Context, 98544498a640daa827220bc4758770190318f0ec69fDevang Patel StringRef Name, 98644498a640daa827220bc4758770190318f0ec69fDevang Patel StringRef LinkageName, 98744498a640daa827220bc4758770190318f0ec69fDevang Patel DIFile F, 98844498a640daa827220bc4758770190318f0ec69fDevang Patel unsigned LineNo, DIType Ty, 98944498a640daa827220bc4758770190318f0ec69fDevang Patel bool isLocalToUnit, 99044498a640daa827220bc4758770190318f0ec69fDevang Patel bool isDefinition, 99144498a640daa827220bc4758770190318f0ec69fDevang Patel unsigned VK, unsigned VIndex, 99244498a640daa827220bc4758770190318f0ec69fDevang Patel MDNode *VTableHolder, 99344498a640daa827220bc4758770190318f0ec69fDevang Patel unsigned Flags, 99444498a640daa827220bc4758770190318f0ec69fDevang Patel bool isOptimized, 995da19475328ece3da19437a2e9eef035dcafa2814Devang Patel Function *Fn, 996da19475328ece3da19437a2e9eef035dcafa2814Devang Patel MDNode *TParam) { 99793d39be5300702d8c9892ec04a492a6056926462Devang Patel Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) }; 99844498a640daa827220bc4758770190318f0ec69fDevang Patel Value *Elts[] = { 99944498a640daa827220bc4758770190318f0ec69fDevang Patel GetTagConstant(VMContext, dwarf::DW_TAG_subprogram), 1000bb4e619cd9ff34708e3baaf0aac70275a917e0baDavid Blaikie F.getFileNode(), 100194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Context), 100244498a640daa827220bc4758770190318f0ec69fDevang Patel MDString::get(VMContext, Name), 100344498a640daa827220bc4758770190318f0ec69fDevang Patel MDString::get(VMContext, Name), 100444498a640daa827220bc4758770190318f0ec69fDevang Patel MDString::get(VMContext, LinkageName), 100544498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 100644498a640daa827220bc4758770190318f0ec69fDevang Patel Ty, 100744498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit), 100844498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition), 100944498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), (unsigned)VK), 101044498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), VIndex), 101144498a640daa827220bc4758770190318f0ec69fDevang Patel VTableHolder, 101244498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 101344498a640daa827220bc4758770190318f0ec69fDevang Patel ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized), 1014da19475328ece3da19437a2e9eef035dcafa2814Devang Patel Fn, 1015da19475328ece3da19437a2e9eef035dcafa2814Devang Patel TParam, 1016f46b497b7f56b28e119b8c21466f2a0dcc9d469eBill Wendling Constant::getNullValue(Type::getInt32Ty(VMContext)), 1017f839eed5ea2bfd395256d60e15d1e31dbad6ca8bDavid Blaikie MDNode::getTemporary(VMContext, TElts), 101825016527f96a759c125d71025d23718fa2cc55caEric Christopher // FIXME: Do we want to use different scope/lines? 10196126a1e1894f346fae02a514a20aa56b879aeb99Eric Christopher ConstantInt::get(Type::getInt32Ty(VMContext), LineNo) 102044498a640daa827220bc4758770190318f0ec69fDevang Patel }; 10211f48a95ccbff731a8bcf4890204e5eef09eb99d1Devang Patel MDNode *Node = MDNode::get(VMContext, Elts); 1022139f7e50688ce120b275ae368f563d03d9c18184David Blaikie if (isDefinition) 1023139f7e50688ce120b275ae368f563d03d9c18184David Blaikie AllSubprograms.push_back(Node); 1024ebb5183a2f16abc7c88241bb42412465f52c2a61David Blaikie DISubprogram S(Node); 1025ebb5183a2f16abc7c88241bb42412465f52c2a61David Blaikie assert(S.Verify() && "createMethod should return a valid DISubprogram"); 1026ebb5183a2f16abc7c88241bb42412465f52c2a61David Blaikie return S; 102744498a640daa827220bc4758770190318f0ec69fDevang Patel} 102844498a640daa827220bc4758770190318f0ec69fDevang Patel 102950d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// createNameSpace - This creates new descriptor for a namespace 1030fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel/// with the specified parent scope. 103150d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name, 1032fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel DIFile File, unsigned LineNo) { 1033fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Value *Elts[] = { 1034fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_namespace), 10356115ed0e4347f17504f72e4d37545b4230b2cb50David Blaikie File.getFileNode(), 103694c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Scope), 1037fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel MDString::get(VMContext, Name), 1038fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), LineNo) 1039fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel }; 10406643868498043d373384e0befaff3b5a8a8574f7David Blaikie DINameSpace R(MDNode::get(VMContext, Elts)); 10416643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert(R.Verify() && 10426643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createNameSpace should return a verifiable DINameSpace"); 10436643868498043d373384e0befaff3b5a8a8574f7David Blaikie return R; 1044fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 1045fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 10466618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher/// createLexicalBlockFile - This creates a new MDNode that encapsulates 10476618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher/// an existing scope with a new filename. 10486618a241f7ba2571a1a55b3733c4441d467baf42Eric ChristopherDILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope, 10499f99721a1882cdef9f7cca25de7ea43627d23958Devang Patel DIFile File) { 10506618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher Value *Elts[] = { 10516618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block), 10528faed2745c849fb35f6edf411263dfa564ef3643David Blaikie File.getFileNode(), 10537b246860bdf4c6b3ea4e09f6437537941cc0d1d4David Blaikie Scope 10546618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher }; 10556643868498043d373384e0befaff3b5a8a8574f7David Blaikie DILexicalBlockFile R(MDNode::get(VMContext, Elts)); 10566643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert( 10576643868498043d373384e0befaff3b5a8a8574f7David Blaikie R.Verify() && 10586643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createLexicalBlockFile should return a verifiable DILexicalBlockFile"); 10596643868498043d373384e0befaff3b5a8a8574f7David Blaikie return R; 10606618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher} 10616618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher 106250d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelDILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File, 106343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel unsigned Line, unsigned Col) { 106443c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel // Defeat MDNode uniqing for lexical blocks by using unique id. 106543c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel static unsigned int unique_id = 0; 106643c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel Value *Elts[] = { 106743c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block), 10684b52a88e90b341ff2a3d1dbad6eb5ea731228156David Blaikie File.getFileNode(), 106994c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel getNonCompileUnitScope(Scope), 107043c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Line), 107143c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), Col), 107243c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++) 107343c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel }; 10746643868498043d373384e0befaff3b5a8a8574f7David Blaikie DILexicalBlock R(MDNode::get(VMContext, Elts)); 10756643868498043d373384e0befaff3b5a8a8574f7David Blaikie assert(R.Verify() && 10766643868498043d373384e0befaff3b5a8a8574f7David Blaikie "createLexicalBlock should return a verifiable DILexicalBlock"); 10776643868498043d373384e0befaff3b5a8a8574f7David Blaikie return R; 107843c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel} 107943c249cf1e417083ec8cbdfb4866a42861a7f638Devang Patel 108050d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call. 108150d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelInstruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo, 1082fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Instruction *InsertBefore) { 1083fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel assert(Storage && "no storage passed to dbg.declare"); 1084fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel assert(VarInfo.Verify() && "empty DIVariable passed to dbg.declare"); 1085fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel if (!DeclareFn) 1086fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare); 1087fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 1088ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo }; 1089a3efbb15ddd5aa9006564cd79086723640084878Jay Foad return CallInst::Create(DeclareFn, Args, "", InsertBefore); 1090fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 1091fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 109250d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call. 109350d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelInstruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo, 1094fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel BasicBlock *InsertAtEnd) { 1095fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel assert(Storage && "no storage passed to dbg.declare"); 1096fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.declare"); 1097fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel if (!DeclareFn) 1098fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare); 1099fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 1100ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo }; 1101fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 1102fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel // If this block already has a terminator then insert this intrinsic 1103fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel // before the terminator. 1104fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel if (TerminatorInst *T = InsertAtEnd->getTerminator()) 1105a3efbb15ddd5aa9006564cd79086723640084878Jay Foad return CallInst::Create(DeclareFn, Args, "", T); 1106fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel else 1107a3efbb15ddd5aa9006564cd79086723640084878Jay Foad return CallInst::Create(DeclareFn, Args, "", InsertAtEnd); 1108fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 1109fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 111050d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call. 111150d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelInstruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset, 1112fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel DIVariable VarInfo, 1113fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel Instruction *InsertBefore) { 1114fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel assert(V && "no value passed to dbg.value"); 1115fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.value"); 1116fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel if (!ValueFn) 1117fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value); 1118fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 1119ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad Value *Args[] = { MDNode::get(V->getContext(), V), 1120fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset), 1121fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel VarInfo }; 1122a3efbb15ddd5aa9006564cd79086723640084878Jay Foad return CallInst::Create(ValueFn, Args, "", InsertBefore); 1123fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 1124fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 112550d280c14ee1c25fc8e6cb6f59af44f754edce42Devang Patel/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call. 112650d280c14ee1c25fc8e6cb6f59af44f754edce42Devang PatelInstruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset, 1127fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel DIVariable VarInfo, 1128fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel BasicBlock *InsertAtEnd) { 1129fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel assert(V && "no value passed to dbg.value"); 1130fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.value"); 1131fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel if (!ValueFn) 1132fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value); 1133fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel 1134ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad Value *Args[] = { MDNode::get(V->getContext(), V), 1135fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset), 1136fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel VarInfo }; 1137a3efbb15ddd5aa9006564cd79086723640084878Jay Foad return CallInst::Create(ValueFn, Args, "", InsertAtEnd); 1138fe58f95f3604b394916bee7bd289e1f0e0488ec5Devang Patel} 1139