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