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