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