4dc8f6a1ecc47001e31021a1c3071f41a0b06a06
[oota-llvm.git] / lib / Analysis / DIBuilder.cpp
1 //===--- DIBuilder.cpp - Debug Information Builder ------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the DIBuilder.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "llvm/Analysis/DIBuilder.h"
15 #include "llvm/Analysis/DebugInfo.h"
16 #include "llvm/Constants.h"
17 #include "llvm/IntrinsicInst.h"
18 #include "llvm/Module.h"
19 #include "llvm/ADT/STLExtras.h"
20 #include "llvm/Support/Dwarf.h"
21
22 using namespace llvm;
23 using namespace llvm::dwarf;
24
25 static Constant *GetTagConstant(LLVMContext &VMContext, unsigned Tag) {
26   assert((Tag & LLVMDebugVersionMask) == 0 &&
27          "Tag too large for debug encoding!");
28   return ConstantInt::get(Type::getInt32Ty(VMContext), Tag | LLVMDebugVersion);
29 }
30
31 DIBuilder::DIBuilder(Module &m)
32   : M(m), VMContext(M.getContext()), TheCU(0), TempEnumTypes(0),
33     TempRetainTypes(0), TempSubprograms(0), TempGVs(0), DeclareFn(0),
34     ValueFn(0)
35 {}
36
37 /// finalize - Construct any deferred debug info descriptors.
38 void DIBuilder::finalize() {
39   DIArray Enums = getOrCreateArray(AllEnumTypes);
40   DIType(TempEnumTypes).replaceAllUsesWith(Enums);
41
42   DIArray RetainTypes = getOrCreateArray(AllRetainTypes);
43   DIType(TempRetainTypes).replaceAllUsesWith(RetainTypes);
44
45   DIArray SPs = getOrCreateArray(AllSubprograms);
46   DIType(TempSubprograms).replaceAllUsesWith(SPs);
47   for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) {
48     DISubprogram SP(SPs.getElement(i));
49     if (NamedMDNode *NMD = getFnSpecificMDNode(M, SP)) {
50       SmallVector<Value *, 4> Variables;
51       for (unsigned ii = 0, ee = NMD->getNumOperands(); ii != ee; ++ii)
52         Variables.push_back(NMD->getOperand(ii));
53       if (MDNode *Temp = SP.getVariablesNodes()) {
54         DIArray AV = getOrCreateArray(Variables);
55         DIType(Temp).replaceAllUsesWith(AV);
56       }
57       NMD->eraseFromParent();
58     }
59   }
60
61   DIArray GVs = getOrCreateArray(AllGVs);
62   DIType(TempGVs).replaceAllUsesWith(GVs);
63 }
64
65 /// getNonCompileUnitScope - If N is compile unit return NULL otherwise return
66 /// N.
67 static MDNode *getNonCompileUnitScope(MDNode *N) {
68   if (DIDescriptor(N).isCompileUnit())
69     return NULL;
70   return N;
71 }
72
73 /// createCompileUnit - A CompileUnit provides an anchor for all debugging
74 /// information generated during this instance of compilation.
75 void DIBuilder::createCompileUnit(unsigned Lang, StringRef Filename,
76                                   StringRef Directory, StringRef Producer,
77                                   bool isOptimized, StringRef Flags,
78                                   unsigned RunTimeVer) {
79   assert(((Lang <= dwarf::DW_LANG_Python && Lang >= dwarf::DW_LANG_C89) ||
80           (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) &&
81          "Invalid Language tag");
82   assert(!Filename.empty() &&
83          "Unable to create compile unit without filename");
84   Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
85   TempEnumTypes = MDNode::getTemporary(VMContext, TElts);
86   Value *THElts[] = { TempEnumTypes };
87   MDNode *EnumHolder = MDNode::get(VMContext, THElts);
88
89   TempRetainTypes = MDNode::getTemporary(VMContext, TElts);
90   Value *TRElts[] = { TempRetainTypes };
91   MDNode *RetainHolder = MDNode::get(VMContext, TRElts);
92
93   TempSubprograms = MDNode::getTemporary(VMContext, TElts);
94   Value *TSElts[] = { TempSubprograms };
95   MDNode *SPHolder = MDNode::get(VMContext, TSElts);
96
97   TempGVs = MDNode::getTemporary(VMContext, TElts);
98   Value *TVElts[] = { TempGVs };
99   MDNode *GVHolder = MDNode::get(VMContext, TVElts);
100
101   Value *Elts[] = {
102     GetTagConstant(VMContext, dwarf::DW_TAG_compile_unit),
103     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
104     ConstantInt::get(Type::getInt32Ty(VMContext), Lang),
105     MDString::get(VMContext, Filename),
106     MDString::get(VMContext, Directory),
107     MDString::get(VMContext, Producer),
108     // Deprecate isMain field.
109     ConstantInt::get(Type::getInt1Ty(VMContext), true), // isMain
110     ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
111     MDString::get(VMContext, Flags),
112     ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeVer),
113     EnumHolder,
114     RetainHolder,
115     SPHolder,
116     GVHolder
117   };
118   TheCU = DICompileUnit(MDNode::get(VMContext, Elts));
119
120   // Create a named metadata so that it is easier to find cu in a module.
121   NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
122   NMD->addOperand(TheCU);
123 }
124
125 /// createFile - Create a file descriptor to hold debugging information
126 /// for a file.
127 DIFile DIBuilder::createFile(StringRef Filename, StringRef Directory) {
128   assert(TheCU && "Unable to create DW_TAG_file_type without CompileUnit");
129   assert(!Filename.empty() && "Unable to create file without name");
130   Value *Elts[] = {
131     GetTagConstant(VMContext, dwarf::DW_TAG_file_type),
132     MDString::get(VMContext, Filename),
133     MDString::get(VMContext, Directory),
134     NULL // TheCU
135   };
136   return DIFile(MDNode::get(VMContext, Elts));
137 }
138
139 /// createEnumerator - Create a single enumerator value.
140 DIEnumerator DIBuilder::createEnumerator(StringRef Name, uint64_t Val) {
141   assert(!Name.empty() && "Unable to create enumerator without name");
142   Value *Elts[] = {
143     GetTagConstant(VMContext, dwarf::DW_TAG_enumerator),
144     MDString::get(VMContext, Name),
145     ConstantInt::get(Type::getInt64Ty(VMContext), Val)
146   };
147   return DIEnumerator(MDNode::get(VMContext, Elts));
148 }
149
150 /// createNullPtrType - Create C++0x nullptr type.
151 DIType DIBuilder::createNullPtrType(StringRef Name) {
152   assert(!Name.empty() && "Unable to create type without name");
153   // nullptr is encoded in DIBasicType format. Line number, filename,
154   // ,size, alignment, offset and flags are always empty here.
155   Value *Elts[] = {
156     GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_type),
157     NULL, //TheCU,
158     MDString::get(VMContext, Name),
159     NULL, // Filename
160     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
161     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
162     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
163     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
164     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags;
165     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Encoding
166   };
167   return DIType(MDNode::get(VMContext, Elts));
168 }
169
170 /// createBasicType - Create debugging information entry for a basic
171 /// type, e.g 'char'.
172 DIType DIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits,
173                                   uint64_t AlignInBits,
174                                   unsigned Encoding) {
175   assert(!Name.empty() && "Unable to create type without name");
176   // Basic types are encoded in DIBasicType format. Line number, filename,
177   // offset and flags are always empty here.
178   Value *Elts[] = {
179     GetTagConstant(VMContext, dwarf::DW_TAG_base_type),
180     NULL, //TheCU,
181     MDString::get(VMContext, Name),
182     NULL, // Filename
183     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
184     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
185     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
186     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
187     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags;
188     ConstantInt::get(Type::getInt32Ty(VMContext), Encoding)
189   };
190   return DIType(MDNode::get(VMContext, Elts));
191 }
192
193 /// createQualifiedType - Create debugging information entry for a qualified
194 /// type, e.g. 'const int'.
195 DIType DIBuilder::createQualifiedType(unsigned Tag, DIType FromTy) {
196   // Qualified types are encoded in DIDerivedType format.
197   Value *Elts[] = {
198     GetTagConstant(VMContext, Tag),
199     NULL, //TheCU,
200     MDString::get(VMContext, StringRef()), // Empty name.
201     NULL, // Filename
202     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
203     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
204     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
205     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
206     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
207     FromTy
208   };
209   return DIType(MDNode::get(VMContext, Elts));
210 }
211
212 /// createPointerType - Create debugging information entry for a pointer.
213 DIType DIBuilder::createPointerType(DIType PointeeTy, uint64_t SizeInBits,
214                                     uint64_t AlignInBits, StringRef Name) {
215   // Pointer types are encoded in DIDerivedType format.
216   Value *Elts[] = {
217     GetTagConstant(VMContext, dwarf::DW_TAG_pointer_type),
218     NULL, //TheCU,
219     MDString::get(VMContext, Name),
220     NULL, // Filename
221     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
222     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
223     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
224     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
225     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
226     PointeeTy
227   };
228   return DIType(MDNode::get(VMContext, Elts));
229 }
230
231 /// createReferenceType - Create debugging information entry for a reference.
232 DIType DIBuilder::createReferenceType(DIType RTy) {
233   assert(RTy.Verify() && "Unable to create reference type");
234   // References are encoded in DIDerivedType format.
235   Value *Elts[] = {
236     GetTagConstant(VMContext, dwarf::DW_TAG_reference_type),
237     NULL, // TheCU,
238     NULL, // Name
239     NULL, // Filename
240     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
241     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
242     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
243     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
244     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
245     RTy
246   };
247   return DIType(MDNode::get(VMContext, Elts));
248 }
249
250 /// createTypedef - Create debugging information entry for a typedef.
251 DIType DIBuilder::createTypedef(DIType Ty, StringRef Name, DIFile File,
252                                 unsigned LineNo, DIDescriptor Context) {
253   // typedefs are encoded in DIDerivedType format.
254   assert(Ty.Verify() && "Invalid typedef type!");
255   Value *Elts[] = {
256     GetTagConstant(VMContext, dwarf::DW_TAG_typedef),
257     getNonCompileUnitScope(Context),
258     MDString::get(VMContext, Name),
259     File,
260     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
261     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
262     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
263     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
264     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
265     Ty
266   };
267   return DIType(MDNode::get(VMContext, Elts));
268 }
269
270 /// createFriend - Create debugging information entry for a 'friend'.
271 DIType DIBuilder::createFriend(DIType Ty, DIType FriendTy) {
272   // typedefs are encoded in DIDerivedType format.
273   assert(Ty.Verify() && "Invalid type!");
274   assert(FriendTy.Verify() && "Invalid friend type!");
275   Value *Elts[] = {
276     GetTagConstant(VMContext, dwarf::DW_TAG_friend),
277     Ty,
278     NULL, // Name
279     Ty.getFile(),
280     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
281     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
282     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
283     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
284     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
285     FriendTy
286   };
287   return DIType(MDNode::get(VMContext, Elts));
288 }
289
290 /// createInheritance - Create debugging information entry to establish
291 /// inheritance relationship between two types.
292 DIType DIBuilder::createInheritance(DIType Ty, DIType BaseTy,
293                                     uint64_t BaseOffset, unsigned Flags) {
294   assert(Ty.Verify() && "Unable to create inheritance");
295   // TAG_inheritance is encoded in DIDerivedType format.
296   Value *Elts[] = {
297     GetTagConstant(VMContext, dwarf::DW_TAG_inheritance),
298     Ty,
299     NULL, // Name
300     Ty.getFile(),
301     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
302     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
303     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
304     ConstantInt::get(Type::getInt64Ty(VMContext), BaseOffset),
305     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
306     BaseTy
307   };
308   return DIType(MDNode::get(VMContext, Elts));
309 }
310
311 /// createMemberType - Create debugging information entry for a member.
312 DIType DIBuilder::createMemberType(DIDescriptor Scope, StringRef Name,
313                                    DIFile File, unsigned LineNumber,
314                                    uint64_t SizeInBits, uint64_t AlignInBits,
315                                    uint64_t OffsetInBits, unsigned Flags,
316                                    DIType Ty) {
317   // TAG_member is encoded in DIDerivedType format.
318   Value *Elts[] = {
319     GetTagConstant(VMContext, dwarf::DW_TAG_member),
320     getNonCompileUnitScope(Scope),
321     MDString::get(VMContext, Name),
322     File,
323     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
324     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
325     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
326     ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
327     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
328     Ty
329   };
330   return DIType(MDNode::get(VMContext, Elts));
331 }
332
333 /// createObjCIVar - Create debugging information entry for Objective-C
334 /// instance variable.
335 DIType DIBuilder::createObjCIVar(StringRef Name,
336                                  DIFile File, unsigned LineNumber,
337                                  uint64_t SizeInBits, uint64_t AlignInBits,
338                                  uint64_t OffsetInBits, unsigned Flags,
339                                  DIType Ty, StringRef PropertyName,
340                                  StringRef GetterName, StringRef SetterName,
341                                  unsigned PropertyAttributes) {
342   // TAG_member is encoded in DIDerivedType format.
343   Value *Elts[] = {
344     GetTagConstant(VMContext, dwarf::DW_TAG_member),
345     getNonCompileUnitScope(File),
346     MDString::get(VMContext, Name),
347     File,
348     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
349     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
350     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
351     ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
352     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
353     Ty,
354     MDString::get(VMContext, PropertyName),
355     MDString::get(VMContext, GetterName),
356     MDString::get(VMContext, SetterName),
357     ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes)
358   };
359   return DIType(MDNode::get(VMContext, Elts));
360 }
361
362 /// createObjCIVar - Create debugging information entry for Objective-C
363 /// instance variable.
364 DIType DIBuilder::createObjCIVar(StringRef Name,
365                                  DIFile File, unsigned LineNumber,
366                                  uint64_t SizeInBits, uint64_t AlignInBits,
367                                  uint64_t OffsetInBits, unsigned Flags,
368                                  DIType Ty, MDNode *PropertyNode) {
369   // TAG_member is encoded in DIDerivedType format.
370   Value *Elts[] = {
371     GetTagConstant(VMContext, dwarf::DW_TAG_member),
372     getNonCompileUnitScope(File),
373     MDString::get(VMContext, Name),
374     File,
375     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
376     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
377     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
378     ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
379     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
380     Ty,
381     PropertyNode
382   };
383   return DIType(MDNode::get(VMContext, Elts));
384 }
385
386 /// createObjCProperty - Create debugging information entry for Objective-C
387 /// property.
388 DIObjCProperty DIBuilder::createObjCProperty(StringRef Name,
389                                              DIFile File, unsigned LineNumber,
390                                              StringRef GetterName,
391                                              StringRef SetterName, 
392                                              unsigned PropertyAttributes,
393                                              DIType Ty) {
394   Value *Elts[] = {
395     GetTagConstant(VMContext, dwarf::DW_TAG_APPLE_property),
396     MDString::get(VMContext, Name),
397     File,
398     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
399     MDString::get(VMContext, GetterName),
400     MDString::get(VMContext, SetterName),
401     ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes),
402     Ty
403   };
404   return DIObjCProperty(MDNode::get(VMContext, Elts));
405 }
406
407 /// createClassType - Create debugging information entry for a class.
408 DIType DIBuilder::createClassType(DIDescriptor Context, StringRef Name,
409                                   DIFile File, unsigned LineNumber,
410                                   uint64_t SizeInBits, uint64_t AlignInBits,
411                                   uint64_t OffsetInBits, unsigned Flags,
412                                   DIType DerivedFrom, DIArray Elements,
413                                   MDNode *VTableHolder, MDNode *TemplateParams) {
414  // TAG_class_type is encoded in DICompositeType format.
415   Value *Elts[] = {
416     GetTagConstant(VMContext, dwarf::DW_TAG_class_type),
417     getNonCompileUnitScope(Context),
418     MDString::get(VMContext, Name),
419     File,
420     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
421     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
422     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
423     ConstantInt::get(Type::getInt32Ty(VMContext), OffsetInBits),
424     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
425     DerivedFrom,
426     Elements,
427     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
428     VTableHolder,
429     TemplateParams
430   };
431   return DIType(MDNode::get(VMContext, Elts));
432 }
433
434 /// createTemplateTypeParameter - Create debugging information for template
435 /// type parameter.
436 DITemplateTypeParameter
437 DIBuilder::createTemplateTypeParameter(DIDescriptor Context, StringRef Name,
438                                        DIType Ty, MDNode *File, unsigned LineNo,
439                                        unsigned ColumnNo) {
440   Value *Elts[] = {
441     GetTagConstant(VMContext, dwarf::DW_TAG_template_type_parameter),
442     getNonCompileUnitScope(Context),
443     MDString::get(VMContext, Name),
444     Ty,
445     File,
446     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
447     ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo)
448   };
449   return DITemplateTypeParameter(MDNode::get(VMContext, Elts));
450 }
451
452 /// createTemplateValueParameter - Create debugging information for template
453 /// value parameter.
454 DITemplateValueParameter
455 DIBuilder::createTemplateValueParameter(DIDescriptor Context, StringRef Name,
456                                         DIType Ty, uint64_t Val,
457                                         MDNode *File, unsigned LineNo,
458                                         unsigned ColumnNo) {
459   Value *Elts[] = {
460     GetTagConstant(VMContext, dwarf::DW_TAG_template_value_parameter),
461     getNonCompileUnitScope(Context),
462     MDString::get(VMContext, Name),
463     Ty,
464     ConstantInt::get(Type::getInt64Ty(VMContext), Val),
465     File,
466     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
467     ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo)
468   };
469   return DITemplateValueParameter(MDNode::get(VMContext, Elts));
470 }
471
472 /// createStructType - Create debugging information entry for a struct.
473 DIType DIBuilder::createStructType(DIDescriptor Context, StringRef Name,
474                                    DIFile File, unsigned LineNumber,
475                                    uint64_t SizeInBits, uint64_t AlignInBits,
476                                    unsigned Flags, DIArray Elements,
477                                    unsigned RunTimeLang) {
478  // TAG_structure_type is encoded in DICompositeType format.
479   Value *Elts[] = {
480     GetTagConstant(VMContext, dwarf::DW_TAG_structure_type),
481     getNonCompileUnitScope(Context),
482     MDString::get(VMContext, Name),
483     File,
484     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
485     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
486     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
487     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
488     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
489     NULL,
490     Elements,
491     ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang),
492     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
493   };
494   return DIType(MDNode::get(VMContext, Elts));
495 }
496
497 /// createUnionType - Create debugging information entry for an union.
498 DIType DIBuilder::createUnionType(DIDescriptor Scope, StringRef Name,
499                                   DIFile File,
500                                   unsigned LineNumber, uint64_t SizeInBits,
501                                   uint64_t AlignInBits, unsigned Flags,
502                                   DIArray Elements, unsigned RunTimeLang) {
503   // TAG_union_type is encoded in DICompositeType format.
504   Value *Elts[] = {
505     GetTagConstant(VMContext, dwarf::DW_TAG_union_type),
506     getNonCompileUnitScope(Scope),
507     MDString::get(VMContext, Name),
508     File,
509     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
510     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
511     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
512     ConstantInt::get(Type::getInt64Ty(VMContext), 0),
513     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
514     NULL,
515     Elements,
516     ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang),
517     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
518   };
519   return DIType(MDNode::get(VMContext, Elts));
520 }
521
522 /// createSubroutineType - Create subroutine type.
523 DIType DIBuilder::createSubroutineType(DIFile File, DIArray ParameterTypes) {
524   // TAG_subroutine_type is encoded in DICompositeType format.
525   Value *Elts[] = {
526     GetTagConstant(VMContext, dwarf::DW_TAG_subroutine_type),
527     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
528     MDString::get(VMContext, ""),
529     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
530     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
531     ConstantInt::get(Type::getInt64Ty(VMContext), 0),
532     ConstantInt::get(Type::getInt64Ty(VMContext), 0),
533     ConstantInt::get(Type::getInt64Ty(VMContext), 0),
534     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
535     NULL,
536     ParameterTypes,
537     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
538     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
539   };
540   return DIType(MDNode::get(VMContext, Elts));
541 }
542
543 /// createEnumerationType - Create debugging information entry for an
544 /// enumeration.
545 DIType DIBuilder::createEnumerationType(DIDescriptor Scope, StringRef Name,
546                                         DIFile File, unsigned LineNumber,
547                                         uint64_t SizeInBits,
548                                         uint64_t AlignInBits,
549                                         DIArray Elements) {
550   // TAG_enumeration_type is encoded in DICompositeType format.
551   Value *Elts[] = {
552     GetTagConstant(VMContext, dwarf::DW_TAG_enumeration_type),
553     getNonCompileUnitScope(Scope),
554     MDString::get(VMContext, Name),
555     File,
556     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
557     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
558     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
559     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
560     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
561     NULL,
562     Elements,
563     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
564     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
565   };
566   MDNode *Node = MDNode::get(VMContext, Elts);
567   AllEnumTypes.push_back(Node);
568   return DIType(Node);
569 }
570
571 /// createArrayType - Create debugging information entry for an array.
572 DIType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits,
573                                   DIType Ty, DIArray Subscripts) {
574   // TAG_array_type is encoded in DICompositeType format.
575   Value *Elts[] = {
576     GetTagConstant(VMContext, dwarf::DW_TAG_array_type),
577     NULL, //TheCU,
578     MDString::get(VMContext, ""),
579     NULL, //TheCU,
580     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
581     ConstantInt::get(Type::getInt64Ty(VMContext), Size),
582     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
583     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
584     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
585     Ty,
586     Subscripts,
587     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
588     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
589   };
590   return DIType(MDNode::get(VMContext, Elts));
591 }
592
593 /// createVectorType - Create debugging information entry for a vector.
594 DIType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits,
595                                    DIType Ty, DIArray Subscripts) {
596   // TAG_vector_type is encoded in DICompositeType format.
597   Value *Elts[] = {
598     GetTagConstant(VMContext, dwarf::DW_TAG_vector_type),
599     NULL, //TheCU,
600     MDString::get(VMContext, ""),
601     NULL, //TheCU,
602     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
603     ConstantInt::get(Type::getInt64Ty(VMContext), Size),
604     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
605     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
606     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
607     Ty,
608     Subscripts,
609     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
610     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
611   };
612   return DIType(MDNode::get(VMContext, Elts));
613 }
614
615 /// createArtificialType - Create a new DIType with "artificial" flag set.
616 DIType DIBuilder::createArtificialType(DIType Ty) {
617   if (Ty.isArtificial())
618     return Ty;
619
620   SmallVector<Value *, 9> Elts;
621   MDNode *N = Ty;
622   assert (N && "Unexpected input DIType!");
623   for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
624     if (Value *V = N->getOperand(i))
625       Elts.push_back(V);
626     else
627       Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
628   }
629
630   unsigned CurFlags = Ty.getFlags();
631   CurFlags = CurFlags | DIType::FlagArtificial;
632
633   // Flags are stored at this slot.
634   Elts[8] =  ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
635
636   return DIType(MDNode::get(VMContext, Elts));
637 }
638
639 /// retainType - Retain DIType in a module even if it is not referenced
640 /// through debug info anchors.
641 void DIBuilder::retainType(DIType T) {
642   AllRetainTypes.push_back(T);
643 }
644
645 /// createUnspecifiedParameter - Create unspeicified type descriptor
646 /// for the subroutine type.
647 DIDescriptor DIBuilder::createUnspecifiedParameter() {
648   Value *Elts[] = {
649     GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_parameters)
650   };
651   return DIDescriptor(MDNode::get(VMContext, Elts));
652 }
653
654 /// createTemporaryType - Create a temporary forward-declared type.
655 DIType DIBuilder::createTemporaryType() {
656   // Give the temporary MDNode a tag. It doesn't matter what tag we
657   // use here as long as DIType accepts it.
658   Value *Elts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
659   MDNode *Node = MDNode::getTemporary(VMContext, Elts);
660   return DIType(Node);
661 }
662
663 /// createTemporaryType - Create a temporary forward-declared type.
664 DIType DIBuilder::createTemporaryType(DIFile F) {
665   // Give the temporary MDNode a tag. It doesn't matter what tag we
666   // use here as long as DIType accepts it.
667   Value *Elts[] = {
668     GetTagConstant(VMContext, DW_TAG_base_type),
669     TheCU,
670     NULL,
671     F
672   };
673   MDNode *Node = MDNode::getTemporary(VMContext, Elts);
674   return DIType(Node);
675 }
676
677 /// createForwardDecl - Create a temporary forward-declared type that
678 /// can be RAUW'd if the full type is seen.
679 DIType DIBuilder::createForwardDecl(unsigned Tag, StringRef Name, DIFile F,
680                                     unsigned Line, unsigned RuntimeLang) {
681   // Create a temporary MDNode.
682   Value *Elts[] = {
683     GetTagConstant(VMContext, Tag),
684     NULL, // TheCU
685     MDString::get(VMContext, Name),
686     F,
687     ConstantInt::get(Type::getInt32Ty(VMContext), Line),
688     // To ease transition include sizes etc of 0.
689     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
690     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
691     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
692     ConstantInt::get(Type::getInt32Ty(VMContext),
693                      DIDescriptor::FlagFwdDecl),
694     NULL,
695     DIArray(),
696     ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang)
697   };
698   MDNode *Node = MDNode::getTemporary(VMContext, Elts);
699   return DIType(Node);
700 }
701
702 /// getOrCreateArray - Get a DIArray, create one if required.
703 DIArray DIBuilder::getOrCreateArray(ArrayRef<Value *> Elements) {
704   if (Elements.empty()) {
705     Value *Null = llvm::Constant::getNullValue(Type::getInt32Ty(VMContext));
706     return DIArray(MDNode::get(VMContext, Null));
707   }
708   return DIArray(MDNode::get(VMContext, Elements));
709 }
710
711 /// getOrCreateSubrange - Create a descriptor for a value range.  This
712 /// implicitly uniques the values returned.
713 DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Hi) {
714   Value *Elts[] = {
715     GetTagConstant(VMContext, dwarf::DW_TAG_subrange_type),
716     ConstantInt::get(Type::getInt64Ty(VMContext), Lo),
717     ConstantInt::get(Type::getInt64Ty(VMContext), Hi)
718   };
719
720   return DISubrange(MDNode::get(VMContext, Elts));
721 }
722
723 /// createGlobalVariable - Create a new descriptor for the specified global.
724 DIGlobalVariable DIBuilder::
725 createGlobalVariable(StringRef Name, DIFile F, unsigned LineNumber,
726                      DIType Ty, bool isLocalToUnit, llvm::Value *Val) {
727   Value *Elts[] = {
728     GetTagConstant(VMContext, dwarf::DW_TAG_variable),
729     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
730     NULL, // TheCU,
731     MDString::get(VMContext, Name),
732     MDString::get(VMContext, Name),
733     MDString::get(VMContext, Name),
734     F,
735     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
736     Ty,
737     ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
738     ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
739     Val
740   };
741   MDNode *Node = MDNode::get(VMContext, Elts);
742   AllGVs.push_back(Node);
743   return DIGlobalVariable(Node);
744 }
745
746 /// createStaticVariable - Create a new descriptor for the specified static
747 /// variable.
748 DIGlobalVariable DIBuilder::
749 createStaticVariable(DIDescriptor Context, StringRef Name,
750                      StringRef LinkageName, DIFile F, unsigned LineNumber,
751                      DIType Ty, bool isLocalToUnit, llvm::Value *Val) {
752   Value *Elts[] = {
753     GetTagConstant(VMContext, dwarf::DW_TAG_variable),
754     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
755     getNonCompileUnitScope(Context),
756     MDString::get(VMContext, Name),
757     MDString::get(VMContext, Name),
758     MDString::get(VMContext, LinkageName),
759     F,
760     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
761     Ty,
762     ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
763     ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
764     Val
765   };
766   MDNode *Node = MDNode::get(VMContext, Elts);
767   AllGVs.push_back(Node);
768   return DIGlobalVariable(Node);
769 }
770
771 /// createVariable - Create a new descriptor for the specified variable.
772 DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope,
773                                           StringRef Name, DIFile File,
774                                           unsigned LineNo, DIType Ty,
775                                           bool AlwaysPreserve, unsigned Flags,
776                                           unsigned ArgNo) {
777   Value *Elts[] = {
778     GetTagConstant(VMContext, Tag),
779     getNonCompileUnitScope(Scope),
780     MDString::get(VMContext, Name),
781     File,
782     ConstantInt::get(Type::getInt32Ty(VMContext), (LineNo | (ArgNo << 24))),
783     Ty,
784     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
785     Constant::getNullValue(Type::getInt32Ty(VMContext)),
786   };
787   MDNode *Node = MDNode::get(VMContext, Elts);
788   if (AlwaysPreserve) {
789     // The optimizer may remove local variable. If there is an interest
790     // to preserve variable info in such situation then stash it in a
791     // named mdnode.
792     DISubprogram Fn(getDISubprogram(Scope));
793     NamedMDNode *FnLocals = getOrInsertFnSpecificMDNode(M, Fn);
794     FnLocals->addOperand(Node);
795   }
796   return DIVariable(Node);
797 }
798
799 /// createComplexVariable - Create a new descriptor for the specified variable
800 /// which has a complex address expression for its address.
801 DIVariable DIBuilder::createComplexVariable(unsigned Tag, DIDescriptor Scope,
802                                             StringRef Name, DIFile F,
803                                             unsigned LineNo,
804                                             DIType Ty, ArrayRef<Value *> Addr,
805                                             unsigned ArgNo) {
806   SmallVector<Value *, 15> Elts;
807   Elts.push_back(GetTagConstant(VMContext, Tag));
808   Elts.push_back(getNonCompileUnitScope(Scope)),
809   Elts.push_back(MDString::get(VMContext, Name));
810   Elts.push_back(F);
811   Elts.push_back(ConstantInt::get(Type::getInt32Ty(VMContext),
812                                   (LineNo | (ArgNo << 24))));
813   Elts.push_back(Ty);
814   Elts.push_back(llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)));
815   Elts.push_back(llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)));
816   Elts.append(Addr.begin(), Addr.end());
817
818   return DIVariable(MDNode::get(VMContext, Elts));
819 }
820
821 /// createFunction - Create a new descriptor for the specified function.
822 DISubprogram DIBuilder::createFunction(DIDescriptor Context,
823                                        StringRef Name,
824                                        StringRef LinkageName,
825                                        DIFile File, unsigned LineNo,
826                                        DIType Ty,
827                                        bool isLocalToUnit, bool isDefinition,
828                                        unsigned Flags, bool isOptimized,
829                                        Function *Fn,
830                                        MDNode *TParams,
831                                        MDNode *Decl) {
832   Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
833   MDNode *Temp = MDNode::getTemporary(VMContext, TElts);
834   Value *TVElts[] = { Temp };
835   MDNode *THolder = MDNode::get(VMContext, TVElts);
836
837   Value *Elts[] = {
838     GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
839     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
840     getNonCompileUnitScope(Context),
841     MDString::get(VMContext, Name),
842     MDString::get(VMContext, Name),
843     MDString::get(VMContext, LinkageName),
844     File,
845     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
846     Ty,
847     ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
848     ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
849     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
850     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
851     NULL,
852     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
853     ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
854     Fn,
855     TParams,
856     Decl,
857     THolder
858   };
859   MDNode *Node = MDNode::get(VMContext, Elts);
860
861   // Create a named metadata so that we do not lose this mdnode.
862   AllSubprograms.push_back(Node);
863   return DISubprogram(Node);
864 }
865
866 /// createMethod - Create a new descriptor for the specified C++ method.
867 DISubprogram DIBuilder::createMethod(DIDescriptor Context,
868                                      StringRef Name,
869                                      StringRef LinkageName,
870                                      DIFile F,
871                                      unsigned LineNo, DIType Ty,
872                                      bool isLocalToUnit,
873                                      bool isDefinition,
874                                      unsigned VK, unsigned VIndex,
875                                      MDNode *VTableHolder,
876                                      unsigned Flags,
877                                      bool isOptimized,
878                                      Function *Fn,
879                                      MDNode *TParam) {
880   Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
881   MDNode *Temp = MDNode::getTemporary(VMContext, TElts);
882   Value *TVElts[] = { Temp };
883   MDNode *THolder = MDNode::get(VMContext, TVElts);
884
885   Value *Elts[] = {
886     GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
887     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
888     getNonCompileUnitScope(Context),
889     MDString::get(VMContext, Name),
890     MDString::get(VMContext, Name),
891     MDString::get(VMContext, LinkageName),
892     F,
893     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
894     Ty,
895     ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
896     ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
897     ConstantInt::get(Type::getInt32Ty(VMContext), (unsigned)VK),
898     ConstantInt::get(Type::getInt32Ty(VMContext), VIndex),
899     VTableHolder,
900     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
901     ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
902     Fn,
903     TParam,
904     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
905     THolder
906   };
907   MDNode *Node = MDNode::get(VMContext, Elts);
908   return DISubprogram(Node);
909 }
910
911 /// createNameSpace - This creates new descriptor for a namespace
912 /// with the specified parent scope.
913 DINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name,
914                                        DIFile File, unsigned LineNo) {
915   Value *Elts[] = {
916     GetTagConstant(VMContext, dwarf::DW_TAG_namespace),
917     getNonCompileUnitScope(Scope),
918     MDString::get(VMContext, Name),
919     File,
920     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
921   };
922   return DINameSpace(MDNode::get(VMContext, Elts));
923 }
924
925 /// createLexicalBlockFile - This creates a new MDNode that encapsulates
926 /// an existing scope with a new filename.
927 DILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope,
928                                                      DIFile File) {
929   Value *Elts[] = {
930     GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
931     Scope,
932     File
933   };
934   return DILexicalBlockFile(MDNode::get(VMContext, Elts));
935 }
936
937 DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File,
938                                              unsigned Line, unsigned Col) {
939   // Defeat MDNode uniqing for lexical blocks by using unique id.
940   static unsigned int unique_id = 0;
941   Value *Elts[] = {
942     GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
943     getNonCompileUnitScope(Scope),
944     ConstantInt::get(Type::getInt32Ty(VMContext), Line),
945     ConstantInt::get(Type::getInt32Ty(VMContext), Col),
946     File,
947     ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++)
948   };
949   return DILexicalBlock(MDNode::get(VMContext, Elts));
950 }
951
952 /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
953 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
954                                       Instruction *InsertBefore) {
955   assert(Storage && "no storage passed to dbg.declare");
956   assert(VarInfo.Verify() && "empty DIVariable passed to dbg.declare");
957   if (!DeclareFn)
958     DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
959
960   Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
961   return CallInst::Create(DeclareFn, Args, "", InsertBefore);
962 }
963
964 /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
965 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
966                                       BasicBlock *InsertAtEnd) {
967   assert(Storage && "no storage passed to dbg.declare");
968   assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.declare");
969   if (!DeclareFn)
970     DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
971
972   Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
973
974   // If this block already has a terminator then insert this intrinsic
975   // before the terminator.
976   if (TerminatorInst *T = InsertAtEnd->getTerminator())
977     return CallInst::Create(DeclareFn, Args, "", T);
978   else
979     return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
980 }
981
982 /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
983 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
984                                                 DIVariable VarInfo,
985                                                 Instruction *InsertBefore) {
986   assert(V && "no value passed to dbg.value");
987   assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.value");
988   if (!ValueFn)
989     ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
990
991   Value *Args[] = { MDNode::get(V->getContext(), V),
992                     ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
993                     VarInfo };
994   return CallInst::Create(ValueFn, Args, "", InsertBefore);
995 }
996
997 /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
998 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
999                                                 DIVariable VarInfo,
1000                                                 BasicBlock *InsertAtEnd) {
1001   assert(V && "no value passed to dbg.value");
1002   assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.value");
1003   if (!ValueFn)
1004     ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1005
1006   Value *Args[] = { MDNode::get(V->getContext(), V),
1007                     ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
1008                     VarInfo };
1009   return CallInst::Create(ValueFn, Args, "", InsertAtEnd);
1010 }