1249259Sdim//===--- DIBuilder.cpp - Debug Information Builder ------------------------===//
2249259Sdim//
3249259Sdim//                     The LLVM Compiler Infrastructure
4249259Sdim//
5249259Sdim// This file is distributed under the University of Illinois Open Source
6249259Sdim// License. See LICENSE.TXT for details.
7249259Sdim//
8249259Sdim//===----------------------------------------------------------------------===//
9249259Sdim//
10249259Sdim// This file implements the DIBuilder.
11249259Sdim//
12249259Sdim//===----------------------------------------------------------------------===//
13249259Sdim
14249259Sdim#include "llvm/DIBuilder.h"
15249259Sdim#include "llvm/ADT/STLExtras.h"
16249259Sdim#include "llvm/DebugInfo.h"
17249259Sdim#include "llvm/IR/Constants.h"
18249259Sdim#include "llvm/IR/IntrinsicInst.h"
19249259Sdim#include "llvm/IR/Module.h"
20249259Sdim#include "llvm/Support/Debug.h"
21249259Sdim#include "llvm/Support/Dwarf.h"
22249259Sdim
23249259Sdimusing namespace llvm;
24249259Sdimusing namespace llvm::dwarf;
25249259Sdim
26249259Sdimstatic Constant *GetTagConstant(LLVMContext &VMContext, unsigned Tag) {
27249259Sdim  assert((Tag & LLVMDebugVersionMask) == 0 &&
28249259Sdim         "Tag too large for debug encoding!");
29249259Sdim  return ConstantInt::get(Type::getInt32Ty(VMContext), Tag | LLVMDebugVersion);
30249259Sdim}
31249259Sdim
32249259SdimDIBuilder::DIBuilder(Module &m)
33263509Sdim    : M(m), VMContext(M.getContext()), TempEnumTypes(0), TempRetainTypes(0),
34263509Sdim      TempSubprograms(0), TempGVs(0), DeclareFn(0), ValueFn(0) {}
35249259Sdim
36249259Sdim/// finalize - Construct any deferred debug info descriptors.
37249259Sdimvoid DIBuilder::finalize() {
38249259Sdim  DIArray Enums = getOrCreateArray(AllEnumTypes);
39249259Sdim  DIType(TempEnumTypes).replaceAllUsesWith(Enums);
40249259Sdim
41263509Sdim  SmallVector<Value *, 16> RetainValues;
42263509Sdim  // Declarations and definitions of the same type may be retained. Some
43263509Sdim  // clients RAUW these pairs, leaving duplicates in the retained types
44263509Sdim  // list. Use a set to remove the duplicates while we transform the
45263509Sdim  // TrackingVHs back into Values.
46263509Sdim  SmallPtrSet<Value *, 16> RetainSet;
47263509Sdim  for (unsigned I = 0, E = AllRetainTypes.size(); I < E; I++)
48263509Sdim    if (RetainSet.insert(AllRetainTypes[I]))
49263509Sdim      RetainValues.push_back(AllRetainTypes[I]);
50263509Sdim  DIArray RetainTypes = getOrCreateArray(RetainValues);
51249259Sdim  DIType(TempRetainTypes).replaceAllUsesWith(RetainTypes);
52249259Sdim
53249259Sdim  DIArray SPs = getOrCreateArray(AllSubprograms);
54249259Sdim  DIType(TempSubprograms).replaceAllUsesWith(SPs);
55249259Sdim  for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) {
56249259Sdim    DISubprogram SP(SPs.getElement(i));
57249259Sdim    SmallVector<Value *, 4> Variables;
58249259Sdim    if (NamedMDNode *NMD = getFnSpecificMDNode(M, SP)) {
59249259Sdim      for (unsigned ii = 0, ee = NMD->getNumOperands(); ii != ee; ++ii)
60249259Sdim        Variables.push_back(NMD->getOperand(ii));
61249259Sdim      NMD->eraseFromParent();
62249259Sdim    }
63249259Sdim    if (MDNode *Temp = SP.getVariablesNodes()) {
64249259Sdim      DIArray AV = getOrCreateArray(Variables);
65249259Sdim      DIType(Temp).replaceAllUsesWith(AV);
66249259Sdim    }
67249259Sdim  }
68249259Sdim
69249259Sdim  DIArray GVs = getOrCreateArray(AllGVs);
70249259Sdim  DIType(TempGVs).replaceAllUsesWith(GVs);
71252723Sdim
72252723Sdim  DIArray IMs = getOrCreateArray(AllImportedModules);
73252723Sdim  DIType(TempImportedModules).replaceAllUsesWith(IMs);
74249259Sdim}
75249259Sdim
76249259Sdim/// getNonCompileUnitScope - If N is compile unit return NULL otherwise return
77249259Sdim/// N.
78249259Sdimstatic MDNode *getNonCompileUnitScope(MDNode *N) {
79249259Sdim  if (DIDescriptor(N).isCompileUnit())
80249259Sdim    return NULL;
81249259Sdim  return N;
82249259Sdim}
83249259Sdim
84249259Sdimstatic MDNode *createFilePathPair(LLVMContext &VMContext, StringRef Filename,
85249259Sdim                                  StringRef Directory) {
86249259Sdim  assert(!Filename.empty() && "Unable to create file without name");
87249259Sdim  Value *Pair[] = {
88249259Sdim    MDString::get(VMContext, Filename),
89263509Sdim    MDString::get(VMContext, Directory)
90249259Sdim  };
91249259Sdim  return MDNode::get(VMContext, Pair);
92249259Sdim}
93249259Sdim
94249259Sdim/// createCompileUnit - A CompileUnit provides an anchor for all debugging
95249259Sdim/// information generated during this instance of compilation.
96263509SdimDICompileUnit DIBuilder::createCompileUnit(unsigned Lang, StringRef Filename,
97263509Sdim                                           StringRef Directory,
98263509Sdim                                           StringRef Producer, bool isOptimized,
99263509Sdim                                           StringRef Flags, unsigned RunTimeVer,
100263509Sdim                                           StringRef SplitName) {
101249259Sdim  assert(((Lang <= dwarf::DW_LANG_Python && Lang >= dwarf::DW_LANG_C89) ||
102249259Sdim          (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) &&
103249259Sdim         "Invalid Language tag");
104249259Sdim  assert(!Filename.empty() &&
105249259Sdim         "Unable to create compile unit without filename");
106249259Sdim  Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
107249259Sdim  TempEnumTypes = MDNode::getTemporary(VMContext, TElts);
108249259Sdim
109249259Sdim  TempRetainTypes = MDNode::getTemporary(VMContext, TElts);
110249259Sdim
111249259Sdim  TempSubprograms = MDNode::getTemporary(VMContext, TElts);
112249259Sdim
113249259Sdim  TempGVs = MDNode::getTemporary(VMContext, TElts);
114249259Sdim
115252723Sdim  TempImportedModules = MDNode::getTemporary(VMContext, TElts);
116252723Sdim
117249259Sdim  Value *Elts[] = {
118249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_compile_unit),
119249259Sdim    createFilePathPair(VMContext, Filename, Directory),
120249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), Lang),
121249259Sdim    MDString::get(VMContext, Producer),
122249259Sdim    ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
123249259Sdim    MDString::get(VMContext, Flags),
124249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeVer),
125249259Sdim    TempEnumTypes,
126249259Sdim    TempRetainTypes,
127249259Sdim    TempSubprograms,
128249259Sdim    TempGVs,
129252723Sdim    TempImportedModules,
130249259Sdim    MDString::get(VMContext, SplitName)
131249259Sdim  };
132249259Sdim
133263509Sdim  MDNode *CUNode = MDNode::get(VMContext, Elts);
134263509Sdim
135249259Sdim  // Create a named metadata so that it is easier to find cu in a module.
136249259Sdim  NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
137263509Sdim  NMD->addOperand(CUNode);
138263509Sdim
139263509Sdim  return DICompileUnit(CUNode);
140249259Sdim}
141249259Sdim
142263509Sdimstatic DIImportedEntity
143263509SdimcreateImportedModule(LLVMContext &C, DIScope Context, DIDescriptor NS,
144263509Sdim                     unsigned Line, StringRef Name,
145263509Sdim                     SmallVectorImpl<Value *> &AllImportedModules) {
146263509Sdim  const MDNode *R;
147263509Sdim  if (Name.empty()) {
148263509Sdim    Value *Elts[] = {
149263509Sdim      GetTagConstant(C, dwarf::DW_TAG_imported_module),
150263509Sdim      Context,
151263509Sdim      NS,
152263509Sdim      ConstantInt::get(Type::getInt32Ty(C), Line),
153263509Sdim    };
154263509Sdim    R = MDNode::get(C, Elts);
155263509Sdim  } else {
156263509Sdim    Value *Elts[] = {
157263509Sdim      GetTagConstant(C, dwarf::DW_TAG_imported_module),
158263509Sdim      Context,
159263509Sdim      NS,
160263509Sdim      ConstantInt::get(Type::getInt32Ty(C), Line),
161263509Sdim      MDString::get(C, Name)
162263509Sdim    };
163263509Sdim    R = MDNode::get(C, Elts);
164263509Sdim  }
165263509Sdim  DIImportedEntity M(R);
166263509Sdim  assert(M.Verify() && "Imported module should be valid");
167263509Sdim  AllImportedModules.push_back(M);
168263509Sdim  return M;
169263509Sdim}
170263509Sdim
171263509SdimDIImportedEntity DIBuilder::createImportedModule(DIScope Context,
172263509Sdim                                                 DINameSpace NS, unsigned Line,
173263509Sdim                                                 StringRef Name) {
174263509Sdim  return ::createImportedModule(VMContext, Context, NS, Line, Name,
175263509Sdim                                AllImportedModules);
176263509Sdim}
177263509Sdim
178263509SdimDIImportedEntity DIBuilder::createImportedModule(DIScope Context,
179263509Sdim                                                 DIImportedEntity NS,
180263509Sdim                                                 unsigned Line,
181263509Sdim                                                 StringRef Name) {
182263509Sdim  return ::createImportedModule(VMContext, Context, NS, Line, Name,
183263509Sdim                                AllImportedModules);
184263509Sdim}
185263509Sdim
186263509SdimDIImportedEntity DIBuilder::createImportedDeclaration(DIScope Context,
187263509Sdim                                                      DIDescriptor Decl,
188263509Sdim                                                      unsigned Line) {
189252723Sdim  Value *Elts[] = {
190263509Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_imported_declaration),
191252723Sdim    Context,
192263509Sdim    Decl,
193252723Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), Line),
194252723Sdim  };
195263509Sdim  DIImportedEntity M(MDNode::get(VMContext, Elts));
196252723Sdim  assert(M.Verify() && "Imported module should be valid");
197252723Sdim  AllImportedModules.push_back(M);
198252723Sdim  return M;
199252723Sdim}
200252723Sdim
201249259Sdim/// createFile - Create a file descriptor to hold debugging information
202249259Sdim/// for a file.
203249259SdimDIFile DIBuilder::createFile(StringRef Filename, StringRef Directory) {
204249259Sdim  Value *Elts[] = {
205249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_file_type),
206249259Sdim    createFilePathPair(VMContext, Filename, Directory)
207249259Sdim  };
208249259Sdim  return DIFile(MDNode::get(VMContext, Elts));
209249259Sdim}
210249259Sdim
211249259Sdim/// createEnumerator - Create a single enumerator value.
212263509SdimDIEnumerator DIBuilder::createEnumerator(StringRef Name, int64_t Val) {
213249259Sdim  assert(!Name.empty() && "Unable to create enumerator without name");
214249259Sdim  Value *Elts[] = {
215249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_enumerator),
216249259Sdim    MDString::get(VMContext, Name),
217249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), Val)
218249259Sdim  };
219249259Sdim  return DIEnumerator(MDNode::get(VMContext, Elts));
220249259Sdim}
221249259Sdim
222263509Sdim/// \brief Create a DWARF unspecified type.
223263509SdimDIBasicType DIBuilder::createUnspecifiedType(StringRef Name) {
224249259Sdim  assert(!Name.empty() && "Unable to create type without name");
225263509Sdim  // Unspecified types are encoded in DIBasicType format. Line number, filename,
226263509Sdim  // size, alignment, offset and flags are always empty here.
227249259Sdim  Value *Elts[] = {
228249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_type),
229249259Sdim    NULL, // Filename
230263509Sdim    NULL, // Unused
231249259Sdim    MDString::get(VMContext, Name),
232249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
233249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
234249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
235249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
236249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags;
237249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0)  // Encoding
238249259Sdim  };
239263509Sdim  return DIBasicType(MDNode::get(VMContext, Elts));
240249259Sdim}
241249259Sdim
242263509Sdim/// \brief Create C++11 nullptr type.
243263509SdimDIBasicType DIBuilder::createNullPtrType() {
244263509Sdim  return createUnspecifiedType("decltype(nullptr)");
245263509Sdim}
246263509Sdim
247249259Sdim/// createBasicType - Create debugging information entry for a basic
248249259Sdim/// type, e.g 'char'.
249249259SdimDIBasicType
250249259SdimDIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits,
251249259Sdim                           uint64_t AlignInBits, unsigned Encoding) {
252249259Sdim  assert(!Name.empty() && "Unable to create type without name");
253249259Sdim  // Basic types are encoded in DIBasicType format. Line number, filename,
254249259Sdim  // offset and flags are always empty here.
255249259Sdim  Value *Elts[] = {
256249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_base_type),
257249259Sdim    NULL, // File/directory name
258263509Sdim    NULL, // Unused
259249259Sdim    MDString::get(VMContext, Name),
260249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
261249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
262249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
263249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
264249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags;
265249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), Encoding)
266249259Sdim  };
267249259Sdim  return DIBasicType(MDNode::get(VMContext, Elts));
268249259Sdim}
269249259Sdim
270249259Sdim/// createQualifiedType - Create debugging information entry for a qualified
271249259Sdim/// type, e.g. 'const int'.
272249259SdimDIDerivedType DIBuilder::createQualifiedType(unsigned Tag, DIType FromTy) {
273249259Sdim  // Qualified types are encoded in DIDerivedType format.
274249259Sdim  Value *Elts[] = {
275249259Sdim    GetTagConstant(VMContext, Tag),
276249259Sdim    NULL, // Filename
277263509Sdim    NULL, // Unused
278249259Sdim    MDString::get(VMContext, StringRef()), // Empty name.
279249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
280249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
281249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
282249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
283249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
284263509Sdim    FromTy.getRef()
285249259Sdim  };
286249259Sdim  return DIDerivedType(MDNode::get(VMContext, Elts));
287249259Sdim}
288249259Sdim
289249259Sdim/// createPointerType - Create debugging information entry for a pointer.
290249259SdimDIDerivedType
291249259SdimDIBuilder::createPointerType(DIType PointeeTy, uint64_t SizeInBits,
292249259Sdim                             uint64_t AlignInBits, StringRef Name) {
293249259Sdim  // Pointer types are encoded in DIDerivedType format.
294249259Sdim  Value *Elts[] = {
295249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_pointer_type),
296249259Sdim    NULL, // Filename
297263509Sdim    NULL, // Unused
298249259Sdim    MDString::get(VMContext, Name),
299249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
300249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
301249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
302249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
303249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
304263509Sdim    PointeeTy.getRef()
305249259Sdim  };
306249259Sdim  return DIDerivedType(MDNode::get(VMContext, Elts));
307249259Sdim}
308249259Sdim
309252723SdimDIDerivedType DIBuilder::createMemberPointerType(DIType PointeeTy,
310252723Sdim                                                 DIType Base) {
311249259Sdim  // Pointer types are encoded in DIDerivedType format.
312249259Sdim  Value *Elts[] = {
313249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_ptr_to_member_type),
314249259Sdim    NULL, // Filename
315263509Sdim    NULL, // Unused
316249259Sdim    NULL,
317249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
318263509Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
319263509Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
320249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
321249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
322263509Sdim    PointeeTy.getRef(),
323263509Sdim    Base.getRef()
324249259Sdim  };
325249259Sdim  return DIDerivedType(MDNode::get(VMContext, Elts));
326249259Sdim}
327249259Sdim
328249259Sdim/// createReferenceType - Create debugging information entry for a reference
329249259Sdim/// type.
330249259SdimDIDerivedType DIBuilder::createReferenceType(unsigned Tag, DIType RTy) {
331263509Sdim  assert(RTy.isType() && "Unable to create reference type");
332249259Sdim  // References are encoded in DIDerivedType format.
333249259Sdim  Value *Elts[] = {
334249259Sdim    GetTagConstant(VMContext, Tag),
335249259Sdim    NULL, // Filename
336249259Sdim    NULL, // TheCU,
337249259Sdim    NULL, // Name
338249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
339249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
340249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
341249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
342249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
343263509Sdim    RTy.getRef()
344249259Sdim  };
345249259Sdim  return DIDerivedType(MDNode::get(VMContext, Elts));
346249259Sdim}
347249259Sdim
348249259Sdim/// createTypedef - Create debugging information entry for a typedef.
349249259SdimDIDerivedType DIBuilder::createTypedef(DIType Ty, StringRef Name, DIFile File,
350249259Sdim                                       unsigned LineNo, DIDescriptor Context) {
351249259Sdim  // typedefs are encoded in DIDerivedType format.
352263509Sdim  assert(Ty.isType() && "Invalid typedef type!");
353249259Sdim  Value *Elts[] = {
354249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_typedef),
355249259Sdim    File.getFileNode(),
356263509Sdim    DIScope(getNonCompileUnitScope(Context)).getRef(),
357249259Sdim    MDString::get(VMContext, Name),
358249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
359249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
360249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
361249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
362249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
363263509Sdim    Ty.getRef()
364249259Sdim  };
365249259Sdim  return DIDerivedType(MDNode::get(VMContext, Elts));
366249259Sdim}
367249259Sdim
368249259Sdim/// createFriend - Create debugging information entry for a 'friend'.
369263509SdimDIDerivedType DIBuilder::createFriend(DIType Ty, DIType FriendTy) {
370249259Sdim  // typedefs are encoded in DIDerivedType format.
371263509Sdim  assert(Ty.isType() && "Invalid type!");
372263509Sdim  assert(FriendTy.isType() && "Invalid friend type!");
373249259Sdim  Value *Elts[] = {
374249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_friend),
375249259Sdim    NULL,
376263509Sdim    Ty.getRef(),
377249259Sdim    NULL, // Name
378249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
379249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
380249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
381249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
382249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
383263509Sdim    FriendTy.getRef()
384249259Sdim  };
385263509Sdim  return DIDerivedType(MDNode::get(VMContext, Elts));
386249259Sdim}
387249259Sdim
388249259Sdim/// createInheritance - Create debugging information entry to establish
389249259Sdim/// inheritance relationship between two types.
390263509SdimDIDerivedType DIBuilder::createInheritance(DIType Ty, DIType BaseTy,
391263509Sdim                                           uint64_t BaseOffset,
392263509Sdim                                           unsigned Flags) {
393263509Sdim  assert(Ty.isType() && "Unable to create inheritance");
394249259Sdim  // TAG_inheritance is encoded in DIDerivedType format.
395249259Sdim  Value *Elts[] = {
396249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_inheritance),
397249259Sdim    NULL,
398263509Sdim    Ty.getRef(),
399249259Sdim    NULL, // Name
400249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
401249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
402249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
403249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), BaseOffset),
404249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
405263509Sdim    BaseTy.getRef()
406249259Sdim  };
407249259Sdim  return DIDerivedType(MDNode::get(VMContext, Elts));
408249259Sdim}
409249259Sdim
410249259Sdim/// createMemberType - Create debugging information entry for a member.
411263509SdimDIDerivedType DIBuilder::createMemberType(DIDescriptor Scope, StringRef Name,
412263509Sdim                                          DIFile File, unsigned LineNumber,
413263509Sdim                                          uint64_t SizeInBits,
414263509Sdim                                          uint64_t AlignInBits,
415263509Sdim                                          uint64_t OffsetInBits, unsigned Flags,
416263509Sdim                                          DIType Ty) {
417249259Sdim  // TAG_member is encoded in DIDerivedType format.
418249259Sdim  Value *Elts[] = {
419249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_member),
420249259Sdim    File.getFileNode(),
421263509Sdim    DIScope(getNonCompileUnitScope(Scope)).getRef(),
422249259Sdim    MDString::get(VMContext, Name),
423249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
424249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
425249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
426249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
427249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
428263509Sdim    Ty.getRef()
429249259Sdim  };
430249259Sdim  return DIDerivedType(MDNode::get(VMContext, Elts));
431249259Sdim}
432249259Sdim
433249259Sdim/// createStaticMemberType - Create debugging information entry for a
434249259Sdim/// C++ static data member.
435263509SdimDIDerivedType
436263509SdimDIBuilder::createStaticMemberType(DIDescriptor Scope, StringRef Name,
437263509Sdim                                  DIFile File, unsigned LineNumber,
438263509Sdim                                  DIType Ty, unsigned Flags,
439263509Sdim                                  llvm::Value *Val) {
440249259Sdim  // TAG_member is encoded in DIDerivedType format.
441249259Sdim  Flags |= DIDescriptor::FlagStaticMember;
442249259Sdim  Value *Elts[] = {
443249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_member),
444249259Sdim    File.getFileNode(),
445263509Sdim    DIScope(getNonCompileUnitScope(Scope)).getRef(),
446249259Sdim    MDString::get(VMContext, Name),
447249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
448263509Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
449263509Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
450263509Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
451249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
452263509Sdim    Ty.getRef(),
453249259Sdim    Val
454249259Sdim  };
455263509Sdim  return DIDerivedType(MDNode::get(VMContext, Elts));
456249259Sdim}
457249259Sdim
458249259Sdim/// createObjCIVar - Create debugging information entry for Objective-C
459249259Sdim/// instance variable.
460263509SdimDIDerivedType
461263509SdimDIBuilder::createObjCIVar(StringRef Name, DIFile File, unsigned LineNumber,
462263509Sdim                          uint64_t SizeInBits, uint64_t AlignInBits,
463263509Sdim                          uint64_t OffsetInBits, unsigned Flags, DIType Ty,
464263509Sdim                          StringRef PropertyName, StringRef GetterName,
465263509Sdim                          StringRef SetterName, unsigned PropertyAttributes) {
466249259Sdim  // TAG_member is encoded in DIDerivedType format.
467249259Sdim  Value *Elts[] = {
468249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_member),
469249259Sdim    File.getFileNode(),
470249259Sdim    getNonCompileUnitScope(File),
471249259Sdim    MDString::get(VMContext, Name),
472249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
473249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
474249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
475249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
476249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
477249259Sdim    Ty,
478249259Sdim    MDString::get(VMContext, PropertyName),
479249259Sdim    MDString::get(VMContext, GetterName),
480249259Sdim    MDString::get(VMContext, SetterName),
481249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes)
482249259Sdim  };
483263509Sdim  return DIDerivedType(MDNode::get(VMContext, Elts));
484249259Sdim}
485249259Sdim
486249259Sdim/// createObjCIVar - Create debugging information entry for Objective-C
487249259Sdim/// instance variable.
488263509SdimDIDerivedType DIBuilder::createObjCIVar(StringRef Name, DIFile File,
489263509Sdim                                        unsigned LineNumber,
490263509Sdim                                        uint64_t SizeInBits,
491263509Sdim                                        uint64_t AlignInBits,
492263509Sdim                                        uint64_t OffsetInBits, unsigned Flags,
493263509Sdim                                        DIType Ty, MDNode *PropertyNode) {
494249259Sdim  // TAG_member is encoded in DIDerivedType format.
495249259Sdim  Value *Elts[] = {
496249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_member),
497249259Sdim    File.getFileNode(),
498249259Sdim    getNonCompileUnitScope(File),
499249259Sdim    MDString::get(VMContext, Name),
500249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
501249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
502249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
503249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
504249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
505249259Sdim    Ty,
506249259Sdim    PropertyNode
507249259Sdim  };
508263509Sdim  return DIDerivedType(MDNode::get(VMContext, Elts));
509249259Sdim}
510249259Sdim
511249259Sdim/// createObjCProperty - Create debugging information entry for Objective-C
512249259Sdim/// property.
513263509SdimDIObjCProperty
514263509SdimDIBuilder::createObjCProperty(StringRef Name, DIFile File, unsigned LineNumber,
515263509Sdim                              StringRef GetterName, StringRef SetterName,
516263509Sdim                              unsigned PropertyAttributes, DIType Ty) {
517249259Sdim  Value *Elts[] = {
518249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_APPLE_property),
519249259Sdim    MDString::get(VMContext, Name),
520249259Sdim    File,
521249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
522249259Sdim    MDString::get(VMContext, GetterName),
523249259Sdim    MDString::get(VMContext, SetterName),
524249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes),
525249259Sdim    Ty
526249259Sdim  };
527249259Sdim  return DIObjCProperty(MDNode::get(VMContext, Elts));
528249259Sdim}
529249259Sdim
530249259Sdim/// createTemplateTypeParameter - Create debugging information for template
531249259Sdim/// type parameter.
532249259SdimDITemplateTypeParameter
533249259SdimDIBuilder::createTemplateTypeParameter(DIDescriptor Context, StringRef Name,
534249259Sdim                                       DIType Ty, MDNode *File, unsigned LineNo,
535249259Sdim                                       unsigned ColumnNo) {
536249259Sdim  Value *Elts[] = {
537249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_template_type_parameter),
538263509Sdim    DIScope(getNonCompileUnitScope(Context)).getRef(),
539249259Sdim    MDString::get(VMContext, Name),
540263509Sdim    Ty.getRef(),
541249259Sdim    File,
542249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
543249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo)
544249259Sdim  };
545249259Sdim  return DITemplateTypeParameter(MDNode::get(VMContext, Elts));
546249259Sdim}
547249259Sdim
548249259SdimDITemplateValueParameter
549263509SdimDIBuilder::createTemplateValueParameter(unsigned Tag, DIDescriptor Context,
550263509Sdim                                        StringRef Name, DIType Ty,
551263509Sdim                                        Value *Val, MDNode *File,
552263509Sdim                                        unsigned LineNo,
553249259Sdim                                        unsigned ColumnNo) {
554249259Sdim  Value *Elts[] = {
555263509Sdim    GetTagConstant(VMContext, Tag),
556263509Sdim    DIScope(getNonCompileUnitScope(Context)).getRef(),
557249259Sdim    MDString::get(VMContext, Name),
558263509Sdim    Ty.getRef(),
559263509Sdim    Val,
560249259Sdim    File,
561249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
562249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo)
563249259Sdim  };
564249259Sdim  return DITemplateValueParameter(MDNode::get(VMContext, Elts));
565249259Sdim}
566249259Sdim
567263509Sdim/// createTemplateValueParameter - Create debugging information for template
568263509Sdim/// value parameter.
569263509SdimDITemplateValueParameter
570263509SdimDIBuilder::createTemplateValueParameter(DIDescriptor Context, StringRef Name,
571263509Sdim                                        DIType Ty, Value *Val,
572263509Sdim                                        MDNode *File, unsigned LineNo,
573263509Sdim                                        unsigned ColumnNo) {
574263509Sdim  return createTemplateValueParameter(dwarf::DW_TAG_template_value_parameter,
575263509Sdim                                      Context, Name, Ty, Val, File, LineNo,
576263509Sdim                                      ColumnNo);
577263509Sdim}
578263509Sdim
579263509SdimDITemplateValueParameter
580263509SdimDIBuilder::createTemplateTemplateParameter(DIDescriptor Context, StringRef Name,
581263509Sdim                                           DIType Ty, StringRef Val,
582263509Sdim                                           MDNode *File, unsigned LineNo,
583263509Sdim                                           unsigned ColumnNo) {
584263509Sdim  return createTemplateValueParameter(
585263509Sdim      dwarf::DW_TAG_GNU_template_template_param, Context, Name, Ty,
586263509Sdim      MDString::get(VMContext, Val), File, LineNo, ColumnNo);
587263509Sdim}
588263509Sdim
589263509SdimDITemplateValueParameter
590263509SdimDIBuilder::createTemplateParameterPack(DIDescriptor Context, StringRef Name,
591263509Sdim                                       DIType Ty, DIArray Val,
592263509Sdim                                       MDNode *File, unsigned LineNo,
593263509Sdim                                       unsigned ColumnNo) {
594263509Sdim  return createTemplateValueParameter(dwarf::DW_TAG_GNU_template_parameter_pack,
595263509Sdim                                      Context, Name, Ty, Val, File, LineNo,
596263509Sdim                                      ColumnNo);
597263509Sdim}
598263509Sdim
599249259Sdim/// createClassType - Create debugging information entry for a class.
600249259SdimDICompositeType DIBuilder::createClassType(DIDescriptor Context, StringRef Name,
601249259Sdim                                           DIFile File, unsigned LineNumber,
602249259Sdim                                           uint64_t SizeInBits,
603249259Sdim                                           uint64_t AlignInBits,
604249259Sdim                                           uint64_t OffsetInBits,
605249259Sdim                                           unsigned Flags, DIType DerivedFrom,
606249259Sdim                                           DIArray Elements,
607263509Sdim                                           DIType VTableHolder,
608263509Sdim                                           MDNode *TemplateParams,
609263509Sdim                                           StringRef UniqueIdentifier) {
610263509Sdim  assert((!Context || Context.isScope() || Context.isType()) &&
611249259Sdim         "createClassType should be called with a valid Context");
612249259Sdim  // TAG_class_type is encoded in DICompositeType format.
613249259Sdim  Value *Elts[] = {
614249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_class_type),
615249259Sdim    File.getFileNode(),
616263509Sdim    DIScope(getNonCompileUnitScope(Context)).getRef(),
617249259Sdim    MDString::get(VMContext, Name),
618249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
619249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
620249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
621249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), OffsetInBits),
622249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
623263509Sdim    DerivedFrom.getRef(),
624249259Sdim    Elements,
625249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
626263509Sdim    VTableHolder.getRef(),
627263509Sdim    TemplateParams,
628263509Sdim    UniqueIdentifier.empty() ? NULL : MDString::get(VMContext, UniqueIdentifier)
629249259Sdim  };
630249259Sdim  DICompositeType R(MDNode::get(VMContext, Elts));
631263509Sdim  assert(R.isCompositeType() &&
632263509Sdim         "createClassType should return a DICompositeType");
633263509Sdim  if (!UniqueIdentifier.empty())
634263509Sdim    retainType(R);
635249259Sdim  return R;
636249259Sdim}
637249259Sdim
638249259Sdim/// createStructType - Create debugging information entry for a struct.
639249259SdimDICompositeType DIBuilder::createStructType(DIDescriptor Context,
640249259Sdim                                            StringRef Name, DIFile File,
641249259Sdim                                            unsigned LineNumber,
642249259Sdim                                            uint64_t SizeInBits,
643249259Sdim                                            uint64_t AlignInBits,
644249259Sdim                                            unsigned Flags, DIType DerivedFrom,
645249259Sdim                                            DIArray Elements,
646249259Sdim                                            unsigned RunTimeLang,
647263509Sdim                                            DIType VTableHolder,
648263509Sdim                                            StringRef UniqueIdentifier) {
649249259Sdim // TAG_structure_type is encoded in DICompositeType format.
650249259Sdim  Value *Elts[] = {
651249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_structure_type),
652249259Sdim    File.getFileNode(),
653263509Sdim    DIScope(getNonCompileUnitScope(Context)).getRef(),
654249259Sdim    MDString::get(VMContext, Name),
655249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
656249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
657249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
658249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
659249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
660263509Sdim    DerivedFrom.getRef(),
661249259Sdim    Elements,
662249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang),
663263509Sdim    VTableHolder.getRef(),
664249259Sdim    NULL,
665263509Sdim    UniqueIdentifier.empty() ? NULL : MDString::get(VMContext, UniqueIdentifier)
666249259Sdim  };
667249259Sdim  DICompositeType R(MDNode::get(VMContext, Elts));
668263509Sdim  assert(R.isCompositeType() &&
669263509Sdim         "createStructType should return a DICompositeType");
670263509Sdim  if (!UniqueIdentifier.empty())
671263509Sdim    retainType(R);
672249259Sdim  return R;
673249259Sdim}
674249259Sdim
675249259Sdim/// createUnionType - Create debugging information entry for an union.
676249259SdimDICompositeType DIBuilder::createUnionType(DIDescriptor Scope, StringRef Name,
677249259Sdim                                           DIFile File, unsigned LineNumber,
678249259Sdim                                           uint64_t SizeInBits,
679249259Sdim                                           uint64_t AlignInBits, unsigned Flags,
680249259Sdim                                           DIArray Elements,
681263509Sdim                                           unsigned RunTimeLang,
682263509Sdim                                           StringRef UniqueIdentifier) {
683249259Sdim  // TAG_union_type is encoded in DICompositeType format.
684249259Sdim  Value *Elts[] = {
685249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_union_type),
686249259Sdim    File.getFileNode(),
687263509Sdim    DIScope(getNonCompileUnitScope(Scope)).getRef(),
688249259Sdim    MDString::get(VMContext, Name),
689249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
690249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
691249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
692263509Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
693249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
694249259Sdim    NULL,
695249259Sdim    Elements,
696249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang),
697263509Sdim    NULL,
698263509Sdim    NULL,
699263509Sdim    UniqueIdentifier.empty() ? NULL : MDString::get(VMContext, UniqueIdentifier)
700249259Sdim  };
701263509Sdim  DICompositeType R(MDNode::get(VMContext, Elts));
702263509Sdim  if (!UniqueIdentifier.empty())
703263509Sdim    retainType(R);
704263509Sdim  return R;
705249259Sdim}
706249259Sdim
707249259Sdim/// createSubroutineType - Create subroutine type.
708263509SdimDICompositeType DIBuilder::createSubroutineType(DIFile File,
709263509Sdim                                                DIArray ParameterTypes) {
710249259Sdim  // TAG_subroutine_type is encoded in DICompositeType format.
711249259Sdim  Value *Elts[] = {
712249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_subroutine_type),
713249259Sdim    Constant::getNullValue(Type::getInt32Ty(VMContext)),
714263509Sdim    NULL,
715249259Sdim    MDString::get(VMContext, ""),
716263509Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
717263509Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
718263509Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
719263509Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
720263509Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
721249259Sdim    NULL,
722249259Sdim    ParameterTypes,
723249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
724263509Sdim    NULL,
725263509Sdim    NULL,
726263509Sdim    NULL  // Type Identifer
727249259Sdim  };
728249259Sdim  return DICompositeType(MDNode::get(VMContext, Elts));
729249259Sdim}
730249259Sdim
731249259Sdim/// createEnumerationType - Create debugging information entry for an
732249259Sdim/// enumeration.
733249259SdimDICompositeType DIBuilder::createEnumerationType(
734249259Sdim    DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber,
735249259Sdim    uint64_t SizeInBits, uint64_t AlignInBits, DIArray Elements,
736263509Sdim    DIType UnderlyingType, StringRef UniqueIdentifier) {
737249259Sdim  // TAG_enumeration_type is encoded in DICompositeType format.
738249259Sdim  Value *Elts[] = {
739249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_enumeration_type),
740249259Sdim    File.getFileNode(),
741263509Sdim    DIScope(getNonCompileUnitScope(Scope)).getRef(),
742249259Sdim    MDString::get(VMContext, Name),
743249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
744249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
745249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
746263509Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Offset
747263509Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
748263509Sdim    UnderlyingType.getRef(),
749249259Sdim    Elements,
750249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
751263509Sdim    NULL,
752263509Sdim    NULL,
753263509Sdim    UniqueIdentifier.empty() ? NULL : MDString::get(VMContext, UniqueIdentifier)
754249259Sdim  };
755263509Sdim  DICompositeType CTy(MDNode::get(VMContext, Elts));
756263509Sdim  AllEnumTypes.push_back(CTy);
757263509Sdim  if (!UniqueIdentifier.empty())
758263509Sdim    retainType(CTy);
759263509Sdim  return CTy;
760249259Sdim}
761249259Sdim
762249259Sdim/// createArrayType - Create debugging information entry for an array.
763249259SdimDICompositeType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits,
764249259Sdim                                           DIType Ty, DIArray Subscripts) {
765249259Sdim  // TAG_array_type is encoded in DICompositeType format.
766249259Sdim  Value *Elts[] = {
767249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_array_type),
768249259Sdim    NULL, // Filename/Directory,
769263509Sdim    NULL, // Unused
770249259Sdim    MDString::get(VMContext, ""),
771263509Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
772249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), Size),
773249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
774263509Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Offset
775263509Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
776263509Sdim    Ty.getRef(),
777249259Sdim    Subscripts,
778249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
779263509Sdim    NULL,
780263509Sdim    NULL,
781263509Sdim    NULL  // Type Identifer
782249259Sdim  };
783249259Sdim  return DICompositeType(MDNode::get(VMContext, Elts));
784249259Sdim}
785249259Sdim
786249259Sdim/// createVectorType - Create debugging information entry for a vector.
787263509SdimDICompositeType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits,
788263509Sdim                                            DIType Ty, DIArray Subscripts) {
789249259Sdim  // A vector is an array type with the FlagVector flag applied.
790249259Sdim  Value *Elts[] = {
791249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_array_type),
792249259Sdim    NULL, // Filename/Directory,
793263509Sdim    NULL, // Unused
794249259Sdim    MDString::get(VMContext, ""),
795263509Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
796249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), Size),
797249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
798263509Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Offset
799249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), DIType::FlagVector),
800263509Sdim    Ty.getRef(),
801249259Sdim    Subscripts,
802249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
803263509Sdim    NULL,
804263509Sdim    NULL,
805263509Sdim    NULL  // Type Identifer
806249259Sdim  };
807263509Sdim  return DICompositeType(MDNode::get(VMContext, Elts));
808249259Sdim}
809249259Sdim
810249259Sdim/// createArtificialType - Create a new DIType with "artificial" flag set.
811249259SdimDIType DIBuilder::createArtificialType(DIType Ty) {
812249259Sdim  if (Ty.isArtificial())
813249259Sdim    return Ty;
814249259Sdim
815249259Sdim  SmallVector<Value *, 9> Elts;
816249259Sdim  MDNode *N = Ty;
817249259Sdim  assert (N && "Unexpected input DIType!");
818263509Sdim  for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i)
819263509Sdim    Elts.push_back(N->getOperand(i));
820249259Sdim
821249259Sdim  unsigned CurFlags = Ty.getFlags();
822249259Sdim  CurFlags = CurFlags | DIType::FlagArtificial;
823249259Sdim
824249259Sdim  // Flags are stored at this slot.
825263509Sdim  // FIXME: Add an enum for this magic value.
826249259Sdim  Elts[8] =  ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
827249259Sdim
828249259Sdim  return DIType(MDNode::get(VMContext, Elts));
829249259Sdim}
830249259Sdim
831249259Sdim/// createObjectPointerType - Create a new type with both the object pointer
832249259Sdim/// and artificial flags set.
833249259SdimDIType DIBuilder::createObjectPointerType(DIType Ty) {
834249259Sdim  if (Ty.isObjectPointer())
835249259Sdim    return Ty;
836249259Sdim
837249259Sdim  SmallVector<Value *, 9> Elts;
838249259Sdim  MDNode *N = Ty;
839249259Sdim  assert (N && "Unexpected input DIType!");
840263509Sdim  for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i)
841263509Sdim    Elts.push_back(N->getOperand(i));
842249259Sdim
843249259Sdim  unsigned CurFlags = Ty.getFlags();
844249259Sdim  CurFlags = CurFlags | (DIType::FlagObjectPointer | DIType::FlagArtificial);
845249259Sdim
846249259Sdim  // Flags are stored at this slot.
847263509Sdim  // FIXME: Add an enum for this magic value.
848249259Sdim  Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
849249259Sdim
850249259Sdim  return DIType(MDNode::get(VMContext, Elts));
851249259Sdim}
852249259Sdim
853249259Sdim/// retainType - Retain DIType in a module even if it is not referenced
854249259Sdim/// through debug info anchors.
855249259Sdimvoid DIBuilder::retainType(DIType T) {
856263509Sdim  AllRetainTypes.push_back(TrackingVH<MDNode>(T));
857249259Sdim}
858249259Sdim
859249259Sdim/// createUnspecifiedParameter - Create unspeicified type descriptor
860249259Sdim/// for the subroutine type.
861249259SdimDIDescriptor DIBuilder::createUnspecifiedParameter() {
862249259Sdim  Value *Elts[] = {
863249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_parameters)
864249259Sdim  };
865249259Sdim  return DIDescriptor(MDNode::get(VMContext, Elts));
866249259Sdim}
867249259Sdim
868249259Sdim/// createForwardDecl - Create a temporary forward-declared type that
869249259Sdim/// can be RAUW'd if the full type is seen.
870263509SdimDICompositeType
871263509SdimDIBuilder::createForwardDecl(unsigned Tag, StringRef Name, DIDescriptor Scope,
872263509Sdim                             DIFile F, unsigned Line, unsigned RuntimeLang,
873263509Sdim                             uint64_t SizeInBits, uint64_t AlignInBits,
874263509Sdim                             StringRef UniqueIdentifier) {
875249259Sdim  // Create a temporary MDNode.
876249259Sdim  Value *Elts[] = {
877249259Sdim    GetTagConstant(VMContext, Tag),
878249259Sdim    F.getFileNode(),
879263509Sdim    DIScope(getNonCompileUnitScope(Scope)).getRef(),
880249259Sdim    MDString::get(VMContext, Name),
881249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), Line),
882249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
883249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
884263509Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Offset
885263509Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), DIDescriptor::FlagFwdDecl),
886249259Sdim    NULL,
887249259Sdim    DIArray(),
888263509Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang),
889263509Sdim    NULL,
890263509Sdim    NULL, //TemplateParams
891263509Sdim    UniqueIdentifier.empty() ? NULL : MDString::get(VMContext, UniqueIdentifier)
892249259Sdim  };
893249259Sdim  MDNode *Node = MDNode::getTemporary(VMContext, Elts);
894263509Sdim  DICompositeType RetTy(Node);
895263509Sdim  assert(RetTy.isCompositeType() &&
896263509Sdim         "createForwardDecl result should be a DIType");
897263509Sdim  if (!UniqueIdentifier.empty())
898263509Sdim    retainType(RetTy);
899263509Sdim  return RetTy;
900249259Sdim}
901249259Sdim
902249259Sdim/// getOrCreateArray - Get a DIArray, create one if required.
903249259SdimDIArray DIBuilder::getOrCreateArray(ArrayRef<Value *> Elements) {
904249259Sdim  if (Elements.empty()) {
905249259Sdim    Value *Null = Constant::getNullValue(Type::getInt32Ty(VMContext));
906249259Sdim    return DIArray(MDNode::get(VMContext, Null));
907249259Sdim  }
908249259Sdim  return DIArray(MDNode::get(VMContext, Elements));
909249259Sdim}
910249259Sdim
911249259Sdim/// getOrCreateSubrange - Create a descriptor for a value range.  This
912249259Sdim/// implicitly uniques the values returned.
913249259SdimDISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) {
914249259Sdim  Value *Elts[] = {
915249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_subrange_type),
916249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), Lo),
917249259Sdim    ConstantInt::get(Type::getInt64Ty(VMContext), Count)
918249259Sdim  };
919249259Sdim
920249259Sdim  return DISubrange(MDNode::get(VMContext, Elts));
921249259Sdim}
922249259Sdim
923249259Sdim/// \brief Create a new descriptor for the specified global.
924263509SdimDIGlobalVariable DIBuilder::createGlobalVariable(StringRef Name,
925263509Sdim                                                 StringRef LinkageName,
926263509Sdim                                                 DIFile F, unsigned LineNumber,
927263509Sdim                                                 DIType Ty, bool isLocalToUnit,
928263509Sdim                                                 Value *Val) {
929249259Sdim  Value *Elts[] = {
930249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_variable),
931249259Sdim    Constant::getNullValue(Type::getInt32Ty(VMContext)),
932249259Sdim    NULL, // TheCU,
933249259Sdim    MDString::get(VMContext, Name),
934249259Sdim    MDString::get(VMContext, Name),
935249259Sdim    MDString::get(VMContext, LinkageName),
936249259Sdim    F,
937249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
938249259Sdim    Ty,
939249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
940249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
941249259Sdim    Val,
942249259Sdim    DIDescriptor()
943249259Sdim  };
944249259Sdim  MDNode *Node = MDNode::get(VMContext, Elts);
945249259Sdim  AllGVs.push_back(Node);
946249259Sdim  return DIGlobalVariable(Node);
947249259Sdim}
948249259Sdim
949249259Sdim/// \brief Create a new descriptor for the specified global.
950263509SdimDIGlobalVariable DIBuilder::createGlobalVariable(StringRef Name, DIFile F,
951263509Sdim                                                 unsigned LineNumber, DIType Ty,
952263509Sdim                                                 bool isLocalToUnit,
953263509Sdim                                                 Value *Val) {
954249259Sdim  return createGlobalVariable(Name, Name, F, LineNumber, Ty, isLocalToUnit,
955249259Sdim                              Val);
956249259Sdim}
957249259Sdim
958249259Sdim/// createStaticVariable - Create a new descriptor for the specified static
959249259Sdim/// variable.
960263509SdimDIGlobalVariable DIBuilder::createStaticVariable(DIDescriptor Context,
961263509Sdim                                                 StringRef Name,
962263509Sdim                                                 StringRef LinkageName,
963263509Sdim                                                 DIFile F, unsigned LineNumber,
964263509Sdim                                                 DIType Ty, bool isLocalToUnit,
965263509Sdim                                                 Value *Val, MDNode *Decl) {
966249259Sdim  Value *Elts[] = {
967249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_variable),
968249259Sdim    Constant::getNullValue(Type::getInt32Ty(VMContext)),
969249259Sdim    getNonCompileUnitScope(Context),
970249259Sdim    MDString::get(VMContext, Name),
971249259Sdim    MDString::get(VMContext, Name),
972249259Sdim    MDString::get(VMContext, LinkageName),
973249259Sdim    F,
974249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
975249259Sdim    Ty,
976249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
977249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
978249259Sdim    Val,
979249259Sdim    DIDescriptor(Decl)
980249259Sdim  };
981249259Sdim  MDNode *Node = MDNode::get(VMContext, Elts);
982249259Sdim  AllGVs.push_back(Node);
983249259Sdim  return DIGlobalVariable(Node);
984249259Sdim}
985249259Sdim
986249259Sdim/// createVariable - Create a new descriptor for the specified variable.
987249259SdimDIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope,
988249259Sdim                                          StringRef Name, DIFile File,
989249259Sdim                                          unsigned LineNo, DIType Ty,
990249259Sdim                                          bool AlwaysPreserve, unsigned Flags,
991249259Sdim                                          unsigned ArgNo) {
992249259Sdim  DIDescriptor Context(getNonCompileUnitScope(Scope));
993263509Sdim  assert((!Context || Context.isScope()) &&
994249259Sdim         "createLocalVariable should be called with a valid Context");
995263509Sdim  assert(Ty.isType() &&
996249259Sdim         "createLocalVariable should be called with a valid type");
997249259Sdim  Value *Elts[] = {
998249259Sdim    GetTagConstant(VMContext, Tag),
999249259Sdim    getNonCompileUnitScope(Scope),
1000249259Sdim    MDString::get(VMContext, Name),
1001249259Sdim    File,
1002249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), (LineNo | (ArgNo << 24))),
1003249259Sdim    Ty,
1004249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
1005249259Sdim    Constant::getNullValue(Type::getInt32Ty(VMContext))
1006249259Sdim  };
1007249259Sdim  MDNode *Node = MDNode::get(VMContext, Elts);
1008249259Sdim  if (AlwaysPreserve) {
1009249259Sdim    // The optimizer may remove local variable. If there is an interest
1010249259Sdim    // to preserve variable info in such situation then stash it in a
1011249259Sdim    // named mdnode.
1012249259Sdim    DISubprogram Fn(getDISubprogram(Scope));
1013249259Sdim    NamedMDNode *FnLocals = getOrInsertFnSpecificMDNode(M, Fn);
1014249259Sdim    FnLocals->addOperand(Node);
1015249259Sdim  }
1016263509Sdim  DIVariable RetVar(Node);
1017263509Sdim  assert(RetVar.isVariable() &&
1018263509Sdim         "createLocalVariable should return a valid DIVariable");
1019263509Sdim  return RetVar;
1020249259Sdim}
1021249259Sdim
1022249259Sdim/// createComplexVariable - Create a new descriptor for the specified variable
1023249259Sdim/// which has a complex address expression for its address.
1024249259SdimDIVariable DIBuilder::createComplexVariable(unsigned Tag, DIDescriptor Scope,
1025249259Sdim                                            StringRef Name, DIFile F,
1026249259Sdim                                            unsigned LineNo,
1027249259Sdim                                            DIType Ty, ArrayRef<Value *> Addr,
1028249259Sdim                                            unsigned ArgNo) {
1029249259Sdim  SmallVector<Value *, 15> Elts;
1030249259Sdim  Elts.push_back(GetTagConstant(VMContext, Tag));
1031249259Sdim  Elts.push_back(getNonCompileUnitScope(Scope)),
1032249259Sdim  Elts.push_back(MDString::get(VMContext, Name));
1033249259Sdim  Elts.push_back(F);
1034249259Sdim  Elts.push_back(ConstantInt::get(Type::getInt32Ty(VMContext),
1035249259Sdim                                  (LineNo | (ArgNo << 24))));
1036249259Sdim  Elts.push_back(Ty);
1037249259Sdim  Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
1038249259Sdim  Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
1039249259Sdim  Elts.append(Addr.begin(), Addr.end());
1040249259Sdim
1041249259Sdim  return DIVariable(MDNode::get(VMContext, Elts));
1042249259Sdim}
1043249259Sdim
1044249259Sdim/// createFunction - Create a new descriptor for the specified function.
1045263509Sdim/// FIXME: this is added for dragonegg. Once we update dragonegg
1046263509Sdim/// to call resolve function, this will be removed.
1047263509SdimDISubprogram DIBuilder::createFunction(DIScopeRef Context, StringRef Name,
1048263509Sdim                                       StringRef LinkageName, DIFile File,
1049263509Sdim                                       unsigned LineNo, DICompositeType Ty,
1050249259Sdim                                       bool isLocalToUnit, bool isDefinition,
1051263509Sdim                                       unsigned ScopeLine, unsigned Flags,
1052263509Sdim                                       bool isOptimized, Function *Fn,
1053263509Sdim                                       MDNode *TParams, MDNode *Decl) {
1054263509Sdim  // dragonegg does not generate identifier for types, so using an empty map
1055263509Sdim  // to resolve the context should be fine.
1056263509Sdim  DITypeIdentifierMap EmptyMap;
1057263509Sdim  return createFunction(Context.resolve(EmptyMap), Name, LinkageName, File,
1058263509Sdim                        LineNo, Ty, isLocalToUnit, isDefinition, ScopeLine,
1059263509Sdim                        Flags, isOptimized, Fn, TParams, Decl);
1060263509Sdim}
1061263509Sdim
1062263509Sdim/// createFunction - Create a new descriptor for the specified function.
1063263509SdimDISubprogram DIBuilder::createFunction(DIDescriptor Context, StringRef Name,
1064263509Sdim                                       StringRef LinkageName, DIFile File,
1065263509Sdim                                       unsigned LineNo, DICompositeType Ty,
1066263509Sdim                                       bool isLocalToUnit, bool isDefinition,
1067263509Sdim                                       unsigned ScopeLine, unsigned Flags,
1068263509Sdim                                       bool isOptimized, Function *Fn,
1069263509Sdim                                       MDNode *TParams, MDNode *Decl) {
1070263509Sdim  assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
1071263509Sdim         "function types should be subroutines");
1072249259Sdim  Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
1073249259Sdim  Value *Elts[] = {
1074249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
1075249259Sdim    File.getFileNode(),
1076263509Sdim    DIScope(getNonCompileUnitScope(Context)).getRef(),
1077249259Sdim    MDString::get(VMContext, Name),
1078249259Sdim    MDString::get(VMContext, Name),
1079249259Sdim    MDString::get(VMContext, LinkageName),
1080249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
1081249259Sdim    Ty,
1082249259Sdim    ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
1083249259Sdim    ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
1084249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
1085249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
1086249259Sdim    NULL,
1087249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
1088249259Sdim    ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
1089249259Sdim    Fn,
1090249259Sdim    TParams,
1091249259Sdim    Decl,
1092249259Sdim    MDNode::getTemporary(VMContext, TElts),
1093249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), ScopeLine)
1094249259Sdim  };
1095249259Sdim  MDNode *Node = MDNode::get(VMContext, Elts);
1096249259Sdim
1097249259Sdim  // Create a named metadata so that we do not lose this mdnode.
1098249259Sdim  if (isDefinition)
1099249259Sdim    AllSubprograms.push_back(Node);
1100249259Sdim  DISubprogram S(Node);
1101263509Sdim  assert(S.isSubprogram() && "createFunction should return a valid DISubprogram");
1102249259Sdim  return S;
1103249259Sdim}
1104249259Sdim
1105249259Sdim/// createMethod - Create a new descriptor for the specified C++ method.
1106263509SdimDISubprogram DIBuilder::createMethod(DIDescriptor Context, StringRef Name,
1107263509Sdim                                     StringRef LinkageName, DIFile F,
1108263509Sdim                                     unsigned LineNo, DICompositeType Ty,
1109263509Sdim                                     bool isLocalToUnit, bool isDefinition,
1110249259Sdim                                     unsigned VK, unsigned VIndex,
1111263509Sdim                                     DIType VTableHolder, unsigned Flags,
1112263509Sdim                                     bool isOptimized, Function *Fn,
1113249259Sdim                                     MDNode *TParam) {
1114263509Sdim  assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
1115263509Sdim         "function types should be subroutines");
1116263509Sdim  assert(getNonCompileUnitScope(Context) &&
1117263509Sdim         "Methods should have both a Context and a context that isn't "
1118263509Sdim         "the compile unit.");
1119249259Sdim  Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
1120249259Sdim  Value *Elts[] = {
1121249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
1122249259Sdim    F.getFileNode(),
1123263509Sdim    DIScope(Context).getRef(),
1124249259Sdim    MDString::get(VMContext, Name),
1125249259Sdim    MDString::get(VMContext, Name),
1126249259Sdim    MDString::get(VMContext, LinkageName),
1127249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
1128249259Sdim    Ty,
1129249259Sdim    ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
1130249259Sdim    ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
1131263509Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), VK),
1132249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), VIndex),
1133263509Sdim    VTableHolder.getRef(),
1134249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
1135249259Sdim    ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
1136249259Sdim    Fn,
1137249259Sdim    TParam,
1138249259Sdim    Constant::getNullValue(Type::getInt32Ty(VMContext)),
1139249259Sdim    MDNode::getTemporary(VMContext, TElts),
1140249259Sdim    // FIXME: Do we want to use different scope/lines?
1141249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
1142249259Sdim  };
1143249259Sdim  MDNode *Node = MDNode::get(VMContext, Elts);
1144249259Sdim  if (isDefinition)
1145249259Sdim    AllSubprograms.push_back(Node);
1146249259Sdim  DISubprogram S(Node);
1147263509Sdim  assert(S.isSubprogram() && "createMethod should return a valid DISubprogram");
1148249259Sdim  return S;
1149249259Sdim}
1150249259Sdim
1151249259Sdim/// createNameSpace - This creates new descriptor for a namespace
1152249259Sdim/// with the specified parent scope.
1153249259SdimDINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name,
1154249259Sdim                                       DIFile File, unsigned LineNo) {
1155249259Sdim  Value *Elts[] = {
1156249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_namespace),
1157249259Sdim    File.getFileNode(),
1158249259Sdim    getNonCompileUnitScope(Scope),
1159249259Sdim    MDString::get(VMContext, Name),
1160249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
1161249259Sdim  };
1162249259Sdim  DINameSpace R(MDNode::get(VMContext, Elts));
1163249259Sdim  assert(R.Verify() &&
1164249259Sdim         "createNameSpace should return a verifiable DINameSpace");
1165249259Sdim  return R;
1166249259Sdim}
1167249259Sdim
1168249259Sdim/// createLexicalBlockFile - This creates a new MDNode that encapsulates
1169249259Sdim/// an existing scope with a new filename.
1170249259SdimDILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope,
1171249259Sdim                                                     DIFile File) {
1172249259Sdim  Value *Elts[] = {
1173249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
1174249259Sdim    File.getFileNode(),
1175249259Sdim    Scope
1176249259Sdim  };
1177249259Sdim  DILexicalBlockFile R(MDNode::get(VMContext, Elts));
1178249259Sdim  assert(
1179249259Sdim      R.Verify() &&
1180249259Sdim      "createLexicalBlockFile should return a verifiable DILexicalBlockFile");
1181249259Sdim  return R;
1182249259Sdim}
1183249259Sdim
1184249259SdimDILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File,
1185249259Sdim                                             unsigned Line, unsigned Col) {
1186263509Sdim  // Defeat MDNode uniquing for lexical blocks by using unique id.
1187249259Sdim  static unsigned int unique_id = 0;
1188249259Sdim  Value *Elts[] = {
1189249259Sdim    GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
1190249259Sdim    File.getFileNode(),
1191249259Sdim    getNonCompileUnitScope(Scope),
1192249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), Line),
1193249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), Col),
1194249259Sdim    ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++)
1195249259Sdim  };
1196249259Sdim  DILexicalBlock R(MDNode::get(VMContext, Elts));
1197249259Sdim  assert(R.Verify() &&
1198249259Sdim         "createLexicalBlock should return a verifiable DILexicalBlock");
1199249259Sdim  return R;
1200249259Sdim}
1201249259Sdim
1202249259Sdim/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
1203249259SdimInstruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
1204249259Sdim                                      Instruction *InsertBefore) {
1205249259Sdim  assert(Storage && "no storage passed to dbg.declare");
1206263509Sdim  assert(VarInfo.isVariable() &&
1207263509Sdim         "empty or invalid DIVariable passed to dbg.declare");
1208249259Sdim  if (!DeclareFn)
1209249259Sdim    DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
1210249259Sdim
1211249259Sdim  Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
1212249259Sdim  return CallInst::Create(DeclareFn, Args, "", InsertBefore);
1213249259Sdim}
1214249259Sdim
1215249259Sdim/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
1216249259SdimInstruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
1217249259Sdim                                      BasicBlock *InsertAtEnd) {
1218249259Sdim  assert(Storage && "no storage passed to dbg.declare");
1219263509Sdim  assert(VarInfo.isVariable() &&
1220263509Sdim         "empty or invalid DIVariable passed to dbg.declare");
1221249259Sdim  if (!DeclareFn)
1222249259Sdim    DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
1223249259Sdim
1224249259Sdim  Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
1225249259Sdim
1226249259Sdim  // If this block already has a terminator then insert this intrinsic
1227249259Sdim  // before the terminator.
1228249259Sdim  if (TerminatorInst *T = InsertAtEnd->getTerminator())
1229249259Sdim    return CallInst::Create(DeclareFn, Args, "", T);
1230249259Sdim  else
1231249259Sdim    return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
1232249259Sdim}
1233249259Sdim
1234249259Sdim/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
1235249259SdimInstruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
1236249259Sdim                                                DIVariable VarInfo,
1237249259Sdim                                                Instruction *InsertBefore) {
1238249259Sdim  assert(V && "no value passed to dbg.value");
1239263509Sdim  assert(VarInfo.isVariable() &&
1240263509Sdim         "empty or invalid DIVariable passed to dbg.value");
1241249259Sdim  if (!ValueFn)
1242249259Sdim    ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1243249259Sdim
1244249259Sdim  Value *Args[] = { MDNode::get(V->getContext(), V),
1245249259Sdim                    ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
1246249259Sdim                    VarInfo };
1247249259Sdim  return CallInst::Create(ValueFn, Args, "", InsertBefore);
1248249259Sdim}
1249249259Sdim
1250249259Sdim/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
1251249259SdimInstruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
1252249259Sdim                                                DIVariable VarInfo,
1253249259Sdim                                                BasicBlock *InsertAtEnd) {
1254249259Sdim  assert(V && "no value passed to dbg.value");
1255263509Sdim  assert(VarInfo.isVariable() &&
1256263509Sdim         "empty or invalid DIVariable passed to dbg.value");
1257249259Sdim  if (!ValueFn)
1258249259Sdim    ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1259249259Sdim
1260249259Sdim  Value *Args[] = { MDNode::get(V->getContext(), V),
1261249259Sdim                    ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
1262249259Sdim                    VarInfo };
1263249259Sdim  return CallInst::Create(ValueFn, Args, "", InsertAtEnd);
1264249259Sdim}
1265